tx · EPCxh1RUM4iQk14ZNQ4Zu4JLWuqhrCp89N26M7ShosaL

3Mp3uUKsY4LnTo3j4N7dJAfqRfMJ6Rgr35Q:  -0.07500000 Waves

2023.06.23 12:17 [2635101] smart account 3Mp3uUKsY4LnTo3j4N7dJAfqRfMJ6Rgr35Q > SELF 0.00000000 Waves

{ "type": 13, "id": "EPCxh1RUM4iQk14ZNQ4Zu4JLWuqhrCp89N26M7ShosaL", "fee": 7500000, "feeAssetId": null, "timestamp": 1687511949303, "version": 2, "chainId": 84, "sender": "3Mp3uUKsY4LnTo3j4N7dJAfqRfMJ6Rgr35Q", "senderPublicKey": "EiYReiiFX6CXEuz35wibBnvZ8LjJHZrgFwR73fomjgzy", "proofs": [ "4LTdRvxRj9hgsKfiLyr4aKe3WjopBrryTaCUsaPH9kvi7459Zd6QCagrhyqfxmMJkZzVMjvLVNyBQfcKjeHJYucY" ], "script": "base64:BgKOAQgCEgASABIAEgASAwoBARIRCg8BAQEBAQEBAQEBAQEBAQESFgoUAQEBAQEBAQgICAEBAQEBAQEBAQESBwoFAQEBCAgSBAoCAQgSBQoDAQEIEgcKBQEBAQQIEgUKAwgBCBIDCgEIEgMKAQgSABIAEgMKAQgSBQoDCAEIEgMKAQESABIDCgEIEgASBAoCCAi2AQAMa19iYXNlT3JhY2xlAgxrX2Jhc2VPcmFjbGUADWtfcXVvdGVPcmFjbGUCDWtfcXVvdGVPcmFjbGUACWtfYmFsYW5jZQIJa19iYWxhbmNlAAprX3NlcXVlbmNlAgprX3NlcXVlbmNlAA5rX3Bvc2l0aW9uU2l6ZQIOa19wb3NpdGlvblNpemUAEGtfcG9zaXRpb25NYXJnaW4CEGtfcG9zaXRpb25NYXJnaW4AFmtfcG9zaXRpb25PcGVuTm90aW9uYWwCFmtfcG9zaXRpb25PcGVuTm90aW9uYWwALmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24CEmtfcG9zaXRpb25GcmFjdGlvbgASa19wb3NpdGlvblNlcXVlbmNlAhJrX3Bvc2l0aW9uU2VxdWVuY2UADWtfcG9zaXRpb25GZWUCDWtfcG9zaXRpb25GZWUAHmtfcG9zaXRpb25MYXN0VXBkYXRlZFRpbWVzdGFtcAITa19wb3NpdGlvblRpbWVzdGFtcAANa19pbml0aWFsaXplZAINa19pbml0aWFsaXplZAAIa19wYXVzZWQCCGtfcGF1c2VkAAtrX2Nsb3NlT25seQILa19jbG9zZU9ubHkABWtfZmVlAgVrX2ZlZQANa19yb2xsb3ZlckZlZQIOa19yb2xsb3Zlcl9mZWUAD2tfZnVuZGluZ1BlcmlvZAIPa19mdW5kaW5nUGVyaW9kABFrX2luaXRNYXJnaW5SYXRpbwIRa19pbml0TWFyZ2luUmF0aW8AGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwIFa19tbXIAFWtfbGlxdWlkYXRpb25GZWVSYXRpbwIVa19saXF1aWRhdGlvbkZlZVJhdGlvABlrX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAhZrX3BhcnRMaXF1aWRhdGlvblJhdGlvAA1rX3NwcmVhZExpbWl0Ag1rX3NwcmVhZExpbWl0ABBrX21heFByaWNlSW1wYWN0AhBrX21heFByaWNlSW1wYWN0ABBrX21heFByaWNlU3ByZWFkAhBrX21heFByaWNlU3ByZWFkABFrX21heE9wZW5Ob3Rpb25hbAIRa19tYXhPcGVuTm90aW9uYWwAFWtfZmVlVG9TdGFrZXJzUGVyY2VudAIVa19mZWVUb1N0YWtlcnNQZXJjZW50ABBrX21heE9yYWNsZURlbGF5AhBrX21heE9yYWNsZURlbGF5AA1rX2Z1bmRpbmdNb2RlAg1rX2Z1bmRpbmdNb2RlAAxrX29yYWNsZU1vZGUCDGtfb3JhY2xlTW9kZQAla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgIba19sYXRlc3RMb25nUHJlbWl1bUZyYWN0aW9uACZrX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgIca19sYXRlc3RTaG9ydFByZW1pdW1GcmFjdGlvbgASa19uZXh0RnVuZGluZ0Jsb2NrAh5rX25leHRGdW5kaW5nQmxvY2tNaW5UaW1lc3RhbXAAEWtfbG9uZ0Z1bmRpbmdSYXRlAhFrX2xvbmdGdW5kaW5nUmF0ZQASa19zaG9ydEZ1bmRpbmdSYXRlAhJrX3Nob3J0RnVuZGluZ1JhdGUAE2tfcXVvdGVBc3NldFJlc2VydmUCCGtfcXRBc3RSABJrX2Jhc2VBc3NldFJlc2VydmUCCGtfYnNBc3RSABJrX3F1b3RlQXNzZXRXZWlnaHQCCGtfcXRBc3RXABFrX2Jhc2VBc3NldFdlaWdodAIIa19ic0FzdFcAE2tfdG90YWxQb3NpdGlvblNpemUCE2tfdG90YWxQb3NpdGlvblNpemUAF2tfdG90YWxMb25nUG9zaXRpb25TaXplAhdrX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAYa190b3RhbFNob3J0UG9zaXRpb25TaXplAhhrX3RvdGFsU2hvcnRQb3NpdGlvblNpemUAFmtfb3BlbkludGVyZXN0Tm90aW9uYWwCFmtfb3BlbkludGVyZXN0Tm90aW9uYWwAE2tfb3BlbkludGVyZXN0U2hvcnQCE2tfb3BlbkludGVyZXN0U2hvcnQAEmtfb3BlbkludGVyZXN0TG9uZwISa19vcGVuSW50ZXJlc3RMb25nAAhrX2xhc3RUeAIIa19sYXN0VHgAFGtfY29vcmRpbmF0b3JBZGRyZXNzAhRrX2Nvb3JkaW5hdG9yQWRkcmVzcwAPa192YXVsdF9hZGRyZXNzAg9rX3ZhdWx0X2FkZHJlc3MAD2tfYWRtaW5fYWRkcmVzcwIPa19hZG1pbl9hZGRyZXNzAA1rX3F1b3RlX2Fzc2V0Ag1rX3F1b3RlX2Fzc2V0ABFrX3N0YWtpbmdfYWRkcmVzcwIRa19zdGFraW5nX2FkZHJlc3MAD2tfbWluZXJfYWRkcmVzcwIPa19taW5lcl9hZGRyZXNzABBrX29yZGVyc19hZGRyZXNzAhBrX29yZGVyc19hZGRyZXNzABJrX3JlZmVycmFsX2FkZHJlc3MCEmtfcmVmZXJyYWxfYWRkcmVzcwAVa19uZnRfbWFuYWdlcl9hZGRyZXNzAhVrX25mdF9tYW5hZ2VyX2FkZHJlc3MBDnRvQ29tcG9zaXRlS2V5AgRfa2V5CF9hZGRyZXNzCQCsAgIJAKwCAgUEX2tleQIBXwUIX2FkZHJlc3MBC2Nvb3JkaW5hdG9yAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAhNDb29yZGluYXRvciBub3Qgc2V0AQxhZG1pbkFkZHJlc3MACQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfYWRtaW5fYWRkcmVzcwEKcXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUNa19xdW90ZV9hc3NldAEOc3Rha2luZ0FkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAURa19zdGFraW5nX2FkZHJlc3MCD1N0YWtpbmcgbm90IHNldAEMdmF1bHRBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfdmF1bHRfYWRkcmVzcwINVmF1bHQgbm90IHNldAEMbWluZXJBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfbWluZXJfYWRkcmVzcwINTWluZXIgbm90IHNldAENb3JkZXJzQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRBrX29yZGVyc19hZGRyZXNzAg5PcmRlcnMgbm90IHNldAEPcmVmZXJyYWxBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEmtfcmVmZXJyYWxfYWRkcmVzcwIQUmVmZXJyYWwgbm90IHNldAERbmZ0TWFuYWdlckFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUVa19uZnRfbWFuYWdlcl9hZGRyZXNzAhNORlQgTWFuYWdlciBub3Qgc2V0AA1rX3Rva2VuX3BhcmFtAg1rX3Rva2VuX3BhcmFtAAxrX3Rva2VuX3R5cGUCDGtfdG9rZW5fdHlwZQAYRkVFX1JFRFVDVElPTl9UT0tFTl9UWVBFAg1mZWVfcmVkdWN0aW9uAAhESVJfTE9ORwABAAlESVJfU0hPUlQAAgAHU0VDT05EUwDoBwAPREVDSU1BTF9OVU1CRVJTAAYADERFQ0lNQUxfVU5JVAkAaAIAAQkAaAIJAGgCCQBoAgkAaAIJAGgCAAoACgAKAAoACgAKAA9NSU5VVEVTX0lOX1lFQVIJAGgCAKCKIAUMREVDSU1BTF9VTklUAAdPTkVfREFZCQBoAgCAowUFDERFQ0lNQUxfVU5JVAAPUE5MX09QVElPTl9TUE9UAAEAEVBOTF9PUFRJT05fT1JBQ0xFAAIAEkZVTkRJTkdfQVNZTU1FVFJJQwABABFGVU5ESU5HX1NZTU1FVFJJQwACAAxPUkFDTEVfUExBSU4AAQAKT1JBQ0xFX0pJVAACAQFzAQJfeAkArAICCQCkAwEFAl94AgEsAQRkaXZkAgJfeAJfeQkAbgQFAl94BQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEEbXVsZAICX3gCX3kJAG4EBQJfeAUCX3kFDERFQ0lNQUxfVU5JVAUISEFMRkVWRU4BBWJkaXZkAgJfeAJfeQkAvQIEBQJfeAkAtgIBBQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEFYm11bGQCAl94Al95CQC9AgQFAl94BQJfeQkAtgIBBQxERUNJTUFMX1VOSVQFCEhBTEZFVkVOAQNhYnMBAl94AwkAZgIFAl94AAAFAl94CQEBLQEFAl94AQR2bWF4AgJfeAJfeQMJAGcCBQJfeAUCX3kFAl94BQJfeQEDaW50AQFrCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUBawkArAICAg1ubyB2YWx1ZSBmb3IgBQFrAQVpbnRPcgIBawNkZWYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBawUDZGVmAQRzdHJBAghfYWRkcmVzcwRfa2V5BAN2YWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhfYWRkcmVzcwUEX2tleQkArAICAhFObyB2YWx1ZSBmb3Iga2V5IAUEX2tleQUDdmFsAQRpbnRBAghfYWRkcmVzcwRfa2V5BAN2YWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhfYWRkcmVzcwUEX2tleQkArAICAhFObyB2YWx1ZSBmb3Iga2V5IAUEX2tleQUDdmFsAQhjYmFsYW5jZQAJAQNpbnQBBQlrX2JhbGFuY2UBCWNiYWxhbmNlMAAJAQVpbnRPcgIFCWtfYmFsYW5jZQAAAQNmZWUACQEDaW50AQUFa19mZWUBD3JvbGxvdmVyRmVlUmF0ZQAJAQNpbnQBBQ1rX3JvbGxvdmVyRmVlAQ9pbml0TWFyZ2luUmF0aW8ACQEDaW50AQURa19pbml0TWFyZ2luUmF0aW8BBnF0QXN0UgAJAQNpbnQBBRNrX3F1b3RlQXNzZXRSZXNlcnZlAQdxdEFzdFIwAAkBBWludE9yAgUTa19xdW90ZUFzc2V0UmVzZXJ2ZQAAAQZic0FzdFIACQEDaW50AQUSa19iYXNlQXNzZXRSZXNlcnZlAQdic0FzdFIwAAkBBWludE9yAgUSa19iYXNlQXNzZXRSZXNlcnZlAAABBnF0QXN0VwAJAQVpbnRPcgIFEmtfcXVvdGVBc3NldFdlaWdodAUMREVDSU1BTF9VTklUAQZic0FzdFcACQEFaW50T3ICBRFrX2Jhc2VBc3NldFdlaWdodAUMREVDSU1BTF9VTklUARF0b3RhbFBvc2l0aW9uU2l6ZQAJAQNpbnQBBRNrX3RvdGFsUG9zaXRpb25TaXplARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAJAQNpbnQBBRZrX29wZW5JbnRlcmVzdE5vdGlvbmFsARFvcGVuSW50ZXJlc3RTaG9ydAAJAQNpbnQBBRNrX29wZW5JbnRlcmVzdFNob3J0ARBvcGVuSW50ZXJlc3RMb25nAAkBA2ludAEFEmtfb3BlbkludGVyZXN0TG9uZwEZbmV4dEZ1bmRpbmdCbG9ja1RpbWVzdGFtcAAJAQNpbnQBBRJrX25leHRGdW5kaW5nQmxvY2sBEGZ1bmRpbmdQZXJpb2RSYXcACQEDaW50AQUPa19mdW5kaW5nUGVyaW9kARRmdW5kaW5nUGVyaW9kRGVjaW1hbAAJAGgCCQEQZnVuZGluZ1BlcmlvZFJhdwAFDERFQ0lNQUxfVU5JVAEUZnVuZGluZ1BlcmlvZFNlY29uZHMACQBoAgkBEGZ1bmRpbmdQZXJpb2RSYXcABQdTRUNPTkRTARZtYWludGVuYW5jZU1hcmdpblJhdGlvAAkBA2ludAEFGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwETbGlxdWlkYXRpb25GZWVSYXRpbwAJAQNpbnQBBRVrX2xpcXVpZGF0aW9uRmVlUmF0aW8BF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAkBA2ludAEFGWtfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8BC3NwcmVhZExpbWl0AAkBA2ludAEFDWtfc3ByZWFkTGltaXQBDm1heFByaWNlSW1wYWN0AAkBA2ludAEFEGtfbWF4UHJpY2VJbXBhY3QBDm1heFByaWNlU3ByZWFkAAkBA2ludAEFEGtfbWF4UHJpY2VTcHJlYWQBD21heE9wZW5Ob3Rpb25hbAAJAQNpbnQBBRFrX21heE9wZW5Ob3Rpb25hbAEjbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ACQEDaW50AQUla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEkbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAkBA2ludAEFJmtfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAkBA2ludAEFGGtfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQEVdG90YWxMb25nUG9zaXRpb25TaXplAAkBA2ludAEFF2tfdG90YWxMb25nUG9zaXRpb25TaXplAQxsYXN0U2VxdWVuY2UACQEFaW50T3ICBQprX3NlcXVlbmNlAAABE2ZlZVRvU3Rha2Vyc1BlcmNlbnQACQEDaW50AQUVa19mZWVUb1N0YWtlcnNQZXJjZW50AQ5tYXhPcmFjbGVEZWxheQAJAQNpbnQBBRBrX21heE9yYWNsZURlbGF5AQtmdW5kaW5nTW9kZQAJAQVpbnRPcgIFDWtfZnVuZGluZ01vZGUFEkZVTkRJTkdfQVNZTU1FVFJJQwEKb3JhY2xlTW9kZQAJAQVpbnRPcgIFDGtfb3JhY2xlTW9kZQUMT1JBQ0xFX1BMQUlOAQ1sYXN0VGltZXN0YW1wAAgFCWxhc3RCbG9jawl0aW1lc3RhbXABD2dldEFjdHVhbENhbGxlcgEBaQkBC3ZhbHVlT3JFbHNlAgkAnQgCCQENb3JkZXJzQWRkcmVzcwACCGtfc2VuZGVyCQClCAEIBQFpBmNhbGxlcgEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMMX21hcmdpblJhdGlvEF9iYXNlTWFyZ2luUmF0aW8UX2xhcmdlclRoYW5PckVxdWFsVG8EFHJlbWFpbmluZ01hcmdpblJhdGlvCQBlAgUMX21hcmdpblJhdGlvBRBfYmFzZU1hcmdpblJhdGlvAwMFFF9sYXJnZXJUaGFuT3JFcXVhbFRvCQBmAgAABRRyZW1haW5pbmdNYXJnaW5SYXRpbwcJAAIBCQCsAgIJAKwCAgkArAICAhBJbnZhbGlkIG1hcmdpbjogCQCkAwEFDF9tYXJnaW5SYXRpbwIDIDwgCQCkAwEFEF9iYXNlTWFyZ2luUmF0aW8DAwkBASEBBRRfbGFyZ2VyVGhhbk9yRXF1YWxUbwkAZwIFFHJlbWFpbmluZ01hcmdpblJhdGlvAAAHCQACAQkArAICCQCsAgIJAKwCAgIQSW52YWxpZCBtYXJnaW46IAkApAMBBQxfbWFyZ2luUmF0aW8CAyA+IAkApAMBBRBfYmFzZU1hcmdpblJhdGlvBgEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgENX3Bvc2l0aW9uU2l6ZQMJAAACBQ1fcG9zaXRpb25TaXplAAAJAAIBAixTaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIF9wb3NpdGlvblNpemUgPT0gMAMJAGYCBQ1fcG9zaXRpb25TaXplAAAJASNsYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAJASRsYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24AAQtnZXRQb3NpdGlvbgIHX3RyYWRlcgpfZGlyZWN0aW9uBAtwb3NpdGlvbktleQkArAICCQCsAgIFB190cmFkZXICAV8JAKQDAQUKX2RpcmVjdGlvbgQPcG9zaXRpb25TaXplT3B0CQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQtwb3NpdGlvbktleQQHJG1hdGNoMAUPcG9zaXRpb25TaXplT3B0AwkAAQIFByRtYXRjaDACA0ludAQMcG9zaXRpb25TaXplBQckbWF0Y2gwCQCXCgUFDHBvc2l0aW9uU2l6ZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvbk1hcmdpbgULcG9zaXRpb25LZXkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFFmtfcG9zaXRpb25PcGVuTm90aW9uYWwFC3Bvc2l0aW9uS2V5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBS5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQtwb3NpdGlvbktleQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUea19wb3NpdGlvbkxhc3RVcGRhdGVkVGltZXN0YW1wBQtwb3NpdGlvbktleQkAlwoFAAAAAAAAAAAAAAEMZ2V0RGlyZWN0aW9uAQ1fcG9zaXRpb25TaXplAwkAZgIAAAUNX3Bvc2l0aW9uU2l6ZQUJRElSX1NIT1JUBQhESVJfTE9ORwEOZ2V0UG9zaXRpb25GZWUCB190cmFkZXIKX2RpcmVjdGlvbgQLcG9zaXRpb25LZXkJAKwCAgkArAICBQdfdHJhZGVyAgFfCQCkAwEFCl9kaXJlY3Rpb24EDnBvc2l0aW9uRmVlT3B0CQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDWtfcG9zaXRpb25GZWUFC3Bvc2l0aW9uS2V5BAckbWF0Y2gwBQ5wb3NpdGlvbkZlZU9wdAMJAAECBQckbWF0Y2gwAgNJbnQEC3Bvc2l0aW9uRmVlBQckbWF0Y2gwBQtwb3NpdGlvbkZlZQkBA2ZlZQABE3JlcXVpcmVPcGVuUG9zaXRpb24CB190cmFkZXIKX2RpcmVjdGlvbgMJAAACCAkBC2dldFBvc2l0aW9uAgUHX3RyYWRlcgUKX2RpcmVjdGlvbgJfMQAACQACAQIQTm8gb3BlbiBwb3NpdGlvbgYBDWdldE9yYWNsZURhdGEBA2tleQQNb3JhY2xlRGF0YVN0cgkAnQgCBQR0aGlzBQNrZXkDAwkBCWlzRGVmaW5lZAEFDW9yYWNsZURhdGFTdHIJAQIhPQIJAQV2YWx1ZQEFDW9yYWNsZURhdGFTdHICAAcECm9yYWNsZURhdGEJALUJAgkBBXZhbHVlAQUNb3JhY2xlRGF0YVN0cgIBLAQNb3JhY2xlQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKb3JhY2xlRGF0YQAACQCsAgICG0ludmFsaWQgb3JhY2xlIGFkZHJlc3MgaW46IAkBBXZhbHVlAQUNb3JhY2xlRGF0YVN0cgQIcHJpY2VLZXkJAJEDAgUKb3JhY2xlRGF0YQABBAhibG9ja0tleQkAkQMCBQpvcmFjbGVEYXRhAAIEB29wZW5LZXkJAJEDAgUKb3JhY2xlRGF0YQADCQCWCgQFDW9yYWNsZUFkZHJlc3MFCHByaWNlS2V5BQhibG9ja0tleQUHb3BlbktleQUEdW5pdAELaW5pdGlhbGl6ZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDWtfaW5pdGlhbGl6ZWQHAQZwYXVzZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFCGtfcGF1c2VkBwEJY2xvc2VPbmx5AAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQtrX2Nsb3NlT25seQcBDXVwZGF0ZVJlc2VydmUDBl9pc0FkZBFfcXVvdGVBc3NldEFtb3VudBBfYmFzZUFzc2V0QW1vdW50AwUGX2lzQWRkBAduZXdCYXNlCQBlAgkBBmJzQXN0UgAFEF9iYXNlQXNzZXRBbW91bnQDCQBnAgAABQduZXdCYXNlCQACAQIqVHggbGVhZCB0byBiYXNlIGFzc2V0IHJlc2VydmUgPD0gMCwgcmV2ZXJ0CQCVCgMJAGQCCQEGcXRBc3RSAAURX3F1b3RlQXNzZXRBbW91bnQFB25ld0Jhc2UJAGQCCQERdG90YWxQb3NpdGlvblNpemUABRBfYmFzZUFzc2V0QW1vdW50BAhuZXdRdW90ZQkAZQIJAQZxdEFzdFIABRFfcXVvdGVBc3NldEFtb3VudAMJAGcCAAAFCG5ld1F1b3RlCQACAQIqVHggbGVhZCB0byBiYXNlIHF1b3RlIHJlc2VydmUgPD0gMCwgcmV2ZXJ0CQCVCgMFCG5ld1F1b3RlCQBkAgkBBmJzQXN0UgAFEF9iYXNlQXNzZXRBbW91bnQJAGUCCQERdG90YWxQb3NpdGlvblNpemUABRBfYmFzZUFzc2V0QW1vdW50AQ1jYWxjSW52YXJpYW50AgdfcXRBc3RSB19ic0FzdFIEB2JxdEFzdFIJALYCAQUHX3F0QXN0UgQHYmJzQXN0UgkAtgIBBQdfYnNBc3RSCQEFYm11bGQCBQdicXRBc3RSBQdiYnNBc3RSAQlzd2FwSW5wdXQCBl9pc0FkZBFfcXVvdGVBc3NldEFtb3VudAQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAdfcXRBc3RXCQEGcXRBc3RXAAQHX2JzQXN0VwkBBmJzQXN0VwAEGHF1b3RlQXNzZXRBbW91bnRBZGp1c3RlZAkBBGRpdmQCBRFfcXVvdGVBc3NldEFtb3VudAUHX3F0QXN0VwQBawkBDWNhbGNJbnZhcmlhbnQCBQdfcXRBc3RSBQdfYnNBc3RSBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyAwUGX2lzQWRkCQBkAgUHX3F0QXN0UgUYcXVvdGVBc3NldEFtb3VudEFkanVzdGVkCQBlAgUHX3F0QXN0UgUYcXVvdGVBc3NldEFtb3VudEFkanVzdGVkBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIJAKADAQkBBWJkaXZkAgUBawkAtgIBBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBBhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMJAQNhYnMBCQBlAgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBQdfYnNBc3RSBBVhbW91bnRCYXNlQXNzZXRCb3VnaHQDBQZfaXNBZGQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwkBAS0BBRhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMEDSR0MDE1OTE4MTYwODgJAQ11cGRhdGVSZXNlcnZlAwUGX2lzQWRkBRhxdW90ZUFzc2V0QW1vdW50QWRqdXN0ZWQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEIBQ0kdDAxNTkxODE2MDg4Al8xBBZiYXNlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMTU5MTgxNjA4OAJfMgQXdG90YWxQb3NpdGlvblNpemVBZnRlcjEIBQ0kdDAxNTkxODE2MDg4Al8zBAtwcmljZUJlZm9yZQkBBGRpdmQCCQEEbXVsZAIFB19xdEFzdFIFB19xdEFzdFcJAQRtdWxkAgUHX2JzQXN0UgUHX2JzQXN0VwQLbWFya2V0UHJpY2UJAQRkaXZkAgURX3F1b3RlQXNzZXRBbW91bnQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQJcHJpY2VEaWZmCQEDYWJzAQkAZQIFC3ByaWNlQmVmb3JlBQttYXJrZXRQcmljZQQLcHJpY2VJbXBhY3QJAGUCBQxERUNJTUFMX1VOSVQJAQRkaXZkAgULcHJpY2VCZWZvcmUJAGQCBQtwcmljZUJlZm9yZQUJcHJpY2VEaWZmBBNtYXhQcmljZUltcGFjdFZhbHVlCQEObWF4UHJpY2VJbXBhY3QAAwkAZgIFC3ByaWNlSW1wYWN0BRNtYXhQcmljZUltcGFjdFZhbHVlCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg1QcmljZSBpbXBhY3QgCQCkAwEFC3ByaWNlSW1wYWN0AhQgPiBtYXggcHJpY2UgaW1wYWN0IAkApAMBBRNtYXhQcmljZUltcGFjdFZhbHVlAhUgYmVmb3JlIHF1b3RlIGFzc2V0OiAJAKQDAQUHX3F0QXN0UgIUIGJlZm9yZSBiYXNlIGFzc2V0OiAJAKQDAQUHX2JzQXN0UgIhIHF1b3RlIGFzc2V0IGFtb3VudCB0byBleGNoYW5nZTogCQCkAwEFEV9xdW90ZUFzc2V0QW1vdW50Ag8gcHJpY2UgYmVmb3JlOiAJAKQDAQULcHJpY2VCZWZvcmUCDiBtYXJrZXRQcmljZTogCQCkAwEFC21hcmtldFByaWNlCQCWCgQFFWFtb3VudEJhc2VBc3NldEJvdWdodAUXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEFFmJhc2VBc3NldFJlc2VydmVBZnRlcjEFF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxAQ9jYWxjUm9sbG92ZXJGZWUCEl9vbGRQb3NpdGlvbk1hcmdpbiBfb2xkUG9zaXRpb25MYXN0VXBkYXRlZFRpbWVzdGFtcAQPcG9zaXRpb25NaW51dGVzCQBoAgkAaQIJAGkCCQBlAgkBDWxhc3RUaW1lc3RhbXAABSBfb2xkUG9zaXRpb25MYXN0VXBkYXRlZFRpbWVzdGFtcADoBwA8BQxERUNJTUFMX1VOSVQEC3JvbGxvdmVyRmVlCQEEZGl2ZAIJAQRtdWxkAgkBBG11bGQCBRJfb2xkUG9zaXRpb25NYXJnaW4FD3Bvc2l0aW9uTWludXRlcwkBD3JvbGxvdmVyRmVlUmF0ZQAFD01JTlVURVNfSU5fWUVBUgULcm9sbG92ZXJGZWUBMGNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnRBbmRSb2xsb3ZlckZlZQUQX29sZFBvc2l0aW9uU2l6ZRJfb2xkUG9zaXRpb25NYXJnaW4lX29sZFBvc2l0aW9uQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbiBfb2xkUG9zaXRpb25MYXN0VXBkYXRlZFRpbWVzdGFtcAxfbWFyZ2luRGVsdGEEDmZ1bmRpbmdQYXltZW50AwkBAiE9AgUQX29sZFBvc2l0aW9uU2l6ZQAABCBfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBRBfb2xkUG9zaXRpb25TaXplCQEEbXVsZAIJAGUCBSBfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUlX29sZFBvc2l0aW9uQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUQX29sZFBvc2l0aW9uU2l6ZQAABAtyb2xsb3ZlckZlZQkBD2NhbGNSb2xsb3ZlckZlZQIFEl9vbGRQb3NpdGlvbk1hcmdpbgUgX29sZFBvc2l0aW9uTGFzdFVwZGF0ZWRUaW1lc3RhbXAEDHNpZ25lZE1hcmdpbgkAZAIJAGUCCQBlAgUMX21hcmdpbkRlbHRhBQtyb2xsb3ZlckZlZQUOZnVuZGluZ1BheW1lbnQFEl9vbGRQb3NpdGlvbk1hcmdpbgQNJHQwMTg3NTUxODg4MgMJAGYCAAAFDHNpZ25lZE1hcmdpbgkAlAoCAAAJAQNhYnMBBQxzaWduZWRNYXJnaW4JAJQKAgkBA2FicwEFDHNpZ25lZE1hcmdpbgAABAxyZW1haW5NYXJnaW4IBQ0kdDAxODc1NTE4ODgyAl8xBAdiYWREZWJ0CAUNJHQwMTg3NTUxODg4MgJfMgkAlgoEBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFDmZ1bmRpbmdQYXltZW50BQtyb2xsb3ZlckZlZQEWc3dhcE91dHB1dFdpdGhSZXNlcnZlcwcGX2lzQWRkEF9iYXNlQXNzZXRBbW91bnQUX2NoZWNrTWF4UHJpY2VJbXBhY3QSX3F1b3RlQXNzZXRSZXNlcnZlEV9xdW90ZUFzc2V0V2VpZ2h0EV9iYXNlQXNzZXRSZXNlcnZlEF9iYXNlQXNzZXRXZWlnaHQEC3ByaWNlQmVmb3JlCQEEZGl2ZAIJAQRtdWxkAgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfcXVvdGVBc3NldFdlaWdodAkBBG11bGQCBRFfYmFzZUFzc2V0UmVzZXJ2ZQUQX2Jhc2VBc3NldFdlaWdodAMJAAACBRBfYmFzZUFzc2V0QW1vdW50AAAJAAIBAhlJbnZhbGlkIGJhc2UgYXNzZXQgYW1vdW50BAFrCQENY2FsY0ludmFyaWFudAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUEGGJhc2VBc3NldFBvb2xBbW91bnRBZnRlcgMFBl9pc0FkZAkAZAIFEV9iYXNlQXNzZXRSZXNlcnZlBRBfYmFzZUFzc2V0QW1vdW50CQBlAgURX2Jhc2VBc3NldFJlc2VydmUFEF9iYXNlQXNzZXRBbW91bnQED3F1b3RlQXNzZXRBZnRlcgkAoAMBCQEFYmRpdmQCBQFrCQC2AgEFGGJhc2VBc3NldFBvb2xBbW91bnRBZnRlcgQPcXVvdGVBc3NldERlbHRhCQEDYWJzAQkAZQIFD3F1b3RlQXNzZXRBZnRlcgUSX3F1b3RlQXNzZXRSZXNlcnZlBA5xdW90ZUFzc2V0U29sZAkBBG11bGQCBQ9xdW90ZUFzc2V0RGVsdGEFEV9xdW90ZUFzc2V0V2VpZ2h0BBNtYXhQcmljZUltcGFjdFZhbHVlCQEObWF4UHJpY2VJbXBhY3QABA0kdDAyMDE0NDIwMzA2CQENdXBkYXRlUmVzZXJ2ZQMJAQEhAQUGX2lzQWRkBQ9xdW90ZUFzc2V0RGVsdGEFEF9iYXNlQXNzZXRBbW91bnQEF3F1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMjAxNDQyMDMwNgJfMQQWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFDSR0MDIwMTQ0MjAzMDYCXzIEF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxCAUNJHQwMjAxNDQyMDMwNgJfMwQLbWFya2V0UHJpY2UJAQRkaXZkAgUOcXVvdGVBc3NldFNvbGQFEF9iYXNlQXNzZXRBbW91bnQECXByaWNlRGlmZgkBA2FicwEJAGUCBQtwcmljZUJlZm9yZQULbWFya2V0UHJpY2UEC3ByaWNlSW1wYWN0CQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIFC3ByaWNlQmVmb3JlCQBkAgULcHJpY2VCZWZvcmUFCXByaWNlRGlmZgMDCQBmAgULcHJpY2VJbXBhY3QFE21heFByaWNlSW1wYWN0VmFsdWUFFF9jaGVja01heFByaWNlSW1wYWN0BwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgINUHJpY2UgaW1wYWN0IAkApAMBBQtwcmljZUltcGFjdAIUID4gbWF4IHByaWNlIGltcGFjdCAJAKQDAQUTbWF4UHJpY2VJbXBhY3RWYWx1ZQIVIGJlZm9yZSBxdW90ZSBhc3NldDogCQCkAwEFEl9xdW90ZUFzc2V0UmVzZXJ2ZQIUIGJlZm9yZSBiYXNlIGFzc2V0OiAJAKQDAQURX2Jhc2VBc3NldFJlc2VydmUCICBiYXNlIGFzc2V0IGFtb3VudCB0byBleGNoYW5nZTogCQCkAwEFEF9iYXNlQXNzZXRBbW91bnQCDyBwcmljZSBiZWZvcmU6IAkApAMBBQtwcmljZUJlZm9yZQIPIG1hcmtldCBwcmljZTogCQCkAwEFC21hcmtldFByaWNlCQCZCgcFDnF1b3RlQXNzZXRTb2xkBRdxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyMQUWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQUXdG90YWxQb3NpdGlvblNpemVBZnRlcjEJAGUCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMFBl9pc0FkZAkBA2FicwEFEF9iYXNlQXNzZXRBbW91bnQAAAkAZQIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAMJAQEhAQUGX2lzQWRkCQEDYWJzAQUQX2Jhc2VBc3NldEFtb3VudAAABQtwcmljZUltcGFjdAEKc3dhcE91dHB1dAMGX2lzQWRkEF9iYXNlQXNzZXRBbW91bnQUX2NoZWNrTWF4UHJpY2VJbXBhY3QJARZzd2FwT3V0cHV0V2l0aFJlc2VydmVzBwUGX2lzQWRkBRBfYmFzZUFzc2V0QW1vdW50BRRfY2hlY2tNYXhQcmljZUltcGFjdAkBBnF0QXN0UgAJAQZxdEFzdFcACQEGYnNBc3RSAAkBBmJzQXN0VwABE2dldE9yYWNsZVByaWNlVmFsdWUDBm9yYWNsZQhwcmljZUtleQhibG9ja0tleQQJbGFzdFZhbHVlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUGb3JhY2xlBQhwcmljZUtleQkArAICCQCsAgIJAKwCAgIiQ2FuIG5vdCBnZXQgb3JhY2xlIHByaWNlLiBPcmFjbGU6IAkApQgBBQZvcmFjbGUCBiBrZXk6IAUIcHJpY2VLZXkDCQECIT0CBQhibG9ja0tleQIABAxjdXJyZW50QmxvY2sFBmhlaWdodAQPbGFzdE9yYWNsZUJsb2NrCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUGb3JhY2xlBQhibG9ja0tleQkArAICCQCsAgIJAKwCAgIiQ2FuIG5vdCBnZXQgb3JhY2xlIGJsb2NrLiBPcmFjbGU6IAkApQgBBQZvcmFjbGUCBiBrZXk6IAUIYmxvY2tLZXkDCQBmAgkAZQIFDGN1cnJlbnRCbG9jawUPbGFzdE9yYWNsZUJsb2NrCQEObWF4T3JhY2xlRGVsYXkACQACAQkArAICCQCsAgIJAKwCAgImT3JhY2xlIHN0YWxlIGRhdGEuIExhc3Qgb3JhY2xlIGJsb2NrOiAJAKQDAQUPbGFzdE9yYWNsZUJsb2NrAhAgY3VycmVudCBibG9jazogCQCkAwEFDGN1cnJlbnRCbG9jawUJbGFzdFZhbHVlBQlsYXN0VmFsdWUBDmdldE9yYWNsZVByaWNlAAQKYmFzZU9yYWNsZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQENZ2V0T3JhY2xlRGF0YQEFDGtfYmFzZU9yYWNsZQIZTm8gYmFzZSBhc3NldCBvcmFjbGUgZGF0YQQPYmFzZU9yYWNsZVByaWNlCQETZ2V0T3JhY2xlUHJpY2VWYWx1ZQMIBQpiYXNlT3JhY2xlAl8xCAUKYmFzZU9yYWNsZQJfMggFCmJhc2VPcmFjbGUCXzMEC3F1b3RlT3JhY2xlCQENZ2V0T3JhY2xlRGF0YQEFDWtfcXVvdGVPcmFjbGUEEHF1b3RlT3JhY2xlUHJpY2UDCQEJaXNEZWZpbmVkAQULcXVvdGVPcmFjbGUEDHF1b3RlT3JhY2xlVgkBBXZhbHVlAQULcXVvdGVPcmFjbGUJARNnZXRPcmFjbGVQcmljZVZhbHVlAwgFDHF1b3RlT3JhY2xlVgJfMQgFDHF1b3RlT3JhY2xlVgJfMggFDHF1b3RlT3JhY2xlVgJfMwUMREVDSU1BTF9VTklUCQEEZGl2ZAIFD2Jhc2VPcmFjbGVQcmljZQUQcXVvdGVPcmFjbGVQcmljZQEOaXNNYXJrZXRDbG9zZWQABApiYXNlT3JhY2xlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQ1nZXRPcmFjbGVEYXRhAQUMa19iYXNlT3JhY2xlAhlObyBiYXNlIGFzc2V0IG9yYWNsZSBkYXRhBAZvcmFjbGUIBQpiYXNlT3JhY2xlAl8xBAdvcGVuS2V5CAUKYmFzZU9yYWNsZQJfNAMJAQIhPQIFB29wZW5LZXkCAAQGaXNPcGVuCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJsIAgUGb3JhY2xlBQdvcGVuS2V5CQCsAgIJAKwCAgkArAICAitDYW4gbm90IGdldCBvcmFjbGUgaXMgb3Blbi9jbG9zZWQuIE9yYWNsZTogCQClCAEFBm9yYWNsZQIGIGtleTogBQdvcGVuS2V5CQEBIQEFBmlzT3BlbgcBDGFic1ByaWNlRGlmZgUMX29yYWNsZVByaWNlEl9xdW90ZUFzc2V0UmVzZXJ2ZRFfYmFzZUFzc2V0UmVzZXJ2ZQdfcXRBc3RXB19ic0FzdFcECnByaWNlQWZ0ZXIJAQRkaXZkAgkBBG11bGQCBRJfcXVvdGVBc3NldFJlc2VydmUFB19xdEFzdFcJAQRtdWxkAgURX2Jhc2VBc3NldFJlc2VydmUFB19ic0FzdFcEDGF2ZXJhZ2VQcmljZQkBBGRpdmQCCQBkAgUMX29yYWNsZVByaWNlBQpwcmljZUFmdGVyCQBoAgACBQxERUNJTUFMX1VOSVQEDGFic1ByaWNlRGlmZgkBBGRpdmQCCQEDYWJzAQkAZQIFDF9vcmFjbGVQcmljZQUKcHJpY2VBZnRlcgUMYXZlcmFnZVByaWNlBQxhYnNQcmljZURpZmYBGXJlcXVpcmVOb3RPdmVyU3ByZWFkTGltaXQCEl9xdW90ZUFzc2V0UmVzZXJ2ZRFfYmFzZUFzc2V0UmVzZXJ2ZQQLb3JhY2xlUHJpY2UJAQ5nZXRPcmFjbGVQcmljZQAEB19xdEFzdFcJAQZxdEFzdFcABAdfYnNBc3RXCQEGYnNBc3RXAAQSYWJzUHJpY2VEaWZmQmVmb3JlCQEMYWJzUHJpY2VEaWZmBQULb3JhY2xlUHJpY2UJAQZxdEFzdFIACQEGYnNBc3RSAAUHX3F0QXN0VwUHX2JzQXN0VwQRYWJzUHJpY2VEaWZmQWZ0ZXIJAQxhYnNQcmljZURpZmYFBQtvcmFjbGVQcmljZQUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfYmFzZUFzc2V0UmVzZXJ2ZQUHX3F0QXN0VwUHX2JzQXN0VwMDCQBmAgURYWJzUHJpY2VEaWZmQWZ0ZXIJAQ5tYXhQcmljZVNwcmVhZAAJAGYCBRFhYnNQcmljZURpZmZBZnRlcgUSYWJzUHJpY2VEaWZmQmVmb3JlBwkAAgEJAKwCAgkArAICCQCsAgICDVByaWNlIHNwcmVhZCAJAKQDAQURYWJzUHJpY2VEaWZmQWZ0ZXICFCA+IG1heCBwcmljZSBzcHJlYWQgCQCkAwEJAQ5tYXhQcmljZVNwcmVhZAAGAR1yZXF1aXJlTm90T3Zlck1heE9wZW5Ob3Rpb25hbAIRX2xvbmdPcGVuTm90aW9uYWwSX3Nob3J0T3Blbk5vdGlvbmFsBBBfbWF4T3Blbk5vdGlvbmFsCQEPbWF4T3Blbk5vdGlvbmFsAAMJAGYCBRFfbG9uZ09wZW5Ob3Rpb25hbAUQX21heE9wZW5Ob3Rpb25hbAkAAgEJAKwCAgkArAICCQCsAgICE0xvbmcgb3BlbiBub3Rpb25hbCAJAKQDAQURX2xvbmdPcGVuTm90aW9uYWwCFSA+IG1heCBvcGVuIG5vdGlvbmFsIAkApAMBBRBfbWF4T3Blbk5vdGlvbmFsAwkAZgIFEl9zaG9ydE9wZW5Ob3Rpb25hbAUQX21heE9wZW5Ob3Rpb25hbAkAAgEJAKwCAgkArAICCQCsAgICFFNob3J0IG9wZW4gbm90aW9uYWwgCQCkAwEFEl9zaG9ydE9wZW5Ob3Rpb25hbAIVID4gbWF4IG9wZW4gbm90aW9uYWwgCQCkAwEFEF9tYXhPcGVuTm90aW9uYWwGAQxnZXRTcG90UHJpY2UABBJfcXVvdGVBc3NldFJlc2VydmUJAQZxdEFzdFIABBFfYmFzZUFzc2V0UmVzZXJ2ZQkBBmJzQXN0UgAEB19xdEFzdFcJAQZxdEFzdFcABAdfYnNBc3RXCQEGYnNBc3RXAAkBBGRpdmQCCQEEbXVsZAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQUHX3F0QXN0VwkBBG11bGQCBRFfYmFzZUFzc2V0UmVzZXJ2ZQUHX2JzQXN0VwEWaXNPdmVyRmx1Y3R1YXRpb25MaW1pdAAEC29yYWNsZVByaWNlCQEOZ2V0T3JhY2xlUHJpY2UABAxjdXJyZW50UHJpY2UJAQxnZXRTcG90UHJpY2UACQBmAgkBBGRpdmQCCQEDYWJzAQkAZQIFC29yYWNsZVByaWNlBQxjdXJyZW50UHJpY2UFC29yYWNsZVByaWNlCQELc3ByZWFkTGltaXQAAR9nZXRQb3NpdGlvbkFkanVzdGVkT3Blbk5vdGlvbmFsBg1fcG9zaXRpb25TaXplB19vcHRpb24SX3F1b3RlQXNzZXRSZXNlcnZlEV9xdW90ZUFzc2V0V2VpZ2h0EV9iYXNlQXNzZXRSZXNlcnZlEF9iYXNlQXNzZXRXZWlnaHQED3Bvc2l0aW9uU2l6ZUFicwkBA2FicwEFDV9wb3NpdGlvblNpemUEB2lzU2hvcnQJAGYCAAAFDV9wb3NpdGlvblNpemUEEHBvc2l0aW9uTm90aW9uYWwDCQAAAgUHX29wdGlvbgUPUE5MX09QVElPTl9TUE9UBBNvdXRQb3NpdGlvbk5vdGlvbmFsCAkBFnN3YXBPdXRwdXRXaXRoUmVzZXJ2ZXMHCQEBIQEFB2lzU2hvcnQFD3Bvc2l0aW9uU2l6ZUFicwcFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX3F1b3RlQXNzZXRXZWlnaHQFEV9iYXNlQXNzZXRSZXNlcnZlBRBfYmFzZUFzc2V0V2VpZ2h0Al8xBRNvdXRQb3NpdGlvbk5vdGlvbmFsCQEEbXVsZAIFD3Bvc2l0aW9uU2l6ZUFicwkBDmdldE9yYWNsZVByaWNlAAUQcG9zaXRpb25Ob3Rpb25hbAErZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmxCeVZhbHVlcwcNX3Bvc2l0aW9uU2l6ZRVfcG9zaXRpb25PcGVuTm90aW9uYWwSX3F1b3RlQXNzZXRSZXNlcnZlEV9xdW90ZUFzc2V0V2VpZ2h0EV9iYXNlQXNzZXRSZXNlcnZlEF9iYXNlQXNzZXRXZWlnaHQHX29wdGlvbgMJAAACBQ1fcG9zaXRpb25TaXplAAAJAAIBAhVJbnZhbGlkIHBvc2l0aW9uIHNpemUEB2lzU2hvcnQJAGYCAAAFDV9wb3NpdGlvblNpemUEEHBvc2l0aW9uTm90aW9uYWwJAR9nZXRQb3NpdGlvbkFkanVzdGVkT3Blbk5vdGlvbmFsBgUNX3Bvc2l0aW9uU2l6ZQUHX29wdGlvbgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfcXVvdGVBc3NldFdlaWdodAURX2Jhc2VBc3NldFJlc2VydmUFEF9iYXNlQXNzZXRXZWlnaHQEDXVucmVhbGl6ZWRQbmwDBQdpc1Nob3J0CQBlAgUVX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBRBwb3NpdGlvbk5vdGlvbmFsCQBlAgUQcG9zaXRpb25Ob3Rpb25hbAUVX3Bvc2l0aW9uT3Blbk5vdGlvbmFsCQCUCgIFEHBvc2l0aW9uTm90aW9uYWwFDXVucmVhbGl6ZWRQbmwBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAwdfdHJhZGVyCl9kaXJlY3Rpb24HX29wdGlvbgQNJHQwMjgxOTEyODMzMQkBC2dldFBvc2l0aW9uAgUHX3RyYWRlcgUKX2RpcmVjdGlvbgQMcG9zaXRpb25TaXplCAUNJHQwMjgxOTEyODMzMQJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDAyODE5MTI4MzMxAl8yBBRwb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDI4MTkxMjgzMzECXzMEEXBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwMjgxOTEyODMzMQJfNAkBK2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sQnlWYWx1ZXMHBQxwb3NpdGlvblNpemUFFHBvc2l0aW9uT3Blbk5vdGlvbmFsCQEGcXRBc3RSAAkBBnF0QXN0VwAJAQZic0FzdFIACQEGYnNBc3RXAAUHX29wdGlvbgEPY2FsY01hcmdpblJhdGlvAw1fcmVtYWluTWFyZ2luCF9iYWREZWJ0EV9wb3NpdGlvbk5vdGlvbmFsCQEEZGl2ZAIJAGUCBQ1fcmVtYWluTWFyZ2luBQhfYmFkRGVidAURX3Bvc2l0aW9uTm90aW9uYWwBFmdldE1hcmdpblJhdGlvQnlPcHRpb24DB190cmFkZXIKX2RpcmVjdGlvbgdfb3B0aW9uBA0kdDAyODg2MzI5MDE2CQELZ2V0UG9zaXRpb24CBQdfdHJhZGVyBQpfZGlyZWN0aW9uBAxwb3NpdGlvblNpemUIBQ0kdDAyODg2MzI5MDE2Al8xBA5wb3NpdGlvbk1hcmdpbggFDSR0MDI4ODYzMjkwMTYCXzIEA3BvbggFDSR0MDI4ODYzMjkwMTYCXzMEFnBvc2l0aW9uTGFzdFVwZGF0ZWRDUEYIBQ0kdDAyODg2MzI5MDE2Al80BBFwb3NpdGlvblRpbWVzdGFtcAgFDSR0MDI4ODYzMjkwMTYCXzUEDSR0MDI5MDIyMjkxMjcJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAMFB190cmFkZXIFCl9kaXJlY3Rpb24FB19vcHRpb24EEHBvc2l0aW9uTm90aW9uYWwIBQ0kdDAyOTAyMjI5MTI3Al8xBA11bnJlYWxpemVkUG5sCAUNJHQwMjkwMjIyOTEyNwJfMgQNJHQwMjkxMzIyOTM0NAkBMGNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnRBbmRSb2xsb3ZlckZlZQUFDHBvc2l0aW9uU2l6ZQUOcG9zaXRpb25NYXJnaW4FFnBvc2l0aW9uTGFzdFVwZGF0ZWRDUEYFEXBvc2l0aW9uVGltZXN0YW1wBQ11bnJlYWxpemVkUG5sBAxyZW1haW5NYXJnaW4IBQ0kdDAyOTEzMjI5MzQ0Al8xBAdiYWREZWJ0CAUNJHQwMjkxMzIyOTM0NAJfMgkBD2NhbGNNYXJnaW5SYXRpbwMFDHJlbWFpbk1hcmdpbgUHYmFkRGVidAUQcG9zaXRpb25Ob3Rpb25hbAEOZ2V0TWFyZ2luUmF0aW8CB190cmFkZXIKX2RpcmVjdGlvbgkBFmdldE1hcmdpblJhdGlvQnlPcHRpb24DBQdfdHJhZGVyBQpfZGlyZWN0aW9uBQ9QTkxfT1BUSU9OX1NQT1QBG2dldFBhcnRpYWxMaXF1aWRhdGlvbkFtb3VudAIHX3RyYWRlcg1fcG9zaXRpb25TaXplBAxtYXhpbXVtUmF0aW8JAQR2bWF4AgkBF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAkAZQIFDERFQ0lNQUxfVU5JVAkBBGRpdmQCCQEOZ2V0TWFyZ2luUmF0aW8CBQdfdHJhZGVyCQEMZ2V0RGlyZWN0aW9uAQUNX3Bvc2l0aW9uU2l6ZQkBFm1haW50ZW5hbmNlTWFyZ2luUmF0aW8ABBhtYXhFeGNoYW5nZWRQb3NpdGlvblNpemUJAQRtdWxkAgkBA2FicwEFDV9wb3NpdGlvblNpemUFDG1heGltdW1SYXRpbwQKc3dhcFJlc3VsdAkBCnN3YXBPdXRwdXQDCQBmAgUNX3Bvc2l0aW9uU2l6ZQAABRhtYXhFeGNoYW5nZWRQb3NpdGlvblNpemUHBBxtYXhFeGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAUKc3dhcFJlc3VsdAJfMQQLcHJpY2VJbXBhY3QIBQpzd2FwUmVzdWx0Al83AwkAZgIJAQ5tYXhQcmljZUltcGFjdAAFC3ByaWNlSW1wYWN0BRhtYXhFeGNoYW5nZWRQb3NpdGlvblNpemUJAQRtdWxkAgkBA2FicwEFDV9wb3NpdGlvblNpemUJARdwYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwABFWludGVybmFsQ2xvc2VQb3NpdGlvbggHX3RyYWRlcgpfZGlyZWN0aW9uBV9zaXplBF9mZWUUX21pblF1b3RlQXNzZXRBbW91bnQMX2FkZFRvTWFyZ2luFF9jaGVja01heFByaWNlSW1wYWN0Cl9saXF1aWRhdGUEDSR0MDMwNTA3MzA2NzUJAQtnZXRQb3NpdGlvbgIFB190cmFkZXIFCl9kaXJlY3Rpb24ED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDMwNTA3MzA2NzUCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwMzA1MDczMDY3NQJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDAzMDUwNzMwNjc1Al8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDMwNTA3MzA2NzUCXzQEFG9sZFBvc2l0aW9uVGltZXN0YW1wCAUNJHQwMzA1MDczMDY3NQJfNQQOaXNMb25nUG9zaXRpb24JAGYCBQ9vbGRQb3NpdGlvblNpemUAAAQSYWJzT2xkUG9zaXRpb25TaXplCQEDYWJzAQUPb2xkUG9zaXRpb25TaXplAwMJAGcCBRJhYnNPbGRQb3NpdGlvblNpemUFBV9zaXplCQBmAgUFX3NpemUAAAcEDmlzUGFydGlhbENsb3NlCQBmAgUSYWJzT2xkUG9zaXRpb25TaXplBQVfc2l6ZQQNJHQwMzA5NjczMTQxOAkBCnN3YXBPdXRwdXQDCQBmAgUPb2xkUG9zaXRpb25TaXplAAAFBV9zaXplBRRfY2hlY2tNYXhQcmljZUltcGFjdAQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFDSR0MDMwOTY3MzE0MTgCXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAzMDk2NzMxNDE4Al8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAzMDk2NzMxNDE4Al8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwMzA5NjczMTQxOAJfNAQVZXhjaGFuZ2VkUG9zaXRpb25TaXplAwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAACQEBLQEFBV9zaXplBQVfc2l6ZQQNJHQwMzE2MzMzMTg1NwkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAwUHX3RyYWRlcgUKX2RpcmVjdGlvbgUPUE5MX09QVElPTl9TUE9UBBNvbGRQb3NpdGlvbk5vdGlvbmFsCAUNJHQwMzE2MzMzMTg1NwJfMQQNdW5yZWFsaXplZFBubAgFDSR0MDMxNjMzMzE4NTcCXzIEDXJlYWxpemVkUmF0aW8JAQRkaXZkAgkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQUSYWJzT2xkUG9zaXRpb25TaXplBAtyZWFsaXplZFBubAkBBG11bGQCBQ11bnJlYWxpemVkUG5sBQ1yZWFsaXplZFJhdGlvBA0kdDAzMjE5ODMyNDQ0CQEwY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudEFuZFJvbGxvdmVyRmVlBQUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFFG9sZFBvc2l0aW9uVGltZXN0YW1wBQ11bnJlYWxpemVkUG5sBBJyZW1haW5NYXJnaW5CZWZvcmUIBQ0kdDAzMjE5ODMyNDQ0Al8xBAJ4MQgFDSR0MDMyMTk4MzI0NDQCXzIEAngyCAUNJHQwMzIxOTgzMjQ0NAJfMwQLcm9sbG92ZXJGZWUIBQ0kdDAzMjE5ODMyNDQ0Al80BA9wb3NpdGlvbkJhZERlYnQICQEwY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudEFuZFJvbGxvdmVyRmVlBQUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFFG9sZFBvc2l0aW9uVGltZXN0YW1wBQtyZWFsaXplZFBubAJfMgQQcmVhbGl6ZWRDbG9zZUZlZQkBBG11bGQCCQEEbXVsZAIFE29sZFBvc2l0aW9uTm90aW9uYWwFDXJlYWxpemVkUmF0aW8FBF9mZWUEEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIFDXVucmVhbGl6ZWRQbmwFC3JlYWxpemVkUG5sBBJyZW1haW5PcGVuTm90aW9uYWwDCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAGUCCQBlAgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUSdW5yZWFsaXplZFBubEFmdGVyCQBlAgkAZAIFEnVucmVhbGl6ZWRQbmxBZnRlcgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQPbmV3UG9zaXRpb25TaXplCQBkAgUPb2xkUG9zaXRpb25TaXplBRVleGNoYW5nZWRQb3NpdGlvblNpemUEDSR0MDMzODUwMzQyMzYDCQAAAgUPbmV3UG9zaXRpb25TaXplAAAJAJQKAgAAAAAJAJQKAgkBA2FicwEFEnJlbWFpbk9wZW5Ob3Rpb25hbAkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBQ9uZXdQb3NpdGlvblNpemUEF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwMzM4NTAzNDIzNgJfMQQUbmV3UG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDAzMzg1MDM0MjM2Al8yBBFvcGVuTm90aW9uYWxEZWx0YQkAZQIFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAQLbWFyZ2luUmF0aW8JARZnZXRNYXJnaW5SYXRpb0J5T3B0aW9uAwUHX3RyYWRlcgUKX2RpcmVjdGlvbgUPUE5MX09QVElPTl9TUE9UBB5uZXdQb3NpdGlvbk1hcmdpbldpdGhTYW1lUmF0aW8DCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAGUCCQEEbXVsZAIJAGQCBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUSdW5yZWFsaXplZFBubEFmdGVyBQttYXJnaW5SYXRpbwUSdW5yZWFsaXplZFBubEFmdGVyCQBlAgkBBG11bGQCCQBlAgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFEnVucmVhbGl6ZWRQbmxBZnRlcgULbWFyZ2luUmF0aW8FEnVucmVhbGl6ZWRQbmxBZnRlcgQRbWFyZ2luVG9UcmFkZXJSYXcJAGUCCQBlAgUScmVtYWluTWFyZ2luQmVmb3JlCQBkAgUebmV3UG9zaXRpb25NYXJnaW5XaXRoU2FtZVJhdGlvBRJ1bnJlYWxpemVkUG5sQWZ0ZXIFEHJlYWxpemVkQ2xvc2VGZWUEDm1hcmdpblRvVHJhZGVyAwkAZgIAAAURbWFyZ2luVG9UcmFkZXJSYXcDBQpfbGlxdWlkYXRlAAAJAAIBAjdJbnZhbGlkIGludGVybmFsQ2xvc2VQb3NpdGlvbiBwYXJhbXM6IHVuYWJsZSB0byBwYXkgZmVlBRFtYXJnaW5Ub1RyYWRlclJhdwQRbmV3UG9zaXRpb25NYXJnaW4DBQxfYWRkVG9NYXJnaW4JAGQCBR5uZXdQb3NpdGlvbk1hcmdpbldpdGhTYW1lUmF0aW8FDm1hcmdpblRvVHJhZGVyBR5uZXdQb3NpdGlvbk1hcmdpbldpdGhTYW1lUmF0aW8DAwkBAiE9AgUUX21pblF1b3RlQXNzZXRBbW91bnQAAAkAZgIFFF9taW5RdW90ZUFzc2V0QW1vdW50BRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BwkAAgEJAKwCAgkArAICCQCsAgICDUxpbWl0IGVycm9yOiAJAKQDAQUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAIDIDwgCQCkAwEFFF9taW5RdW90ZUFzc2V0QW1vdW50CQCjChEFD25ld1Bvc2l0aW9uU2l6ZQURbmV3UG9zaXRpb25NYXJnaW4FF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRRuZXdQb3NpdGlvbkxzdFVwZENQRgUPcG9zaXRpb25CYWREZWJ0BQtyZWFsaXplZFBubAMDBQxfYWRkVG9NYXJnaW4FDmlzUGFydGlhbENsb3NlBwAABQ5tYXJnaW5Ub1RyYWRlcgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCQBlAgkBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAURb3Blbk5vdGlvbmFsRGVsdGEJAGUCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMFDmlzTG9uZ1Bvc2l0aW9uCQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAGUCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQEBIQEFDmlzTG9uZ1Bvc2l0aW9uCQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAGUCCQEQb3BlbkludGVyZXN0TG9uZwADBQ5pc0xvbmdQb3NpdGlvbgURb3Blbk5vdGlvbmFsRGVsdGEAAAkAZQIJARFvcGVuSW50ZXJlc3RTaG9ydAADCQEBIQEFDmlzTG9uZ1Bvc2l0aW9uBRFvcGVuTm90aW9uYWxEZWx0YQAACQBkAgUQcmVhbGl6ZWRDbG9zZUZlZQULcm9sbG92ZXJGZWUFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQJAAIBCQCsAgIJAKwCAgkArAICAj1JbnZhbGlkIGludGVybmFsQ2xvc2VQb3NpdGlvbiBwYXJhbXM6IGludmFsaWQgcG9zaXRpb24gc2l6ZTogCQCkAwEFBV9zaXplAgYgbWF4OiAJAKQDAQUSYWJzT2xkUG9zaXRpb25TaXplARNnZXRUZXJtaW5hbEFtbVN0YXRlAAQNX3Bvc2l0aW9uU2l6ZQkBEXRvdGFsUG9zaXRpb25TaXplAAMJAAACBQ1fcG9zaXRpb25TaXplAAAJAJQKAgkBBnF0QXN0UgAJAQZic0FzdFIABAlkaXJlY3Rpb24JAGYCBQ1fcG9zaXRpb25TaXplAAAEDSR0MDM3NDgzMzc2NjIJAQpzd2FwT3V0cHV0AwUJZGlyZWN0aW9uCQEDYWJzAQUNX3Bvc2l0aW9uU2l6ZQcEFWN1cnJlbnROZXRNYXJrZXRWYWx1ZQgFDSR0MDM3NDgzMzc2NjICXzEEGXRlcm1pbmFsUXVvdGVBc3NldFJlc2VydmUIBQ0kdDAzNzQ4MzM3NjYyAl8yBBh0ZXJtaW5hbEJhc2VBc3NldFJlc2VydmUIBQ0kdDAzNzQ4MzM3NjYyAl8zCQCUCgIFGXRlcm1pbmFsUXVvdGVBc3NldFJlc2VydmUFGHRlcm1pbmFsQmFzZUFzc2V0UmVzZXJ2ZQETZ2V0UXVvdGVBc3NldFdlaWdodAQQYmFzZUFzc2V0UmVzZXJ2ZRF0b3RhbFBvc2l0aW9uU2l6ZRFxdW90ZUFzc2V0UmVzZXJ2ZQt0YXJnZXRQcmljZQQBYgkAtgIBBRBiYXNlQXNzZXRSZXNlcnZlBAJzegkAtgIBBRF0b3RhbFBvc2l0aW9uU2l6ZQQBcQkAtgIBBRFxdW90ZUFzc2V0UmVzZXJ2ZQQBcAkAtgIBBQt0YXJnZXRQcmljZQQBawkBBWJtdWxkAgUBcQUBYgQEbmV3QgkAtwICBQFiBQJzegQEbmV3UQkBBWJkaXZkAgUBawUEbmV3QgQBegkBBWJkaXZkAgUEbmV3UQUEbmV3QgQGcmVzdWx0CQEFYmRpdmQCBQFwBQF6CQCgAwEFBnJlc3VsdAEUZ2V0U3luY1Rlcm1pbmFsUHJpY2UDDl90ZXJtaW5hbFByaWNlB19xdEFzdFIHX2JzQXN0UgQNX3Bvc2l0aW9uU2l6ZQkBEXRvdGFsUG9zaXRpb25TaXplAAMJAAACBQ1fcG9zaXRpb25TaXplAAAECW5ld1F0QXN0VwkBBGRpdmQCCQEEbXVsZAIFDl90ZXJtaW5hbFByaWNlBQdfYnNBc3RSBQdfcXRBc3RSCQCVCgMFCW5ld1F0QXN0VwUMREVDSU1BTF9VTklUAAAECWRpcmVjdGlvbgkAZgIFDV9wb3NpdGlvblNpemUAAAQVY3VycmVudE5ldE1hcmtldFZhbHVlCAkBCnN3YXBPdXRwdXQDBQlkaXJlY3Rpb24JAQNhYnMBBQ1fcG9zaXRpb25TaXplBwJfMQQJbmV3UXRBc3RXCQETZ2V0UXVvdGVBc3NldFdlaWdodAQFB19ic0FzdFIFDV9wb3NpdGlvblNpemUFB19xdEFzdFIFDl90ZXJtaW5hbFByaWNlBAluZXdCc0FzdFcFDERFQ0lNQUxfVU5JVAQNbWFyZ2luVG9WYXVsdAgJAStnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubEJ5VmFsdWVzBwUNX3Bvc2l0aW9uU2l6ZQUVY3VycmVudE5ldE1hcmtldFZhbHVlBQdfcXRBc3RSBQluZXdRdEFzdFcFB19ic0FzdFIFCW5ld0JzQXN0VwUPUE5MX09QVElPTl9TUE9UAl8yCQCVCgMFCW5ld1F0QXN0VwUJbmV3QnNBc3RXBQ1tYXJnaW5Ub1ZhdWx0AQpnZXRGdW5kaW5nAAQPdW5kZXJseWluZ1ByaWNlCQEOZ2V0T3JhY2xlUHJpY2UABAlzcG90UHJpY2UJAQxnZXRTcG90UHJpY2UABAdwcmVtaXVtCQBlAgUJc3BvdFByaWNlBQ91bmRlcmx5aW5nUHJpY2UDAwkBDmlzTWFya2V0Q2xvc2VkAAYDCQAAAgkBC2Z1bmRpbmdNb2RlAAUSRlVORElOR19BU1lNTUVUUklDAwkAAAIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAAABgkAAAIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAAAHCQCVCgMAAAAAAAADCQBmAgAABQdwcmVtaXVtBBRzaG9ydFByZW1pdW1GcmFjdGlvbgkBBGRpdmQCCQEEbXVsZAIFB3ByZW1pdW0JARRmdW5kaW5nUGVyaW9kRGVjaW1hbAAFB09ORV9EQVkDCQAAAgkBC2Z1bmRpbmdNb2RlAAUSRlVORElOR19BU1lNTUVUUklDBBNsb25nUHJlbWl1bUZyYWN0aW9uCQEEZGl2ZAIJAQRtdWxkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24JARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAJAJUKAwUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FE2xvbmdQcmVtaXVtRnJhY3Rpb24AAAQZc2hvcnRUb3RhbFByZW1pdW1GcmFjdGlvbgkBA2FicwEJAQRtdWxkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24JARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAQYbG9uZ1RvdGFsUHJlbWl1bUZyYWN0aW9uCQEDYWJzAQkBBG11bGQCBRRzaG9ydFByZW1pdW1GcmFjdGlvbgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAEDnByZW1pdW1Ub1ZhdWx0CQBlAgUZc2hvcnRUb3RhbFByZW1pdW1GcmFjdGlvbgUYbG9uZ1RvdGFsUHJlbWl1bUZyYWN0aW9uCQCVCgMFFHNob3J0UHJlbWl1bUZyYWN0aW9uBRRzaG9ydFByZW1pdW1GcmFjdGlvbgUOcHJlbWl1bVRvVmF1bHQEE2xvbmdQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBQdwcmVtaXVtCQEUZnVuZGluZ1BlcmlvZERlY2ltYWwABQdPTkVfREFZAwkAAAIJAQtmdW5kaW5nTW9kZQAFEkZVTkRJTkdfQVNZTU1FVFJJQwQUc2hvcnRQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBRNsb25nUHJlbWl1bUZyYWN0aW9uCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUACQCVCgMFFHNob3J0UHJlbWl1bUZyYWN0aW9uBRNsb25nUHJlbWl1bUZyYWN0aW9uAAAEGGxvbmdUb3RhbFByZW1pdW1GcmFjdGlvbgkBA2FicwEJAQRtdWxkAgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAEGXNob3J0VG90YWxQcmVtaXVtRnJhY3Rpb24JAQNhYnMBCQEEbXVsZAIFE2xvbmdQcmVtaXVtRnJhY3Rpb24JARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAQOcHJlbWl1bVRvVmF1bHQJAGUCBRhsb25nVG90YWxQcmVtaXVtRnJhY3Rpb24FGXNob3J0VG90YWxQcmVtaXVtRnJhY3Rpb24JAJUKAwUTbG9uZ1ByZW1pdW1GcmFjdGlvbgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgUOcHJlbWl1bVRvVmF1bHQBDmdldEFkanVzdGVkRmVlAgtfYXJ0aWZhY3RJZBBfYmFzZUZlZURpc2NvdW50BApiYXNlRmVlUmF3CQEDZmVlAAQHYmFzZUZlZQkBBG11bGQCBQpiYXNlRmVlUmF3BRBfYmFzZUZlZURpc2NvdW50BA0kdDA0MjMyNjQyODIxAwkBAiE9AgULX2FydGlmYWN0SWQCAAQMYXJ0aWZhY3RLaW5kCQEEc3RyQQIJARFuZnRNYW5hZ2VyQWRkcmVzcwAJAQ50b0NvbXBvc2l0ZUtleQIFDGtfdG9rZW5fdHlwZQULX2FydGlmYWN0SWQDCQAAAgUMYXJ0aWZhY3RLaW5kBRhGRUVfUkVEVUNUSU9OX1RPS0VOX1RZUEUECXJlZHVjdGlvbgkBBGludEECCQERbmZ0TWFuYWdlckFkZHJlc3MACQEOdG9Db21wb3NpdGVLZXkCBQ1rX3Rva2VuX3BhcmFtBQtfYXJ0aWZhY3RJZAQLYWRqdXN0ZWRGZWUJAQRtdWxkAgUHYmFzZUZlZQUJcmVkdWN0aW9uCQCUCgIFC2FkanVzdGVkRmVlBgkAAgECGUludmFsaWQgYXR0YWNoZWQgYXJ0aWZhY3QJAJQKAgUHYmFzZUZlZQcEC2FkanVzdGVkRmVlCAUNJHQwNDIzMjY0MjgyMQJfMQQMYnVybkFydGlmYWN0CAUNJHQwNDIzMjY0MjgyMQJfMgkAlAoCBQthZGp1c3RlZEZlZQUMYnVybkFydGlmYWN0ARhnZXRGb3JUcmFkZXJXaXRoQXJ0aWZhY3QCB190cmFkZXILX2FydGlmYWN0SWQEEGRvR2V0RmVlRGlzY291bnQJAPwHBAkBDG1pbmVyQWRkcmVzcwACEmNvbXB1dGVGZWVEaXNjb3VudAkAzAgCBQdfdHJhZGVyBQNuaWwFA25pbAMJAAACBRBkb0dldEZlZURpc2NvdW50BRBkb0dldEZlZURpc2NvdW50BAtmZWVEaXNjb3VudAQHJG1hdGNoMAUQZG9HZXRGZWVEaXNjb3VudAMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAFAXgJAAIBAiFJbnZhbGlkIGNvbXB1dGVGZWVEaXNjb3VudCByZXN1bHQEDSR0MDQzMTY3NDMyNDEJAQ5nZXRBZGp1c3RlZEZlZQIFC19hcnRpZmFjdElkBQtmZWVEaXNjb3VudAQLYWRqdXN0ZWRGZWUIBQ0kdDA0MzE2NzQzMjQxAl8xBAxidXJuQXJ0aWZhY3QIBQ0kdDA0MzE2NzQzMjQxAl8yCQCUCgIFC2FkanVzdGVkRmVlBQxidXJuQXJ0aWZhY3QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDWdldEFydGlmYWN0SWQBAWkECmFydGlmYWN0SWQDCQBmAgkAkAMBCAUBaQhwYXltZW50cwABCQDYBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggJAJEDAggFAWkIcGF5bWVudHMAAQdhc3NldElkAhJJbnZhbGlkIGFydGlmYWN0SWQCAAUKYXJ0aWZhY3RJZAENZGlzdHJpYnV0ZUZlZQEKX2ZlZUFtb3VudAQMZmVlVG9TdGFrZXJzCQEEbXVsZAIFCl9mZWVBbW91bnQJARNmZWVUb1N0YWtlcnNQZXJjZW50AAQKZmVlVG9WYXVsdAkAZQIFCl9mZWVBbW91bnQFDGZlZVRvU3Rha2VycwkAlAoCBQxmZWVUb1N0YWtlcnMFCmZlZVRvVmF1bHQBDnVwZGF0ZVNldHRpbmdzDxBfaW5pdE1hcmdpblJhdGlvBF9tbXIUX2xpcXVpZGF0aW9uRmVlUmF0aW8OX2Z1bmRpbmdQZXJpb2QEX2ZlZQxfc3ByZWFkTGltaXQPX21heFByaWNlSW1wYWN0GF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbw9fbWF4UHJpY2VTcHJlYWQQX21heE9wZW5Ob3Rpb25hbBRfZmVlVG9TdGFrZXJzUGVyY2VudA9fbWF4T3JhY2xlRGVsYXkMX3JvbGxvdmVyRmVlDF9mdW5kaW5nTW9kZQtfb3JhY2xlTW9kZQkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19pbml0TWFyZ2luUmF0aW8FEF9pbml0TWFyZ2luUmF0aW8JAMwIAgkBDEludGVnZXJFbnRyeQIFGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwUEX21tcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa19saXF1aWRhdGlvbkZlZVJhdGlvBRRfbGlxdWlkYXRpb25GZWVSYXRpbwkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa19mdW5kaW5nUGVyaW9kBQ5fZnVuZGluZ1BlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUFa19mZWUFBF9mZWUJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfc3ByZWFkTGltaXQFDF9zcHJlYWRMaW1pdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa19tYXhQcmljZUltcGFjdAUPX21heFByaWNlSW1wYWN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlrX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBRhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8JAMwIAgkBDEludGVnZXJFbnRyeQIFEGtfbWF4UHJpY2VTcHJlYWQFD19tYXhQcmljZVNwcmVhZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19tYXhPcGVuTm90aW9uYWwFEF9tYXhPcGVuTm90aW9uYWwJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtfZmVlVG9TdGFrZXJzUGVyY2VudAUUX2ZlZVRvU3Rha2Vyc1BlcmNlbnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtfbWF4T3JhY2xlRGVsYXkFD19tYXhPcmFjbGVEZWxheQkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa19yb2xsb3ZlckZlZQUMX3JvbGxvdmVyRmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rX2Z1bmRpbmdNb2RlBQxfZnVuZGluZ01vZGUJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtfb3JhY2xlTW9kZQULX29yYWNsZU1vZGUFA25pbAENdXBkYXRlRnVuZGluZwURX25leHRGdW5kaW5nQmxvY2skX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uJV9sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24QX2xvbmdGdW5kaW5nUmF0ZRFfc2hvcnRGdW5kaW5nUmF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa19uZXh0RnVuZGluZ0Jsb2NrBRFfbmV4dEZ1bmRpbmdCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgUla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUkX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCBSZrX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUlX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19sb25nRnVuZGluZ1JhdGUFEF9sb25nRnVuZGluZ1JhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfc2hvcnRGdW5kaW5nUmF0ZQURX3Nob3J0RnVuZGluZ1JhdGUFA25pbAEfaW5jcmVtZW50UG9zaXRpb25TZXF1ZW5jZU51bWJlcgMOX2lzTmV3UG9zaXRpb24HX3RyYWRlcgpfZGlyZWN0aW9uBAtwb3NpdGlvbktleQkArAICCQCsAgIFB190cmFkZXICAV8JAKQDAQUKX2RpcmVjdGlvbgMFDl9pc05ld1Bvc2l0aW9uBA9jdXJyZW50U2VxdWVuY2UJAQxsYXN0U2VxdWVuY2UACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRJrX3Bvc2l0aW9uU2VxdWVuY2UFC3Bvc2l0aW9uS2V5CQBkAgUPY3VycmVudFNlcXVlbmNlAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFCmtfc2VxdWVuY2UJAGQCBQ9jdXJyZW50U2VxdWVuY2UAAQUDbmlsBQNuaWwBEXVwZGF0ZVBvc2l0aW9uRmVlBA5faXNOZXdQb3NpdGlvbgdfdHJhZGVyCl9kaXJlY3Rpb24EX2ZlZQQLcG9zaXRpb25LZXkJAKwCAgkArAICBQdfdHJhZGVyAgFfCQCkAwEFCl9kaXJlY3Rpb24DBQ5faXNOZXdQb3NpdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUNa19wb3NpdGlvbkZlZQULcG9zaXRpb25LZXkFBF9mZWUFA25pbAUDbmlsAQ51cGRhdGVQb3NpdGlvbgYHX3RyYWRlcgVfc2l6ZQdfbWFyZ2luDV9vcGVuTm90aW9uYWwgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24QX2xhdGVzdFRpbWVzdGFtcAQJZGlyZWN0aW9uCQEMZ2V0RGlyZWN0aW9uAQUFX3NpemUEC3Bvc2l0aW9uS2V5CQCsAgIJAKwCAgUHX3RyYWRlcgIBXwkApAMBBQlkaXJlY3Rpb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQtwb3NpdGlvbktleQUFX3NpemUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25NYXJnaW4FC3Bvc2l0aW9uS2V5BQdfbWFyZ2luCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQtwb3NpdGlvbktleQUNX29wZW5Ob3Rpb25hbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgULcG9zaXRpb25LZXkFIF9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBR5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRUaW1lc3RhbXAFC3Bvc2l0aW9uS2V5BRBfbGF0ZXN0VGltZXN0YW1wBQNuaWwBEXVwZGF0ZUFtbVJlc2VydmVzAgdfcXRBc3RSB19ic0FzdFIDAwkAZgIAAAUHX3F0QXN0UgYJAGYCAAAFB19ic0FzdFIJAAIBAiFJbnZhbGlkIGFtb3VudCB0byB1cGRhdGUgcmVzZXJ2ZXMDAwkBAiE9AgUHX3F0QXN0UgkBB3F0QXN0UjAABgkBAiE9AgUHX2JzQXN0UgkBB2JzQXN0UjAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrX3F1b3RlQXNzZXRSZXNlcnZlBQdfcXRBc3RSCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrX2Jhc2VBc3NldFJlc2VydmUFB19ic0FzdFIFA25pbAUDbmlsARB1cGRhdGVBbW1XZWlnaHRzAgdfcXRBc3RXB19ic0FzdFcDAwkBAiE9AgUHX3F0QXN0VwkBBnF0QXN0VwAGCQECIT0CBQdfYnNBc3RXCQEGYnNBc3RXAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa19xdW90ZUFzc2V0V2VpZ2h0BQdfcXRBc3RXCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrX2Jhc2VBc3NldFdlaWdodAUHX2JzQXN0VwUDbmlsBQNuaWwBCXVwZGF0ZUFtbQgHX3F0QXN0UgdfYnNBc3RSF190b3RhbFBvc2l0aW9uU2l6ZUFmdGVyFV9vcGVuSW50ZXJlc3ROb3Rpb25hbBZfdG90YWxMb25nUG9zaXRpb25TaXplF190b3RhbFNob3J0UG9zaXRpb25TaXplFl90b3RhbExvbmdPcGVuTm90aW9uYWwXX3RvdGFsU2hvcnRPcGVuTm90aW9uYWwEB19xdEFzdFcJAQZxdEFzdFcABAdfYnNBc3RXCQEGYnNBc3RXAAMJAQIhPQIJAGUCBRZfdG90YWxMb25nUG9zaXRpb25TaXplBRdfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQUXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIYSW52YWxpZCBBTU0gc3RhdGUgZGF0YTogCQCkAwEFFl90b3RhbExvbmdQb3NpdGlvblNpemUCBCAtICAJAKQDAQUXX3RvdGFsU2hvcnRQb3NpdGlvblNpemUCBCAhPSAJAKQDAQUXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIJAM4IAgkBEXVwZGF0ZUFtbVJlc2VydmVzAgUHX3F0QXN0UgUHX2JzQXN0UgkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa190b3RhbFBvc2l0aW9uU2l6ZQUXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFFmtfb3BlbkludGVyZXN0Tm90aW9uYWwFFV9vcGVuSW50ZXJlc3ROb3Rpb25hbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUXa190b3RhbExvbmdQb3NpdGlvblNpemUFFl90b3RhbExvbmdQb3NpdGlvblNpemUJAMwIAgkBDEludGVnZXJFbnRyeQIFGGtfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQUXX3RvdGFsU2hvcnRQb3NpdGlvblNpemUJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfb3BlbkludGVyZXN0TG9uZwUWX3RvdGFsTG9uZ09wZW5Ob3Rpb25hbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa19vcGVuSW50ZXJlc3RTaG9ydAUXX3RvdGFsU2hvcnRPcGVuTm90aW9uYWwFA25pbAEOZGVsZXRlUG9zaXRpb24CB190cmFkZXIKX2RpcmVjdGlvbgQLcG9zaXRpb25LZXkJAKwCAgkArAICBQdfdHJhZGVyAgFfCQCkAwEFCl9kaXJlY3Rpb24JAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFC3Bvc2l0aW9uS2V5CQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25NYXJnaW4FC3Bvc2l0aW9uS2V5CQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFFmtfcG9zaXRpb25PcGVuTm90aW9uYWwFC3Bvc2l0aW9uS2V5CQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFLmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FC3Bvc2l0aW9uS2V5CQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFDWtfcG9zaXRpb25GZWUFC3Bvc2l0aW9uS2V5CQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFHmtfcG9zaXRpb25MYXN0VXBkYXRlZFRpbWVzdGFtcAULcG9zaXRpb25LZXkFA25pbAEId2l0aGRyYXcCCF9hZGRyZXNzB19hbW91bnQEB2JhbGFuY2UJAPAHAgUEdGhpcwkBCnF1b3RlQXNzZXQAAwkAZgIFB19hbW91bnQFB2JhbGFuY2UJAAIBCQCsAgIJAKwCAgkArAICAhNVbmFibGUgdG8gd2l0aGRyYXcgCQCkAwEFB19hbW91bnQCFyBmcm9tIGNvbnRyYWN0IGJhbGFuY2UgCQCkAwEFB2JhbGFuY2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIX2FkZHJlc3MFB19hbW91bnQJAQpxdW90ZUFzc2V0AAUDbmlsAQ11cGRhdGVCYWxhbmNlAQhfYmFsYW5jZQMJAGYCAAAFCF9iYWxhbmNlCQACAQIHQmFsYW5jZQMDCQAAAgkBCWNiYWxhbmNlMAAAAAYJAQIhPQIJAQljYmFsYW5jZTAABQhfYmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa19iYWxhbmNlBQhfYmFsYW5jZQUDbmlsBQNuaWwBC3RyYW5zZmVyRmVlAQFpCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQ5zdGFraW5nQWRkcmVzcwAFAWkJAQpxdW90ZUFzc2V0AAUDbmlsAQ5kb0J1cm5BcnRpZmFjdAINX2J1cm5BcnRpZmFjdAFpAwUNX2J1cm5BcnRpZmFjdAkAzAgCCQEEQnVybgIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggJAJEDAggFAWkIcGF5bWVudHMAAQdhc3NldElkAhBJbnZhbGlkIGFydGlmYWN0AAEFA25pbAUDbmlsFwFpAQVwYXVzZQADCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIUSW52YWxpZCBwYXVzZSBwYXJhbXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCGtfcGF1c2VkBgUDbmlsAWkBB3VucGF1c2UAAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECFkludmFsaWQgdW5wYXVzZSBwYXJhbXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCGtfcGF1c2VkBwUDbmlsAWkBDHNldENsb3NlT25seQADCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIbSW52YWxpZCBzZXRDbG9zZU9ubHkgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQtrX2Nsb3NlT25seQYFA25pbAFpAQ51bnNldENsb3NlT25seQADCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIdSW52YWxpZCB1bnNldENsb3NlT25seSBwYXJhbXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFC2tfY2xvc2VPbmx5BwUDbmlsAWkBD2NoYW5nZUxpcXVpZGl0eQERX3F1b3RlQXNzZXRBbW91bnQDAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAYJAAACBRFfcXVvdGVBc3NldEFtb3VudAAACQACAQIeSW52YWxpZCBjaGFuZ2VMaXF1aWRpdHkgcGFyYW1zBAdfcXRBc3RSCQEGcXRBc3RSAAQHX2JzQXN0UgkBBmJzQXN0UgAEB19xdEFzdFcJAQZxdEFzdFcABAdfYnNBc3RXCQEGYnNBc3RXAAQFcHJpY2UJAQRkaXZkAgkBBG11bGQCBQdfcXRBc3RSBQdfcXRBc3RXCQEEbXVsZAIFB19ic0FzdFIFB19ic0FzdFcEC3F0QXN0UkFmdGVyCQBkAgUHX3F0QXN0UgURX3F1b3RlQXNzZXRBbW91bnQEFGJhc2VBc3NldEFtb3VudFRvQWRkCQBlAgkBBGRpdmQCCQEEbXVsZAIFC3F0QXN0UkFmdGVyBQdfcXRBc3RXBQVwcmljZQUHX2JzQXN0UgQLYnNBc3RSQWZ0ZXIJAGQCBQdfYnNBc3RSBRRiYXNlQXNzZXRBbW91bnRUb0FkZAQNJHQwNTE5NjY1MjExNwkBFGdldFN5bmNUZXJtaW5hbFByaWNlAwkBDmdldE9yYWNsZVByaWNlAAULcXRBc3RSQWZ0ZXIFC2JzQXN0UkFmdGVyBBNuZXdRdW90ZUFzc2V0V2VpZ2h0CAUNJHQwNTE5NjY1MjExNwJfMQQSbmV3QmFzZUFzc2V0V2VpZ2h0CAUNJHQwNTE5NjY1MjExNwJfMgQNbWFyZ2luVG9WYXVsdAgFDSR0MDUxOTY2NTIxMTcCXzMEDWRvRXhjaGFuZ2VQbkwDCQECIT0CBQ1tYXJnaW5Ub1ZhdWx0AAAEDWRvRXhjaGFuZ2VQbkwJAPwHBAkBDHZhdWx0QWRkcmVzcwACFWV4Y2hhbmdlRnJlZUFuZExvY2tlZAkAzAgCBQ1tYXJnaW5Ub1ZhdWx0BQNuaWwFA25pbAMJAAACBQ1kb0V4Y2hhbmdlUG5MBQ1kb0V4Y2hhbmdlUG5MBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQ1kb0V4Y2hhbmdlUG5MBQ1kb0V4Y2hhbmdlUG5MCQDOCAIJARF1cGRhdGVBbW1SZXNlcnZlcwIFC3F0QXN0UkFmdGVyBQtic0FzdFJBZnRlcgkBEHVwZGF0ZUFtbVdlaWdodHMCBRNuZXdRdW90ZUFzc2V0V2VpZ2h0BRJuZXdCYXNlQXNzZXRXZWlnaHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY2hhbmdlU2V0dGluZ3MPEF9pbml0TWFyZ2luUmF0aW8EX21tchRfbGlxdWlkYXRpb25GZWVSYXRpbw5fZnVuZGluZ1BlcmlvZARfZmVlDF9zcHJlYWRMaW1pdA9fbWF4UHJpY2VJbXBhY3QYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvD19tYXhQcmljZVNwcmVhZBBfbWF4T3Blbk5vdGlvbmFsFF9mZWVUb1N0YWtlcnNQZXJjZW50D19tYXhPcmFjbGVEZWxheQxfcm9sbG92ZXJGZWUMX2Z1bmRpbmdNb2RlC19vcmFjbGVNb2RlAwMDAwMDAwMDAwMDAwMDAwMDCQBnAgAABQ5fZnVuZGluZ1BlcmlvZAYJAGcCAAAFEF9pbml0TWFyZ2luUmF0aW8GCQBnAgAABQRfbW1yBgkAZwIAAAUUX2xpcXVpZGF0aW9uRmVlUmF0aW8GCQBnAgAABQRfZmVlBgkAZwIAAAUMX3NwcmVhZExpbWl0BgkAZwIAAAUPX21heFByaWNlSW1wYWN0BgkAZwIAAAUYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBgkAZwIAAAUPX21heFByaWNlU3ByZWFkBgkAZwIAAAUQX21heE9wZW5Ob3Rpb25hbAYJAGcCAAAFFF9mZWVUb1N0YWtlcnNQZXJjZW50BgkAZgIFFF9mZWVUb1N0YWtlcnNQZXJjZW50BQxERUNJTUFMX1VOSVQGCQBnAgAABQ9fbWF4T3JhY2xlRGVsYXkGCQBnAgAABQxfcm9sbG92ZXJGZWUGAwkBAiE9AgUMX2Z1bmRpbmdNb2RlBRFGVU5ESU5HX1NZTU1FVFJJQwkBAiE9AgUMX2Z1bmRpbmdNb2RlBRJGVU5ESU5HX0FTWU1NRVRSSUMHBgMJAQIhPQIFC19vcmFjbGVNb2RlBQxPUkFDTEVfUExBSU4JAQIhPQIFC19vcmFjbGVNb2RlBQpPUkFDTEVfSklUBwYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAh1JbnZhbGlkIGNoYW5nZVNldHRpbmdzIHBhcmFtcwkBDnVwZGF0ZVNldHRpbmdzDwUQX2luaXRNYXJnaW5SYXRpbwUEX21tcgUUX2xpcXVpZGF0aW9uRmVlUmF0aW8FDl9mdW5kaW5nUGVyaW9kBQRfZmVlBQxfc3ByZWFkTGltaXQFD19tYXhQcmljZUltcGFjdAUYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBQ9fbWF4UHJpY2VTcHJlYWQFEF9tYXhPcGVuTm90aW9uYWwFFF9mZWVUb1N0YWtlcnNQZXJjZW50BQ9fbWF4T3JhY2xlRGVsYXkFDF9yb2xsb3ZlckZlZQUMX2Z1bmRpbmdNb2RlBQtfb3JhY2xlTW9kZQFpAQppbml0aWFsaXplFAdfcXRBc3RSB19ic0FzdFIOX2Z1bmRpbmdQZXJpb2QQX2luaXRNYXJnaW5SYXRpbwRfbW1yFF9saXF1aWRhdGlvbkZlZVJhdGlvBF9mZWUPX2Jhc2VPcmFjbGVEYXRhEF9xdW90ZU9yYWNsZURhdGEMX2Nvb3JkaW5hdG9yDF9zcHJlYWRMaW1pdA9fbWF4UHJpY2VJbXBhY3QYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvD19tYXhQcmljZVNwcmVhZBBfbWF4T3Blbk5vdGlvbmFsFF9mZWVUb1N0YWtlcnNQZXJjZW50D19tYXhPcmFjbGVEZWxheQxfcm9sbG92ZXJGZWUMX2Z1bmRpbmdNb2RlC19vcmFjbGVNb2RlAwMDAwMDAwMDAwMDAwMDAwMDAwMJAGcCAAAFB19xdEFzdFIGCQBnAgAABQdfYnNBc3RSBgkAZwIAAAUOX2Z1bmRpbmdQZXJpb2QGCQBnAgAABRBfaW5pdE1hcmdpblJhdGlvBgkAZwIAAAUEX21tcgYJAGcCAAAFFF9saXF1aWRhdGlvbkZlZVJhdGlvBgkAZwIAAAUEX2ZlZQYJAGcCAAAFDF9zcHJlYWRMaW1pdAYJAGcCAAAFD19tYXhQcmljZUltcGFjdAYJAGcCAAAFGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwYJAGcCAAAFD19tYXhQcmljZVNwcmVhZAYJAGcCAAAFEF9tYXhPcGVuTm90aW9uYWwGCQBnAgAABRRfZmVlVG9TdGFrZXJzUGVyY2VudAYJAGYCBRRfZmVlVG9TdGFrZXJzUGVyY2VudAUMREVDSU1BTF9VTklUBgkAZgIAAAUPX21heE9yYWNsZURlbGF5BgkAZwIAAAUMX3JvbGxvdmVyRmVlBgMJAQIhPQIFDF9mdW5kaW5nTW9kZQURRlVORElOR19TWU1NRVRSSUMJAQIhPQIFDF9mdW5kaW5nTW9kZQUSRlVORElOR19BU1lNTUVUUklDBwYDCQECIT0CBQtfb3JhY2xlTW9kZQUMT1JBQ0xFX1BMQUlOCQECIT0CBQtfb3JhY2xlTW9kZQUKT1JBQ0xFX0pJVAcGCQELaW5pdGlhbGl6ZWQABgkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIdSW52YWxpZCBpbml0aWFsaXplIHBhcmFtZXRlcnMJAM4IAgkAzggCCQDOCAIJAM4IAgkBCXVwZGF0ZUFtbQgFB19xdEFzdFIFB19ic0FzdFIAAAAAAAAAAAAAAAAJAQ51cGRhdGVTZXR0aW5ncw8FEF9pbml0TWFyZ2luUmF0aW8FBF9tbXIFFF9saXF1aWRhdGlvbkZlZVJhdGlvBQ5fZnVuZGluZ1BlcmlvZAUEX2ZlZQUMX3NwcmVhZExpbWl0BQ9fbWF4UHJpY2VJbXBhY3QFGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwUPX21heFByaWNlU3ByZWFkBRBfbWF4T3Blbk5vdGlvbmFsBRRfZmVlVG9TdGFrZXJzUGVyY2VudAUPX21heE9yYWNsZURlbGF5BQxfcm9sbG92ZXJGZWUFDF9mdW5kaW5nTW9kZQULX29yYWNsZU1vZGUJAQ11cGRhdGVGdW5kaW5nBQkAZAIJAQ1sYXN0VGltZXN0YW1wAAUOX2Z1bmRpbmdQZXJpb2QAAAAAAAAAAAkBDXVwZGF0ZUJhbGFuY2UBAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtfaW5pdGlhbGl6ZWQGCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtfYmFzZU9yYWNsZQUPX2Jhc2VPcmFjbGVEYXRhCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtfcXVvdGVPcmFjbGUFEF9xdW90ZU9yYWNsZURhdGEJAMwIAgkBC1N0cmluZ0VudHJ5AgUUa19jb29yZGluYXRvckFkZHJlc3MJAKUIAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUMX2Nvb3JkaW5hdG9yBQNuaWwBaQEQaW5jcmVhc2VQb3NpdGlvbgUKX2RpcmVjdGlvbglfbGV2ZXJhZ2UTX21pbkJhc2VBc3NldEFtb3VudAhfcmVmTGluawxfcHJpY2VVcGRhdGUEDHVwZGF0ZU9yYWNsZQkA/AcEBQR0aGlzAgx1cGRhdGVPcmFjbGUJAMwIAgUMX3ByaWNlVXBkYXRlBQNuaWwFA25pbAMJAAACBQx1cGRhdGVPcmFjbGUFDHVwZGF0ZU9yYWNsZQQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBBBlbnN1cmVDYWxsZWRPbmNlCQD8BwQFBHRoaXMCEGVuc3VyZUNhbGxlZE9uY2UFA25pbAUDbmlsAwkAAAIFEGVuc3VyZUNhbGxlZE9uY2UFEGVuc3VyZUNhbGxlZE9uY2UEB190cmFkZXIJAQ9nZXRBY3R1YWxDYWxsZXIBBQFpBApfcmF3QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQIX2Fzc2V0SWQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLX2Fzc2V0SWRTdHIJANgEAQkBBXZhbHVlAQUIX2Fzc2V0SWQEDGlzUXVvdGVBc3NldAkAAAIFCF9hc3NldElkCQEKcXVvdGVBc3NldAADAwMDAwMDAwMJAQIhPQIFCl9kaXJlY3Rpb24FCERJUl9MT05HCQECIT0CBQpfZGlyZWN0aW9uBQlESVJfU0hPUlQHBgkAZwIAAAUKX3Jhd0Ftb3VudAYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQEhAQUMaXNRdW90ZUFzc2V0BgkBASEBCQEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMJAQRkaXZkAgUMREVDSU1BTF9VTklUBQlfbGV2ZXJhZ2UJAQ9pbml0TWFyZ2luUmF0aW8ABgYJAQZwYXVzZWQABgkBCWNsb3NlT25seQAGCQEOaXNNYXJrZXRDbG9zZWQACQACAQIjSW52YWxpZCBpbmNyZWFzZVBvc2l0aW9uIHBhcmFtZXRlcnMEDSR0MDU4NDkzNTg2NDIJARhnZXRGb3JUcmFkZXJXaXRoQXJ0aWZhY3QCBQdfdHJhZGVyCQENZ2V0QXJ0aWZhY3RJZAEFAWkEC2FkanVzdGVkRmVlCAUNJHQwNTg0OTM1ODY0MgJfMQQMYnVybkFydGlmYWN0CAUNJHQwNTg0OTM1ODY0MgJfMgQHX2Ftb3VudAkBBGRpdmQCBQpfcmF3QW1vdW50CQBkAgkBBG11bGQCBQthZGp1c3RlZEZlZQUJX2xldmVyYWdlBQxERUNJTUFMX1VOSVQEE2Rpc3RyaWJ1dGVGZWVBbW91bnQJAGUCBQpfcmF3QW1vdW50BQdfYW1vdW50BA5yZWZlcnJlckZlZUFueQkA/AcECQEPcmVmZXJyYWxBZGRyZXNzAAIVYWNjZXB0UGF5bWVudFdpdGhMaW5rCQDMCAIFB190cmFkZXIJAMwIAgUIX3JlZkxpbmsFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABRNkaXN0cmlidXRlRmVlQW1vdW50BQNuaWwDCQAAAgUOcmVmZXJyZXJGZWVBbnkFDnJlZmVycmVyRmVlQW55BAtyZWZlcnJlckZlZQQHJG1hdGNoMAUOcmVmZXJyZXJGZWVBbnkDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4CQACAQITSW52YWxpZCByZWZlcnJlckZlZQQJZmVlQW1vdW50CQBlAgUTZGlzdHJpYnV0ZUZlZUFtb3VudAULcmVmZXJyZXJGZWUEDSR0MDU5MTM4NTkzMTgJAQtnZXRQb3NpdGlvbgIFB190cmFkZXIFCl9kaXJlY3Rpb24ED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDU5MTM4NTkzMTgCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNTkxMzg1OTMxOAJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA1OTEzODU5MzE4Al8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDU5MTM4NTkzMTgCXzQEFG9sZFBvc2l0aW9uVGltZXN0YW1wCAUNJHQwNTkxMzg1OTMxOAJfNQQNaXNOZXdQb3NpdGlvbgkAAAIFD29sZFBvc2l0aW9uU2l6ZQAABA9pc1NhbWVEaXJlY3Rpb24DCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAAACBQpfZGlyZWN0aW9uBQhESVJfTE9ORwkAAAIFCl9kaXJlY3Rpb24FCURJUl9TSE9SVAQOZXhwYW5kRXhpc3RpbmcDCQEBIQEFDWlzTmV3UG9zaXRpb24FD2lzU2FtZURpcmVjdGlvbgcEBWlzQWRkCQAAAgUKX2RpcmVjdGlvbgUIRElSX0xPTkcEDSR0MDU5NjA3NjI3NDADAwUNaXNOZXdQb3NpdGlvbgYFDmV4cGFuZEV4aXN0aW5nBAxvcGVuTm90aW9uYWwJAQRtdWxkAgUHX2Ftb3VudAUJX2xldmVyYWdlBA0kdDA2MDExNjYwMjg5CQEJc3dhcElucHV0AgUFaXNBZGQFDG9wZW5Ob3Rpb25hbAQVYW1vdW50QmFzZUFzc2V0Qm91Z2h0CAUNJHQwNjAxMTY2MDI4OQJfMQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDYwMTE2NjAyODkCXzIEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDYwMTE2NjAyODkCXzMEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA2MDExNjYwMjg5Al80AwMJAQIhPQIFE19taW5CYXNlQXNzZXRBbW91bnQAAAkAZgIFE19taW5CYXNlQXNzZXRBbW91bnQJAQNhYnMBBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQHCQACAQkArAICCQCsAgIJAKwCAgINTGltaXQgZXJyb3I6IAkApAMBCQEDYWJzAQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AgMgPCAJAKQDAQUTX21pbkJhc2VBc3NldEFtb3VudAQPbmV3UG9zaXRpb25TaXplCQBkAgUPb2xkUG9zaXRpb25TaXplBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQEGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyCQBkAgkBEG9wZW5JbnRlcmVzdExvbmcAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAABQxvcGVuTm90aW9uYWwAAAQbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCQBkAgkBEW9wZW5JbnRlcmVzdFNob3J0AAMJAGYCAAAFD25ld1Bvc2l0aW9uU2l6ZQUMb3Blbk5vdGlvbmFsAAAEDSR0MDYwODM1NjExMTAJATBjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50QW5kUm9sbG92ZXJGZWUFBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgUUb2xkUG9zaXRpb25UaW1lc3RhbXAFB19hbW91bnQEDHJlbWFpbk1hcmdpbggFDSR0MDYwODM1NjExMTACXzEEAngxCAUNJHQwNjA4MzU2MTExMAJfMgQCeDIIBQ0kdDA2MDgzNTYxMTEwAl8zBAtyb2xsb3ZlckZlZQgFDSR0MDYwODM1NjExMTACXzQDCQEBIQEJARlyZXF1aXJlTm90T3ZlclNwcmVhZExpbWl0AgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCQACAQIVT3ZlciBtYXggc3ByZWFkIGxpbWl0AwkBASEBCQEdcmVxdWlyZU5vdE92ZXJNYXhPcGVuTm90aW9uYWwCBRp0b3RhbExvbmdPcGVuSW50ZXJlc3RBZnRlcgUbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCQACAQIWT3ZlciBtYXggb3BlbiBub3Rpb25hbAkAoAoOBQ9uZXdQb3NpdGlvblNpemUFDHJlbWFpbk1hcmdpbgkAZAIFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPbmV3UG9zaXRpb25TaXplCQENbGFzdFRpbWVzdGFtcAAFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgkAZAIJARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAFDG9wZW5Ob3Rpb25hbAkAZAIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAACQEDYWJzAQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AAAJAGQCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQBmAgAABQ9uZXdQb3NpdGlvblNpemUJAQNhYnMBBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQAAAUadG90YWxMb25nT3BlbkludGVyZXN0QWZ0ZXIFG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcgULcm9sbG92ZXJGZWUEDG9wZW5Ob3Rpb25hbAkBBG11bGQCBQdfYW1vdW50BQlfbGV2ZXJhZ2UEDSR0MDYyNDI4NjI1NTYJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAMJAKUIAQgFAWkGY2FsbGVyBQpfZGlyZWN0aW9uBQ9QTkxfT1BUSU9OX1NQT1QEE29sZFBvc2l0aW9uTm90aW9uYWwIBQ0kdDA2MjQyODYyNTU2Al8xBA11bnJlYWxpemVkUG5sCAUNJHQwNjI0Mjg2MjU1NgJfMgMJAGYCBRNvbGRQb3NpdGlvbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwJAAIBAi5Vc2UgZGVjcmVhc2VQb3NpdGlvbiB0byBkZWNyZWFzZSBwb3NpdGlvbiBzaXplCQACAQIUQ2xvc2UgcG9zaXRpb24gZmlyc3QED25ld1Bvc2l0aW9uU2l6ZQgFDSR0MDU5NjA3NjI3NDACXzEEF25ld1Bvc2l0aW9uUmVtYWluTWFyZ2luCAUNJHQwNTk2MDc2Mjc0MAJfMgQXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA1OTYwNzYyNzQwAl8zBBRuZXdQb3NpdGlvbkxhdGVzdENQRggFDSR0MDU5NjA3NjI3NDACXzQEFG5ld1Bvc2l0aW9uVGltZXN0YW1wCAUNJHQwNTk2MDc2Mjc0MAJfNQQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNTk2MDc2Mjc0MAJfNgQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDU5NjA3NjI3NDACXzcEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA1OTYwNzYyNzQwAl84BBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCAUNJHQwNTk2MDc2Mjc0MAJfOQQOdG90YWxMb25nQWZ0ZXIIBQ0kdDA1OTYwNzYyNzQwA18xMAQPdG90YWxTaG9ydEFmdGVyCAUNJHQwNTk2MDc2Mjc0MANfMTEEGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyCAUNJHQwNTk2MDc2Mjc0MANfMTIEG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcggFDSR0MDU5NjA3NjI3NDADXzEzBAtyb2xsb3ZlckZlZQgFDSR0MDU5NjA3NjI3NDADXzE0BA0kdDA2Mjc0NjYyODE3CQENZGlzdHJpYnV0ZUZlZQEJAGQCBQlmZWVBbW91bnQFC3JvbGxvdmVyRmVlBAxmZWVUb1N0YWtlcnMIBQ0kdDA2Mjc0NjYyODE3Al8xBApmZWVUb1ZhdWx0CAUNJHQwNjI3NDY2MjgxNwJfMgQFc3Rha2UDCQBnAgUHX2Ftb3VudAULcm9sbG92ZXJGZWUJAPwHBAkBDHZhdWx0QWRkcmVzcwACCWFkZExvY2tlZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAJAGUCBQdfYW1vdW50BQtyb2xsb3ZlckZlZQUDbmlsCQD8BwQJAQx2YXVsdEFkZHJlc3MAAg53aXRoZHJhd0xvY2tlZAkAzAgCCQBlAgULcm9sbG92ZXJGZWUFB19hbW91bnQFA25pbAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQQMZGVwb3NpdFZhdWx0CQD8BwQJAQx2YXVsdEFkZHJlc3MAAgdhZGRGcmVlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUKZmVlVG9WYXVsdAUDbmlsAwkAAAIFDGRlcG9zaXRWYXVsdAUMZGVwb3NpdFZhdWx0BAlub3RpZnlGZWUJAPwHBAkBDG1pbmVyQWRkcmVzcwACCm5vdGlmeUZlZXMJAMwIAgUHX3RyYWRlcgkAzAgCBQlmZWVBbW91bnQFA25pbAUDbmlsAwkAAAIFCW5vdGlmeUZlZQUJbm90aWZ5RmVlBA5ub3RpZnlOb3Rpb25hbAkA/AcECQEMbWluZXJBZGRyZXNzAAIObm90aWZ5Tm90aW9uYWwJAMwIAgUHX3RyYWRlcgkAzAgCBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUDbmlsBQNuaWwDCQAAAgUObm90aWZ5Tm90aW9uYWwFDm5vdGlmeU5vdGlvbmFsCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQEOdXBkYXRlUG9zaXRpb24GBQdfdHJhZGVyBQ9uZXdQb3NpdGlvblNpemUFF25ld1Bvc2l0aW9uUmVtYWluTWFyZ2luBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUUbmV3UG9zaXRpb25MYXRlc3RDUEYFFG5ld1Bvc2l0aW9uVGltZXN0YW1wCQEfaW5jcmVtZW50UG9zaXRpb25TZXF1ZW5jZU51bWJlcgMFDWlzTmV3UG9zaXRpb24FB190cmFkZXIFCl9kaXJlY3Rpb24JARF1cGRhdGVQb3NpdGlvbkZlZQQFDWlzTmV3UG9zaXRpb24FB190cmFkZXIFCl9kaXJlY3Rpb24FC2FkanVzdGVkRmVlCQEJdXBkYXRlQW1tCAUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyBRp0b3RhbExvbmdPcGVuSW50ZXJlc3RBZnRlcgUbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCQELdHJhbnNmZXJGZWUBBQxmZWVUb1N0YWtlcnMJAQ11cGRhdGVCYWxhbmNlAQkAZQIJAGQCCQEIY2JhbGFuY2UABQdfYW1vdW50BQtyb2xsb3ZlckZlZQkBDmRvQnVybkFydGlmYWN0AgUMYnVybkFydGlmYWN0BQFpCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWFkZE1hcmdpbgIKX2RpcmVjdGlvbgxfcHJpY2VVcGRhdGUEDHVwZGF0ZU9yYWNsZQkA/AcEBQR0aGlzAgx1cGRhdGVPcmFjbGUJAMwIAgUMX3ByaWNlVXBkYXRlBQNuaWwFA25pbAMJAAACBQx1cGRhdGVPcmFjbGUFDHVwZGF0ZU9yYWNsZQQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBBBlbnN1cmVDYWxsZWRPbmNlCQD8BwQFBHRoaXMCEGVuc3VyZUNhbGxlZE9uY2UFA25pbAUDbmlsAwkAAAIFEGVuc3VyZUNhbGxlZE9uY2UFEGVuc3VyZUNhbGxlZE9uY2UEB190cmFkZXIJAKUIAQgFAWkGY2FsbGVyBAdfYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQIX2Fzc2V0SWQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLX2Fzc2V0SWRTdHIJANgEAQkBBXZhbHVlAQUIX2Fzc2V0SWQEDGlzUXVvdGVBc3NldAkAAAIFCF9hc3NldElkCQEKcXVvdGVBc3NldAADAwMDAwkBASEBBQxpc1F1b3RlQXNzZXQGCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAgkApQgBCAUBaQZjYWxsZXIFCl9kaXJlY3Rpb24GCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAYJAQ5pc01hcmtldENsb3NlZAAJAAIBAhxJbnZhbGlkIGFkZE1hcmdpbiBwYXJhbWV0ZXJzBA0kdDA2NTE1OTY1MzM5CQELZ2V0UG9zaXRpb24CBQdfdHJhZGVyBQpfZGlyZWN0aW9uBA9vbGRQb3NpdGlvblNpemUIBQ0kdDA2NTE1OTY1MzM5Al8xBBFvbGRQb3NpdGlvbk1hcmdpbggFDSR0MDY1MTU5NjUzMzkCXzIEF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwNjUxNTk2NTMzOQJfMwQUb2xkUG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDA2NTE1OTY1MzM5Al80BBRvbGRQb3NpdGlvblRpbWVzdGFtcAgFDSR0MDY1MTU5NjUzMzkCXzUEBXN0YWtlCQD8BwQJAQx2YXVsdEFkZHJlc3MAAglhZGRMb2NrZWQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQdfYW1vdW50BQNuaWwDCQAAAgUFc3Rha2UFBXN0YWtlBAtyb2xsb3ZlckZlZQkBD2NhbGNSb2xsb3ZlckZlZQIFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvblRpbWVzdGFtcAQWZG9UcmFuc2ZlckZlZVRvU3Rha2VycwMJAGYCBQtyb2xsb3ZlckZlZQAABA0kdDA2NTYyNDY1NjgzCQENZGlzdHJpYnV0ZUZlZQEFC3JvbGxvdmVyRmVlBAxmZWVUb1N0YWtlcnMIBQ0kdDA2NTYyNDY1NjgzAl8xBApmZWVUb1ZhdWx0CAUNJHQwNjU2MjQ2NTY4MwJfMgQHdW5zdGFrZQkA/AcECQEMdmF1bHRBZGRyZXNzAAIOd2l0aGRyYXdMb2NrZWQJAMwIAgUMZmVlVG9TdGFrZXJzBQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBAtsb2NrQmFkRGVidAkA/AcECQEMdmF1bHRBZGRyZXNzAAIVZXhjaGFuZ2VGcmVlQW5kTG9ja2VkCQDMCAIJAQEtAQUKZmVlVG9WYXVsdAUDbmlsBQNuaWwDCQAAAgULbG9ja0JhZERlYnQFC2xvY2tCYWREZWJ0CQELdHJhbnNmZXJGZWUBBQxmZWVUb1N0YWtlcnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBRZkb1RyYW5zZmVyRmVlVG9TdGFrZXJzBRZkb1RyYW5zZmVyRmVlVG9TdGFrZXJzCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBgUHX3RyYWRlcgUPb2xkUG9zaXRpb25TaXplCQBkAgkAZQIFEW9sZFBvc2l0aW9uTWFyZ2luBQtyb2xsb3ZlckZlZQUHX2Ftb3VudAUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwFFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCQENbGFzdFRpbWVzdGFtcAAJAQ11cGRhdGVCYWxhbmNlAQkAZQIJAGQCCQEIY2JhbGFuY2UABQdfYW1vdW50BQtyb2xsb3ZlckZlZQUWZG9UcmFuc2ZlckZlZVRvU3Rha2VycwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxyZW1vdmVNYXJnaW4DB19hbW91bnQKX2RpcmVjdGlvbgxfcHJpY2VVcGRhdGUEDHVwZGF0ZU9yYWNsZQkA/AcEBQR0aGlzAgx1cGRhdGVPcmFjbGUJAMwIAgUMX3ByaWNlVXBkYXRlBQNuaWwFA25pbAMJAAACBQx1cGRhdGVPcmFjbGUFDHVwZGF0ZU9yYWNsZQQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBBBlbnN1cmVDYWxsZWRPbmNlCQD8BwQFBHRoaXMCEGVuc3VyZUNhbGxlZE9uY2UFA25pbAUDbmlsAwkAAAIFEGVuc3VyZUNhbGxlZE9uY2UFEGVuc3VyZUNhbGxlZE9uY2UEB190cmFkZXIJAKUIAQgFAWkGY2FsbGVyAwMDAwMJAGcCAAAFB19hbW91bnQGCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAgUHX3RyYWRlcgUKX2RpcmVjdGlvbgYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQABgkBDmlzTWFya2V0Q2xvc2VkAAkAAgECH0ludmFsaWQgcmVtb3ZlTWFyZ2luIHBhcmFtZXRlcnMEDSR0MDY3MTg0NjczNjQJAQtnZXRQb3NpdGlvbgIFB190cmFkZXIFCl9kaXJlY3Rpb24ED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDY3MTg0NjczNjQCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNjcxODQ2NzM2NAJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA2NzE4NDY3MzY0Al8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDY3MTg0NjczNjQCXzQEFG9sZFBvc2l0aW9uVGltZXN0YW1wCAUNJHQwNjcxODQ2NzM2NAJfNQQNJHQwNjczNzA2NzYxOQkBMGNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnRBbmRSb2xsb3ZlckZlZQUFD29sZFBvc2l0aW9uU2l6ZQURb2xkUG9zaXRpb25NYXJnaW4FFG9sZFBvc2l0aW9uTHN0VXBkQ1BGBRRvbGRQb3NpdGlvblRpbWVzdGFtcAkBAS0BBQdfYW1vdW50BAxyZW1haW5NYXJnaW4IBQ0kdDA2NzM3MDY3NjE5Al8xBAdiYWREZWJ0CAUNJHQwNjczNzA2NzYxOQJfMgQOZnVuZGluZ1BheW1lbnQIBQ0kdDA2NzM3MDY3NjE5Al8zBAtyb2xsb3ZlckZlZQgFDSR0MDY3MzcwNjc2MTkCXzQDCQECIT0CBQdiYWREZWJ0AAAJAAIBAh1JbnZhbGlkIHJlbW92ZWQgbWFyZ2luIGFtb3VudAQLbWFyZ2luUmF0aW8JAQ9jYWxjTWFyZ2luUmF0aW8DBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsAwkBASEBCQEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMFC21hcmdpblJhdGlvCQEPaW5pdE1hcmdpblJhdGlvAAYJAAIBCQCsAgIJAKwCAgkArAICAhlUb28gbXVjaCBtYXJnaW4gcmVtb3ZlZDogCQCkAwEFC21hcmdpblJhdGlvAgMgPCAJAKQDAQkBD2luaXRNYXJnaW5SYXRpbwAEDSR0MDY4MDA1NjgwNjQJAQ1kaXN0cmlidXRlRmVlAQULcm9sbG92ZXJGZWUEDGZlZVRvU3Rha2VycwgFDSR0MDY4MDA1NjgwNjQCXzEECmZlZVRvVmF1bHQIBQ0kdDA2ODAwNTY4MDY0Al8yBBZkb1RyYW5zZmVyRmVlVG9TdGFrZXJzAwkAZgIFC3JvbGxvdmVyRmVlAAAEC2xvY2tCYWREZWJ0CQD8BwQJAQx2YXVsdEFkZHJlc3MAAhVleGNoYW5nZUZyZWVBbmRMb2NrZWQJAMwIAgkBAS0BBQpmZWVUb1ZhdWx0BQNuaWwFA25pbAMJAAACBQtsb2NrQmFkRGVidAULbG9ja0JhZERlYnQJAQt0cmFuc2ZlckZlZQEFDGZlZVRvU3Rha2VycwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFFmRvVHJhbnNmZXJGZWVUb1N0YWtlcnMFFmRvVHJhbnNmZXJGZWVUb1N0YWtlcnMEB3Vuc3Rha2UJAPwHBAkBDHZhdWx0QWRkcmVzcwACDndpdGhkcmF3TG9ja2VkCQDMCAIJAGQCBQdfYW1vdW50BQxmZWVUb1N0YWtlcnMFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UJAM4IAgkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgYFB190cmFkZXIFD29sZFBvc2l0aW9uU2l6ZQUMcmVtYWluTWFyZ2luBRdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBQ9vbGRQb3NpdGlvblNpemUJAQ1sYXN0VGltZXN0YW1wAAkBCHdpdGhkcmF3AggFAWkGY2FsbGVyBQdfYW1vdW50CQENdXBkYXRlQmFsYW5jZQEJAGUCCQBlAgkBCGNiYWxhbmNlAAUHX2Ftb3VudAULcm9sbG92ZXJGZWUFFmRvVHJhbnNmZXJGZWVUb1N0YWtlcnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENY2xvc2VQb3NpdGlvbgUFX3NpemUKX2RpcmVjdGlvbhRfbWluUXVvdGVBc3NldEFtb3VudAxfYWRkVG9NYXJnaW4MX3ByaWNlVXBkYXRlBAx1cGRhdGVPcmFjbGUJAPwHBAUEdGhpcwIMdXBkYXRlT3JhY2xlCQDMCAIFDF9wcmljZVVwZGF0ZQUDbmlsBQNuaWwDCQAAAgUMdXBkYXRlT3JhY2xlBQx1cGRhdGVPcmFjbGUEBHN5bmMJAPwHBAUEdGhpcwIZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQUDbmlsBQNuaWwDCQAAAgUEc3luYwUEc3luYwQQZW5zdXJlQ2FsbGVkT25jZQkA/AcEBQR0aGlzAhBlbnN1cmVDYWxsZWRPbmNlBQNuaWwFA25pbAMJAAACBRBlbnN1cmVDYWxsZWRPbmNlBRBlbnN1cmVDYWxsZWRPbmNlBAdfdHJhZGVyCQEPZ2V0QWN0dWFsQ2FsbGVyAQUBaQQOX3RyYWRlckFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQdfdHJhZGVyAg5JbnZhbGlkIGNhbGxlcgQLcG9zaXRpb25GZWUJAQ5nZXRQb3NpdGlvbkZlZQIFB190cmFkZXIFCl9kaXJlY3Rpb24DAwMDAwMJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24CBQdfdHJhZGVyBQpfZGlyZWN0aW9uBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAGCQBnAgAABQVfc2l6ZQYJAGYCAAAFFF9taW5RdW90ZUFzc2V0QW1vdW50BgkBDmlzTWFya2V0Q2xvc2VkAAkAAgECIEludmFsaWQgY2xvc2VQb3NpdGlvbiBwYXJhbWV0ZXJzBBRvbGRQb3NpdGlvblRpbWVzdGFtcAgJAQtnZXRQb3NpdGlvbgIFB190cmFkZXIFCl9kaXJlY3Rpb24CXzUEDSR0MDcwMzk5NzEwMDIJARVpbnRlcm5hbENsb3NlUG9zaXRpb24IBQdfdHJhZGVyBQpfZGlyZWN0aW9uBQVfc2l6ZQULcG9zaXRpb25GZWUFFF9taW5RdW90ZUFzc2V0QW1vdW50BQxfYWRkVG9NYXJnaW4GBgQPbmV3UG9zaXRpb25TaXplCAUNJHQwNzAzOTk3MTAwMgJfMQQRbmV3UG9zaXRpb25NYXJnaW4IBQ0kdDA3MDM5OTcxMDAyAl8yBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDcwMzk5NzEwMDICXzMEFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNzAzOTk3MTAwMgJfNAQPcG9zaXRpb25CYWREZWJ0CAUNJHQwNzAzOTk3MTAwMgJfNQQLcmVhbGl6ZWRQbmwIBQ0kdDA3MDM5OTcxMDAyAl82BA5tYXJnaW5Ub1RyYWRlcggFDSR0MDcwMzk5NzEwMDICXzcEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA3MDM5OTcxMDAyAl84BBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA3MDM5OTcxMDAyAl85BBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNzAzOTk3MTAwMgNfMTAEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDA3MDM5OTcxMDAyA18xMQQOdG90YWxMb25nQWZ0ZXIIBQ0kdDA3MDM5OTcxMDAyA18xMgQPdG90YWxTaG9ydEFmdGVyCAUNJHQwNzAzOTk3MTAwMgNfMTMEGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyCAUNJHQwNzAzOTk3MTAwMgNfMTQEG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcggFDSR0MDcwMzk5NzEwMDIDXzE1BAtyZWFsaXplZEZlZQgFDSR0MDcwMzk5NzEwMDIDXzE2AwkAZgIFD3Bvc2l0aW9uQmFkRGVidAAACQACAQIqSW52YWxpZCBjbG9zZVBvc2l0aW9uIHBhcmFtZXRlcnM6IGJhZCBkZWJ0AwkAZwIFFG9sZFBvc2l0aW9uVGltZXN0YW1wCQENbGFzdFRpbWVzdGFtcAAJAAIBAlNJbnZhbGlkIGNsb3NlUG9zaXRpb24gcGFyYW1ldGVyczogd2FpdCBhdCBsZWFzdCAxIGJsb2NrIGJlZm9yZSBjbG9zaW5nIHRoZSBwb3NpdGlvbgQOaXNQYXJ0aWFsQ2xvc2UJAQIhPQIFD25ld1Bvc2l0aW9uU2l6ZQAABA53aXRoZHJhd0Ftb3VudAkAZAIFDm1hcmdpblRvVHJhZGVyBQtyZWFsaXplZEZlZQQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFDndpdGhkcmF3QW1vdW50BA1hbW1OZXdCYWxhbmNlAwkAZgIAAAUKYW1tQmFsYW5jZQAABQphbW1CYWxhbmNlBAd1bnN0YWtlCQD8BwQJAQx2YXVsdEFkZHJlc3MAAg53aXRoZHJhd0xvY2tlZAkAzAgCBQ53aXRoZHJhd0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQQOcmVmZXJyZXJGZWVBbnkJAPwHBAkBD3JlZmVycmFsQWRkcmVzcwACDWFjY2VwdFBheW1lbnQJAMwIAgUHX3RyYWRlcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFC3JlYWxpemVkRmVlBQNuaWwDCQAAAgUOcmVmZXJyZXJGZWVBbnkFDnJlZmVycmVyRmVlQW55BAtyZWZlcnJlckZlZQQHJG1hdGNoMAUOcmVmZXJyZXJGZWVBbnkDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4CQACAQITSW52YWxpZCByZWZlcnJlckZlZQQNJHQwNzE5NzQ3MjA0NwkBDWRpc3RyaWJ1dGVGZWUBCQBlAgULcmVhbGl6ZWRGZWUFC3JlZmVycmVyRmVlBAxmZWVUb1N0YWtlcnMIBQ0kdDA3MTk3NDcyMDQ3Al8xBApmZWVUb1ZhdWx0CAUNJHQwNzE5NzQ3MjA0NwJfMgQMZGVwb3NpdFZhdWx0CQD8BwQJAQx2YXVsdEFkZHJlc3MAAgdhZGRGcmVlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUKZmVlVG9WYXVsdAUDbmlsAwkAAAIFDGRlcG9zaXRWYXVsdAUMZGVwb3NpdFZhdWx0BAlub3RpZnlGZWUJAPwHBAkBDG1pbmVyQWRkcmVzcwACCm5vdGlmeUZlZXMJAMwIAgUHX3RyYWRlcgkAzAgCBQtyZWFsaXplZEZlZQUDbmlsBQNuaWwDCQAAAgUJbm90aWZ5RmVlBQlub3RpZnlGZWUEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAM4IAgMFDmlzUGFydGlhbENsb3NlCQEOdXBkYXRlUG9zaXRpb24GBQdfdHJhZGVyBQ9uZXdQb3NpdGlvblNpemUFEW5ld1Bvc2l0aW9uTWFyZ2luBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUUbmV3UG9zaXRpb25Mc3RVcGRDUEYJAQ1sYXN0VGltZXN0YW1wAAkBDmRlbGV0ZVBvc2l0aW9uAgUHX3RyYWRlcgUKX2RpcmVjdGlvbgkBCXVwZGF0ZUFtbQgFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgUadG90YWxMb25nT3BlbkludGVyZXN0QWZ0ZXIFG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcgMJAGYCBQ5tYXJnaW5Ub1RyYWRlcgAACQEId2l0aGRyYXcCBQ5fdHJhZGVyQWRkcmVzcwUObWFyZ2luVG9UcmFkZXIFA25pbAkBDXVwZGF0ZUJhbGFuY2UBBQ1hbW1OZXdCYWxhbmNlCQELdHJhbnNmZXJGZWUBBQxmZWVUb1N0YWtlcnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJbGlxdWlkYXRlAwdfdHJhZGVyCl9kaXJlY3Rpb24MX3ByaWNlVXBkYXRlBAx1cGRhdGVPcmFjbGUJAPwHBAUEdGhpcwIMdXBkYXRlT3JhY2xlCQDMCAIFDF9wcmljZVVwZGF0ZQUDbmlsBQNuaWwDCQAAAgUMdXBkYXRlT3JhY2xlBQx1cGRhdGVPcmFjbGUEBHN5bmMJAPwHBAUEdGhpcwIZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQUDbmlsBQNuaWwDCQAAAgUEc3luYwUEc3luYwQPc3BvdE1hcmdpblJhdGlvCQEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgMFB190cmFkZXIFCl9kaXJlY3Rpb24FD1BOTF9PUFRJT05fU1BPVAQWbGlxdWlkYXRpb25NYXJnaW5SYXRpbwMJARZpc092ZXJGbHVjdHVhdGlvbkxpbWl0AAQRb3JhY2xlTWFyZ2luUmF0aW8JARZnZXRNYXJnaW5SYXRpb0J5T3B0aW9uAwUHX3RyYWRlcgUKX2RpcmVjdGlvbgURUE5MX09QVElPTl9PUkFDTEUJAQR2bWF4AgUPc3BvdE1hcmdpblJhdGlvBRFvcmFjbGVNYXJnaW5SYXRpbwUPc3BvdE1hcmdpblJhdGlvAwMDAwMJAQEhAQkBFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8DBRZsaXF1aWRhdGlvbk1hcmdpblJhdGlvCQEWbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwAHBgkBASEBCQETcmVxdWlyZU9wZW5Qb3NpdGlvbgIFB190cmFkZXIFCl9kaXJlY3Rpb24GCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAYJAQ5pc01hcmtldENsb3NlZAAJAAIBAhNVbmFibGUgdG8gbGlxdWlkYXRlBBRpc1BhcnRpYWxMaXF1aWRhdGlvbgMDCQBmAgUPc3BvdE1hcmdpblJhdGlvCQETbGlxdWlkYXRpb25GZWVSYXRpbwAJAGYCCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8AAAAHCQBmAgUMREVDSU1BTF9VTklUCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ABwQPb2xkUG9zaXRpb25TaXplCAkBC2dldFBvc2l0aW9uAgUHX3RyYWRlcgUKX2RpcmVjdGlvbgJfMQQPcG9zaXRpb25TaXplQWJzCQEDYWJzAQUPb2xkUG9zaXRpb25TaXplBA0kdDA3NDY0MDc0OTYzAwUUaXNQYXJ0aWFsTGlxdWlkYXRpb24ED2xpcXVpZGF0aW9uU2l6ZQkBG2dldFBhcnRpYWxMaXF1aWRhdGlvbkFtb3VudAIFB190cmFkZXIFD29sZFBvc2l0aW9uU2l6ZQQQbGlxdWlkYXRpb25SYXRpbwkBBGRpdmQCCQEDYWJzAQUPbGlxdWlkYXRpb25TaXplBQ9wb3NpdGlvblNpemVBYnMJAJQKAgUQbGlxdWlkYXRpb25SYXRpbwkBA2FicwEFD2xpcXVpZGF0aW9uU2l6ZQkAlAoCAAAFD3Bvc2l0aW9uU2l6ZUFicwQQbGlxdWlkYXRpb25SYXRpbwgFDSR0MDc0NjQwNzQ5NjMCXzEED2xpcXVpZGF0aW9uU2l6ZQgFDSR0MDc0NjQwNzQ5NjMCXzIEDSR0MDc0OTY5NzU2MjUJARVpbnRlcm5hbENsb3NlUG9zaXRpb24IBQdfdHJhZGVyBQpfZGlyZWN0aW9uAwUUaXNQYXJ0aWFsTGlxdWlkYXRpb24FD2xpcXVpZGF0aW9uU2l6ZQUPcG9zaXRpb25TaXplQWJzCQETbGlxdWlkYXRpb25GZWVSYXRpbwAAAAYHBgQPbmV3UG9zaXRpb25TaXplCAUNJHQwNzQ5Njk3NTYyNQJfMQQRbmV3UG9zaXRpb25NYXJnaW4IBQ0kdDA3NDk2OTc1NjI1Al8yBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDc0OTY5NzU2MjUCXzMEFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNzQ5Njk3NTYyNQJfNAQPcG9zaXRpb25CYWREZWJ0CAUNJHQwNzQ5Njk3NTYyNQJfNQQLcmVhbGl6ZWRQbmwIBQ0kdDA3NDk2OTc1NjI1Al82BA5tYXJnaW5Ub1RyYWRlcggFDSR0MDc0OTY5NzU2MjUCXzcEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA3NDk2OTc1NjI1Al84BBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA3NDk2OTc1NjI1Al85BBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNzQ5Njk3NTYyNQNfMTAEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDA3NDk2OTc1NjI1A18xMQQOdG90YWxMb25nQWZ0ZXIIBQ0kdDA3NDk2OTc1NjI1A18xMgQPdG90YWxTaG9ydEFmdGVyCAUNJHQwNzQ5Njk3NTYyNQNfMTMEGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyCAUNJHQwNzQ5Njk3NTYyNQNfMTQEG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcggFDSR0MDc0OTY5NzU2MjUDXzE1BBJsaXF1aWRhdGlvblBlbmFsdHkIBQ0kdDA3NDk2OTc1NjI1A18xNgQPZmVlVG9MaXF1aWRhdG9yCQBpAgUSbGlxdWlkYXRpb25QZW5hbHR5AAIECmZlZVRvVmF1bHQJAGUCBRJsaXF1aWRhdGlvblBlbmFsdHkFD2ZlZVRvTGlxdWlkYXRvcgQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFEmxpcXVpZGF0aW9uUGVuYWx0eQQNbmV3QW1tQmFsYW5jZQMJAGYCAAAFCmFtbUJhbGFuY2UAAAUKYW1tQmFsYW5jZQQLbG9ja0JhZERlYnQDCQBmAgUPcG9zaXRpb25CYWREZWJ0AAAEC2xvY2tCYWREZWJ0CQD8BwQJAQx2YXVsdEFkZHJlc3MAAhVleGNoYW5nZUZyZWVBbmRMb2NrZWQJAMwIAgkAZAIFD3Bvc2l0aW9uQmFkRGVidAUSbGlxdWlkYXRpb25QZW5hbHR5BQNuaWwFA25pbAMJAAACBQtsb2NrQmFkRGVidAULbG9ja0JhZERlYnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFC2xvY2tCYWREZWJ0BQtsb2NrQmFkRGVidAQHdW5zdGFrZQkA/AcECQEMdmF1bHRBZGRyZXNzAAIOd2l0aGRyYXdMb2NrZWQJAMwIAgUSbGlxdWlkYXRpb25QZW5hbHR5BQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBBBkZXBvc2l0SW5zdXJhbmNlCQD8BwQJAQx2YXVsdEFkZHJlc3MAAgdhZGRGcmVlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUKZmVlVG9WYXVsdAUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIDBRRpc1BhcnRpYWxMaXF1aWRhdGlvbgkBDnVwZGF0ZVBvc2l0aW9uBgUHX3RyYWRlcgUPbmV3UG9zaXRpb25TaXplBRFuZXdQb3NpdGlvbk1hcmdpbgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCQENbGFzdFRpbWVzdGFtcAAJAQ5kZWxldGVQb3NpdGlvbgIFB190cmFkZXIFCl9kaXJlY3Rpb24JAQl1cGRhdGVBbW0IBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIFDnRvdGFsTG9uZ0FmdGVyBQ90b3RhbFNob3J0QWZ0ZXIFGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyBRt0b3RhbFNob3J0T3BlbkludGVyZXN0QWZ0ZXIJAQh3aXRoZHJhdwIIBQFpBmNhbGxlcgUPZmVlVG9MaXF1aWRhdG9yCQENdXBkYXRlQmFsYW5jZQEFDW5ld0FtbUJhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKcGF5RnVuZGluZwEMX3ByaWNlVXBkYXRlBAx1cGRhdGVPcmFjbGUJAPwHBAUEdGhpcwIMdXBkYXRlT3JhY2xlCQDMCAIFDF9wcmljZVVwZGF0ZQUDbmlsBQNuaWwDCQAAAgUMdXBkYXRlT3JhY2xlBQx1cGRhdGVPcmFjbGUEBHN5bmMJAPwHBAUEdGhpcwIZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQUDbmlsBQNuaWwDCQAAAgUEc3luYwUEc3luYwQVZnVuZGluZ0Jsb2NrVGltZXN0YW1wCQEZbmV4dEZ1bmRpbmdCbG9ja1RpbWVzdGFtcAADAwMJAGYCBRVmdW5kaW5nQmxvY2tUaW1lc3RhbXAJAQ1sYXN0VGltZXN0YW1wAAYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQACQACAQkArAICCQCsAgIJAKwCAgIhSW52YWxpZCBmdW5kaW5nIGJsb2NrIHRpbWVzdGFtcDogCQCkAwEJAQ1sYXN0VGltZXN0YW1wAAIDIDwgCQCkAwEFFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAQPdW5kZXJseWluZ1ByaWNlCQEOZ2V0T3JhY2xlUHJpY2UABA0kdDA3Nzg0Mzc3OTIxCQEKZ2V0RnVuZGluZwAEFHNob3J0UHJlbWl1bUZyYWN0aW9uCAUNJHQwNzc4NDM3NzkyMQJfMQQTbG9uZ1ByZW1pdW1GcmFjdGlvbggFDSR0MDc3ODQzNzc5MjECXzIEDnByZW1pdW1Ub1ZhdWx0CAUNJHQwNzc4NDM3NzkyMQJfMwQTZG9QYXlGdW5kaW5nVG9WYXVsdAMJAGYCBQ5wcmVtaXVtVG9WYXVsdAAABBNkb1BheUZ1bmRpbmdUb1ZhdWx0CQD8BwQJAQx2YXVsdEFkZHJlc3MAAhVleGNoYW5nZUZyZWVBbmRMb2NrZWQJAMwIAgkBAS0BBQ5wcmVtaXVtVG9WYXVsdAUDbmlsBQNuaWwDCQAAAgUTZG9QYXlGdW5kaW5nVG9WYXVsdAUTZG9QYXlGdW5kaW5nVG9WYXVsdAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUTZG9QYXlGdW5kaW5nVG9WYXVsdAUTZG9QYXlGdW5kaW5nVG9WYXVsdAkBDXVwZGF0ZUZ1bmRpbmcFCQBkAgUVZnVuZGluZ0Jsb2NrVGltZXN0YW1wCQEUZnVuZGluZ1BlcmlvZFNlY29uZHMACQBkAgkBI2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAUTbG9uZ1ByZW1pdW1GcmFjdGlvbgkAZAIJASRsYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ABRRzaG9ydFByZW1pdW1GcmFjdGlvbgkBBGRpdmQCBRNsb25nUHJlbWl1bUZyYWN0aW9uBQ91bmRlcmx5aW5nUHJpY2UJAQRkaXZkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FD3VuZGVybHlpbmdQcmljZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQx1cGRhdGVPcmFjbGUBDF9wcmljZVVwZGF0ZQMJAAACCQEKb3JhY2xlTW9kZQAFDE9SQUNMRV9QTEFJTgUDbmlsBAxwcmljZVVwZGF0ZXMJALwJAgUMX3ByaWNlVXBkYXRlAgI6OgQKYmFzZU9yYWNsZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQENZ2V0T3JhY2xlRGF0YQEFDGtfYmFzZU9yYWNsZQIZTm8gYmFzZSBhc3NldCBvcmFjbGUgZGF0YQQRYmFzZU9yYWNsZUFkZHJlc3MIBQpiYXNlT3JhY2xlAl8xBBJkb1VwZGF0ZUJhc2VPcmFjbGUJAPwHBAURYmFzZU9yYWNsZUFkZHJlc3MCCnVwZGF0ZURhdGEJAMwIAgkAkQMCBQxwcmljZVVwZGF0ZXMAAAUDbmlsBQNuaWwDCQAAAgUSZG9VcGRhdGVCYXNlT3JhY2xlBRJkb1VwZGF0ZUJhc2VPcmFjbGUEC3F1b3RlT3JhY2xlCQENZ2V0T3JhY2xlRGF0YQEFDWtfcXVvdGVPcmFjbGUEE2RvVXBkYXRlUXVvdGVPcmFjbGUDCQEJaXNEZWZpbmVkAQULcXVvdGVPcmFjbGUEDHF1b3RlT3JhY2xlVgkBBXZhbHVlAQULcXVvdGVPcmFjbGUEEnF1b3RlT3JhY2xlQWRkcmVzcwgFDHF1b3RlT3JhY2xlVgJfMQQTZG9VcGRhdGVRdW90ZU9yYWNsZQkA/AcEBRJxdW90ZU9yYWNsZUFkZHJlc3MCCnVwZGF0ZURhdGEJAMwIAgkAkQMCBQxwcmljZVVwZGF0ZXMAAQUDbmlsBQNuaWwDCQAAAgUTZG9VcGRhdGVRdW90ZU9yYWNsZQUTZG9VcGRhdGVRdW90ZU9yYWNsZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUTZG9VcGRhdGVRdW90ZU9yYWNsZQUTZG9VcGRhdGVRdW90ZU9yYWNsZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGXN5bmNUZXJtaW5hbFByaWNlVG9PcmFjbGUABAdfcXRBc3RSCQEGcXRBc3RSAAQHX2JzQXN0UgkBBmJzQXN0UgAEDSR0MDc5NzM4ODAxMDQJARRnZXRTeW5jVGVybWluYWxQcmljZQMJAQ5nZXRPcmFjbGVQcmljZQAFB19xdEFzdFIFB19ic0FzdFIEE25ld1F1b3RlQXNzZXRXZWlnaHQIBQ0kdDA3OTczODgwMTA0Al8xBBJuZXdCYXNlQXNzZXRXZWlnaHQIBQ0kdDA3OTczODgwMTA0Al8yBA1tYXJnaW5Ub1ZhdWx0CAUNJHQwNzk3Mzg4MDEwNAJfMwQQbWFyZ2luVG9WYXVsdEFkagMDCQBmAgAABQ1tYXJnaW5Ub1ZhdWx0CQBmAgkBA2FicwEFDW1hcmdpblRvVmF1bHQJAQhjYmFsYW5jZQAHCQEBLQEJAQhjYmFsYW5jZQAFDW1hcmdpblRvVmF1bHQEDWRvRXhjaGFuZ2VQbkwDCQECIT0CBRBtYXJnaW5Ub1ZhdWx0QWRqAAAEDWRvRXhjaGFuZ2VQbkwJAPwHBAkBDHZhdWx0QWRkcmVzcwACFWV4Y2hhbmdlRnJlZUFuZExvY2tlZAkAzAgCBRBtYXJnaW5Ub1ZhdWx0QWRqBQNuaWwFA25pbAMJAAACBQ1kb0V4Y2hhbmdlUG5MBQ1kb0V4Y2hhbmdlUG5MBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQ1kb0V4Y2hhbmdlUG5MBQ1kb0V4Y2hhbmdlUG5MCQDOCAIJAQ11cGRhdGVCYWxhbmNlAQkAZAIJAQhjYmFsYW5jZQAFEG1hcmdpblRvVmF1bHRBZGoJARB1cGRhdGVBbW1XZWlnaHRzAgUTbmV3UXVvdGVBc3NldFdlaWdodAUSbmV3QmFzZUFzc2V0V2VpZ2h0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGVuc3VyZUNhbGxlZE9uY2UAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIiSW52YWxpZCBzYXZlQ3VycmVudFR4SWQgcGFyYW1ldGVycwQEdHhJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAZsYXN0VHgJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUIa19sYXN0VHgCAAMJAQIhPQIFBmxhc3RUeAUEdHhJZAkAzAgCCQELU3RyaW5nRW50cnkCBQhrX2xhc3RUeAUEdHhJZAUDbmlsCQACAQIpQ2FuIG5vdCBjYWxsIHZBTU0gbWV0aG9kcyB0d2ljZSBpbiBvbmUgdHgBaQEPbWlncmF0ZVBvc2l0aW9uAQdfdHJhZGVyBA9wb3NpdGlvblNpemVPcHQJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFB190cmFkZXIDAwkBCWlzRGVmaW5lZAEFD3Bvc2l0aW9uU2l6ZU9wdAkBCWlzRGVmaW5lZAEJAKYIAQUHX3RyYWRlcgcEBXBTaXplCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uU2l6ZQUHX3RyYWRlcgQHcE1hcmdpbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvbk1hcmdpbgUHX3RyYWRlcgQJcE5vdGlvbmFsCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQdfdHJhZGVyBAlwRnJhY3Rpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFLmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FB190cmFkZXIECnBUaW1lc3RhbXAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUea19wb3NpdGlvbkxhc3RVcGRhdGVkVGltZXN0YW1wBQdfdHJhZGVyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQEcEZlZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBQ1rX3Bvc2l0aW9uRmVlBQdfdHJhZGVyCQEDZmVlAAQJcFNlcXVlbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRJrX3Bvc2l0aW9uU2VxdWVuY2UFB190cmFkZXIECnBEaXJlY3Rpb24JAQxnZXREaXJlY3Rpb24BBQVwU2l6ZQQLcG9zaXRpb25LZXkJAKwCAgkArAICBQdfdHJhZGVyAgFfCQCkAwEFCnBEaXJlY3Rpb24JAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFB190cmFkZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvbk1hcmdpbgUHX3RyYWRlcgkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQdfdHJhZGVyCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFLmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FB190cmFkZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUea19wb3NpdGlvbkxhc3RVcGRhdGVkVGltZXN0YW1wBQdfdHJhZGVyCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFDWtfcG9zaXRpb25GZWUFB190cmFkZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUSa19wb3NpdGlvblNlcXVlbmNlBQdfdHJhZGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uU2l6ZQULcG9zaXRpb25LZXkFBXBTaXplCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRBrX3Bvc2l0aW9uTWFyZ2luBQtwb3NpdGlvbktleQUHcE1hcmdpbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAULcG9zaXRpb25LZXkFCXBOb3Rpb25hbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgULcG9zaXRpb25LZXkFCXBGcmFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUea19wb3NpdGlvbkxhc3RVcGRhdGVkVGltZXN0YW1wBQtwb3NpdGlvbktleQUKcFRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUNa19wb3NpdGlvbkZlZQULcG9zaXRpb25LZXkFBHBGZWUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFEmtfcG9zaXRpb25TZXF1ZW5jZQULcG9zaXRpb25LZXkFCXBTZXF1ZW5jZQUDbmlsCQACAQkArAICAhdOb3RoaW5nIHRvIG1pZ3JhdGUgZm9yIAUHX3RyYWRlcgFpASd2aWV3X2NhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQDB190cmFkZXIKX2RpcmVjdGlvbgxfcHJpY2VVcGRhdGUEDHVwZGF0ZU9yYWNsZQkA/AcEBQR0aGlzAgx1cGRhdGVPcmFjbGUJAMwIAgUMX3ByaWNlVXBkYXRlBQNuaWwFA25pbAMJAAACBQx1cGRhdGVPcmFjbGUFDHVwZGF0ZU9yYWNsZQQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBA0kdDA4Mzg5ODg0MDM0CQELZ2V0UG9zaXRpb24CBQdfdHJhZGVyBQpfZGlyZWN0aW9uBAxwb3NpdGlvblNpemUIBQ0kdDA4Mzg5ODg0MDM0Al8xBA5wb3NpdGlvbk1hcmdpbggFDSR0MDgzODk4ODQwMzQCXzIEA3BvbggFDSR0MDgzODk4ODQwMzQCXzMEEXBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwODM4OTg4NDAzNAJfNAQRcG9zaXRpb25UaW1lc3RhbXAIBQ0kdDA4Mzg5ODg0MDM0Al81BA0kdDA4NDAzNzg0MTUwCQEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwDBQdfdHJhZGVyBQpfZGlyZWN0aW9uBQ9QTkxfT1BUSU9OX1NQT1QEEHBvc2l0aW9uTm90aW9uYWwIBQ0kdDA4NDAzNzg0MTUwAl8xBA11bnJlYWxpemVkUG5sCAUNJHQwODQwMzc4NDE1MAJfMgQNJHQwODQxNTM4NDM3NwkBMGNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnRBbmRSb2xsb3ZlckZlZQUFDHBvc2l0aW9uU2l6ZQUOcG9zaXRpb25NYXJnaW4FEXBvc2l0aW9uTHN0VXBkQ1BGBRFwb3NpdGlvblRpbWVzdGFtcAUNdW5yZWFsaXplZFBubAQMcmVtYWluTWFyZ2luCAUNJHQwODQxNTM4NDM3NwJfMQQHYmFkRGVidAgFDSR0MDg0MTUzODQzNzcCXzIEDmZ1bmRpbmdQYXltZW50CAUNJHQwODQxNTM4NDM3NwJfMwQLcm9sbG92ZXJGZWUIBQ0kdDA4NDE1Mzg0Mzc3Al80CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkBAXMBBQxyZW1haW5NYXJnaW4JAQFzAQUOZnVuZGluZ1BheW1lbnQJAQFzAQkBDmdldE1hcmdpblJhdGlvAgUHX3RyYWRlcgUKX2RpcmVjdGlvbgkBAXMBBQ11bnJlYWxpemVkUG5sCQEBcwEFB2JhZERlYnQJAQFzAQUQcG9zaXRpb25Ob3Rpb25hbAkBAXMBBQtyb2xsb3ZlckZlZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARV2aWV3X2dldFBlZ0FkanVzdENvc3QBBl9wcmljZQQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAZyZXN1bHQJARRnZXRTeW5jVGVybWluYWxQcmljZQMFBl9wcmljZQUHX3F0QXN0UgUHX2JzQXN0UgkAAgEJAKQDAQgFBnJlc3VsdAJfMwFpARh2aWV3X2dldFRlcm1pbmFsQW1tUHJpY2UABA0kdDA4NTExMjg1MTkzCQETZ2V0VGVybWluYWxBbW1TdGF0ZQAEGXRlcm1pbmFsUXVvdGVBc3NldFJlc2VydmUIBQ0kdDA4NTExMjg1MTkzAl8xBBh0ZXJtaW5hbEJhc2VBc3NldFJlc2VydmUIBQ0kdDA4NTExMjg1MTkzAl8yBAVwcmljZQkBBGRpdmQCCQEEbXVsZAIFGXRlcm1pbmFsUXVvdGVBc3NldFJlc2VydmUJAQZxdEFzdFcACQEEbXVsZAIFGHRlcm1pbmFsQmFzZUFzc2V0UmVzZXJ2ZQkBBmJzQXN0VwAJAAIBCQCkAwEFBXByaWNlAWkBD3ZpZXdfZ2V0RnVuZGluZwEMX3ByaWNlVXBkYXRlBAx1cGRhdGVPcmFjbGUJAPwHBAUEdGhpcwIMdXBkYXRlT3JhY2xlCQDMCAIFDF9wcmljZVVwZGF0ZQUDbmlsBQNuaWwDCQAAAgUMdXBkYXRlT3JhY2xlBQx1cGRhdGVPcmFjbGUEBHN5bmMJAPwHBAUEdGhpcwIZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQUDbmlsBQNuaWwDCQAAAgUEc3luYwUEc3luYwQPdW5kZXJseWluZ1ByaWNlCQEOZ2V0T3JhY2xlUHJpY2UABA0kdDA4NTg0NTg1OTIzCQEKZ2V0RnVuZGluZwAEFHNob3J0UHJlbWl1bUZyYWN0aW9uCAUNJHQwODU4NDU4NTkyMwJfMQQTbG9uZ1ByZW1pdW1GcmFjdGlvbggFDSR0MDg1ODQ1ODU5MjMCXzIEDnByZW1pdW1Ub1ZhdWx0CAUNJHQwODU4NDU4NTkyMwJfMwQLbG9uZ0Z1bmRpbmcJAQRkaXZkAgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgUPdW5kZXJseWluZ1ByaWNlBAxzaG9ydEZ1bmRpbmcJAQRkaXZkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FD3VuZGVybHlpbmdQcmljZQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkBAXMBBQtsb25nRnVuZGluZwkBAXMBBQxzaG9ydEZ1bmRpbmcJAQFzAQkBDGdldFNwb3RQcmljZQAJAQFzAQkBDmdldE9yYWNsZVByaWNlAAkBAXMBBQ5wcmVtaXVtVG9WYXVsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBjb21wdXRlU3BvdFByaWNlAAQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBAZyZXN1bHQJAQxnZXRTcG90UHJpY2UACQCUCgIFA25pbAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBH2NvbXB1dGVGZWVGb3JUcmFkZXJXaXRoQXJ0aWZhY3QCB190cmFkZXILX2FydGlmYWN0SWQEBnJlc3VsdAkBGGdldEZvclRyYWRlcldpdGhBcnRpZmFjdAIFB190cmFkZXIFC19hcnRpZmFjdElkCQCUCgIFA25pbAUGcmVzdWx0AQJ0eAEGdmVyaWZ5AAQOY29vcmRpbmF0b3JTdHIJAJ0IAgUEdGhpcwUUa19jb29yZGluYXRvckFkZHJlc3MDCQEJaXNEZWZpbmVkAQUOY29vcmRpbmF0b3JTdHIEBWFkbWluCQCdCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFDmNvb3JkaW5hdG9yU3RyBQ9rX2FkbWluX2FkZHJlc3MDCQEJaXNEZWZpbmVkAQUFYWRtaW4JAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUFYWRtaW4JAKwCAgkArAICCQCsAgICB3N0YXR1c18JAKUIAQUEdGhpcwIBXwkA2AQBCAUCdHgCaWQHCQACAQIudW5hYmxlIHRvIHZlcmlmeTogYWRtaW4gbm90IHNldCBpbiBjb29yZGluYXRvcgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tledIouSw=", "height": 2635101, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BB2Z4Az4uRK4EFCVCa9h2khTeDRJWNZVHqdqgFDnYgVv Next: none Diff:
OldNewDifferences
5757
5858 let B = "k_fundingMode"
5959
60-let C = "k_latestLongPremiumFraction"
60+let C = "k_oracleMode"
6161
62-let D = "k_latestShortPremiumFraction"
62+let D = "k_latestLongPremiumFraction"
6363
64-let E = "k_nextFundingBlockMinTimestamp"
64+let E = "k_latestShortPremiumFraction"
6565
66-let F = "k_longFundingRate"
66+let F = "k_nextFundingBlockMinTimestamp"
6767
68-let G = "k_shortFundingRate"
68+let G = "k_longFundingRate"
6969
70-let H = "k_qtAstR"
70+let H = "k_shortFundingRate"
7171
72-let I = "k_bsAstR"
72+let I = "k_qtAstR"
7373
74-let J = "k_qtAstW"
74+let J = "k_bsAstR"
7575
76-let K = "k_bsAstW"
76+let K = "k_qtAstW"
7777
78-let L = "k_totalPositionSize"
78+let L = "k_bsAstW"
7979
80-let M = "k_totalLongPositionSize"
80+let M = "k_totalPositionSize"
8181
82-let N = "k_totalShortPositionSize"
82+let N = "k_totalLongPositionSize"
8383
84-let O = "k_openInterestNotional"
84+let O = "k_totalShortPositionSize"
8585
86-let P = "k_openInterestShort"
86+let P = "k_openInterestNotional"
8787
88-let Q = "k_openInterestLong"
88+let Q = "k_openInterestShort"
8989
90-let R = "k_lastTx"
90+let R = "k_openInterestLong"
9191
92-let S = "k_coordinatorAddress"
92+let S = "k_lastTx"
9393
94-let T = "k_vault_address"
94+let T = "k_coordinatorAddress"
9595
96-let U = "k_admin_address"
96+let U = "k_vault_address"
9797
98-let V = "k_quote_asset"
98+let V = "k_admin_address"
9999
100-let W = "k_staking_address"
100+let W = "k_quote_asset"
101101
102-let X = "k_miner_address"
102+let X = "k_staking_address"
103103
104-let Y = "k_orders_address"
104+let Y = "k_miner_address"
105105
106-let Z = "k_referral_address"
106+let Z = "k_orders_address"
107107
108-let aa = "k_nft_manager_address"
108+let aa = "k_referral_address"
109109
110-func ab (ac,ad) = ((ac + "_") + ad)
110+let ab = "k_nft_manager_address"
111+
112+func ac (ad,ae) = ((ad + "_") + ae)
111113
112114
113-func ae () = valueOrErrorMessage(addressFromString(getStringValue(this, S)), "Coordinator not set")
115+func af () = valueOrErrorMessage(addressFromString(getStringValue(this, T)), "Coordinator not set")
114116
115117
116-func af () = addressFromString(getStringValue(ae(), U))
118+func ag () = addressFromString(getStringValue(af(), V))
117119
118120
119-func ag () = fromBase58String(getStringValue(ae(), V))
121+func ah () = fromBase58String(getStringValue(af(), W))
120122
121123
122-func ah () = valueOrErrorMessage(addressFromString(getStringValue(ae(), W)), "Staking not set")
124+func ai () = valueOrErrorMessage(addressFromString(getStringValue(af(), X)), "Staking not set")
123125
124126
125-func ai () = valueOrErrorMessage(addressFromString(getStringValue(ae(), T)), "Vault not set")
127+func aj () = valueOrErrorMessage(addressFromString(getStringValue(af(), U)), "Vault not set")
126128
127129
128-func aj () = valueOrErrorMessage(addressFromString(getStringValue(ae(), X)), "Miner not set")
130+func ak () = valueOrErrorMessage(addressFromString(getStringValue(af(), Y)), "Miner not set")
129131
130132
131-func ak () = valueOrErrorMessage(addressFromString(getStringValue(ae(), Y)), "Orders not set")
133+func al () = valueOrErrorMessage(addressFromString(getStringValue(af(), Z)), "Orders not set")
132134
133135
134-func al () = valueOrErrorMessage(addressFromString(getStringValue(ae(), Z)), "Referral not set")
136+func am () = valueOrErrorMessage(addressFromString(getStringValue(af(), aa)), "Referral not set")
135137
136138
137-func am () = valueOrErrorMessage(addressFromString(getStringValue(ae(), aa)), "NFT Manager not set")
139+func an () = valueOrErrorMessage(addressFromString(getStringValue(af(), ab)), "NFT Manager not set")
138140
139141
140-let an = "k_token_param"
142+let ao = "k_token_param"
141143
142-let ao = "k_token_type"
144+let ap = "k_token_type"
143145
144-let ap = "fee_reduction"
146+let aq = "fee_reduction"
145147
146-let aq = 1
148+let ar = 1
147149
148-let ar = 2
150+let as = 2
149151
150-let as = 1000
152+let at = 1000
151153
152-let at = 6
154+let au = 6
153155
154-let au = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
156+let av = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
155157
156-let av = (525600 * au)
158+let aw = (525600 * av)
157159
158-let aw = (86400 * au)
160+let ax = (86400 * av)
159161
160-let ax = 1
162+let ay = 1
161163
162-let ay = 2
164+let az = 2
163165
164-let az = 1
166+let aA = 1
165167
166-let aA = 2
168+let aB = 2
167169
168-func aB (aC) = (toString(aC) + ",")
170+let aC = 1
171+
172+let aD = 2
173+
174+func aE (aF) = (toString(aF) + ",")
169175
170176
171-func aD (aC,aE) = fraction(aC, au, aE, HALFEVEN)
177+func aG (aF,aH) = fraction(aF, av, aH, HALFEVEN)
172178
173179
174-func aF (aC,aE) = fraction(aC, aE, au, HALFEVEN)
180+func aI (aF,aH) = fraction(aF, aH, av, HALFEVEN)
175181
176182
177-func aG (aC,aE) = fraction(aC, toBigInt(au), aE, HALFEVEN)
183+func aJ (aF,aH) = fraction(aF, toBigInt(av), aH, HALFEVEN)
178184
179185
180-func aH (aC,aE) = fraction(aC, aE, toBigInt(au), HALFEVEN)
186+func aK (aF,aH) = fraction(aF, aH, toBigInt(av), HALFEVEN)
181187
182188
183-func aI (aC) = if ((aC > 0))
184- then aC
185- else -(aC)
189+func aL (aF) = if ((aF > 0))
190+ then aF
191+ else -(aF)
186192
187193
188-func aJ (aC,aE) = if ((aC >= aE))
189- then aC
190- else aE
194+func aM (aF,aH) = if ((aF >= aH))
195+ then aF
196+ else aH
191197
192198
193-func aK (aL) = valueOrErrorMessage(getInteger(this, aL), ("no value for " + aL))
199+func aN (aO) = valueOrErrorMessage(getInteger(this, aO), ("no value for " + aO))
194200
195201
196-func aM (aL,aN) = valueOrElse(getInteger(this, aL), aN)
202+func aP (aO,aQ) = valueOrElse(getInteger(this, aO), aQ)
197203
198204
199-func aO (ad,ac) = {
200- let aP = valueOrErrorMessage(getString(ad, ac), ("No value for key " + ac))
201- aP
205+func aR (ae,ad) = {
206+ let aS = valueOrErrorMessage(getString(ae, ad), ("No value for key " + ad))
207+ aS
202208 }
203209
204210
205-func aQ (ad,ac) = {
206- let aP = valueOrErrorMessage(getInteger(ad, ac), ("No value for key " + ac))
207- aP
211+func aT (ae,ad) = {
212+ let aS = valueOrErrorMessage(getInteger(ae, ad), ("No value for key " + ad))
213+ aS
208214 }
209215
210216
211-func aR () = aK(c)
217+func aU () = aN(c)
212218
213219
214-func aS () = aK(o)
220+func aV () = aP(c, 0)
215221
216222
217-func aT () = aK(p)
223+func aW () = aN(o)
218224
219225
220-func aU () = aK(r)
226+func aX () = aN(p)
221227
222228
223-func aV () = aK(H)
229+func aY () = aN(r)
224230
225231
226-func aW () = aK(I)
232+func aZ () = aN(I)
227233
228234
229-func aX () = aM(J, au)
235+func ba () = aP(I, 0)
230236
231237
232-func aY () = aM(K, au)
238+func bb () = aN(J)
233239
234240
235-func aZ () = aK(L)
241+func bc () = aP(J, 0)
236242
237243
238-func ba () = aK(O)
244+func bd () = aP(K, av)
239245
240246
241-func bb () = aK(P)
247+func be () = aP(L, av)
242248
243249
244-func bc () = aK(Q)
250+func bf () = aN(M)
245251
246252
247-func bd () = aK(E)
253+func bg () = aN(P)
248254
249255
250-func be () = aK(q)
256+func bh () = aN(Q)
251257
252258
253-func bf () = (be() * au)
259+func bi () = aN(R)
254260
255261
256-func bg () = (be() * as)
262+func bj () = aN(F)
257263
258264
259-func bh () = aK(s)
265+func bk () = aN(q)
260266
261267
262-func bi () = aK(t)
268+func bl () = (bk() * av)
263269
264270
265-func bj () = aK(u)
271+func bm () = (bk() * at)
266272
267273
268-func bk () = aK(v)
274+func bn () = aN(s)
269275
270276
271-func bl () = aK(w)
277+func bo () = aN(t)
272278
273279
274-func bm () = aK(x)
280+func bp () = aN(u)
275281
276282
277-func bn () = aK(y)
283+func bq () = aN(v)
278284
279285
280-func bo () = aK(C)
286+func br () = aN(w)
281287
282288
283-func bp () = aK(D)
289+func bs () = aN(x)
284290
285291
286-func bq () = aK(N)
292+func bt () = aN(y)
287293
288294
289-func br () = aK(M)
295+func bu () = aN(D)
290296
291297
292-func bs () = aM(d, 0)
298+func bv () = aN(E)
293299
294300
295-func bt () = aK(z)
301+func bw () = aN(O)
296302
297303
298-func bu () = aK(A)
304+func bx () = aN(N)
299305
300306
301-func bv () = aM(B, az)
307+func by () = aP(d, 0)
302308
303309
304-func bw () = lastBlock.timestamp
310+func bz () = aN(z)
305311
306312
307-func bx (by) = valueOrElse(getString(ak(), "k_sender"), toString(by.caller))
313+func bA () = aN(A)
308314
309315
310-func bz (bA,bB,bC) = {
311- let bD = (bA - bB)
312- if (if (bC)
313- then (0 > bD)
316+func bB () = aP(B, aA)
317+
318+
319+func bC () = aP(C, aC)
320+
321+
322+func bD () = lastBlock.timestamp
323+
324+
325+func bE (bF) = valueOrElse(getString(al(), "k_sender"), toString(bF.caller))
326+
327+
328+func bG (bH,bI,bJ) = {
329+ let bK = (bH - bI)
330+ if (if (bJ)
331+ then (0 > bK)
314332 else false)
315- then throw(((("Invalid margin: " + toString(bA)) + " < ") + toString(bB)))
316- else if (if (!(bC))
317- then (bD >= 0)
333+ then throw(((("Invalid margin: " + toString(bH)) + " < ") + toString(bI)))
334+ else if (if (!(bJ))
335+ then (bK >= 0)
318336 else false)
319- then throw(((("Invalid margin: " + toString(bA)) + " > ") + toString(bB)))
337+ then throw(((("Invalid margin: " + toString(bH)) + " > ") + toString(bI)))
320338 else true
321339 }
322340
323341
324-func bE (bF) = if ((bF == 0))
342+func bL (bM) = if ((bM == 0))
325343 then throw("Should not be called with _positionSize == 0")
326- else if ((bF > 0))
327- then bo()
328- else bp()
344+ else if ((bM > 0))
345+ then bu()
346+ else bv()
329347
330348
331-func bG (bH,bI) = {
332- let bJ = ((bH + "_") + toString(bI))
333- let bK = getInteger(this, ab(e, bJ))
334- let bL = bK
335- if ($isInstanceOf(bL, "Int"))
349+func bN (bO,bP) = {
350+ let bQ = ((bO + "_") + toString(bP))
351+ let bR = getInteger(this, ac(e, bQ))
352+ let bS = bR
353+ if ($isInstanceOf(bS, "Int"))
336354 then {
337- let bM = bL
338- $Tuple5(bM, getIntegerValue(this, ab(f, bJ)), getIntegerValue(this, ab(g, bJ)), getIntegerValue(this, ab(h, bJ)), getIntegerValue(this, ab(k, bJ)))
355+ let bT = bS
356+ $Tuple5(bT, getIntegerValue(this, ac(f, bQ)), getIntegerValue(this, ac(g, bQ)), getIntegerValue(this, ac(h, bQ)), getIntegerValue(this, ac(k, bQ)))
339357 }
340358 else $Tuple5(0, 0, 0, 0, 0)
341359 }
342360
343361
344-func bN (bF) = if ((0 > bF))
345- then ar
346- else aq
362+func bU (bM) = if ((0 > bM))
363+ then as
364+ else ar
347365
348366
349-func bO (bH,bI) = {
350- let bJ = ((bH + "_") + toString(bI))
351- let bP = getInteger(this, ab(j, bJ))
352- let bL = bP
353- if ($isInstanceOf(bL, "Int"))
367+func bV (bO,bP) = {
368+ let bQ = ((bO + "_") + toString(bP))
369+ let bW = getInteger(this, ac(j, bQ))
370+ let bS = bW
371+ if ($isInstanceOf(bS, "Int"))
354372 then {
355- let bQ = bL
356- bQ
373+ let bX = bS
374+ bX
357375 }
358- else aS()
376+ else aW()
359377 }
360378
361379
362-func bR (bH,bI) = if ((bG(bH, bI)._1 == 0))
380+func bY (bO,bP) = if ((bN(bO, bP)._1 == 0))
363381 then throw("No open position")
364382 else true
365383
366384
367-func bS (bT) = {
368- let bU = getString(this, bT)
369- if (if (isDefined(bU))
370- then (value(bU) != "")
385+func bZ (ca) = {
386+ let cb = getString(this, ca)
387+ if (if (isDefined(cb))
388+ then (value(cb) != "")
371389 else false)
372390 then {
373- let bV = split(value(bU), ",")
374- let bW = valueOrErrorMessage(addressFromString(bV[0]), ("Invalid oracle address in: " + value(bU)))
375- let bX = bV[1]
376- let bY = bV[2]
377- let bZ = bV[3]
378- $Tuple4(bW, bX, bY, bZ)
391+ let cc = split(value(cb), ",")
392+ let cd = valueOrErrorMessage(addressFromString(cc[0]), ("Invalid oracle address in: " + value(cb)))
393+ let ce = cc[1]
394+ let cf = cc[2]
395+ let cg = cc[3]
396+ $Tuple4(cd, ce, cf, cg)
379397 }
380398 else unit
381399 }
382400
383401
384-func ca () = valueOrElse(getBoolean(this, l), false)
402+func ch () = valueOrElse(getBoolean(this, l), false)
385403
386404
387-func cb () = valueOrElse(getBoolean(this, m), false)
405+func ci () = valueOrElse(getBoolean(this, m), false)
388406
389407
390-func cc () = valueOrElse(getBoolean(this, n), false)
408+func cj () = valueOrElse(getBoolean(this, n), false)
391409
392410
393-func cd (ce,cf,cg) = if (ce)
411+func ck (cl,cm,cn) = if (cl)
394412 then {
395- let ch = (aW() - cg)
396- if ((0 >= ch))
413+ let co = (bb() - cn)
414+ if ((0 >= co))
397415 then throw("Tx lead to base asset reserve <= 0, revert")
398- else $Tuple3((aV() + cf), ch, (aZ() + cg))
416+ else $Tuple3((aZ() + cm), co, (bf() + cn))
399417 }
400418 else {
401- let ci = (aV() - cf)
402- if ((0 >= ci))
419+ let cp = (aZ() - cm)
420+ if ((0 >= cp))
403421 then throw("Tx lead to base quote reserve <= 0, revert")
404- else $Tuple3(ci, (aW() + cg), (aZ() - cg))
422+ else $Tuple3(cp, (bb() + cn), (bf() - cn))
405423 }
406424
407425
408-func cj (ck,cl) = {
409- let cm = toBigInt(ck)
410- let cn = toBigInt(cl)
411- aH(cm, cn)
426+func cq (cr,cs) = {
427+ let ct = toBigInt(cr)
428+ let cu = toBigInt(cs)
429+ aK(ct, cu)
412430 }
413431
414432
415-func co (ce,cf) = {
416- let ck = aV()
417- let cl = aW()
418- let cp = aX()
419- let cq = aY()
420- let cr = aD(cf, cp)
421- let aL = cj(ck, cl)
422- let cs = if (ce)
423- then (ck + cr)
424- else (ck - cr)
425- let ct = toInt(aG(aL, toBigInt(cs)))
426- let cu = aI((ct - cl))
427- let cv = if (ce)
428- then cu
429- else -(cu)
430- let cw = cd(ce, cr, cu)
431- let cx = cw._1
432- let cy = cw._2
433- let cz = cw._3
434- let cA = aD(aF(ck, cp), aF(cl, cq))
435- let cB = aD(cf, cu)
436- let cC = aI((cA - cB))
437- let cD = (au - aD(cA, (cA + cC)))
438- let cE = bl()
439- if ((cD > cE))
440- then throw(((((((((((((("Price impact " + toString(cD)) + " > max price impact ") + toString(cE)) + " before quote asset: ") + toString(ck)) + " before base asset: ") + toString(cl)) + " quote asset amount to exchange: ") + toString(cf)) + " price before: ") + toString(cA)) + " marketPrice: ") + toString(cB)))
441- else $Tuple4(cv, cx, cy, cz)
433+func cv (cl,cm) = {
434+ let cr = aZ()
435+ let cs = bb()
436+ let cw = bd()
437+ let cx = be()
438+ let cy = aG(cm, cw)
439+ let aO = cq(cr, cs)
440+ let cz = if (cl)
441+ then (cr + cy)
442+ else (cr - cy)
443+ let cA = toInt(aJ(aO, toBigInt(cz)))
444+ let cB = aL((cA - cs))
445+ let cC = if (cl)
446+ then cB
447+ else -(cB)
448+ let cD = ck(cl, cy, cB)
449+ let cE = cD._1
450+ let cF = cD._2
451+ let cG = cD._3
452+ let cH = aG(aI(cr, cw), aI(cs, cx))
453+ let cI = aG(cm, cB)
454+ let cJ = aL((cH - cI))
455+ let cK = (av - aG(cH, (cH + cJ)))
456+ let cL = br()
457+ if ((cK > cL))
458+ then throw(((((((((((((("Price impact " + toString(cK)) + " > max price impact ") + toString(cL)) + " before quote asset: ") + toString(cr)) + " before base asset: ") + toString(cs)) + " quote asset amount to exchange: ") + toString(cm)) + " price before: ") + toString(cH)) + " marketPrice: ") + toString(cI)))
459+ else $Tuple4(cC, cE, cF, cG)
442460 }
443461
444462
445-func cF (cG,cH) = {
446- let cI = ((((bw() - cH) / 1000) / 60) * au)
447- let cJ = aD(aF(aF(cG, cI), aT()), av)
448- cJ
463+func cM (cN,cO) = {
464+ let cP = ((((bD() - cO) / 1000) / 60) * av)
465+ let cQ = aG(aI(aI(cN, cP), aX()), aw)
466+ cQ
449467 }
450468
451469
452-func cK (cL,cG,cM,cH,cN) = {
453- let cO = if ((cL != 0))
470+func cR (cS,cN,cT,cO,cU) = {
471+ let cV = if ((cS != 0))
454472 then {
455- let cP = bE(cL)
456- aF((cP - cM), cL)
473+ let cW = bL(cS)
474+ aI((cW - cT), cS)
457475 }
458476 else 0
459- let cJ = cF(cG, cH)
460- let cQ = (((cN - cJ) - cO) + cG)
461- let cR = if ((0 > cQ))
462- then $Tuple2(0, aI(cQ))
463- else $Tuple2(aI(cQ), 0)
464- let cS = cR._1
465- let cT = cR._2
466- $Tuple4(cS, cT, cO, cJ)
477+ let cQ = cM(cN, cO)
478+ let cX = (((cU - cQ) - cV) + cN)
479+ let cY = if ((0 > cX))
480+ then $Tuple2(0, aL(cX))
481+ else $Tuple2(aL(cX), 0)
482+ let cZ = cY._1
483+ let da = cY._2
484+ $Tuple4(cZ, da, cV, cQ)
467485 }
468486
469487
470-func cU (ce,cg,cV,cW,cX,cY,cZ) = {
471- let cA = aD(aF(cW, cX), aF(cY, cZ))
472- if ((cg == 0))
488+func db (cl,cn,dc,dd,de,df,dg) = {
489+ let cH = aG(aI(dd, de), aI(df, dg))
490+ if ((cn == 0))
473491 then throw("Invalid base asset amount")
474492 else {
475- let aL = cj(cW, cY)
476- let da = if (ce)
477- then (cY + cg)
478- else (cY - cg)
479- let db = toInt(aG(aL, toBigInt(da)))
480- let dc = aI((db - cW))
481- let dd = aF(dc, cX)
482- let cE = bl()
483- let de = cd(!(ce), dc, cg)
484- let cx = de._1
485- let cy = de._2
486- let cz = de._3
487- let cB = aD(dd, cg)
488- let cC = aI((cA - cB))
489- let cD = (au - aD(cA, (cA + cC)))
490- if (if ((cD > cE))
491- then cV
493+ let aO = cq(dd, df)
494+ let dh = if (cl)
495+ then (df + cn)
496+ else (df - cn)
497+ let di = toInt(aJ(aO, toBigInt(dh)))
498+ let dj = aL((di - dd))
499+ let dk = aI(dj, de)
500+ let cL = br()
501+ let dl = ck(!(cl), dj, cn)
502+ let cE = dl._1
503+ let cF = dl._2
504+ let cG = dl._3
505+ let cI = aG(dk, cn)
506+ let cJ = aL((cH - cI))
507+ let cK = (av - aG(cH, (cH + cJ)))
508+ if (if ((cK > cL))
509+ then dc
492510 else false)
493- then throw(((((((((((((("Price impact " + toString(cD)) + " > max price impact ") + toString(cE)) + " before quote asset: ") + toString(cW)) + " before base asset: ") + toString(cY)) + " base asset amount to exchange: ") + toString(cg)) + " price before: ") + toString(cA)) + " market price: ") + toString(cB)))
494- else $Tuple7(dd, cx, cy, cz, (br() - (if (ce)
495- then aI(cg)
496- else 0)), (bq() - (if (!(ce))
497- then aI(cg)
498- else 0)), cD)
511+ then throw(((((((((((((("Price impact " + toString(cK)) + " > max price impact ") + toString(cL)) + " before quote asset: ") + toString(dd)) + " before base asset: ") + toString(df)) + " base asset amount to exchange: ") + toString(cn)) + " price before: ") + toString(cH)) + " market price: ") + toString(cI)))
512+ else $Tuple7(dk, cE, cF, cG, (bx() - (if (cl)
513+ then aL(cn)
514+ else 0)), (bw() - (if (!(cl))
515+ then aL(cn)
516+ else 0)), cK)
499517 }
500518 }
501519
502520
503-func df (ce,cg,cV) = cU(ce, cg, cV, aV(), aX(), aW(), aY())
521+func dm (cl,cn,dc) = db(cl, cn, dc, aZ(), bd(), bb(), be())
504522
505523
506-func dg (dh,bX,bY) = {
507- let di = valueOrErrorMessage(getInteger(dh, bX), ((("Can not get oracle price. Oracle: " + toString(dh)) + " key: ") + bX))
508- if ((bY != ""))
524+func dn (do,ce,cf) = {
525+ let dp = valueOrErrorMessage(getInteger(do, ce), ((("Can not get oracle price. Oracle: " + toString(do)) + " key: ") + ce))
526+ if ((cf != ""))
509527 then {
510- let dj = lastBlock.height
511- let dk = valueOrErrorMessage(getInteger(dh, bY), ((("Can not get oracle block. Oracle: " + toString(dh)) + " key: ") + bY))
512- if (((dj - dk) > bu()))
513- then throw(((("Oracle stale data. Last oracle block: " + toString(dk)) + " current block: ") + toString(dj)))
514- else di
528+ let dq = height
529+ let dr = valueOrErrorMessage(getInteger(do, cf), ((("Can not get oracle block. Oracle: " + toString(do)) + " key: ") + cf))
530+ if (((dq - dr) > bA()))
531+ then throw(((("Oracle stale data. Last oracle block: " + toString(dr)) + " current block: ") + toString(dq)))
532+ else dp
515533 }
516- else di
534+ else dp
517535 }
518536
519537
520-func dl () = {
521- let dm = valueOrErrorMessage(bS(a), "No base asset oracle data")
522- let dn = dg(dm._1, dm._2, dm._3)
523- let do = bS(b)
524- let dp = if (isDefined(do))
538+func ds () = {
539+ let dt = valueOrErrorMessage(bZ(a), "No base asset oracle data")
540+ let du = dn(dt._1, dt._2, dt._3)
541+ let dv = bZ(b)
542+ let dw = if (isDefined(dv))
525543 then {
526- let dq = value(do)
527- dg(dq._1, dq._2, dq._3)
544+ let dx = value(dv)
545+ dn(dx._1, dx._2, dx._3)
528546 }
529- else au
530- aD(dn, dp)
547+ else av
548+ aG(du, dw)
531549 }
532550
533551
534-func dr () = {
535- let dm = valueOrErrorMessage(bS(a), "No base asset oracle data")
536- let dh = dm._1
537- let bZ = dm._4
538- if ((bZ != ""))
552+func dy () = {
553+ let dt = valueOrErrorMessage(bZ(a), "No base asset oracle data")
554+ let do = dt._1
555+ let cg = dt._4
556+ if ((cg != ""))
539557 then {
540- let ds = valueOrErrorMessage(getBoolean(dh, bZ), ((("Can not get oracle is open/closed. Oracle: " + toString(dh)) + " key: ") + bZ))
541- !(ds)
558+ let dz = valueOrErrorMessage(getBoolean(do, cg), ((("Can not get oracle is open/closed. Oracle: " + toString(do)) + " key: ") + cg))
559+ !(dz)
542560 }
543561 else false
544562 }
545563
546564
547-func dt (du,cW,cY,cp,cq) = {
548- let dv = aD(aF(cW, cp), aF(cY, cq))
549- let dw = aD((du + dv), (2 * au))
550- let dt = aD(aI((du - dv)), dw)
551- dt
565+func dA (dB,dd,df,cw,cx) = {
566+ let dC = aG(aI(dd, cw), aI(df, cx))
567+ let dD = aG((dB + dC), (2 * av))
568+ let dA = aG(aL((dB - dC)), dD)
569+ dA
552570 }
553571
554572
555-func dx (cW,cY) = {
556- let dy = dl()
557- let cp = aX()
558- let cq = aY()
559- let dz = dt(dy, aV(), aW(), cp, cq)
560- let dA = dt(dy, cW, cY, cp, cq)
561- if (if ((dA > bm()))
562- then (dA > dz)
573+func dE (dd,df) = {
574+ let dF = ds()
575+ let cw = bd()
576+ let cx = be()
577+ let dG = dA(dF, aZ(), bb(), cw, cx)
578+ let dH = dA(dF, dd, df, cw, cx)
579+ if (if ((dH > bs()))
580+ then (dH > dG)
563581 else false)
564- then throw(((("Price spread " + toString(dA)) + " > max price spread ") + toString(bm())))
582+ then throw(((("Price spread " + toString(dH)) + " > max price spread ") + toString(bs())))
565583 else true
566584 }
567585
568586
569-func dB (dC,dD) = {
570- let dE = bn()
571- if ((dC > dE))
572- then throw(((("Long open notional " + toString(dC)) + " > max open notional ") + toString(dE)))
573- else if ((dD > dE))
574- then throw(((("Short open notional " + toString(dD)) + " > max open notional ") + toString(dE)))
587+func dI (dJ,dK) = {
588+ let dL = bt()
589+ if ((dJ > dL))
590+ then throw(((("Long open notional " + toString(dJ)) + " > max open notional ") + toString(dL)))
591+ else if ((dK > dL))
592+ then throw(((("Short open notional " + toString(dK)) + " > max open notional ") + toString(dL)))
575593 else true
576594 }
577595
578596
579-func dF () = {
580- let cW = aV()
581- let cY = aW()
582- let cp = aX()
583- let cq = aY()
584- aD(aF(cW, cp), aF(cY, cq))
597+func dM () = {
598+ let dd = aZ()
599+ let df = bb()
600+ let cw = bd()
601+ let cx = be()
602+ aG(aI(dd, cw), aI(df, cx))
585603 }
586604
587605
588-func dG () = {
589- let dy = dl()
590- let dH = dF()
591- (aD(aI((dy - dH)), dy) > bk())
606+func dN () = {
607+ let dF = ds()
608+ let dO = dM()
609+ (aG(aL((dF - dO)), dF) > bq())
592610 }
593611
594612
595-func dI (bF,dJ,cW,cX,cY,cZ) = {
596- let dK = aI(bF)
597- let dL = (0 > bF)
598- let dM = if ((dJ == ax))
613+func dP (bM,dQ,dd,de,df,dg) = {
614+ let dR = aL(bM)
615+ let dS = (0 > bM)
616+ let dT = if ((dQ == ay))
599617 then {
600- let dN = cU(!(dL), dK, false, cW, cX, cY, cZ)._1
601- dN
618+ let dU = db(!(dS), dR, false, dd, de, df, dg)._1
619+ dU
602620 }
603- else aF(dK, dl())
604- dM
621+ else aI(dR, ds())
622+ dT
605623 }
606624
607625
608-func dO (bF,dP,cW,cX,cY,cZ,dJ) = if ((bF == 0))
626+func dV (bM,dW,dd,de,df,dg,dQ) = if ((bM == 0))
609627 then throw("Invalid position size")
610628 else {
611- let dL = (0 > bF)
612- let dM = dI(bF, dJ, cW, cX, cY, cZ)
613- let dQ = if (dL)
614- then (dP - dM)
615- else (dM - dP)
616- $Tuple2(dM, dQ)
629+ let dS = (0 > bM)
630+ let dT = dP(bM, dQ, dd, de, df, dg)
631+ let dX = if (dS)
632+ then (dW - dT)
633+ else (dT - dW)
634+ $Tuple2(dT, dX)
617635 }
618636
619637
620-func dR (bH,bI,dJ) = {
621- let dS = bG(bH, bI)
622- let bM = dS._1
623- let dT = dS._2
624- let dU = dS._3
625- let dV = dS._4
626- dO(bM, dU, aV(), aX(), aW(), aY(), dJ)
638+func dY (bO,bP,dQ) = {
639+ let dZ = bN(bO, bP)
640+ let bT = dZ._1
641+ let ea = dZ._2
642+ let eb = dZ._3
643+ let ec = dZ._4
644+ dV(bT, eb, aZ(), bd(), bb(), be(), dQ)
627645 }
628646
629647
630-func dW (dX,dY,dZ) = aD((dX - dY), dZ)
648+func ed (ee,ef,eg) = aG((ee - ef), eg)
631649
632650
633-func ea (bH,bI,dJ) = {
634- let eb = bG(bH, bI)
635- let bM = eb._1
636- let dT = eb._2
637- let ec = eb._3
638- let ed = eb._4
639- let ee = eb._5
640- let ef = dR(bH, bI, dJ)
641- let dM = ef._1
642- let dQ = ef._2
643- let eg = cK(bM, dT, ed, ee, dQ)
644- let cS = eg._1
645- let cT = eg._2
646- dW(cS, cT, dM)
651+func eh (bO,bP,dQ) = {
652+ let ei = bN(bO, bP)
653+ let bT = ei._1
654+ let ea = ei._2
655+ let ej = ei._3
656+ let ek = ei._4
657+ let el = ei._5
658+ let em = dY(bO, bP, dQ)
659+ let dT = em._1
660+ let dX = em._2
661+ let en = cR(bT, ea, ek, el, dX)
662+ let cZ = en._1
663+ let da = en._2
664+ ed(cZ, da, dT)
647665 }
648666
649667
650-func eh (bH,bI) = ea(bH, bI, ax)
668+func eo (bO,bP) = eh(bO, bP, ay)
651669
652670
653-func ei (bH,bF) = {
654- let ej = aJ(bj(), (au - aD(eh(bH, bN(bF)), bh())))
655- let ek = aF(aI(bF), ej)
656- let el = df((bF > 0), ek, false)
657- let em = el._1
658- let cD = el._7
659- if ((bl() > cD))
660- then ek
661- else aF(aI(bF), bj())
671+func ep (bO,bM) = {
672+ let eq = aM(bp(), (av - aG(eo(bO, bU(bM)), bn())))
673+ let er = aI(aL(bM), eq)
674+ let es = dm((bM > 0), er, false)
675+ let et = es._1
676+ let cK = es._7
677+ if ((br() > cK))
678+ then er
679+ else aI(aL(bM), bp())
662680 }
663681
664682
665-func en (bH,bI,eo,ep,eq,er,cV,es) = {
666- let et = bG(bH, bI)
667- let eu = et._1
668- let ev = et._2
669- let ew = et._3
670- let ex = et._4
671- let ey = et._5
672- let ez = (eu > 0)
673- let eA = aI(eu)
674- if (if ((eA >= eo))
675- then (eo > 0)
683+func eu (bO,bP,ev,ew,ex,ey,dc,ez) = {
684+ let eA = bN(bO, bP)
685+ let eB = eA._1
686+ let eC = eA._2
687+ let eD = eA._3
688+ let eE = eA._4
689+ let eF = eA._5
690+ let eG = (eB > 0)
691+ let eH = aL(eB)
692+ if (if ((eH >= ev))
693+ then (ev > 0)
676694 else false)
677695 then {
678- let eB = (eA > eo)
679- let eC = df((eu > 0), eo, cV)
680- let eD = eC._1
681- let cs = eC._2
682- let ct = eC._3
683- let eE = eC._4
684- let eF = if ((eu > 0))
685- then -(eo)
686- else eo
687- let eG = dR(bH, bI, ax)
688- let eH = eG._1
689- let dQ = eG._2
690- let eI = aD(aI(eF), eA)
691- let eJ = aF(dQ, eI)
692- let eK = cK(eu, ev, ex, ey, dQ)
693- let eL = eK._1
694- let eM = eK._2
695- let eN = eK._3
696- let cJ = eK._4
697- let eO = cK(eu, ev, ex, ey, eJ)._2
698- let eP = aF(aF(eH, eI), ep)
699- let eQ = (dQ - eJ)
700- let eR = if ((eu > 0))
701- then ((eH - eD) - eQ)
702- else ((eQ + eH) - eD)
703- let eS = (eu + eF)
704- let eT = if ((eS == 0))
696+ let eI = (eH > ev)
697+ let eJ = dm((eB > 0), ev, dc)
698+ let eK = eJ._1
699+ let cz = eJ._2
700+ let cA = eJ._3
701+ let eL = eJ._4
702+ let eM = if ((eB > 0))
703+ then -(ev)
704+ else ev
705+ let eN = dY(bO, bP, ay)
706+ let eO = eN._1
707+ let dX = eN._2
708+ let eP = aG(aL(eM), eH)
709+ let eQ = aI(dX, eP)
710+ let eR = cR(eB, eC, eE, eF, dX)
711+ let eS = eR._1
712+ let eT = eR._2
713+ let eU = eR._3
714+ let cQ = eR._4
715+ let eV = cR(eB, eC, eE, eF, eQ)._2
716+ let eW = aI(aI(eO, eP), ew)
717+ let eX = (dX - eQ)
718+ let eY = if ((eB > 0))
719+ then ((eO - eK) - eX)
720+ else ((eX + eO) - eK)
721+ let eZ = (eB + eM)
722+ let fa = if ((eZ == 0))
705723 then $Tuple2(0, 0)
706- else $Tuple2(aI(eR), bE(eS))
707- let eU = eT._1
708- let eV = eT._2
709- let eW = (ew - eU)
710- let eX = ea(bH, bI, ax)
711- let eY = if ((eu > 0))
712- then (aF((eU + eQ), eX) - eQ)
713- else (aF((eU - eQ), eX) - eQ)
714- let eZ = ((eL - (eY + eQ)) - eP)
715- let fa = if ((0 > eZ))
716- then if (es)
724+ else $Tuple2(aL(eY), bL(eZ))
725+ let fb = fa._1
726+ let fc = fa._2
727+ let fd = (eD - fb)
728+ let fe = eh(bO, bP, ay)
729+ let ff = if ((eB > 0))
730+ then (aI((fb + eX), fe) - eX)
731+ else (aI((fb - eX), fe) - eX)
732+ let fg = ((eS - (ff + eX)) - eW)
733+ let fh = if ((0 > fg))
734+ then if (ez)
717735 then 0
718736 else throw("Invalid internalClosePosition params: unable to pay fee")
719- else eZ
720- let fb = if (er)
721- then (eY + fa)
722- else eY
723- if (if ((eq != 0))
724- then (eq > eD)
737+ else fg
738+ let fi = if (ey)
739+ then (ff + fh)
740+ else ff
741+ if (if ((ex != 0))
742+ then (ex > eK)
725743 else false)
726- then throw(((("Limit error: " + toString(eD)) + " < ") + toString(eq)))
727- else $Tuple17(eS, fb, eU, eV, eO, eJ, if (if (er)
728- then eB
744+ then throw(((("Limit error: " + toString(eK)) + " < ") + toString(ex)))
745+ else $Tuple17(eZ, fi, fb, fc, eV, eQ, if (if (ey)
746+ then eI
729747 else false)
730748 then 0
731- else fa, cs, ct, eE, (ba() - eW), (br() - (if (ez)
732- then aI(eF)
733- else 0)), (bq() - (if (!(ez))
734- then aI(eF)
735- else 0)), (bc() - (if (ez)
736- then eW
737- else 0)), (bb() - (if (!(ez))
738- then eW
739- else 0)), (eP + cJ), eD)
749+ else fh, cz, cA, eL, (bg() - fd), (bx() - (if (eG)
750+ then aL(eM)
751+ else 0)), (bw() - (if (!(eG))
752+ then aL(eM)
753+ else 0)), (bi() - (if (eG)
754+ then fd
755+ else 0)), (bh() - (if (!(eG))
756+ then fd
757+ else 0)), (eW + cQ), eK)
740758 }
741- else throw(((("Invalid internalClosePosition params: invalid position size: " + toString(eo)) + " max: ") + toString(eA)))
759+ else throw(((("Invalid internalClosePosition params: invalid position size: " + toString(ev)) + " max: ") + toString(eH)))
742760 }
743761
744762
745-func fc () = {
746- let bF = aZ()
747- if ((bF == 0))
748- then $Tuple2(aV(), aW())
763+func fj () = {
764+ let bM = bf()
765+ if ((bM == 0))
766+ then $Tuple2(aZ(), bb())
749767 else {
750- let fd = (bF > 0)
751- let fe = df(fd, aI(bF), false)
752- let ff = fe._1
753- let fg = fe._2
754- let fh = fe._3
755- $Tuple2(fg, fh)
768+ let fk = (bM > 0)
769+ let fl = dm(fk, aL(bM), false)
770+ let fm = fl._1
771+ let fn = fl._2
772+ let fo = fl._3
773+ $Tuple2(fn, fo)
756774 }
757775 }
758776
759777
760-func fi (fj,aZ,fk,fl) = {
761- let fm = toBigInt(fj)
762- let fn = toBigInt(aZ)
763- let fo = toBigInt(fk)
764- let fp = toBigInt(fl)
765- let aL = aH(fo, fm)
766- let fq = (fm + fn)
767- let fr = aG(aL, fq)
768- let fs = aG(fr, fq)
769- let ft = aG(fp, fs)
770- toInt(ft)
778+func fp (fq,bf,fr,fs) = {
779+ let ft = toBigInt(fq)
780+ let fu = toBigInt(bf)
781+ let fv = toBigInt(fr)
782+ let fw = toBigInt(fs)
783+ let aO = aK(fv, ft)
784+ let fx = (ft + fu)
785+ let fy = aJ(aO, fx)
786+ let fz = aJ(fy, fx)
787+ let fA = aJ(fw, fz)
788+ toInt(fA)
771789 }
772790
773791
774-func fu (fv,ck,cl) = {
775- let bF = aZ()
776- if ((bF == 0))
792+func fB (fC,cr,cs) = {
793+ let bM = bf()
794+ if ((bM == 0))
777795 then {
778- let fw = aD(aF(fv, cl), ck)
779- $Tuple3(fw, au, 0)
796+ let fD = aG(aI(fC, cs), cr)
797+ $Tuple3(fD, av, 0)
780798 }
781799 else {
782- let fd = (bF > 0)
783- let ff = df(fd, aI(bF), false)._1
784- let fw = fi(cl, bF, ck, fv)
785- let fx = au
786- let fy = dO(bF, ff, ck, fw, cl, fx, ax)._2
787- $Tuple3(fw, fx, fy)
800+ let fk = (bM > 0)
801+ let fm = dm(fk, aL(bM), false)._1
802+ let fD = fp(cs, bM, cr, fC)
803+ let fE = av
804+ let fF = dV(bM, fm, cr, fD, cs, fE, ay)._2
805+ $Tuple3(fD, fE, fF)
788806 }
789807 }
790808
791809
792-func fz () = {
793- let fA = dl()
794- let fB = dF()
795- let fC = (fB - fA)
796- if (if (if ((bq() == 0))
810+func fG () = {
811+ let fH = ds()
812+ let fI = dM()
813+ let fJ = (fI - fH)
814+ if (if (dy())
797815 then true
798- else (br() == 0))
799- then true
800- else dr())
816+ else if ((bB() == aA))
817+ then if ((bw() == 0))
818+ then true
819+ else (bx() == 0)
820+ else false)
801821 then $Tuple3(0, 0, 0)
802- else if ((0 > fC))
822+ else if ((0 > fJ))
803823 then {
804- let fD = aD(aF(fC, bf()), aw)
805- if ((bv() == az))
824+ let fK = aG(aI(fJ, bl()), ax)
825+ if ((bB() == aA))
806826 then {
807- let fE = aD(aF(fD, bq()), br())
808- $Tuple3(fD, fE, 0)
827+ let fL = aG(aI(fK, bw()), bx())
828+ $Tuple3(fK, fL, 0)
809829 }
810830 else {
811- let fF = aI(aF(fD, bq()))
812- let fG = aI(aF(fD, br()))
813- let fH = (fF - fG)
814- $Tuple3(fD, fD, fH)
831+ let fM = aL(aI(fK, bw()))
832+ let fN = aL(aI(fK, bx()))
833+ let fO = (fM - fN)
834+ $Tuple3(fK, fK, fO)
815835 }
816836 }
817837 else {
818- let fE = aD(aF(fC, bf()), aw)
819- if ((bv() == az))
838+ let fL = aG(aI(fJ, bl()), ax)
839+ if ((bB() == aA))
820840 then {
821- let fD = aD(aF(fE, br()), bq())
822- $Tuple3(fD, fE, 0)
841+ let fK = aG(aI(fL, bx()), bw())
842+ $Tuple3(fK, fL, 0)
823843 }
824844 else {
825- let fG = aI(aF(fE, br()))
826- let fF = aI(aF(fE, bq()))
827- let fH = (fG - fF)
828- $Tuple3(fE, fE, fH)
845+ let fN = aL(aI(fL, bx()))
846+ let fM = aL(aI(fL, bw()))
847+ let fO = (fN - fM)
848+ $Tuple3(fL, fL, fO)
829849 }
830850 }
831851 }
832852
833853
834-func fI (fJ,fK) = {
835- let fL = aS()
836- let fM = aF(fL, fK)
837- let fN = if ((fJ != ""))
854+func fP (fQ,fR) = {
855+ let fS = aW()
856+ let fT = aI(fS, fR)
857+ let fU = if ((fQ != ""))
838858 then {
839- let fO = aO(am(), ab(ao, fJ))
840- if ((fO == ap))
859+ let fV = aR(an(), ac(ap, fQ))
860+ if ((fV == aq))
841861 then {
842- let fP = aQ(am(), ab(an, fJ))
843- let fQ = aF(fM, fP)
844- $Tuple2(fQ, true)
862+ let fW = aT(an(), ac(ao, fQ))
863+ let fX = aI(fT, fW)
864+ $Tuple2(fX, true)
845865 }
846866 else throw("Invalid attached artifact")
847867 }
848- else $Tuple2(fM, false)
849- let fQ = fN._1
850- let fR = fN._2
851- $Tuple2(fQ, fR)
868+ else $Tuple2(fT, false)
869+ let fX = fU._1
870+ let fY = fU._2
871+ $Tuple2(fX, fY)
852872 }
853873
854874
855-func fS (bH,fJ) = {
856- let fT = invoke(aj(), "computeFeeDiscount", [bH], nil)
857- if ((fT == fT))
875+func fZ (bO,fQ) = {
876+ let ga = invoke(ak(), "computeFeeDiscount", [bO], nil)
877+ if ((ga == ga))
858878 then {
859- let fU = {
860- let bL = fT
861- if ($isInstanceOf(bL, "Int"))
879+ let gb = {
880+ let bS = ga
881+ if ($isInstanceOf(bS, "Int"))
862882 then {
863- let fV = bL
864- fV
883+ let gc = bS
884+ gc
865885 }
866886 else throw("Invalid computeFeeDiscount result")
867887 }
868- let fW = fI(fJ, fU)
869- let fQ = fW._1
870- let fR = fW._2
871- $Tuple2(fQ, fR)
888+ let gd = fP(fQ, gb)
889+ let fX = gd._1
890+ let fY = gd._2
891+ $Tuple2(fX, fY)
872892 }
873893 else throw("Strict value is not equal to itself.")
874894 }
875895
876896
877-func fX (by) = {
878- let fY = if ((size(by.payments) > 1))
879- then toBase58String(valueOrErrorMessage(by.payments[1].assetId, "Invalid artifactId"))
897+func ge (bF) = {
898+ let gf = if ((size(bF.payments) > 1))
899+ then toBase58String(valueOrErrorMessage(bF.payments[1].assetId, "Invalid artifactId"))
880900 else ""
881- fY
901+ gf
882902 }
883903
884904
885-func fZ (ga) = {
886- let gb = aF(ga, bt())
887- let gc = (ga - gb)
888- $Tuple2(gb, gc)
905+func gg (gh) = {
906+ let gi = aI(gh, bz())
907+ let gj = (gh - gi)
908+ $Tuple2(gi, gj)
889909 }
890910
891911
892-func gd (ge,gf,gg,gh,ep,gi,gj,gk,gl,dE,gm,gn,go,gp) = [IntegerEntry(r, ge), IntegerEntry(s, gf), IntegerEntry(t, gg), IntegerEntry(q, gh), IntegerEntry(o, ep), IntegerEntry(v, gi), IntegerEntry(w, gj), IntegerEntry(u, gk), IntegerEntry(x, gl), IntegerEntry(y, dE), IntegerEntry(z, gm), IntegerEntry(A, gm), IntegerEntry(p, go), IntegerEntry(B, gp)]
912+func gk (gl,gm,gn,go,ew,gp,gq,gr,gs,dL,gt,gu,gv,gw,gx) = [IntegerEntry(r, gl), IntegerEntry(s, gm), IntegerEntry(t, gn), IntegerEntry(q, go), IntegerEntry(o, ew), IntegerEntry(v, gp), IntegerEntry(w, gq), IntegerEntry(u, gr), IntegerEntry(x, gs), IntegerEntry(y, dL), IntegerEntry(z, gt), IntegerEntry(A, gu), IntegerEntry(p, gv), IntegerEntry(B, gw), IntegerEntry(C, gx)]
893913
894914
895-func gq (gr,gs,gt,gu,gv) = [IntegerEntry(E, gr), IntegerEntry(C, gs), IntegerEntry(D, gt), IntegerEntry(F, gu), IntegerEntry(G, gv)]
915+func gy (gz,gA,gB,gC,gD) = [IntegerEntry(F, gz), IntegerEntry(D, gA), IntegerEntry(E, gB), IntegerEntry(G, gC), IntegerEntry(H, gD)]
896916
897917
898-func gw (gx,bH,bI) = {
899- let bJ = ((bH + "_") + toString(bI))
900- if (gx)
918+func gE (gF,bO,bP) = {
919+ let bQ = ((bO + "_") + toString(bP))
920+ if (gF)
901921 then {
902- let gy = bs()
903-[IntegerEntry(ab(i, bJ), (gy + 1)), IntegerEntry(d, (gy + 1))]
922+ let gG = by()
923+[IntegerEntry(ac(i, bQ), (gG + 1)), IntegerEntry(d, (gG + 1))]
904924 }
905925 else nil
906926 }
907927
908928
909-func gz (gx,bH,bI,ep) = {
910- let bJ = ((bH + "_") + toString(bI))
911- if (gx)
912- then [IntegerEntry(ab(j, bJ), ep)]
929+func gH (gF,bO,bP,ew) = {
930+ let bQ = ((bO + "_") + toString(bP))
931+ if (gF)
932+ then [IntegerEntry(ac(j, bQ), ew)]
913933 else nil
914934 }
915935
916936
917-func gA (bH,eo,gB,gC,cP,gD) = {
918- let fd = bN(eo)
919- let bJ = ((bH + "_") + toString(fd))
920-[IntegerEntry(ab(e, bJ), eo), IntegerEntry(ab(f, bJ), gB), IntegerEntry(ab(g, bJ), gC), IntegerEntry(ab(h, bJ), cP), IntegerEntry(ab(k, bJ), gD)]
937+func gI (bO,ev,gJ,gK,cW,gL) = {
938+ let fk = bU(ev)
939+ let bQ = ((bO + "_") + toString(fk))
940+[IntegerEntry(ac(e, bQ), ev), IntegerEntry(ac(f, bQ), gJ), IntegerEntry(ac(g, bQ), gK), IntegerEntry(ac(h, bQ), cW), IntegerEntry(ac(k, bQ), gL)]
921941 }
922942
923943
924-func gE (ck,cl) = [IntegerEntry(H, ck), IntegerEntry(I, cl)]
944+func gM (cr,cs) = if (if ((0 > cr))
945+ then true
946+ else (0 > cs))
947+ then throw("Invalid amount to update reserves")
948+ else if (if ((cr != ba()))
949+ then true
950+ else (cs != bc()))
951+ then [IntegerEntry(I, cr), IntegerEntry(J, cs)]
952+ else nil
925953
926954
927-func gF (cp,cq) = [IntegerEntry(J, cp), IntegerEntry(K, cq)]
955+func gN (cw,cx) = if (if ((cw != bd()))
956+ then true
957+ else (cx != be()))
958+ then [IntegerEntry(K, cw), IntegerEntry(L, cx)]
959+ else nil
928960
929961
930-func gG (ck,cl,gH,gI,gJ,gK,gL,gM) = {
931- let cp = aX()
932- let cq = aY()
933- if (((gJ - gK) != gH))
934- then throw(((((("Invalid AMM state data: " + toString(gJ)) + " + ") + toString(gK)) + " != ") + toString(gH)))
935- else (gE(ck, cl) ++ [IntegerEntry(L, gH), IntegerEntry(O, gI), IntegerEntry(M, gJ), IntegerEntry(N, gK), IntegerEntry(Q, gL), IntegerEntry(P, gM)])
962+func gO (cr,cs,gP,gQ,gR,gS,gT,gU) = {
963+ let cw = bd()
964+ let cx = be()
965+ if (((gR - gS) != gP))
966+ then throw(((((("Invalid AMM state data: " + toString(gR)) + " - ") + toString(gS)) + " != ") + toString(gP)))
967+ else (gM(cr, cs) ++ [IntegerEntry(M, gP), IntegerEntry(P, gQ), IntegerEntry(N, gR), IntegerEntry(O, gS), IntegerEntry(R, gT), IntegerEntry(Q, gU)])
936968 }
937969
938970
939-func gN (bH,bI) = {
940- let bJ = ((bH + "_") + toString(bI))
941-[DeleteEntry(ab(e, bJ)), DeleteEntry(ab(f, bJ)), DeleteEntry(ab(g, bJ)), DeleteEntry(ab(h, bJ)), DeleteEntry(ab(j, bJ)), DeleteEntry(ab(k, bJ))]
971+func gV (bO,bP) = {
972+ let bQ = ((bO + "_") + toString(bP))
973+[DeleteEntry(ac(e, bQ)), DeleteEntry(ac(f, bQ)), DeleteEntry(ac(g, bQ)), DeleteEntry(ac(h, bQ)), DeleteEntry(ac(j, bQ)), DeleteEntry(ac(k, bQ))]
942974 }
943975
944976
945-func gO (ad,gP) = {
946- let gQ = assetBalance(this, ag())
947- if ((gP > gQ))
948- then throw(((("Unable to withdraw " + toString(gP)) + " from contract balance ") + toString(gQ)))
949- else [ScriptTransfer(ad, gP, ag())]
977+func gW (ae,gX) = {
978+ let gY = assetBalance(this, ah())
979+ if ((gX > gY))
980+ then throw(((("Unable to withdraw " + toString(gX)) + " from contract balance ") + toString(gY)))
981+ else [ScriptTransfer(ae, gX, ah())]
950982 }
951983
952984
953-func gR (by) = if ((0 > by))
985+func gZ (ha) = if ((0 > ha))
954986 then throw("Balance")
955- else [IntegerEntry(c, by)]
987+ else if (if ((aV() == 0))
988+ then true
989+ else (aV() != ha))
990+ then [IntegerEntry(c, ha)]
991+ else nil
956992
957993
958-func gS (by) = [ScriptTransfer(ah(), by, ag())]
994+func hb (bF) = [ScriptTransfer(ai(), bF, ah())]
959995
960996
961-func gT (gU,by) = if (gU)
962- then [Burn(valueOrErrorMessage(by.payments[1].assetId, "Invalid artifact"), 1)]
997+func hc (hd,bF) = if (hd)
998+ then [Burn(valueOrErrorMessage(bF.payments[1].assetId, "Invalid artifact"), 1)]
963999 else nil
9641000
9651001
966-@Callable(by)
967-func pause () = if ((by.caller != af()))
1002+@Callable(bF)
1003+func pause () = if ((bF.caller != ag()))
9681004 then throw("Invalid pause params")
9691005 else [BooleanEntry(m, true)]
9701006
9711007
9721008
973-@Callable(by)
974-func unpause () = if ((by.caller != af()))
1009+@Callable(bF)
1010+func unpause () = if ((bF.caller != ag()))
9751011 then throw("Invalid unpause params")
9761012 else [BooleanEntry(m, false)]
9771013
9781014
9791015
980-@Callable(by)
981-func setCloseOnly () = if ((by.caller != af()))
1016+@Callable(bF)
1017+func setCloseOnly () = if ((bF.caller != ag()))
9821018 then throw("Invalid setCloseOnly params")
9831019 else [BooleanEntry(n, true)]
9841020
9851021
9861022
987-@Callable(by)
988-func unsetCloseOnly () = if ((by.caller != af()))
1023+@Callable(bF)
1024+func unsetCloseOnly () = if ((bF.caller != ag()))
9891025 then throw("Invalid unsetCloseOnly params")
9901026 else [BooleanEntry(n, false)]
9911027
9921028
9931029
994-@Callable(by)
995-func addLiquidity (cf) = if (if ((by.caller != af()))
1030+@Callable(bF)
1031+func changeLiquidity (cm) = if (if ((bF.caller != ag()))
9961032 then true
997- else (0 >= cf))
998- then throw("Invalid addLiquidity params")
1033+ else (cm == 0))
1034+ then throw("Invalid changeLiquidity params")
9991035 else {
1000- let ck = aV()
1001- let cl = aW()
1002- let cp = aX()
1003- let cq = aY()
1004- let gV = aD(aF(ck, cp), aF(cl, cq))
1005- let gW = (ck + cf)
1006- let gX = (aD(aF(gW, cp), gV) - cl)
1007- let gY = (cl + gX)
1008- let gZ = fu(dl(), gW, gY)
1009- let ha = gZ._1
1010- let hb = gZ._2
1011- let fy = gZ._3
1012- let hc = if ((fy != 0))
1036+ let cr = aZ()
1037+ let cs = bb()
1038+ let cw = bd()
1039+ let cx = be()
1040+ let he = aG(aI(cr, cw), aI(cs, cx))
1041+ let hf = (cr + cm)
1042+ let hg = (aG(aI(hf, cw), he) - cs)
1043+ let hh = (cs + hg)
1044+ let hi = fB(ds(), hf, hh)
1045+ let hj = hi._1
1046+ let hk = hi._2
1047+ let fF = hi._3
1048+ let hl = if ((fF != 0))
10131049 then {
1014- let hc = invoke(ai(), "exchangeFreeAndLocked", [fy], nil)
1015- if ((hc == hc))
1050+ let hl = invoke(aj(), "exchangeFreeAndLocked", [fF], nil)
1051+ if ((hl == hl))
10161052 then nil
10171053 else throw("Strict value is not equal to itself.")
10181054 }
10191055 else nil
1020- if ((hc == hc))
1021- then (gE(gW, gY) ++ gF(ha, hb))
1056+ if ((hl == hl))
1057+ then (gM(hf, hh) ++ gN(hj, hk))
10221058 else throw("Strict value is not equal to itself.")
10231059 }
10241060
10251061
10261062
1027-@Callable(by)
1028-func removeLiquidity (cf) = if (if ((by.caller != af()))
1063+@Callable(bF)
1064+func changeSettings (gl,gm,gn,go,ew,gp,gq,gr,gs,dL,gt,gu,gv,gw,gx) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= go))
10291065 then true
1030- else (cf >= 0))
1031- then throw("Invalid removeLiquidity params")
1032- else {
1033- let ck = aV()
1034- let cl = aW()
1035- let cp = aX()
1036- let cq = aY()
1037- let gV = aD(aF(ck, cp), aF(cl, cq))
1038- let gW = (ck - cf)
1039- let hd = aI((aD(aF(gW, cp), gV) - cl))
1040- let gY = (cl - hd)
1041- let he = fu(dl(), gW, gY)
1042- let ha = he._1
1043- let hb = he._2
1044- let fy = he._3
1045- let hc = if ((fy != 0))
1046- then {
1047- let hc = invoke(ai(), "exchangeFreeAndLocked", [fy], nil)
1048- if ((hc == hc))
1049- then nil
1050- else throw("Strict value is not equal to itself.")
1051- }
1052- else nil
1053- if ((hc == hc))
1054- then (gE(gW, gY) ++ gF(ha, hb))
1055- else throw("Strict value is not equal to itself.")
1056- }
1066+ else (0 >= gl))
1067+ then true
1068+ else (0 >= gm))
1069+ then true
1070+ else (0 >= gn))
1071+ then true
1072+ else (0 >= ew))
1073+ then true
1074+ else (0 >= gp))
1075+ then true
1076+ else (0 >= gq))
1077+ then true
1078+ else (0 >= gr))
1079+ then true
1080+ else (0 >= gs))
1081+ then true
1082+ else (0 >= dL))
1083+ then true
1084+ else (0 >= gt))
1085+ then true
1086+ else (gt > av))
1087+ then true
1088+ else (0 >= gu))
1089+ then true
1090+ else (0 >= gv))
1091+ then true
1092+ else if ((gw != aB))
1093+ then (gw != aA)
1094+ else false)
1095+ then true
1096+ else if ((gx != aC))
1097+ then (gx != aD)
1098+ else false)
1099+ then true
1100+ else !(ch()))
1101+ then true
1102+ else (bF.caller != ag()))
1103+ then throw("Invalid changeSettings params")
1104+ else gk(gl, gm, gn, go, ew, gp, gq, gr, gs, dL, gt, gu, gv, gw, gx)
10571105
10581106
10591107
1060-@Callable(by)
1061-func changeSettings (ge,gf,gg,gh,ep,gi,gj,gk,gl,dE,gm,gn,go,gp) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= gh))
1108+@Callable(bF)
1109+func initialize (cr,cs,go,gl,gm,gn,ew,hm,hn,ho,gp,gq,gr,gs,dL,gt,gu,gv,gw,gx) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= cr))
10621110 then true
1063- else (0 >= ge))
1111+ else (0 >= cs))
10641112 then true
1065- else (0 >= gf))
1066- then true
1067- else (0 >= gg))
1068- then true
1069- else (0 >= ep))
1070- then true
1071- else (0 >= gi))
1072- then true
1073- else (0 >= gj))
1074- then true
1075- else (0 >= gk))
1113+ else (0 >= go))
10761114 then true
10771115 else (0 >= gl))
10781116 then true
1079- else (0 >= dE))
1080- then true
10811117 else (0 >= gm))
1082- then true
1083- else (gm > au))
10841118 then true
10851119 else (0 >= gn))
10861120 then true
1087- else (0 >= go))
1121+ else (0 >= ew))
10881122 then true
1089- else if ((gp != aA))
1090- then (gp != az)
1123+ else (0 >= gp))
1124+ then true
1125+ else (0 >= gq))
1126+ then true
1127+ else (0 >= gr))
1128+ then true
1129+ else (0 >= gs))
1130+ then true
1131+ else (0 >= dL))
1132+ then true
1133+ else (0 >= gt))
1134+ then true
1135+ else (gt > av))
1136+ then true
1137+ else (0 > gu))
1138+ then true
1139+ else (0 >= gv))
1140+ then true
1141+ else if ((gw != aB))
1142+ then (gw != aA)
10911143 else false)
10921144 then true
1093- else !(ca()))
1145+ else if ((gx != aC))
1146+ then (gx != aD)
1147+ else false)
10941148 then true
1095- else (by.caller != af()))
1096- then throw("Invalid changeSettings params")
1097- else gd(ge, gf, gg, gh, ep, gi, gj, gk, gl, dE, gm, gn, go, gp)
1149+ else ch())
1150+ then true
1151+ else (bF.caller != this))
1152+ then throw("Invalid initialize parameters")
1153+ else ((((gO(cr, cs, 0, 0, 0, 0, 0, 0) ++ gk(gl, gm, gn, go, ew, gp, gq, gr, gs, dL, gt, gu, gv, gw, gx)) ++ gy((bD() + go), 0, 0, 0, 0)) ++ gZ(0)) ++ [BooleanEntry(l, true), StringEntry(a, hm), StringEntry(b, hn), StringEntry(T, toString(addressFromStringValue(ho)))])
10981154
10991155
11001156
1101-@Callable(by)
1102-func initialize (ck,cl,gh,ge,gf,gg,ep,hf,hg,hh,gi,gj,gk,gl,dE,gm,gn,go,gp) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= ck))
1103- then true
1104- else (0 >= cl))
1105- then true
1106- else (0 >= gh))
1107- then true
1108- else (0 >= ge))
1109- then true
1110- else (0 >= gf))
1111- then true
1112- else (0 >= gg))
1113- then true
1114- else (0 >= ep))
1115- then true
1116- else (0 >= gi))
1117- then true
1118- else (0 >= gj))
1119- then true
1120- else (0 >= gk))
1121- then true
1122- else (0 >= gl))
1123- then true
1124- else (0 >= dE))
1125- then true
1126- else (0 >= gm))
1127- then true
1128- else (gm > au))
1129- then true
1130- else (0 >= gn))
1131- then true
1132- else (0 >= go))
1133- then true
1134- else if ((gp != aA))
1135- then (gp != az)
1136- else false)
1137- then true
1138- else ca())
1139- then true
1140- else (by.caller != this))
1141- then throw("Invalid initialize parameters")
1142- else ((((gG(ck, cl, 0, 0, 0, 0, 0, 0) ++ gd(ge, gf, gg, gh, ep, gi, gj, gk, gl, dE, gm, gn, go, gp)) ++ gq((bw() + gh), 0, 0, 0, 0)) ++ gR(0)) ++ [BooleanEntry(l, true), StringEntry(a, hf), StringEntry(b, hg), StringEntry(S, toString(addressFromStringValue(hh)))])
1157+@Callable(bF)
1158+func increasePosition (bP,hp,hq,hr,hs) = {
1159+ let ht = invoke(this, "updateOracle", [hs], nil)
1160+ if ((ht == ht))
1161+ then {
1162+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1163+ if ((hu == hu))
1164+ then {
1165+ let hv = invoke(this, "ensureCalledOnce", nil, nil)
1166+ if ((hv == hv))
1167+ then {
1168+ let bO = bE(bF)
1169+ let hw = bF.payments[0].amount
1170+ let hx = bF.payments[0].assetId
1171+ let hy = toBase58String(value(hx))
1172+ let hz = (hx == ah())
1173+ if (if (if (if (if (if (if (if (if ((bP != ar))
1174+ then (bP != as)
1175+ else false)
1176+ then true
1177+ else (0 >= hw))
1178+ then true
1179+ else !(ch()))
1180+ then true
1181+ else !(hz))
1182+ then true
1183+ else !(bG(aG(av, hp), aY(), true)))
1184+ then true
1185+ else ci())
1186+ then true
1187+ else cj())
1188+ then true
1189+ else dy())
1190+ then throw("Invalid increasePosition parameters")
1191+ else {
1192+ let hA = fZ(bO, ge(bF))
1193+ let fX = hA._1
1194+ let fY = hA._2
1195+ let gX = aG(hw, (aI(fX, hp) + av))
1196+ let hB = (hw - gX)
1197+ let hC = invoke(am(), "acceptPaymentWithLink", [bO, hr], [AttachedPayment(ah(), hB)])
1198+ if ((hC == hC))
1199+ then {
1200+ let hD = {
1201+ let bS = hC
1202+ if ($isInstanceOf(bS, "Int"))
1203+ then {
1204+ let gc = bS
1205+ gc
1206+ }
1207+ else throw("Invalid referrerFee")
1208+ }
1209+ let hE = (hB - hD)
1210+ let hF = bN(bO, bP)
1211+ let eB = hF._1
1212+ let eC = hF._2
1213+ let eD = hF._3
1214+ let eE = hF._4
1215+ let eF = hF._5
1216+ let hG = (eB == 0)
1217+ let hH = if ((eB > 0))
1218+ then (bP == ar)
1219+ else (bP == as)
1220+ let hI = if (!(hG))
1221+ then hH
1222+ else false
1223+ let hJ = (bP == ar)
1224+ let hK = if (if (hG)
1225+ then true
1226+ else hI)
1227+ then {
1228+ let hL = aI(gX, hp)
1229+ let hM = cv(hJ, hL)
1230+ let cC = hM._1
1231+ let cz = hM._2
1232+ let cA = hM._3
1233+ let eL = hM._4
1234+ if (if ((hq != 0))
1235+ then (hq > aL(cC))
1236+ else false)
1237+ then throw(((("Limit error: " + toString(aL(cC))) + " < ") + toString(hq)))
1238+ else {
1239+ let eZ = (eB + cC)
1240+ let hN = (bi() + (if ((eZ > 0))
1241+ then hL
1242+ else 0))
1243+ let hO = (bh() + (if ((0 > eZ))
1244+ then hL
1245+ else 0))
1246+ let hP = cR(eB, eC, eE, eF, gX)
1247+ let cZ = hP._1
1248+ let eT = hP._2
1249+ let eU = hP._3
1250+ let cQ = hP._4
1251+ if (!(dE(cz, cA)))
1252+ then throw("Over max spread limit")
1253+ else if (!(dI(hN, hO)))
1254+ then throw("Over max open notional")
1255+ else $Tuple14(eZ, cZ, (eD + hL), bL(eZ), bD(), cA, cz, eL, (bg() + hL), (bx() + (if ((eZ > 0))
1256+ then aL(cC)
1257+ else 0)), (bw() + (if ((0 > eZ))
1258+ then aL(cC)
1259+ else 0)), hN, hO, cQ)
1260+ }
1261+ }
1262+ else {
1263+ let hL = aI(gX, hp)
1264+ let hQ = dY(toString(bF.caller), bP, ay)
1265+ let eO = hQ._1
1266+ let dX = hQ._2
1267+ if ((eO > hL))
1268+ then throw("Use decreasePosition to decrease position size")
1269+ else throw("Close position first")
1270+ }
1271+ let eZ = hK._1
1272+ let hR = hK._2
1273+ let fb = hK._3
1274+ let hS = hK._4
1275+ let hT = hK._5
1276+ let cA = hK._6
1277+ let cz = hK._7
1278+ let eL = hK._8
1279+ let hU = hK._9
1280+ let hV = hK._10
1281+ let hW = hK._11
1282+ let hN = hK._12
1283+ let hO = hK._13
1284+ let cQ = hK._14
1285+ let hX = gg((hE + cQ))
1286+ let gi = hX._1
1287+ let gj = hX._2
1288+ let hY = if ((gX >= cQ))
1289+ then invoke(aj(), "addLocked", nil, [AttachedPayment(ah(), (gX - cQ))])
1290+ else invoke(aj(), "withdrawLocked", [(cQ - gX)], nil)
1291+ if ((hY == hY))
1292+ then {
1293+ let hZ = invoke(aj(), "addFree", nil, [AttachedPayment(ah(), gj)])
1294+ if ((hZ == hZ))
1295+ then {
1296+ let ia = invoke(ak(), "notifyFees", [bO, hE], nil)
1297+ if ((ia == ia))
1298+ then {
1299+ let ib = invoke(ak(), "notifyNotional", [bO, fb], nil)
1300+ if ((ib == ib))
1301+ then ((((((gI(bO, eZ, hR, fb, hS, hT) ++ gE(hG, bO, bP)) ++ gH(hG, bO, bP, fX)) ++ gO(cz, cA, eL, hU, hV, hW, hN, hO)) ++ hb(gi)) ++ gZ(((aU() + gX) - cQ))) ++ hc(fY, bF))
1302+ else throw("Strict value is not equal to itself.")
1303+ }
1304+ else throw("Strict value is not equal to itself.")
1305+ }
1306+ else throw("Strict value is not equal to itself.")
1307+ }
1308+ else throw("Strict value is not equal to itself.")
1309+ }
1310+ else throw("Strict value is not equal to itself.")
1311+ }
1312+ }
1313+ else throw("Strict value is not equal to itself.")
1314+ }
1315+ else throw("Strict value is not equal to itself.")
1316+ }
1317+ else throw("Strict value is not equal to itself.")
1318+ }
11431319
11441320
11451321
1146-@Callable(by)
1147-func increasePosition (bI,hi,hj,hk) = {
1148- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1149- if ((hl == hl))
1322+@Callable(bF)
1323+func addMargin (bP,hs) = {
1324+ let ht = invoke(this, "updateOracle", [hs], nil)
1325+ if ((ht == ht))
11501326 then {
1151- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1152- if ((hm == hm))
1327+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1328+ if ((hu == hu))
11531329 then {
1154- let bH = bx(by)
1155- let hn = by.payments[0].amount
1156- let ho = by.payments[0].assetId
1157- let hp = toBase58String(value(ho))
1158- let hq = (ho == ag())
1159- if (if (if (if (if (if (if (if (if ((bI != aq))
1160- then (bI != ar)
1161- else false)
1162- then true
1163- else (0 >= hn))
1164- then true
1165- else !(ca()))
1166- then true
1167- else !(hq))
1168- then true
1169- else !(bz(aD(au, hi), aU(), true)))
1170- then true
1171- else cb())
1172- then true
1173- else cc())
1174- then true
1175- else dr())
1176- then throw("Invalid increasePosition parameters")
1177- else {
1178- let hr = fS(bH, fX(by))
1179- let fQ = hr._1
1180- let fR = hr._2
1181- let gP = aD(hn, (aF(fQ, hi) + au))
1182- let hs = (hn - gP)
1183- let ht = invoke(al(), "acceptPaymentWithLink", [bH, hk], [AttachedPayment(ag(), hs)])
1184- if ((ht == ht))
1185- then {
1186- let hu = {
1187- let bL = ht
1188- if ($isInstanceOf(bL, "Int"))
1189- then {
1190- let fV = bL
1191- fV
1192- }
1193- else throw("Invalid referrerFee")
1194- }
1195- let hv = (hs - hu)
1196- let hw = bG(bH, bI)
1197- let eu = hw._1
1198- let ev = hw._2
1199- let ew = hw._3
1200- let ex = hw._4
1201- let ey = hw._5
1202- let hx = (eu == 0)
1203- let hy = if ((eu > 0))
1204- then (bI == aq)
1205- else (bI == ar)
1206- let hz = if (!(hx))
1207- then hy
1208- else false
1209- let hA = (bI == aq)
1210- let hB = if (if (hx)
1211- then true
1212- else hz)
1330+ let hv = invoke(this, "ensureCalledOnce", nil, nil)
1331+ if ((hv == hv))
1332+ then {
1333+ let bO = toString(bF.caller)
1334+ let gX = bF.payments[0].amount
1335+ let hx = bF.payments[0].assetId
1336+ let hy = toBase58String(value(hx))
1337+ let hz = (hx == ah())
1338+ if (if (if (if (if (!(hz))
1339+ then true
1340+ else !(bY(toString(bF.caller), bP)))
1341+ then true
1342+ else !(ch()))
1343+ then true
1344+ else ci())
1345+ then true
1346+ else dy())
1347+ then throw("Invalid addMargin parameters")
1348+ else {
1349+ let ic = bN(bO, bP)
1350+ let eB = ic._1
1351+ let eC = ic._2
1352+ let eD = ic._3
1353+ let eE = ic._4
1354+ let eF = ic._5
1355+ let hY = invoke(aj(), "addLocked", nil, [AttachedPayment(ah(), gX)])
1356+ if ((hY == hY))
12131357 then {
1214- let hC = aF(gP, hi)
1215- let hD = co(hA, hC)
1216- let cv = hD._1
1217- let cs = hD._2
1218- let ct = hD._3
1219- let eE = hD._4
1220- if (if ((hj != 0))
1221- then (hj > aI(cv))
1222- else false)
1223- then throw(((("Limit error: " + toString(aI(cv))) + " < ") + toString(hj)))
1358+ let cQ = cM(eC, eF)
1359+ let id = if ((cQ > 0))
1360+ then {
1361+ let ie = gg(cQ)
1362+ let gi = ie._1
1363+ let gj = ie._2
1364+ let if = invoke(aj(), "withdrawLocked", [gi], nil)
1365+ if ((if == if))
1366+ then {
1367+ let ig = invoke(aj(), "exchangeFreeAndLocked", [-(gj)], nil)
1368+ if ((ig == ig))
1369+ then hb(gi)
1370+ else throw("Strict value is not equal to itself.")
1371+ }
1372+ else throw("Strict value is not equal to itself.")
1373+ }
1374+ else nil
1375+ if ((id == id))
1376+ then ((gI(bO, eB, ((eC - cQ) + gX), eD, eE, bD()) ++ gZ(((aU() + gX) - cQ))) ++ id)
1377+ else throw("Strict value is not equal to itself.")
1378+ }
1379+ else throw("Strict value is not equal to itself.")
1380+ }
1381+ }
1382+ else throw("Strict value is not equal to itself.")
1383+ }
1384+ else throw("Strict value is not equal to itself.")
1385+ }
1386+ else throw("Strict value is not equal to itself.")
1387+ }
1388+
1389+
1390+
1391+@Callable(bF)
1392+func removeMargin (gX,bP,hs) = {
1393+ let ht = invoke(this, "updateOracle", [hs], nil)
1394+ if ((ht == ht))
1395+ then {
1396+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1397+ if ((hu == hu))
1398+ then {
1399+ let hv = invoke(this, "ensureCalledOnce", nil, nil)
1400+ if ((hv == hv))
1401+ then {
1402+ let bO = toString(bF.caller)
1403+ if (if (if (if (if ((0 >= gX))
1404+ then true
1405+ else !(bY(bO, bP)))
1406+ then true
1407+ else !(ch()))
1408+ then true
1409+ else ci())
1410+ then true
1411+ else dy())
1412+ then throw("Invalid removeMargin parameters")
1413+ else {
1414+ let ih = bN(bO, bP)
1415+ let eB = ih._1
1416+ let eC = ih._2
1417+ let eD = ih._3
1418+ let eE = ih._4
1419+ let eF = ih._5
1420+ let ii = cR(eB, eC, eE, eF, -(gX))
1421+ let cZ = ii._1
1422+ let da = ii._2
1423+ let cV = ii._3
1424+ let cQ = ii._4
1425+ if ((da != 0))
1426+ then throw("Invalid removed margin amount")
1427+ else {
1428+ let fe = ed(cZ, da, eD)
1429+ if (!(bG(fe, aY(), true)))
1430+ then throw(((("Too much margin removed: " + toString(fe)) + " < ") + toString(aY())))
12241431 else {
1225- let eS = (eu + cv)
1226- let hE = (bc() + (if ((eS > 0))
1227- then hC
1228- else 0))
1229- let hF = (bb() + (if ((0 > eS))
1230- then hC
1231- else 0))
1232- let hG = cK(eu, ev, ex, ey, gP)
1233- let cS = hG._1
1234- let eM = hG._2
1235- let eN = hG._3
1236- let cJ = hG._4
1237- if (!(dx(cs, ct)))
1238- then throw("Over max spread limit")
1239- else if (!(dB(hE, hF)))
1240- then throw("Over max open notional")
1241- else $Tuple14(eS, cS, (ew + hC), bE(eS), bw(), ct, cs, eE, (ba() + hC), (br() + (if ((eS > 0))
1242- then aI(cv)
1243- else 0)), (bq() + (if ((0 > eS))
1244- then aI(cv)
1245- else 0)), hE, hF, cJ)
1432+ let ij = gg(cQ)
1433+ let gi = ij._1
1434+ let gj = ij._2
1435+ let id = if ((cQ > 0))
1436+ then {
1437+ let ig = invoke(aj(), "exchangeFreeAndLocked", [-(gj)], nil)
1438+ if ((ig == ig))
1439+ then hb(gi)
1440+ else throw("Strict value is not equal to itself.")
1441+ }
1442+ else nil
1443+ if ((id == id))
1444+ then {
1445+ let if = invoke(aj(), "withdrawLocked", [(gX + gi)], nil)
1446+ if ((if == if))
1447+ then (((gI(bO, eB, cZ, eD, bL(eB), bD()) ++ gW(bF.caller, gX)) ++ gZ(((aU() - gX) - cQ))) ++ id)
1448+ else throw("Strict value is not equal to itself.")
1449+ }
1450+ else throw("Strict value is not equal to itself.")
12461451 }
12471452 }
1248- else {
1249- let hC = aF(gP, hi)
1250- let hH = dR(toString(by.caller), bI, ax)
1251- let eH = hH._1
1252- let dQ = hH._2
1253- if ((eH > hC))
1254- then throw("Use decreasePosition to decrease position size")
1255- else throw("Close position first")
1256- }
1257- let eS = hB._1
1258- let hI = hB._2
1259- let eU = hB._3
1260- let hJ = hB._4
1261- let hK = hB._5
1262- let ct = hB._6
1263- let cs = hB._7
1264- let eE = hB._8
1265- let hL = hB._9
1266- let hM = hB._10
1267- let hN = hB._11
1268- let hE = hB._12
1269- let hF = hB._13
1270- let cJ = hB._14
1271- let hO = fZ((hv + cJ))
1272- let gb = hO._1
1273- let gc = hO._2
1274- let hP = if ((gP >= cJ))
1275- then invoke(ai(), "addLocked", nil, [AttachedPayment(ag(), (gP - cJ))])
1276- else invoke(ai(), "withdrawLocked", [(cJ - gP)], nil)
1277- if ((hP == hP))
1453+ }
1454+ }
1455+ else throw("Strict value is not equal to itself.")
1456+ }
1457+ else throw("Strict value is not equal to itself.")
1458+ }
1459+ else throw("Strict value is not equal to itself.")
1460+ }
1461+
1462+
1463+
1464+@Callable(bF)
1465+func closePosition (ev,bP,ex,ey,hs) = {
1466+ let ht = invoke(this, "updateOracle", [hs], nil)
1467+ if ((ht == ht))
1468+ then {
1469+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1470+ if ((hu == hu))
1471+ then {
1472+ let hv = invoke(this, "ensureCalledOnce", nil, nil)
1473+ if ((hv == hv))
1474+ then {
1475+ let bO = bE(bF)
1476+ let ik = valueOrErrorMessage(addressFromString(bO), "Invalid caller")
1477+ let bX = bV(bO, bP)
1478+ if (if (if (if (if (if (!(bY(bO, bP)))
1479+ then true
1480+ else !(ch()))
1481+ then true
1482+ else ci())
1483+ then true
1484+ else (0 >= ev))
1485+ then true
1486+ else (0 > ex))
1487+ then true
1488+ else dy())
1489+ then throw("Invalid closePosition parameters")
1490+ else {
1491+ let eF = bN(bO, bP)._5
1492+ let il = eu(bO, bP, ev, bX, ex, ey, true, true)
1493+ let eZ = il._1
1494+ let fi = il._2
1495+ let fb = il._3
1496+ let fc = il._4
1497+ let eV = il._5
1498+ let eQ = il._6
1499+ let fh = il._7
1500+ let cz = il._8
1501+ let cA = il._9
1502+ let eL = il._10
1503+ let hU = il._11
1504+ let hV = il._12
1505+ let hW = il._13
1506+ let hN = il._14
1507+ let hO = il._15
1508+ let im = il._16
1509+ if ((eV > 0))
1510+ then throw("Invalid closePosition parameters: bad debt")
1511+ else if ((eF >= bD()))
1512+ then throw("Invalid closePosition parameters: wait at least 1 block before closing the position")
1513+ else {
1514+ let eI = (eZ != 0)
1515+ let in = (fh + im)
1516+ let io = (aU() - in)
1517+ let ip = if ((0 > io))
1518+ then 0
1519+ else io
1520+ let if = invoke(aj(), "withdrawLocked", [in], nil)
1521+ if ((if == if))
1522+ then {
1523+ let hC = invoke(am(), "acceptPayment", [bO], [AttachedPayment(ah(), im)])
1524+ if ((hC == hC))
1525+ then {
1526+ let hD = {
1527+ let bS = hC
1528+ if ($isInstanceOf(bS, "Int"))
1529+ then {
1530+ let gc = bS
1531+ gc
1532+ }
1533+ else throw("Invalid referrerFee")
1534+ }
1535+ let iq = gg((im - hD))
1536+ let gi = iq._1
1537+ let gj = iq._2
1538+ let hZ = invoke(aj(), "addFree", nil, [AttachedPayment(ah(), gj)])
1539+ if ((hZ == hZ))
1540+ then {
1541+ let ia = invoke(ak(), "notifyFees", [bO, im], nil)
1542+ if ((ia == ia))
1543+ then {
1544+ let ib = invoke(ak(), "notifyNotional", [bO, fb], nil)
1545+ if ((ib == ib))
1546+ then (((((if (eI)
1547+ then gI(bO, eZ, fi, fb, fc, bD())
1548+ else gV(bO, bP)) ++ gO(cz, cA, eL, hU, hV, hW, hN, hO)) ++ (if ((fh > 0))
1549+ then gW(ik, fh)
1550+ else nil)) ++ gZ(ip)) ++ hb(gi))
1551+ else throw("Strict value is not equal to itself.")
1552+ }
1553+ else throw("Strict value is not equal to itself.")
1554+ }
1555+ else throw("Strict value is not equal to itself.")
1556+ }
1557+ else throw("Strict value is not equal to itself.")
1558+ }
1559+ else throw("Strict value is not equal to itself.")
1560+ }
1561+ }
1562+ }
1563+ else throw("Strict value is not equal to itself.")
1564+ }
1565+ else throw("Strict value is not equal to itself.")
1566+ }
1567+ else throw("Strict value is not equal to itself.")
1568+ }
1569+
1570+
1571+
1572+@Callable(bF)
1573+func liquidate (bO,bP,hs) = {
1574+ let ht = invoke(this, "updateOracle", [hs], nil)
1575+ if ((ht == ht))
1576+ then {
1577+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1578+ if ((hu == hu))
1579+ then {
1580+ let ir = eh(bO, bP, ay)
1581+ let is = if (dN())
1582+ then {
1583+ let it = eh(bO, bP, az)
1584+ aM(ir, it)
1585+ }
1586+ else ir
1587+ if (if (if (if (if (!(bG(is, bn(), false)))
1588+ then true
1589+ else !(bY(bO, bP)))
1590+ then true
1591+ else !(ch()))
1592+ then true
1593+ else ci())
1594+ then true
1595+ else dy())
1596+ then throw("Unable to liquidate")
1597+ else {
1598+ let iu = if (if ((ir > bo()))
1599+ then (bp() > 0)
1600+ else false)
1601+ then (av > bp())
1602+ else false
1603+ let eB = bN(bO, bP)._1
1604+ let dR = aL(eB)
1605+ let iv = if (iu)
1606+ then {
1607+ let iw = ep(bO, eB)
1608+ let ix = aG(aL(iw), dR)
1609+ $Tuple2(ix, aL(iw))
1610+ }
1611+ else $Tuple2(0, dR)
1612+ let ix = iv._1
1613+ let iw = iv._2
1614+ let iy = eu(bO, bP, if (iu)
1615+ then iw
1616+ else dR, bo(), 0, true, false, true)
1617+ let eZ = iy._1
1618+ let fi = iy._2
1619+ let fb = iy._3
1620+ let fc = iy._4
1621+ let eV = iy._5
1622+ let eQ = iy._6
1623+ let fh = iy._7
1624+ let cz = iy._8
1625+ let cA = iy._9
1626+ let eL = iy._10
1627+ let hU = iy._11
1628+ let hV = iy._12
1629+ let hW = iy._13
1630+ let hN = iy._14
1631+ let hO = iy._15
1632+ let iz = iy._16
1633+ let iA = (iz / 2)
1634+ let gj = (iz - iA)
1635+ let io = (aU() - iz)
1636+ let iB = if ((0 > io))
1637+ then 0
1638+ else io
1639+ let ig = if ((eV > 0))
1640+ then {
1641+ let ig = invoke(aj(), "exchangeFreeAndLocked", [(eV + iz)], nil)
1642+ if ((ig == ig))
1643+ then nil
1644+ else throw("Strict value is not equal to itself.")
1645+ }
1646+ else nil
1647+ if ((ig == ig))
1648+ then {
1649+ let if = invoke(aj(), "withdrawLocked", [iz], nil)
1650+ if ((if == if))
12781651 then {
1279- let hQ = invoke(ai(), "addFree", nil, [AttachedPayment(ag(), gc)])
1280- if ((hQ == hQ))
1652+ let iC = invoke(aj(), "addFree", nil, [AttachedPayment(ah(), gj)])
1653+ if ((iC == iC))
12811654 then {
1282- let hR = invoke(aj(), "notifyFees", [bH, hv], nil)
1283- if ((hR == hR))
1284- then {
1285- let hS = invoke(aj(), "notifyNotional", [bH, eU], nil)
1286- if ((hS == hS))
1287- then ((((((gA(bH, eS, hI, eU, hJ, hK) ++ gw(hx, bH, bI)) ++ gz(hx, bH, bI, fQ)) ++ gG(cs, ct, eE, hL, hM, hN, hE, hF)) ++ gS(gb)) ++ gR(((aR() + gP) - cJ))) ++ gT(fR, by))
1288- else throw("Strict value is not equal to itself.")
1289- }
1655+ let ib = invoke(ak(), "notifyNotional", [bO, fb], nil)
1656+ if ((ib == ib))
1657+ then ((((if (iu)
1658+ then gI(bO, eZ, fi, fb, fc, bD())
1659+ else gV(bO, bP)) ++ gO(cz, cA, eL, hU, hV, hW, hN, hO)) ++ gW(bF.caller, iA)) ++ gZ(iB))
12901660 else throw("Strict value is not equal to itself.")
12911661 }
12921662 else throw("Strict value is not equal to itself.")
13031673
13041674
13051675
1306-@Callable(by)
1307-func addMargin (bI) = {
1308- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1309- if ((hl == hl))
1676+@Callable(bF)
1677+func payFunding (hs) = {
1678+ let ht = invoke(this, "updateOracle", [hs], nil)
1679+ if ((ht == ht))
13101680 then {
1311- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1312- if ((hm == hm))
1681+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1682+ if ((hu == hu))
13131683 then {
1314- let bH = toString(by.caller)
1315- let gP = by.payments[0].amount
1316- let ho = by.payments[0].assetId
1317- let hp = toBase58String(value(ho))
1318- let hq = (ho == ag())
1319- if (if (if (if (if (!(hq))
1684+ let iD = bj()
1685+ if (if (if ((iD > bD()))
13201686 then true
1321- else !(bR(toString(by.caller), bI)))
1687+ else !(ch()))
13221688 then true
1323- else !(ca()))
1324- then true
1325- else cb())
1326- then true
1327- else dr())
1328- then throw("Invalid addMargin parameters")
1689+ else ci())
1690+ then throw(((("Invalid funding block timestamp: " + toString(bD())) + " < ") + toString(iD)))
13291691 else {
1330- let hT = bG(bH, bI)
1331- let eu = hT._1
1332- let ev = hT._2
1333- let ew = hT._3
1334- let ex = hT._4
1335- let ey = hT._5
1336- let hP = invoke(ai(), "addLocked", nil, [AttachedPayment(ag(), gP)])
1337- if ((hP == hP))
1692+ let fH = ds()
1693+ let iE = fG()
1694+ let fK = iE._1
1695+ let fL = iE._2
1696+ let fO = iE._3
1697+ let iF = if ((fO > 0))
13381698 then {
1339- let cJ = cF(ev, ey)
1340- let hU = if ((cJ > 0))
1341- then {
1342- let hV = fZ(cJ)
1343- let gb = hV._1
1344- let gc = hV._2
1345- let hW = invoke(ai(), "withdrawLocked", [gb], nil)
1346- if ((hW == hW))
1347- then {
1348- let hX = invoke(ai(), "exchangeFreeAndLocked", [-(gc)], nil)
1349- if ((hX == hX))
1350- then gS(gb)
1351- else throw("Strict value is not equal to itself.")
1352- }
1353- else throw("Strict value is not equal to itself.")
1354- }
1355- else nil
1356- if ((hU == hU))
1357- then ((gA(bH, eu, ((ev - cJ) + gP), ew, ex, bw()) ++ gR(((aR() + gP) - cJ))) ++ hU)
1699+ let iF = invoke(aj(), "exchangeFreeAndLocked", [-(fO)], nil)
1700+ if ((iF == iF))
1701+ then nil
13581702 else throw("Strict value is not equal to itself.")
13591703 }
1704+ else nil
1705+ if ((iF == iF))
1706+ then gy((iD + bm()), (bu() + fL), (bv() + fK), aG(fL, fH), aG(fK, fH))
13601707 else throw("Strict value is not equal to itself.")
13611708 }
13621709 }
13671714
13681715
13691716
1370-@Callable(by)
1371-func removeMargin (gP,bI) = {
1372- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1717+@Callable(bF)
1718+func updateOracle (hs) = if ((bC() == aC))
1719+ then nil
1720+ else {
1721+ let iG = split_4C(hs, "::")
1722+ let dt = valueOrErrorMessage(bZ(a), "No base asset oracle data")
1723+ let iH = dt._1
1724+ let iI = invoke(iH, "updateData", [iG[0]], nil)
1725+ if ((iI == iI))
1726+ then {
1727+ let dv = bZ(b)
1728+ let iJ = if (isDefined(dv))
1729+ then {
1730+ let dx = value(dv)
1731+ let iK = dx._1
1732+ let iJ = invoke(iK, "updateData", [iG[1]], nil)
1733+ if ((iJ == iJ))
1734+ then nil
1735+ else throw("Strict value is not equal to itself.")
1736+ }
1737+ else nil
1738+ if ((iJ == iJ))
1739+ then nil
1740+ else throw("Strict value is not equal to itself.")
1741+ }
1742+ else throw("Strict value is not equal to itself.")
1743+ }
1744+
1745+
1746+
1747+@Callable(bF)
1748+func syncTerminalPriceToOracle () = {
1749+ let cr = aZ()
1750+ let cs = bb()
1751+ let iL = fB(ds(), cr, cs)
1752+ let hj = iL._1
1753+ let hk = iL._2
1754+ let fF = iL._3
1755+ let iM = if (if ((0 > fF))
1756+ then (aL(fF) > aU())
1757+ else false)
1758+ then -(aU())
1759+ else fF
1760+ let hl = if ((iM != 0))
1761+ then {
1762+ let hl = invoke(aj(), "exchangeFreeAndLocked", [iM], nil)
1763+ if ((hl == hl))
1764+ then nil
1765+ else throw("Strict value is not equal to itself.")
1766+ }
1767+ else nil
13731768 if ((hl == hl))
1769+ then (gZ((aU() + iM)) ++ gN(hj, hk))
1770+ else throw("Strict value is not equal to itself.")
1771+ }
1772+
1773+
1774+
1775+@Callable(bF)
1776+func ensureCalledOnce () = if ((bF.caller != this))
1777+ then throw("Invalid saveCurrentTxId parameters")
1778+ else {
1779+ let iN = toBase58String(bF.transactionId)
1780+ let iO = valueOrElse(getString(this, S), "")
1781+ if ((iO != iN))
1782+ then [StringEntry(S, iN)]
1783+ else throw("Can not call vAMM methods twice in one tx")
1784+ }
1785+
1786+
1787+
1788+@Callable(bF)
1789+func migratePosition (bO) = {
1790+ let bR = getInteger(this, ac(e, bO))
1791+ if (if (isDefined(bR))
1792+ then isDefined(addressFromString(bO))
1793+ else false)
13741794 then {
1375- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1376- if ((hm == hm))
1795+ let iP = getIntegerValue(this, ac(e, bO))
1796+ let iQ = getIntegerValue(this, ac(f, bO))
1797+ let iR = getIntegerValue(this, ac(g, bO))
1798+ let iS = getIntegerValue(this, ac(h, bO))
1799+ let iT = valueOrElse(getInteger(this, ac(k, bO)), lastBlock.timestamp)
1800+ let iU = valueOrElse(getInteger(this, ac(j, bO)), aW())
1801+ let iV = getIntegerValue(this, ac(i, bO))
1802+ let iW = bU(iP)
1803+ let bQ = ((bO + "_") + toString(iW))
1804+[DeleteEntry(ac(e, bO)), DeleteEntry(ac(f, bO)), DeleteEntry(ac(g, bO)), DeleteEntry(ac(h, bO)), DeleteEntry(ac(k, bO)), DeleteEntry(ac(j, bO)), DeleteEntry(ac(i, bO)), IntegerEntry(ac(e, bQ), iP), IntegerEntry(ac(f, bQ), iQ), IntegerEntry(ac(g, bQ), iR), IntegerEntry(ac(h, bQ), iS), IntegerEntry(ac(k, bQ), iT), IntegerEntry(ac(j, bQ), iU), IntegerEntry(ac(i, bQ), iV)]
1805+ }
1806+ else throw(("Nothing to migrate for " + bO))
1807+ }
1808+
1809+
1810+
1811+@Callable(bF)
1812+func view_calcRemainMarginWithFundingPayment (bO,bP,hs) = {
1813+ let ht = invoke(this, "updateOracle", [hs], nil)
1814+ if ((ht == ht))
1815+ then {
1816+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1817+ if ((hu == hu))
13771818 then {
1378- let bH = toString(by.caller)
1379- if (if (if (if (if ((0 >= gP))
1380- then true
1381- else !(bR(bH, bI)))
1382- then true
1383- else !(ca()))
1384- then true
1385- else cb())
1386- then true
1387- else dr())
1388- then throw("Invalid removeMargin parameters")
1389- else {
1390- let hY = bG(bH, bI)
1391- let eu = hY._1
1392- let ev = hY._2
1393- let ew = hY._3
1394- let ex = hY._4
1395- let ey = hY._5
1396- let hZ = cK(eu, ev, ex, ey, -(gP))
1397- let cS = hZ._1
1398- let cT = hZ._2
1399- let cO = hZ._3
1400- let cJ = hZ._4
1401- if ((cT != 0))
1402- then throw("Invalid removed margin amount")
1403- else {
1404- let eX = dW(cS, cT, ew)
1405- if (!(bz(eX, aU(), true)))
1406- then throw(((("Too much margin removed: " + toString(eX)) + " < ") + toString(aU())))
1407- else {
1408- let ia = fZ(cJ)
1409- let gb = ia._1
1410- let gc = ia._2
1411- let hU = if ((cJ > 0))
1412- then {
1413- let hX = invoke(ai(), "exchangeFreeAndLocked", [-(gc)], nil)
1414- if ((hX == hX))
1415- then gS(gb)
1416- else throw("Strict value is not equal to itself.")
1417- }
1418- else nil
1419- if ((hU == hU))
1420- then {
1421- let hW = invoke(ai(), "withdrawLocked", [(gP + gb)], nil)
1422- if ((hW == hW))
1423- then (((gA(bH, eu, cS, ew, bE(eu), bw()) ++ gO(by.caller, gP)) ++ gR(((aR() - gP) - cJ))) ++ hU)
1424- else throw("Strict value is not equal to itself.")
1425- }
1426- else throw("Strict value is not equal to itself.")
1427- }
1428- }
1429- }
1819+ let iX = bN(bO, bP)
1820+ let bT = iX._1
1821+ let ea = iX._2
1822+ let ej = iX._3
1823+ let ec = iX._4
1824+ let el = iX._5
1825+ let iY = dY(bO, bP, ay)
1826+ let dT = iY._1
1827+ let dX = iY._2
1828+ let iZ = cR(bT, ea, ec, el, dX)
1829+ let cZ = iZ._1
1830+ let da = iZ._2
1831+ let cV = iZ._3
1832+ let cQ = iZ._4
1833+ throw(((((((aE(cZ) + aE(cV)) + aE(eo(bO, bP))) + aE(dX)) + aE(da)) + aE(dT)) + aE(cQ)))
14301834 }
14311835 else throw("Strict value is not equal to itself.")
14321836 }
14351839
14361840
14371841
1438-@Callable(by)
1439-func closePosition (eo,bI,eq,er) = {
1440- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1441- if ((hl == hl))
1842+@Callable(bF)
1843+func view_getPegAdjustCost (ja) = {
1844+ let cr = aZ()
1845+ let cs = bb()
1846+ let fA = fB(ja, cr, cs)
1847+ throw(toString(fA._3))
1848+ }
1849+
1850+
1851+
1852+@Callable(bF)
1853+func view_getTerminalAmmPrice () = {
1854+ let jb = fj()
1855+ let fn = jb._1
1856+ let fo = jb._2
1857+ let he = aG(aI(fn, bd()), aI(fo, be()))
1858+ throw(toString(he))
1859+ }
1860+
1861+
1862+
1863+@Callable(bF)
1864+func view_getFunding (hs) = {
1865+ let ht = invoke(this, "updateOracle", [hs], nil)
1866+ if ((ht == ht))
14421867 then {
1443- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1444- if ((hm == hm))
1868+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1869+ if ((hu == hu))
14451870 then {
1446- let bH = bx(by)
1447- let ib = valueOrErrorMessage(addressFromString(bH), "Invalid caller")
1448- let bQ = bO(bH, bI)
1449- if (if (if (if (if (if (!(bR(bH, bI)))
1450- then true
1451- else !(ca()))
1452- then true
1453- else cb())
1454- then true
1455- else (0 >= eo))
1456- then true
1457- else (0 > eq))
1458- then true
1459- else dr())
1460- then throw("Invalid closePosition parameters")
1461- else {
1462- let ey = bG(bH, bI)._5
1463- let ic = en(bH, bI, eo, bQ, eq, er, true, true)
1464- let eS = ic._1
1465- let fb = ic._2
1466- let eU = ic._3
1467- let eV = ic._4
1468- let eO = ic._5
1469- let eJ = ic._6
1470- let fa = ic._7
1471- let cs = ic._8
1472- let ct = ic._9
1473- let eE = ic._10
1474- let hL = ic._11
1475- let hM = ic._12
1476- let hN = ic._13
1477- let hE = ic._14
1478- let hF = ic._15
1479- let id = ic._16
1480- if ((eO > 0))
1481- then throw("Invalid closePosition parameters: bad debt")
1482- else if ((ey >= bw()))
1483- then throw("Invalid closePosition parameters: wait at least 1 block before closing the position")
1484- else {
1485- let eB = (eS != 0)
1486- let ie = (fa + id)
1487- let if = (aR() - ie)
1488- let ig = if ((0 > if))
1489- then 0
1490- else if
1491- let hW = invoke(ai(), "withdrawLocked", [ie], nil)
1492- if ((hW == hW))
1493- then {
1494- let ht = invoke(al(), "acceptPayment", [bH], [AttachedPayment(ag(), id)])
1495- if ((ht == ht))
1496- then {
1497- let hu = {
1498- let bL = ht
1499- if ($isInstanceOf(bL, "Int"))
1500- then {
1501- let fV = bL
1502- fV
1503- }
1504- else throw("Invalid referrerFee")
1505- }
1506- let ih = fZ((id - hu))
1507- let gb = ih._1
1508- let gc = ih._2
1509- let hQ = invoke(ai(), "addFree", nil, [AttachedPayment(ag(), gc)])
1510- if ((hQ == hQ))
1511- then {
1512- let hR = invoke(aj(), "notifyFees", [bH, id], nil)
1513- if ((hR == hR))
1514- then {
1515- let hS = invoke(aj(), "notifyNotional", [bH, eU], nil)
1516- if ((hS == hS))
1517- then (((((if (eB)
1518- then gA(bH, eS, fb, eU, eV, bw())
1519- else gN(bH, bI)) ++ gG(cs, ct, eE, hL, hM, hN, hE, hF)) ++ (if ((fa > 0))
1520- then gO(ib, fa)
1521- else nil)) ++ gR(ig)) ++ gS(gb))
1522- else throw("Strict value is not equal to itself.")
1523- }
1524- else throw("Strict value is not equal to itself.")
1525- }
1526- else throw("Strict value is not equal to itself.")
1527- }
1528- else throw("Strict value is not equal to itself.")
1529- }
1530- else throw("Strict value is not equal to itself.")
1531- }
1532- }
1871+ let fH = ds()
1872+ let jc = fG()
1873+ let fK = jc._1
1874+ let fL = jc._2
1875+ let fO = jc._3
1876+ let jd = aG(fL, fH)
1877+ let je = aG(fK, fH)
1878+ throw(((((aE(jd) + aE(je)) + aE(dM())) + aE(ds())) + aE(fO)))
15331879 }
15341880 else throw("Strict value is not equal to itself.")
15351881 }
15381884
15391885
15401886
1541-@Callable(by)
1542-func liquidate (bH,bI) = {
1543- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1544- if ((hl == hl))
1887+@Callable(bF)
1888+func computeSpotPrice () = {
1889+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1890+ if ((hu == hu))
15451891 then {
1546- let ii = ea(bH, bI, ax)
1547- let ij = if (dG())
1548- then {
1549- let ik = ea(bH, bI, ay)
1550- aJ(ii, ik)
1551- }
1552- else ii
1553- if (if (if (if (if (!(bz(ij, bh(), false)))
1554- then true
1555- else !(bR(bH, bI)))
1556- then true
1557- else !(ca()))
1558- then true
1559- else cb())
1560- then true
1561- else dr())
1562- then throw("Unable to liquidate")
1563- else {
1564- let il = if (if ((ii > bi()))
1565- then (bj() > 0)
1566- else false)
1567- then (au > bj())
1568- else false
1569- let eu = bG(bH, bI)._1
1570- let dK = aI(eu)
1571- let im = if (il)
1572- then {
1573- let in = ei(bH, eu)
1574- let io = aD(aI(in), dK)
1575- $Tuple2(io, aI(in))
1576- }
1577- else $Tuple2(0, dK)
1578- let io = im._1
1579- let in = im._2
1580- let ip = en(bH, bI, if (il)
1581- then in
1582- else dK, bi(), 0, true, false, true)
1583- let eS = ip._1
1584- let fb = ip._2
1585- let eU = ip._3
1586- let eV = ip._4
1587- let eO = ip._5
1588- let eJ = ip._6
1589- let fa = ip._7
1590- let cs = ip._8
1591- let ct = ip._9
1592- let eE = ip._10
1593- let hL = ip._11
1594- let hM = ip._12
1595- let hN = ip._13
1596- let hE = ip._14
1597- let hF = ip._15
1598- let iq = ip._16
1599- let ir = (iq / 2)
1600- let gc = (iq - ir)
1601- let if = (aR() - iq)
1602- let is = if ((0 > if))
1603- then 0
1604- else if
1605- let hX = if ((eO > 0))
1606- then {
1607- let hX = invoke(ai(), "exchangeFreeAndLocked", [(eO + iq)], nil)
1608- if ((hX == hX))
1609- then nil
1610- else throw("Strict value is not equal to itself.")
1611- }
1612- else nil
1613- if ((hX == hX))
1614- then {
1615- let hW = invoke(ai(), "withdrawLocked", [iq], nil)
1616- if ((hW == hW))
1617- then {
1618- let it = invoke(ai(), "addFree", nil, [AttachedPayment(ag(), gc)])
1619- if ((it == it))
1620- then {
1621- let hS = invoke(aj(), "notifyNotional", [bH, eU], nil)
1622- if ((hS == hS))
1623- then ((((if (il)
1624- then gA(bH, eS, fb, eU, eV, bw())
1625- else gN(bH, bI)) ++ gG(cs, ct, eE, hL, hM, hN, hE, hF)) ++ gO(by.caller, ir)) ++ gR(is))
1626- else throw("Strict value is not equal to itself.")
1627- }
1628- else throw("Strict value is not equal to itself.")
1629- }
1630- else throw("Strict value is not equal to itself.")
1631- }
1632- else throw("Strict value is not equal to itself.")
1633- }
1892+ let fA = dM()
1893+ $Tuple2(nil, fA)
16341894 }
16351895 else throw("Strict value is not equal to itself.")
16361896 }
16371897
16381898
16391899
1640-@Callable(by)
1641-func payFunding () = {
1642- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1643- if ((hl == hl))
1644- then {
1645- let iu = bd()
1646- if (if (if ((iu > bw()))
1647- then true
1648- else !(ca()))
1649- then true
1650- else cb())
1651- then throw(((("Invalid funding block timestamp: " + toString(bw())) + " < ") + toString(iu)))
1652- else {
1653- let fA = dl()
1654- let iv = fz()
1655- let fD = iv._1
1656- let fE = iv._2
1657- let fH = iv._3
1658- let iw = if ((fH > 0))
1659- then {
1660- let iw = invoke(ai(), "exchangeFreeAndLocked", [-(fH)], nil)
1661- if ((iw == iw))
1662- then nil
1663- else throw("Strict value is not equal to itself.")
1664- }
1665- else nil
1666- if ((iw == iw))
1667- then gq((iu + bg()), (bo() + fE), (bp() + fD), aD(fE, fA), aD(fD, fA))
1668- else throw("Strict value is not equal to itself.")
1669- }
1670- }
1671- else throw("Strict value is not equal to itself.")
1900+@Callable(bF)
1901+func computeFeeForTraderWithArtifact (bO,fQ) = {
1902+ let fA = fZ(bO, fQ)
1903+ $Tuple2(nil, fA)
16721904 }
16731905
16741906
1675-
1676-@Callable(by)
1677-func syncTerminalPriceToOracle () = {
1678- let ck = aV()
1679- let cl = aW()
1680- let ix = fu(dl(), ck, cl)
1681- let ha = ix._1
1682- let hb = ix._2
1683- let fy = ix._3
1684- let iy = if (if ((0 > fy))
1685- then (aI(fy) > aR())
1686- else false)
1687- then -(aR())
1688- else fy
1689- let hc = if ((iy != 0))
1907+@Verifier(jf)
1908+func jg () = {
1909+ let jh = getString(this, T)
1910+ if (isDefined(jh))
16901911 then {
1691- let hc = invoke(ai(), "exchangeFreeAndLocked", [iy], nil)
1692- if ((hc == hc))
1693- then nil
1694- else throw("Strict value is not equal to itself.")
1695- }
1696- else nil
1697- if ((hc == hc))
1698- then (gR((aR() + iy)) ++ gF(ha, hb))
1699- else throw("Strict value is not equal to itself.")
1700- }
1701-
1702-
1703-
1704-@Callable(by)
1705-func ensureCalledOnce () = if ((by.caller != this))
1706- then throw("Invalid saveCurrentTxId parameters")
1707- else {
1708- let iz = toBase58String(by.transactionId)
1709- let iA = valueOrElse(getString(this, R), "")
1710- if ((iA != iz))
1711- then [StringEntry(R, iz)]
1712- else throw("Can not call vAMM methods twice in one tx")
1713- }
1714-
1715-
1716-
1717-@Callable(by)
1718-func migratePosition (bH) = {
1719- let bK = getInteger(this, ab(e, bH))
1720- if (if (isDefined(bK))
1721- then isDefined(addressFromString(bH))
1722- else false)
1723- then {
1724- let iB = getIntegerValue(this, ab(e, bH))
1725- let iC = getIntegerValue(this, ab(f, bH))
1726- let iD = getIntegerValue(this, ab(g, bH))
1727- let iE = getIntegerValue(this, ab(h, bH))
1728- let iF = valueOrElse(getInteger(this, ab(k, bH)), lastBlock.timestamp)
1729- let iG = valueOrElse(getInteger(this, ab(j, bH)), aS())
1730- let iH = getIntegerValue(this, ab(i, bH))
1731- let iI = bN(iB)
1732- let bJ = ((bH + "_") + toString(iI))
1733-[DeleteEntry(ab(e, bH)), DeleteEntry(ab(f, bH)), DeleteEntry(ab(g, bH)), DeleteEntry(ab(h, bH)), DeleteEntry(ab(k, bH)), DeleteEntry(ab(j, bH)), DeleteEntry(ab(i, bH)), IntegerEntry(ab(e, bJ), iB), IntegerEntry(ab(f, bJ), iC), IntegerEntry(ab(g, bJ), iD), IntegerEntry(ab(h, bJ), iE), IntegerEntry(ab(k, bJ), iF), IntegerEntry(ab(j, bJ), iG), IntegerEntry(ab(i, bJ), iH)]
1734- }
1735- else throw(("Nothing to migrate for " + bH))
1736- }
1737-
1738-
1739-
1740-@Callable(by)
1741-func view_calcRemainMarginWithFundingPayment (bH,bI) = {
1742- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1743- if ((hl == hl))
1744- then {
1745- let iJ = bG(bH, bI)
1746- let bM = iJ._1
1747- let dT = iJ._2
1748- let ec = iJ._3
1749- let dV = iJ._4
1750- let ee = iJ._5
1751- let iK = dR(bH, bI, ax)
1752- let dM = iK._1
1753- let dQ = iK._2
1754- let iL = cK(bM, dT, dV, ee, dQ)
1755- let cS = iL._1
1756- let cT = iL._2
1757- let cO = iL._3
1758- let cJ = iL._4
1759- throw(((((((aB(cS) + aB(cO)) + aB(eh(bH, bI))) + aB(dQ)) + aB(cT)) + aB(dM)) + aB(cJ)))
1760- }
1761- else throw("Strict value is not equal to itself.")
1762- }
1763-
1764-
1765-
1766-@Callable(by)
1767-func view_getPegAdjustCost (iM) = {
1768- let ck = aV()
1769- let cl = aW()
1770- let ft = fu(iM, ck, cl)
1771- throw(toString(ft._3))
1772- }
1773-
1774-
1775-
1776-@Callable(by)
1777-func view_getTerminalAmmPrice () = {
1778- let iN = fc()
1779- let fg = iN._1
1780- let fh = iN._2
1781- let gV = aD(aF(fg, aX()), aF(fh, aY()))
1782- throw(toString(gV))
1783- }
1784-
1785-
1786-
1787-@Callable(by)
1788-func view_getFunding () = {
1789- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1790- if ((hl == hl))
1791- then {
1792- let fA = dl()
1793- let iO = fz()
1794- let fD = iO._1
1795- let fE = iO._2
1796- let fH = iO._3
1797- let iP = aD(fE, fA)
1798- let iQ = aD(fD, fA)
1799- throw(((((aB(iP) + aB(iQ)) + aB(dF())) + aB(dl())) + aB(fH)))
1800- }
1801- else throw("Strict value is not equal to itself.")
1802- }
1803-
1804-
1805-
1806-@Callable(by)
1807-func computeSpotPrice () = {
1808- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1809- if ((hl == hl))
1810- then {
1811- let ft = dF()
1812- $Tuple2(nil, ft)
1813- }
1814- else throw("Strict value is not equal to itself.")
1815- }
1816-
1817-
1818-
1819-@Callable(by)
1820-func computeFeeForTraderWithArtifact (bH,fJ) = {
1821- let ft = fS(bH, fJ)
1822- $Tuple2(nil, ft)
1823- }
1824-
1825-
1826-@Verifier(iR)
1827-func iS () = {
1828- let iT = getString(this, S)
1829- if (isDefined(iT))
1830- then {
1831- let iU = getString(addressFromStringValue(value(iT)), U)
1832- if (isDefined(iU))
1833- then valueOrElse(getBoolean(addressFromStringValue(value(iU)), ((("status_" + toString(this)) + "_") + toBase58String(iR.id))), false)
1912+ let ji = getString(addressFromStringValue(value(jh)), V)
1913+ if (isDefined(ji))
1914+ then valueOrElse(getBoolean(addressFromStringValue(value(ji)), ((("status_" + toString(this)) + "_") + toBase58String(jf.id))), false)
18341915 else throw("unable to verify: admin not set in coordinator")
18351916 }
1836- else sigVerify(iR.bodyBytes, iR.proofs[0], iR.senderPublicKey)
1917+ else sigVerify(jf.bodyBytes, jf.proofs[0], jf.senderPublicKey)
18371918 }
18381919
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let a = "k_baseOracle"
55
66 let b = "k_quoteOracle"
77
88 let c = "k_balance"
99
1010 let d = "k_sequence"
1111
1212 let e = "k_positionSize"
1313
1414 let f = "k_positionMargin"
1515
1616 let g = "k_positionOpenNotional"
1717
1818 let h = "k_positionFraction"
1919
2020 let i = "k_positionSequence"
2121
2222 let j = "k_positionFee"
2323
2424 let k = "k_positionTimestamp"
2525
2626 let l = "k_initialized"
2727
2828 let m = "k_paused"
2929
3030 let n = "k_closeOnly"
3131
3232 let o = "k_fee"
3333
3434 let p = "k_rollover_fee"
3535
3636 let q = "k_fundingPeriod"
3737
3838 let r = "k_initMarginRatio"
3939
4040 let s = "k_mmr"
4141
4242 let t = "k_liquidationFeeRatio"
4343
4444 let u = "k_partLiquidationRatio"
4545
4646 let v = "k_spreadLimit"
4747
4848 let w = "k_maxPriceImpact"
4949
5050 let x = "k_maxPriceSpread"
5151
5252 let y = "k_maxOpenNotional"
5353
5454 let z = "k_feeToStakersPercent"
5555
5656 let A = "k_maxOracleDelay"
5757
5858 let B = "k_fundingMode"
5959
60-let C = "k_latestLongPremiumFraction"
60+let C = "k_oracleMode"
6161
62-let D = "k_latestShortPremiumFraction"
62+let D = "k_latestLongPremiumFraction"
6363
64-let E = "k_nextFundingBlockMinTimestamp"
64+let E = "k_latestShortPremiumFraction"
6565
66-let F = "k_longFundingRate"
66+let F = "k_nextFundingBlockMinTimestamp"
6767
68-let G = "k_shortFundingRate"
68+let G = "k_longFundingRate"
6969
70-let H = "k_qtAstR"
70+let H = "k_shortFundingRate"
7171
72-let I = "k_bsAstR"
72+let I = "k_qtAstR"
7373
74-let J = "k_qtAstW"
74+let J = "k_bsAstR"
7575
76-let K = "k_bsAstW"
76+let K = "k_qtAstW"
7777
78-let L = "k_totalPositionSize"
78+let L = "k_bsAstW"
7979
80-let M = "k_totalLongPositionSize"
80+let M = "k_totalPositionSize"
8181
82-let N = "k_totalShortPositionSize"
82+let N = "k_totalLongPositionSize"
8383
84-let O = "k_openInterestNotional"
84+let O = "k_totalShortPositionSize"
8585
86-let P = "k_openInterestShort"
86+let P = "k_openInterestNotional"
8787
88-let Q = "k_openInterestLong"
88+let Q = "k_openInterestShort"
8989
90-let R = "k_lastTx"
90+let R = "k_openInterestLong"
9191
92-let S = "k_coordinatorAddress"
92+let S = "k_lastTx"
9393
94-let T = "k_vault_address"
94+let T = "k_coordinatorAddress"
9595
96-let U = "k_admin_address"
96+let U = "k_vault_address"
9797
98-let V = "k_quote_asset"
98+let V = "k_admin_address"
9999
100-let W = "k_staking_address"
100+let W = "k_quote_asset"
101101
102-let X = "k_miner_address"
102+let X = "k_staking_address"
103103
104-let Y = "k_orders_address"
104+let Y = "k_miner_address"
105105
106-let Z = "k_referral_address"
106+let Z = "k_orders_address"
107107
108-let aa = "k_nft_manager_address"
108+let aa = "k_referral_address"
109109
110-func ab (ac,ad) = ((ac + "_") + ad)
110+let ab = "k_nft_manager_address"
111+
112+func ac (ad,ae) = ((ad + "_") + ae)
111113
112114
113-func ae () = valueOrErrorMessage(addressFromString(getStringValue(this, S)), "Coordinator not set")
115+func af () = valueOrErrorMessage(addressFromString(getStringValue(this, T)), "Coordinator not set")
114116
115117
116-func af () = addressFromString(getStringValue(ae(), U))
118+func ag () = addressFromString(getStringValue(af(), V))
117119
118120
119-func ag () = fromBase58String(getStringValue(ae(), V))
121+func ah () = fromBase58String(getStringValue(af(), W))
120122
121123
122-func ah () = valueOrErrorMessage(addressFromString(getStringValue(ae(), W)), "Staking not set")
124+func ai () = valueOrErrorMessage(addressFromString(getStringValue(af(), X)), "Staking not set")
123125
124126
125-func ai () = valueOrErrorMessage(addressFromString(getStringValue(ae(), T)), "Vault not set")
127+func aj () = valueOrErrorMessage(addressFromString(getStringValue(af(), U)), "Vault not set")
126128
127129
128-func aj () = valueOrErrorMessage(addressFromString(getStringValue(ae(), X)), "Miner not set")
130+func ak () = valueOrErrorMessage(addressFromString(getStringValue(af(), Y)), "Miner not set")
129131
130132
131-func ak () = valueOrErrorMessage(addressFromString(getStringValue(ae(), Y)), "Orders not set")
133+func al () = valueOrErrorMessage(addressFromString(getStringValue(af(), Z)), "Orders not set")
132134
133135
134-func al () = valueOrErrorMessage(addressFromString(getStringValue(ae(), Z)), "Referral not set")
136+func am () = valueOrErrorMessage(addressFromString(getStringValue(af(), aa)), "Referral not set")
135137
136138
137-func am () = valueOrErrorMessage(addressFromString(getStringValue(ae(), aa)), "NFT Manager not set")
139+func an () = valueOrErrorMessage(addressFromString(getStringValue(af(), ab)), "NFT Manager not set")
138140
139141
140-let an = "k_token_param"
142+let ao = "k_token_param"
141143
142-let ao = "k_token_type"
144+let ap = "k_token_type"
143145
144-let ap = "fee_reduction"
146+let aq = "fee_reduction"
145147
146-let aq = 1
148+let ar = 1
147149
148-let ar = 2
150+let as = 2
149151
150-let as = 1000
152+let at = 1000
151153
152-let at = 6
154+let au = 6
153155
154-let au = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
156+let av = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
155157
156-let av = (525600 * au)
158+let aw = (525600 * av)
157159
158-let aw = (86400 * au)
160+let ax = (86400 * av)
159161
160-let ax = 1
162+let ay = 1
161163
162-let ay = 2
164+let az = 2
163165
164-let az = 1
166+let aA = 1
165167
166-let aA = 2
168+let aB = 2
167169
168-func aB (aC) = (toString(aC) + ",")
170+let aC = 1
171+
172+let aD = 2
173+
174+func aE (aF) = (toString(aF) + ",")
169175
170176
171-func aD (aC,aE) = fraction(aC, au, aE, HALFEVEN)
177+func aG (aF,aH) = fraction(aF, av, aH, HALFEVEN)
172178
173179
174-func aF (aC,aE) = fraction(aC, aE, au, HALFEVEN)
180+func aI (aF,aH) = fraction(aF, aH, av, HALFEVEN)
175181
176182
177-func aG (aC,aE) = fraction(aC, toBigInt(au), aE, HALFEVEN)
183+func aJ (aF,aH) = fraction(aF, toBigInt(av), aH, HALFEVEN)
178184
179185
180-func aH (aC,aE) = fraction(aC, aE, toBigInt(au), HALFEVEN)
186+func aK (aF,aH) = fraction(aF, aH, toBigInt(av), HALFEVEN)
181187
182188
183-func aI (aC) = if ((aC > 0))
184- then aC
185- else -(aC)
189+func aL (aF) = if ((aF > 0))
190+ then aF
191+ else -(aF)
186192
187193
188-func aJ (aC,aE) = if ((aC >= aE))
189- then aC
190- else aE
194+func aM (aF,aH) = if ((aF >= aH))
195+ then aF
196+ else aH
191197
192198
193-func aK (aL) = valueOrErrorMessage(getInteger(this, aL), ("no value for " + aL))
199+func aN (aO) = valueOrErrorMessage(getInteger(this, aO), ("no value for " + aO))
194200
195201
196-func aM (aL,aN) = valueOrElse(getInteger(this, aL), aN)
202+func aP (aO,aQ) = valueOrElse(getInteger(this, aO), aQ)
197203
198204
199-func aO (ad,ac) = {
200- let aP = valueOrErrorMessage(getString(ad, ac), ("No value for key " + ac))
201- aP
205+func aR (ae,ad) = {
206+ let aS = valueOrErrorMessage(getString(ae, ad), ("No value for key " + ad))
207+ aS
202208 }
203209
204210
205-func aQ (ad,ac) = {
206- let aP = valueOrErrorMessage(getInteger(ad, ac), ("No value for key " + ac))
207- aP
211+func aT (ae,ad) = {
212+ let aS = valueOrErrorMessage(getInteger(ae, ad), ("No value for key " + ad))
213+ aS
208214 }
209215
210216
211-func aR () = aK(c)
217+func aU () = aN(c)
212218
213219
214-func aS () = aK(o)
220+func aV () = aP(c, 0)
215221
216222
217-func aT () = aK(p)
223+func aW () = aN(o)
218224
219225
220-func aU () = aK(r)
226+func aX () = aN(p)
221227
222228
223-func aV () = aK(H)
229+func aY () = aN(r)
224230
225231
226-func aW () = aK(I)
232+func aZ () = aN(I)
227233
228234
229-func aX () = aM(J, au)
235+func ba () = aP(I, 0)
230236
231237
232-func aY () = aM(K, au)
238+func bb () = aN(J)
233239
234240
235-func aZ () = aK(L)
241+func bc () = aP(J, 0)
236242
237243
238-func ba () = aK(O)
244+func bd () = aP(K, av)
239245
240246
241-func bb () = aK(P)
247+func be () = aP(L, av)
242248
243249
244-func bc () = aK(Q)
250+func bf () = aN(M)
245251
246252
247-func bd () = aK(E)
253+func bg () = aN(P)
248254
249255
250-func be () = aK(q)
256+func bh () = aN(Q)
251257
252258
253-func bf () = (be() * au)
259+func bi () = aN(R)
254260
255261
256-func bg () = (be() * as)
262+func bj () = aN(F)
257263
258264
259-func bh () = aK(s)
265+func bk () = aN(q)
260266
261267
262-func bi () = aK(t)
268+func bl () = (bk() * av)
263269
264270
265-func bj () = aK(u)
271+func bm () = (bk() * at)
266272
267273
268-func bk () = aK(v)
274+func bn () = aN(s)
269275
270276
271-func bl () = aK(w)
277+func bo () = aN(t)
272278
273279
274-func bm () = aK(x)
280+func bp () = aN(u)
275281
276282
277-func bn () = aK(y)
283+func bq () = aN(v)
278284
279285
280-func bo () = aK(C)
286+func br () = aN(w)
281287
282288
283-func bp () = aK(D)
289+func bs () = aN(x)
284290
285291
286-func bq () = aK(N)
292+func bt () = aN(y)
287293
288294
289-func br () = aK(M)
295+func bu () = aN(D)
290296
291297
292-func bs () = aM(d, 0)
298+func bv () = aN(E)
293299
294300
295-func bt () = aK(z)
301+func bw () = aN(O)
296302
297303
298-func bu () = aK(A)
304+func bx () = aN(N)
299305
300306
301-func bv () = aM(B, az)
307+func by () = aP(d, 0)
302308
303309
304-func bw () = lastBlock.timestamp
310+func bz () = aN(z)
305311
306312
307-func bx (by) = valueOrElse(getString(ak(), "k_sender"), toString(by.caller))
313+func bA () = aN(A)
308314
309315
310-func bz (bA,bB,bC) = {
311- let bD = (bA - bB)
312- if (if (bC)
313- then (0 > bD)
316+func bB () = aP(B, aA)
317+
318+
319+func bC () = aP(C, aC)
320+
321+
322+func bD () = lastBlock.timestamp
323+
324+
325+func bE (bF) = valueOrElse(getString(al(), "k_sender"), toString(bF.caller))
326+
327+
328+func bG (bH,bI,bJ) = {
329+ let bK = (bH - bI)
330+ if (if (bJ)
331+ then (0 > bK)
314332 else false)
315- then throw(((("Invalid margin: " + toString(bA)) + " < ") + toString(bB)))
316- else if (if (!(bC))
317- then (bD >= 0)
333+ then throw(((("Invalid margin: " + toString(bH)) + " < ") + toString(bI)))
334+ else if (if (!(bJ))
335+ then (bK >= 0)
318336 else false)
319- then throw(((("Invalid margin: " + toString(bA)) + " > ") + toString(bB)))
337+ then throw(((("Invalid margin: " + toString(bH)) + " > ") + toString(bI)))
320338 else true
321339 }
322340
323341
324-func bE (bF) = if ((bF == 0))
342+func bL (bM) = if ((bM == 0))
325343 then throw("Should not be called with _positionSize == 0")
326- else if ((bF > 0))
327- then bo()
328- else bp()
344+ else if ((bM > 0))
345+ then bu()
346+ else bv()
329347
330348
331-func bG (bH,bI) = {
332- let bJ = ((bH + "_") + toString(bI))
333- let bK = getInteger(this, ab(e, bJ))
334- let bL = bK
335- if ($isInstanceOf(bL, "Int"))
349+func bN (bO,bP) = {
350+ let bQ = ((bO + "_") + toString(bP))
351+ let bR = getInteger(this, ac(e, bQ))
352+ let bS = bR
353+ if ($isInstanceOf(bS, "Int"))
336354 then {
337- let bM = bL
338- $Tuple5(bM, getIntegerValue(this, ab(f, bJ)), getIntegerValue(this, ab(g, bJ)), getIntegerValue(this, ab(h, bJ)), getIntegerValue(this, ab(k, bJ)))
355+ let bT = bS
356+ $Tuple5(bT, getIntegerValue(this, ac(f, bQ)), getIntegerValue(this, ac(g, bQ)), getIntegerValue(this, ac(h, bQ)), getIntegerValue(this, ac(k, bQ)))
339357 }
340358 else $Tuple5(0, 0, 0, 0, 0)
341359 }
342360
343361
344-func bN (bF) = if ((0 > bF))
345- then ar
346- else aq
362+func bU (bM) = if ((0 > bM))
363+ then as
364+ else ar
347365
348366
349-func bO (bH,bI) = {
350- let bJ = ((bH + "_") + toString(bI))
351- let bP = getInteger(this, ab(j, bJ))
352- let bL = bP
353- if ($isInstanceOf(bL, "Int"))
367+func bV (bO,bP) = {
368+ let bQ = ((bO + "_") + toString(bP))
369+ let bW = getInteger(this, ac(j, bQ))
370+ let bS = bW
371+ if ($isInstanceOf(bS, "Int"))
354372 then {
355- let bQ = bL
356- bQ
373+ let bX = bS
374+ bX
357375 }
358- else aS()
376+ else aW()
359377 }
360378
361379
362-func bR (bH,bI) = if ((bG(bH, bI)._1 == 0))
380+func bY (bO,bP) = if ((bN(bO, bP)._1 == 0))
363381 then throw("No open position")
364382 else true
365383
366384
367-func bS (bT) = {
368- let bU = getString(this, bT)
369- if (if (isDefined(bU))
370- then (value(bU) != "")
385+func bZ (ca) = {
386+ let cb = getString(this, ca)
387+ if (if (isDefined(cb))
388+ then (value(cb) != "")
371389 else false)
372390 then {
373- let bV = split(value(bU), ",")
374- let bW = valueOrErrorMessage(addressFromString(bV[0]), ("Invalid oracle address in: " + value(bU)))
375- let bX = bV[1]
376- let bY = bV[2]
377- let bZ = bV[3]
378- $Tuple4(bW, bX, bY, bZ)
391+ let cc = split(value(cb), ",")
392+ let cd = valueOrErrorMessage(addressFromString(cc[0]), ("Invalid oracle address in: " + value(cb)))
393+ let ce = cc[1]
394+ let cf = cc[2]
395+ let cg = cc[3]
396+ $Tuple4(cd, ce, cf, cg)
379397 }
380398 else unit
381399 }
382400
383401
384-func ca () = valueOrElse(getBoolean(this, l), false)
402+func ch () = valueOrElse(getBoolean(this, l), false)
385403
386404
387-func cb () = valueOrElse(getBoolean(this, m), false)
405+func ci () = valueOrElse(getBoolean(this, m), false)
388406
389407
390-func cc () = valueOrElse(getBoolean(this, n), false)
408+func cj () = valueOrElse(getBoolean(this, n), false)
391409
392410
393-func cd (ce,cf,cg) = if (ce)
411+func ck (cl,cm,cn) = if (cl)
394412 then {
395- let ch = (aW() - cg)
396- if ((0 >= ch))
413+ let co = (bb() - cn)
414+ if ((0 >= co))
397415 then throw("Tx lead to base asset reserve <= 0, revert")
398- else $Tuple3((aV() + cf), ch, (aZ() + cg))
416+ else $Tuple3((aZ() + cm), co, (bf() + cn))
399417 }
400418 else {
401- let ci = (aV() - cf)
402- if ((0 >= ci))
419+ let cp = (aZ() - cm)
420+ if ((0 >= cp))
403421 then throw("Tx lead to base quote reserve <= 0, revert")
404- else $Tuple3(ci, (aW() + cg), (aZ() - cg))
422+ else $Tuple3(cp, (bb() + cn), (bf() - cn))
405423 }
406424
407425
408-func cj (ck,cl) = {
409- let cm = toBigInt(ck)
410- let cn = toBigInt(cl)
411- aH(cm, cn)
426+func cq (cr,cs) = {
427+ let ct = toBigInt(cr)
428+ let cu = toBigInt(cs)
429+ aK(ct, cu)
412430 }
413431
414432
415-func co (ce,cf) = {
416- let ck = aV()
417- let cl = aW()
418- let cp = aX()
419- let cq = aY()
420- let cr = aD(cf, cp)
421- let aL = cj(ck, cl)
422- let cs = if (ce)
423- then (ck + cr)
424- else (ck - cr)
425- let ct = toInt(aG(aL, toBigInt(cs)))
426- let cu = aI((ct - cl))
427- let cv = if (ce)
428- then cu
429- else -(cu)
430- let cw = cd(ce, cr, cu)
431- let cx = cw._1
432- let cy = cw._2
433- let cz = cw._3
434- let cA = aD(aF(ck, cp), aF(cl, cq))
435- let cB = aD(cf, cu)
436- let cC = aI((cA - cB))
437- let cD = (au - aD(cA, (cA + cC)))
438- let cE = bl()
439- if ((cD > cE))
440- then throw(((((((((((((("Price impact " + toString(cD)) + " > max price impact ") + toString(cE)) + " before quote asset: ") + toString(ck)) + " before base asset: ") + toString(cl)) + " quote asset amount to exchange: ") + toString(cf)) + " price before: ") + toString(cA)) + " marketPrice: ") + toString(cB)))
441- else $Tuple4(cv, cx, cy, cz)
433+func cv (cl,cm) = {
434+ let cr = aZ()
435+ let cs = bb()
436+ let cw = bd()
437+ let cx = be()
438+ let cy = aG(cm, cw)
439+ let aO = cq(cr, cs)
440+ let cz = if (cl)
441+ then (cr + cy)
442+ else (cr - cy)
443+ let cA = toInt(aJ(aO, toBigInt(cz)))
444+ let cB = aL((cA - cs))
445+ let cC = if (cl)
446+ then cB
447+ else -(cB)
448+ let cD = ck(cl, cy, cB)
449+ let cE = cD._1
450+ let cF = cD._2
451+ let cG = cD._3
452+ let cH = aG(aI(cr, cw), aI(cs, cx))
453+ let cI = aG(cm, cB)
454+ let cJ = aL((cH - cI))
455+ let cK = (av - aG(cH, (cH + cJ)))
456+ let cL = br()
457+ if ((cK > cL))
458+ then throw(((((((((((((("Price impact " + toString(cK)) + " > max price impact ") + toString(cL)) + " before quote asset: ") + toString(cr)) + " before base asset: ") + toString(cs)) + " quote asset amount to exchange: ") + toString(cm)) + " price before: ") + toString(cH)) + " marketPrice: ") + toString(cI)))
459+ else $Tuple4(cC, cE, cF, cG)
442460 }
443461
444462
445-func cF (cG,cH) = {
446- let cI = ((((bw() - cH) / 1000) / 60) * au)
447- let cJ = aD(aF(aF(cG, cI), aT()), av)
448- cJ
463+func cM (cN,cO) = {
464+ let cP = ((((bD() - cO) / 1000) / 60) * av)
465+ let cQ = aG(aI(aI(cN, cP), aX()), aw)
466+ cQ
449467 }
450468
451469
452-func cK (cL,cG,cM,cH,cN) = {
453- let cO = if ((cL != 0))
470+func cR (cS,cN,cT,cO,cU) = {
471+ let cV = if ((cS != 0))
454472 then {
455- let cP = bE(cL)
456- aF((cP - cM), cL)
473+ let cW = bL(cS)
474+ aI((cW - cT), cS)
457475 }
458476 else 0
459- let cJ = cF(cG, cH)
460- let cQ = (((cN - cJ) - cO) + cG)
461- let cR = if ((0 > cQ))
462- then $Tuple2(0, aI(cQ))
463- else $Tuple2(aI(cQ), 0)
464- let cS = cR._1
465- let cT = cR._2
466- $Tuple4(cS, cT, cO, cJ)
477+ let cQ = cM(cN, cO)
478+ let cX = (((cU - cQ) - cV) + cN)
479+ let cY = if ((0 > cX))
480+ then $Tuple2(0, aL(cX))
481+ else $Tuple2(aL(cX), 0)
482+ let cZ = cY._1
483+ let da = cY._2
484+ $Tuple4(cZ, da, cV, cQ)
467485 }
468486
469487
470-func cU (ce,cg,cV,cW,cX,cY,cZ) = {
471- let cA = aD(aF(cW, cX), aF(cY, cZ))
472- if ((cg == 0))
488+func db (cl,cn,dc,dd,de,df,dg) = {
489+ let cH = aG(aI(dd, de), aI(df, dg))
490+ if ((cn == 0))
473491 then throw("Invalid base asset amount")
474492 else {
475- let aL = cj(cW, cY)
476- let da = if (ce)
477- then (cY + cg)
478- else (cY - cg)
479- let db = toInt(aG(aL, toBigInt(da)))
480- let dc = aI((db - cW))
481- let dd = aF(dc, cX)
482- let cE = bl()
483- let de = cd(!(ce), dc, cg)
484- let cx = de._1
485- let cy = de._2
486- let cz = de._3
487- let cB = aD(dd, cg)
488- let cC = aI((cA - cB))
489- let cD = (au - aD(cA, (cA + cC)))
490- if (if ((cD > cE))
491- then cV
493+ let aO = cq(dd, df)
494+ let dh = if (cl)
495+ then (df + cn)
496+ else (df - cn)
497+ let di = toInt(aJ(aO, toBigInt(dh)))
498+ let dj = aL((di - dd))
499+ let dk = aI(dj, de)
500+ let cL = br()
501+ let dl = ck(!(cl), dj, cn)
502+ let cE = dl._1
503+ let cF = dl._2
504+ let cG = dl._3
505+ let cI = aG(dk, cn)
506+ let cJ = aL((cH - cI))
507+ let cK = (av - aG(cH, (cH + cJ)))
508+ if (if ((cK > cL))
509+ then dc
492510 else false)
493- then throw(((((((((((((("Price impact " + toString(cD)) + " > max price impact ") + toString(cE)) + " before quote asset: ") + toString(cW)) + " before base asset: ") + toString(cY)) + " base asset amount to exchange: ") + toString(cg)) + " price before: ") + toString(cA)) + " market price: ") + toString(cB)))
494- else $Tuple7(dd, cx, cy, cz, (br() - (if (ce)
495- then aI(cg)
496- else 0)), (bq() - (if (!(ce))
497- then aI(cg)
498- else 0)), cD)
511+ then throw(((((((((((((("Price impact " + toString(cK)) + " > max price impact ") + toString(cL)) + " before quote asset: ") + toString(dd)) + " before base asset: ") + toString(df)) + " base asset amount to exchange: ") + toString(cn)) + " price before: ") + toString(cH)) + " market price: ") + toString(cI)))
512+ else $Tuple7(dk, cE, cF, cG, (bx() - (if (cl)
513+ then aL(cn)
514+ else 0)), (bw() - (if (!(cl))
515+ then aL(cn)
516+ else 0)), cK)
499517 }
500518 }
501519
502520
503-func df (ce,cg,cV) = cU(ce, cg, cV, aV(), aX(), aW(), aY())
521+func dm (cl,cn,dc) = db(cl, cn, dc, aZ(), bd(), bb(), be())
504522
505523
506-func dg (dh,bX,bY) = {
507- let di = valueOrErrorMessage(getInteger(dh, bX), ((("Can not get oracle price. Oracle: " + toString(dh)) + " key: ") + bX))
508- if ((bY != ""))
524+func dn (do,ce,cf) = {
525+ let dp = valueOrErrorMessage(getInteger(do, ce), ((("Can not get oracle price. Oracle: " + toString(do)) + " key: ") + ce))
526+ if ((cf != ""))
509527 then {
510- let dj = lastBlock.height
511- let dk = valueOrErrorMessage(getInteger(dh, bY), ((("Can not get oracle block. Oracle: " + toString(dh)) + " key: ") + bY))
512- if (((dj - dk) > bu()))
513- then throw(((("Oracle stale data. Last oracle block: " + toString(dk)) + " current block: ") + toString(dj)))
514- else di
528+ let dq = height
529+ let dr = valueOrErrorMessage(getInteger(do, cf), ((("Can not get oracle block. Oracle: " + toString(do)) + " key: ") + cf))
530+ if (((dq - dr) > bA()))
531+ then throw(((("Oracle stale data. Last oracle block: " + toString(dr)) + " current block: ") + toString(dq)))
532+ else dp
515533 }
516- else di
534+ else dp
517535 }
518536
519537
520-func dl () = {
521- let dm = valueOrErrorMessage(bS(a), "No base asset oracle data")
522- let dn = dg(dm._1, dm._2, dm._3)
523- let do = bS(b)
524- let dp = if (isDefined(do))
538+func ds () = {
539+ let dt = valueOrErrorMessage(bZ(a), "No base asset oracle data")
540+ let du = dn(dt._1, dt._2, dt._3)
541+ let dv = bZ(b)
542+ let dw = if (isDefined(dv))
525543 then {
526- let dq = value(do)
527- dg(dq._1, dq._2, dq._3)
544+ let dx = value(dv)
545+ dn(dx._1, dx._2, dx._3)
528546 }
529- else au
530- aD(dn, dp)
547+ else av
548+ aG(du, dw)
531549 }
532550
533551
534-func dr () = {
535- let dm = valueOrErrorMessage(bS(a), "No base asset oracle data")
536- let dh = dm._1
537- let bZ = dm._4
538- if ((bZ != ""))
552+func dy () = {
553+ let dt = valueOrErrorMessage(bZ(a), "No base asset oracle data")
554+ let do = dt._1
555+ let cg = dt._4
556+ if ((cg != ""))
539557 then {
540- let ds = valueOrErrorMessage(getBoolean(dh, bZ), ((("Can not get oracle is open/closed. Oracle: " + toString(dh)) + " key: ") + bZ))
541- !(ds)
558+ let dz = valueOrErrorMessage(getBoolean(do, cg), ((("Can not get oracle is open/closed. Oracle: " + toString(do)) + " key: ") + cg))
559+ !(dz)
542560 }
543561 else false
544562 }
545563
546564
547-func dt (du,cW,cY,cp,cq) = {
548- let dv = aD(aF(cW, cp), aF(cY, cq))
549- let dw = aD((du + dv), (2 * au))
550- let dt = aD(aI((du - dv)), dw)
551- dt
565+func dA (dB,dd,df,cw,cx) = {
566+ let dC = aG(aI(dd, cw), aI(df, cx))
567+ let dD = aG((dB + dC), (2 * av))
568+ let dA = aG(aL((dB - dC)), dD)
569+ dA
552570 }
553571
554572
555-func dx (cW,cY) = {
556- let dy = dl()
557- let cp = aX()
558- let cq = aY()
559- let dz = dt(dy, aV(), aW(), cp, cq)
560- let dA = dt(dy, cW, cY, cp, cq)
561- if (if ((dA > bm()))
562- then (dA > dz)
573+func dE (dd,df) = {
574+ let dF = ds()
575+ let cw = bd()
576+ let cx = be()
577+ let dG = dA(dF, aZ(), bb(), cw, cx)
578+ let dH = dA(dF, dd, df, cw, cx)
579+ if (if ((dH > bs()))
580+ then (dH > dG)
563581 else false)
564- then throw(((("Price spread " + toString(dA)) + " > max price spread ") + toString(bm())))
582+ then throw(((("Price spread " + toString(dH)) + " > max price spread ") + toString(bs())))
565583 else true
566584 }
567585
568586
569-func dB (dC,dD) = {
570- let dE = bn()
571- if ((dC > dE))
572- then throw(((("Long open notional " + toString(dC)) + " > max open notional ") + toString(dE)))
573- else if ((dD > dE))
574- then throw(((("Short open notional " + toString(dD)) + " > max open notional ") + toString(dE)))
587+func dI (dJ,dK) = {
588+ let dL = bt()
589+ if ((dJ > dL))
590+ then throw(((("Long open notional " + toString(dJ)) + " > max open notional ") + toString(dL)))
591+ else if ((dK > dL))
592+ then throw(((("Short open notional " + toString(dK)) + " > max open notional ") + toString(dL)))
575593 else true
576594 }
577595
578596
579-func dF () = {
580- let cW = aV()
581- let cY = aW()
582- let cp = aX()
583- let cq = aY()
584- aD(aF(cW, cp), aF(cY, cq))
597+func dM () = {
598+ let dd = aZ()
599+ let df = bb()
600+ let cw = bd()
601+ let cx = be()
602+ aG(aI(dd, cw), aI(df, cx))
585603 }
586604
587605
588-func dG () = {
589- let dy = dl()
590- let dH = dF()
591- (aD(aI((dy - dH)), dy) > bk())
606+func dN () = {
607+ let dF = ds()
608+ let dO = dM()
609+ (aG(aL((dF - dO)), dF) > bq())
592610 }
593611
594612
595-func dI (bF,dJ,cW,cX,cY,cZ) = {
596- let dK = aI(bF)
597- let dL = (0 > bF)
598- let dM = if ((dJ == ax))
613+func dP (bM,dQ,dd,de,df,dg) = {
614+ let dR = aL(bM)
615+ let dS = (0 > bM)
616+ let dT = if ((dQ == ay))
599617 then {
600- let dN = cU(!(dL), dK, false, cW, cX, cY, cZ)._1
601- dN
618+ let dU = db(!(dS), dR, false, dd, de, df, dg)._1
619+ dU
602620 }
603- else aF(dK, dl())
604- dM
621+ else aI(dR, ds())
622+ dT
605623 }
606624
607625
608-func dO (bF,dP,cW,cX,cY,cZ,dJ) = if ((bF == 0))
626+func dV (bM,dW,dd,de,df,dg,dQ) = if ((bM == 0))
609627 then throw("Invalid position size")
610628 else {
611- let dL = (0 > bF)
612- let dM = dI(bF, dJ, cW, cX, cY, cZ)
613- let dQ = if (dL)
614- then (dP - dM)
615- else (dM - dP)
616- $Tuple2(dM, dQ)
629+ let dS = (0 > bM)
630+ let dT = dP(bM, dQ, dd, de, df, dg)
631+ let dX = if (dS)
632+ then (dW - dT)
633+ else (dT - dW)
634+ $Tuple2(dT, dX)
617635 }
618636
619637
620-func dR (bH,bI,dJ) = {
621- let dS = bG(bH, bI)
622- let bM = dS._1
623- let dT = dS._2
624- let dU = dS._3
625- let dV = dS._4
626- dO(bM, dU, aV(), aX(), aW(), aY(), dJ)
638+func dY (bO,bP,dQ) = {
639+ let dZ = bN(bO, bP)
640+ let bT = dZ._1
641+ let ea = dZ._2
642+ let eb = dZ._3
643+ let ec = dZ._4
644+ dV(bT, eb, aZ(), bd(), bb(), be(), dQ)
627645 }
628646
629647
630-func dW (dX,dY,dZ) = aD((dX - dY), dZ)
648+func ed (ee,ef,eg) = aG((ee - ef), eg)
631649
632650
633-func ea (bH,bI,dJ) = {
634- let eb = bG(bH, bI)
635- let bM = eb._1
636- let dT = eb._2
637- let ec = eb._3
638- let ed = eb._4
639- let ee = eb._5
640- let ef = dR(bH, bI, dJ)
641- let dM = ef._1
642- let dQ = ef._2
643- let eg = cK(bM, dT, ed, ee, dQ)
644- let cS = eg._1
645- let cT = eg._2
646- dW(cS, cT, dM)
651+func eh (bO,bP,dQ) = {
652+ let ei = bN(bO, bP)
653+ let bT = ei._1
654+ let ea = ei._2
655+ let ej = ei._3
656+ let ek = ei._4
657+ let el = ei._5
658+ let em = dY(bO, bP, dQ)
659+ let dT = em._1
660+ let dX = em._2
661+ let en = cR(bT, ea, ek, el, dX)
662+ let cZ = en._1
663+ let da = en._2
664+ ed(cZ, da, dT)
647665 }
648666
649667
650-func eh (bH,bI) = ea(bH, bI, ax)
668+func eo (bO,bP) = eh(bO, bP, ay)
651669
652670
653-func ei (bH,bF) = {
654- let ej = aJ(bj(), (au - aD(eh(bH, bN(bF)), bh())))
655- let ek = aF(aI(bF), ej)
656- let el = df((bF > 0), ek, false)
657- let em = el._1
658- let cD = el._7
659- if ((bl() > cD))
660- then ek
661- else aF(aI(bF), bj())
671+func ep (bO,bM) = {
672+ let eq = aM(bp(), (av - aG(eo(bO, bU(bM)), bn())))
673+ let er = aI(aL(bM), eq)
674+ let es = dm((bM > 0), er, false)
675+ let et = es._1
676+ let cK = es._7
677+ if ((br() > cK))
678+ then er
679+ else aI(aL(bM), bp())
662680 }
663681
664682
665-func en (bH,bI,eo,ep,eq,er,cV,es) = {
666- let et = bG(bH, bI)
667- let eu = et._1
668- let ev = et._2
669- let ew = et._3
670- let ex = et._4
671- let ey = et._5
672- let ez = (eu > 0)
673- let eA = aI(eu)
674- if (if ((eA >= eo))
675- then (eo > 0)
683+func eu (bO,bP,ev,ew,ex,ey,dc,ez) = {
684+ let eA = bN(bO, bP)
685+ let eB = eA._1
686+ let eC = eA._2
687+ let eD = eA._3
688+ let eE = eA._4
689+ let eF = eA._5
690+ let eG = (eB > 0)
691+ let eH = aL(eB)
692+ if (if ((eH >= ev))
693+ then (ev > 0)
676694 else false)
677695 then {
678- let eB = (eA > eo)
679- let eC = df((eu > 0), eo, cV)
680- let eD = eC._1
681- let cs = eC._2
682- let ct = eC._3
683- let eE = eC._4
684- let eF = if ((eu > 0))
685- then -(eo)
686- else eo
687- let eG = dR(bH, bI, ax)
688- let eH = eG._1
689- let dQ = eG._2
690- let eI = aD(aI(eF), eA)
691- let eJ = aF(dQ, eI)
692- let eK = cK(eu, ev, ex, ey, dQ)
693- let eL = eK._1
694- let eM = eK._2
695- let eN = eK._3
696- let cJ = eK._4
697- let eO = cK(eu, ev, ex, ey, eJ)._2
698- let eP = aF(aF(eH, eI), ep)
699- let eQ = (dQ - eJ)
700- let eR = if ((eu > 0))
701- then ((eH - eD) - eQ)
702- else ((eQ + eH) - eD)
703- let eS = (eu + eF)
704- let eT = if ((eS == 0))
696+ let eI = (eH > ev)
697+ let eJ = dm((eB > 0), ev, dc)
698+ let eK = eJ._1
699+ let cz = eJ._2
700+ let cA = eJ._3
701+ let eL = eJ._4
702+ let eM = if ((eB > 0))
703+ then -(ev)
704+ else ev
705+ let eN = dY(bO, bP, ay)
706+ let eO = eN._1
707+ let dX = eN._2
708+ let eP = aG(aL(eM), eH)
709+ let eQ = aI(dX, eP)
710+ let eR = cR(eB, eC, eE, eF, dX)
711+ let eS = eR._1
712+ let eT = eR._2
713+ let eU = eR._3
714+ let cQ = eR._4
715+ let eV = cR(eB, eC, eE, eF, eQ)._2
716+ let eW = aI(aI(eO, eP), ew)
717+ let eX = (dX - eQ)
718+ let eY = if ((eB > 0))
719+ then ((eO - eK) - eX)
720+ else ((eX + eO) - eK)
721+ let eZ = (eB + eM)
722+ let fa = if ((eZ == 0))
705723 then $Tuple2(0, 0)
706- else $Tuple2(aI(eR), bE(eS))
707- let eU = eT._1
708- let eV = eT._2
709- let eW = (ew - eU)
710- let eX = ea(bH, bI, ax)
711- let eY = if ((eu > 0))
712- then (aF((eU + eQ), eX) - eQ)
713- else (aF((eU - eQ), eX) - eQ)
714- let eZ = ((eL - (eY + eQ)) - eP)
715- let fa = if ((0 > eZ))
716- then if (es)
724+ else $Tuple2(aL(eY), bL(eZ))
725+ let fb = fa._1
726+ let fc = fa._2
727+ let fd = (eD - fb)
728+ let fe = eh(bO, bP, ay)
729+ let ff = if ((eB > 0))
730+ then (aI((fb + eX), fe) - eX)
731+ else (aI((fb - eX), fe) - eX)
732+ let fg = ((eS - (ff + eX)) - eW)
733+ let fh = if ((0 > fg))
734+ then if (ez)
717735 then 0
718736 else throw("Invalid internalClosePosition params: unable to pay fee")
719- else eZ
720- let fb = if (er)
721- then (eY + fa)
722- else eY
723- if (if ((eq != 0))
724- then (eq > eD)
737+ else fg
738+ let fi = if (ey)
739+ then (ff + fh)
740+ else ff
741+ if (if ((ex != 0))
742+ then (ex > eK)
725743 else false)
726- then throw(((("Limit error: " + toString(eD)) + " < ") + toString(eq)))
727- else $Tuple17(eS, fb, eU, eV, eO, eJ, if (if (er)
728- then eB
744+ then throw(((("Limit error: " + toString(eK)) + " < ") + toString(ex)))
745+ else $Tuple17(eZ, fi, fb, fc, eV, eQ, if (if (ey)
746+ then eI
729747 else false)
730748 then 0
731- else fa, cs, ct, eE, (ba() - eW), (br() - (if (ez)
732- then aI(eF)
733- else 0)), (bq() - (if (!(ez))
734- then aI(eF)
735- else 0)), (bc() - (if (ez)
736- then eW
737- else 0)), (bb() - (if (!(ez))
738- then eW
739- else 0)), (eP + cJ), eD)
749+ else fh, cz, cA, eL, (bg() - fd), (bx() - (if (eG)
750+ then aL(eM)
751+ else 0)), (bw() - (if (!(eG))
752+ then aL(eM)
753+ else 0)), (bi() - (if (eG)
754+ then fd
755+ else 0)), (bh() - (if (!(eG))
756+ then fd
757+ else 0)), (eW + cQ), eK)
740758 }
741- else throw(((("Invalid internalClosePosition params: invalid position size: " + toString(eo)) + " max: ") + toString(eA)))
759+ else throw(((("Invalid internalClosePosition params: invalid position size: " + toString(ev)) + " max: ") + toString(eH)))
742760 }
743761
744762
745-func fc () = {
746- let bF = aZ()
747- if ((bF == 0))
748- then $Tuple2(aV(), aW())
763+func fj () = {
764+ let bM = bf()
765+ if ((bM == 0))
766+ then $Tuple2(aZ(), bb())
749767 else {
750- let fd = (bF > 0)
751- let fe = df(fd, aI(bF), false)
752- let ff = fe._1
753- let fg = fe._2
754- let fh = fe._3
755- $Tuple2(fg, fh)
768+ let fk = (bM > 0)
769+ let fl = dm(fk, aL(bM), false)
770+ let fm = fl._1
771+ let fn = fl._2
772+ let fo = fl._3
773+ $Tuple2(fn, fo)
756774 }
757775 }
758776
759777
760-func fi (fj,aZ,fk,fl) = {
761- let fm = toBigInt(fj)
762- let fn = toBigInt(aZ)
763- let fo = toBigInt(fk)
764- let fp = toBigInt(fl)
765- let aL = aH(fo, fm)
766- let fq = (fm + fn)
767- let fr = aG(aL, fq)
768- let fs = aG(fr, fq)
769- let ft = aG(fp, fs)
770- toInt(ft)
778+func fp (fq,bf,fr,fs) = {
779+ let ft = toBigInt(fq)
780+ let fu = toBigInt(bf)
781+ let fv = toBigInt(fr)
782+ let fw = toBigInt(fs)
783+ let aO = aK(fv, ft)
784+ let fx = (ft + fu)
785+ let fy = aJ(aO, fx)
786+ let fz = aJ(fy, fx)
787+ let fA = aJ(fw, fz)
788+ toInt(fA)
771789 }
772790
773791
774-func fu (fv,ck,cl) = {
775- let bF = aZ()
776- if ((bF == 0))
792+func fB (fC,cr,cs) = {
793+ let bM = bf()
794+ if ((bM == 0))
777795 then {
778- let fw = aD(aF(fv, cl), ck)
779- $Tuple3(fw, au, 0)
796+ let fD = aG(aI(fC, cs), cr)
797+ $Tuple3(fD, av, 0)
780798 }
781799 else {
782- let fd = (bF > 0)
783- let ff = df(fd, aI(bF), false)._1
784- let fw = fi(cl, bF, ck, fv)
785- let fx = au
786- let fy = dO(bF, ff, ck, fw, cl, fx, ax)._2
787- $Tuple3(fw, fx, fy)
800+ let fk = (bM > 0)
801+ let fm = dm(fk, aL(bM), false)._1
802+ let fD = fp(cs, bM, cr, fC)
803+ let fE = av
804+ let fF = dV(bM, fm, cr, fD, cs, fE, ay)._2
805+ $Tuple3(fD, fE, fF)
788806 }
789807 }
790808
791809
792-func fz () = {
793- let fA = dl()
794- let fB = dF()
795- let fC = (fB - fA)
796- if (if (if ((bq() == 0))
810+func fG () = {
811+ let fH = ds()
812+ let fI = dM()
813+ let fJ = (fI - fH)
814+ if (if (dy())
797815 then true
798- else (br() == 0))
799- then true
800- else dr())
816+ else if ((bB() == aA))
817+ then if ((bw() == 0))
818+ then true
819+ else (bx() == 0)
820+ else false)
801821 then $Tuple3(0, 0, 0)
802- else if ((0 > fC))
822+ else if ((0 > fJ))
803823 then {
804- let fD = aD(aF(fC, bf()), aw)
805- if ((bv() == az))
824+ let fK = aG(aI(fJ, bl()), ax)
825+ if ((bB() == aA))
806826 then {
807- let fE = aD(aF(fD, bq()), br())
808- $Tuple3(fD, fE, 0)
827+ let fL = aG(aI(fK, bw()), bx())
828+ $Tuple3(fK, fL, 0)
809829 }
810830 else {
811- let fF = aI(aF(fD, bq()))
812- let fG = aI(aF(fD, br()))
813- let fH = (fF - fG)
814- $Tuple3(fD, fD, fH)
831+ let fM = aL(aI(fK, bw()))
832+ let fN = aL(aI(fK, bx()))
833+ let fO = (fM - fN)
834+ $Tuple3(fK, fK, fO)
815835 }
816836 }
817837 else {
818- let fE = aD(aF(fC, bf()), aw)
819- if ((bv() == az))
838+ let fL = aG(aI(fJ, bl()), ax)
839+ if ((bB() == aA))
820840 then {
821- let fD = aD(aF(fE, br()), bq())
822- $Tuple3(fD, fE, 0)
841+ let fK = aG(aI(fL, bx()), bw())
842+ $Tuple3(fK, fL, 0)
823843 }
824844 else {
825- let fG = aI(aF(fE, br()))
826- let fF = aI(aF(fE, bq()))
827- let fH = (fG - fF)
828- $Tuple3(fE, fE, fH)
845+ let fN = aL(aI(fL, bx()))
846+ let fM = aL(aI(fL, bw()))
847+ let fO = (fN - fM)
848+ $Tuple3(fL, fL, fO)
829849 }
830850 }
831851 }
832852
833853
834-func fI (fJ,fK) = {
835- let fL = aS()
836- let fM = aF(fL, fK)
837- let fN = if ((fJ != ""))
854+func fP (fQ,fR) = {
855+ let fS = aW()
856+ let fT = aI(fS, fR)
857+ let fU = if ((fQ != ""))
838858 then {
839- let fO = aO(am(), ab(ao, fJ))
840- if ((fO == ap))
859+ let fV = aR(an(), ac(ap, fQ))
860+ if ((fV == aq))
841861 then {
842- let fP = aQ(am(), ab(an, fJ))
843- let fQ = aF(fM, fP)
844- $Tuple2(fQ, true)
862+ let fW = aT(an(), ac(ao, fQ))
863+ let fX = aI(fT, fW)
864+ $Tuple2(fX, true)
845865 }
846866 else throw("Invalid attached artifact")
847867 }
848- else $Tuple2(fM, false)
849- let fQ = fN._1
850- let fR = fN._2
851- $Tuple2(fQ, fR)
868+ else $Tuple2(fT, false)
869+ let fX = fU._1
870+ let fY = fU._2
871+ $Tuple2(fX, fY)
852872 }
853873
854874
855-func fS (bH,fJ) = {
856- let fT = invoke(aj(), "computeFeeDiscount", [bH], nil)
857- if ((fT == fT))
875+func fZ (bO,fQ) = {
876+ let ga = invoke(ak(), "computeFeeDiscount", [bO], nil)
877+ if ((ga == ga))
858878 then {
859- let fU = {
860- let bL = fT
861- if ($isInstanceOf(bL, "Int"))
879+ let gb = {
880+ let bS = ga
881+ if ($isInstanceOf(bS, "Int"))
862882 then {
863- let fV = bL
864- fV
883+ let gc = bS
884+ gc
865885 }
866886 else throw("Invalid computeFeeDiscount result")
867887 }
868- let fW = fI(fJ, fU)
869- let fQ = fW._1
870- let fR = fW._2
871- $Tuple2(fQ, fR)
888+ let gd = fP(fQ, gb)
889+ let fX = gd._1
890+ let fY = gd._2
891+ $Tuple2(fX, fY)
872892 }
873893 else throw("Strict value is not equal to itself.")
874894 }
875895
876896
877-func fX (by) = {
878- let fY = if ((size(by.payments) > 1))
879- then toBase58String(valueOrErrorMessage(by.payments[1].assetId, "Invalid artifactId"))
897+func ge (bF) = {
898+ let gf = if ((size(bF.payments) > 1))
899+ then toBase58String(valueOrErrorMessage(bF.payments[1].assetId, "Invalid artifactId"))
880900 else ""
881- fY
901+ gf
882902 }
883903
884904
885-func fZ (ga) = {
886- let gb = aF(ga, bt())
887- let gc = (ga - gb)
888- $Tuple2(gb, gc)
905+func gg (gh) = {
906+ let gi = aI(gh, bz())
907+ let gj = (gh - gi)
908+ $Tuple2(gi, gj)
889909 }
890910
891911
892-func gd (ge,gf,gg,gh,ep,gi,gj,gk,gl,dE,gm,gn,go,gp) = [IntegerEntry(r, ge), IntegerEntry(s, gf), IntegerEntry(t, gg), IntegerEntry(q, gh), IntegerEntry(o, ep), IntegerEntry(v, gi), IntegerEntry(w, gj), IntegerEntry(u, gk), IntegerEntry(x, gl), IntegerEntry(y, dE), IntegerEntry(z, gm), IntegerEntry(A, gm), IntegerEntry(p, go), IntegerEntry(B, gp)]
912+func gk (gl,gm,gn,go,ew,gp,gq,gr,gs,dL,gt,gu,gv,gw,gx) = [IntegerEntry(r, gl), IntegerEntry(s, gm), IntegerEntry(t, gn), IntegerEntry(q, go), IntegerEntry(o, ew), IntegerEntry(v, gp), IntegerEntry(w, gq), IntegerEntry(u, gr), IntegerEntry(x, gs), IntegerEntry(y, dL), IntegerEntry(z, gt), IntegerEntry(A, gu), IntegerEntry(p, gv), IntegerEntry(B, gw), IntegerEntry(C, gx)]
893913
894914
895-func gq (gr,gs,gt,gu,gv) = [IntegerEntry(E, gr), IntegerEntry(C, gs), IntegerEntry(D, gt), IntegerEntry(F, gu), IntegerEntry(G, gv)]
915+func gy (gz,gA,gB,gC,gD) = [IntegerEntry(F, gz), IntegerEntry(D, gA), IntegerEntry(E, gB), IntegerEntry(G, gC), IntegerEntry(H, gD)]
896916
897917
898-func gw (gx,bH,bI) = {
899- let bJ = ((bH + "_") + toString(bI))
900- if (gx)
918+func gE (gF,bO,bP) = {
919+ let bQ = ((bO + "_") + toString(bP))
920+ if (gF)
901921 then {
902- let gy = bs()
903-[IntegerEntry(ab(i, bJ), (gy + 1)), IntegerEntry(d, (gy + 1))]
922+ let gG = by()
923+[IntegerEntry(ac(i, bQ), (gG + 1)), IntegerEntry(d, (gG + 1))]
904924 }
905925 else nil
906926 }
907927
908928
909-func gz (gx,bH,bI,ep) = {
910- let bJ = ((bH + "_") + toString(bI))
911- if (gx)
912- then [IntegerEntry(ab(j, bJ), ep)]
929+func gH (gF,bO,bP,ew) = {
930+ let bQ = ((bO + "_") + toString(bP))
931+ if (gF)
932+ then [IntegerEntry(ac(j, bQ), ew)]
913933 else nil
914934 }
915935
916936
917-func gA (bH,eo,gB,gC,cP,gD) = {
918- let fd = bN(eo)
919- let bJ = ((bH + "_") + toString(fd))
920-[IntegerEntry(ab(e, bJ), eo), IntegerEntry(ab(f, bJ), gB), IntegerEntry(ab(g, bJ), gC), IntegerEntry(ab(h, bJ), cP), IntegerEntry(ab(k, bJ), gD)]
937+func gI (bO,ev,gJ,gK,cW,gL) = {
938+ let fk = bU(ev)
939+ let bQ = ((bO + "_") + toString(fk))
940+[IntegerEntry(ac(e, bQ), ev), IntegerEntry(ac(f, bQ), gJ), IntegerEntry(ac(g, bQ), gK), IntegerEntry(ac(h, bQ), cW), IntegerEntry(ac(k, bQ), gL)]
921941 }
922942
923943
924-func gE (ck,cl) = [IntegerEntry(H, ck), IntegerEntry(I, cl)]
944+func gM (cr,cs) = if (if ((0 > cr))
945+ then true
946+ else (0 > cs))
947+ then throw("Invalid amount to update reserves")
948+ else if (if ((cr != ba()))
949+ then true
950+ else (cs != bc()))
951+ then [IntegerEntry(I, cr), IntegerEntry(J, cs)]
952+ else nil
925953
926954
927-func gF (cp,cq) = [IntegerEntry(J, cp), IntegerEntry(K, cq)]
955+func gN (cw,cx) = if (if ((cw != bd()))
956+ then true
957+ else (cx != be()))
958+ then [IntegerEntry(K, cw), IntegerEntry(L, cx)]
959+ else nil
928960
929961
930-func gG (ck,cl,gH,gI,gJ,gK,gL,gM) = {
931- let cp = aX()
932- let cq = aY()
933- if (((gJ - gK) != gH))
934- then throw(((((("Invalid AMM state data: " + toString(gJ)) + " + ") + toString(gK)) + " != ") + toString(gH)))
935- else (gE(ck, cl) ++ [IntegerEntry(L, gH), IntegerEntry(O, gI), IntegerEntry(M, gJ), IntegerEntry(N, gK), IntegerEntry(Q, gL), IntegerEntry(P, gM)])
962+func gO (cr,cs,gP,gQ,gR,gS,gT,gU) = {
963+ let cw = bd()
964+ let cx = be()
965+ if (((gR - gS) != gP))
966+ then throw(((((("Invalid AMM state data: " + toString(gR)) + " - ") + toString(gS)) + " != ") + toString(gP)))
967+ else (gM(cr, cs) ++ [IntegerEntry(M, gP), IntegerEntry(P, gQ), IntegerEntry(N, gR), IntegerEntry(O, gS), IntegerEntry(R, gT), IntegerEntry(Q, gU)])
936968 }
937969
938970
939-func gN (bH,bI) = {
940- let bJ = ((bH + "_") + toString(bI))
941-[DeleteEntry(ab(e, bJ)), DeleteEntry(ab(f, bJ)), DeleteEntry(ab(g, bJ)), DeleteEntry(ab(h, bJ)), DeleteEntry(ab(j, bJ)), DeleteEntry(ab(k, bJ))]
971+func gV (bO,bP) = {
972+ let bQ = ((bO + "_") + toString(bP))
973+[DeleteEntry(ac(e, bQ)), DeleteEntry(ac(f, bQ)), DeleteEntry(ac(g, bQ)), DeleteEntry(ac(h, bQ)), DeleteEntry(ac(j, bQ)), DeleteEntry(ac(k, bQ))]
942974 }
943975
944976
945-func gO (ad,gP) = {
946- let gQ = assetBalance(this, ag())
947- if ((gP > gQ))
948- then throw(((("Unable to withdraw " + toString(gP)) + " from contract balance ") + toString(gQ)))
949- else [ScriptTransfer(ad, gP, ag())]
977+func gW (ae,gX) = {
978+ let gY = assetBalance(this, ah())
979+ if ((gX > gY))
980+ then throw(((("Unable to withdraw " + toString(gX)) + " from contract balance ") + toString(gY)))
981+ else [ScriptTransfer(ae, gX, ah())]
950982 }
951983
952984
953-func gR (by) = if ((0 > by))
985+func gZ (ha) = if ((0 > ha))
954986 then throw("Balance")
955- else [IntegerEntry(c, by)]
987+ else if (if ((aV() == 0))
988+ then true
989+ else (aV() != ha))
990+ then [IntegerEntry(c, ha)]
991+ else nil
956992
957993
958-func gS (by) = [ScriptTransfer(ah(), by, ag())]
994+func hb (bF) = [ScriptTransfer(ai(), bF, ah())]
959995
960996
961-func gT (gU,by) = if (gU)
962- then [Burn(valueOrErrorMessage(by.payments[1].assetId, "Invalid artifact"), 1)]
997+func hc (hd,bF) = if (hd)
998+ then [Burn(valueOrErrorMessage(bF.payments[1].assetId, "Invalid artifact"), 1)]
963999 else nil
9641000
9651001
966-@Callable(by)
967-func pause () = if ((by.caller != af()))
1002+@Callable(bF)
1003+func pause () = if ((bF.caller != ag()))
9681004 then throw("Invalid pause params")
9691005 else [BooleanEntry(m, true)]
9701006
9711007
9721008
973-@Callable(by)
974-func unpause () = if ((by.caller != af()))
1009+@Callable(bF)
1010+func unpause () = if ((bF.caller != ag()))
9751011 then throw("Invalid unpause params")
9761012 else [BooleanEntry(m, false)]
9771013
9781014
9791015
980-@Callable(by)
981-func setCloseOnly () = if ((by.caller != af()))
1016+@Callable(bF)
1017+func setCloseOnly () = if ((bF.caller != ag()))
9821018 then throw("Invalid setCloseOnly params")
9831019 else [BooleanEntry(n, true)]
9841020
9851021
9861022
987-@Callable(by)
988-func unsetCloseOnly () = if ((by.caller != af()))
1023+@Callable(bF)
1024+func unsetCloseOnly () = if ((bF.caller != ag()))
9891025 then throw("Invalid unsetCloseOnly params")
9901026 else [BooleanEntry(n, false)]
9911027
9921028
9931029
994-@Callable(by)
995-func addLiquidity (cf) = if (if ((by.caller != af()))
1030+@Callable(bF)
1031+func changeLiquidity (cm) = if (if ((bF.caller != ag()))
9961032 then true
997- else (0 >= cf))
998- then throw("Invalid addLiquidity params")
1033+ else (cm == 0))
1034+ then throw("Invalid changeLiquidity params")
9991035 else {
1000- let ck = aV()
1001- let cl = aW()
1002- let cp = aX()
1003- let cq = aY()
1004- let gV = aD(aF(ck, cp), aF(cl, cq))
1005- let gW = (ck + cf)
1006- let gX = (aD(aF(gW, cp), gV) - cl)
1007- let gY = (cl + gX)
1008- let gZ = fu(dl(), gW, gY)
1009- let ha = gZ._1
1010- let hb = gZ._2
1011- let fy = gZ._3
1012- let hc = if ((fy != 0))
1036+ let cr = aZ()
1037+ let cs = bb()
1038+ let cw = bd()
1039+ let cx = be()
1040+ let he = aG(aI(cr, cw), aI(cs, cx))
1041+ let hf = (cr + cm)
1042+ let hg = (aG(aI(hf, cw), he) - cs)
1043+ let hh = (cs + hg)
1044+ let hi = fB(ds(), hf, hh)
1045+ let hj = hi._1
1046+ let hk = hi._2
1047+ let fF = hi._3
1048+ let hl = if ((fF != 0))
10131049 then {
1014- let hc = invoke(ai(), "exchangeFreeAndLocked", [fy], nil)
1015- if ((hc == hc))
1050+ let hl = invoke(aj(), "exchangeFreeAndLocked", [fF], nil)
1051+ if ((hl == hl))
10161052 then nil
10171053 else throw("Strict value is not equal to itself.")
10181054 }
10191055 else nil
1020- if ((hc == hc))
1021- then (gE(gW, gY) ++ gF(ha, hb))
1056+ if ((hl == hl))
1057+ then (gM(hf, hh) ++ gN(hj, hk))
10221058 else throw("Strict value is not equal to itself.")
10231059 }
10241060
10251061
10261062
1027-@Callable(by)
1028-func removeLiquidity (cf) = if (if ((by.caller != af()))
1063+@Callable(bF)
1064+func changeSettings (gl,gm,gn,go,ew,gp,gq,gr,gs,dL,gt,gu,gv,gw,gx) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= go))
10291065 then true
1030- else (cf >= 0))
1031- then throw("Invalid removeLiquidity params")
1032- else {
1033- let ck = aV()
1034- let cl = aW()
1035- let cp = aX()
1036- let cq = aY()
1037- let gV = aD(aF(ck, cp), aF(cl, cq))
1038- let gW = (ck - cf)
1039- let hd = aI((aD(aF(gW, cp), gV) - cl))
1040- let gY = (cl - hd)
1041- let he = fu(dl(), gW, gY)
1042- let ha = he._1
1043- let hb = he._2
1044- let fy = he._3
1045- let hc = if ((fy != 0))
1046- then {
1047- let hc = invoke(ai(), "exchangeFreeAndLocked", [fy], nil)
1048- if ((hc == hc))
1049- then nil
1050- else throw("Strict value is not equal to itself.")
1051- }
1052- else nil
1053- if ((hc == hc))
1054- then (gE(gW, gY) ++ gF(ha, hb))
1055- else throw("Strict value is not equal to itself.")
1056- }
1066+ else (0 >= gl))
1067+ then true
1068+ else (0 >= gm))
1069+ then true
1070+ else (0 >= gn))
1071+ then true
1072+ else (0 >= ew))
1073+ then true
1074+ else (0 >= gp))
1075+ then true
1076+ else (0 >= gq))
1077+ then true
1078+ else (0 >= gr))
1079+ then true
1080+ else (0 >= gs))
1081+ then true
1082+ else (0 >= dL))
1083+ then true
1084+ else (0 >= gt))
1085+ then true
1086+ else (gt > av))
1087+ then true
1088+ else (0 >= gu))
1089+ then true
1090+ else (0 >= gv))
1091+ then true
1092+ else if ((gw != aB))
1093+ then (gw != aA)
1094+ else false)
1095+ then true
1096+ else if ((gx != aC))
1097+ then (gx != aD)
1098+ else false)
1099+ then true
1100+ else !(ch()))
1101+ then true
1102+ else (bF.caller != ag()))
1103+ then throw("Invalid changeSettings params")
1104+ else gk(gl, gm, gn, go, ew, gp, gq, gr, gs, dL, gt, gu, gv, gw, gx)
10571105
10581106
10591107
1060-@Callable(by)
1061-func changeSettings (ge,gf,gg,gh,ep,gi,gj,gk,gl,dE,gm,gn,go,gp) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= gh))
1108+@Callable(bF)
1109+func initialize (cr,cs,go,gl,gm,gn,ew,hm,hn,ho,gp,gq,gr,gs,dL,gt,gu,gv,gw,gx) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= cr))
10621110 then true
1063- else (0 >= ge))
1111+ else (0 >= cs))
10641112 then true
1065- else (0 >= gf))
1066- then true
1067- else (0 >= gg))
1068- then true
1069- else (0 >= ep))
1070- then true
1071- else (0 >= gi))
1072- then true
1073- else (0 >= gj))
1074- then true
1075- else (0 >= gk))
1113+ else (0 >= go))
10761114 then true
10771115 else (0 >= gl))
10781116 then true
1079- else (0 >= dE))
1080- then true
10811117 else (0 >= gm))
1082- then true
1083- else (gm > au))
10841118 then true
10851119 else (0 >= gn))
10861120 then true
1087- else (0 >= go))
1121+ else (0 >= ew))
10881122 then true
1089- else if ((gp != aA))
1090- then (gp != az)
1123+ else (0 >= gp))
1124+ then true
1125+ else (0 >= gq))
1126+ then true
1127+ else (0 >= gr))
1128+ then true
1129+ else (0 >= gs))
1130+ then true
1131+ else (0 >= dL))
1132+ then true
1133+ else (0 >= gt))
1134+ then true
1135+ else (gt > av))
1136+ then true
1137+ else (0 > gu))
1138+ then true
1139+ else (0 >= gv))
1140+ then true
1141+ else if ((gw != aB))
1142+ then (gw != aA)
10911143 else false)
10921144 then true
1093- else !(ca()))
1145+ else if ((gx != aC))
1146+ then (gx != aD)
1147+ else false)
10941148 then true
1095- else (by.caller != af()))
1096- then throw("Invalid changeSettings params")
1097- else gd(ge, gf, gg, gh, ep, gi, gj, gk, gl, dE, gm, gn, go, gp)
1149+ else ch())
1150+ then true
1151+ else (bF.caller != this))
1152+ then throw("Invalid initialize parameters")
1153+ else ((((gO(cr, cs, 0, 0, 0, 0, 0, 0) ++ gk(gl, gm, gn, go, ew, gp, gq, gr, gs, dL, gt, gu, gv, gw, gx)) ++ gy((bD() + go), 0, 0, 0, 0)) ++ gZ(0)) ++ [BooleanEntry(l, true), StringEntry(a, hm), StringEntry(b, hn), StringEntry(T, toString(addressFromStringValue(ho)))])
10981154
10991155
11001156
1101-@Callable(by)
1102-func initialize (ck,cl,gh,ge,gf,gg,ep,hf,hg,hh,gi,gj,gk,gl,dE,gm,gn,go,gp) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= ck))
1103- then true
1104- else (0 >= cl))
1105- then true
1106- else (0 >= gh))
1107- then true
1108- else (0 >= ge))
1109- then true
1110- else (0 >= gf))
1111- then true
1112- else (0 >= gg))
1113- then true
1114- else (0 >= ep))
1115- then true
1116- else (0 >= gi))
1117- then true
1118- else (0 >= gj))
1119- then true
1120- else (0 >= gk))
1121- then true
1122- else (0 >= gl))
1123- then true
1124- else (0 >= dE))
1125- then true
1126- else (0 >= gm))
1127- then true
1128- else (gm > au))
1129- then true
1130- else (0 >= gn))
1131- then true
1132- else (0 >= go))
1133- then true
1134- else if ((gp != aA))
1135- then (gp != az)
1136- else false)
1137- then true
1138- else ca())
1139- then true
1140- else (by.caller != this))
1141- then throw("Invalid initialize parameters")
1142- else ((((gG(ck, cl, 0, 0, 0, 0, 0, 0) ++ gd(ge, gf, gg, gh, ep, gi, gj, gk, gl, dE, gm, gn, go, gp)) ++ gq((bw() + gh), 0, 0, 0, 0)) ++ gR(0)) ++ [BooleanEntry(l, true), StringEntry(a, hf), StringEntry(b, hg), StringEntry(S, toString(addressFromStringValue(hh)))])
1157+@Callable(bF)
1158+func increasePosition (bP,hp,hq,hr,hs) = {
1159+ let ht = invoke(this, "updateOracle", [hs], nil)
1160+ if ((ht == ht))
1161+ then {
1162+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1163+ if ((hu == hu))
1164+ then {
1165+ let hv = invoke(this, "ensureCalledOnce", nil, nil)
1166+ if ((hv == hv))
1167+ then {
1168+ let bO = bE(bF)
1169+ let hw = bF.payments[0].amount
1170+ let hx = bF.payments[0].assetId
1171+ let hy = toBase58String(value(hx))
1172+ let hz = (hx == ah())
1173+ if (if (if (if (if (if (if (if (if ((bP != ar))
1174+ then (bP != as)
1175+ else false)
1176+ then true
1177+ else (0 >= hw))
1178+ then true
1179+ else !(ch()))
1180+ then true
1181+ else !(hz))
1182+ then true
1183+ else !(bG(aG(av, hp), aY(), true)))
1184+ then true
1185+ else ci())
1186+ then true
1187+ else cj())
1188+ then true
1189+ else dy())
1190+ then throw("Invalid increasePosition parameters")
1191+ else {
1192+ let hA = fZ(bO, ge(bF))
1193+ let fX = hA._1
1194+ let fY = hA._2
1195+ let gX = aG(hw, (aI(fX, hp) + av))
1196+ let hB = (hw - gX)
1197+ let hC = invoke(am(), "acceptPaymentWithLink", [bO, hr], [AttachedPayment(ah(), hB)])
1198+ if ((hC == hC))
1199+ then {
1200+ let hD = {
1201+ let bS = hC
1202+ if ($isInstanceOf(bS, "Int"))
1203+ then {
1204+ let gc = bS
1205+ gc
1206+ }
1207+ else throw("Invalid referrerFee")
1208+ }
1209+ let hE = (hB - hD)
1210+ let hF = bN(bO, bP)
1211+ let eB = hF._1
1212+ let eC = hF._2
1213+ let eD = hF._3
1214+ let eE = hF._4
1215+ let eF = hF._5
1216+ let hG = (eB == 0)
1217+ let hH = if ((eB > 0))
1218+ then (bP == ar)
1219+ else (bP == as)
1220+ let hI = if (!(hG))
1221+ then hH
1222+ else false
1223+ let hJ = (bP == ar)
1224+ let hK = if (if (hG)
1225+ then true
1226+ else hI)
1227+ then {
1228+ let hL = aI(gX, hp)
1229+ let hM = cv(hJ, hL)
1230+ let cC = hM._1
1231+ let cz = hM._2
1232+ let cA = hM._3
1233+ let eL = hM._4
1234+ if (if ((hq != 0))
1235+ then (hq > aL(cC))
1236+ else false)
1237+ then throw(((("Limit error: " + toString(aL(cC))) + " < ") + toString(hq)))
1238+ else {
1239+ let eZ = (eB + cC)
1240+ let hN = (bi() + (if ((eZ > 0))
1241+ then hL
1242+ else 0))
1243+ let hO = (bh() + (if ((0 > eZ))
1244+ then hL
1245+ else 0))
1246+ let hP = cR(eB, eC, eE, eF, gX)
1247+ let cZ = hP._1
1248+ let eT = hP._2
1249+ let eU = hP._3
1250+ let cQ = hP._4
1251+ if (!(dE(cz, cA)))
1252+ then throw("Over max spread limit")
1253+ else if (!(dI(hN, hO)))
1254+ then throw("Over max open notional")
1255+ else $Tuple14(eZ, cZ, (eD + hL), bL(eZ), bD(), cA, cz, eL, (bg() + hL), (bx() + (if ((eZ > 0))
1256+ then aL(cC)
1257+ else 0)), (bw() + (if ((0 > eZ))
1258+ then aL(cC)
1259+ else 0)), hN, hO, cQ)
1260+ }
1261+ }
1262+ else {
1263+ let hL = aI(gX, hp)
1264+ let hQ = dY(toString(bF.caller), bP, ay)
1265+ let eO = hQ._1
1266+ let dX = hQ._2
1267+ if ((eO > hL))
1268+ then throw("Use decreasePosition to decrease position size")
1269+ else throw("Close position first")
1270+ }
1271+ let eZ = hK._1
1272+ let hR = hK._2
1273+ let fb = hK._3
1274+ let hS = hK._4
1275+ let hT = hK._5
1276+ let cA = hK._6
1277+ let cz = hK._7
1278+ let eL = hK._8
1279+ let hU = hK._9
1280+ let hV = hK._10
1281+ let hW = hK._11
1282+ let hN = hK._12
1283+ let hO = hK._13
1284+ let cQ = hK._14
1285+ let hX = gg((hE + cQ))
1286+ let gi = hX._1
1287+ let gj = hX._2
1288+ let hY = if ((gX >= cQ))
1289+ then invoke(aj(), "addLocked", nil, [AttachedPayment(ah(), (gX - cQ))])
1290+ else invoke(aj(), "withdrawLocked", [(cQ - gX)], nil)
1291+ if ((hY == hY))
1292+ then {
1293+ let hZ = invoke(aj(), "addFree", nil, [AttachedPayment(ah(), gj)])
1294+ if ((hZ == hZ))
1295+ then {
1296+ let ia = invoke(ak(), "notifyFees", [bO, hE], nil)
1297+ if ((ia == ia))
1298+ then {
1299+ let ib = invoke(ak(), "notifyNotional", [bO, fb], nil)
1300+ if ((ib == ib))
1301+ then ((((((gI(bO, eZ, hR, fb, hS, hT) ++ gE(hG, bO, bP)) ++ gH(hG, bO, bP, fX)) ++ gO(cz, cA, eL, hU, hV, hW, hN, hO)) ++ hb(gi)) ++ gZ(((aU() + gX) - cQ))) ++ hc(fY, bF))
1302+ else throw("Strict value is not equal to itself.")
1303+ }
1304+ else throw("Strict value is not equal to itself.")
1305+ }
1306+ else throw("Strict value is not equal to itself.")
1307+ }
1308+ else throw("Strict value is not equal to itself.")
1309+ }
1310+ else throw("Strict value is not equal to itself.")
1311+ }
1312+ }
1313+ else throw("Strict value is not equal to itself.")
1314+ }
1315+ else throw("Strict value is not equal to itself.")
1316+ }
1317+ else throw("Strict value is not equal to itself.")
1318+ }
11431319
11441320
11451321
1146-@Callable(by)
1147-func increasePosition (bI,hi,hj,hk) = {
1148- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1149- if ((hl == hl))
1322+@Callable(bF)
1323+func addMargin (bP,hs) = {
1324+ let ht = invoke(this, "updateOracle", [hs], nil)
1325+ if ((ht == ht))
11501326 then {
1151- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1152- if ((hm == hm))
1327+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1328+ if ((hu == hu))
11531329 then {
1154- let bH = bx(by)
1155- let hn = by.payments[0].amount
1156- let ho = by.payments[0].assetId
1157- let hp = toBase58String(value(ho))
1158- let hq = (ho == ag())
1159- if (if (if (if (if (if (if (if (if ((bI != aq))
1160- then (bI != ar)
1161- else false)
1162- then true
1163- else (0 >= hn))
1164- then true
1165- else !(ca()))
1166- then true
1167- else !(hq))
1168- then true
1169- else !(bz(aD(au, hi), aU(), true)))
1170- then true
1171- else cb())
1172- then true
1173- else cc())
1174- then true
1175- else dr())
1176- then throw("Invalid increasePosition parameters")
1177- else {
1178- let hr = fS(bH, fX(by))
1179- let fQ = hr._1
1180- let fR = hr._2
1181- let gP = aD(hn, (aF(fQ, hi) + au))
1182- let hs = (hn - gP)
1183- let ht = invoke(al(), "acceptPaymentWithLink", [bH, hk], [AttachedPayment(ag(), hs)])
1184- if ((ht == ht))
1185- then {
1186- let hu = {
1187- let bL = ht
1188- if ($isInstanceOf(bL, "Int"))
1189- then {
1190- let fV = bL
1191- fV
1192- }
1193- else throw("Invalid referrerFee")
1194- }
1195- let hv = (hs - hu)
1196- let hw = bG(bH, bI)
1197- let eu = hw._1
1198- let ev = hw._2
1199- let ew = hw._3
1200- let ex = hw._4
1201- let ey = hw._5
1202- let hx = (eu == 0)
1203- let hy = if ((eu > 0))
1204- then (bI == aq)
1205- else (bI == ar)
1206- let hz = if (!(hx))
1207- then hy
1208- else false
1209- let hA = (bI == aq)
1210- let hB = if (if (hx)
1211- then true
1212- else hz)
1330+ let hv = invoke(this, "ensureCalledOnce", nil, nil)
1331+ if ((hv == hv))
1332+ then {
1333+ let bO = toString(bF.caller)
1334+ let gX = bF.payments[0].amount
1335+ let hx = bF.payments[0].assetId
1336+ let hy = toBase58String(value(hx))
1337+ let hz = (hx == ah())
1338+ if (if (if (if (if (!(hz))
1339+ then true
1340+ else !(bY(toString(bF.caller), bP)))
1341+ then true
1342+ else !(ch()))
1343+ then true
1344+ else ci())
1345+ then true
1346+ else dy())
1347+ then throw("Invalid addMargin parameters")
1348+ else {
1349+ let ic = bN(bO, bP)
1350+ let eB = ic._1
1351+ let eC = ic._2
1352+ let eD = ic._3
1353+ let eE = ic._4
1354+ let eF = ic._5
1355+ let hY = invoke(aj(), "addLocked", nil, [AttachedPayment(ah(), gX)])
1356+ if ((hY == hY))
12131357 then {
1214- let hC = aF(gP, hi)
1215- let hD = co(hA, hC)
1216- let cv = hD._1
1217- let cs = hD._2
1218- let ct = hD._3
1219- let eE = hD._4
1220- if (if ((hj != 0))
1221- then (hj > aI(cv))
1222- else false)
1223- then throw(((("Limit error: " + toString(aI(cv))) + " < ") + toString(hj)))
1358+ let cQ = cM(eC, eF)
1359+ let id = if ((cQ > 0))
1360+ then {
1361+ let ie = gg(cQ)
1362+ let gi = ie._1
1363+ let gj = ie._2
1364+ let if = invoke(aj(), "withdrawLocked", [gi], nil)
1365+ if ((if == if))
1366+ then {
1367+ let ig = invoke(aj(), "exchangeFreeAndLocked", [-(gj)], nil)
1368+ if ((ig == ig))
1369+ then hb(gi)
1370+ else throw("Strict value is not equal to itself.")
1371+ }
1372+ else throw("Strict value is not equal to itself.")
1373+ }
1374+ else nil
1375+ if ((id == id))
1376+ then ((gI(bO, eB, ((eC - cQ) + gX), eD, eE, bD()) ++ gZ(((aU() + gX) - cQ))) ++ id)
1377+ else throw("Strict value is not equal to itself.")
1378+ }
1379+ else throw("Strict value is not equal to itself.")
1380+ }
1381+ }
1382+ else throw("Strict value is not equal to itself.")
1383+ }
1384+ else throw("Strict value is not equal to itself.")
1385+ }
1386+ else throw("Strict value is not equal to itself.")
1387+ }
1388+
1389+
1390+
1391+@Callable(bF)
1392+func removeMargin (gX,bP,hs) = {
1393+ let ht = invoke(this, "updateOracle", [hs], nil)
1394+ if ((ht == ht))
1395+ then {
1396+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1397+ if ((hu == hu))
1398+ then {
1399+ let hv = invoke(this, "ensureCalledOnce", nil, nil)
1400+ if ((hv == hv))
1401+ then {
1402+ let bO = toString(bF.caller)
1403+ if (if (if (if (if ((0 >= gX))
1404+ then true
1405+ else !(bY(bO, bP)))
1406+ then true
1407+ else !(ch()))
1408+ then true
1409+ else ci())
1410+ then true
1411+ else dy())
1412+ then throw("Invalid removeMargin parameters")
1413+ else {
1414+ let ih = bN(bO, bP)
1415+ let eB = ih._1
1416+ let eC = ih._2
1417+ let eD = ih._3
1418+ let eE = ih._4
1419+ let eF = ih._5
1420+ let ii = cR(eB, eC, eE, eF, -(gX))
1421+ let cZ = ii._1
1422+ let da = ii._2
1423+ let cV = ii._3
1424+ let cQ = ii._4
1425+ if ((da != 0))
1426+ then throw("Invalid removed margin amount")
1427+ else {
1428+ let fe = ed(cZ, da, eD)
1429+ if (!(bG(fe, aY(), true)))
1430+ then throw(((("Too much margin removed: " + toString(fe)) + " < ") + toString(aY())))
12241431 else {
1225- let eS = (eu + cv)
1226- let hE = (bc() + (if ((eS > 0))
1227- then hC
1228- else 0))
1229- let hF = (bb() + (if ((0 > eS))
1230- then hC
1231- else 0))
1232- let hG = cK(eu, ev, ex, ey, gP)
1233- let cS = hG._1
1234- let eM = hG._2
1235- let eN = hG._3
1236- let cJ = hG._4
1237- if (!(dx(cs, ct)))
1238- then throw("Over max spread limit")
1239- else if (!(dB(hE, hF)))
1240- then throw("Over max open notional")
1241- else $Tuple14(eS, cS, (ew + hC), bE(eS), bw(), ct, cs, eE, (ba() + hC), (br() + (if ((eS > 0))
1242- then aI(cv)
1243- else 0)), (bq() + (if ((0 > eS))
1244- then aI(cv)
1245- else 0)), hE, hF, cJ)
1432+ let ij = gg(cQ)
1433+ let gi = ij._1
1434+ let gj = ij._2
1435+ let id = if ((cQ > 0))
1436+ then {
1437+ let ig = invoke(aj(), "exchangeFreeAndLocked", [-(gj)], nil)
1438+ if ((ig == ig))
1439+ then hb(gi)
1440+ else throw("Strict value is not equal to itself.")
1441+ }
1442+ else nil
1443+ if ((id == id))
1444+ then {
1445+ let if = invoke(aj(), "withdrawLocked", [(gX + gi)], nil)
1446+ if ((if == if))
1447+ then (((gI(bO, eB, cZ, eD, bL(eB), bD()) ++ gW(bF.caller, gX)) ++ gZ(((aU() - gX) - cQ))) ++ id)
1448+ else throw("Strict value is not equal to itself.")
1449+ }
1450+ else throw("Strict value is not equal to itself.")
12461451 }
12471452 }
1248- else {
1249- let hC = aF(gP, hi)
1250- let hH = dR(toString(by.caller), bI, ax)
1251- let eH = hH._1
1252- let dQ = hH._2
1253- if ((eH > hC))
1254- then throw("Use decreasePosition to decrease position size")
1255- else throw("Close position first")
1256- }
1257- let eS = hB._1
1258- let hI = hB._2
1259- let eU = hB._3
1260- let hJ = hB._4
1261- let hK = hB._5
1262- let ct = hB._6
1263- let cs = hB._7
1264- let eE = hB._8
1265- let hL = hB._9
1266- let hM = hB._10
1267- let hN = hB._11
1268- let hE = hB._12
1269- let hF = hB._13
1270- let cJ = hB._14
1271- let hO = fZ((hv + cJ))
1272- let gb = hO._1
1273- let gc = hO._2
1274- let hP = if ((gP >= cJ))
1275- then invoke(ai(), "addLocked", nil, [AttachedPayment(ag(), (gP - cJ))])
1276- else invoke(ai(), "withdrawLocked", [(cJ - gP)], nil)
1277- if ((hP == hP))
1453+ }
1454+ }
1455+ else throw("Strict value is not equal to itself.")
1456+ }
1457+ else throw("Strict value is not equal to itself.")
1458+ }
1459+ else throw("Strict value is not equal to itself.")
1460+ }
1461+
1462+
1463+
1464+@Callable(bF)
1465+func closePosition (ev,bP,ex,ey,hs) = {
1466+ let ht = invoke(this, "updateOracle", [hs], nil)
1467+ if ((ht == ht))
1468+ then {
1469+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1470+ if ((hu == hu))
1471+ then {
1472+ let hv = invoke(this, "ensureCalledOnce", nil, nil)
1473+ if ((hv == hv))
1474+ then {
1475+ let bO = bE(bF)
1476+ let ik = valueOrErrorMessage(addressFromString(bO), "Invalid caller")
1477+ let bX = bV(bO, bP)
1478+ if (if (if (if (if (if (!(bY(bO, bP)))
1479+ then true
1480+ else !(ch()))
1481+ then true
1482+ else ci())
1483+ then true
1484+ else (0 >= ev))
1485+ then true
1486+ else (0 > ex))
1487+ then true
1488+ else dy())
1489+ then throw("Invalid closePosition parameters")
1490+ else {
1491+ let eF = bN(bO, bP)._5
1492+ let il = eu(bO, bP, ev, bX, ex, ey, true, true)
1493+ let eZ = il._1
1494+ let fi = il._2
1495+ let fb = il._3
1496+ let fc = il._4
1497+ let eV = il._5
1498+ let eQ = il._6
1499+ let fh = il._7
1500+ let cz = il._8
1501+ let cA = il._9
1502+ let eL = il._10
1503+ let hU = il._11
1504+ let hV = il._12
1505+ let hW = il._13
1506+ let hN = il._14
1507+ let hO = il._15
1508+ let im = il._16
1509+ if ((eV > 0))
1510+ then throw("Invalid closePosition parameters: bad debt")
1511+ else if ((eF >= bD()))
1512+ then throw("Invalid closePosition parameters: wait at least 1 block before closing the position")
1513+ else {
1514+ let eI = (eZ != 0)
1515+ let in = (fh + im)
1516+ let io = (aU() - in)
1517+ let ip = if ((0 > io))
1518+ then 0
1519+ else io
1520+ let if = invoke(aj(), "withdrawLocked", [in], nil)
1521+ if ((if == if))
1522+ then {
1523+ let hC = invoke(am(), "acceptPayment", [bO], [AttachedPayment(ah(), im)])
1524+ if ((hC == hC))
1525+ then {
1526+ let hD = {
1527+ let bS = hC
1528+ if ($isInstanceOf(bS, "Int"))
1529+ then {
1530+ let gc = bS
1531+ gc
1532+ }
1533+ else throw("Invalid referrerFee")
1534+ }
1535+ let iq = gg((im - hD))
1536+ let gi = iq._1
1537+ let gj = iq._2
1538+ let hZ = invoke(aj(), "addFree", nil, [AttachedPayment(ah(), gj)])
1539+ if ((hZ == hZ))
1540+ then {
1541+ let ia = invoke(ak(), "notifyFees", [bO, im], nil)
1542+ if ((ia == ia))
1543+ then {
1544+ let ib = invoke(ak(), "notifyNotional", [bO, fb], nil)
1545+ if ((ib == ib))
1546+ then (((((if (eI)
1547+ then gI(bO, eZ, fi, fb, fc, bD())
1548+ else gV(bO, bP)) ++ gO(cz, cA, eL, hU, hV, hW, hN, hO)) ++ (if ((fh > 0))
1549+ then gW(ik, fh)
1550+ else nil)) ++ gZ(ip)) ++ hb(gi))
1551+ else throw("Strict value is not equal to itself.")
1552+ }
1553+ else throw("Strict value is not equal to itself.")
1554+ }
1555+ else throw("Strict value is not equal to itself.")
1556+ }
1557+ else throw("Strict value is not equal to itself.")
1558+ }
1559+ else throw("Strict value is not equal to itself.")
1560+ }
1561+ }
1562+ }
1563+ else throw("Strict value is not equal to itself.")
1564+ }
1565+ else throw("Strict value is not equal to itself.")
1566+ }
1567+ else throw("Strict value is not equal to itself.")
1568+ }
1569+
1570+
1571+
1572+@Callable(bF)
1573+func liquidate (bO,bP,hs) = {
1574+ let ht = invoke(this, "updateOracle", [hs], nil)
1575+ if ((ht == ht))
1576+ then {
1577+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1578+ if ((hu == hu))
1579+ then {
1580+ let ir = eh(bO, bP, ay)
1581+ let is = if (dN())
1582+ then {
1583+ let it = eh(bO, bP, az)
1584+ aM(ir, it)
1585+ }
1586+ else ir
1587+ if (if (if (if (if (!(bG(is, bn(), false)))
1588+ then true
1589+ else !(bY(bO, bP)))
1590+ then true
1591+ else !(ch()))
1592+ then true
1593+ else ci())
1594+ then true
1595+ else dy())
1596+ then throw("Unable to liquidate")
1597+ else {
1598+ let iu = if (if ((ir > bo()))
1599+ then (bp() > 0)
1600+ else false)
1601+ then (av > bp())
1602+ else false
1603+ let eB = bN(bO, bP)._1
1604+ let dR = aL(eB)
1605+ let iv = if (iu)
1606+ then {
1607+ let iw = ep(bO, eB)
1608+ let ix = aG(aL(iw), dR)
1609+ $Tuple2(ix, aL(iw))
1610+ }
1611+ else $Tuple2(0, dR)
1612+ let ix = iv._1
1613+ let iw = iv._2
1614+ let iy = eu(bO, bP, if (iu)
1615+ then iw
1616+ else dR, bo(), 0, true, false, true)
1617+ let eZ = iy._1
1618+ let fi = iy._2
1619+ let fb = iy._3
1620+ let fc = iy._4
1621+ let eV = iy._5
1622+ let eQ = iy._6
1623+ let fh = iy._7
1624+ let cz = iy._8
1625+ let cA = iy._9
1626+ let eL = iy._10
1627+ let hU = iy._11
1628+ let hV = iy._12
1629+ let hW = iy._13
1630+ let hN = iy._14
1631+ let hO = iy._15
1632+ let iz = iy._16
1633+ let iA = (iz / 2)
1634+ let gj = (iz - iA)
1635+ let io = (aU() - iz)
1636+ let iB = if ((0 > io))
1637+ then 0
1638+ else io
1639+ let ig = if ((eV > 0))
1640+ then {
1641+ let ig = invoke(aj(), "exchangeFreeAndLocked", [(eV + iz)], nil)
1642+ if ((ig == ig))
1643+ then nil
1644+ else throw("Strict value is not equal to itself.")
1645+ }
1646+ else nil
1647+ if ((ig == ig))
1648+ then {
1649+ let if = invoke(aj(), "withdrawLocked", [iz], nil)
1650+ if ((if == if))
12781651 then {
1279- let hQ = invoke(ai(), "addFree", nil, [AttachedPayment(ag(), gc)])
1280- if ((hQ == hQ))
1652+ let iC = invoke(aj(), "addFree", nil, [AttachedPayment(ah(), gj)])
1653+ if ((iC == iC))
12811654 then {
1282- let hR = invoke(aj(), "notifyFees", [bH, hv], nil)
1283- if ((hR == hR))
1284- then {
1285- let hS = invoke(aj(), "notifyNotional", [bH, eU], nil)
1286- if ((hS == hS))
1287- then ((((((gA(bH, eS, hI, eU, hJ, hK) ++ gw(hx, bH, bI)) ++ gz(hx, bH, bI, fQ)) ++ gG(cs, ct, eE, hL, hM, hN, hE, hF)) ++ gS(gb)) ++ gR(((aR() + gP) - cJ))) ++ gT(fR, by))
1288- else throw("Strict value is not equal to itself.")
1289- }
1655+ let ib = invoke(ak(), "notifyNotional", [bO, fb], nil)
1656+ if ((ib == ib))
1657+ then ((((if (iu)
1658+ then gI(bO, eZ, fi, fb, fc, bD())
1659+ else gV(bO, bP)) ++ gO(cz, cA, eL, hU, hV, hW, hN, hO)) ++ gW(bF.caller, iA)) ++ gZ(iB))
12901660 else throw("Strict value is not equal to itself.")
12911661 }
12921662 else throw("Strict value is not equal to itself.")
12931663 }
12941664 else throw("Strict value is not equal to itself.")
12951665 }
12961666 else throw("Strict value is not equal to itself.")
12971667 }
12981668 }
12991669 else throw("Strict value is not equal to itself.")
13001670 }
13011671 else throw("Strict value is not equal to itself.")
13021672 }
13031673
13041674
13051675
1306-@Callable(by)
1307-func addMargin (bI) = {
1308- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1309- if ((hl == hl))
1676+@Callable(bF)
1677+func payFunding (hs) = {
1678+ let ht = invoke(this, "updateOracle", [hs], nil)
1679+ if ((ht == ht))
13101680 then {
1311- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1312- if ((hm == hm))
1681+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1682+ if ((hu == hu))
13131683 then {
1314- let bH = toString(by.caller)
1315- let gP = by.payments[0].amount
1316- let ho = by.payments[0].assetId
1317- let hp = toBase58String(value(ho))
1318- let hq = (ho == ag())
1319- if (if (if (if (if (!(hq))
1684+ let iD = bj()
1685+ if (if (if ((iD > bD()))
13201686 then true
1321- else !(bR(toString(by.caller), bI)))
1687+ else !(ch()))
13221688 then true
1323- else !(ca()))
1324- then true
1325- else cb())
1326- then true
1327- else dr())
1328- then throw("Invalid addMargin parameters")
1689+ else ci())
1690+ then throw(((("Invalid funding block timestamp: " + toString(bD())) + " < ") + toString(iD)))
13291691 else {
1330- let hT = bG(bH, bI)
1331- let eu = hT._1
1332- let ev = hT._2
1333- let ew = hT._3
1334- let ex = hT._4
1335- let ey = hT._5
1336- let hP = invoke(ai(), "addLocked", nil, [AttachedPayment(ag(), gP)])
1337- if ((hP == hP))
1692+ let fH = ds()
1693+ let iE = fG()
1694+ let fK = iE._1
1695+ let fL = iE._2
1696+ let fO = iE._3
1697+ let iF = if ((fO > 0))
13381698 then {
1339- let cJ = cF(ev, ey)
1340- let hU = if ((cJ > 0))
1341- then {
1342- let hV = fZ(cJ)
1343- let gb = hV._1
1344- let gc = hV._2
1345- let hW = invoke(ai(), "withdrawLocked", [gb], nil)
1346- if ((hW == hW))
1347- then {
1348- let hX = invoke(ai(), "exchangeFreeAndLocked", [-(gc)], nil)
1349- if ((hX == hX))
1350- then gS(gb)
1351- else throw("Strict value is not equal to itself.")
1352- }
1353- else throw("Strict value is not equal to itself.")
1354- }
1355- else nil
1356- if ((hU == hU))
1357- then ((gA(bH, eu, ((ev - cJ) + gP), ew, ex, bw()) ++ gR(((aR() + gP) - cJ))) ++ hU)
1699+ let iF = invoke(aj(), "exchangeFreeAndLocked", [-(fO)], nil)
1700+ if ((iF == iF))
1701+ then nil
13581702 else throw("Strict value is not equal to itself.")
13591703 }
1704+ else nil
1705+ if ((iF == iF))
1706+ then gy((iD + bm()), (bu() + fL), (bv() + fK), aG(fL, fH), aG(fK, fH))
13601707 else throw("Strict value is not equal to itself.")
13611708 }
13621709 }
13631710 else throw("Strict value is not equal to itself.")
13641711 }
13651712 else throw("Strict value is not equal to itself.")
13661713 }
13671714
13681715
13691716
1370-@Callable(by)
1371-func removeMargin (gP,bI) = {
1372- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1717+@Callable(bF)
1718+func updateOracle (hs) = if ((bC() == aC))
1719+ then nil
1720+ else {
1721+ let iG = split_4C(hs, "::")
1722+ let dt = valueOrErrorMessage(bZ(a), "No base asset oracle data")
1723+ let iH = dt._1
1724+ let iI = invoke(iH, "updateData", [iG[0]], nil)
1725+ if ((iI == iI))
1726+ then {
1727+ let dv = bZ(b)
1728+ let iJ = if (isDefined(dv))
1729+ then {
1730+ let dx = value(dv)
1731+ let iK = dx._1
1732+ let iJ = invoke(iK, "updateData", [iG[1]], nil)
1733+ if ((iJ == iJ))
1734+ then nil
1735+ else throw("Strict value is not equal to itself.")
1736+ }
1737+ else nil
1738+ if ((iJ == iJ))
1739+ then nil
1740+ else throw("Strict value is not equal to itself.")
1741+ }
1742+ else throw("Strict value is not equal to itself.")
1743+ }
1744+
1745+
1746+
1747+@Callable(bF)
1748+func syncTerminalPriceToOracle () = {
1749+ let cr = aZ()
1750+ let cs = bb()
1751+ let iL = fB(ds(), cr, cs)
1752+ let hj = iL._1
1753+ let hk = iL._2
1754+ let fF = iL._3
1755+ let iM = if (if ((0 > fF))
1756+ then (aL(fF) > aU())
1757+ else false)
1758+ then -(aU())
1759+ else fF
1760+ let hl = if ((iM != 0))
1761+ then {
1762+ let hl = invoke(aj(), "exchangeFreeAndLocked", [iM], nil)
1763+ if ((hl == hl))
1764+ then nil
1765+ else throw("Strict value is not equal to itself.")
1766+ }
1767+ else nil
13731768 if ((hl == hl))
1769+ then (gZ((aU() + iM)) ++ gN(hj, hk))
1770+ else throw("Strict value is not equal to itself.")
1771+ }
1772+
1773+
1774+
1775+@Callable(bF)
1776+func ensureCalledOnce () = if ((bF.caller != this))
1777+ then throw("Invalid saveCurrentTxId parameters")
1778+ else {
1779+ let iN = toBase58String(bF.transactionId)
1780+ let iO = valueOrElse(getString(this, S), "")
1781+ if ((iO != iN))
1782+ then [StringEntry(S, iN)]
1783+ else throw("Can not call vAMM methods twice in one tx")
1784+ }
1785+
1786+
1787+
1788+@Callable(bF)
1789+func migratePosition (bO) = {
1790+ let bR = getInteger(this, ac(e, bO))
1791+ if (if (isDefined(bR))
1792+ then isDefined(addressFromString(bO))
1793+ else false)
13741794 then {
1375- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1376- if ((hm == hm))
1795+ let iP = getIntegerValue(this, ac(e, bO))
1796+ let iQ = getIntegerValue(this, ac(f, bO))
1797+ let iR = getIntegerValue(this, ac(g, bO))
1798+ let iS = getIntegerValue(this, ac(h, bO))
1799+ let iT = valueOrElse(getInteger(this, ac(k, bO)), lastBlock.timestamp)
1800+ let iU = valueOrElse(getInteger(this, ac(j, bO)), aW())
1801+ let iV = getIntegerValue(this, ac(i, bO))
1802+ let iW = bU(iP)
1803+ let bQ = ((bO + "_") + toString(iW))
1804+[DeleteEntry(ac(e, bO)), DeleteEntry(ac(f, bO)), DeleteEntry(ac(g, bO)), DeleteEntry(ac(h, bO)), DeleteEntry(ac(k, bO)), DeleteEntry(ac(j, bO)), DeleteEntry(ac(i, bO)), IntegerEntry(ac(e, bQ), iP), IntegerEntry(ac(f, bQ), iQ), IntegerEntry(ac(g, bQ), iR), IntegerEntry(ac(h, bQ), iS), IntegerEntry(ac(k, bQ), iT), IntegerEntry(ac(j, bQ), iU), IntegerEntry(ac(i, bQ), iV)]
1805+ }
1806+ else throw(("Nothing to migrate for " + bO))
1807+ }
1808+
1809+
1810+
1811+@Callable(bF)
1812+func view_calcRemainMarginWithFundingPayment (bO,bP,hs) = {
1813+ let ht = invoke(this, "updateOracle", [hs], nil)
1814+ if ((ht == ht))
1815+ then {
1816+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1817+ if ((hu == hu))
13771818 then {
1378- let bH = toString(by.caller)
1379- if (if (if (if (if ((0 >= gP))
1380- then true
1381- else !(bR(bH, bI)))
1382- then true
1383- else !(ca()))
1384- then true
1385- else cb())
1386- then true
1387- else dr())
1388- then throw("Invalid removeMargin parameters")
1389- else {
1390- let hY = bG(bH, bI)
1391- let eu = hY._1
1392- let ev = hY._2
1393- let ew = hY._3
1394- let ex = hY._4
1395- let ey = hY._5
1396- let hZ = cK(eu, ev, ex, ey, -(gP))
1397- let cS = hZ._1
1398- let cT = hZ._2
1399- let cO = hZ._3
1400- let cJ = hZ._4
1401- if ((cT != 0))
1402- then throw("Invalid removed margin amount")
1403- else {
1404- let eX = dW(cS, cT, ew)
1405- if (!(bz(eX, aU(), true)))
1406- then throw(((("Too much margin removed: " + toString(eX)) + " < ") + toString(aU())))
1407- else {
1408- let ia = fZ(cJ)
1409- let gb = ia._1
1410- let gc = ia._2
1411- let hU = if ((cJ > 0))
1412- then {
1413- let hX = invoke(ai(), "exchangeFreeAndLocked", [-(gc)], nil)
1414- if ((hX == hX))
1415- then gS(gb)
1416- else throw("Strict value is not equal to itself.")
1417- }
1418- else nil
1419- if ((hU == hU))
1420- then {
1421- let hW = invoke(ai(), "withdrawLocked", [(gP + gb)], nil)
1422- if ((hW == hW))
1423- then (((gA(bH, eu, cS, ew, bE(eu), bw()) ++ gO(by.caller, gP)) ++ gR(((aR() - gP) - cJ))) ++ hU)
1424- else throw("Strict value is not equal to itself.")
1425- }
1426- else throw("Strict value is not equal to itself.")
1427- }
1428- }
1429- }
1819+ let iX = bN(bO, bP)
1820+ let bT = iX._1
1821+ let ea = iX._2
1822+ let ej = iX._3
1823+ let ec = iX._4
1824+ let el = iX._5
1825+ let iY = dY(bO, bP, ay)
1826+ let dT = iY._1
1827+ let dX = iY._2
1828+ let iZ = cR(bT, ea, ec, el, dX)
1829+ let cZ = iZ._1
1830+ let da = iZ._2
1831+ let cV = iZ._3
1832+ let cQ = iZ._4
1833+ throw(((((((aE(cZ) + aE(cV)) + aE(eo(bO, bP))) + aE(dX)) + aE(da)) + aE(dT)) + aE(cQ)))
14301834 }
14311835 else throw("Strict value is not equal to itself.")
14321836 }
14331837 else throw("Strict value is not equal to itself.")
14341838 }
14351839
14361840
14371841
1438-@Callable(by)
1439-func closePosition (eo,bI,eq,er) = {
1440- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1441- if ((hl == hl))
1842+@Callable(bF)
1843+func view_getPegAdjustCost (ja) = {
1844+ let cr = aZ()
1845+ let cs = bb()
1846+ let fA = fB(ja, cr, cs)
1847+ throw(toString(fA._3))
1848+ }
1849+
1850+
1851+
1852+@Callable(bF)
1853+func view_getTerminalAmmPrice () = {
1854+ let jb = fj()
1855+ let fn = jb._1
1856+ let fo = jb._2
1857+ let he = aG(aI(fn, bd()), aI(fo, be()))
1858+ throw(toString(he))
1859+ }
1860+
1861+
1862+
1863+@Callable(bF)
1864+func view_getFunding (hs) = {
1865+ let ht = invoke(this, "updateOracle", [hs], nil)
1866+ if ((ht == ht))
14421867 then {
1443- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1444- if ((hm == hm))
1868+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1869+ if ((hu == hu))
14451870 then {
1446- let bH = bx(by)
1447- let ib = valueOrErrorMessage(addressFromString(bH), "Invalid caller")
1448- let bQ = bO(bH, bI)
1449- if (if (if (if (if (if (!(bR(bH, bI)))
1450- then true
1451- else !(ca()))
1452- then true
1453- else cb())
1454- then true
1455- else (0 >= eo))
1456- then true
1457- else (0 > eq))
1458- then true
1459- else dr())
1460- then throw("Invalid closePosition parameters")
1461- else {
1462- let ey = bG(bH, bI)._5
1463- let ic = en(bH, bI, eo, bQ, eq, er, true, true)
1464- let eS = ic._1
1465- let fb = ic._2
1466- let eU = ic._3
1467- let eV = ic._4
1468- let eO = ic._5
1469- let eJ = ic._6
1470- let fa = ic._7
1471- let cs = ic._8
1472- let ct = ic._9
1473- let eE = ic._10
1474- let hL = ic._11
1475- let hM = ic._12
1476- let hN = ic._13
1477- let hE = ic._14
1478- let hF = ic._15
1479- let id = ic._16
1480- if ((eO > 0))
1481- then throw("Invalid closePosition parameters: bad debt")
1482- else if ((ey >= bw()))
1483- then throw("Invalid closePosition parameters: wait at least 1 block before closing the position")
1484- else {
1485- let eB = (eS != 0)
1486- let ie = (fa + id)
1487- let if = (aR() - ie)
1488- let ig = if ((0 > if))
1489- then 0
1490- else if
1491- let hW = invoke(ai(), "withdrawLocked", [ie], nil)
1492- if ((hW == hW))
1493- then {
1494- let ht = invoke(al(), "acceptPayment", [bH], [AttachedPayment(ag(), id)])
1495- if ((ht == ht))
1496- then {
1497- let hu = {
1498- let bL = ht
1499- if ($isInstanceOf(bL, "Int"))
1500- then {
1501- let fV = bL
1502- fV
1503- }
1504- else throw("Invalid referrerFee")
1505- }
1506- let ih = fZ((id - hu))
1507- let gb = ih._1
1508- let gc = ih._2
1509- let hQ = invoke(ai(), "addFree", nil, [AttachedPayment(ag(), gc)])
1510- if ((hQ == hQ))
1511- then {
1512- let hR = invoke(aj(), "notifyFees", [bH, id], nil)
1513- if ((hR == hR))
1514- then {
1515- let hS = invoke(aj(), "notifyNotional", [bH, eU], nil)
1516- if ((hS == hS))
1517- then (((((if (eB)
1518- then gA(bH, eS, fb, eU, eV, bw())
1519- else gN(bH, bI)) ++ gG(cs, ct, eE, hL, hM, hN, hE, hF)) ++ (if ((fa > 0))
1520- then gO(ib, fa)
1521- else nil)) ++ gR(ig)) ++ gS(gb))
1522- else throw("Strict value is not equal to itself.")
1523- }
1524- else throw("Strict value is not equal to itself.")
1525- }
1526- else throw("Strict value is not equal to itself.")
1527- }
1528- else throw("Strict value is not equal to itself.")
1529- }
1530- else throw("Strict value is not equal to itself.")
1531- }
1532- }
1871+ let fH = ds()
1872+ let jc = fG()
1873+ let fK = jc._1
1874+ let fL = jc._2
1875+ let fO = jc._3
1876+ let jd = aG(fL, fH)
1877+ let je = aG(fK, fH)
1878+ throw(((((aE(jd) + aE(je)) + aE(dM())) + aE(ds())) + aE(fO)))
15331879 }
15341880 else throw("Strict value is not equal to itself.")
15351881 }
15361882 else throw("Strict value is not equal to itself.")
15371883 }
15381884
15391885
15401886
1541-@Callable(by)
1542-func liquidate (bH,bI) = {
1543- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1544- if ((hl == hl))
1887+@Callable(bF)
1888+func computeSpotPrice () = {
1889+ let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1890+ if ((hu == hu))
15451891 then {
1546- let ii = ea(bH, bI, ax)
1547- let ij = if (dG())
1548- then {
1549- let ik = ea(bH, bI, ay)
1550- aJ(ii, ik)
1551- }
1552- else ii
1553- if (if (if (if (if (!(bz(ij, bh(), false)))
1554- then true
1555- else !(bR(bH, bI)))
1556- then true
1557- else !(ca()))
1558- then true
1559- else cb())
1560- then true
1561- else dr())
1562- then throw("Unable to liquidate")
1563- else {
1564- let il = if (if ((ii > bi()))
1565- then (bj() > 0)
1566- else false)
1567- then (au > bj())
1568- else false
1569- let eu = bG(bH, bI)._1
1570- let dK = aI(eu)
1571- let im = if (il)
1572- then {
1573- let in = ei(bH, eu)
1574- let io = aD(aI(in), dK)
1575- $Tuple2(io, aI(in))
1576- }
1577- else $Tuple2(0, dK)
1578- let io = im._1
1579- let in = im._2
1580- let ip = en(bH, bI, if (il)
1581- then in
1582- else dK, bi(), 0, true, false, true)
1583- let eS = ip._1
1584- let fb = ip._2
1585- let eU = ip._3
1586- let eV = ip._4
1587- let eO = ip._5
1588- let eJ = ip._6
1589- let fa = ip._7
1590- let cs = ip._8
1591- let ct = ip._9
1592- let eE = ip._10
1593- let hL = ip._11
1594- let hM = ip._12
1595- let hN = ip._13
1596- let hE = ip._14
1597- let hF = ip._15
1598- let iq = ip._16
1599- let ir = (iq / 2)
1600- let gc = (iq - ir)
1601- let if = (aR() - iq)
1602- let is = if ((0 > if))
1603- then 0
1604- else if
1605- let hX = if ((eO > 0))
1606- then {
1607- let hX = invoke(ai(), "exchangeFreeAndLocked", [(eO + iq)], nil)
1608- if ((hX == hX))
1609- then nil
1610- else throw("Strict value is not equal to itself.")
1611- }
1612- else nil
1613- if ((hX == hX))
1614- then {
1615- let hW = invoke(ai(), "withdrawLocked", [iq], nil)
1616- if ((hW == hW))
1617- then {
1618- let it = invoke(ai(), "addFree", nil, [AttachedPayment(ag(), gc)])
1619- if ((it == it))
1620- then {
1621- let hS = invoke(aj(), "notifyNotional", [bH, eU], nil)
1622- if ((hS == hS))
1623- then ((((if (il)
1624- then gA(bH, eS, fb, eU, eV, bw())
1625- else gN(bH, bI)) ++ gG(cs, ct, eE, hL, hM, hN, hE, hF)) ++ gO(by.caller, ir)) ++ gR(is))
1626- else throw("Strict value is not equal to itself.")
1627- }
1628- else throw("Strict value is not equal to itself.")
1629- }
1630- else throw("Strict value is not equal to itself.")
1631- }
1632- else throw("Strict value is not equal to itself.")
1633- }
1892+ let fA = dM()
1893+ $Tuple2(nil, fA)
16341894 }
16351895 else throw("Strict value is not equal to itself.")
16361896 }
16371897
16381898
16391899
1640-@Callable(by)
1641-func payFunding () = {
1642- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1643- if ((hl == hl))
1644- then {
1645- let iu = bd()
1646- if (if (if ((iu > bw()))
1647- then true
1648- else !(ca()))
1649- then true
1650- else cb())
1651- then throw(((("Invalid funding block timestamp: " + toString(bw())) + " < ") + toString(iu)))
1652- else {
1653- let fA = dl()
1654- let iv = fz()
1655- let fD = iv._1
1656- let fE = iv._2
1657- let fH = iv._3
1658- let iw = if ((fH > 0))
1659- then {
1660- let iw = invoke(ai(), "exchangeFreeAndLocked", [-(fH)], nil)
1661- if ((iw == iw))
1662- then nil
1663- else throw("Strict value is not equal to itself.")
1664- }
1665- else nil
1666- if ((iw == iw))
1667- then gq((iu + bg()), (bo() + fE), (bp() + fD), aD(fE, fA), aD(fD, fA))
1668- else throw("Strict value is not equal to itself.")
1669- }
1670- }
1671- else throw("Strict value is not equal to itself.")
1900+@Callable(bF)
1901+func computeFeeForTraderWithArtifact (bO,fQ) = {
1902+ let fA = fZ(bO, fQ)
1903+ $Tuple2(nil, fA)
16721904 }
16731905
16741906
1675-
1676-@Callable(by)
1677-func syncTerminalPriceToOracle () = {
1678- let ck = aV()
1679- let cl = aW()
1680- let ix = fu(dl(), ck, cl)
1681- let ha = ix._1
1682- let hb = ix._2
1683- let fy = ix._3
1684- let iy = if (if ((0 > fy))
1685- then (aI(fy) > aR())
1686- else false)
1687- then -(aR())
1688- else fy
1689- let hc = if ((iy != 0))
1907+@Verifier(jf)
1908+func jg () = {
1909+ let jh = getString(this, T)
1910+ if (isDefined(jh))
16901911 then {
1691- let hc = invoke(ai(), "exchangeFreeAndLocked", [iy], nil)
1692- if ((hc == hc))
1693- then nil
1694- else throw("Strict value is not equal to itself.")
1695- }
1696- else nil
1697- if ((hc == hc))
1698- then (gR((aR() + iy)) ++ gF(ha, hb))
1699- else throw("Strict value is not equal to itself.")
1700- }
1701-
1702-
1703-
1704-@Callable(by)
1705-func ensureCalledOnce () = if ((by.caller != this))
1706- then throw("Invalid saveCurrentTxId parameters")
1707- else {
1708- let iz = toBase58String(by.transactionId)
1709- let iA = valueOrElse(getString(this, R), "")
1710- if ((iA != iz))
1711- then [StringEntry(R, iz)]
1712- else throw("Can not call vAMM methods twice in one tx")
1713- }
1714-
1715-
1716-
1717-@Callable(by)
1718-func migratePosition (bH) = {
1719- let bK = getInteger(this, ab(e, bH))
1720- if (if (isDefined(bK))
1721- then isDefined(addressFromString(bH))
1722- else false)
1723- then {
1724- let iB = getIntegerValue(this, ab(e, bH))
1725- let iC = getIntegerValue(this, ab(f, bH))
1726- let iD = getIntegerValue(this, ab(g, bH))
1727- let iE = getIntegerValue(this, ab(h, bH))
1728- let iF = valueOrElse(getInteger(this, ab(k, bH)), lastBlock.timestamp)
1729- let iG = valueOrElse(getInteger(this, ab(j, bH)), aS())
1730- let iH = getIntegerValue(this, ab(i, bH))
1731- let iI = bN(iB)
1732- let bJ = ((bH + "_") + toString(iI))
1733-[DeleteEntry(ab(e, bH)), DeleteEntry(ab(f, bH)), DeleteEntry(ab(g, bH)), DeleteEntry(ab(h, bH)), DeleteEntry(ab(k, bH)), DeleteEntry(ab(j, bH)), DeleteEntry(ab(i, bH)), IntegerEntry(ab(e, bJ), iB), IntegerEntry(ab(f, bJ), iC), IntegerEntry(ab(g, bJ), iD), IntegerEntry(ab(h, bJ), iE), IntegerEntry(ab(k, bJ), iF), IntegerEntry(ab(j, bJ), iG), IntegerEntry(ab(i, bJ), iH)]
1734- }
1735- else throw(("Nothing to migrate for " + bH))
1736- }
1737-
1738-
1739-
1740-@Callable(by)
1741-func view_calcRemainMarginWithFundingPayment (bH,bI) = {
1742- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1743- if ((hl == hl))
1744- then {
1745- let iJ = bG(bH, bI)
1746- let bM = iJ._1
1747- let dT = iJ._2
1748- let ec = iJ._3
1749- let dV = iJ._4
1750- let ee = iJ._5
1751- let iK = dR(bH, bI, ax)
1752- let dM = iK._1
1753- let dQ = iK._2
1754- let iL = cK(bM, dT, dV, ee, dQ)
1755- let cS = iL._1
1756- let cT = iL._2
1757- let cO = iL._3
1758- let cJ = iL._4
1759- throw(((((((aB(cS) + aB(cO)) + aB(eh(bH, bI))) + aB(dQ)) + aB(cT)) + aB(dM)) + aB(cJ)))
1760- }
1761- else throw("Strict value is not equal to itself.")
1762- }
1763-
1764-
1765-
1766-@Callable(by)
1767-func view_getPegAdjustCost (iM) = {
1768- let ck = aV()
1769- let cl = aW()
1770- let ft = fu(iM, ck, cl)
1771- throw(toString(ft._3))
1772- }
1773-
1774-
1775-
1776-@Callable(by)
1777-func view_getTerminalAmmPrice () = {
1778- let iN = fc()
1779- let fg = iN._1
1780- let fh = iN._2
1781- let gV = aD(aF(fg, aX()), aF(fh, aY()))
1782- throw(toString(gV))
1783- }
1784-
1785-
1786-
1787-@Callable(by)
1788-func view_getFunding () = {
1789- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1790- if ((hl == hl))
1791- then {
1792- let fA = dl()
1793- let iO = fz()
1794- let fD = iO._1
1795- let fE = iO._2
1796- let fH = iO._3
1797- let iP = aD(fE, fA)
1798- let iQ = aD(fD, fA)
1799- throw(((((aB(iP) + aB(iQ)) + aB(dF())) + aB(dl())) + aB(fH)))
1800- }
1801- else throw("Strict value is not equal to itself.")
1802- }
1803-
1804-
1805-
1806-@Callable(by)
1807-func computeSpotPrice () = {
1808- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1809- if ((hl == hl))
1810- then {
1811- let ft = dF()
1812- $Tuple2(nil, ft)
1813- }
1814- else throw("Strict value is not equal to itself.")
1815- }
1816-
1817-
1818-
1819-@Callable(by)
1820-func computeFeeForTraderWithArtifact (bH,fJ) = {
1821- let ft = fS(bH, fJ)
1822- $Tuple2(nil, ft)
1823- }
1824-
1825-
1826-@Verifier(iR)
1827-func iS () = {
1828- let iT = getString(this, S)
1829- if (isDefined(iT))
1830- then {
1831- let iU = getString(addressFromStringValue(value(iT)), U)
1832- if (isDefined(iU))
1833- then valueOrElse(getBoolean(addressFromStringValue(value(iU)), ((("status_" + toString(this)) + "_") + toBase58String(iR.id))), false)
1912+ let ji = getString(addressFromStringValue(value(jh)), V)
1913+ if (isDefined(ji))
1914+ then valueOrElse(getBoolean(addressFromStringValue(value(ji)), ((("status_" + toString(this)) + "_") + toBase58String(jf.id))), false)
18341915 else throw("unable to verify: admin not set in coordinator")
18351916 }
1836- else sigVerify(iR.bodyBytes, iR.proofs[0], iR.senderPublicKey)
1917+ else sigVerify(jf.bodyBytes, jf.proofs[0], jf.senderPublicKey)
18371918 }
18381919

github/deemru/w8io/169f3d6 
524.29 ms