tx · EzsRVizE1HY18N2EzYfJXe9FP24bMUFRy3StDFDvLGNp

3PLrr8LpfYjUadnEQ1ov61uMWHdMopUCNAm:  -0.06200000 Waves

2023.11.07 12:46 [3898602] smart account 3PLrr8LpfYjUadnEQ1ov61uMWHdMopUCNAm > SELF 0.00000000 Waves

{ "type": 13, "id": "EzsRVizE1HY18N2EzYfJXe9FP24bMUFRy3StDFDvLGNp", "fee": 6200000, "feeAssetId": null, "timestamp": 1699350381904, "version": 2, "chainId": 87, "sender": "3PLrr8LpfYjUadnEQ1ov61uMWHdMopUCNAm", "senderPublicKey": "9iad7wmJLjXSuuid6X6UicRw3yJkLkSMrJoyKdDd5zbx", "proofs": [ "3YfWHLiaJ5KUWqWcxa8UajkYPtBZ4mEZf64GoyFs9NsjtiXw9NL9rky88xEXQAn5WSTLDVwej6tFwRag9pKVKSZv" ], "script": "base64:BgJ3CAISEAoOGBgBAQgIAQEBAQEIAQgSAwoBARIDCgEBEgASBAoCCAESBAoCCAESAwoBARIECgIIARIDCgEBEgQKAggBEgUKAwgIARIDCgEIEgASABIDCgEIEgASAwoBARIDCgEIEgASABIDCgEIEgQKAggBEgMKAQh7AANTRVACAl9fAAVXQVZFUwIFd2F2ZXMAB01BWF9JTlQA//////////9/AAdNQVhfRkVFAMCEPQANTUFYX0FNUExJRklFUgDAhD0AFE1BWF9XRUlHSFRfQU1QTElGSUVSAMCEPQAKTUFYX1dFSUdIVADAhD0AFFNMSVBQQUdFX1JBVEVfRkFDVE9SAMCEPQAPRkVFX1JBVEVfRkFDVE9SAMCEPQALUkFURV9GQUNUT1IAwIQ9AA5QRVJDRU5UX0ZBQ1RPUgkAtgIBAICAkLu61q3wDQAQWkVST19JTlRfTElTVF8xMAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAFA25pbAAQWkVST19JTlRfTElTVF8xMQkAzQgCBRBaRVJPX0lOVF9MSVNUXzEwAAAAC1pFUk9fQklHSU5UCQC2AgEAAAATWkVST19CSUdJTlRfTElTVF8xMQkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAUDbmlsAAxJTlRfREVDSU1BTFMACAAPQklHSU5UX0RFQ0lNQUxTABIAB0xJU1RfNjQJAL0JAgJ/MF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMAIBXwAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgALS0VZX1NUT1JBR0UCB1NUT1JBR0UACktFWV9BU1NFVFMCBkFTU0VUUwASS0VZX0FTU0VUX0JBTEFOQ0VTAg5BU1NFVF9CQUxBTkNFUwARS0VZX0FTU0VUX1dFSUdIVFMCDUFTU0VUX1dFSUdIVFMACktFWV9MUF9GRUUCBkxQX0ZFRQAQS0VZX1BST1RPQ09MX0ZFRQIMUFJPVE9DT0xfRkVFAA1LRVlfUFJFQ0lTSU9OAglQUkVDSVNJT04AFEtFWV9TSUdNQV9GRUVfUEVSX0xQAhBTSUdNQV9GRUVfUEVSX0xQABlLRVlfVVNFUl9TSUdNQV9GRUVfUEVSX0xQAhVVU0VSX1NJR01BX0ZFRV9QRVJfTFAAC0tFWV9VU0VSX0xQAgdVU0VSX0xQAAxLRVlfVE9UQUxfTFACCFRPVEFMX0xQABBLRVlfVVNFUl9QUk9GSVRTAgxVU0VSX1BST0ZJVFMADEtFWV9XQVRDSERPRwIIV0FUQ0hET0cAE0tFWV9XQVRDSERPR19PRkZTRVQCD1dBVENIRE9HX09GRlNFVAATS0VZX1dBVENIRE9HX0hFSUdIVAIPV0FUQ0hET0dfSEVJR0hUARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8DCQAAAgUIYXNzZXRJZF8FBVdBVkVTBgQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDF92YWxpZGF0ZUludAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfAwMJAGYCBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAGYCBQR2YWxfBQ51cHBlckJvdW5kYXJ5XwkAAgEFBGVycl8GAQ1fdmFsaWRhdGVCb29sAwR2YWxfB3RhcmdldF8EZXJyXwMJAQIhPQIFBHZhbF8FB3RhcmdldF8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBXZhbDFfBXZhbDJfBGVycl8DCQAAAgUFdmFsMV8FBXZhbDJfCQACAQUEZXJyXwYBEF92YWxpZGF0ZUludExpc3QEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQHJG1hdGNoMAkAtgkBBQRlbGVtAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAMFA2FjYwkBDF92YWxpZGF0ZUludAQFAWEFDmxvd2VyQm91bmRhcnlfBQ51cHBlckJvdW5kYXJ5XwUEZXJyXwcJAAIBBQRlcnJfCgACJGwFBHZhbF8KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBD192YWxpZGF0ZUFzc2V0cwIHYXNzZXRzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwUDYWNjCQEOX3ZhbGlkYXRlQXNzZXQCBQRlbGVtBQRlcnJfBwoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARJfdmFsaWRhdGVJbnRFcXVhbHMDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgESX3ZhbGlkYXRlVG9rZW5OYW1lAgR2YWxfBGVycl8DAwkAZgIABAkAsQIBBQR2YWxfBgkAZgIJALECAQUEdmFsXwAQCQACAQUEZXJyXwYBE192YWxpZGF0ZVRva2VuRGVzY3ICBHZhbF8EZXJyXwMJAGYCCQCxAgEFBHZhbF8A6AcJAAIBBQRlcnJfBgERX3ZhbGlkYXRlRGVjaW1hbHMCBHZhbF8EZXJyXwMDCQBmAgAABQR2YWxfBgkAZgIFBHZhbF8ACAkAAgEFBGVycl8GARBfdmFsaWRhdGVQYXltZW50BAhwYXltZW50Xwhhc3NldElkXw9yZXF1aXJlZEFtb3VudF8EZXJyXwQHJG1hdGNoMAgFCHBheW1lbnRfB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAMJAQIhPQIFCGFzc2V0SWRfCQDYBAEFAWEJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQDCQBmAgUPcmVxdWlyZWRBbW91bnRfCAUIcGF5bWVudF8GYW1vdW50CQACAQkArAICBQRlcnJfAgg6IGFtb3VudAYJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFbGlzdF8EdmFsXwRlcnJfAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUFbGlzdF8FBHZhbF8JAAIBBQRlcnJfBgELX2Fzc2V0VG9TdHIBBmFzc2V0XwQHJG1hdGNoMAUGYXNzZXRfAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQUFV0FWRVMBC19zdHJUb0Fzc2V0AQZhc3NldF8DAwkAAAIFBmFzc2V0XwUFV0FWRVMGCQAAAgUGYXNzZXRfAgAFBHVuaXQJANkEAQUGYXNzZXRfAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDF9sb2FkU3RvcmFnZQAEByRtYXRjaDAJAKIIAQULS0VZX1NUT1JBR0UDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJALUJAgUBYQUDU0VQCQCcCgoJANkEAQkAkQMCBQZzdHJ1Y3QAAAkAAAIJAJEDAgUGc3RydWN0AAECATEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAADCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAGCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAcJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QACAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQZzdHJ1Y3QACQkAnAoKAQAHAAAAAAAAAAAAAAAAAAAJAQdBZGRyZXNzAQEAAQxfc2F2ZVN0b3JhZ2UBCHN0b3JhZ2VfCQDMCAIJAQtTdHJpbmdFbnRyeQIFC0tFWV9TVE9SQUdFCQC5CQIJAMwIAgkA2AQBCAUIc3RvcmFnZV8CXzEJAMwIAgMIBQhzdG9yYWdlXwJfMgIBMQIBMAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfMwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNQkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNgkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOQkAzAgCCQClCAEIBQhzdG9yYWdlXwNfMTAFA25pbAUDU0VQBQNuaWwBC19sb2FkQXNzZXRzAAQHJG1hdGNoMAkAoggBBQpLRVlfQVNTRVRTAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAkAvQkCBQFhBQNTRVAFA25pbAUDbmlsAQtfc2F2ZUFzc2V0cwEHYXNzZXRzXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfQVNTRVRTCQC7CQIFB2Fzc2V0c18FA1NFUAUDbmlsARJfbG9hZEFzc2V0QmFsYW5jZXMACgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAdiYWxhbmNlCQENcGFyc2VJbnRWYWx1ZQEFBGVsZW0JAJQKAgkAzQgCCAUDYWNjAl8xBQdiYWxhbmNlCQBkAggFA2FjYwJfMgUHYmFsYW5jZQQHJG1hdGNoMAkAoggBBRJLRVlfQVNTRVRfQkFMQU5DRVMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACgACJGwJAL0JAgUBYQUDU0VQCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8x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CgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsFA1NFUAUDbmlsAQ1fbG9hZFdhdGNoZG9nAAQHJG1hdGNoMAkAoggBBQxLRVlfV0FUQ0hET0cDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAENX3NhdmVXYXRjaGRvZwEJd2F0Y2hkb2dfCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9XQVRDSERPRwkApQgBBQl3YXRjaGRvZ18FA25pbAETX2xvYWRXYXRjaGRvZ09mZnNldAAEByRtYXRjaDAJAJ8IAQUTS0VZX1dBVENIRE9HX09GRlNFVAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAETX3NhdmVXYXRjaGRvZ09mZnNldAEHb2Zmc2V0XwkAzAgCCQEMSW50ZWdlckVudHJ5AgUTS0VZX1dBVENIRE9HX09GRlNFVAUHb2Zmc2V0XwUDbmlsARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAMJAQIhPQIIBQdzdG9yYWdlAl8xAQAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQAAAggFB3N0b3JhZ2UCXzEBAAkAAgECGF93aGVuSW5pdGlhbGl6ZWQ6IHJldmVydAYBDl93aGVuTm90UGF1c2VkAAMJAQpfbG9hZFBhdXNlAAkAAgECFl93aGVuTm90UGF1c2VkOiByZXZlcnQGAQtfd2hlblBhdXNlZAADCQEBIQEJAQpfbG9hZFBhdXNlAAkAAgECE193aGVuUGF1c2VkOiByZXZlcnQGAQtfb25seVBhdXNlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQtfbG9hZFBhdXNlcgAJAAIBAhNfb25seVBhdXNlcjogcmV2ZXJ0BgEOX2NoZWNrV2F0Y2hkb2cABAJ3ZAQHJG1hdGNoMAkAmggCCQENX2xvYWRXYXRjaGRvZwAFE0tFWV9XQVRDSERPR19IRUlHSFQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwCQBkAgUBYQkBE19sb2FkV2F0Y2hkb2dPZmZzZXQAAAADCQBmAgUGaGVpZ2h0BQJ3ZAkAAgECFl9jaGVja1dhdGNoZG9nOiByZXZlcnQGAQxfZ2V0RGVjaW1hbHMBCGFzc2V0SWRfBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAIBQFhCGRlY2ltYWxzCQACAQkArAICAhdfZ2V0RGVjaW1hbHM6IG5vIGFzc2V0PQUIYXNzZXRJZF8BEl9ub3JtYWxpemVEZWNpbWFscwQHYW1vdW50Xw9zb3VyY2VEZWNpbWFsc18PdGFyZ2V0RGVjaW1hbHNfBnJvdW5kXwMJAGcCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwkAbgQFB2Ftb3VudF8AAQkAbAYACgAACQBlAgUPc291cmNlRGVjaW1hbHNfBQ90YXJnZXREZWNpbWFsc18AAAAABQRET1dOBQZyb3VuZF8JAGgCBQdhbW91bnRfCQBsBgAKAAAJAGUCBQ90YXJnZXREZWNpbWFsc18FD3NvdXJjZURlY2ltYWxzXwAAAAAFBERPV04BFV9wcmVwYXJlQXNzZXRCYWxhbmNlcwEHYXNzZXRzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MAAAoAAiRsBQdh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XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCCAUGcmVzdWx0Al8yCAUGcmVzdWx0Al8zARxfaW5jcmVtZW50QmFsYW5jZXNCeVBheW1lbnRzBQliYWxhbmNlc18JcGF5bWVudHNfB2Fzc2V0c18JZGVjaW1hbHNfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBAdwYXltZW50CQCRAwIFCXBheW1lbnRzXwUFaW5kZXgED3BheW1lbnRBc3NldFN0cgkBC19hc3NldFRvU3RyAQgFB3BheW1lbnQHYXNzZXRJZAQDZXJyAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyCQCRAwIFB2Fzc2V0c18FBWluZGV4CQACAQkArAICCQCsAgIFBGVycl8CCDogaW5kZXg9CQCkAwEFBWluZGV4BQR1bml0AwkAAAIFA2VycgUDZXJyBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUPcGF5bWVudEFzc2V0U3RyBApuZXdCYWxhbmNlCQBkAgUEZWxlbQkBEl9ub3JtYWxpemVEZWNpbWFscwQICQCRAwIFCXBheW1lbnRzXwUFaW5kZXgGYW1vdW50BQ1hc3NldERlY2ltYWxzBQlkZWNpbWFsc18FBERPV04JAJUKAwkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUKbmV3QmFsYW5jZQkAZAIIBQNhY2MCXzMFCm5ld0JhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBnJlc3VsdAoAAiRsBQliYWxhbmNlc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAUDbmls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aXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEYX2dldFBheW1lbnRzRnJvbUJhbGFuY2VzBAdhc3NldHNfCWJhbGFuY2VzXwpyZWNpcGllbnRfD3NvdXJjZURlY2ltYWxzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgkBDlNjcmlwdFRyYW5zZmVyAwUKcmVjaXBpZW50XwkBEl9ub3JtYWxpemVEZWNpbWFscwQJAJEDAgUJYmFsYW5jZXNfBQVpbmRleAUPc291cmNlRGVjaW1hbHNfCQEMX2dldERlY2ltYWxzAQUEZWxlbQUERE9XTgkBC19zdHJUb0Fzc2V0AQUEZWxlbQQGcmVzdWx0CgACJGwFB2Fzc2V0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACggFBnJlc3VsdAJfMgESX2NhbGN1bGF0ZU1pY3JvRmVlBQhiYWxhbmNlXwxlcXVpbGlicml1bV8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfAwkAZgIFDGVxdWlsaWJyaXVtXwUIYmFsYW5jZV8ECXRocmVzaG9sZAkAawMFDGVxdWlsaWJyaXVtXwkAZQIFFE1BWF9XRUlHSFRfQU1QTElGSUVSBRB3ZWlnaHRBbXBsaWZpZXJfBRRNQVhfV0VJR0hUX0FNUExJRklFUgMJAGYCBQl0aHJlc2hvbGQFCGJhbGFuY2VfBAxtYXhEZXZpYXRpb24JAGUCBQl0aHJlc2hvbGQFCGJhbGFuY2VfBAdmZWVSYXRlCQBrAwkAawMFDG1heERldmlhdGlvbgUNc2xpcHBhZ2VSYXRlXwUUU0xJUFBBR0VfUkFURV9GQUNUT1IFD0ZFRV9SQVRFX0ZBQ1RPUgUMZXF1aWxpYnJpdW1fAwkAZgIFB2ZlZVJhdGUFC2ZlZU1heFJhdGVfCQBrAwUMbWF4RGV2aWF0aW9uBQtmZWVNYXhSYXRlXwUPRkVFX1JBVEVfRkFDVE9SCQBrAwUMbWF4RGV2aWF0aW9uBQdmZWVSYXRlBQ9GRUVfUkFURV9GQUNUT1IAAAQJdGhyZXNob2xkCQBrAwUMZXF1aWxpYnJpdW1fCQBkAgUUTUFYX1dFSUdIVF9BTVBMSUZJRVIFEHdlaWdodEFtcGxpZmllcl8FFE1BWF9XRUlHSFRfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQl0aHJlc2hvbGQEDG1heERldmlhdGlvbgkAZQIFCGJhbGFuY2VfBQl0aHJlc2hvbGQEB2ZlZVJhdGUJAGsDCQBrAwUMbWF4RGV2aWF0aW9uBQ1zbGlwcGFnZVJhdGVfBRRTTElQUEFHRV9SQVRFX0ZBQ1RPUgUPRkVFX1JBVEVfRkFDVE9SBQxlcXVpbGlicml1bV8DCQBmAgUHZmVlUmF0ZQULZmVlTWF4UmF0ZV8JAGsDBQxtYXhEZXZpYXRpb24FC2ZlZU1heFJhdGVfBQ9GRUVfUkFURV9GQUNUT1IJAGsDBQxtYXhEZXZpYXRpb24FB2ZlZVJhdGUFD0ZFRV9SQVRFX0ZBQ1RPUgAAAQ1fY2FsY3VsYXRlRmVlBwliYWxhbmNlc18SYXNzZXRzVG90YWxTdXBwbHlfCHdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8AAAEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CxJwcmV2QXNzZXRCYWxhbmNlc18VcHJldkFzc2V0VG90YWxTdXBwbHlfDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZMcFRvdGFsU3VwcGx5Xw5scFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8DAwkAAAIFEnByZXZMcFRvdGFsU3VwcGx5XwAABgkAAAIFDmxwVG90YWxTdXBwbHlfAAAGBA5wcmV2QXNzZXRzUmF0ZQkAawMJAGUCBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUScHJldkFzc2V0QmFsYW5jZXNfBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8FC1JBVEVfRkFDVE9SBRJwcmV2THBUb3RhbFN1cHBseV8EDW5ld0Fzc2V0c1JhdGUJAGsDCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBQtSQVRFX0ZBQ1RPUgUObHBUb3RhbFN1cHBseV8EBGRpZmYJAGUCBQ1uZXdBc3NldHNSYXRlBQ5wcmV2QXNzZXRzUmF0ZQMDCQBnAgAABQRkaWZmCQBmAgkAaAIA////////////AQkBDl9sb2FkUHJlY2lzaW9uAAUEZGlmZgcJAAIBCQCsAgICKl92YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudDogcmV2ZXJ0OiBkaWZmPQkApAMBBQRkaWZmBgEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkScHJldkFzc2V0QmFsYW5jZXNfFXByZXZBc3NldFRvdGFsU3VwcGx5Xw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8ECHByZXZVdGlsCQBlAgUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFEnByZXZBc3NldEJhbGFuY2VzXwUVcHJldkFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBAduZXdVdGlsCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBARkaWZmCQBlAgUHbmV3VXRpbAUIcHJldlV0aWwDAwkAZwIAAAUEZGlmZgkAZgIJAGgCAP///////////wEJAQ5fbG9hZFByZWNpc2lvbgAFBGRpZmYHCQACAQkArAICAiVfdmFsaWRhdGVTd2FwSW52YXJpYW50OiByZXZlcnQ6IGRpZmY9CQCkAwEFBGRpZmYGARhfdmFsaWRhdGVBc3NldEFsbG9jYXRpb24HCGJhbGFuY2VfEWFzc2V0VG90YWxTdXBwbHlfDHByZXZCYWxhbmNlXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8Hd2VpZ2h0XwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfBAtlcXVpbGlicml1bQkAawMFEWFzc2V0VG90YWxTdXBwbHlfBQd3ZWlnaHRfBQxzaWdtYVdlaWdodF8EEG1heEFsbG9jYXRpb25BbXADCQBmAgUIYmFsYW5jZV8FC2VxdWlsaWJyaXVtCQBkAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfCQBlAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfBA1tYXhBbGxvY2F0aW9uCQBrAwULZXF1aWxpYnJpdW0FEG1heEFsbG9jYXRpb25BbXAFDU1BWF9BTVBMSUZJRVIEEXByZXZNYXhBbGxvY2F0aW9uCQBrAwkAawMFFXByZXZBc3NldFRvdGFsU3VwcGx5XwUHd2VpZ2h0XwUMc2lnbWFXZWlnaHRfBRBtYXhBbGxvY2F0aW9uQW1wBQ1NQVhfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQtlcXVpbGlicml1bQMJAGYCBQhiYWxhbmNlXwUNbWF4QWxsb2NhdGlvbgMJAGYCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIgX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgdXADCQBmAgkAZQIFCGJhbGFuY2VfBQ1tYXhBbGxvY2F0aW9uCQBlAgUMcHJldkJhbGFuY2VfBRFwcmV2TWF4QWxsb2NhdGlvbgkAAgECIl92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogc3RpbGwgdXAGBgMJAGYCBQ1tYXhBbGxvY2F0aW9uBQhiYWxhbmNlXwMJAGYCBQxwcmV2QmFsYW5jZV8FEXByZXZNYXhBbGxvY2F0aW9uCQACAQIiX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgZG93bgMJAGYCCQBlAgUNbWF4QWxsb2NhdGlvbgUIYmFsYW5jZV8JAGUCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIkX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBzdGlsbCBkb3duBgYBE192YWxpZGF0ZUFsbG9jYXRpb24HDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZBc3NldEJhbGFuY2VzXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8NYXNzZXRXZWlnaHRzXwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfBgELX2NoZWNrcG9pbnQBBXVzZXJfBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEFBXVzZXJfBAt1c2VyUHJvZml0cwkBEF9sb2FkVXNlclByb2ZpdHMBBQV1c2VyXwQNc2lnbWFGZWVQZXJMcAkBEl9sb2FkU2lnbWFGZWVQZXJMcAAEEXVzZXJTaWdtYUZlZVBlckxwCQEWX2xvYWRVc2VyU2lnbWFGZWVQZXJMcAEFBXVzZXJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQNcHJvZml0VXBkYXRlZAkAZAIJAJEDAgULdXNlclByb2ZpdHMFBWluZGV4CQCgAwEJALwCAwkAtgIBBQZ1c2VyTHAJALgCAgkAkQMCBQ1zaWdtYUZlZVBlckxwBQVpbmRleAkAkQMCBRF1c2VyU2lnbWFGZWVQZXJMcAUFaW5kZXgFDlBFUkNFTlRfRkFDVE9SCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFDXByb2ZpdFVwZGF0ZWQEDSR0MDI1NTU4MjU2MzEKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI1NTU4MjU2MzECXzEEDnByb2ZpdHNVcGRhdGVkCAUNJHQwMjU1NTgyNTYzMQJfMgkAlAoCCQDOCAIJARBfc2F2ZVVzZXJQcm9maXRzAgUFdXNlcl8FDnByb2ZpdHNVcGRhdGVkCQEWX3NhdmVVc2VyU2lnbWFGZWVQZXJMcAIFBXVzZXJfBQ1zaWdtYUZlZVBlckxwBQ5wcm9maXRzVXBkYXRlZAEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEDnNpZ21hRmVlUGVyTHBfCHRvdGFsTHBfBmluZGV4XwZscEZlZV8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQZpbmRleF8FBWluZGV4CQC3AgIJAJEDAgUOc2lnbWFGZWVQZXJMcF8FBWluZGV4CQC8AgMJALYCAQUGbHBGZWVfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQh0b3RhbExwXwkAkQMCBQ5zaWdtYUZlZVBlckxwXwUFaW5kZXgJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQEDSR0MDI2MjgxMjYzNjAKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI2MjgxMjYzNjACXzEEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMjYyODEyNjM2MAJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQLYXNzZXRJbmRleF8HYW1vdW50XwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABAd0b3RhbExwCQEMX2xvYWRUb3RhbExwAAQNJHQwMjY1ODEyNjg1NgMJAAACBQd0b3RhbExwAAAJAJQKAgAACQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwUHTUFYX0ZFRQkAlAoCCQBrAwUHYW1vdW50XwUKbHBGZWVSYXRlXwUHTUFYX0ZFRQkAawMFB2Ftb3VudF8FEHByb3RvY29sRmVlUmF0ZV8FB01BWF9GRUUEBWxwRmVlCAUNJHQwMjY1ODEyNjg1NgJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAyNjU4MTI2ODU2Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQVscEZlZQAABQ1zaWdtYUZlZVBlckxwCQEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEBQ1zaWdtYUZlZVBlckxwBQd0b3RhbExwBQthc3NldEluZGV4XwUFbHBGZWUJAJUKAwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAELX2RlcG9zaXRBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjczNjUyNzQxOAkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjczNjUyNzQxOAJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyNzM2NTI3NDE4Al8yBA0kdDAyNzQyMzI3NDkxCQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyNzQyMzI3NDkxAl8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI3NDIzMjc0OTECXzIEDSR0MDI3NDk3Mjg3MjcDCQAAAgUUcHJldkFzc2V0VG90YWxTdXBwbHkAAAoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAawMJAJEDAgUMYXNzZXRXZWlnaHRzBQVpbmRleAUHYW1vdW50XwULc2lnbWFXZWlnaHQJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBA0kdDAyNzkzOTI4MDEzCgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyNzkzOTI4MDEzAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjc5MzkyODAxMwJfMgkAlAoCBQdhbW91bnRfBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBAVyYXRpbwkAvAIDCQC2AgEFB2Ftb3VudF8FDlBFUkNFTlRfRkFDVE9SCQC2AgEFFHByZXZBc3NldFRvdGFsU3VwcGx5CgEJZm9sZEZ1bmMxAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAoAMBCQC8AgMFBXJhdGlvCQC2AgEJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFBWluZGV4BQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQEDSR0MDI4NTU2Mjg2MzEKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZm9sZEZ1bmMxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyODU1NjI4NjMxAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjg1NTYyODYzMQJfMgkAlAoCCQBrAwUHYW1vdW50XwUNbHBUb3RhbFN1cHBseQUUcHJldkFzc2V0VG90YWxTdXBwbHkFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwMjc0OTcyODcyNwJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI3NDk3Mjg3MjcCXzIEDSR0MDI4NzMzMjg4NDYJARtfaW5jcmVtZW50QmFsYW5jZXNCeUFtb3VudHMCBRFwcmV2QXNzZXRCYWxhbmNlcwUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQNYXNzZXRCYWxhbmNlcwgFDSR0MDI4NzMzMjg4NDYCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyODczMzI4ODQ2Al8yBARlcnIyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUObHBUb2tlbnNUb01pbnQFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjIFBGVycjIJAJUKAwUObHBUb2tlbnNUb01pbnQFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCF9kZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjk2MDkyOTY2MgkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjk2MDkyOTY2MgJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyOTYwOTI5NjYyAl8yBA0kdDAyOTY2NzI5NzgxCQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyOTY2NzI5NzgxAl8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI5NjY3Mjk3ODECXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwkBBXZhbHVlAQkAzwgCBQZhc3NldHMFCGFzc2V0SWRfBQdhbW91bnRfBBBhc3NldFRvdGFsU3VwcGx5CQBkAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB2Ftb3VudF8EBGVycjIJARNfdmFsaWRhdGVBbGxvY2F0aW9uBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BRFtYXhBbGxvY0FtcGxpZmllcgMJAAACBQRlcnIyBQRlcnIyBAdwcmV2RmVlCQENX2NhbGN1bGF0ZUZlZQcFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQObHBUb2tlbnNUb01pbnQDCQAAAgUNbHBUb3RhbFN1cHBseQAACQACAQIUX2RlcG9zaXQ6IGVtcHR5IHBvb2wECWFzc2V0RGlmZgkAZQIFEGFzc2V0VG90YWxTdXBwbHkFFHByZXZBc3NldFRvdGFsU3VwcGx5BAdmZWVEaWZmCQBlAgUDZmVlBQdwcmV2RmVlBBN1dGlsaXR5Q2hhbmdlRmFjdG9yCQBrAwkAZQIFCWFzc2V0RGlmZgUHZmVlRGlmZgULUkFURV9GQUNUT1IJAGUCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUHcHJldkZlZQQTbHBUb2tlbnNUb01pbnRJbm5lcgkAawMFDWxwVG90YWxTdXBwbHkFE3V0aWxpdHlDaGFuZ2VGYWN0b3IFC1JBVEVfRkFDVE9SBARlcnIzCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUTbHBUb2tlbnNUb01pbnRJbm5lcgUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDCQAAAgUEZXJyMwUEZXJyMwUTbHBUb2tlbnNUb01pbnRJbm5lcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMzE0NDMzMTU3NAkBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQAAAUObHBUb2tlbnNUb01pbnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDMxNDQzMzE1NzQCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzE0NDMzMTU3NAJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzMTQ0MzMxNTc0Al8zCQCXCgUFDmxwVG9rZW5zVG9NaW50BQ1hc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxfd2l0aGRyYXdBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwMzE5MDgzMTk3NgkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzE5MDgzMTk3NgJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMTkwODMxOTc2Al8yBA0kdDAzMTk4MTMyMDM0CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMTk4MTMyMDM0Al8xBAtzaWdtYVdlaWdodAgFDSR0MDMxOTgxMzIwMzQCXzIEDmxwVG9rZW5zVG9CdXJuBQdhbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvQnVybgAABQdNQVhfSU5UAihfd2l0aGRyYXdBbGw6IGxwVG9rZW5zVG9CdXJuIGxlc3MgdGhhbiAwAwkAAAIFA2VycgUDZXJyBA0kdDAzMjE3NjMyMzA5CQEcX2RlY3JlbWVudEJhbGFuY2VzQnlMcEFtb3VudAMFEXByZXZBc3NldEJhbGFuY2VzBQ5scFRva2Vuc1RvQnVybgUNbHBUb3RhbFN1cHBseQQNYXNzZXRCYWxhbmNlcwgFDSR0MDMyMTc2MzIzMDkCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMjE3NjMyMzA5Al8yBA1iYWxhbmNlc1RvUGF5CAUNJHQwMzIxNzYzMjMwOQJfMwQEZXJyMgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFDmxwVG9rZW5zVG9CdXJuBQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyCQCVCgMFDmxwVG9rZW5zVG9CdXJuBQ1iYWxhbmNlc1RvUGF5BQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQlfd2l0aGRyYXcCCGFzc2V0SWRfCWxwQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAlwcmVjaXNpb24JAQ5fbG9hZFByZWNpc2lvbgAEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMzMxMDEzMzE2OQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzMxMDEzMzE2OQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMzEwMTMzMTY5Al8yBA0kdDAzMzE3NDMzMjI3CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMzE3NDMzMjI3Al8xBAtzaWdtYVdlaWdodAgFDSR0MDMzMTc0MzMyMjcCXzIEEHRhcmdldEFzc2V0SW5kZXgJAQV2YWx1ZQEJAM8IAgUGYXNzZXRzBQhhc3NldElkXwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA1wcmV2VXRpbFZhbHVlCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUEAWsJALwCAwkAtgIBCQBlAgUNbHBUb3RhbFN1cHBseQUJbHBBbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQ1scFRvdGFsU3VwcGx5BBJwcmV2VXRpbFZhbHVlV2l0aEsJAKADAQkAvAIDCQC2AgEFDXByZXZVdGlsVmFsdWUFAWsFDlBFUkNFTlRfRkFDVE9SBBJwcmV2VXRpbFZhbHVlRGl2THAJAL0CBAkAtgIBBQ1wcmV2VXRpbFZhbHVlBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQ1scFRvdGFsU3VwcGx5BQdDRUlMSU5HCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwgFA2FjYwJfMQUDYWNjBApzdGFydElubmVyCAUDYWNjAl8yBAlzdG9wSW5uZXIIBQNhY2MCXzMEDWN1cnJlbnRBbW91bnQJAGkCCQBkAgUJc3RvcElubmVyBQpzdGFydElubmVyAAIEEXRlbXBBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgFDWN1cnJlbnRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFDWN1cnJlbnRBbW91bnQECXV0aWxWYWx1ZQkAZQIFFHRlbXBBc3NldFRvdGFsU3VwcGx5CQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDAwkAZgIJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwkAaAIA////////////AQUJcHJlY2lzaW9uCQBmAgUJcHJlY2lzaW9uCQBlAgUJdXRpbFZhbHVlBRJwcmV2VXRpbFZhbHVlV2l0aEsHCQCXCgUGBQpzdGFydElubmVyBQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwMJAGYCAAAJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwkAlwoFBwUKc3RhcnRJbm5lcgUNY3VycmVudEFtb3VudAUNY3VycmVudEFtb3VudAkAZQIFCXV0aWxWYWx1ZQUScHJldlV0aWxWYWx1ZVdpdGhLCQCXCgUHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwQMdGFyZ2V0QW1vdW50BARzdG9wCQCgAwEJAL0CBAkAtgIBCQBkAgUJbHBBbW91bnRfBQdwcmV2RmVlBRJwcmV2VXRpbFZhbHVlRGl2THAFDlBFUkNFTlRfRkFDVE9SBQdDRUlMSU5HBA0kdDAzNTA5MzM1MjA1CgACJGwFB0xJU1RfNjQKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUHAAAFBHN0b3AAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNjQJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQAQHc3VjY2VzcwgFDSR0MDM1MDkzMzUyMDUCXzEECHN0YXJ0T3V0CAUNJHQwMzUwOTMzNTIwNQJfMgQHc3RvcE91dAgFDSR0MDM1MDkzMzUyMDUCXzMED3RhcmdldEFtb3VudE91dAgFDSR0MDM1MDkzMzUyMDUCXzQEB2RpZmZPdXQIBQ0kdDAzNTA5MzM1MjA1Al81AwkBASEBBQdzdWNjZXNzCQACAQkArAICCQCsAgIJAKwCAgIoX3dpdGhkcmF3OiBjYW4ndCBjYWxjdWxhdGUgdGFyZ2V0QW1vdW50PQkApAMBBQ90YXJnZXRBbW91bnRPdXQCBixkaWZmPQkApAMBBQdkaWZmT3V0BQ90YXJnZXRBbW91bnRPdXQEEmZpbmFsQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXByZXZBc3NldEJhbGFuY2VzBRB0YXJnZXRBc3NldEluZGV4BQx0YXJnZXRBbW91bnQEFWZpbmFsQXNzZXRUb3RhbFN1cHBseQkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFCWxwQW1vdW50XwUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUHAwkAAAIFBGVycjEFBGVycjEEDSR0MDM2MTk3MzYzNDUJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMECQBkAgUQdGFyZ2V0QXNzZXRJbmRleAABBQx0YXJnZXRBbW91bnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDM2MTk3MzYzNDUCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzYxOTczNjM0NQJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzNjE5NzM2MzQ1Al8zCQCXCgUFDHRhcmdldEFtb3VudAUSZmluYWxBc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQVfc3dhcAMRc291cmNlQXNzZXRJbmRleF8RdGFyZ2V0QXNzZXRJbmRleF8Nc291cmNlQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkECXByZWNpc2lvbgkBDl9sb2FkUHJlY2lzaW9uAAQNJHQwMzY5MjczNjk5NQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzY5MjczNjk5NQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzNjkyNzM2OTk1Al8yBA0kdDAzNzAwMDM3MDUzCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzNzAwMDM3MDUzAl8xBAtzaWdtYVdlaWdodAgFDSR0MDM3MDAwMzcwNTMCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8FDXNvdXJjZUFtb3VudF8EEGFzc2V0VG90YWxTdXBwbHkJAGQCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNc291cmNlQW1vdW50XwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA1wcmV2VXRpbFZhbHVlCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUKAQhmb2xkRnVuYwIDYWNjBGVsZW0DCAUDYWNjAl8xBQNhY2MECnN0YXJ0SW5uZXIIBQNhY2MCXzIECXN0b3BJbm5lcggFA2FjYwJfMwQNY3VycmVudEFtb3VudAkAaQIJAGQCBQlzdG9wSW5uZXIFCnN0YXJ0SW5uZXIAAgQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUNY3VycmVudEFtb3VudAQUdGVtcEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQ1jdXJyZW50QW1vdW50BAl1dGlsVmFsdWUJAGUCBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQkBDV9jYWxjdWxhdGVGZWUHBRF0ZW1wQXNzZXRCYWxhbmNlcwUUdGVtcEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwMJAGYCCQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQBoAgD///////////8BBQlwcmVjaXNpb24JAGYCBQlwcmVjaXNpb24JAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUHCQCXCgUGBQpzdGFydElubmVyBQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUDCQBmAgAACQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQCXCgUHBQpzdGFydElubmVyBQ1jdXJyZW50QW1vdW50BQ1jdXJyZW50QW1vdW50CQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQCXCgUHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUEDHRhcmdldEFtb3VudAQMdGFyZ2V0QW1vdW50BQ1zb3VyY2VBbW91bnRfBBF0ZW1wQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFDWFzc2V0QmFsYW5jZXMFEXRhcmdldEFzc2V0SW5kZXhfBQx0YXJnZXRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUQYXNzZXRUb3RhbFN1cHBseQUMdGFyZ2V0QW1vdW50BANmZWUJAQ1fY2FsY3VsYXRlRmVlBwURdGVtcEFzc2V0QmFsYW5jZXMFFHRlbXBBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQHZmVlRGlmZgkAZQIFA2ZlZQUHcHJldkZlZQMJAAACBQdmZWVEaWZmAAAFDHRhcmdldEFtb3VudAQNJHQwMzkwMjYzOTE1NwoAAiRsBQdMSVNUXzY0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlwoFBwAACQBkAgUNc291cmNlQW1vdW50XwUHcHJldkZlZQAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2NAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBABAdzdWNjZXNzCAUNJHQwMzkwMjYzOTE1NwJfMQQIc3RhcnRPdXQIBQ0kdDAzOTAyNjM5MTU3Al8yBAdzdG9wT3V0CAUNJHQwMzkwMjYzOTE1NwJfMwQPdGFyZ2V0QW1vdW50T3V0CAUNJHQwMzkwMjYzOTE1NwJfNAQHZGlmZk91dAgFDSR0MDM5MDI2MzkxNTcCXzUDCQEBIQEFB3N1Y2Nlc3MJAAIBCQCsAgIJAKwCAgkArAICAiRfc3dhcDogY2FuJ3QgY2FsY3VsYXRlIHRhcmdldEFtb3VudD0JAKQDAQUPdGFyZ2V0QW1vdW50T3V0AgYsZGlmZj0JAKQDAQUHZGlmZk91dAUPdGFyZ2V0QW1vdW50T3V0BBJmaW5hbEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUMdGFyZ2V0QW1vdW50BBVmaW5hbEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBwMJAAACBQRlcnIxBQRlcnIxBA0kdDA0MDAwNDQwMTQ1CQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAkAZAIFEXRhcmdldEFzc2V0SW5kZXhfAAEFDHRhcmdldEFtb3VudAUJbHBGZWVSYXRlBQ9wcm90b2NvbEZlZVJhdGUEBWxwRmVlCAUNJHQwNDAwMDQ0MDE0NQJfMQQLcHJvdG9jb2xGZWUIBQ0kdDA0MDAwNDQwMTQ1Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQwMDA0NDAxNDUCXzMJAJcKBQUMdGFyZ2V0QW1vdW50BRJmaW5hbEFzc2V0QmFsYW5jZXMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4XAWkBBGluaXQOB2Fzc2V0c18NYXNzZXRXZWlnaHRzXwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8MbHBUb2tlbk5hbWVfDWxwVG9rZW5EZXNjcl8QbHBUb2tlbkRlY2ltYWxzXxdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8UcHJvdG9jb2xGZWVDb250cmFjdF8KcHJlY2lzaW9uXwdwYXVzZXJfBANlcnIDAwMDAwMDAwMDAwMDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQETX3doZW5Ob3RJbml0aWFsaXplZAAHCQEQX3doZW5NdWx0aXNpZ1NldAAHCQEPX3ZhbGlkYXRlQXNzZXRzAgUHYXNzZXRzXwIUaW5pdDogaW52YWxpZCBhc3NldHMHCQEQX3ZhbGlkYXRlSW50TGlzdAQFDWFzc2V0V2VpZ2h0c18AAQUKTUFYX1dFSUdIVAIaaW5pdDogaW52YWxpZCBhc3NldFdlaWdodHMHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBBQdhc3NldHNfCQCQAwEFDWFzc2V0V2VpZ2h0c18CH2luaXQ6IGludmFsaWQgYXNzZXRXZWlnaHRzIHNpemUHCQEMX3ZhbGlkYXRlSW50BAUKbHBGZWVSYXRlXwAABQdNQVhfRkVFAhRpbml0OiBpbnZhbGlkIGxwIGZlZQcJAQxfdmFsaWRhdGVJbnQEBRBwcm90b2NvbEZlZVJhdGVfAAAFB01BWF9GRUUCGmluaXQ6IGludmFsaWQgcHJvdG9jb2wgZmVlBwkBEl92YWxpZGF0ZVRva2VuTmFtZQIFDGxwVG9rZW5OYW1lXwISaW5pdDogaW52YWxpZCBuYW1lBwkBE192YWxpZGF0ZVRva2VuRGVzY3ICBQ1scFRva2VuRGVzY3JfAhNpbml0OiBpbnZhbGlkIGRlc2NyBwkBEV92YWxpZGF0ZURlY2ltYWxzAgUQbHBUb2tlbkRlY2ltYWxzXwIWaW5pdDogaW52YWxpZCBkZWNpbWFscwcJAQxfdmFsaWRhdGVJbnQEBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwAABQ1NQVhfQU1QTElGSUVSAiRpbml0OiBpbnZhbGlkIG1heEFsbG9jYXRpb25BbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUQd2VpZ2h0QW1wbGlmaWVyXwAABRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwIdaW5pdDogaW52YWxpZCB3ZWlnaHRBbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUNc2xpcHBhZ2VSYXRlXwAABQdNQVhfSU5UAhppbml0OiBpbnZhbGlkIHNsaXBwYWdlUmF0ZQcJAQxfdmFsaWRhdGVJbnQEBQtmZWVNYXhSYXRlXwAABQdNQVhfSU5UAhhpbml0OiBpbnZhbGlkIGZlZU1heFJhdGUHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFFHByb3RvY29sRmVlQ29udHJhY3RfAiFpbml0OiBpbnZhbGlkIHByb3RvY29sRmVlQ29udHJhY3QHCQEMX3ZhbGlkYXRlSW50BAUKcHJlY2lzaW9uXwABBQdNQVhfSU5UAhdpbml0OiBpbnZhbGlkIHByZWNpc2lvbgcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIUaW5pdDogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyBA0kdDA0MjAwODQyMDc3CQEUX3ByZXBhcmVBc3NldFdlaWdodHMBBQ1hc3NldFdlaWdodHNfBAxhc3NldFdlaWdodHMIBQ0kdDA0MjAwODQyMDc3Al8xBAtzaWdtYVdlaWdodAgFDSR0MDQyMDA4NDIwNzcCXzIEDWFzc2V0QmFsYW5jZXMJARVfcHJlcGFyZUFzc2V0QmFsYW5jZXMBBQdhc3NldHNfBAVpc3N1ZQkAwggFBQxscFRva2VuTmFtZV8FDWxwVG9rZW5EZXNjcl8AAAUQbHBUb2tlbkRlY2ltYWxzXwYECWxwQXNzZXRJZAkAuAgBBQVpc3N1ZQQOc3RvcmFnZVVwZGF0ZWQJAJwKCgUJbHBBc3NldElkBgAABQpscEZlZVJhdGVfBRBwcm90b2NvbEZlZVJhdGVfBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8JARFAZXh0ck5hdGl2ZSgxMDYyKQEFFHByb3RvY29sRmVlQ29udHJhY3RfCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCBQVpc3N1ZQUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJAQtfc2F2ZUFzc2V0cwEFB2Fzc2V0c18JARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzCQERX3NhdmVBc3NldFdlaWdodHMBBQxhc3NldFdlaWdodHMJAQ5fc2F2ZVByZWNpc2lvbgEFCnByZWNpc2lvbl8JARJfc2F2ZVNpZ21hRmVlUGVyTHABCQESX2xvYWRTaWdtYUZlZVBlckxwAAkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpkZXBvc2l0QWxsAQdhbW91bnRfBANlcnIDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIaZGVwb3NpdEFsbDogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDQzODI3NDM5MTIJAQtfZGVwb3NpdEFsbAEFB2Ftb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNDM4Mjc0MzkxMgJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDQzODI3NDM5MTICXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0MzgyNzQzOTEyAl8zCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQPcGF5bWVudEFzc2V0U3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAQUcGF5bWVudEFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ9wYXltZW50QXNzZXRTdHIEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAkQMCBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBQVpbmRleAQOcmVxdWlyZWRBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFFHBheW1lbnRBc3NldERlY2ltYWxzBQdDRUlMSU5HBARlcnIxAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyBQRlbGVtCQACAQkArAICAiNkZXBvc2l0QWxsOiBpbnZhbGlkIHBheW1lbnQ6IGluZGV4PQkApAMBBQVpbmRleAMJAGcCAAAFDnJlcXVpcmVkQW1vdW50CQACAQImZGVwb3NpdEFsbDogdG9vIGxpdHRsZSBhbW91bnQgcmVxdWlyZWQFBHVuaXQDCQAAAgUEZXJyMQUEZXJyMQQGY2hhbmdlAwkAZgIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAUDbmlsAwkAZgIFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIoZGVwb3NpdEFsbDogaW5zdWZmaWNpZW50IHBheW1lbnQsIGluZGV4PQkApAMBBQVpbmRleAILLCByZXF1aXJlZD0JAKQDAQUOcmVxdWlyZWRBbW91bnQFA25pbAkAlAoCCQBkAgUFaW5kZXgAAQkAzggCCAUDYWNjAl8yBQZjaGFuZ2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDQ1MDU1NDUxMTcKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEA2lkeAgFDSR0MDQ1MDU1NDUxMTcCXzEEDWNoYW5nZUFjdGlvbnMIBQ0kdDA0NTA1NTQ1MTE3Al8yBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGQCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb01pbnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvTWludAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMFDWNoYW5nZUFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZGVwb3NpdAEMbWluTHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQxtaW5McEFtb3VudF8AAAUHTUFYX0lOVAIeZGVwb3NpdDogaW52YWxpZCBtaW4gbHAgYW1vdW50AwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBGVycjEDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDl9jaGVja1dhdGNoZG9nAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMACQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAh9kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBAhhc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRTdHIEEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNDY1NTc0NjY3MwkBCF9kZXBvc2l0AgUIYXNzZXRTdHIFEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNDY1NTc0NjY3MwJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ2NTU3NDY2NzMCXzIEBWxwRmVlCAUNJHQwNDY1NTc0NjY3MwJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA0NjU1NzQ2NjczAl80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQ2NTU3NDY2NzMCXzUEDmxwVG9rZW5zVG9TZW5kCQBlAgkAZQIFDmxwVG9rZW5zVG9NaW50BQVscEZlZQULcHJvdG9jb2xGZWUEBGVycjIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvU2VuZAUMbWluTHBBbW91bnRfBQdNQVhfSU5UAhZkZXBvc2l0OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjIFBGVycjIEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvTWludAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvU2VuZAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUMbHBBc3NldElkU3RyCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUMbHBBc3NldElkU3RyCQEQX3NhdmVQcm90b2NvbEZlZQIFDGxwQXNzZXRJZFN0cgkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFDGxwQXNzZXRJZFN0cgkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3dpdGhkcmF3QWxsAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkA2AQBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQDZXJyAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECIndpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIid2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAiN3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEDSR0MDQ4MTM0NDgyMjEJAQxfd2l0aGRyYXdBbGwBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQObHBUb2tlbnNUb0J1cm4IBQ0kdDA0ODEzNDQ4MjIxAl8xBA1iYWxhbmNlc1RvUGF5CAUNJHQwNDgxMzQ0ODIyMQJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ4MTM0NDgyMjECXzMEDnBheW1lbnRBY3Rpb25zCQEYX2dldFBheW1lbnRzRnJvbUJhbGFuY2VzBAUGYXNzZXRzBQ1iYWxhbmNlc1RvUGF5CAUBaQZjYWxsZXIFCmxwRGVjaW1hbHMEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvQnVybggFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBBEJ1cm4CBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9CdXJuBQNuaWwFDnBheW1lbnRBY3Rpb25zCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3Aghhc3NldElkXwptaW5BbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQDYBAEFCWxwQXNzZXRJZAQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDGxwQXNzZXRJZFN0cgQGYXNzZXRzCQELX2xvYWRBc3NldHMABANlcnIDAwMDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEOX2NoZWNrV2F0Y2hkb2cABwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAh93aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEFB01BWF9JTlQCIHdpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFBmFzc2V0cwUIYXNzZXRJZF8CGXdpdGhkcmF3OiBpbnZhbGlkIGFzc2V0SWQHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAht3aXRoZHJhdzogaW52YWxpZCBtaW5BbW91bnQHAwkAAAIFA2VycgUDZXJyBA0kdDA0OTU3NTQ5NzA5CQEJX3dpdGhkcmF3AgUIYXNzZXRJZF8ICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNDk1NzU0OTcwOQJfMQQSZmluYWxBc3NldEJhbGFuY2VzCAUNJHQwNDk1NzU0OTcwOQJfMgQFbHBGZWUIBQ0kdDA0OTU3NTQ5NzA5Al8zBAtwcm90b2NvbEZlZQgFDSR0MDQ5NTc1NDk3MDkCXzQEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDk1NzU0OTcwOQJfNQQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOBARlcnIxCQEMX3ZhbGlkYXRlSW50BAULZmluYWxBbW91bnQFCm1pbkFtb3VudF8FB01BWF9JTlQCF3dpdGhkcmF3OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjEFBGVycjEEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQRCdXJuAgUJbHBBc3NldElkCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQhhc3NldElkXwUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBRJmaW5hbEFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUIYXNzZXRJZF8JAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQhhc3NldElkXwkBEF9zYXZlUHJvdG9jb2xGZWUCBQhhc3NldElkXwkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFCGFzc2V0SWRfCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEc3dhcAIOdGFyZ2V0QXNzZXRJZF8KbWluQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABA5zb3VyY2VBc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBBZzb3VyY2VBbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldFN0cgUKbHBEZWNpbWFscwUERE9XTgQQc291cmNlQXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOc291cmNlQXNzZXRTdHICGnN3YXA6IGludmFsaWQgc291cmNlIGFzc2V0AwkAAAIFEHNvdXJjZUFzc2V0SW5kZXgFEHNvdXJjZUFzc2V0SW5kZXgEEHRhcmdldEFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnRhcmdldEFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHRhcmdldCBhc3NldAMJAAACBRB0YXJnZXRBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQ5fY2hlY2tXYXRjaGRvZwAHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAh9zd2FwOiBpbnZhbGlkIG1pbiB0YXJnZXQgYW1vdW50BwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50BwkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRTdHIFDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECG3N3YXA6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcDCQAAAgUDZXJyBQNlcnIEDSR0MDUxODIyNTE5ODAJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA1MTgyMjUxOTgwAl8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA1MTgyMjUxOTgwAl8yBAVscEZlZQgFDSR0MDUxODIyNTE5ODACXzMEC3Byb3RvY29sRmVlCAUNJHQwNTE4MjI1MTk4MAJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1MTgyMjUxOTgwAl81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDnRhcmdldEFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04EBGVycjEJAQxfdmFsaWRhdGVJbnQEBQtmaW5hbEFtb3VudAUKbWluQW1vdW50XwUHTUFYX0lOVAITc3dhcDogbGVzcyB0aGFuIG1pbgMJAAACBQRlcnIxBQRlcnIxCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQ50YXJnZXRBc3NldElkXwUDbmlsCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFDnRhcmdldEFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUOdGFyZ2V0QXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUOdGFyZ2V0QXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQ50YXJnZXRBc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWdldERlcG9zaXRBbGwBCWxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUJbHBBbW91bnRfAAEFB01BWF9JTlQCHWdldERlcG9zaXRBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1MzEwMDUzMTg3CQELX2RlcG9zaXRBbGwBBQlscEFtb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNTMxMDA1MzE4NwJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDUzMTAwNTMxODcCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MzEwMDUzMTg3Al8zCQCUCgIFA25pbAkAlAoCBQ5scFRva2Vuc1RvTWludAUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpnZXREZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBANlcnIDCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAUIYXNzZXRJZF8CGWdldERlcG9zaXQ6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAEFB01BWF9JTlQCGmdldERlcG9zaXQ6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBBBhbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAUHYW1vdW50XwUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNTM5NDY1NDA2MgkBCF9kZXBvc2l0AgUIYXNzZXRJZF8FEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNTM5NDY1NDA2MgJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDUzOTQ2NTQwNjICXzIEBWxwRmVlCAUNJHQwNTM5NDY1NDA2MgJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1Mzk0NjU0MDYyAl80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDUzOTQ2NTQwNjICXzUEDmxwVG9rZW5zVG9TZW5kCQBlAgkAZQIFDmxwVG9rZW5zVG9NaW50BQVscEZlZQULcHJvdG9jb2xGZWUJAJQKAgUDbmlsBQ5scFRva2Vuc1RvU2VuZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5nZXRXaXRoZHJhd0FsbAEJbHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQlscEFtb3VudF8AAAUHTUFYX0lOVAIeZ2V0V2l0aGRyYXdBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1NDUwMTU0NTc3CQEMX3dpdGhkcmF3QWxsAQUJbHBBbW91bnRfBA5scFRva2Vuc1RvQnVybggFDSR0MDU0NTAxNTQ1NzcCXzEEDWJhbGFuY2VzVG9HZXQIBQ0kdDA1NDUwMTU0NTc3Al8yBA1hc3NldEJhbGFuY2VzCAUNJHQwNTQ1MDE1NDU3NwJfMwkAlAoCBQNuaWwFDWJhbGFuY2VzVG9HZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELZ2V0V2l0aGRyYXcCCGFzc2V0SWRfB2Ftb3VudF8EA2VycgMJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMABQhhc3NldElkXwIaZ2V0V2l0aGRyYXc6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAEFB01BWF9JTlQCG2dldFdpdGhkcmF3OiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEDSR0MDU1MjI4NTUzNDQJAQlfd2l0aGRyYXcCBQhhc3NldElkXwUHYW1vdW50XwQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDU1MjI4NTUzNDQCXzEEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1NTIyODU1MzQ0Al8yBAVscEZlZQgFDSR0MDU1MjI4NTUzNDQCXzMEC3Byb3RvY29sRmVlCAUNJHQwNTUyMjg1NTM0NAJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1NTIyODU1MzQ0Al81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04JAJQKAgUDbmlsBQtmaW5hbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdnZXRTd2FwAw5zb3VyY2VBc3NldElkXw50YXJnZXRBc3NldElkXw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEEHNvdXJjZUFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnNvdXJjZUFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHNvdXJjZSBhc3NldAMJAAACBRBzb3VyY2VBc3NldEluZGV4BRBzb3VyY2VBc3NldEluZGV4BBB0YXJnZXRBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ50YXJnZXRBc3NldElkXwIac3dhcDogaW52YWxpZCB0YXJnZXQgYXNzZXQDCQAAAgUQdGFyZ2V0QXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQFDXNvdXJjZUFtb3VudF8JAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldElkXwUKbHBEZWNpbWFscwUERE9XTgQDZXJyAwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50CQEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBQ5zb3VyY2VBc3NldElkXwUOdGFyZ2V0QXNzZXRJZF8CEXN3YXA6IHNhbWUgYXNzZXRzBwMJAAACBQNlcnIFA2VycgQNJHQwNTY3NTQ1NjkxMgkBBV9zd2FwAwUQc291cmNlQXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDU2NzU0NTY5MTICXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDU2NzU0NTY5MTICXzIEBWxwRmVlCAUNJHQwNTY3NTQ1NjkxMgJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1Njc1NDU2OTEyAl80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDU2NzU0NTY5MTICXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUOdGFyZ2V0QXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgkAlAoCBQNuaWwFC2ZpbmFsQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGdldENsYWltAQV1c2VyXwQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwIWZ2V0Q2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBA0kdDA1NzU1NDU3NjEwCQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDU3NTU0NTc2MTACXzEEC3VzZXJQcm9maXRzCAUNJHQwNTc1NTQ1NzYxMAJfMgkAlAoCBQNuaWwFC3VzZXJQcm9maXRzAWkBC2dldFV0aWxGdW5jAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwNTc5NDM1ODAwMwkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1Nzk0MzU4MDAzAl8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwNTc5NDM1ODAwMwJfMgQNJHQwNTgwMDg1ODA2MQkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwNTgwMDg1ODA2MQJfMQQLc2lnbWFXZWlnaHQIBQ0kdDA1ODAwODU4MDYxAl8yBANmZWUJAQ1fY2FsY3VsYXRlRmVlBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUECXV0aWxWYWx1ZQkAZQIFEGFzc2V0VG90YWxTdXBwbHkFA2ZlZQkAlAoCBQNuaWwJAJQKAgUJdXRpbFZhbHVlBQ1scFRvdGFsU3VwcGx5AWkBCmdldEZlZUZ1bmMABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEDSR0MDU4NDkzNTg1NTMJARJfbG9hZEFzc2V0QmFsYW5jZXMABA1hc3NldEJhbGFuY2VzCAUNJHQwNTg0OTM1ODU1MwJfMQQQYXNzZXRUb3RhbFN1cHBseQgFDSR0MDU4NDkzNTg1NTMCXzIEDSR0MDU4NTU4NTg2MTEJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDU4NTU4NTg2MTECXzEEC3NpZ21hV2VpZ2h0CAUNJHQwNTg1NTg1ODYxMQJfMgQDZmVlCQENX2NhbGN1bGF0ZUZlZQcFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlCQCUCgIFA25pbAUDZmVlAWkBCmNoZWNrcG9pbnQBBXVzZXJfBANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhhjaGVja3BvaW50OiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgkBC19jaGVja3BvaW50AQUEdXNlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAEA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEIBQdzdG9yYWdlAl8xBARlcnIxAwMJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHHN0YWtlOiBpbnZhbGlkIHBheW1lbnRzIHNpemUJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAhxzdGFrZTogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCHXN0YWtlOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBA0kdDA1OTYxOTU5Njc5CQELX2NoZWNrcG9pbnQBCAUBaQZjYWxsZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTk2MTk1OTY3OQJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1OTYxOTU5Njc5Al8yCQCUCgIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBkAgkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBDF9zYXZlVG90YWxMcAEJAGQCCQEMX2xvYWRUb3RhbExwAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5zdGFrZQEHYW1vdW50XwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEBnVzZXJMcAkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQZ1c2VyTHACF3Vuc3Rha2U6IGludmFsaWQgYW1vdW50AwkAAAIFBGVycjEFBGVycjEEDSR0MDYwMTkwNjAyNTAJAQtfY2hlY2twb2ludAEIBQFpBmNhbGxlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA2MDE5MDYwMjUwAl8xBAt1c2VyUHJvZml0cwgFDSR0MDYwMTkwNjAyNTACXzIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2Ftb3VudF8FCWxwQXNzZXRJZAUDbmlsBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBlAgUGdXNlckxwBQdhbW91bnRfCQEMX3NhdmVUb3RhbExwAQkAZQIJAQxfbG9hZFRvdGFsTHAABQdhbW91bnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwITY2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQEBmFzc2V0cwkAzAgCBQxscEFzc2V0SWRTdHIJAQtfbG9hZEFzc2V0cwAECG1heEluZGV4CQBlAgkAkAMBBQZhc3NldHMAAQQGdXNlckxwCQELX2xvYWRVc2VyTHABBQR1c2VyBA0kdDA2MDk3MzYxMDI5CQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDYwOTczNjEwMjkCXzEEC3VzZXJQcm9maXRzCAUNJHQwNjA5NzM2MTAyOQJfMgoBCGZvbGRGdW5jAgNhY2MGcHJvZml0BAVpbmRleAgFA2FjYwJfMQMDCQBnAgUIbWF4SW5kZXgFBWluZGV4CQBmAgUGcHJvZml0AAAHBAVhc3NldAkAkQMCBQZhc3NldHMFBWluZGV4CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIAAAkAzQgCCAUDYWNjAl8zCQEOU2NyaXB0VHJhbnNmZXIDBQR1c2VyBQZwcm9maXQJAQtfc3RyVG9Bc3NldAEFBWFzc2V0CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFBnByb2ZpdAgFA2FjYwJfMwQNJHQwNjE0MDc2MTQ5OAoAAiRsBQt1c2VyUHJvZml0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwQDaWR4CAUNJHQwNjE0MDc2MTQ5OAJfMQQSdXNlclByb2ZpdHNVcGRhdGVkCAUNJHQwNjE0MDc2MTQ5OAJfMgQNcHJvZml0QWN0aW9ucwgFDSR0MDYxNDA3NjE0OTgCXzMJAJQKAgkAzggCCQDOCAIFDXByb2ZpdEFjdGlvbnMJANEIAgURY2hlY2twb2ludEFjdGlvbnMAAAkBEF9zYXZlVXNlclByb2ZpdHMCBQR1c2VyBRJ1c2VyUHJvZml0c1VwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFcGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEGBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3VucGF1c2UABANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQELX3doZW5QYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEHBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHVwZGF0ZVBhdXNlcgEHcGF1c2VyXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhx1cGRhdGVQYXVzZXI6IGludmFsaWQgcGF1c2VyBwMJAAACBQNlcnIFA2VycgkAlAoCCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDnVwZGF0ZVdhdGNoZG9nAgl3YXRjaGRvZ18Hb2Zmc2V0XwQDZXJyAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUJd2F0Y2hkb2dfAiB1cGRhdGVXYXRjaGRvZzogaW52YWxpZCB3YXRjaGRvZwcJAQxfdmFsaWRhdGVJbnQEBQdvZmZzZXRfAAAFB01BWF9JTlQCHnVwZGF0ZVdhdGNoZG9nOiBpbnZhbGlkIG9mZnNldAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzggCCQENX3NhdmVXYXRjaGRvZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXdhdGNoZG9nXwkBE19zYXZlV2F0Y2hkb2dPZmZzZXQBBQdvZmZzZXRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3NldE11bHRpc2lnAQltdWx0aXNpZ18EA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF92YWxpZGF0ZUFkZHJlc3MCBQltdWx0aXNpZ18CHXNldE11bHRpc2lnOiBpbnZhbGlkIG11bHRpc2lnBwMJAAACBQNlcnIFA2VycgkAlAoCCQENX3NhdmVNdWx0aXNpZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW11bHRpc2lnXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIbXVsdGlzaWcJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQDYBAEIBQJ0eAJpZAUDbmlsBQNTRVAHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5ycwuuQ==", "height": 3898602, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: C9fC6vqxRaWYqdnxnJZs2NZtHA98WeR2ZbFhevxkUKC4 Next: FFi32RrJVgR31ubeRWP2a4M1QxHZMruEYzTgqZyhShvw Diff:
OldNewDifferences
6868 let KEY_TOTAL_LP = "TOTAL_LP"
6969
7070 let KEY_USER_PROFITS = "USER_PROFITS"
71+
72+let KEY_WATCHDOG = "WATCHDOG"
73+
74+let KEY_WATCHDOG_OFFSET = "WATCHDOG_OFFSET"
75+
76+let KEY_WATCHDOG_HEIGHT = "WATCHDOG_HEIGHT"
7177
7278 func _validateAddress (address_,err_) = match addressFromString(address_) {
7379 case a: Address =>
566572 }
567573
568574
575+func _loadWatchdog () = match getString(KEY_WATCHDOG) {
576+ case a: String =>
577+ addressFromStringValue(a)
578+ case _ =>
579+ Address(base58'')
580+}
581+
582+
583+func _saveWatchdog (watchdog_) = [StringEntry(KEY_WATCHDOG, toString(watchdog_))]
584+
585+
586+func _loadWatchdogOffset () = match getInteger(KEY_WATCHDOG_OFFSET) {
587+ case a: Int =>
588+ a
589+ case _ =>
590+ 0
591+}
592+
593+
594+func _saveWatchdogOffset (offset_) = [IntegerEntry(KEY_WATCHDOG_OFFSET, offset_)]
595+
596+
569597 func _onlyThisContract (caller_) = if ((caller_ != this))
570598 then throw("_onlyThisContract: revert")
571599 else true
605633 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
606634 then throw("_onlyPauser: revert")
607635 else true
636+
637+
638+func _checkWatchdog () = {
639+ let wd = match getInteger(_loadWatchdog(), KEY_WATCHDOG_HEIGHT) {
640+ case a: Int =>
641+ (a + _loadWatchdogOffset())
642+ case _ =>
643+ 0
644+ }
645+ if ((height > wd))
646+ then throw("_checkWatchdog: revert")
647+ else true
648+ }
608649
609650
610651 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
926967 }
927968
928969
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- }
970+func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = 0
952971
953972
954973 func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
10041023 }
10051024
10061025
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- }
1026+func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = true
10311027
10321028
10331029 func _checkpoint (user_) = {
10411037 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10421038 }
10431039
1044- let $t02460524678 = {
1040+ let $t02555825631 = {
10451041 let $l = ZERO_INT_LIST_11
10461042 let $s = size($l)
10471043 let $acc0 = $Tuple2(0, nil)
10551051
10561052 $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)
10571053 }
1058- let idx = $t02460524678._1
1059- let profitsUpdated = $t02460524678._2
1054+ let idx = $t02555825631._1
1055+ let profitsUpdated = $t02555825631._2
10601056 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10611057 }
10621058
10701066 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10711067 }
10721068
1073- let $t02532825407 = {
1069+ let $t02628126360 = {
10741070 let $l = ZERO_INT_LIST_11
10751071 let $s = size($l)
10761072 let $acc0 = $Tuple2(0, nil)
10841080
10851081 $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)
10861082 }
1087- let idx = $t02532825407._1
1088- let sigmaFeePerLpUpdated = $t02532825407._2
1083+ let idx = $t02628126360._1
1084+ let sigmaFeePerLpUpdated = $t02628126360._2
10891085 sigmaFeePerLpUpdated
10901086 }
10911087
10931089 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10941090 let sigmaFeePerLp = _loadSigmaFeePerLp()
10951091 let totalLp = _loadTotalLp()
1096- let $t02562825903 = if ((totalLp == 0))
1092+ let $t02658126856 = if ((totalLp == 0))
10971093 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10981094 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1099- let lpFee = $t02562825903._1
1100- let protocolFee = $t02562825903._2
1095+ let lpFee = $t02658126856._1
1096+ let protocolFee = $t02658126856._2
11011097 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11021098 then sigmaFeePerLp
11031099 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11121108 let slippageRate = storage._8
11131109 let feeMaxRate = storage._9
11141110 let assets = _loadAssets()
1115- let $t02641226465 = _loadAssetWeights()
1116- let assetWeights = $t02641226465._1
1117- let sigmaWeight = $t02641226465._2
1118- let $t02647026538 = _loadAssetBalances()
1119- let prevAssetBalances = $t02647026538._1
1120- let prevAssetTotalSupply = $t02647026538._2
1121- let $t02654427774 = if ((prevAssetTotalSupply == 0))
1111+ let $t02736527418 = _loadAssetWeights()
1112+ let assetWeights = $t02736527418._1
1113+ let sigmaWeight = $t02736527418._2
1114+ let $t02742327491 = _loadAssetBalances()
1115+ let prevAssetBalances = $t02742327491._1
1116+ let prevAssetTotalSupply = $t02742327491._2
1117+ let $t02749728727 = if ((prevAssetTotalSupply == 0))
11221118 then {
11231119 func foldFunc (acc,elem) = {
11241120 let index = acc._1
11261122 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11271123 }
11281124
1129- let $t02698627060 = {
1125+ let $t02793928013 = {
11301126 let $l = assets
11311127 let $s = size($l)
11321128 let $acc0 = $Tuple2(0, nil)
11401136
11411137 $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)
11421138 }
1143- let idx = $t02698627060._1
1144- let requiredAmountsNormalized = $t02698627060._2
1139+ let idx = $t02793928013._1
1140+ let requiredAmountsNormalized = $t02793928013._2
11451141 $Tuple2(amount_, requiredAmountsNormalized)
11461142 }
11471143 else {
11521148 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11531149 }
11541150
1155- let $t02760327678 = {
1151+ let $t02855628631 = {
11561152 let $l = assets
11571153 let $s = size($l)
11581154 let $acc0 = $Tuple2(0, nil)
11661162
11671163 $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)
11681164 }
1169- let idx = $t02760327678._1
1170- let requiredAmountsNormalized = $t02760327678._2
1165+ let idx = $t02855628631._1
1166+ let requiredAmountsNormalized = $t02855628631._2
11711167 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11721168 }
1173- let lpTokensToMint = $t02654427774._1
1174- let requiredAmountsNormalized = $t02654427774._2
1175- let $t02778027893 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1176- let assetBalances = $t02778027893._1
1177- let assetTotalSupply = $t02778027893._2
1169+ let lpTokensToMint = $t02749728727._1
1170+ let requiredAmountsNormalized = $t02749728727._2
1171+ let $t02873328846 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1172+ let assetBalances = $t02873328846._1
1173+ let assetTotalSupply = $t02873328846._2
11781174 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11791175 if ((err2 == err2))
11801176 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11921188 let slippageRate = storage._8
11931189 let feeMaxRate = storage._9
11941190 let assets = _loadAssets()
1195- let $t02865628709 = _loadAssetWeights()
1196- let assetWeights = $t02865628709._1
1197- let sigmaWeight = $t02865628709._2
1198- let $t02871428828 = _loadAssetBalances()
1199- let prevAssetBalances = $t02871428828._1
1200- let prevAssetTotalSupply = $t02871428828._2
1191+ let $t02960929662 = _loadAssetWeights()
1192+ let assetWeights = $t02960929662._1
1193+ let sigmaWeight = $t02960929662._2
1194+ let $t02966729781 = _loadAssetBalances()
1195+ let prevAssetBalances = $t02966729781._1
1196+ let prevAssetTotalSupply = $t02966729781._2
12011197 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12021198 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12031199 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12171213 then lpTokensToMintInner
12181214 else throw("Strict value is not equal to itself.")
12191215 }
1220- let $t03049030621 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1221- let lpFee = $t03049030621._1
1222- let protocolFee = $t03049030621._2
1223- let sigmaFeePerLpUpdated = $t03049030621._3
1216+ let $t03144331574 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1217+ let lpFee = $t03144331574._1
1218+ let protocolFee = $t03144331574._2
1219+ let sigmaFeePerLpUpdated = $t03144331574._3
12241220 $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12251221 }
12261222 else throw("Strict value is not equal to itself.")
12341230 let weightAmplifier = storage._7
12351231 let slippageRate = storage._8
12361232 let feeMaxRate = storage._9
1237- let $t03095531023 = _loadAssetBalances()
1238- let prevAssetBalances = $t03095531023._1
1239- let prevAssetTotalSupply = $t03095531023._2
1240- let $t03102831081 = _loadAssetWeights()
1241- let assetWeights = $t03102831081._1
1242- let sigmaWeight = $t03102831081._2
1233+ let $t03190831976 = _loadAssetBalances()
1234+ let prevAssetBalances = $t03190831976._1
1235+ let prevAssetTotalSupply = $t03190831976._2
1236+ let $t03198132034 = _loadAssetWeights()
1237+ let assetWeights = $t03198132034._1
1238+ let sigmaWeight = $t03198132034._2
12431239 let lpTokensToBurn = amount_
12441240 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12451241 if ((err == err))
12461242 then {
1247- let $t03122331356 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1248- let assetBalances = $t03122331356._1
1249- let assetTotalSupply = $t03122331356._2
1250- let balancesToPay = $t03122331356._3
1243+ let $t03217632309 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1244+ let assetBalances = $t03217632309._1
1245+ let assetTotalSupply = $t03217632309._2
1246+ let balancesToPay = $t03217632309._3
12511247 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12521248 if ((err2 == err2))
12531249 then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12681264 let feeMaxRate = storage._9
12691265 let precision = _loadPrecision()
12701266 let assets = _loadAssets()
1271- let $t03214832216 = _loadAssetBalances()
1272- let prevAssetBalances = $t03214832216._1
1273- let prevAssetTotalSupply = $t03214832216._2
1274- let $t03222132274 = _loadAssetWeights()
1275- let assetWeights = $t03222132274._1
1276- let sigmaWeight = $t03222132274._2
1267+ let $t03310133169 = _loadAssetBalances()
1268+ let prevAssetBalances = $t03310133169._1
1269+ let prevAssetTotalSupply = $t03310133169._2
1270+ let $t03317433227 = _loadAssetWeights()
1271+ let assetWeights = $t03317433227._1
1272+ let sigmaWeight = $t03317433227._2
12771273 let targetAssetIndex = value(indexOf(assets, assetId_))
12781274 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12791275 let prevUtilValue = (prevAssetTotalSupply - prevFee)
13001296
13011297 let targetAmount = {
13021298 let stop = toInt(fraction(toBigInt((lpAmount_ + prevFee)), prevUtilValueDivLp, PERCENT_FACTOR, CEILING))
1303- let $t03414034252 = {
1299+ let $t03509335205 = {
13041300 let $l = LIST_64
13051301 let $s = size($l)
13061302 let $acc0 = $Tuple5(false, 0, stop, 0, 0)
13141310
13151311 $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)
13161312 }
1317- let success = $t03414034252._1
1318- let startOut = $t03414034252._2
1319- let stopOut = $t03414034252._3
1320- let targetAmountOut = $t03414034252._4
1321- let diffOut = $t03414034252._5
1313+ let success = $t03509335205._1
1314+ let startOut = $t03509335205._2
1315+ let stopOut = $t03509335205._3
1316+ let targetAmountOut = $t03509335205._4
1317+ let diffOut = $t03509335205._5
13221318 if (!(success))
13231319 then throw(((("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
13241320 else targetAmountOut
13301326 else false
13311327 if ((err1 == err1))
13321328 then {
1333- let $t03524435392 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1334- let lpFee = $t03524435392._1
1335- let protocolFee = $t03524435392._2
1336- let sigmaFeePerLpUpdated = $t03524435392._3
1329+ let $t03619736345 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1330+ let lpFee = $t03619736345._1
1331+ let protocolFee = $t03619736345._2
1332+ let sigmaFeePerLpUpdated = $t03619736345._3
13371333 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13381334 }
13391335 else throw("Strict value is not equal to itself.")
13521348 let slippageRate = storage._8
13531349 let feeMaxRate = storage._9
13541350 let precision = _loadPrecision()
1355- let $t03597436042 = _loadAssetBalances()
1356- let prevAssetBalances = $t03597436042._1
1357- let prevAssetTotalSupply = $t03597436042._2
1358- let $t03604736100 = _loadAssetWeights()
1359- let assetWeights = $t03604736100._1
1360- let sigmaWeight = $t03604736100._2
1351+ let $t03692736995 = _loadAssetBalances()
1352+ let prevAssetBalances = $t03692736995._1
1353+ let prevAssetTotalSupply = $t03692736995._2
1354+ let $t03700037053 = _loadAssetWeights()
1355+ let assetWeights = $t03700037053._1
1356+ let sigmaWeight = $t03700037053._2
13611357 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13621358 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13631359 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13891385 if ((feeDiff == 0))
13901386 then targetAmount
13911387 else {
1392- let $t03807338204 = {
1388+ let $t03902639157 = {
13931389 let $l = LIST_64
13941390 let $s = size($l)
13951391 let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, 0)
14031399
14041400 $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)
14051401 }
1406- let success = $t03807338204._1
1407- let startOut = $t03807338204._2
1408- let stopOut = $t03807338204._3
1409- let targetAmountOut = $t03807338204._4
1410- let diffOut = $t03807338204._5
1402+ let success = $t03902639157._1
1403+ let startOut = $t03902639157._2
1404+ let stopOut = $t03902639157._3
1405+ let targetAmountOut = $t03902639157._4
1406+ let diffOut = $t03902639157._5
14111407 if (!(success))
14121408 then throw(((("_swap: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
14131409 else targetAmountOut
14201416 else false
14211417 if ((err1 == err1))
14221418 then {
1423- let $t03905139192 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1424- let lpFee = $t03905139192._1
1425- let protocolFee = $t03905139192._2
1426- let sigmaFeePerLpUpdated = $t03905139192._3
1419+ let $t04000440145 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1420+ let lpFee = $t04000440145._1
1421+ let protocolFee = $t04000440145._2
1422+ let sigmaFeePerLpUpdated = $t04000440145._3
14271423 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14281424 }
14291425 else throw("Strict value is not equal to itself.")
14691465 else false
14701466 if ((err == err))
14711467 then {
1472- let $t04105541124 = _prepareAssetWeights(assetWeights_)
1473- let assetWeights = $t04105541124._1
1474- let sigmaWeight = $t04105541124._2
1468+ let $t04200842077 = _prepareAssetWeights(assetWeights_)
1469+ let assetWeights = $t04200842077._1
1470+ let sigmaWeight = $t04200842077._2
14751471 let assetBalances = _prepareAssetBalances(assets_)
14761472 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14771473 let lpAssetId = calculateAssetId(issue)
14961492 let lpAssetId = storage._1
14971493 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14981494 let assets = _loadAssets()
1499- let $t04287442959 = _depositAll(amount_)
1500- let lpTokensToMint = $t04287442959._1
1501- let requiredAmountsNormalized = $t04287442959._2
1502- let assetBalances = $t04287442959._3
1495+ let $t04382743912 = _depositAll(amount_)
1496+ let lpTokensToMint = $t04382743912._1
1497+ let requiredAmountsNormalized = $t04382743912._2
1498+ let assetBalances = $t04382743912._3
15031499 func foldFunc (acc,elem) = {
15041500 let index = acc._1
15051501 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15231519 else throw("Strict value is not equal to itself.")
15241520 }
15251521
1526- let $t04410244164 = {
1522+ let $t04505545117 = {
15271523 let $l = assets
15281524 let $s = size($l)
15291525 let $acc0 = $Tuple2(0, nil)
15371533
15381534 $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)
15391535 }
1540- let idx = $t04410244164._1
1541- let changeActions = $t04410244164._2
1536+ let idx = $t04505545117._1
1537+ let changeActions = $t04505545117._2
15421538 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15431539 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15441540 }
15561552 let lpAssetId = storage._1
15571553 let lpAssetIdStr = _assetToStr(lpAssetId)
15581554 let lpDecimals = _getDecimals(lpAssetIdStr)
1559- let err1 = if (if (if (if (_whenInitialized())
1555+ let err1 = if (if (if (if (if (_whenInitialized())
15601556 then _whenNotPaused()
1557+ else false)
1558+ then _checkWatchdog()
15611559 else false)
15621560 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
15631561 else false)
15701568 let assetStr = _assetToStr(i.payments[0].assetId)
15711569 let assetDecimals = _getDecimals(assetStr)
15721570 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1573- let $t04557645692 = _deposit(assetStr, amountNormalized)
1574- let lpTokensToMint = $t04557645692._1
1575- let assetBalances = $t04557645692._2
1576- let lpFee = $t04557645692._3
1577- let protocolFee = $t04557645692._4
1578- let sigmaFeePerLpUpdated = $t04557645692._5
1571+ let $t04655746673 = _deposit(assetStr, amountNormalized)
1572+ let lpTokensToMint = $t04655746673._1
1573+ let assetBalances = $t04655746673._2
1574+ let lpFee = $t04655746673._3
1575+ let protocolFee = $t04655746673._4
1576+ let sigmaFeePerLpUpdated = $t04655746673._5
15791577 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
15801578 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
15811579 if ((err2 == err2))
15991597 let lpAssetIdStr = toBase58String(lpAssetId)
16001598 let lpDecimals = _getDecimals(lpAssetIdStr)
16011599 let assets = _loadAssets()
1602- let err = if (if (if (if (_whenInitialized())
1603- then _whenNotPaused()
1604- else false)
1600+ let err = if (if (if (_whenInitialized())
16051601 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
16061602 else false)
16071603 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
16101606 else false
16111607 if ((err == err))
16121608 then {
1613- let $t04718147268 = _withdrawAll(i.payments[0].amount)
1614- let lpTokensToBurn = $t04718147268._1
1615- let balancesToPay = $t04718147268._2
1616- let assetBalances = $t04718147268._3
1609+ let $t04813448221 = _withdrawAll(i.payments[0].amount)
1610+ let lpTokensToBurn = $t04813448221._1
1611+ let balancesToPay = $t04813448221._2
1612+ let assetBalances = $t04813448221._3
16171613 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16181614 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16191615 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16301626 let lpAssetIdStr = toBase58String(lpAssetId)
16311627 let lpDecimals = _getDecimals(lpAssetIdStr)
16321628 let assets = _loadAssets()
1633- let err = if (if (if (if (if (if (_whenInitialized())
1629+ let err = if (if (if (if (if (if (if (_whenInitialized())
16341630 then _whenNotPaused()
1631+ else false)
1632+ then _checkWatchdog()
16351633 else false)
16361634 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
16371635 else false)
16451643 else false
16461644 if ((err == err))
16471645 then {
1648- let $t04859448728 = _withdraw(assetId_, i.payments[0].amount)
1649- let targetAmountNormalized = $t04859448728._1
1650- let finalAssetBalances = $t04859448728._2
1651- let lpFee = $t04859448728._3
1652- let protocolFee = $t04859448728._4
1653- let sigmaFeePerLpUpdated = $t04859448728._5
1646+ let $t04957549709 = _withdraw(assetId_, i.payments[0].amount)
1647+ let targetAmountNormalized = $t04957549709._1
1648+ let finalAssetBalances = $t04957549709._2
1649+ let lpFee = $t04957549709._3
1650+ let protocolFee = $t04957549709._4
1651+ let sigmaFeePerLpUpdated = $t04957549709._5
16541652 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16551653 let targetDecimals = _getDecimals(assetId_)
16561654 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16811679 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16821680 if ((targetAssetIndex == targetAssetIndex))
16831681 then {
1684- let err = if (if (if (if (if (_whenInitialized())
1682+ let err = if (if (if (if (if (if (_whenInitialized())
16851683 then _whenNotPaused()
1684+ else false)
1685+ then _checkWatchdog()
16861686 else false)
16871687 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16881688 else false)
16941694 else false
16951695 if ((err == err))
16961696 then {
1697- let $t05081350971 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1698- let targetAmountNormalized = $t05081350971._1
1699- let finalAssetBalances = $t05081350971._2
1700- let lpFee = $t05081350971._3
1701- let protocolFee = $t05081350971._4
1702- let sigmaFeePerLpUpdated = $t05081350971._5
1697+ let $t05182251980 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1698+ let targetAmountNormalized = $t05182251980._1
1699+ let finalAssetBalances = $t05182251980._2
1700+ let lpFee = $t05182251980._3
1701+ let protocolFee = $t05182251980._4
1702+ let sigmaFeePerLpUpdated = $t05182251980._5
17031703 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17041704 let targetDecimals = _getDecimals(targetAssetId_)
17051705 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17221722 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17231723 if ((err == err))
17241724 then {
1725- let $t05209152178 = _depositAll(lpAmount_)
1726- let lpTokensToMint = $t05209152178._1
1727- let requiredAmountsNormalized = $t05209152178._2
1728- let assetBalances = $t05209152178._3
1725+ let $t05310053187 = _depositAll(lpAmount_)
1726+ let lpTokensToMint = $t05310053187._1
1727+ let requiredAmountsNormalized = $t05310053187._2
1728+ let assetBalances = $t05310053187._3
17291729 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17301730 }
17311731 else throw("Strict value is not equal to itself.")
17451745 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17461746 let assetDecimals = _getDecimals(assetId_)
17471747 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1748- let $t05293753053 = _deposit(assetId_, amountNormalized)
1749- let lpTokensToMint = $t05293753053._1
1750- let assetBalances = $t05293753053._2
1751- let lpFee = $t05293753053._3
1752- let protocolFee = $t05293753053._4
1753- let sigmaFeePerLpUpdated = $t05293753053._5
1748+ let $t05394654062 = _deposit(assetId_, amountNormalized)
1749+ let lpTokensToMint = $t05394654062._1
1750+ let assetBalances = $t05394654062._2
1751+ let lpFee = $t05394654062._3
1752+ let protocolFee = $t05394654062._4
1753+ let sigmaFeePerLpUpdated = $t05394654062._5
17541754 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
17551755 $Tuple2(nil, lpTokensToSend)
17561756 }
17641764 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17651765 if ((err == err))
17661766 then {
1767- let $t05349253568 = _withdrawAll(lpAmount_)
1768- let lpTokensToBurn = $t05349253568._1
1769- let balancesToGet = $t05349253568._2
1770- let assetBalances = $t05349253568._3
1767+ let $t05450154577 = _withdrawAll(lpAmount_)
1768+ let lpTokensToBurn = $t05450154577._1
1769+ let balancesToGet = $t05450154577._2
1770+ let assetBalances = $t05450154577._3
17711771 $Tuple2(nil, balancesToGet)
17721772 }
17731773 else throw("Strict value is not equal to itself.")
17851785 let storage = _loadStorage()
17861786 let lpAssetId = storage._1
17871787 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1788- let $t05421954335 = _withdraw(assetId_, amount_)
1789- let targetAmountNormalized = $t05421954335._1
1790- let assetBalances = $t05421954335._2
1791- let lpFee = $t05421954335._3
1792- let protocolFee = $t05421954335._4
1793- let sigmaFeePerLpUpdated = $t05421954335._5
1788+ let $t05522855344 = _withdraw(assetId_, amount_)
1789+ let targetAmountNormalized = $t05522855344._1
1790+ let assetBalances = $t05522855344._2
1791+ let lpFee = $t05522855344._3
1792+ let protocolFee = $t05522855344._4
1793+ let sigmaFeePerLpUpdated = $t05522855344._5
17941794 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17951795 let targetDecimals = _getDecimals(assetId_)
17961796 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18191819 else false
18201820 if ((err == err))
18211821 then {
1822- let $t05574955907 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1823- let targetAmountNormalized = $t05574955907._1
1824- let finalAssetBalances = $t05574955907._2
1825- let lpFee = $t05574955907._3
1826- let protocolFee = $t05574955907._4
1827- let sigmaFeePerLpUpdated = $t05574955907._5
1822+ let $t05675456912 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1823+ let targetAmountNormalized = $t05675456912._1
1824+ let finalAssetBalances = $t05675456912._2
1825+ let lpFee = $t05675456912._3
1826+ let protocolFee = $t05675456912._4
1827+ let sigmaFeePerLpUpdated = $t05675456912._5
18281828 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18291829 let targetDecimals = _getDecimals(targetAssetId_)
18301830 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18441844 let user = if ((size(user_) > 0))
18451845 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18461846 else i.caller
1847- let $t05654956605 = _checkpoint(user)
1848- let checkpointActions = $t05654956605._1
1849- let userProfits = $t05654956605._2
1847+ let $t05755457610 = _checkpoint(user)
1848+ let checkpointActions = $t05755457610._1
1849+ let userProfits = $t05755457610._2
18501850 $Tuple2(nil, userProfits)
18511851 }
18521852
18591859 let weightAmplifier = storage._7
18601860 let slippageRate = storage._8
18611861 let feeMaxRate = storage._9
1862- let $t05693856998 = _loadAssetBalances()
1863- let assetBalances = $t05693856998._1
1864- let assetTotalSupply = $t05693856998._2
1865- let $t05700357056 = _loadAssetWeights()
1866- let assetWeights = $t05700357056._1
1867- let sigmaWeight = $t05700357056._2
1862+ let $t05794358003 = _loadAssetBalances()
1863+ let assetBalances = $t05794358003._1
1864+ let assetTotalSupply = $t05794358003._2
1865+ let $t05800858061 = _loadAssetWeights()
1866+ let assetWeights = $t05800858061._1
1867+ let sigmaWeight = $t05800858061._2
18681868 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18691869 let utilValue = (assetTotalSupply - fee)
18701870 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
18781878 let weightAmplifier = storage._7
18791879 let slippageRate = storage._8
18801880 let feeMaxRate = storage._9
1881- let $t05748857548 = _loadAssetBalances()
1882- let assetBalances = $t05748857548._1
1883- let assetTotalSupply = $t05748857548._2
1884- let $t05755357606 = _loadAssetWeights()
1885- let assetWeights = $t05755357606._1
1886- let sigmaWeight = $t05755357606._2
1881+ let $t05849358553 = _loadAssetBalances()
1882+ let assetBalances = $t05849358553._1
1883+ let assetTotalSupply = $t05849358553._2
1884+ let $t05855858611 = _loadAssetWeights()
1885+ let assetWeights = $t05855858611._1
1886+ let sigmaWeight = $t05855858611._2
18871887 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18881888 $Tuple2(nil, fee)
18891889 }
19231923 else false
19241924 if ((err1 == err1))
19251925 then {
1926- let $t05861458674 = _checkpoint(i.caller)
1927- let checkpointActions = $t05861458674._1
1928- let userProfits = $t05861458674._2
1926+ let $t05961959679 = _checkpoint(i.caller)
1927+ let checkpointActions = $t05961959679._1
1928+ let userProfits = $t05961959679._2
19291929 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19301930 }
19311931 else throw("Strict value is not equal to itself.")
19481948 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19491949 if ((err1 == err1))
19501950 then {
1951- let $t05918559245 = _checkpoint(i.caller)
1952- let checkpointActions = $t05918559245._1
1953- let userProfits = $t05918559245._2
1951+ let $t06019060250 = _checkpoint(i.caller)
1952+ let checkpointActions = $t06019060250._1
1953+ let userProfits = $t06019060250._2
19541954 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19551955 }
19561956 else throw("Strict value is not equal to itself.")
19761976 let assets = [lpAssetIdStr, _loadAssets()]
19771977 let maxIndex = (size(assets) - 1)
19781978 let userLp = _loadUserLp(user)
1979- let $t05996860024 = _checkpoint(user)
1980- let checkpointActions = $t05996860024._1
1981- let userProfits = $t05996860024._2
1979+ let $t06097361029 = _checkpoint(user)
1980+ let checkpointActions = $t06097361029._1
1981+ let userProfits = $t06097361029._2
19821982 func foldFunc (acc,profit) = {
19831983 let index = acc._1
19841984 if (if ((maxIndex >= index))
19911991 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19921992 }
19931993
1994- let $t06040260493 = {
1994+ let $t06140761498 = {
19951995 let $l = userProfits
19961996 let $s = size($l)
19971997 let $acc0 = $Tuple3(0, nil, nil)
20052005
20062006 $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)
20072007 }
2008- let idx = $t06040260493._1
2009- let userProfitsUpdated = $t06040260493._2
2010- let profitActions = $t06040260493._3
2008+ let idx = $t06140761498._1
2009+ let userProfitsUpdated = $t06140761498._2
2010+ let profitActions = $t06140761498._3
20112011 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
20122012 }
20132013 else throw("Strict value is not equal to itself.")
20312031
20322032 @Callable(i)
20332033 func unpause () = {
2034- let err = if (if (_onlyPauser(i.caller))
2034+ let err = if (if (_onlyThisContract(i.caller))
20352035 then _whenInitialized()
20362036 else false)
20372037 then _whenPaused()
20522052 else false
20532053 if ((err == err))
20542054 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
2055+ else throw("Strict value is not equal to itself.")
2056+ }
2057+
2058+
2059+
2060+@Callable(i)
2061+func updateWatchdog (watchdog_,offset_) = {
2062+ let err = if (if (if (_onlyThisContract(i.caller))
2063+ then _whenInitialized()
2064+ else false)
2065+ then _validateAddress(watchdog_, "updateWatchdog: invalid watchdog")
2066+ else false)
2067+ then _validateInt(offset_, 0, MAX_INT, "updateWatchdog: invalid offset")
2068+ else false
2069+ if ((err == err))
2070+ then $Tuple2((_saveWatchdog(addressFromStringValue(watchdog_)) ++ _saveWatchdogOffset(offset_)), unit)
20552071 else throw("Strict value is not equal to itself.")
20562072 }
20572073
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let WAVES = "waves"
77
88 let MAX_INT = 9223372036854775807
99
1010 let MAX_FEE = 1000000
1111
1212 let MAX_AMPLIFIER = 1000000
1313
1414 let MAX_WEIGHT_AMPLIFIER = 1000000
1515
1616 let MAX_WEIGHT = 1000000
1717
1818 let SLIPPAGE_RATE_FACTOR = 1000000
1919
2020 let FEE_RATE_FACTOR = 1000000
2121
2222 let RATE_FACTOR = 1000000
2323
2424 let PERCENT_FACTOR = toBigInt(1000000000000000000)
2525
2626 let ZERO_INT_LIST_10 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2727
2828 let ZERO_INT_LIST_11 = (ZERO_INT_LIST_10 :+ 0)
2929
3030 let ZERO_BIGINT = toBigInt(0)
3131
3232 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]
3333
3434 let INT_DECIMALS = 8
3535
3636 let BIGINT_DECIMALS = 18
3737
3838 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", "_")
3939
4040 let KEY_MULTISIG = "MULTISIG"
4141
4242 let KEY_STATUS = "STATUS"
4343
4444 let KEY_PAUSED = "PAUSED"
4545
4646 let KEY_PAUSER = "PAUSER"
4747
4848 let KEY_STORAGE = "STORAGE"
4949
5050 let KEY_ASSETS = "ASSETS"
5151
5252 let KEY_ASSET_BALANCES = "ASSET_BALANCES"
5353
5454 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
5555
5656 let KEY_LP_FEE = "LP_FEE"
5757
5858 let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
5959
6060 let KEY_PRECISION = "PRECISION"
6161
6262 let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
6363
6464 let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
6565
6666 let KEY_USER_LP = "USER_LP"
6767
6868 let KEY_TOTAL_LP = "TOTAL_LP"
6969
7070 let KEY_USER_PROFITS = "USER_PROFITS"
71+
72+let KEY_WATCHDOG = "WATCHDOG"
73+
74+let KEY_WATCHDOG_OFFSET = "WATCHDOG_OFFSET"
75+
76+let KEY_WATCHDOG_HEIGHT = "WATCHDOG_HEIGHT"
7177
7278 func _validateAddress (address_,err_) = match addressFromString(address_) {
7379 case a: Address =>
7480 true
7581 case _ =>
7682 throw(err_)
7783 }
7884
7985
8086 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
8187 then true
8288 else match assetInfo(fromBase58String(assetId_)) {
8389 case a: Asset =>
8490 true
8591 case _ =>
8692 throw(err_)
8793 }
8894
8995
9096 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
9197 then true
9298 else (val_ > upperBoundary_))
9399 then throw(err_)
94100 else true
95101
96102
97103 func _validateBool (val_,target_,err_) = if ((val_ != target_))
98104 then throw(err_)
99105 else true
100106
101107
102108 func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
103109 then throw(err_)
104110 else true
105111
106112
107113 func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
108114 then throw(err_)
109115 else true
110116
111117
112118 func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
113119 func foldFunc (acc,elem) = match parseInt(elem) {
114120 case a: Int =>
115121 if (acc)
116122 then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
117123 else false
118124 case _ =>
119125 throw(err_)
120126 }
121127
122128 let $l = val_
123129 let $s = size($l)
124130 let $acc0 = true
125131 func $f0_1 ($a,$i) = if (($i >= $s))
126132 then $a
127133 else foldFunc($a, $l[$i])
128134
129135 func $f0_2 ($a,$i) = if (($i >= $s))
130136 then $a
131137 else throw("List size exceeds 10")
132138
133139 $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)
134140 }
135141
136142
137143 func _validateAssets (assets_,err_) = {
138144 func foldFunc (acc,elem) = if (acc)
139145 then _validateAsset(elem, err_)
140146 else false
141147
142148 let $l = assets_
143149 let $s = size($l)
144150 let $acc0 = true
145151 func $f0_1 ($a,$i) = if (($i >= $s))
146152 then $a
147153 else foldFunc($a, $l[$i])
148154
149155 func $f0_2 ($a,$i) = if (($i >= $s))
150156 then $a
151157 else throw("List size exceeds 10")
152158
153159 $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)
154160 }
155161
156162
157163 func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
158164 then throw(err_)
159165 else true
160166
161167
162168 func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
163169 then true
164170 else (size(val_) > 16))
165171 then throw(err_)
166172 else true
167173
168174
169175 func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
170176 then throw(err_)
171177 else true
172178
173179
174180 func _validateDecimals (val_,err_) = if (if ((0 > val_))
175181 then true
176182 else (val_ > 8))
177183 then throw(err_)
178184 else true
179185
180186
181187 func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
182188 case a: ByteVector =>
183189 if ((assetId_ != toBase58String(a)))
184190 then throw((err_ + ": asset"))
185191 else if ((requiredAmount_ > payment_.amount))
186192 then throw((err_ + ": amount"))
187193 else true
188194 case _ =>
189195 throw((err_ + ": asset"))
190196 }
191197
192198
193199 func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
194200 then throw(err_)
195201 else true
196202
197203
198204 func _assetToStr (asset_) = match asset_ {
199205 case a: ByteVector =>
200206 toBase58String(a)
201207 case _ =>
202208 WAVES
203209 }
204210
205211
206212 func _strToAsset (asset_) = if (if ((asset_ == WAVES))
207213 then true
208214 else (asset_ == ""))
209215 then unit
210216 else fromBase58String(asset_)
211217
212218
213219 func _loadPause () = match getBoolean(KEY_PAUSED) {
214220 case a: Boolean =>
215221 a
216222 case _ =>
217223 false
218224 }
219225
220226
221227 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
222228
223229
224230 func _loadPauser () = match getString(KEY_PAUSER) {
225231 case a: String =>
226232 addressFromStringValue(a)
227233 case _ =>
228234 Address(base58'')
229235 }
230236
231237
232238 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
233239
234240
235241 func _loadMultisig () = match getString(KEY_MULTISIG) {
236242 case a: String =>
237243 addressFromStringValue(a)
238244 case _ =>
239245 Address(base58'')
240246 }
241247
242248
243249 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
244250
245251
246252 func _loadStorage () = match getString(KEY_STORAGE) {
247253 case a: String =>
248254 let struct = split(a, SEP)
249255 $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]))
250256 case _ =>
251257 $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
252258 }
253259
254260
255261 func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
256262 then "1"
257263 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))]
258264
259265
260266 func _loadAssets () = match getString(KEY_ASSETS) {
261267 case a: String =>
262268 if ((size(a) > 0))
263269 then split_51C(a, SEP)
264270 else nil
265271 case _ =>
266272 nil
267273 }
268274
269275
270276 func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
271277
272278
273279 func _loadAssetBalances () = {
274280 func foldFunc (acc,elem) = {
275281 let balance = parseIntValue(elem)
276282 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
277283 }
278284
279285 match getString(KEY_ASSET_BALANCES) {
280286 case a: String =>
281287 if ((size(a) > 0))
282288 then {
283289 let $l = split_51C(a, SEP)
284290 let $s = size($l)
285291 let $acc0 = $Tuple2(nil, 0)
286292 func $f0_1 ($a,$i) = if (($i >= $s))
287293 then $a
288294 else foldFunc($a, $l[$i])
289295
290296 func $f0_2 ($a,$i) = if (($i >= $s))
291297 then $a
292298 else throw("List size exceeds 10")
293299
294300 $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)
295301 }
296302 else $Tuple2(ZERO_INT_LIST_10, 0)
297303 case _ =>
298304 $Tuple2(ZERO_INT_LIST_10, 0)
299305 }
300306 }
301307
302308
303309 func _saveAssetBalances (balances_) = {
304310 func foldFunc (acc,elem) = (acc :+ toString(elem))
305311
306312 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
307313 let $l = balances_
308314 let $s = size($l)
309315 let $acc0 = nil
310316 func $f0_1 ($a,$i) = if (($i >= $s))
311317 then $a
312318 else foldFunc($a, $l[$i])
313319
314320 func $f0_2 ($a,$i) = if (($i >= $s))
315321 then $a
316322 else throw("List size exceeds 10")
317323
318324 $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)
319325 }, SEP))]
320326 }
321327
322328
323329 func _loadAssetWeights () = {
324330 func foldFunc (acc,elem) = {
325331 let weight = parseIntValue(elem)
326332 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
327333 }
328334
329335 match getString(KEY_ASSET_WEIGHTS) {
330336 case a: String =>
331337 if ((size(a) > 0))
332338 then {
333339 let $l = split_51C(a, SEP)
334340 let $s = size($l)
335341 let $acc0 = $Tuple2(nil, 0)
336342 func $f0_1 ($a,$i) = if (($i >= $s))
337343 then $a
338344 else foldFunc($a, $l[$i])
339345
340346 func $f0_2 ($a,$i) = if (($i >= $s))
341347 then $a
342348 else throw("List size exceeds 10")
343349
344350 $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)
345351 }
346352 else $Tuple2(ZERO_INT_LIST_10, 0)
347353 case _ =>
348354 $Tuple2(ZERO_INT_LIST_10, 0)
349355 }
350356 }
351357
352358
353359 func _saveAssetWeights (weights_) = {
354360 func foldFunc (acc,elem) = (acc :+ toString(elem))
355361
356362 [StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
357363 let $l = weights_
358364 let $s = size($l)
359365 let $acc0 = nil
360366 func $f0_1 ($a,$i) = if (($i >= $s))
361367 then $a
362368 else foldFunc($a, $l[$i])
363369
364370 func $f0_2 ($a,$i) = if (($i >= $s))
365371 then $a
366372 else throw("List size exceeds 10")
367373
368374 $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)
369375 }, SEP))]
370376 }
371377
372378
373379 func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
374380 case a: Int =>
375381 a
376382 case _ =>
377383 0
378384 }
379385
380386
381387 func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
382388
383389
384390 func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
385391 case a: Int =>
386392 a
387393 case _ =>
388394 0
389395 }
390396
391397
392398 func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
393399
394400
395401 func _loadPrecision () = match getInteger(KEY_PRECISION) {
396402 case a: Int =>
397403 a
398404 case _ =>
399405 0
400406 }
401407
402408
403409 func _savePrecision (val_) = [IntegerEntry(KEY_PRECISION, val_)]
404410
405411
406412 func _loadSigmaFeePerLp () = {
407413 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
408414
409415 match getString(KEY_SIGMA_FEE_PER_LP) {
410416 case a: String =>
411417 if ((size(a) > 0))
412418 then {
413419 let $l = split_51C(a, SEP)
414420 let $s = size($l)
415421 let $acc0 = nil
416422 func $f0_1 ($a,$i) = if (($i >= $s))
417423 then $a
418424 else foldFunc($a, $l[$i])
419425
420426 func $f0_2 ($a,$i) = if (($i >= $s))
421427 then $a
422428 else throw("List size exceeds 11")
423429
424430 $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)
425431 }
426432 else ZERO_BIGINT_LIST_11
427433 case _ =>
428434 ZERO_BIGINT_LIST_11
429435 }
430436 }
431437
432438
433439 func _saveSigmaFeePerLp (val_) = {
434440 func foldFunc (acc,elem) = (acc :+ toString(elem))
435441
436442 [StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
437443 let $l = val_
438444 let $s = size($l)
439445 let $acc0 = nil
440446 func $f0_1 ($a,$i) = if (($i >= $s))
441447 then $a
442448 else foldFunc($a, $l[$i])
443449
444450 func $f0_2 ($a,$i) = if (($i >= $s))
445451 then $a
446452 else throw("List size exceeds 11")
447453
448454 $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)
449455 }, SEP))]
450456 }
451457
452458
453459 func _loadUserSigmaFeePerLp (user_) = {
454460 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
455461
456462 match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
457463 case a: String =>
458464 if ((size(a) > 0))
459465 then {
460466 let $l = split_51C(a, SEP)
461467 let $s = size($l)
462468 let $acc0 = nil
463469 func $f0_1 ($a,$i) = if (($i >= $s))
464470 then $a
465471 else foldFunc($a, $l[$i])
466472
467473 func $f0_2 ($a,$i) = if (($i >= $s))
468474 then $a
469475 else throw("List size exceeds 11")
470476
471477 $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)
472478 }
473479 else ZERO_BIGINT_LIST_11
474480 case _ =>
475481 ZERO_BIGINT_LIST_11
476482 }
477483 }
478484
479485
480486 func _saveUserSigmaFeePerLp (user_,val_) = {
481487 func foldFunc (acc,elem) = (acc :+ toString(elem))
482488
483489 [StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
484490 let $l = val_
485491 let $s = size($l)
486492 let $acc0 = nil
487493 func $f0_1 ($a,$i) = if (($i >= $s))
488494 then $a
489495 else foldFunc($a, $l[$i])
490496
491497 func $f0_2 ($a,$i) = if (($i >= $s))
492498 then $a
493499 else throw("List size exceeds 11")
494500
495501 $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)
496502 }, SEP))]
497503 }
498504
499505
500506 func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
501507 case a: Int =>
502508 a
503509 case _ =>
504510 0
505511 }
506512
507513
508514 func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
509515
510516
511517 func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
512518 case a: Int =>
513519 a
514520 case _ =>
515521 0
516522 }
517523
518524
519525 func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
520526
521527
522528 func _loadUserProfits (user_) = {
523529 func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
524530
525531 match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
526532 case a: String =>
527533 if ((size(a) > 0))
528534 then {
529535 let $l = split_51C(a, SEP)
530536 let $s = size($l)
531537 let $acc0 = nil
532538 func $f0_1 ($a,$i) = if (($i >= $s))
533539 then $a
534540 else foldFunc($a, $l[$i])
535541
536542 func $f0_2 ($a,$i) = if (($i >= $s))
537543 then $a
538544 else throw("List size exceeds 11")
539545
540546 $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)
541547 }
542548 else ZERO_INT_LIST_11
543549 case _ =>
544550 ZERO_INT_LIST_11
545551 }
546552 }
547553
548554
549555 func _saveUserProfits (user_,val_) = {
550556 func foldFunc (acc,elem) = (acc :+ toString(elem))
551557
552558 [StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
553559 let $l = val_
554560 let $s = size($l)
555561 let $acc0 = nil
556562 func $f0_1 ($a,$i) = if (($i >= $s))
557563 then $a
558564 else foldFunc($a, $l[$i])
559565
560566 func $f0_2 ($a,$i) = if (($i >= $s))
561567 then $a
562568 else throw("List size exceeds 11")
563569
564570 $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)
565571 }, SEP))]
566572 }
567573
568574
575+func _loadWatchdog () = match getString(KEY_WATCHDOG) {
576+ case a: String =>
577+ addressFromStringValue(a)
578+ case _ =>
579+ Address(base58'')
580+}
581+
582+
583+func _saveWatchdog (watchdog_) = [StringEntry(KEY_WATCHDOG, toString(watchdog_))]
584+
585+
586+func _loadWatchdogOffset () = match getInteger(KEY_WATCHDOG_OFFSET) {
587+ case a: Int =>
588+ a
589+ case _ =>
590+ 0
591+}
592+
593+
594+func _saveWatchdogOffset (offset_) = [IntegerEntry(KEY_WATCHDOG_OFFSET, offset_)]
595+
596+
569597 func _onlyThisContract (caller_) = if ((caller_ != this))
570598 then throw("_onlyThisContract: revert")
571599 else true
572600
573601
574602 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
575603 then throw("_whenMultisigSet: revert")
576604 else true
577605
578606
579607 func _whenNotInitialized () = {
580608 let storage = _loadStorage()
581609 if ((storage._1 != base58''))
582610 then throw("_whenNotInitialized: revert")
583611 else true
584612 }
585613
586614
587615 func _whenInitialized () = {
588616 let storage = _loadStorage()
589617 if ((storage._1 == base58''))
590618 then throw("_whenInitialized: revert")
591619 else true
592620 }
593621
594622
595623 func _whenNotPaused () = if (_loadPause())
596624 then throw("_whenNotPaused: revert")
597625 else true
598626
599627
600628 func _whenPaused () = if (!(_loadPause()))
601629 then throw("_whenPaused: revert")
602630 else true
603631
604632
605633 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
606634 then throw("_onlyPauser: revert")
607635 else true
636+
637+
638+func _checkWatchdog () = {
639+ let wd = match getInteger(_loadWatchdog(), KEY_WATCHDOG_HEIGHT) {
640+ case a: Int =>
641+ (a + _loadWatchdogOffset())
642+ case _ =>
643+ 0
644+ }
645+ if ((height > wd))
646+ then throw("_checkWatchdog: revert")
647+ else true
648+ }
608649
609650
610651 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
611652 case a: Asset =>
612653 a.decimals
613654 case _ =>
614655 throw(("_getDecimals: no asset=" + assetId_))
615656 }
616657
617658
618659 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
619660 then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
620661 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
621662
622663
623664 func _prepareAssetBalances (assets_) = {
624665 func foldFunc (acc,elem) = (acc :+ 0)
625666
626667 let $l = assets_
627668 let $s = size($l)
628669 let $acc0 = nil
629670 func $f0_1 ($a,$i) = if (($i >= $s))
630671 then $a
631672 else foldFunc($a, $l[$i])
632673
633674 func $f0_2 ($a,$i) = if (($i >= $s))
634675 then $a
635676 else throw("List size exceeds 10")
636677
637678 $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)
638679 }
639680
640681
641682 func _prepareAssetWeights (assetWeights_) = {
642683 func foldFunc (acc,elem) = {
643684 let weight = parseIntValue(elem)
644685 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
645686 }
646687
647688 let $l = assetWeights_
648689 let $s = size($l)
649690 let $acc0 = $Tuple2(nil, 0)
650691 func $f0_1 ($a,$i) = if (($i >= $s))
651692 then $a
652693 else foldFunc($a, $l[$i])
653694
654695 func $f0_2 ($a,$i) = if (($i >= $s))
655696 then $a
656697 else throw("List size exceeds 10")
657698
658699 $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)
659700 }
660701
661702
662703 func _getAssetBalances (assets_,decimals_) = {
663704 func foldFunc (acc,elem) = {
664705 let assetDecimals = _getDecimals(elem)
665706 let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
666707 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
667708 }
668709
669710 let $l = assets_
670711 let $s = size($l)
671712 let $acc0 = $Tuple2(nil, 0)
672713 func $f0_1 ($a,$i) = if (($i >= $s))
673714 then $a
674715 else foldFunc($a, $l[$i])
675716
676717 func $f0_2 ($a,$i) = if (($i >= $s))
677718 then $a
678719 else throw("List size exceeds 10")
679720
680721 $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)
681722 }
682723
683724
684725 func _listIntToString (assets_) = {
685726 func foldFunc (acc,elem) = (acc :+ toString(elem))
686727
687728 makeString({
688729 let $l = assets_
689730 let $s = size($l)
690731 let $acc0 = nil
691732 func $f0_1 ($a,$i) = if (($i >= $s))
692733 then $a
693734 else foldFunc($a, $l[$i])
694735
695736 func $f0_2 ($a,$i) = if (($i >= $s))
696737 then $a
697738 else throw("List size exceeds 11")
698739
699740 $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)
700741 }, SEP)
701742 }
702743
703744
704745 func _listBigIntToString (assets_) = {
705746 func foldFunc (acc,elem) = (acc :+ toString(elem))
706747
707748 makeString({
708749 let $l = assets_
709750 let $s = size($l)
710751 let $acc0 = nil
711752 func $f0_1 ($a,$i) = if (($i >= $s))
712753 then $a
713754 else foldFunc($a, $l[$i])
714755
715756 func $f0_2 ($a,$i) = if (($i >= $s))
716757 then $a
717758 else throw("List size exceeds 11")
718759
719760 $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)
720761 }, SEP)
721762 }
722763
723764
724765 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
725766 func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
726767
727768 let $l = weights_
728769 let $s = size($l)
729770 let $acc0 = nil
730771 func $f0_1 ($a,$i) = if (($i >= $s))
731772 then $a
732773 else foldFunc($a, $l[$i])
733774
734775 func $f0_2 ($a,$i) = if (($i >= $s))
735776 then $a
736777 else throw("List size exceeds 10")
737778
738779 $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)
739780 }
740781
741782
742783 func _incrementBalancesByAmounts (balances_,amounts_) = {
743784 func foldFunc (acc,elem) = {
744785 let index = acc._1
745786 let amount = amounts_[index]
746787 let newBalance = (elem + amount)
747788 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
748789 }
749790
750791 let result = {
751792 let $l = balances_
752793 let $s = size($l)
753794 let $acc0 = $Tuple3(0, nil, 0)
754795 func $f0_1 ($a,$i) = if (($i >= $s))
755796 then $a
756797 else foldFunc($a, $l[$i])
757798
758799 func $f0_2 ($a,$i) = if (($i >= $s))
759800 then $a
760801 else throw("List size exceeds 10")
761802
762803 $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)
763804 }
764805 $Tuple2(result._2, result._3)
765806 }
766807
767808
768809 func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
769810 func foldFunc (acc,elem) = {
770811 let index = acc._1
771812 let payment = payments_[index]
772813 let paymentAssetStr = _assetToStr(payment.assetId)
773814 let err = if ((paymentAssetStr != assets_[index]))
774815 then throw(((err_ + ": index=") + toString(index)))
775816 else unit
776817 if ((err == err))
777818 then {
778819 let assetDecimals = _getDecimals(paymentAssetStr)
779820 let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
780821 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
781822 }
782823 else throw("Strict value is not equal to itself.")
783824 }
784825
785826 let result = {
786827 let $l = balances_
787828 let $s = size($l)
788829 let $acc0 = $Tuple3(0, nil, 0)
789830 func $f0_1 ($a,$i) = if (($i >= $s))
790831 then $a
791832 else foldFunc($a, $l[$i])
792833
793834 func $f0_2 ($a,$i) = if (($i >= $s))
794835 then $a
795836 else throw("List size exceeds 10")
796837
797838 $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)
798839 }
799840 $Tuple2(result._2, result._3)
800841 }
801842
802843
803844 func _incrementBalanceByIndex (balances_,index_,amount_) = {
804845 func foldFunc (acc,elem) = {
805846 let index = acc._1
806847 if ((index == index_))
807848 then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
808849 else $Tuple2((index + 1), (acc._2 :+ elem))
809850 }
810851
811852 let result = {
812853 let $l = balances_
813854 let $s = size($l)
814855 let $acc0 = $Tuple2(0, nil)
815856 func $f0_1 ($a,$i) = if (($i >= $s))
816857 then $a
817858 else foldFunc($a, $l[$i])
818859
819860 func $f0_2 ($a,$i) = if (($i >= $s))
820861 then $a
821862 else throw("List size exceeds 10")
822863
823864 $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)
824865 }
825866 result._2
826867 }
827868
828869
829870 func _decrementBalanceByIndex (balances_,index_,amount_) = {
830871 func foldFunc (acc,elem) = {
831872 let index = acc._1
832873 if ((index == index_))
833874 then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
834875 else $Tuple2((index + 1), (acc._2 :+ elem))
835876 }
836877
837878 let result = {
838879 let $l = balances_
839880 let $s = size($l)
840881 let $acc0 = $Tuple2(0, nil)
841882 func $f0_1 ($a,$i) = if (($i >= $s))
842883 then $a
843884 else foldFunc($a, $l[$i])
844885
845886 func $f0_2 ($a,$i) = if (($i >= $s))
846887 then $a
847888 else throw("List size exceeds 10")
848889
849890 $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)
850891 }
851892 result._2
852893 }
853894
854895
855896 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
856897 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
857898 func foldFunc (acc,elem) = {
858899 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
859900 let deltaBalance = (elem - newBalance)
860901 $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
861902 }
862903
863904 let $l = balances_
864905 let $s = size($l)
865906 let $acc0 = $Tuple3(nil, 0, nil)
866907 func $f0_1 ($a,$i) = if (($i >= $s))
867908 then $a
868909 else foldFunc($a, $l[$i])
869910
870911 func $f0_2 ($a,$i) = if (($i >= $s))
871912 then $a
872913 else throw("List size exceeds 10")
873914
874915 $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)
875916 }
876917
877918
878919 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
879920 func foldFunc (acc,elem) = {
880921 let index = acc._1
881922 $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
882923 }
883924
884925 let result = {
885926 let $l = assets_
886927 let $s = size($l)
887928 let $acc0 = $Tuple2(0, nil)
888929 func $f0_1 ($a,$i) = if (($i >= $s))
889930 then $a
890931 else foldFunc($a, $l[$i])
891932
892933 func $f0_2 ($a,$i) = if (($i >= $s))
893934 then $a
894935 else throw("List size exceeds 10")
895936
896937 $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)
897938 }
898939 result._2
899940 }
900941
901942
902943 func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
903944 then {
904945 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
905946 if ((threshold > balance_))
906947 then {
907948 let maxDeviation = (threshold - balance_)
908949 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
909950 if ((feeRate > feeMaxRate_))
910951 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
911952 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
912953 }
913954 else 0
914955 }
915956 else {
916957 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
917958 if ((balance_ > threshold))
918959 then {
919960 let maxDeviation = (balance_ - threshold)
920961 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
921962 if ((feeRate > feeMaxRate_))
922963 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
923964 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
924965 }
925966 else 0
926967 }
927968
928969
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- }
970+func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = 0
952971
953972
954973 func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
955974 then true
956975 else (lpTotalSupply_ == 0))
957976 then true
958977 else {
959978 let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
960979 let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
961980 let diff = (newAssetsRate - prevAssetsRate)
962981 if (if ((0 >= diff))
963982 then ((-1 * _loadPrecision()) > diff)
964983 else false)
965984 then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
966985 else true
967986 }
968987
969988
970989 func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
971990 let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
972991 let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
973992 let diff = (newUtil - prevUtil)
974993 if (if ((0 >= diff))
975994 then ((-1 * _loadPrecision()) > diff)
976995 else false)
977996 then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
978997 else true
979998 }
980999
9811000
9821001 func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
9831002 let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
9841003 let maxAllocationAmp = if ((balance_ > equilibrium))
9851004 then (MAX_AMPLIFIER + maxAllocAmp_)
9861005 else (MAX_AMPLIFIER - maxAllocAmp_)
9871006 let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
9881007 let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
9891008 if ((balance_ > equilibrium))
9901009 then if ((balance_ > maxAllocation))
9911010 then if ((prevMaxAllocation > prevBalance_))
9921011 then throw("_validateAssetAllocation: new up")
9931012 else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
9941013 then throw("_validateAssetAllocation: still up")
9951014 else true
9961015 else true
9971016 else if ((maxAllocation > balance_))
9981017 then if ((prevBalance_ > prevMaxAllocation))
9991018 then throw("_validateAssetAllocation: new down")
10001019 else if (((maxAllocation - balance_) > (prevMaxAllocation - prevBalance_)))
10011020 then throw("_validateAssetAllocation: still down")
10021021 else true
10031022 else true
10041023 }
10051024
10061025
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- }
1026+func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = true
10311027
10321028
10331029 func _checkpoint (user_) = {
10341030 let userLp = _loadUserLp(user_)
10351031 let userProfits = _loadUserProfits(user_)
10361032 let sigmaFeePerLp = _loadSigmaFeePerLp()
10371033 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
10381034 func foldFunc (acc,elem) = {
10391035 let index = acc._1
10401036 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
10411037 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10421038 }
10431039
1044- let $t02460524678 = {
1040+ let $t02555825631 = {
10451041 let $l = ZERO_INT_LIST_11
10461042 let $s = size($l)
10471043 let $acc0 = $Tuple2(0, nil)
10481044 func $f0_1 ($a,$i) = if (($i >= $s))
10491045 then $a
10501046 else foldFunc($a, $l[$i])
10511047
10521048 func $f0_2 ($a,$i) = if (($i >= $s))
10531049 then $a
10541050 else throw("List size exceeds 11")
10551051
10561052 $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)
10571053 }
1058- let idx = $t02460524678._1
1059- let profitsUpdated = $t02460524678._2
1054+ let idx = $t02555825631._1
1055+ let profitsUpdated = $t02555825631._2
10601056 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10611057 }
10621058
10631059
10641060 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
10651061 func foldFunc (acc,elem) = {
10661062 let index = acc._1
10671063 let sigmaFeePerLpUpdated = if ((index_ == index))
10681064 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
10691065 else sigmaFeePerLp_[index]
10701066 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10711067 }
10721068
1073- let $t02532825407 = {
1069+ let $t02628126360 = {
10741070 let $l = ZERO_INT_LIST_11
10751071 let $s = size($l)
10761072 let $acc0 = $Tuple2(0, nil)
10771073 func $f0_1 ($a,$i) = if (($i >= $s))
10781074 then $a
10791075 else foldFunc($a, $l[$i])
10801076
10811077 func $f0_2 ($a,$i) = if (($i >= $s))
10821078 then $a
10831079 else throw("List size exceeds 11")
10841080
10851081 $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)
10861082 }
1087- let idx = $t02532825407._1
1088- let sigmaFeePerLpUpdated = $t02532825407._2
1083+ let idx = $t02628126360._1
1084+ let sigmaFeePerLpUpdated = $t02628126360._2
10891085 sigmaFeePerLpUpdated
10901086 }
10911087
10921088
10931089 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10941090 let sigmaFeePerLp = _loadSigmaFeePerLp()
10951091 let totalLp = _loadTotalLp()
1096- let $t02562825903 = if ((totalLp == 0))
1092+ let $t02658126856 = if ((totalLp == 0))
10971093 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10981094 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1099- let lpFee = $t02562825903._1
1100- let protocolFee = $t02562825903._2
1095+ let lpFee = $t02658126856._1
1096+ let protocolFee = $t02658126856._2
11011097 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11021098 then sigmaFeePerLp
11031099 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11041100 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
11051101 }
11061102
11071103
11081104 func _depositAll (amount_) = {
11091105 let storage = _loadStorage()
11101106 let lpTotalSupply = storage._3
11111107 let weightAmplifier = storage._7
11121108 let slippageRate = storage._8
11131109 let feeMaxRate = storage._9
11141110 let assets = _loadAssets()
1115- let $t02641226465 = _loadAssetWeights()
1116- let assetWeights = $t02641226465._1
1117- let sigmaWeight = $t02641226465._2
1118- let $t02647026538 = _loadAssetBalances()
1119- let prevAssetBalances = $t02647026538._1
1120- let prevAssetTotalSupply = $t02647026538._2
1121- let $t02654427774 = if ((prevAssetTotalSupply == 0))
1111+ let $t02736527418 = _loadAssetWeights()
1112+ let assetWeights = $t02736527418._1
1113+ let sigmaWeight = $t02736527418._2
1114+ let $t02742327491 = _loadAssetBalances()
1115+ let prevAssetBalances = $t02742327491._1
1116+ let prevAssetTotalSupply = $t02742327491._2
1117+ let $t02749728727 = if ((prevAssetTotalSupply == 0))
11221118 then {
11231119 func foldFunc (acc,elem) = {
11241120 let index = acc._1
11251121 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
11261122 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11271123 }
11281124
1129- let $t02698627060 = {
1125+ let $t02793928013 = {
11301126 let $l = assets
11311127 let $s = size($l)
11321128 let $acc0 = $Tuple2(0, nil)
11331129 func $f0_1 ($a,$i) = if (($i >= $s))
11341130 then $a
11351131 else foldFunc($a, $l[$i])
11361132
11371133 func $f0_2 ($a,$i) = if (($i >= $s))
11381134 then $a
11391135 else throw("List size exceeds 10")
11401136
11411137 $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)
11421138 }
1143- let idx = $t02698627060._1
1144- let requiredAmountsNormalized = $t02698627060._2
1139+ let idx = $t02793928013._1
1140+ let requiredAmountsNormalized = $t02793928013._2
11451141 $Tuple2(amount_, requiredAmountsNormalized)
11461142 }
11471143 else {
11481144 let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
11491145 func foldFunc1 (acc,elem) = {
11501146 let index = acc._1
11511147 let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
11521148 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11531149 }
11541150
1155- let $t02760327678 = {
1151+ let $t02855628631 = {
11561152 let $l = assets
11571153 let $s = size($l)
11581154 let $acc0 = $Tuple2(0, nil)
11591155 func $f0_1 ($a,$i) = if (($i >= $s))
11601156 then $a
11611157 else foldFunc1($a, $l[$i])
11621158
11631159 func $f0_2 ($a,$i) = if (($i >= $s))
11641160 then $a
11651161 else throw("List size exceeds 10")
11661162
11671163 $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)
11681164 }
1169- let idx = $t02760327678._1
1170- let requiredAmountsNormalized = $t02760327678._2
1165+ let idx = $t02855628631._1
1166+ let requiredAmountsNormalized = $t02855628631._2
11711167 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11721168 }
1173- let lpTokensToMint = $t02654427774._1
1174- let requiredAmountsNormalized = $t02654427774._2
1175- let $t02778027893 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1176- let assetBalances = $t02778027893._1
1177- let assetTotalSupply = $t02778027893._2
1169+ let lpTokensToMint = $t02749728727._1
1170+ let requiredAmountsNormalized = $t02749728727._2
1171+ let $t02873328846 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1172+ let assetBalances = $t02873328846._1
1173+ let assetTotalSupply = $t02873328846._2
11781174 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11791175 if ((err2 == err2))
11801176 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11811177 else throw("Strict value is not equal to itself.")
11821178 }
11831179
11841180
11851181 func _deposit (assetId_,amount_) = {
11861182 let storage = _loadStorage()
11871183 let lpTotalSupply = storage._3
11881184 let lpFeeRate = storage._4
11891185 let protocolFeeRate = storage._5
11901186 let maxAllocAmplifier = storage._6
11911187 let weightAmplifier = storage._7
11921188 let slippageRate = storage._8
11931189 let feeMaxRate = storage._9
11941190 let assets = _loadAssets()
1195- let $t02865628709 = _loadAssetWeights()
1196- let assetWeights = $t02865628709._1
1197- let sigmaWeight = $t02865628709._2
1198- let $t02871428828 = _loadAssetBalances()
1199- let prevAssetBalances = $t02871428828._1
1200- let prevAssetTotalSupply = $t02871428828._2
1191+ let $t02960929662 = _loadAssetWeights()
1192+ let assetWeights = $t02960929662._1
1193+ let sigmaWeight = $t02960929662._2
1194+ let $t02966729781 = _loadAssetBalances()
1195+ let prevAssetBalances = $t02966729781._1
1196+ let prevAssetTotalSupply = $t02966729781._2
12011197 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12021198 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12031199 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12041200 if ((err2 == err2))
12051201 then {
12061202 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12071203 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12081204 let lpTokensToMint = if ((lpTotalSupply == 0))
12091205 then throw("_deposit: empty pool")
12101206 else {
12111207 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12121208 let feeDiff = (fee - prevFee)
12131209 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
12141210 let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
12151211 let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12161212 if ((err3 == err3))
12171213 then lpTokensToMintInner
12181214 else throw("Strict value is not equal to itself.")
12191215 }
1220- let $t03049030621 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1221- let lpFee = $t03049030621._1
1222- let protocolFee = $t03049030621._2
1223- let sigmaFeePerLpUpdated = $t03049030621._3
1216+ let $t03144331574 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1217+ let lpFee = $t03144331574._1
1218+ let protocolFee = $t03144331574._2
1219+ let sigmaFeePerLpUpdated = $t03144331574._3
12241220 $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12251221 }
12261222 else throw("Strict value is not equal to itself.")
12271223 }
12281224
12291225
12301226 func _withdrawAll (amount_) = {
12311227 let storage = _loadStorage()
12321228 let lpTotalSupply = storage._3
12331229 let maxAllocAmplifier = storage._6
12341230 let weightAmplifier = storage._7
12351231 let slippageRate = storage._8
12361232 let feeMaxRate = storage._9
1237- let $t03095531023 = _loadAssetBalances()
1238- let prevAssetBalances = $t03095531023._1
1239- let prevAssetTotalSupply = $t03095531023._2
1240- let $t03102831081 = _loadAssetWeights()
1241- let assetWeights = $t03102831081._1
1242- let sigmaWeight = $t03102831081._2
1233+ let $t03190831976 = _loadAssetBalances()
1234+ let prevAssetBalances = $t03190831976._1
1235+ let prevAssetTotalSupply = $t03190831976._2
1236+ let $t03198132034 = _loadAssetWeights()
1237+ let assetWeights = $t03198132034._1
1238+ let sigmaWeight = $t03198132034._2
12431239 let lpTokensToBurn = amount_
12441240 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12451241 if ((err == err))
12461242 then {
1247- let $t03122331356 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1248- let assetBalances = $t03122331356._1
1249- let assetTotalSupply = $t03122331356._2
1250- let balancesToPay = $t03122331356._3
1243+ let $t03217632309 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1244+ let assetBalances = $t03217632309._1
1245+ let assetTotalSupply = $t03217632309._2
1246+ let balancesToPay = $t03217632309._3
12511247 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12521248 if ((err2 == err2))
12531249 then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12541250 else throw("Strict value is not equal to itself.")
12551251 }
12561252 else throw("Strict value is not equal to itself.")
12571253 }
12581254
12591255
12601256 func _withdraw (assetId_,lpAmount_) = {
12611257 let storage = _loadStorage()
12621258 let lpTotalSupply = storage._3
12631259 let lpFeeRate = storage._4
12641260 let protocolFeeRate = storage._5
12651261 let maxAllocAmplifier = storage._6
12661262 let weightAmplifier = storage._7
12671263 let slippageRate = storage._8
12681264 let feeMaxRate = storage._9
12691265 let precision = _loadPrecision()
12701266 let assets = _loadAssets()
1271- let $t03214832216 = _loadAssetBalances()
1272- let prevAssetBalances = $t03214832216._1
1273- let prevAssetTotalSupply = $t03214832216._2
1274- let $t03222132274 = _loadAssetWeights()
1275- let assetWeights = $t03222132274._1
1276- let sigmaWeight = $t03222132274._2
1267+ let $t03310133169 = _loadAssetBalances()
1268+ let prevAssetBalances = $t03310133169._1
1269+ let prevAssetTotalSupply = $t03310133169._2
1270+ let $t03317433227 = _loadAssetWeights()
1271+ let assetWeights = $t03317433227._1
1272+ let sigmaWeight = $t03317433227._2
12771273 let targetAssetIndex = value(indexOf(assets, assetId_))
12781274 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12791275 let prevUtilValue = (prevAssetTotalSupply - prevFee)
12801276 let k = fraction(toBigInt((lpTotalSupply - lpAmount_)), PERCENT_FACTOR, toBigInt(lpTotalSupply))
12811277 let prevUtilValueWithK = toInt(fraction(toBigInt(prevUtilValue), k, PERCENT_FACTOR))
12821278 let prevUtilValueDivLp = fraction(toBigInt(prevUtilValue), PERCENT_FACTOR, toBigInt(lpTotalSupply), CEILING)
12831279 func foldFunc (acc,elem) = if (acc._1)
12841280 then acc
12851281 else {
12861282 let startInner = acc._2
12871283 let stopInner = acc._3
12881284 let currentAmount = ((stopInner + startInner) / 2)
12891285 let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
12901286 let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
12911287 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
12921288 if (if (((utilValue - prevUtilValueWithK) > (-1 * precision)))
12931289 then (precision > (utilValue - prevUtilValueWithK))
12941290 else false)
12951291 then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
12961292 else if ((0 > (utilValue - prevUtilValueWithK)))
12971293 then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValueWithK))
12981294 else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
12991295 }
13001296
13011297 let targetAmount = {
13021298 let stop = toInt(fraction(toBigInt((lpAmount_ + prevFee)), prevUtilValueDivLp, PERCENT_FACTOR, CEILING))
1303- let $t03414034252 = {
1299+ let $t03509335205 = {
13041300 let $l = LIST_64
13051301 let $s = size($l)
13061302 let $acc0 = $Tuple5(false, 0, stop, 0, 0)
13071303 func $f0_1 ($a,$i) = if (($i >= $s))
13081304 then $a
13091305 else foldFunc($a, $l[$i])
13101306
13111307 func $f0_2 ($a,$i) = if (($i >= $s))
13121308 then $a
13131309 else throw("List size exceeds 64")
13141310
13151311 $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)
13161312 }
1317- let success = $t03414034252._1
1318- let startOut = $t03414034252._2
1319- let stopOut = $t03414034252._3
1320- let targetAmountOut = $t03414034252._4
1321- let diffOut = $t03414034252._5
1313+ let success = $t03509335205._1
1314+ let startOut = $t03509335205._2
1315+ let stopOut = $t03509335205._3
1316+ let targetAmountOut = $t03509335205._4
1317+ let diffOut = $t03509335205._5
13221318 if (!(success))
13231319 then throw(((("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
13241320 else targetAmountOut
13251321 }
13261322 let finalAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
13271323 let finalAssetTotalSupply = (prevAssetTotalSupply - targetAmount)
13281324 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
13291325 then _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, lpTotalSupply, (lpTotalSupply - lpAmount_), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13301326 else false
13311327 if ((err1 == err1))
13321328 then {
1333- let $t03524435392 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1334- let lpFee = $t03524435392._1
1335- let protocolFee = $t03524435392._2
1336- let sigmaFeePerLpUpdated = $t03524435392._3
1329+ let $t03619736345 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1330+ let lpFee = $t03619736345._1
1331+ let protocolFee = $t03619736345._2
1332+ let sigmaFeePerLpUpdated = $t03619736345._3
13371333 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13381334 }
13391335 else throw("Strict value is not equal to itself.")
13401336 }
13411337
13421338
13431339 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
13441340 let storage = _loadStorage()
13451341 let lpAssetId = storage._1
13461342 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13471343 let lpTotalSupply = storage._3
13481344 let lpFeeRate = storage._4
13491345 let protocolFeeRate = storage._5
13501346 let maxAllocAmplifier = storage._6
13511347 let weightAmplifier = storage._7
13521348 let slippageRate = storage._8
13531349 let feeMaxRate = storage._9
13541350 let precision = _loadPrecision()
1355- let $t03597436042 = _loadAssetBalances()
1356- let prevAssetBalances = $t03597436042._1
1357- let prevAssetTotalSupply = $t03597436042._2
1358- let $t03604736100 = _loadAssetWeights()
1359- let assetWeights = $t03604736100._1
1360- let sigmaWeight = $t03604736100._2
1351+ let $t03692736995 = _loadAssetBalances()
1352+ let prevAssetBalances = $t03692736995._1
1353+ let prevAssetTotalSupply = $t03692736995._2
1354+ let $t03700037053 = _loadAssetWeights()
1355+ let assetWeights = $t03700037053._1
1356+ let sigmaWeight = $t03700037053._2
13611357 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13621358 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13631359 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13641360 let prevUtilValue = (prevAssetTotalSupply - prevFee)
13651361 func foldFunc (acc,elem) = if (acc._1)
13661362 then acc
13671363 else {
13681364 let startInner = acc._2
13691365 let stopInner = acc._3
13701366 let currentAmount = ((stopInner + startInner) / 2)
13711367 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
13721368 let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
13731369 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
13741370 if (if (((utilValue - prevUtilValue) > (-1 * precision)))
13751371 then (precision > (utilValue - prevUtilValue))
13761372 else false)
13771373 then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValue))
13781374 else if ((0 > (utilValue - prevUtilValue)))
13791375 then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValue))
13801376 else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValue))
13811377 }
13821378
13831379 let targetAmount = {
13841380 let targetAmount = sourceAmount_
13851381 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
13861382 let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
13871383 let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13881384 let feeDiff = (fee - prevFee)
13891385 if ((feeDiff == 0))
13901386 then targetAmount
13911387 else {
1392- let $t03807338204 = {
1388+ let $t03902639157 = {
13931389 let $l = LIST_64
13941390 let $s = size($l)
13951391 let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, 0)
13961392 func $f0_1 ($a,$i) = if (($i >= $s))
13971393 then $a
13981394 else foldFunc($a, $l[$i])
13991395
14001396 func $f0_2 ($a,$i) = if (($i >= $s))
14011397 then $a
14021398 else throw("List size exceeds 64")
14031399
14041400 $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)
14051401 }
1406- let success = $t03807338204._1
1407- let startOut = $t03807338204._2
1408- let stopOut = $t03807338204._3
1409- let targetAmountOut = $t03807338204._4
1410- let diffOut = $t03807338204._5
1402+ let success = $t03902639157._1
1403+ let startOut = $t03902639157._2
1404+ let stopOut = $t03902639157._3
1405+ let targetAmountOut = $t03902639157._4
1406+ let diffOut = $t03902639157._5
14111407 if (!(success))
14121408 then throw(((("_swap: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
14131409 else targetAmountOut
14141410 }
14151411 }
14161412 let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
14171413 let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
14181414 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
14191415 then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
14201416 else false
14211417 if ((err1 == err1))
14221418 then {
1423- let $t03905139192 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1424- let lpFee = $t03905139192._1
1425- let protocolFee = $t03905139192._2
1426- let sigmaFeePerLpUpdated = $t03905139192._3
1419+ let $t04000440145 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1420+ let lpFee = $t04000440145._1
1421+ let protocolFee = $t04000440145._2
1422+ let sigmaFeePerLpUpdated = $t04000440145._3
14271423 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14281424 }
14291425 else throw("Strict value is not equal to itself.")
14301426 }
14311427
14321428
14331429 @Callable(i)
14341430 func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
14351431 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
14361432 then _whenNotInitialized()
14371433 else false)
14381434 then _whenMultisigSet()
14391435 else false)
14401436 then _validateAssets(assets_, "init: invalid assets")
14411437 else false)
14421438 then _validateIntList(assetWeights_, 1, MAX_WEIGHT, "init: invalid assetWeights")
14431439 else false)
14441440 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
14451441 else false)
14461442 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
14471443 else false)
14481444 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
14491445 else false)
14501446 then _validateTokenName(lpTokenName_, "init: invalid name")
14511447 else false)
14521448 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
14531449 else false)
14541450 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
14551451 else false)
14561452 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
14571453 else false)
14581454 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
14591455 else false)
14601456 then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
14611457 else false)
14621458 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
14631459 else false)
14641460 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
14651461 else false)
14661462 then _validateInt(precision_, 1, MAX_INT, "init: invalid precision")
14671463 else false)
14681464 then _validateAddress(pauser_, "init: invalid pauser")
14691465 else false
14701466 if ((err == err))
14711467 then {
1472- let $t04105541124 = _prepareAssetWeights(assetWeights_)
1473- let assetWeights = $t04105541124._1
1474- let sigmaWeight = $t04105541124._2
1468+ let $t04200842077 = _prepareAssetWeights(assetWeights_)
1469+ let assetWeights = $t04200842077._1
1470+ let sigmaWeight = $t04200842077._2
14751471 let assetBalances = _prepareAssetBalances(assets_)
14761472 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14771473 let lpAssetId = calculateAssetId(issue)
14781474 let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
14791475 $Tuple2(((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
14801476 }
14811477 else throw("Strict value is not equal to itself.")
14821478 }
14831479
14841480
14851481
14861482 @Callable(i)
14871483 func depositAll (amount_) = {
14881484 let err = if (if (_whenInitialized())
14891485 then _whenNotPaused()
14901486 else false)
14911487 then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
14921488 else false
14931489 if ((err == err))
14941490 then {
14951491 let storage = _loadStorage()
14961492 let lpAssetId = storage._1
14971493 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14981494 let assets = _loadAssets()
1499- let $t04287442959 = _depositAll(amount_)
1500- let lpTokensToMint = $t04287442959._1
1501- let requiredAmountsNormalized = $t04287442959._2
1502- let assetBalances = $t04287442959._3
1495+ let $t04382743912 = _depositAll(amount_)
1496+ let lpTokensToMint = $t04382743912._1
1497+ let requiredAmountsNormalized = $t04382743912._2
1498+ let assetBalances = $t04382743912._3
15031499 func foldFunc (acc,elem) = {
15041500 let index = acc._1
15051501 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15061502 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
15071503 let requiredAmountNormalized = requiredAmountsNormalized[index]
15081504 let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
15091505 let err1 = if ((paymentAssetStr != elem))
15101506 then throw(("depositAll: invalid payment: index=" + toString(index)))
15111507 else if ((0 >= requiredAmount))
15121508 then throw("depositAll: too little amount required")
15131509 else unit
15141510 if ((err1 == err1))
15151511 then {
15161512 let change = if ((i.payments[index].amount > requiredAmount))
15171513 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
15181514 else if ((requiredAmount > i.payments[index].amount))
15191515 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
15201516 else nil
15211517 $Tuple2((index + 1), (acc._2 ++ change))
15221518 }
15231519 else throw("Strict value is not equal to itself.")
15241520 }
15251521
1526- let $t04410244164 = {
1522+ let $t04505545117 = {
15271523 let $l = assets
15281524 let $s = size($l)
15291525 let $acc0 = $Tuple2(0, nil)
15301526 func $f0_1 ($a,$i) = if (($i >= $s))
15311527 then $a
15321528 else foldFunc($a, $l[$i])
15331529
15341530 func $f0_2 ($a,$i) = if (($i >= $s))
15351531 then $a
15361532 else throw("List size exceeds 10")
15371533
15381534 $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)
15391535 }
1540- let idx = $t04410244164._1
1541- let changeActions = $t04410244164._2
1536+ let idx = $t04505545117._1
1537+ let changeActions = $t04505545117._2
15421538 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15431539 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15441540 }
15451541 else throw("Strict value is not equal to itself.")
15461542 }
15471543
15481544
15491545
15501546 @Callable(i)
15511547 func deposit (minLpAmount_) = {
15521548 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
15531549 if ((err == err))
15541550 then {
15551551 let storage = _loadStorage()
15561552 let lpAssetId = storage._1
15571553 let lpAssetIdStr = _assetToStr(lpAssetId)
15581554 let lpDecimals = _getDecimals(lpAssetIdStr)
1559- let err1 = if (if (if (if (_whenInitialized())
1555+ let err1 = if (if (if (if (if (_whenInitialized())
15601556 then _whenNotPaused()
1557+ else false)
1558+ then _checkWatchdog()
15611559 else false)
15621560 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
15631561 else false)
15641562 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
15651563 else false)
15661564 then _validateInt(i.payments[0].amount, 1, MAX_INT, "deposit: invalid payment amount")
15671565 else false
15681566 if ((err1 == err1))
15691567 then {
15701568 let assetStr = _assetToStr(i.payments[0].assetId)
15711569 let assetDecimals = _getDecimals(assetStr)
15721570 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1573- let $t04557645692 = _deposit(assetStr, amountNormalized)
1574- let lpTokensToMint = $t04557645692._1
1575- let assetBalances = $t04557645692._2
1576- let lpFee = $t04557645692._3
1577- let protocolFee = $t04557645692._4
1578- let sigmaFeePerLpUpdated = $t04557645692._5
1571+ let $t04655746673 = _deposit(assetStr, amountNormalized)
1572+ let lpTokensToMint = $t04655746673._1
1573+ let assetBalances = $t04655746673._2
1574+ let lpFee = $t04655746673._3
1575+ let protocolFee = $t04655746673._4
1576+ let sigmaFeePerLpUpdated = $t04655746673._5
15791577 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
15801578 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
15811579 if ((err2 == err2))
15821580 then {
15831581 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15841582 $Tuple2(((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToSend, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15851583 }
15861584 else throw("Strict value is not equal to itself.")
15871585 }
15881586 else throw("Strict value is not equal to itself.")
15891587 }
15901588 else throw("Strict value is not equal to itself.")
15911589 }
15921590
15931591
15941592
15951593 @Callable(i)
15961594 func withdrawAll () = {
15971595 let storage = _loadStorage()
15981596 let lpAssetId = storage._1
15991597 let lpAssetIdStr = toBase58String(lpAssetId)
16001598 let lpDecimals = _getDecimals(lpAssetIdStr)
16011599 let assets = _loadAssets()
1602- let err = if (if (if (if (_whenInitialized())
1603- then _whenNotPaused()
1604- else false)
1600+ let err = if (if (if (_whenInitialized())
16051601 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
16061602 else false)
16071603 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
16081604 else false)
16091605 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdrawAll: invalid payment amount")
16101606 else false
16111607 if ((err == err))
16121608 then {
1613- let $t04718147268 = _withdrawAll(i.payments[0].amount)
1614- let lpTokensToBurn = $t04718147268._1
1615- let balancesToPay = $t04718147268._2
1616- let assetBalances = $t04718147268._3
1609+ let $t04813448221 = _withdrawAll(i.payments[0].amount)
1610+ let lpTokensToBurn = $t04813448221._1
1611+ let balancesToPay = $t04813448221._2
1612+ let assetBalances = $t04813448221._3
16171613 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16181614 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16191615 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16201616 }
16211617 else throw("Strict value is not equal to itself.")
16221618 }
16231619
16241620
16251621
16261622 @Callable(i)
16271623 func withdraw (assetId_,minAmount_) = {
16281624 let storage = _loadStorage()
16291625 let lpAssetId = storage._1
16301626 let lpAssetIdStr = toBase58String(lpAssetId)
16311627 let lpDecimals = _getDecimals(lpAssetIdStr)
16321628 let assets = _loadAssets()
1633- let err = if (if (if (if (if (if (_whenInitialized())
1629+ let err = if (if (if (if (if (if (if (_whenInitialized())
16341630 then _whenNotPaused()
1631+ else false)
1632+ then _checkWatchdog()
16351633 else false)
16361634 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
16371635 else false)
16381636 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
16391637 else false)
16401638 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdraw: invalid payment amount")
16411639 else false)
16421640 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
16431641 else false)
16441642 then _validateInt(minAmount_, 0, MAX_INT, "withdraw: invalid minAmount")
16451643 else false
16461644 if ((err == err))
16471645 then {
1648- let $t04859448728 = _withdraw(assetId_, i.payments[0].amount)
1649- let targetAmountNormalized = $t04859448728._1
1650- let finalAssetBalances = $t04859448728._2
1651- let lpFee = $t04859448728._3
1652- let protocolFee = $t04859448728._4
1653- let sigmaFeePerLpUpdated = $t04859448728._5
1646+ let $t04957549709 = _withdraw(assetId_, i.payments[0].amount)
1647+ let targetAmountNormalized = $t04957549709._1
1648+ let finalAssetBalances = $t04957549709._2
1649+ let lpFee = $t04957549709._3
1650+ let protocolFee = $t04957549709._4
1651+ let sigmaFeePerLpUpdated = $t04957549709._5
16541652 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16551653 let targetDecimals = _getDecimals(assetId_)
16561654 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16571655 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: less than min")
16581656 if ((err1 == err1))
16591657 then {
16601658 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)
16611659 $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)
16621660 }
16631661 else throw("Strict value is not equal to itself.")
16641662 }
16651663 else throw("Strict value is not equal to itself.")
16661664 }
16671665
16681666
16691667
16701668 @Callable(i)
16711669 func swap (targetAssetId_,minAmount_) = {
16721670 let storage = _loadStorage()
16731671 let lpAssetId = storage._1
16741672 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16751673 let assets = _loadAssets()
16761674 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
16771675 let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
16781676 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
16791677 if ((sourceAssetIndex == sourceAssetIndex))
16801678 then {
16811679 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16821680 if ((targetAssetIndex == targetAssetIndex))
16831681 then {
1684- let err = if (if (if (if (if (_whenInitialized())
1682+ let err = if (if (if (if (if (if (_whenInitialized())
16851683 then _whenNotPaused()
1684+ else false)
1685+ then _checkWatchdog()
16861686 else false)
16871687 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16881688 else false)
16891689 then _validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount")
16901690 else false)
16911691 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
16921692 else false)
16931693 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
16941694 else false
16951695 if ((err == err))
16961696 then {
1697- let $t05081350971 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1698- let targetAmountNormalized = $t05081350971._1
1699- let finalAssetBalances = $t05081350971._2
1700- let lpFee = $t05081350971._3
1701- let protocolFee = $t05081350971._4
1702- let sigmaFeePerLpUpdated = $t05081350971._5
1697+ let $t05182251980 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1698+ let targetAmountNormalized = $t05182251980._1
1699+ let finalAssetBalances = $t05182251980._2
1700+ let lpFee = $t05182251980._3
1701+ let protocolFee = $t05182251980._4
1702+ let sigmaFeePerLpUpdated = $t05182251980._5
17031703 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17041704 let targetDecimals = _getDecimals(targetAssetId_)
17051705 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17061706 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: less than min")
17071707 if ((err1 == err1))
17081708 then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
17091709 else throw("Strict value is not equal to itself.")
17101710 }
17111711 else throw("Strict value is not equal to itself.")
17121712 }
17131713 else throw("Strict value is not equal to itself.")
17141714 }
17151715 else throw("Strict value is not equal to itself.")
17161716 }
17171717
17181718
17191719
17201720 @Callable(i)
17211721 func getDepositAll (lpAmount_) = {
17221722 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17231723 if ((err == err))
17241724 then {
1725- let $t05209152178 = _depositAll(lpAmount_)
1726- let lpTokensToMint = $t05209152178._1
1727- let requiredAmountsNormalized = $t05209152178._2
1728- let assetBalances = $t05209152178._3
1725+ let $t05310053187 = _depositAll(lpAmount_)
1726+ let lpTokensToMint = $t05310053187._1
1727+ let requiredAmountsNormalized = $t05310053187._2
1728+ let assetBalances = $t05310053187._3
17291729 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17301730 }
17311731 else throw("Strict value is not equal to itself.")
17321732 }
17331733
17341734
17351735
17361736 @Callable(i)
17371737 func getDeposit (assetId_,amount_) = {
17381738 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
17391739 then _validateInt(amount_, 1, MAX_INT, "getDeposit: invalid amount")
17401740 else false
17411741 if ((err == err))
17421742 then {
17431743 let storage = _loadStorage()
17441744 let lpAssetId = storage._1
17451745 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17461746 let assetDecimals = _getDecimals(assetId_)
17471747 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1748- let $t05293753053 = _deposit(assetId_, amountNormalized)
1749- let lpTokensToMint = $t05293753053._1
1750- let assetBalances = $t05293753053._2
1751- let lpFee = $t05293753053._3
1752- let protocolFee = $t05293753053._4
1753- let sigmaFeePerLpUpdated = $t05293753053._5
1748+ let $t05394654062 = _deposit(assetId_, amountNormalized)
1749+ let lpTokensToMint = $t05394654062._1
1750+ let assetBalances = $t05394654062._2
1751+ let lpFee = $t05394654062._3
1752+ let protocolFee = $t05394654062._4
1753+ let sigmaFeePerLpUpdated = $t05394654062._5
17541754 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
17551755 $Tuple2(nil, lpTokensToSend)
17561756 }
17571757 else throw("Strict value is not equal to itself.")
17581758 }
17591759
17601760
17611761
17621762 @Callable(i)
17631763 func getWithdrawAll (lpAmount_) = {
17641764 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17651765 if ((err == err))
17661766 then {
1767- let $t05349253568 = _withdrawAll(lpAmount_)
1768- let lpTokensToBurn = $t05349253568._1
1769- let balancesToGet = $t05349253568._2
1770- let assetBalances = $t05349253568._3
1767+ let $t05450154577 = _withdrawAll(lpAmount_)
1768+ let lpTokensToBurn = $t05450154577._1
1769+ let balancesToGet = $t05450154577._2
1770+ let assetBalances = $t05450154577._3
17711771 $Tuple2(nil, balancesToGet)
17721772 }
17731773 else throw("Strict value is not equal to itself.")
17741774 }
17751775
17761776
17771777
17781778 @Callable(i)
17791779 func getWithdraw (assetId_,amount_) = {
17801780 let err = if (_validateListContains(_loadAssets(), assetId_, "getWithdraw: invalid asset"))
17811781 then _validateInt(amount_, 1, MAX_INT, "getWithdraw: invalid amount")
17821782 else false
17831783 if ((err == err))
17841784 then {
17851785 let storage = _loadStorage()
17861786 let lpAssetId = storage._1
17871787 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1788- let $t05421954335 = _withdraw(assetId_, amount_)
1789- let targetAmountNormalized = $t05421954335._1
1790- let assetBalances = $t05421954335._2
1791- let lpFee = $t05421954335._3
1792- let protocolFee = $t05421954335._4
1793- let sigmaFeePerLpUpdated = $t05421954335._5
1788+ let $t05522855344 = _withdraw(assetId_, amount_)
1789+ let targetAmountNormalized = $t05522855344._1
1790+ let assetBalances = $t05522855344._2
1791+ let lpFee = $t05522855344._3
1792+ let protocolFee = $t05522855344._4
1793+ let sigmaFeePerLpUpdated = $t05522855344._5
17941794 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17951795 let targetDecimals = _getDecimals(assetId_)
17961796 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17971797 $Tuple2(nil, finalAmount)
17981798 }
17991799 else throw("Strict value is not equal to itself.")
18001800 }
18011801
18021802
18031803
18041804 @Callable(i)
18051805 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
18061806 let storage = _loadStorage()
18071807 let lpAssetId = storage._1
18081808 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
18091809 let assets = _loadAssets()
18101810 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
18111811 if ((sourceAssetIndex == sourceAssetIndex))
18121812 then {
18131813 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
18141814 if ((targetAssetIndex == targetAssetIndex))
18151815 then {
18161816 let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
18171817 let err = if (_validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount"))
18181818 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
18191819 else false
18201820 if ((err == err))
18211821 then {
1822- let $t05574955907 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1823- let targetAmountNormalized = $t05574955907._1
1824- let finalAssetBalances = $t05574955907._2
1825- let lpFee = $t05574955907._3
1826- let protocolFee = $t05574955907._4
1827- let sigmaFeePerLpUpdated = $t05574955907._5
1822+ let $t05675456912 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1823+ let targetAmountNormalized = $t05675456912._1
1824+ let finalAssetBalances = $t05675456912._2
1825+ let lpFee = $t05675456912._3
1826+ let protocolFee = $t05675456912._4
1827+ let sigmaFeePerLpUpdated = $t05675456912._5
18281828 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18291829 let targetDecimals = _getDecimals(targetAssetId_)
18301830 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18311831 $Tuple2(nil, finalAmount)
18321832 }
18331833 else throw("Strict value is not equal to itself.")
18341834 }
18351835 else throw("Strict value is not equal to itself.")
18361836 }
18371837 else throw("Strict value is not equal to itself.")
18381838 }
18391839
18401840
18411841
18421842 @Callable(i)
18431843 func getClaim (user_) = {
18441844 let user = if ((size(user_) > 0))
18451845 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18461846 else i.caller
1847- let $t05654956605 = _checkpoint(user)
1848- let checkpointActions = $t05654956605._1
1849- let userProfits = $t05654956605._2
1847+ let $t05755457610 = _checkpoint(user)
1848+ let checkpointActions = $t05755457610._1
1849+ let userProfits = $t05755457610._2
18501850 $Tuple2(nil, userProfits)
18511851 }
18521852
18531853
18541854
18551855 @Callable(i)
18561856 func getUtilFunc () = {
18571857 let storage = _loadStorage()
18581858 let lpTotalSupply = storage._3
18591859 let weightAmplifier = storage._7
18601860 let slippageRate = storage._8
18611861 let feeMaxRate = storage._9
1862- let $t05693856998 = _loadAssetBalances()
1863- let assetBalances = $t05693856998._1
1864- let assetTotalSupply = $t05693856998._2
1865- let $t05700357056 = _loadAssetWeights()
1866- let assetWeights = $t05700357056._1
1867- let sigmaWeight = $t05700357056._2
1862+ let $t05794358003 = _loadAssetBalances()
1863+ let assetBalances = $t05794358003._1
1864+ let assetTotalSupply = $t05794358003._2
1865+ let $t05800858061 = _loadAssetWeights()
1866+ let assetWeights = $t05800858061._1
1867+ let sigmaWeight = $t05800858061._2
18681868 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18691869 let utilValue = (assetTotalSupply - fee)
18701870 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
18711871 }
18721872
18731873
18741874
18751875 @Callable(i)
18761876 func getFeeFunc () = {
18771877 let storage = _loadStorage()
18781878 let weightAmplifier = storage._7
18791879 let slippageRate = storage._8
18801880 let feeMaxRate = storage._9
1881- let $t05748857548 = _loadAssetBalances()
1882- let assetBalances = $t05748857548._1
1883- let assetTotalSupply = $t05748857548._2
1884- let $t05755357606 = _loadAssetWeights()
1885- let assetWeights = $t05755357606._1
1886- let sigmaWeight = $t05755357606._2
1881+ let $t05849358553 = _loadAssetBalances()
1882+ let assetBalances = $t05849358553._1
1883+ let assetTotalSupply = $t05849358553._2
1884+ let $t05855858611 = _loadAssetWeights()
1885+ let assetWeights = $t05855858611._1
1886+ let sigmaWeight = $t05855858611._2
18871887 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18881888 $Tuple2(nil, fee)
18891889 }
18901890
18911891
18921892
18931893 @Callable(i)
18941894 func checkpoint (user_) = {
18951895 let err = if (_whenInitialized())
18961896 then _whenNotPaused()
18971897 else false
18981898 if ((err == err))
18991899 then {
19001900 let user = if ((size(user_) > 0))
19011901 then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
19021902 else i.caller
19031903 _checkpoint(user)
19041904 }
19051905 else throw("Strict value is not equal to itself.")
19061906 }
19071907
19081908
19091909
19101910 @Callable(i)
19111911 func stake () = {
19121912 let err = if (_whenInitialized())
19131913 then _whenNotPaused()
19141914 else false
19151915 if ((err == err))
19161916 then {
19171917 let storage = _loadStorage()
19181918 let lpAssetIdStr = _assetToStr(storage._1)
19191919 let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
19201920 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
19211921 else false)
19221922 then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
19231923 else false
19241924 if ((err1 == err1))
19251925 then {
1926- let $t05861458674 = _checkpoint(i.caller)
1927- let checkpointActions = $t05861458674._1
1928- let userProfits = $t05861458674._2
1926+ let $t05961959679 = _checkpoint(i.caller)
1927+ let checkpointActions = $t05961959679._1
1928+ let userProfits = $t05961959679._2
19291929 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19301930 }
19311931 else throw("Strict value is not equal to itself.")
19321932 }
19331933 else throw("Strict value is not equal to itself.")
19341934 }
19351935
19361936
19371937
19381938 @Callable(i)
19391939 func unstake (amount_) = {
19401940 let err = if (_whenInitialized())
19411941 then _whenNotPaused()
19421942 else false
19431943 if ((err == err))
19441944 then {
19451945 let storage = _loadStorage()
19461946 let lpAssetId = storage._1
19471947 let userLp = _loadUserLp(i.caller)
19481948 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19491949 if ((err1 == err1))
19501950 then {
1951- let $t05918559245 = _checkpoint(i.caller)
1952- let checkpointActions = $t05918559245._1
1953- let userProfits = $t05918559245._2
1951+ let $t06019060250 = _checkpoint(i.caller)
1952+ let checkpointActions = $t06019060250._1
1953+ let userProfits = $t06019060250._2
19541954 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19551955 }
19561956 else throw("Strict value is not equal to itself.")
19571957 }
19581958 else throw("Strict value is not equal to itself.")
19591959 }
19601960
19611961
19621962
19631963 @Callable(i)
19641964 func claim (user_) = {
19651965 let err = if (_whenInitialized())
19661966 then _whenNotPaused()
19671967 else false
19681968 if ((err == err))
19691969 then {
19701970 let user = if ((size(user_) > 0))
19711971 then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
19721972 else i.caller
19731973 let storage = _loadStorage()
19741974 let lpAssetId = storage._1
19751975 let lpAssetIdStr = _assetToStr(lpAssetId)
19761976 let assets = [lpAssetIdStr, _loadAssets()]
19771977 let maxIndex = (size(assets) - 1)
19781978 let userLp = _loadUserLp(user)
1979- let $t05996860024 = _checkpoint(user)
1980- let checkpointActions = $t05996860024._1
1981- let userProfits = $t05996860024._2
1979+ let $t06097361029 = _checkpoint(user)
1980+ let checkpointActions = $t06097361029._1
1981+ let userProfits = $t06097361029._2
19821982 func foldFunc (acc,profit) = {
19831983 let index = acc._1
19841984 if (if ((maxIndex >= index))
19851985 then (profit > 0)
19861986 else false)
19871987 then {
19881988 let asset = assets[index]
19891989 $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
19901990 }
19911991 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19921992 }
19931993
1994- let $t06040260493 = {
1994+ let $t06140761498 = {
19951995 let $l = userProfits
19961996 let $s = size($l)
19971997 let $acc0 = $Tuple3(0, nil, nil)
19981998 func $f0_1 ($a,$i) = if (($i >= $s))
19991999 then $a
20002000 else foldFunc($a, $l[$i])
20012001
20022002 func $f0_2 ($a,$i) = if (($i >= $s))
20032003 then $a
20042004 else throw("List size exceeds 11")
20052005
20062006 $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)
20072007 }
2008- let idx = $t06040260493._1
2009- let userProfitsUpdated = $t06040260493._2
2010- let profitActions = $t06040260493._3
2008+ let idx = $t06140761498._1
2009+ let userProfitsUpdated = $t06140761498._2
2010+ let profitActions = $t06140761498._3
20112011 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
20122012 }
20132013 else throw("Strict value is not equal to itself.")
20142014 }
20152015
20162016
20172017
20182018 @Callable(i)
20192019 func pause () = {
20202020 let err = if (if (_onlyPauser(i.caller))
20212021 then _whenInitialized()
20222022 else false)
20232023 then _whenNotPaused()
20242024 else false
20252025 if ((err == err))
20262026 then $Tuple2(_savePause(true), unit)
20272027 else throw("Strict value is not equal to itself.")
20282028 }
20292029
20302030
20312031
20322032 @Callable(i)
20332033 func unpause () = {
2034- let err = if (if (_onlyPauser(i.caller))
2034+ let err = if (if (_onlyThisContract(i.caller))
20352035 then _whenInitialized()
20362036 else false)
20372037 then _whenPaused()
20382038 else false
20392039 if ((err == err))
20402040 then $Tuple2(_savePause(false), unit)
20412041 else throw("Strict value is not equal to itself.")
20422042 }
20432043
20442044
20452045
20462046 @Callable(i)
20472047 func updatePauser (pauser_) = {
20482048 let err = if (if (_onlyThisContract(i.caller))
20492049 then _whenInitialized()
20502050 else false)
20512051 then _validateAddress(pauser_, "updatePauser: invalid pauser")
20522052 else false
20532053 if ((err == err))
20542054 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
2055+ else throw("Strict value is not equal to itself.")
2056+ }
2057+
2058+
2059+
2060+@Callable(i)
2061+func updateWatchdog (watchdog_,offset_) = {
2062+ let err = if (if (if (_onlyThisContract(i.caller))
2063+ then _whenInitialized()
2064+ else false)
2065+ then _validateAddress(watchdog_, "updateWatchdog: invalid watchdog")
2066+ else false)
2067+ then _validateInt(offset_, 0, MAX_INT, "updateWatchdog: invalid offset")
2068+ else false
2069+ if ((err == err))
2070+ then $Tuple2((_saveWatchdog(addressFromStringValue(watchdog_)) ++ _saveWatchdogOffset(offset_)), unit)
20552071 else throw("Strict value is not equal to itself.")
20562072 }
20572073
20582074
20592075
20602076 @Callable(i)
20612077 func setMultisig (multisig_) = {
20622078 let err = if (_onlyThisContract(i.caller))
20632079 then _validateAddress(multisig_, "setMultisig: invalid multisig")
20642080 else false
20652081 if ((err == err))
20662082 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
20672083 else throw("Strict value is not equal to itself.")
20682084 }
20692085
20702086
20712087 @Verifier(tx)
20722088 func verify () = match getString(KEY_MULTISIG) {
20732089 case multisig: String =>
20742090 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEP)), false)
20752091 case _ =>
20762092 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
20772093 }
20782094

github/deemru/w8io/3ef1775 
208.66 ms