tx · 2c6nJi8NRe97M7uKWfFQ8A4XRDex2irxTKuNsfYGypdM

3P1yXUDpcdzn5n8wM7wzKw4doq5bEG7mzZe:  -0.06000000 Waves

2022.09.21 19:22 [3304565] smart account 3P1yXUDpcdzn5n8wM7wzKw4doq5bEG7mzZe > SELF 0.00000000 Waves

{ "type": 13, "id": "2c6nJi8NRe97M7uKWfFQ8A4XRDex2irxTKuNsfYGypdM", "fee": 6000000, "feeAssetId": null, "timestamp": 1663777358646, "version": 2, "chainId": 87, "sender": "3P1yXUDpcdzn5n8wM7wzKw4doq5bEG7mzZe", "senderPublicKey": "F3pgDgcYDHJb44QALdjXkPSh9ppw8rCptjfVvMBTGbcE", "proofs": [ "4QWEzfWtcuV2cNMJqdJUh6jAbXPiXE5o8pdSijwK1tzcAfiJ3wBToRaoB9CHy2QNdELqzWVGqaitVn6DRL9k3j9M" ], "script": "base64:BgJvCAISABIAEgMKAQESAwoBARILCgkBAQEBAQEBAQESEAoOAQEBAQEBAQgICAEBAQESAwoBARIFCgMBAQESBgoEAQEBCBIAEgMKAQESABIDCgEIEgASBAoCCAESAwoBARIDCgEIEgMKAQgSAwoBARIAiAEACWtfb3JhX2tleQIJa19vcmFfa2V5AA9rX29yYV9ibG9ja19rZXkCD2tfb3JhX2Jsb2NrX2tleQAFa19vcmECBWtfb3JhAAlrX2JhbGFuY2UCCWtfYmFsYW5jZQAOa19wb3NpdGlvblNpemUCDmtfcG9zaXRpb25TaXplABBrX3Bvc2l0aW9uTWFyZ2luAhBrX3Bvc2l0aW9uTWFyZ2luABZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsAhZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsAC5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAhJrX3Bvc2l0aW9uRnJhY3Rpb24AFGtfcG9zaXRpb25DbG9zZWREYXRlAhRrX3Bvc2l0aW9uQ2xvc2VkRGF0ZQANa19pbml0aWFsaXplZAINa19pbml0aWFsaXplZAAIa19wYXVzZWQCCGtfcGF1c2VkAAVrX2ZlZQIFa19mZWUAD2tfZnVuZGluZ1BlcmlvZAIPa19mdW5kaW5nUGVyaW9kABFrX2luaXRNYXJnaW5SYXRpbwIRa19pbml0TWFyZ2luUmF0aW8AGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwIFa19tbXIAFWtfbGlxdWlkYXRpb25GZWVSYXRpbwIVa19saXF1aWRhdGlvbkZlZVJhdGlvABlrX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAhZrX3BhcnRMaXF1aWRhdGlvblJhdGlvAA1rX3NwcmVhZExpbWl0Ag1rX3NwcmVhZExpbWl0ABBrX21heFByaWNlSW1wYWN0AhBrX21heFByaWNlSW1wYWN0ABBrX21heFByaWNlU3ByZWFkAhBrX21heFByaWNlU3ByZWFkAA1rX2xhc3REYXRhU3RyAg1rX2xhc3REYXRhU3RyAA5rX2xhc3RNaW51dGVJZAIOa19sYXN0TWludXRlSWQAHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlAh1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQATa190d2FwRGF0YUxhc3RQcmljZQITa190d2FwRGF0YUxhc3RQcmljZQAaa190d2FwRGF0YVByZXZpb3VzTWludXRlSWQCGmtfdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkACVrX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAhtrX2xhdGVzdExvbmdQcmVtaXVtRnJhY3Rpb24AJmtfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAhxrX2xhdGVzdFNob3J0UHJlbWl1bUZyYWN0aW9uABJrX25leHRGdW5kaW5nQmxvY2sCHmtfbmV4dEZ1bmRpbmdCbG9ja01pblRpbWVzdGFtcAARa19sb25nRnVuZGluZ1JhdGUCEWtfbG9uZ0Z1bmRpbmdSYXRlABJrX3Nob3J0RnVuZGluZ1JhdGUCEmtfc2hvcnRGdW5kaW5nUmF0ZQATa19xdW90ZUFzc2V0UmVzZXJ2ZQIIa19xdEFzdFIAEmtfYmFzZUFzc2V0UmVzZXJ2ZQIIa19ic0FzdFIAE2tfdG90YWxQb3NpdGlvblNpemUCE2tfdG90YWxQb3NpdGlvblNpemUAF2tfdG90YWxMb25nUG9zaXRpb25TaXplAhdrX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAYa190b3RhbFNob3J0UG9zaXRpb25TaXplAhhrX3RvdGFsU2hvcnRQb3NpdGlvblNpemUAFGtfY3VtdWxhdGl2ZU5vdGlvbmFsAhRrX2N1bXVsYXRpdmVOb3Rpb25hbAAWa19vcGVuSW50ZXJlc3ROb3Rpb25hbAIWa19vcGVuSW50ZXJlc3ROb3Rpb25hbAAUa19jb29yZGluYXRvckFkZHJlc3MCFGtfY29vcmRpbmF0b3JBZGRyZXNzABNrX2luc3VyYW5jZV9hZGRyZXNzAhNrX2luc3VyYW5jZV9hZGRyZXNzAA9rX2FkbWluX2FkZHJlc3MCD2tfYWRtaW5fYWRkcmVzcwASa19hZG1pbl9wdWJsaWNfa2V5AhJrX2FkbWluX3B1YmxpY19rZXkADWtfcXVvdGVfYXNzZXQCDWtfcXVvdGVfYXNzZXQAD2tfcXVvdGVfc3Rha2luZwIPa19xdW90ZV9zdGFraW5nABFrX3N0YWtpbmdfYWRkcmVzcwIRa19zdGFraW5nX2FkZHJlc3MAD2tfbWluZXJfYWRkcmVzcwIPa19taW5lcl9hZGRyZXNzABBrX29yZGVyc19hZGRyZXNzAhBrX29yZGVyc19hZGRyZXNzABJrX3JlZmVycmFsX2FkZHJlc3MCEmtfcmVmZXJyYWxfYWRkcmVzcwELY29vcmRpbmF0b3IACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUUa19jb29yZGluYXRvckFkZHJlc3MCE0Nvb3JkaW5hdG9yIG5vdCBzZXQBDGFkbWluQWRkcmVzcwAJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUPa19hZG1pbl9hZGRyZXNzAQ5hZG1pblB1YmxpY0tleQAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUSa19hZG1pbl9wdWJsaWNfa2V5AQpxdW90ZUFzc2V0AAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABQ1rX3F1b3RlX2Fzc2V0ARFxdW90ZUFzc2V0U3Rha2luZwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABQ9rX3F1b3RlX3N0YWtpbmcCG1F1b3RlIGFzc2V0IHN0YWtpbmcgbm90IHNldAEOc3Rha2luZ0FkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAURa19zdGFraW5nX2FkZHJlc3MCD1N0YWtpbmcgbm90IHNldAEQaW5zdXJhbmNlQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRNrX2luc3VyYW5jZV9hZGRyZXNzAhFJbnN1cmFuY2Ugbm90IHNldAEMbWluZXJBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfbWluZXJfYWRkcmVzcwINTWluZXIgbm90IHNldAENb3JkZXJzQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRBrX29yZGVyc19hZGRyZXNzAg5PcmRlcnMgbm90IHNldAEPcmVmZXJyYWxBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEmtfcmVmZXJyYWxfYWRkcmVzcwIQUmVmZXJyYWwgbm90IHNldAAIRElSX0xPTkcAAQAJRElSX1NIT1JUAAIADVRXQVBfSU5URVJWQUwADwAPT1JBQ0xFX0lOVEVSVkFMAA8AB1NFQ09ORFMA6AcADERFQ0lNQUxfVU5JVAkAaAIAAQkAaAIJAGgCCQBoAgkAaAIJAGgCAAoACgAKAAoACgAKAAdPTkVfREFZCQBoAgCAowUFDERFQ0lNQUxfVU5JVAAIQUxMX0ZFRVMAZAAPUE5MX09QVElPTl9TUE9UAAEAEVBOTF9PUFRJT05fT1JBQ0xFAAIBAXMBAl94CQCsAgIJAKQDAQUCX3gCASwBBGRpdmQCAl94Al95CQBuBAUCX3gFDERFQ0lNQUxfVU5JVAUCX3kFCEhBTEZFVkVOAQRtdWxkAgJfeAJfeQkAbgQFAl94BQJfeQUMREVDSU1BTF9VTklUBQhIQUxGRVZFTgEDYWJzAQJfeAMJAGYCBQJfeAAABQJfeAkBAS0BBQJfeAEEdm1heAICX3gCX3kDCQBnAgUCX3gFAl95BQJfeAUCX3kBDnRvQ29tcG9zaXRlS2V5AgRfa2V5CF9hZGRyZXNzCQCsAgIJAKwCAgUEX2tleQIBXwUIX2FkZHJlc3MBCWxpc3RUb1N0cgEFX2xpc3QKAQVfam9pbgILYWNjdW11bGF0b3IDdmFsCQCsAgIJAKwCAgULYWNjdW11bGF0b3IFA3ZhbAIBLAQKbmV3TGlzdFN0cgoAAiRsBQVfbGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFX2pvaW4CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQLbmV3TGlzdFN0clUJALMCAgUKbmV3TGlzdFN0cgABBAtuZXdMaXN0U3RyUgMJAAACCQCvAgIFC25ld0xpc3RTdHJVAAECASwJALACAgULbmV3TGlzdFN0clUAAQULbmV3TGlzdFN0clUFC25ld0xpc3RTdHJSAQlzdHJUb0xpc3QBBF9zdHIJALUJAgUEX3N0cgIBLAELcHVzaFRvUXVldWUDBV9saXN0CF9tYXhTaXplBl92YWx1ZQMJAGYCCQCQAwEFBV9saXN0BQhfbWF4U2l6ZQkAzQgCCQDRCAIFBV9saXN0AAAFBl92YWx1ZQkAzQgCBQVfbGlzdAUGX3ZhbHVlAQNpbnQBAWsJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQFrCQCsAgICDW5vIHZhbHVlIGZvciAFAWsBCGNiYWxhbmNlAAkBA2ludAEFCWtfYmFsYW5jZQEDZmVlAAkBA2ludAEFBWtfZmVlAQ9pbml0TWFyZ2luUmF0aW8ACQEDaW50AQURa19pbml0TWFyZ2luUmF0aW8BBnF0QXN0UgAJAQNpbnQBBRNrX3F1b3RlQXNzZXRSZXNlcnZlAQZic0FzdFIACQEDaW50AQUSa19iYXNlQXNzZXRSZXNlcnZlARF0b3RhbFBvc2l0aW9uU2l6ZQAJAQNpbnQBBRNrX3RvdGFsUG9zaXRpb25TaXplARJjdW11bGF0aXZlTm90aW9uYWwACQEDaW50AQUUa19jdW11bGF0aXZlTm90aW9uYWwBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAkBA2ludAEFFmtfb3BlbkludGVyZXN0Tm90aW9uYWwBGW5leHRGdW5kaW5nQmxvY2tUaW1lc3RhbXAACQEDaW50AQUSa19uZXh0RnVuZGluZ0Jsb2NrARBmdW5kaW5nUGVyaW9kUmF3AAkBA2ludAEFD2tfZnVuZGluZ1BlcmlvZAEUZnVuZGluZ1BlcmlvZERlY2ltYWwACQBoAgkBEGZ1bmRpbmdQZXJpb2RSYXcABQxERUNJTUFMX1VOSVQBFGZ1bmRpbmdQZXJpb2RTZWNvbmRzAAkAaAIJARBmdW5kaW5nUGVyaW9kUmF3AAUHU0VDT05EUwEWbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwAJAQNpbnQBBRhrX21haW50ZW5hbmNlTWFyZ2luUmF0aW8BE2xpcXVpZGF0aW9uRmVlUmF0aW8ACQEDaW50AQUVa19saXF1aWRhdGlvbkZlZVJhdGlvARdwYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwAJAQNpbnQBBRlrX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAQtzcHJlYWRMaW1pdAAJAQNpbnQBBQ1rX3NwcmVhZExpbWl0AQ5tYXhQcmljZUltcGFjdAAJAQNpbnQBBRBrX21heFByaWNlSW1wYWN0AQ5tYXhQcmljZVNwcmVhZAAJAQNpbnQBBRBrX21heFByaWNlU3ByZWFkASNsYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAJAQNpbnQBBSVrX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uASRsYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ACQEDaW50AQUma19sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BFnRvdGFsU2hvcnRQb3NpdGlvblNpemUACQEDaW50AQUYa190b3RhbFNob3J0UG9zaXRpb25TaXplARV0b3RhbExvbmdQb3NpdGlvblNpemUACQEDaW50AQUXa190b3RhbExvbmdQb3NpdGlvblNpemUBD2dldEFjdHVhbENhbGxlcgEBaQkBC3ZhbHVlT3JFbHNlAgkAnQgCCQENb3JkZXJzQWRkcmVzcwACCGtfc2VuZGVyCQClCAEIBQFpBmNhbGxlcgEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMMX21hcmdpblJhdGlvEF9iYXNlTWFyZ2luUmF0aW8UX2xhcmdlclRoYW5PckVxdWFsVG8EFHJlbWFpbmluZ01hcmdpblJhdGlvCQBlAgUMX21hcmdpblJhdGlvBRBfYmFzZU1hcmdpblJhdGlvAwMFFF9sYXJnZXJUaGFuT3JFcXVhbFRvCQBmAgAABRRyZW1haW5pbmdNYXJnaW5SYXRpbwcJAAIBAg5JbnZhbGlkIG1hcmdpbgMDCQEBIQEFFF9sYXJnZXJUaGFuT3JFcXVhbFRvCQBnAgUUcmVtYWluaW5nTWFyZ2luUmF0aW8AAAcJAAIBAg5JbnZhbGlkIG1hcmdpbgYBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BDV9wb3NpdGlvblNpemUDCQAAAgUNX3Bvc2l0aW9uU2l6ZQAACQACAQIsU2hvdWxkIG5vdCBiZSBjYWxsZWQgd2l0aCBfcG9zaXRpb25TaXplID09IDADCQBmAgUNX3Bvc2l0aW9uU2l6ZQAACQEjbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ACQEkbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAELZ2V0UG9zaXRpb24BB190cmFkZXIED3Bvc2l0aW9uU2l6ZU9wdAkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uU2l6ZQUHX3RyYWRlcgQHJG1hdGNoMAUPcG9zaXRpb25TaXplT3B0AwkAAQIFByRtYXRjaDACA0ludAQMcG9zaXRpb25TaXplBQckbWF0Y2gwCQCWCgQFDHBvc2l0aW9uU2l6ZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvbk1hcmdpbgUHX3RyYWRlcgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAUHX3RyYWRlcgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUHX3RyYWRlcgkAlgoEAAAAAAAAAAABE3JlcXVpcmVPcGVuUG9zaXRpb24BB190cmFkZXIDCQAAAggJAQtnZXRQb3NpdGlvbgEFB190cmFkZXICXzEAAAkAAgECEE5vIG9wZW4gcG9zaXRpb24GAQtpbml0aWFsaXplZAAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUNa19pbml0aWFsaXplZAcBBnBhdXNlZAAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUIa19wYXVzZWQHAQ11cGRhdGVSZXNlcnZlAwZfaXNBZGQRX3F1b3RlQXNzZXRBbW91bnQQX2Jhc2VBc3NldEFtb3VudAMFBl9pc0FkZAQHbmV3QmFzZQkAZQIJAQZic0FzdFIABRBfYmFzZUFzc2V0QW1vdW50AwkAZwIAAAUHbmV3QmFzZQkAAgECKlR4IGxlYWQgdG8gYmFzZSBhc3NldCByZXNlcnZlIDw9IDAsIHJldmVydAkAlgoECQBkAgkBBnF0QXN0UgAFEV9xdW90ZUFzc2V0QW1vdW50BQduZXdCYXNlCQBkAgkBEXRvdGFsUG9zaXRpb25TaXplAAUQX2Jhc2VBc3NldEFtb3VudAkAZAIJARJjdW11bGF0aXZlTm90aW9uYWwABRFfcXVvdGVBc3NldEFtb3VudAQIbmV3UXVvdGUJAGUCCQEGcXRBc3RSAAURX3F1b3RlQXNzZXRBbW91bnQDCQBnAgAABQhuZXdRdW90ZQkAAgECKlR4IGxlYWQgdG8gYmFzZSBxdW90ZSByZXNlcnZlIDw9IDAsIHJldmVydAkAlgoEBQhuZXdRdW90ZQkAZAIJAQZic0FzdFIABRBfYmFzZUFzc2V0QW1vdW50CQBlAgkBEXRvdGFsUG9zaXRpb25TaXplAAUQX2Jhc2VBc3NldEFtb3VudAkAZQIJARJjdW11bGF0aXZlTm90aW9uYWwABRFfcXVvdGVBc3NldEFtb3VudAEJc3dhcElucHV0AgZfaXNBZGQRX3F1b3RlQXNzZXRBbW91bnQEB19xdEFzdFIJAQZxdEFzdFIABAdfYnNBc3RSCQEGYnNBc3RSAAQBawkBBG11bGQCBQdfcXRBc3RSBQdfYnNBc3RSBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyAwUGX2lzQWRkCQBkAgUHX3F0QXN0UgURX3F1b3RlQXNzZXRBbW91bnQJAGUCBQdfcXRBc3RSBRFfcXVvdGVBc3NldEFtb3VudAQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCQEEZGl2ZAIFAWsFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIEGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwkBA2FicwEJAGUCBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFB19ic0FzdFIEFWFtb3VudEJhc2VBc3NldEJvdWdodAMFBl9pc0FkZAUYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzCQEBLQEFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQNJHQwMTI4MTYxMzAwOQkBDXVwZGF0ZVJlc2VydmUDBQZfaXNBZGQFEV9xdW90ZUFzc2V0QW1vdW50BRhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMEF3F1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMTI4MTYxMzAwOQJfMQQWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFDSR0MDEyODE2MTMwMDkCXzIEF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxCAUNJHQwMTI4MTYxMzAwOQJfMwQYY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIxCAUNJHQwMTI4MTYxMzAwOQJfNAQLcHJpY2VCZWZvcmUJAQRkaXZkAgUHX3F0QXN0UgUHX2JzQXN0UgQLbWFya2V0UHJpY2UJAQRkaXZkAgURX3F1b3RlQXNzZXRBbW91bnQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQJcHJpY2VEaWZmCQEDYWJzAQkAZQIFC3ByaWNlQmVmb3JlBQttYXJrZXRQcmljZQQLcHJpY2VJbXBhY3QJAGUCBQxERUNJTUFMX1VOSVQJAQRkaXZkAgULcHJpY2VCZWZvcmUJAGQCBQtwcmljZUJlZm9yZQUJcHJpY2VEaWZmBBNtYXhQcmljZUltcGFjdFZhbHVlCQEObWF4UHJpY2VJbXBhY3QAAwkAZgIFC3ByaWNlSW1wYWN0BRNtYXhQcmljZUltcGFjdFZhbHVlCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg1QcmljZSBpbXBhY3QgCQCkAwEFC3ByaWNlSW1wYWN0AhQgPiBtYXggcHJpY2UgaW1wYWN0IAkApAMBBRNtYXhQcmljZUltcGFjdFZhbHVlAhUgYmVmb3JlIHF1b3RlIGFzc2V0OiAJAKQDAQUHX3F0QXN0UgIUIGJlZm9yZSBiYXNlIGFzc2V0OiAJAKQDAQUHX2JzQXN0UgIhIHF1b3RlIGFzc2V0IGFtb3VudCB0byBleGNoYW5nZTogCQCkAwEFEV9xdW90ZUFzc2V0QW1vdW50Ag8gcHJpY2UgYmVmb3JlOiAJAKQDAQULcHJpY2VCZWZvcmUCDiBtYXJrZXRQcmljZTogCQCkAwEFC21hcmtldFByaWNlCQCXCgUFFWFtb3VudEJhc2VBc3NldEJvdWdodAUXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEFFmJhc2VBc3NldFJlc2VydmVBZnRlcjEFF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxBRhjdW11bGF0aXZlTm90aW9uYWxBZnRlcjEBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEEF9vbGRQb3NpdGlvblNpemUSX29sZFBvc2l0aW9uTWFyZ2luJV9vbGRQb3NpdGlvbkN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24MX21hcmdpbkRlbHRhBA5mdW5kaW5nUGF5bWVudAMJAQIhPQIFEF9vbGRQb3NpdGlvblNpemUAAAQgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24JAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUQX29sZFBvc2l0aW9uU2l6ZQkBBG11bGQCCQBlAgUgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FJV9vbGRQb3NpdGlvbkN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FEF9vbGRQb3NpdGlvblNpemUAAAQMc2lnbmVkTWFyZ2luCQBkAgkAZQIFDF9tYXJnaW5EZWx0YQUOZnVuZGluZ1BheW1lbnQFEl9vbGRQb3NpdGlvbk1hcmdpbgQNJHQwMTQ1MDAxNDYyNwMJAGYCAAAFDHNpZ25lZE1hcmdpbgkAlAoCAAAJAQNhYnMBBQxzaWduZWRNYXJnaW4JAJQKAgkBA2FicwEFDHNpZ25lZE1hcmdpbgAABAxyZW1haW5NYXJnaW4IBQ0kdDAxNDUwMDE0NjI3Al8xBAdiYWREZWJ0CAUNJHQwMTQ1MDAxNDYyNwJfMgkAlQoDBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFDmZ1bmRpbmdQYXltZW50ARZzd2FwT3V0cHV0V2l0aFJlc2VydmVzBQZfaXNBZGQQX2Jhc2VBc3NldEFtb3VudBRfY2hlY2tNYXhQcmljZUltcGFjdBJfcXVvdGVBc3NldFJlc2VydmURX2Jhc2VBc3NldFJlc2VydmUEC3ByaWNlQmVmb3JlCQEEZGl2ZAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUDCQAAAgUQX2Jhc2VBc3NldEFtb3VudAAACQACAQIZSW52YWxpZCBiYXNlIGFzc2V0IGFtb3VudAQBawkBBG11bGQCBRJfcXVvdGVBc3NldFJlc2VydmUFEV9iYXNlQXNzZXRSZXNlcnZlBBhiYXNlQXNzZXRQb29sQW1vdW50QWZ0ZXIDBQZfaXNBZGQJAGQCBRFfYmFzZUFzc2V0UmVzZXJ2ZQUQX2Jhc2VBc3NldEFtb3VudAkAZQIFEV9iYXNlQXNzZXRSZXNlcnZlBRBfYmFzZUFzc2V0QW1vdW50BA9xdW90ZUFzc2V0QWZ0ZXIJAQRkaXZkAgUBawUYYmFzZUFzc2V0UG9vbEFtb3VudEFmdGVyBA5xdW90ZUFzc2V0U29sZAkBA2FicwEJAGUCBQ9xdW90ZUFzc2V0QWZ0ZXIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQQTbWF4UHJpY2VJbXBhY3RWYWx1ZQkBDm1heFByaWNlSW1wYWN0AAQNJHQwMTU2MDQxNTc5NwkBDXVwZGF0ZVJlc2VydmUDCQEBIQEFBl9pc0FkZAUOcXVvdGVBc3NldFNvbGQFEF9iYXNlQXNzZXRBbW91bnQEF3F1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMTU2MDQxNTc5NwJfMQQWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFDSR0MDE1NjA0MTU3OTcCXzIEF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxCAUNJHQwMTU2MDQxNTc5NwJfMwQYY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIxCAUNJHQwMTU2MDQxNTc5NwJfNAQLbWFya2V0UHJpY2UJAQRkaXZkAgUOcXVvdGVBc3NldFNvbGQFEF9iYXNlQXNzZXRBbW91bnQECXByaWNlRGlmZgkBA2FicwEJAGUCBQtwcmljZUJlZm9yZQULbWFya2V0UHJpY2UEC3ByaWNlSW1wYWN0CQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIFC3ByaWNlQmVmb3JlCQBkAgULcHJpY2VCZWZvcmUFCXByaWNlRGlmZgMDCQBmAgULcHJpY2VJbXBhY3QFE21heFByaWNlSW1wYWN0VmFsdWUFFF9jaGVja01heFByaWNlSW1wYWN0BwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgINUHJpY2UgaW1wYWN0IAkApAMBBQtwcmljZUltcGFjdAIUID4gbWF4IHByaWNlIGltcGFjdCAJAKQDAQUTbWF4UHJpY2VJbXBhY3RWYWx1ZQIVIGJlZm9yZSBxdW90ZSBhc3NldDogCQCkAwEFEl9xdW90ZUFzc2V0UmVzZXJ2ZQIUIGJlZm9yZSBiYXNlIGFzc2V0OiAJAKQDAQURX2Jhc2VBc3NldFJlc2VydmUCICBiYXNlIGFzc2V0IGFtb3VudCB0byBleGNoYW5nZTogCQCkAwEFEF9iYXNlQXNzZXRBbW91bnQCDyBwcmljZSBiZWZvcmU6IAkApAMBBQtwcmljZUJlZm9yZQIPIG1hcmtldCBwcmljZTogCQCkAwEFC21hcmtldFByaWNlCQCaCggFDnF1b3RlQXNzZXRTb2xkBRdxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyMQUWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQUXdG90YWxQb3NpdGlvblNpemVBZnRlcjEFGGN1bXVsYXRpdmVOb3Rpb25hbEFmdGVyMQkAZQIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAwUGX2lzQWRkCQEDYWJzAQUQX2Jhc2VBc3NldEFtb3VudAAACQBlAgkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUAAwkBASEBBQZfaXNBZGQJAQNhYnMBBRBfYmFzZUFzc2V0QW1vdW50AAAFC3ByaWNlSW1wYWN0AQpzd2FwT3V0cHV0AwZfaXNBZGQQX2Jhc2VBc3NldEFtb3VudBRfY2hlY2tNYXhQcmljZUltcGFjdAkBFnN3YXBPdXRwdXRXaXRoUmVzZXJ2ZXMFBQZfaXNBZGQFEF9iYXNlQXNzZXRBbW91bnQFFF9jaGVja01heFByaWNlSW1wYWN0CQEGcXRBc3RSAAkBBmJzQXN0UgABEmdldE9yYWNsZVR3YXBQcmljZQAEBm9yYWNsZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFBWtfb3JhAgAECHByaWNlS2V5CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQlrX29yYV9rZXkECGJsb2NrS2V5CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQ9rX29yYV9ibG9ja19rZXkECWxhc3RWYWx1ZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBm9yYWNsZQUIcHJpY2VLZXkJAKwCAgkArAICCQCsAgICIkNhbiBub3QgZ2V0IG9yYWNsZSBwcmljZS4gT3JhY2xlOiAJAKUIAQUGb3JhY2xlAgYga2V5OiAFCHByaWNlS2V5BQlsYXN0VmFsdWUBGXJlcXVpcmVOb3RPdmVyU3ByZWFkTGltaXQCEl9xdW90ZUFzc2V0UmVzZXJ2ZRFfYmFzZUFzc2V0UmVzZXJ2ZQQLb3JhY2xlUHJpY2UJARJnZXRPcmFjbGVUd2FwUHJpY2UABApwcmljZUFmdGVyCQEEZGl2ZAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUEDGF2ZXJhZ2VQcmljZQkBBGRpdmQCCQBkAgULb3JhY2xlUHJpY2UFCnByaWNlQWZ0ZXIJAGgCAAIFDERFQ0lNQUxfVU5JVAQMYWJzUHJpY2VEaWZmCQEEZGl2ZAIJAQNhYnMBCQBlAgULb3JhY2xlUHJpY2UFCnByaWNlQWZ0ZXIFDGF2ZXJhZ2VQcmljZQMJAGYCBQxhYnNQcmljZURpZmYJAQ5tYXhQcmljZVNwcmVhZAAJAAIBCQCsAgIJAKwCAgkArAICAg1QcmljZSBzcHJlYWQgCQCkAwEFDGFic1ByaWNlRGlmZgIUID4gbWF4IHByaWNlIHNwcmVhZCAJAKQDAQkBDm1heFByaWNlU3ByZWFkAAYBDGdldFNwb3RQcmljZQAEEl9xdW90ZUFzc2V0UmVzZXJ2ZQkBBnF0QXN0UgAEEV9iYXNlQXNzZXRSZXNlcnZlCQEGYnNBc3RSAAkBBGRpdmQCBRJfcXVvdGVBc3NldFJlc2VydmUFEV9iYXNlQXNzZXRSZXNlcnZlARZpc092ZXJGbHVjdHVhdGlvbkxpbWl0AAQLb3JhY2xlUHJpY2UJARJnZXRPcmFjbGVUd2FwUHJpY2UABAxjdXJyZW50UHJpY2UJAQxnZXRTcG90UHJpY2UACQBmAgkBBGRpdmQCCQEDYWJzAQkAZQIFC29yYWNsZVByaWNlBQxjdXJyZW50UHJpY2UFC29yYWNsZVByaWNlCQELc3ByZWFkTGltaXQAAR9nZXRQb3NpdGlvbkFkanVzdGVkT3Blbk5vdGlvbmFsBA1fcG9zaXRpb25TaXplB19vcHRpb24SX3F1b3RlQXNzZXRSZXNlcnZlEV9iYXNlQXNzZXRSZXNlcnZlBA9wb3NpdGlvblNpemVBYnMJAQNhYnMBBQ1fcG9zaXRpb25TaXplBAdpc1Nob3J0CQBmAgAABQ1fcG9zaXRpb25TaXplBBBwb3NpdGlvbk5vdGlvbmFsAwkAAAIFB19vcHRpb24FD1BOTF9PUFRJT05fU1BPVAQNJHQwMTkwMTUxOTE4NgkBFnN3YXBPdXRwdXRXaXRoUmVzZXJ2ZXMFCQEBIQEFB2lzU2hvcnQFD3Bvc2l0aW9uU2l6ZUFicwcFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUEE291dFBvc2l0aW9uTm90aW9uYWwIBQ0kdDAxOTAxNTE5MTg2Al8xBAJ4MQgFDSR0MDE5MDE1MTkxODYCXzIEAngyCAUNJHQwMTkwMTUxOTE4NgJfMwQCeDMIBQ0kdDAxOTAxNTE5MTg2Al80BRNvdXRQb3NpdGlvbk5vdGlvbmFsCQEEbXVsZAIFD3Bvc2l0aW9uU2l6ZUFicwkBEmdldE9yYWNsZVR3YXBQcmljZQAFEHBvc2l0aW9uTm90aW9uYWwBK2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sQnlWYWx1ZXMFDV9wb3NpdGlvblNpemUVX3Bvc2l0aW9uT3Blbk5vdGlvbmFsEl9xdW90ZUFzc2V0UmVzZXJ2ZRFfYmFzZUFzc2V0UmVzZXJ2ZQdfb3B0aW9uAwkAAAIFDV9wb3NpdGlvblNpemUAAAkAAgECFUludmFsaWQgcG9zaXRpb24gc2l6ZQQHaXNTaG9ydAkAZgIAAAUNX3Bvc2l0aW9uU2l6ZQQQcG9zaXRpb25Ob3Rpb25hbAkBH2dldFBvc2l0aW9uQWRqdXN0ZWRPcGVuTm90aW9uYWwEBQ1fcG9zaXRpb25TaXplBQdfb3B0aW9uBRJfcXVvdGVBc3NldFJlc2VydmUFEV9iYXNlQXNzZXRSZXNlcnZlBA11bnJlYWxpemVkUG5sAwUHaXNTaG9ydAkAZQIFFV9wb3NpdGlvbk9wZW5Ob3Rpb25hbAUQcG9zaXRpb25Ob3Rpb25hbAkAZQIFEHBvc2l0aW9uTm90aW9uYWwFFV9wb3NpdGlvbk9wZW5Ob3Rpb25hbAkAlAoCBRBwb3NpdGlvbk5vdGlvbmFsBQ11bnJlYWxpemVkUG5sASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIHX3RyYWRlcgdfb3B0aW9uBA0kdDAyMDUwMzIwNjMxCQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBAxwb3NpdGlvblNpemUIBQ0kdDAyMDUwMzIwNjMxAl8xBA5wb3NpdGlvbk1hcmdpbggFDSR0MDIwNTAzMjA2MzECXzIEFHBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwMjA1MDMyMDYzMQJfMwQRcG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDAyMDUwMzIwNjMxAl80CQErZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmxCeVZhbHVlcwUFDHBvc2l0aW9uU2l6ZQUUcG9zaXRpb25PcGVuTm90aW9uYWwJAQZxdEFzdFIACQEGYnNBc3RSAAUHX29wdGlvbgEPY2FsY01hcmdpblJhdGlvAw1fcmVtYWluTWFyZ2luCF9iYWREZWJ0EV9wb3NpdGlvbk5vdGlvbmFsCQEEZGl2ZAIJAGUCBQ1fcmVtYWluTWFyZ2luBQhfYmFkRGVidAURX3Bvc2l0aW9uTm90aW9uYWwBFmdldE1hcmdpblJhdGlvQnlPcHRpb24CB190cmFkZXIHX29wdGlvbgQNJHQwMjExMTIyMTIyMwkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwMjExMTIyMTIyMwJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDAyMTExMjIxMjIzAl8yBANwb24IBQ0kdDAyMTExMjIxMjIzAl8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDIxMTEyMjEyMjMCXzQEDSR0MDIxMjI5MjEzMjIJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFB19vcHRpb24EEHBvc2l0aW9uTm90aW9uYWwIBQ0kdDAyMTIyOTIxMzIyAl8xBA11bnJlYWxpemVkUG5sCAUNJHQwMjEyMjkyMTMyMgJfMgQNJHQwMjEzMjcyMTQ5MwkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQxwb3NpdGlvblNpemUFDnBvc2l0aW9uTWFyZ2luBRFwb3NpdGlvbkxzdFVwZENQRgUNdW5yZWFsaXplZFBubAQMcmVtYWluTWFyZ2luCAUNJHQwMjEzMjcyMTQ5MwJfMQQHYmFkRGVidAgFDSR0MDIxMzI3MjE0OTMCXzIJAQ9jYWxjTWFyZ2luUmF0aW8DBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFEHBvc2l0aW9uTm90aW9uYWwBDmdldE1hcmdpblJhdGlvAQdfdHJhZGVyCQEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAEbZ2V0UGFydGlhbExpcXVpZGF0aW9uQW1vdW50AgdfdHJhZGVyDV9wb3NpdGlvblNpemUEDG1heGltdW1SYXRpbwkBBHZtYXgCCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ACQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIJAQ5nZXRNYXJnaW5SYXRpbwEFB190cmFkZXIJARZtYWludGVuYW5jZU1hcmdpblJhdGlvAAQYbWF4RXhjaGFuZ2VkUG9zaXRpb25TaXplCQEEbXVsZAIJAQNhYnMBBQ1fcG9zaXRpb25TaXplBQxtYXhpbXVtUmF0aW8ECnN3YXBSZXN1bHQJAQpzd2FwT3V0cHV0AwkAZgIFDV9wb3NpdGlvblNpemUAAAUYbWF4RXhjaGFuZ2VkUG9zaXRpb25TaXplBwQcbWF4RXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFCnN3YXBSZXN1bHQCXzEEC3ByaWNlSW1wYWN0CAUKc3dhcFJlc3VsdAJfOAMJAGYCCQEObWF4UHJpY2VJbXBhY3QABQtwcmljZUltcGFjdAUcbWF4RXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQVZXhjaGFuZ2VkUG9zaXRpb25TaXplCQEEbXVsZAIJAQNhYnMBBQ1fcG9zaXRpb25TaXplCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ABBlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAkBCnN3YXBPdXRwdXQDCQBmAgUNX3Bvc2l0aW9uU2l6ZQAABRVleGNoYW5nZWRQb3NpdGlvblNpemUHAl8xBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50ARVpbnRlcm5hbENsb3NlUG9zaXRpb24CB190cmFkZXIUX2NoZWNrTWF4UHJpY2VJbXBhY3QEDSR0MDIyNzI2MjI4NTQJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIEDHBvc2l0aW9uU2l6ZQgFDSR0MDIyNzI2MjI4NTQCXzEEDnBvc2l0aW9uTWFyZ2luCAUNJHQwMjI3MjYyMjg1NAJfMgQUcG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDAyMjcyNjIyODU0Al8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDIyNzI2MjI4NTQCXzQEDXVucmVhbGl6ZWRQbmwICQEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCBQdfdHJhZGVyBQ9QTkxfT1BUSU9OX1NQT1QCXzIEDSR0MDIyOTQ5MjMxMTcJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUMcG9zaXRpb25TaXplBQ5wb3NpdGlvbk1hcmdpbgURcG9zaXRpb25Mc3RVcGRDUEYFDXVucmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDIyOTQ5MjMxMTcCXzEEB2JhZERlYnQIBQ0kdDAyMjk0OTIzMTE3Al8yBBVleGNoYW5nZWRQb3NpdGlvblNpemUJAQEtAQUMcG9zaXRpb25TaXplBAtyZWFsaXplZFBubAUNdW5yZWFsaXplZFBubAQNbWFyZ2luVG9WYXVsdAkBAS0BBQxyZW1haW5NYXJnaW4EDSR0MDIzMjQ0MjM1NTUJAQpzd2FwT3V0cHV0AwkAZgIFDHBvc2l0aW9uU2l6ZQAACQEDYWJzAQUMcG9zaXRpb25TaXplBRRfY2hlY2tNYXhQcmljZUltcGFjdAQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFDSR0MDIzMjQ0MjM1NTUCXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAyMzI0NDIzNTU1Al8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAyMzI0NDIzNTU1Al8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwMjMyNDQyMzU1NQJfNAQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDAyMzI0NDIzNTU1Al81BA50b3RhbExvbmdBZnRlcggFDSR0MDIzMjQ0MjM1NTUCXzYED3RvdGFsU2hvcnRBZnRlcggFDSR0MDIzMjQ0MjM1NTUCXzcEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIJAGUCCQEUb3BlbkludGVyZXN0Tm90aW9uYWwABRRwb3NpdGlvbk9wZW5Ob3Rpb25hbAkAngoMBRVleGNoYW5nZWRQb3NpdGlvblNpemUFB2JhZERlYnQFC3JlYWxpemVkUG5sBQ1tYXJnaW5Ub1ZhdWx0BRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyARBnZXRUd2FwU3BvdFByaWNlAAQIbWludXRlSWQJAGkCCQBpAggFCWxhc3RCbG9jawl0aW1lc3RhbXAA6AcAPAQNc3RhcnRNaW51dGVJZAkAZQIFCG1pbnV0ZUlkBQ1UV0FQX0lOVEVSVkFMBAdsaXN0U3RyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFDWtfbGFzdERhdGFTdHICAAQEbGlzdAkAtQkCBQdsaXN0U3RyAgEsCgEIZmlsdGVyRm4CC2FjY3VtdWxhdG9yBG5leHQDCQBnAgUNc3RhcnRNaW51dGVJZAkBDXBhcnNlSW50VmFsdWUBBQRuZXh0CQDNCAIFC2FjY3VtdWxhdG9yCQENcGFyc2VJbnRWYWx1ZQEFBG5leHQFC2FjY3VtdWxhdG9yBAVsaXN0RgoAAiRsBQRsaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmaWx0ZXJGbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBAhtYXhJbmRleAMJAGYCCQCQAwEFBWxpc3RGAAAJAJYDAQUFbGlzdEYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsaXN0AAAEDGxhc3RNaW51dGVJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ5rX2xhc3RNaW51dGVJZAAABBZlbmRMYXN0Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIBXwkApAMBBQxsYXN0TWludXRlSWQAAAQMZW5kTGFzdFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBRNrX3R3YXBEYXRhTGFzdFByaWNlAgFfCQCkAwEFDGxhc3RNaW51dGVJZAAABBJub3dDdW11bGF0aXZlUHJpY2UJAGQCBRZlbmRMYXN0Q3VtdWxhdGl2ZVByaWNlCQBoAgkAZQIFCG1pbnV0ZUlkBQxsYXN0TWludXRlSWQFDGVuZExhc3RQcmljZQQYc3RhcnRMYXN0Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIBXwkApAMBBQhtYXhJbmRleAAABA5zdGFydExhc3RQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUTa190d2FwRGF0YUxhc3RQcmljZQIBXwkApAMBBQhtYXhJbmRleAAABBRzdGFydEN1bXVsYXRpdmVQcmljZQkAZAIFGHN0YXJ0TGFzdEN1bXVsYXRpdmVQcmljZQkAaAIJAGUCBQ1zdGFydE1pbnV0ZUlkBQhtYXhJbmRleAUOc3RhcnRMYXN0UHJpY2UJAGkCCQBlAgUSbm93Q3VtdWxhdGl2ZVByaWNlBRRzdGFydEN1bXVsYXRpdmVQcmljZQUNVFdBUF9JTlRFUlZBTAEQZ2V0UGVnQWRqdXN0Q29zdAEGX3ByaWNlBA1fcG9zaXRpb25TaXplCQERdG90YWxQb3NpdGlvblNpemUABAlkaXJlY3Rpb24JAGYCBQ1fcG9zaXRpb25TaXplAAAEFWN1cnJlbnROZXRNYXJrZXRWYWx1ZQgJAQpzd2FwT3V0cHV0AwUJZGlyZWN0aW9uCQEDYWJzAQUNX3Bvc2l0aW9uU2l6ZQcCXzEEEGJhc2VBc3NldFJlc2VydmUJAQZic0FzdFIABBRuZXdRdW90ZUFzc2V0UmVzZXJ2ZQkBBG11bGQCBRBiYXNlQXNzZXRSZXNlcnZlBQZfcHJpY2UEBGNvc3QICQErZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmxCeVZhbHVlcwUFDV9wb3NpdGlvblNpemUFFWN1cnJlbnROZXRNYXJrZXRWYWx1ZQUUbmV3UXVvdGVBc3NldFJlc2VydmUFEGJhc2VBc3NldFJlc2VydmUFD1BOTF9PUFRJT05fU1BPVAJfMgkAlAoCBRRuZXdRdW90ZUFzc2V0UmVzZXJ2ZQUEY29zdAEKZ2V0RnVuZGluZwAED3VuZGVybHlpbmdQcmljZQkBEmdldE9yYWNsZVR3YXBQcmljZQAEDXNwb3RUd2FwUHJpY2UJARBnZXRUd2FwU3BvdFByaWNlAAQHcHJlbWl1bQkAZQIFDXNwb3RUd2FwUHJpY2UFD3VuZGVybHlpbmdQcmljZQMDCQAAAgkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUAAAAGCQAAAgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAAAAkAlAoCAAAAAAMJAGYCAAAFB3ByZW1pdW0EFHNob3J0UHJlbWl1bUZyYWN0aW9uCQEEZGl2ZAIJAQRtdWxkAgUHcHJlbWl1bQkBFGZ1bmRpbmdQZXJpb2REZWNpbWFsAAUHT05FX0RBWQQTbG9uZ1ByZW1pdW1GcmFjdGlvbgkBBGRpdmQCCQEEbXVsZAIFFHNob3J0UHJlbWl1bUZyYWN0aW9uCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQAJARV0b3RhbExvbmdQb3NpdGlvblNpemUACQCUCgIFFHNob3J0UHJlbWl1bUZyYWN0aW9uBRNsb25nUHJlbWl1bUZyYWN0aW9uBBNsb25nUHJlbWl1bUZyYWN0aW9uCQEEZGl2ZAIJAQRtdWxkAgUHcHJlbWl1bQkBFGZ1bmRpbmdQZXJpb2REZWNpbWFsAAUHT05FX0RBWQQUc2hvcnRQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBRNsb25nUHJlbWl1bUZyYWN0aW9uCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUACQCUCgIFFHNob3J0UHJlbWl1bUZyYWN0aW9uBRNsb25nUHJlbWl1bUZyYWN0aW9uAQ51cGRhdGVTZXR0aW5ncwkQX2luaXRNYXJnaW5SYXRpbwRfbW1yFF9saXF1aWRhdGlvbkZlZVJhdGlvDl9mdW5kaW5nUGVyaW9kBF9mZWUMX3NwcmVhZExpbWl0D19tYXhQcmljZUltcGFjdBhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8PX21heFByaWNlU3ByZWFkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrX2luaXRNYXJnaW5SYXRpbwUQX2luaXRNYXJnaW5SYXRpbwkAzAgCCQEMSW50ZWdlckVudHJ5AgUYa19tYWludGVuYW5jZU1hcmdpblJhdGlvBQRfbW1yCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVrX2xpcXVpZGF0aW9uRmVlUmF0aW8FFF9saXF1aWRhdGlvbkZlZVJhdGlvCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rX2Z1bmRpbmdQZXJpb2QFDl9mdW5kaW5nUGVyaW9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQVrX2ZlZQUEX2ZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa19zcHJlYWRMaW1pdAUMX3NwcmVhZExpbWl0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrX21heFByaWNlSW1wYWN0BQ9fbWF4UHJpY2VJbXBhY3QJAMwIAgkBDEludGVnZXJFbnRyeQIFGWtfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8FGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa19tYXhQcmljZVNwcmVhZAUPX21heFByaWNlU3ByZWFkBQNuaWwBDXVwZGF0ZUZ1bmRpbmcFEV9uZXh0RnVuZGluZ0Jsb2NrJF9sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbiVfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uEF9sb25nRnVuZGluZ1JhdGURX3Nob3J0RnVuZGluZ1JhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfbmV4dEZ1bmRpbmdCbG9jawURX25leHRGdW5kaW5nQmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIFJWtfbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FJF9sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgUma19sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FJV9sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24JAMwIAgkBDEludGVnZXJFbnRyeQIFEWtfbG9uZ0Z1bmRpbmdSYXRlBRBfbG9uZ0Z1bmRpbmdSYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrX3Nob3J0RnVuZGluZ1JhdGUFEV9zaG9ydEZ1bmRpbmdSYXRlBQNuaWwBDnVwZGF0ZVBvc2l0aW9uBQhfYWRkcmVzcwVfc2l6ZQdfbWFyZ2luDV9vcGVuTm90aW9uYWwgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQhfYWRkcmVzcwUFX3NpemUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25NYXJnaW4FCF9hZGRyZXNzBQdfbWFyZ2luCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQhfYWRkcmVzcwUNX29wZW5Ob3Rpb25hbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUIX2FkZHJlc3MFIF9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQNuaWwBCmFwcGVuZFR3YXABBXByaWNlBAhtaW51dGVJZAkAaQIJAGkCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcADoBwA8BBBwcmV2aW91c01pbnV0ZUlkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDmtfbGFzdE1pbnV0ZUlkAAADCQBmAgUQcHJldmlvdXNNaW51dGVJZAUIbWludXRlSWQJAAIBAhFUV0FQIG91dC1vZi1vcmRlcgQMbGFzdE1pbnV0ZUlkAwkAAAIFEHByZXZpb3VzTWludXRlSWQAAAUIbWludXRlSWQFEHByZXZpb3VzTWludXRlSWQDCQBmAgUIbWludXRlSWQFEHByZXZpb3VzTWludXRlSWQEE3ByZXZDdW11bGF0aXZlUHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIFHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlAgFfCQCkAwEFEHByZXZpb3VzTWludXRlSWQAAAQJcHJldlByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBRNrX3R3YXBEYXRhTGFzdFByaWNlAgFfCQCkAwEFEHByZXZpb3VzTWludXRlSWQFBXByaWNlBBNsYXN0Q3VtdWxhdGl2ZVByaWNlCQBkAgUTcHJldkN1bXVsYXRpdmVQcmljZQkAaAIJAGUCBQhtaW51dGVJZAUMbGFzdE1pbnV0ZUlkBQlwcmV2UHJpY2UEBGxpc3QJAQtwdXNoVG9RdWV1ZQMJAQlzdHJUb0xpc3QBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFDWtfbGFzdERhdGFTdHICAAUNVFdBUF9JTlRFUlZBTAkApAMBBQhtaW51dGVJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UJAKQDAQUIbWludXRlSWQFE2xhc3RDdW11bGF0aXZlUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFE2tfdHdhcERhdGFMYXN0UHJpY2UJAKQDAQUIbWludXRlSWQFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRprX3R3YXBEYXRhUHJldmlvdXNNaW51dGVJZAkApAMBBQhtaW51dGVJZAUQcHJldmlvdXNNaW51dGVJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUOa19sYXN0TWludXRlSWQFCG1pbnV0ZUlkCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtfbGFzdERhdGFTdHIJAQlsaXN0VG9TdHIBBQRsaXN0BQNuaWwEGHR3YXBEYXRhUHJldmlvdXNNaW51dGVJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRprX3R3YXBEYXRhUHJldmlvdXNNaW51dGVJZAkApAMBBQhtaW51dGVJZAAABBNwcmV2Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlCQCkAwEFGHR3YXBEYXRhUHJldmlvdXNNaW51dGVJZAAABAlwcmV2UHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUTa190d2FwRGF0YUxhc3RQcmljZQkApAMBBRh0d2FwRGF0YVByZXZpb3VzTWludXRlSWQFBXByaWNlBBNsYXN0Q3VtdWxhdGl2ZVByaWNlCQBkAgUTcHJldkN1bXVsYXRpdmVQcmljZQkAaAIJAGUCBQhtaW51dGVJZAUYdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkBQlwcmV2UHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlCQCkAwEFCG1pbnV0ZUlkBRNsYXN0Q3VtdWxhdGl2ZVByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRNrX3R3YXBEYXRhTGFzdFByaWNlCQCkAwEFCG1pbnV0ZUlkBQVwcmljZQUDbmlsARF1cGRhdGVBbW1SZXNlcnZlcwIHX3F0QXN0UgdfYnNBc3RSCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrX3F1b3RlQXNzZXRSZXNlcnZlBQdfcXRBc3RSCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrX2Jhc2VBc3NldFJlc2VydmUFB19ic0FzdFIFA25pbAEJdXBkYXRlQW1tBwdfcXRBc3RSB19ic0FzdFIXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIYX2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyFV9vcGVuSW50ZXJlc3ROb3Rpb25hbBZfdG90YWxMb25nUG9zaXRpb25TaXplF190b3RhbFNob3J0UG9zaXRpb25TaXplAwkBAiE9AgkAZQIFFl90b3RhbExvbmdQb3NpdGlvblNpemUFF190b3RhbFNob3J0UG9zaXRpb25TaXplBRdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhhJbnZhbGlkIEFNTSBzdGF0ZSBkYXRhOiAJAKQDAQUWX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQIEICsgIAkApAMBBRdfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQIEICE9IAkApAMBBRdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkAzggCCQDOCAIJARF1cGRhdGVBbW1SZXNlcnZlcwIFB19xdEFzdFIFB19ic0FzdFIJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tfdG90YWxQb3NpdGlvblNpemUFF190b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRrX2N1bXVsYXRpdmVOb3Rpb25hbAUYX2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZrX29wZW5JbnRlcmVzdE5vdGlvbmFsBRVfb3BlbkludGVyZXN0Tm90aW9uYWwJAMwIAgkBDEludGVnZXJFbnRyeQIFF2tfdG90YWxMb25nUG9zaXRpb25TaXplBRZfdG90YWxMb25nUG9zaXRpb25TaXplCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRhrX3RvdGFsU2hvcnRQb3NpdGlvblNpemUFF190b3RhbFNob3J0UG9zaXRpb25TaXplBQNuaWwJAQphcHBlbmRUd2FwAQkBBGRpdmQCBQdfcXRBc3RSBQdfYnNBc3RSAQ5kZWxldGVQb3NpdGlvbgEIX2FkZHJlc3MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFCF9hZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25NYXJnaW4FCF9hZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFFmtfcG9zaXRpb25PcGVuTm90aW9uYWwFCF9hZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFLmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FCF9hZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRRrX3Bvc2l0aW9uQ2xvc2VkRGF0ZQUIX2FkZHJlc3MIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQNuaWwBCHdpdGhkcmF3AghfYWRkcmVzcwdfYW1vdW50BAdiYWxhbmNlCQDwBwIFBHRoaXMJAQpxdW90ZUFzc2V0AAMJAGYCBQdfYW1vdW50BQdiYWxhbmNlCQACAQkArAICCQCsAgIJAKwCAgITVW5hYmxlIHRvIHdpdGhkcmF3IAkApAMBBQdfYW1vdW50AhcgZnJvbSBjb250cmFjdCBiYWxhbmNlIAkApAMBBQdiYWxhbmNlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCF9hZGRyZXNzBQdfYW1vdW50CQEKcXVvdGVBc3NldAAFA25pbAENdXBkYXRlQmFsYW5jZQEBaQMJAGYCAAAFAWkJAAIBAgdCYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrX2JhbGFuY2UFAWkFA25pbAELdHJhbnNmZXJGZWUBAWkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBDnN0YWtpbmdBZGRyZXNzAAUBaQkBCnF1b3RlQXNzZXQABQNuaWwUAWkBBXBhdXNlAAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhpJbnZhbGlkIHRvZ2dsZVBhdXNlIHBhcmFtcwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUIa19wYXVzZWQGBQNuaWwBaQEHdW5wYXVzZQADCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIaSW52YWxpZCB0b2dnbGVQYXVzZSBwYXJhbXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCGtfcGF1c2VkBwUDbmlsAWkBDGFkZExpcXVpZGl0eQERX3F1b3RlQXNzZXRBbW91bnQDAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAYJAGcCAAAFEV9xdW90ZUFzc2V0QW1vdW50CQACAQIbSW52YWxpZCBhZGRMaXF1aWRpdHkgcGFyYW1zBAdfcXRBc3RSCQEGcXRBc3RSAAQHX2JzQXN0UgkBBmJzQXN0UgAEBXByaWNlCQEEZGl2ZAIFB19xdEFzdFIFB19ic0FzdFIEFGJhc2VBc3NldEFtb3VudFRvQWRkCQEEZGl2ZAIFEV9xdW90ZUFzc2V0QW1vdW50BQVwcmljZQQLcXRBc3RSQWZ0ZXIJAGQCBQdfcXRBc3RSBRFfcXVvdGVBc3NldEFtb3VudAQLYnNBc3RSQWZ0ZXIJAGQCBQdfYnNBc3RSBRRiYXNlQXNzZXRBbW91bnRUb0FkZAkBEXVwZGF0ZUFtbVJlc2VydmVzAgULcXRBc3RSQWZ0ZXIFC2JzQXN0UkFmdGVyAWkBD3JlbW92ZUxpcXVpZGl0eQERX3F1b3RlQXNzZXRBbW91bnQDAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAYJAGcCAAAFEV9xdW90ZUFzc2V0QW1vdW50CQACAQIeSW52YWxpZCByZW1vdmVMaXF1aWRpdHkgcGFyYW1zBAdfcXRBc3RSCQEGcXRBc3RSAAQHX2JzQXN0UgkBBmJzQXN0UgAEBXByaWNlCQEEZGl2ZAIFB19xdEFzdFIFB19ic0FzdFIEF2Jhc2VBc3NldEFtb3VudFRvUmVtb3ZlCQEEZGl2ZAIFEV9xdW90ZUFzc2V0QW1vdW50BQVwcmljZQQLcXRBc3RSQWZ0ZXIJAGUCBQdfcXRBc3RSBRFfcXVvdGVBc3NldEFtb3VudAQLYnNBc3RSQWZ0ZXIJAGUCBQdfYnNBc3RSBRdiYXNlQXNzZXRBbW91bnRUb1JlbW92ZQkBEXVwZGF0ZUFtbVJlc2VydmVzAgULcXRBc3RSQWZ0ZXIFC2JzQXN0UkFmdGVyAWkBDmNoYW5nZVNldHRpbmdzCRBfaW5pdE1hcmdpblJhdGlvBF9tbXIUX2xpcXVpZGF0aW9uRmVlUmF0aW8OX2Z1bmRpbmdQZXJpb2QEX2ZlZQxfc3ByZWFkTGltaXQPX21heFByaWNlSW1wYWN0GF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbw9fbWF4UHJpY2VTcHJlYWQDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIdSW52YWxpZCBjaGFuZ2VTZXR0aW5ncyBwYXJhbXMJAQ51cGRhdGVTZXR0aW5ncwkFEF9pbml0TWFyZ2luUmF0aW8FBF9tbXIFFF9saXF1aWRhdGlvbkZlZVJhdGlvBQ5fZnVuZGluZ1BlcmlvZAUEX2ZlZQUMX3NwcmVhZExpbWl0BQ9fbWF4UHJpY2VJbXBhY3QFGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwUPX21heFByaWNlU3ByZWFkAWkBCmluaXRpYWxpemUOB19xdEFzdFIHX2JzQXN0Ug5fZnVuZGluZ1BlcmlvZBBfaW5pdE1hcmdpblJhdGlvBF9tbXIUX2xpcXVpZGF0aW9uRmVlUmF0aW8EX2ZlZQdfb3JhY2xlCl9vcmFjbGVLZXkMX2Nvb3JkaW5hdG9yDF9zcHJlYWRMaW1pdA9fbWF4UHJpY2VJbXBhY3QYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvD19tYXhQcmljZVNwcmVhZAMDAwMDAwMDAwMDAwkAZwIAAAUHX3F0QXN0UgYJAGcCAAAFB19ic0FzdFIGCQBnAgAABQ5fZnVuZGluZ1BlcmlvZAYJAGcCAAAFEF9pbml0TWFyZ2luUmF0aW8GCQBnAgAABQRfbW1yBgkAZwIAAAUUX2xpcXVpZGF0aW9uRmVlUmF0aW8GCQBnAgAABQRfZmVlBgkAZwIAAAUMX3NwcmVhZExpbWl0BgkAZwIAAAUPX21heFByaWNlSW1wYWN0BgkAZwIAAAUYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBgkAZwIAAAUPX21heFByaWNlU3ByZWFkBgkBC2luaXRpYWxpemVkAAkAAgECHUludmFsaWQgaW5pdGlhbGl6ZSBwYXJhbWV0ZXJzCQDOCAIJAM4IAgkAzggCCQDOCAIJAQl1cGRhdGVBbW0HBQdfcXRBc3RSBQdfYnNBc3RSAAAAAAAAAAAAAAkBDnVwZGF0ZVNldHRpbmdzCQUQX2luaXRNYXJnaW5SYXRpbwUEX21tcgUUX2xpcXVpZGF0aW9uRmVlUmF0aW8FDl9mdW5kaW5nUGVyaW9kBQRfZmVlBQxfc3ByZWFkTGltaXQFD19tYXhQcmljZUltcGFjdAUYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBQ9fbWF4UHJpY2VTcHJlYWQJAQ11cGRhdGVGdW5kaW5nBQkAZAIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQ5fZnVuZGluZ1BlcmlvZAAAAAAAAAAACQENdXBkYXRlQmFsYW5jZQEAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUNa19pbml0aWFsaXplZAYJAMwIAgkBC1N0cmluZ0VudHJ5AgUFa19vcmEFB19vcmFjbGUJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa19vcmFfa2V5BQpfb3JhY2xlS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtfY29vcmRpbmF0b3JBZGRyZXNzBQxfY29vcmRpbmF0b3IFA25pbAFpARJzZXRJbml0TWFyZ2luUmF0aW8BEF9pbml0TWFyZ2luUmF0aW8DAwkAZwIAAAUQX2luaXRNYXJnaW5SYXRpbwYJAQEhAQkBC2luaXRpYWxpemVkAAkAAgECJUludmFsaWQgc2V0SW5pdE1hcmdpblJhdGlvIHBhcmFtZXRlcnMJAQ51cGRhdGVTZXR0aW5ncwkFEF9pbml0TWFyZ2luUmF0aW8JARZtYWludGVuYW5jZU1hcmdpblJhdGlvAAkBE2xpcXVpZGF0aW9uRmVlUmF0aW8ACQEQZnVuZGluZ1BlcmlvZFJhdwAJAQNmZWUACQELc3ByZWFkTGltaXQACQEObWF4UHJpY2VJbXBhY3QACQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ACQEObWF4UHJpY2VTcHJlYWQAAWkBEGRlY3JlYXNlUG9zaXRpb24DB19hbW91bnQJX2xldmVyYWdlE19taW5CYXNlQXNzZXRBbW91bnQDAwMDAwkAZwIAAAUHX2Ftb3VudAYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQEhAQkBFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8DCQEEZGl2ZAIFDERFQ0lNQUxfVU5JVAUJX2xldmVyYWdlCQEPaW5pdE1hcmdpblJhdGlvAAYGCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAQkApQgBCAUBaQZjYWxsZXIGCQEGcGF1c2VkAAkAAgECI0ludmFsaWQgZGVjcmVhc2VQb3NpdGlvbiBwYXJhbWV0ZXJzBA0kdDAzNzMzMTM3NDgzCQELZ2V0UG9zaXRpb24BCQClCAEIBQFpBmNhbGxlcgQPb2xkUG9zaXRpb25TaXplCAUNJHQwMzczMzEzNzQ4MwJfMQQRb2xkUG9zaXRpb25NYXJnaW4IBQ0kdDAzNzMzMTM3NDgzAl8yBBdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDM3MzMxMzc0ODMCXzMEFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwMzczMzEzNzQ4MwJfNAQKX2RpcmVjdGlvbgMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAUJRElSX1NIT1JUBQhESVJfTE9ORwQFaXNBZGQJAAACBQpfZGlyZWN0aW9uBQhESVJfTE9ORwQMb3Blbk5vdGlvbmFsCQEEbXVsZAIFB19hbW91bnQFCV9sZXZlcmFnZQQNJHQwMzc2NTYzNzc3MgkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAgkApQgBCAUBaQZjYWxsZXIFD1BOTF9PUFRJT05fU1BPVAQTb2xkUG9zaXRpb25Ob3Rpb25hbAgFDSR0MDM3NjU2Mzc3NzICXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDAzNzY1NjM3NzcyAl8yBA0kdDAzNzc3ODQwMzI3AwkAZgIFE29sZFBvc2l0aW9uTm90aW9uYWwFDG9wZW5Ob3Rpb25hbAQNJHQwMzgxNTUzODM3NAkBCXN3YXBJbnB1dAIFBWlzQWRkBQxvcGVuTm90aW9uYWwEFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQgFDSR0MDM4MTU1MzgzNzQCXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAzODE1NTM4Mzc0Al8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAzODE1NTM4Mzc0Al8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwMzgxNTUzODM3NAJfNAQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDAzODE1NTM4Mzc0Al81BBhleGNoYW5nZWRQb3NpdGlvblNpemVBYnMJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUDAwkBAiE9AgUTX21pbkJhc2VBc3NldEFtb3VudAAACQBmAgUTX21pbkJhc2VBc3NldEFtb3VudAUYZXhjaGFuZ2VkUG9zaXRpb25TaXplQWJzBwkAAgEJAKwCAgkArAICCQCsAgICJVRvbyBsaXR0bGUgYmFzZSBhc3NldCBleGNoYW5nZWQsIGdvdCAJAKQDAQUYZXhjaGFuZ2VkUG9zaXRpb25TaXplQWJzAgogZXhwZWN0ZWQgCQCkAwEFE19taW5CYXNlQXNzZXRBbW91bnQEC3JlYWxpemVkUG5sCQEEZGl2ZAIJAQRtdWxkAgUNdW5yZWFsaXplZFBubAUYZXhjaGFuZ2VkUG9zaXRpb25TaXplQWJzCQEDYWJzAQUPb2xkUG9zaXRpb25TaXplBA0kdDAzODgxMTM5MDU2CQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQFD29sZFBvc2l0aW9uU2l6ZQURb2xkUG9zaXRpb25NYXJnaW4FFG9sZFBvc2l0aW9uTHN0VXBkQ1BGBQtyZWFsaXplZFBubAQMcmVtYWluTWFyZ2luCAUNJHQwMzg4MTEzOTA1NgJfMQQHYmFkRGVidAgFDSR0MDM4ODExMzkwNTYCXzIEDmZ1bmRpbmdQYXltZW50CAUNJHQwMzg4MTEzOTA1NgJfMwQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUMb3Blbk5vdGlvbmFsBBJ1bnJlYWxpemVkUG5sQWZ0ZXIJAGUCBQ11bnJlYWxpemVkUG5sBQtyZWFsaXplZFBubAQScmVtYWluT3Blbk5vdGlvbmFsAwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAACQBlAgkAZQIFE29sZFBvc2l0aW9uTm90aW9uYWwFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQFEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIJAGQCBRJ1bnJlYWxpemVkUG5sQWZ0ZXIFE29sZFBvc2l0aW9uTm90aW9uYWwFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQED25ld1Bvc2l0aW9uU2l6ZQkAZAIFD29sZFBvc2l0aW9uU2l6ZQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplCQCdCgsFD25ld1Bvc2l0aW9uU2l6ZQUMcmVtYWluTWFyZ2luCQEDYWJzAQUScmVtYWluT3Blbk5vdGlvbmFsCQEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEFD25ld1Bvc2l0aW9uU2l6ZQUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgkAZQIJARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAFDG9wZW5Ob3Rpb25hbAkAZQIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAACQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAGUCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQBmAgAABQ9uZXdQb3NpdGlvblNpemUJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUAAAkAAgECFENsb3NlIHBvc2l0aW9uIGZpcnN0BA9uZXdQb3NpdGlvblNpemUIBQ0kdDAzNzc3ODQwMzI3Al8xBBduZXdQb3NpdGlvblJlbWFpbk1hcmdpbggFDSR0MDM3Nzc4NDAzMjcCXzIEF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwMzc3Nzg0MDMyNwJfMwQUbmV3UG9zaXRpb25MYXRlc3RDUEYIBQ0kdDAzNzc3ODQwMzI3Al80BBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAzNzc3ODQwMzI3Al81BBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzc3Nzg0MDMyNwJfNgQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDM3Nzc4NDAzMjcCXzcEF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUNJHQwMzc3Nzg0MDMyNwJfOAQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcggFDSR0MDM3Nzc4NDAzMjcCXzkEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwMzc3Nzg0MDMyNwNfMTAED3RvdGFsU2hvcnRBZnRlcggFDSR0MDM3Nzc4NDAzMjcDXzExBA5ub3RpZnlOb3Rpb25hbAkA/AcECQEMbWluZXJBZGRyZXNzAAIObm90aWZ5Tm90aW9uYWwJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFA25pbAUDbmlsAwkAAAIFDm5vdGlmeU5vdGlvbmFsBQ5ub3RpZnlOb3Rpb25hbAkAzggCCQEOdXBkYXRlUG9zaXRpb24FCQClCAEIBQFpBmNhbGxlcgUPbmV3UG9zaXRpb25TaXplBRduZXdQb3NpdGlvblJlbWFpbk1hcmdpbgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFFG5ld1Bvc2l0aW9uTGF0ZXN0Q1BGCQEJdXBkYXRlQW1tBwUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBpbmNyZWFzZVBvc2l0aW9uBApfZGlyZWN0aW9uCV9sZXZlcmFnZRNfbWluQmFzZUFzc2V0QW1vdW50CF9yZWZMaW5rBApfcmF3QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAMDAwMDAwMJAQIhPQIFCl9kaXJlY3Rpb24FCERJUl9MT05HCQECIT0CBQpfZGlyZWN0aW9uBQlESVJfU0hPUlQHBgkAZwIAAAUKX3Jhd0Ftb3VudAYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkBCnF1b3RlQXNzZXQABgkBASEBCQEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMJAQRkaXZkAgUMREVDSU1BTF9VTklUBQlfbGV2ZXJhZ2UJAQ9pbml0TWFyZ2luUmF0aW8ABgYJAQZwYXVzZWQACQACAQIjSW52YWxpZCBpbmNyZWFzZVBvc2l0aW9uIHBhcmFtZXRlcnMEB190cmFkZXIJAKUIAQgFAWkGY2FsbGVyBAxyYXdGZWVBbW91bnQJAQRtdWxkAgUKX3Jhd0Ftb3VudAkBA2ZlZQAEDnJlZmVycmVyRmVlQW55CQD8BwQJAQ9yZWZlcnJhbEFkZHJlc3MAAhVhY2NlcHRQYXltZW50V2l0aExpbmsJAMwIAgUHX3RyYWRlcgkAzAgCBQhfcmVmTGluawUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFDHJhd0ZlZUFtb3VudAUDbmlsAwkAAAIFDnJlZmVycmVyRmVlQW55BQ5yZWZlcnJlckZlZUFueQQLcmVmZXJyZXJGZWUEByRtYXRjaDAFDnJlZmVycmVyRmVlQW55AwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAkAAgECE0ludmFsaWQgcmVmZXJyZXJGZWUEB19hbW91bnQJAGUCBQpfcmF3QW1vdW50BQxyYXdGZWVBbW91bnQECWZlZUFtb3VudAkAZQIFDHJhd0ZlZUFtb3VudAULcmVmZXJyZXJGZWUEDSR0MDQxODU2NDE5OTYJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDQxODU2NDE5OTYCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNDE4NTY0MTk5NgJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA0MTg1NjQxOTk2Al8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDQxODU2NDE5OTYCXzQEDWlzTmV3UG9zaXRpb24JAAACBQ9vbGRQb3NpdGlvblNpemUAAAQPaXNTYW1lRGlyZWN0aW9uAwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAACQAAAgUKX2RpcmVjdGlvbgUIRElSX0xPTkcJAAACBQpfZGlyZWN0aW9uBQlESVJfU0hPUlQEDmV4cGFuZEV4aXN0aW5nAwkBASEBBQ1pc05ld1Bvc2l0aW9uBQ9pc1NhbWVEaXJlY3Rpb24HBAVpc0FkZAkAAAIFCl9kaXJlY3Rpb24FCERJUl9MT05HBA0kdDA0MjI4NTQ0ODUzAwMFDWlzTmV3UG9zaXRpb24GBQ5leHBhbmRFeGlzdGluZwQMb3Blbk5vdGlvbmFsCQEEbXVsZAIFB19hbW91bnQFCV9sZXZlcmFnZQQNJHQwNDI3MDk0MjkxNQkBCXN3YXBJbnB1dAIFBWlzQWRkBQxvcGVuTm90aW9uYWwEFWFtb3VudEJhc2VBc3NldEJvdWdodAgFDSR0MDQyNzA5NDI5MTUCXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA0MjcwOTQyOTE1Al8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA0MjcwOTQyOTE1Al8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNDI3MDk0MjkxNQJfNAQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDA0MjcwOTQyOTE1Al81AwMJAQIhPQIFE19taW5CYXNlQXNzZXRBbW91bnQAAAkAZgIFE19taW5CYXNlQXNzZXRBbW91bnQJAQNhYnMBBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQHCQACAQkArAICCQCsAgIJAKwCAgINTGltaXQgZXJyb3I6IAkApAMBCQEDYWJzAQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AgMgPCAJAKQDAQUTX21pbkJhc2VBc3NldEFtb3VudAQPbmV3UG9zaXRpb25TaXplCQBkAgUPb2xkUG9zaXRpb25TaXplBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQEGWluY3JlYXNlTWFyZ2luUmVxdWlyZW1lbnQJAQRkaXZkAgUMb3Blbk5vdGlvbmFsBQlfbGV2ZXJhZ2UEDSR0MDQzMjk2NDM1MzUJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFGWluY3JlYXNlTWFyZ2luUmVxdWlyZW1lbnQEDHJlbWFpbk1hcmdpbggFDSR0MDQzMjk2NDM1MzUCXzEEAngxCAUNJHQwNDMyOTY0MzUzNQJfMgQCeDIIBQ0kdDA0MzI5NjQzNTM1Al8zAwkBASEBCQEZcmVxdWlyZU5vdE92ZXJTcHJlYWRMaW1pdAIFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgkAAgECFU92ZXIgbWF4IHNwcmVhZCBsaW1pdAkAnQoLBQ9uZXdQb3NpdGlvblNpemUFDHJlbWFpbk1hcmdpbgkAZAIFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPbmV3UG9zaXRpb25TaXplBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCQBkAgkBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAUMb3Blbk5vdGlvbmFsCQBkAgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQADCQBmAgUPbmV3UG9zaXRpb25TaXplAAAJAQNhYnMBBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQAAAkAZAIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAMJAGYCAAAFD25ld1Bvc2l0aW9uU2l6ZQkBA2FicwEFFWFtb3VudEJhc2VBc3NldEJvdWdodAAABAxvcGVuTm90aW9uYWwJAQRtdWxkAgUHX2Ftb3VudAUJX2xldmVyYWdlBA0kdDA0NDU0NjQ0NjYyCQEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCCQClCAEIBQFpBmNhbGxlcgUPUE5MX09QVElPTl9TUE9UBBNvbGRQb3NpdGlvbk5vdGlvbmFsCAUNJHQwNDQ1NDY0NDY2MgJfMQQNdW5yZWFsaXplZFBubAgFDSR0MDQ0NTQ2NDQ2NjICXzIDCQBmAgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUMb3Blbk5vdGlvbmFsCQACAQIuVXNlIGRlY3JlYXNlUG9zaXRpb24gdG8gZGVjcmVhc2UgcG9zaXRpb24gc2l6ZQkAAgECFENsb3NlIHBvc2l0aW9uIGZpcnN0BA9uZXdQb3NpdGlvblNpemUIBQ0kdDA0MjI4NTQ0ODUzAl8xBBduZXdQb3NpdGlvblJlbWFpbk1hcmdpbggFDSR0MDQyMjg1NDQ4NTMCXzIEF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwNDIyODU0NDg1MwJfMwQUbmV3UG9zaXRpb25MYXRlc3RDUEYIBQ0kdDA0MjI4NTQ0ODUzAl80BBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA0MjI4NTQ0ODUzAl81BBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNDIyODU0NDg1MwJfNgQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDQyMjg1NDQ4NTMCXzcEF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUNJHQwNDIyODU0NDg1MwJfOAQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcggFDSR0MDQyMjg1NDQ4NTMCXzkEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwNDIyODU0NDg1MwNfMTAED3RvdGFsU2hvcnRBZnRlcggFDSR0MDQyMjg1NDQ4NTMDXzExBAxmZWVUb1N0YWtlcnMJAGkCBQlmZWVBbW91bnQAAgQOZmVlVG9JbnN1cmFuY2UJAGUCBQlmZWVBbW91bnQFDGZlZVRvU3Rha2VycwQFc3Rha2UJAPwHBAkBEXF1b3RlQXNzZXRTdGFraW5nAAIObG9ja05ldXRyaW5vU1AJAMwIAgkApQgBCQEOc3Rha2luZ0FkZHJlc3MACQDMCAIFCEFMTF9GRUVTBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUHX2Ftb3VudAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQQQZGVwb3NpdEluc3VyYW5jZQkA/AcECQEQaW5zdXJhbmNlQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ5mZWVUb0luc3VyYW5jZQUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UECW5vdGlmeUZlZQkA/AcECQEMbWluZXJBZGRyZXNzAAIKbm90aWZ5RmVlcwkAzAgCBQdfdHJhZGVyCQDMCAIFCWZlZUFtb3VudAUDbmlsBQNuaWwDCQAAAgUJbm90aWZ5RmVlBQlub3RpZnlGZWUEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUFB190cmFkZXIFD25ld1Bvc2l0aW9uU2l6ZQUXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4FF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRRuZXdQb3NpdGlvbkxhdGVzdENQRgkBCXVwZGF0ZUFtbQcFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIFGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIFDnRvdGFsTG9uZ0FmdGVyBQ90b3RhbFNob3J0QWZ0ZXIJAQt0cmFuc2ZlckZlZQEFDGZlZVRvU3Rha2VycwkBDXVwZGF0ZUJhbGFuY2UBCQBkAgkBCGNiYWxhbmNlAAUHX2Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlhZGRNYXJnaW4ABApfcmF3QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAMDAwMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkBCnF1b3RlQXNzZXQABgkBASEBCQETcmVxdWlyZU9wZW5Qb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAJAAIBAhxJbnZhbGlkIGFkZE1hcmdpbiBwYXJhbWV0ZXJzBAdfdHJhZGVyCQClCAEIBQFpBmNhbGxlcgQMcmF3RmVlQW1vdW50CQEEbXVsZAIFCl9yYXdBbW91bnQJAQNmZWUABA5yZWZlcnJlckZlZUFueQkA/AcECQEPcmVmZXJyYWxBZGRyZXNzAAINYWNjZXB0UGF5bWVudAkAzAgCBQdfdHJhZGVyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUMcmF3RmVlQW1vdW50BQNuaWwDCQAAAgUOcmVmZXJyZXJGZWVBbnkFDnJlZmVycmVyRmVlQW55BAtyZWZlcnJlckZlZQQHJG1hdGNoMAUOcmVmZXJyZXJGZWVBbnkDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4CQACAQITSW52YWxpZCByZWZlcnJlckZlZQQJZmVlQW1vdW50CQBlAgUMcmF3RmVlQW1vdW50BQtyZWZlcnJlckZlZQQHX2Ftb3VudAkAZQIFCl9yYXdBbW91bnQFDHJhd0ZlZUFtb3VudAQNJHQwNDY3NDY0Njg4NgkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQPb2xkUG9zaXRpb25TaXplCAUNJHQwNDY3NDY0Njg4NgJfMQQRb2xkUG9zaXRpb25NYXJnaW4IBQ0kdDA0Njc0NjQ2ODg2Al8yBBdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDQ2NzQ2NDY4ODYCXzMEFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNDY3NDY0Njg4NgJfNAQMZmVlVG9TdGFrZXJzCQBpAgUJZmVlQW1vdW50AAIEDmZlZVRvSW5zdXJhbmNlCQBlAgUJZmVlQW1vdW50BQxmZWVUb1N0YWtlcnMEBXN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDmxvY2tOZXV0cmlub1NQCQDMCAIJAKUIAQkBDnN0YWtpbmdBZGRyZXNzAAkAzAgCBQhBTExfRkVFUwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFB19hbW91bnQFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UEEGRlcG9zaXRJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgdkZXBvc2l0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUOZmVlVG9JbnN1cmFuY2UFA25pbAMJAAACBRBkZXBvc2l0SW5zdXJhbmNlBRBkZXBvc2l0SW5zdXJhbmNlBAlub3RpZnlGZWUJAPwHBAkBDG1pbmVyQWRkcmVzcwACCm5vdGlmeUZlZXMJAMwIAgUHX3RyYWRlcgkAzAgCBQlmZWVBbW91bnQFA25pbAUDbmlsAwkAAAIFCW5vdGlmeUZlZQUJbm90aWZ5RmVlCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQUHX3RyYWRlcgUPb2xkUG9zaXRpb25TaXplCQBkAgURb2xkUG9zaXRpb25NYXJnaW4FB19hbW91bnQFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsBRRvbGRQb3NpdGlvbkxzdFVwZENQRgkBC3RyYW5zZmVyRmVlAQUMZmVlVG9TdGFrZXJzCQENdXBkYXRlQmFsYW5jZQEJAGQCCQEIY2JhbGFuY2UABQdfYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHJlbW92ZU1hcmdpbgEHX2Ftb3VudAMDAwMJAGcCAAAFB19hbW91bnQGCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAQkApQgBCAUBaQZjYWxsZXIGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAkAAgECH0ludmFsaWQgcmVtb3ZlTWFyZ2luIHBhcmFtZXRlcnMEDSR0MDQ3OTExNDgwNjMJAQtnZXRQb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyBA9vbGRQb3NpdGlvblNpemUIBQ0kdDA0NzkxMTQ4MDYzAl8xBBFvbGRQb3NpdGlvbk1hcmdpbggFDSR0MDQ3OTExNDgwNjMCXzIEF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwNDc5MTE0ODA2MwJfMwQUb2xkUG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDA0NzkxMTQ4MDYzAl80BAttYXJnaW5EZWx0YQkBAS0BBQdfYW1vdW50BA0kdDA0ODEwMDQ4Mjc5CQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQFD29sZFBvc2l0aW9uU2l6ZQURb2xkUG9zaXRpb25NYXJnaW4FFG9sZFBvc2l0aW9uTHN0VXBkQ1BGBQttYXJnaW5EZWx0YQQMcmVtYWluTWFyZ2luCAUNJHQwNDgxMDA0ODI3OQJfMQQHYmFkRGVidAgFDSR0MDQ4MTAwNDgyNzkCXzIDCQECIT0CBQdiYWREZWJ0AAAJAAIBAh1JbnZhbGlkIHJlbW92ZWQgbWFyZ2luIGFtb3VudAQLbWFyZ2luUmF0aW8JAQ9jYWxjTWFyZ2luUmF0aW8DBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsAwkBASEBCQEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMFC21hcmdpblJhdGlvCQEPaW5pdE1hcmdpblJhdGlvAAYJAAIBCQCsAgIJAKwCAgkArAICAhlUb28gbXVjaCBtYXJnaW4gcmVtb3ZlZDogCQCkAwEFC21hcmdpblJhdGlvAgMgPCAJAKQDAQkBD2luaXRNYXJnaW5SYXRpbwAEB3Vuc3Rha2UJAPwHBAkBEXF1b3RlQXNzZXRTdGFraW5nAAIOdW5sb2NrTmV1dHJpbm8JAMwIAgUHX2Ftb3VudAkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUJAKUIAQgFAWkGY2FsbGVyBQ9vbGRQb3NpdGlvblNpemUFDHJlbWFpbk1hcmdpbgUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPb2xkUG9zaXRpb25TaXplCQEId2l0aGRyYXcCCAUBaQZjYWxsZXIFB19hbW91bnQJAQ11cGRhdGVCYWxhbmNlAQkAZQIJAQhjYmFsYW5jZQAFB19hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENY2xvc2VQb3NpdGlvbgAEBmNhbGxlcgkBD2dldEFjdHVhbENhbGxlcgEFAWkEDWNhbGxlckFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQZjYWxsZXICDkludmFsaWQgY2FsbGVyAwMDCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAQUGY2FsbGVyBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAJAAIBAiBJbnZhbGlkIGNsb3NlUG9zaXRpb24gcGFyYW1ldGVycwQNJHQwNDk0ODI0OTg1OQkBFWludGVybmFsQ2xvc2VQb3NpdGlvbgIFBmNhbGxlcgYEAngxCAUNJHQwNDk0ODI0OTg1OQJfMQQPcG9zaXRpb25CYWREZWJ0CAUNJHQwNDk0ODI0OTg1OQJfMgQLcmVhbGl6ZWRQbmwIBQ0kdDA0OTQ4MjQ5ODU5Al8zBA1tYXJnaW5Ub1ZhdWx0CAUNJHQwNDk0ODI0OTg1OQJfNAQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDQ5NDgyNDk4NTkCXzUEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDQ5NDgyNDk4NTkCXzYEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA0OTQ4MjQ5ODU5Al83BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDQ5NDgyNDk4NTkCXzgEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDA0OTQ4MjQ5ODU5Al85BAJ4MggFDSR0MDQ5NDgyNDk4NTkDXzEwBA50b3RhbExvbmdBZnRlcggFDSR0MDQ5NDgyNDk4NTkDXzExBA90b3RhbFNob3J0QWZ0ZXIIBQ0kdDA0OTQ4MjQ5ODU5A18xMgMJAGYCBQ9wb3NpdGlvbkJhZERlYnQAAAkAAgECJlVuYWJsZSB0byBjbG9zZSBwb3NpdGlvbiB3aXRoIGJhZCBkZWJ0BA53aXRoZHJhd0Ftb3VudAkBA2FicwEFDW1hcmdpblRvVmF1bHQECmFtbUJhbGFuY2UJAGUCCQEIY2JhbGFuY2UABQ53aXRoZHJhd0Ftb3VudAQNJHQwNTAwNjg1MDIxMAMJAGYCAAAFCmFtbUJhbGFuY2UJAJQKAgAACQEDYWJzAQUKYW1tQmFsYW5jZQkAlAoCBQphbW1CYWxhbmNlAAAEDWFtbU5ld0JhbGFuY2UIBQ0kdDA1MDA2ODUwMjEwAl8xBBBnZXRGcm9tSW5zdXJhbmNlCAUNJHQwNTAwNjg1MDIxMAJfMgQBeAMJAGYCBRBnZXRGcm9tSW5zdXJhbmNlAAAEEXdpdGhkcmF3SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgUQZ2V0RnJvbUluc3VyYW5jZQUDbmlsBQNuaWwDCQAAAgURd2l0aGRyYXdJbnN1cmFuY2UFEXdpdGhkcmF3SW5zdXJhbmNlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQF4BQF4BAd1bnN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDnVubG9ja05ldXRyaW5vCQDMCAIJAGUCBQ53aXRoZHJhd0Ftb3VudAUQZ2V0RnJvbUluc3VyYW5jZQkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIFBmNhbGxlcgkAzAgCAAAFA25pbAUDbmlsAwkAAAIFDm5vdGlmeU5vdGlvbmFsBQ5ub3RpZnlOb3Rpb25hbAkAzggCCQDOCAIJAM4IAgkBDmRlbGV0ZVBvc2l0aW9uAQUGY2FsbGVyCQEJdXBkYXRlQW1tBwUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgkBCHdpdGhkcmF3AgUNY2FsbGVyQWRkcmVzcwUOd2l0aGRyYXdBbW91bnQJAQ11cGRhdGVCYWxhbmNlAQUNYW1tTmV3QmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlsaXF1aWRhdGUBB190cmFkZXIED3Nwb3RNYXJnaW5SYXRpbwkBFmdldE1hcmdpblJhdGlvQnlPcHRpb24CBQdfdHJhZGVyBQ9QTkxfT1BUSU9OX1NQT1QEC21hcmdpblJhdGlvAwkBFmlzT3ZlckZsdWN0dWF0aW9uTGltaXQABBFvcmFjbGVNYXJnaW5SYXRpbwkBFmdldE1hcmdpblJhdGlvQnlPcHRpb24CBQdfdHJhZGVyBRFQTkxfT1BUSU9OX09SQUNMRQkBBHZtYXgCBQ9zcG90TWFyZ2luUmF0aW8FEW9yYWNsZU1hcmdpblJhdGlvBQ9zcG90TWFyZ2luUmF0aW8DAwMDCQEBIQEJARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwULbWFyZ2luUmF0aW8JARZtYWludGVuYW5jZU1hcmdpblJhdGlvAAcGCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAQUHX3RyYWRlcgYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQACQACAQITVW5hYmxlIHRvIGxpcXVpZGF0ZQMDAwkAZgIFD3Nwb3RNYXJnaW5SYXRpbwkBE2xpcXVpZGF0aW9uRmVlUmF0aW8ACQBmAgkBF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAAABwkAZgIFDERFQ0lNQUxfVU5JVAkBF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAcEDSR0MDUyMjkwNTI0NDAJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDUyMjkwNTI0NDACXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNTIyOTA1MjQ0MAJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA1MjI5MDUyNDQwAl8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDUyMjkwNTI0NDACXzQECl9kaXJlY3Rpb24DCQBmAgUPb2xkUG9zaXRpb25TaXplAAAFCURJUl9TSE9SVAUIRElSX0xPTkcEBWlzQWRkCQAAAgUKX2RpcmVjdGlvbgUIRElSX0xPTkcEGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQJARtnZXRQYXJ0aWFsTGlxdWlkYXRpb25BbW91bnQCBQdfdHJhZGVyBQ9vbGRQb3NpdGlvblNpemUEDSR0MDUyNjY1NTI3NjkJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAQTb2xkUG9zaXRpb25Ob3Rpb25hbAgFDSR0MDUyNjY1NTI3NjkCXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDA1MjY2NTUyNzY5Al8yBA0kdDA1Mjc3NzUzMDY3CQEJc3dhcElucHV0AgUFaXNBZGQFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQEFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQgFDSR0MDUyNzc3NTMwNjcCXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA1Mjc3NzUzMDY3Al8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA1Mjc3NzUzMDY3Al8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNTI3Nzc1MzA2NwJfNAQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDA1Mjc3NzUzMDY3Al81BAtyZWFsaXplZFBubAkBBGRpdmQCCQEEbXVsZAIFDXVucmVhbGl6ZWRQbmwJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUJAQNhYnMBBQ9vbGRQb3NpdGlvblNpemUEDSR0MDUzMTc0NTM0MDcJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFC3JlYWxpemVkUG5sBAxyZW1haW5NYXJnaW4IBQ0kdDA1MzE3NDUzNDA3Al8xBAdiYWREZWJ0CAUNJHQwNTMxNzQ1MzQwNwJfMgQOZnVuZGluZ1BheW1lbnQIBQ0kdDA1MzE3NDUzNDA3Al8zBBJ1bnJlYWxpemVkUG5sQWZ0ZXIJAGUCBQ11bnJlYWxpemVkUG5sBQtyZWFsaXplZFBubAQScmVtYWluT3Blbk5vdGlvbmFsAwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAACQBlAgkAZQIFE29sZFBvc2l0aW9uTm90aW9uYWwFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQFEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIJAGQCBRJ1bnJlYWxpemVkUG5sQWZ0ZXIFE29sZFBvc2l0aW9uTm90aW9uYWwFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQEEmxpcXVpZGF0aW9uUGVuYWx0eQkBBG11bGQCBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CQETbGlxdWlkYXRpb25GZWVSYXRpbwAED2ZlZVRvTGlxdWlkYXRvcgkAaQIFEmxpcXVpZGF0aW9uUGVuYWx0eQACBA5mZWVUb0luc3VyYW5jZQkAZQIFEmxpcXVpZGF0aW9uUGVuYWx0eQUPZmVlVG9MaXF1aWRhdG9yBBFuZXdQb3NpdGlvbk1hcmdpbgkAZQIFDHJlbWFpbk1hcmdpbgUSbGlxdWlkYXRpb25QZW5hbHR5BA9uZXdQb3NpdGlvblNpemUJAGQCBQ9vbGRQb3NpdGlvblNpemUFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQQXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwJAQNhYnMBBRJyZW1haW5PcGVuTm90aW9uYWwEFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCQEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEFD25ld1Bvc2l0aW9uU2l6ZQQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgkAZQIJARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQECmFtbUJhbGFuY2UJAGUCCQEIY2JhbGFuY2UABRJsaXF1aWRhdGlvblBlbmFsdHkEDSR0MDU0NTgwNTQ3MjMDCQBmAgAABQphbW1CYWxhbmNlCQCUCgIAAAkBA2FicwEFCmFtbUJhbGFuY2UJAJQKAgUKYW1tQmFsYW5jZQAABA1uZXdBbW1CYWxhbmNlCAUNJHQwNTQ1ODA1NDcyMwJfMQQRdGFrZUZyb21JbnN1cmFuY2UIBQ0kdDA1NDU4MDU0NzIzAl8yBAF4AwkAZgIFEXRha2VGcm9tSW5zdXJhbmNlAAAEEXdpdGhkcmF3SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgURdGFrZUZyb21JbnN1cmFuY2UFA25pbAUDbmlsAwkAAAIFEXdpdGhkcmF3SW5zdXJhbmNlBRF3aXRoZHJhd0luc3VyYW5jZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUBeAUBeAQHdW5zdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg51bmxvY2tOZXV0cmlubwkAzAgCCQBlAgUSbGlxdWlkYXRpb25QZW5hbHR5BRF0YWtlRnJvbUluc3VyYW5jZQkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQQQZGVwb3NpdEluc3VyYW5jZQkA/AcECQEQaW5zdXJhbmNlQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ5mZWVUb0luc3VyYW5jZQUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUFB190cmFkZXIFD25ld1Bvc2l0aW9uU2l6ZQURbmV3UG9zaXRpb25NYXJnaW4FF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRRuZXdQb3NpdGlvbkxzdFVwZENQRgkBCXVwZGF0ZUFtbQcFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIFGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIJAGUCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMJAGYCBQ9uZXdQb3NpdGlvblNpemUAAAkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQAACQBlAgkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUAAwkAZgIAAAUPbmV3UG9zaXRpb25TaXplCQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAQh3aXRoZHJhdwIIBQFpBmNhbGxlcgUPZmVlVG9MaXF1aWRhdG9yCQENdXBkYXRlQmFsYW5jZQEFDW5ld0FtbUJhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDU2MTc5NTY2MzQJARVpbnRlcm5hbENsb3NlUG9zaXRpb24CBQdfdHJhZGVyBwQCeDEIBQ0kdDA1NjE3OTU2NjM0Al8xBAdiYWREZWJ0CAUNJHQwNTYxNzk1NjYzNAJfMgQCeDIIBQ0kdDA1NjE3OTU2NjM0Al8zBAJ4MwgFDSR0MDU2MTc5NTY2MzQCXzQEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA1NjE3OTU2NjM0Al81BBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA1NjE3OTU2NjM0Al82BBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNTYxNzk1NjYzNAJfNwQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDA1NjE3OTU2NjM0Al84BBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCAUNJHQwNTYxNzk1NjYzNAJfOQQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFDSR0MDU2MTc5NTY2MzQDXzEwBA50b3RhbExvbmdBZnRlcggFDSR0MDU2MTc5NTY2MzQDXzExBA90b3RhbFNob3J0QWZ0ZXIIBQ0kdDA1NjE3OTU2NjM0A18xMgQSbGlxdWlkYXRpb25QZW5hbHR5CQEEbXVsZAIFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQJARNsaXF1aWRhdGlvbkZlZVJhdGlvAAQPZmVlVG9MaXF1aWRhdG9yCQBpAgUSbGlxdWlkYXRpb25QZW5hbHR5AAIEDmZlZVRvSW5zdXJhbmNlCQBlAgUSbGlxdWlkYXRpb25QZW5hbHR5BQ9mZWVUb0xpcXVpZGF0b3IECmFtbUJhbGFuY2UJAGUCCQEIY2JhbGFuY2UABRJsaXF1aWRhdGlvblBlbmFsdHkEDSR0MDU3MDQ2NTcxODkDCQBmAgAABQphbW1CYWxhbmNlCQCUCgIAAAkBA2FicwEFCmFtbUJhbGFuY2UJAJQKAgUKYW1tQmFsYW5jZQAABA1uZXdBbW1CYWxhbmNlCAUNJHQwNTcwNDY1NzE4OQJfMQQRdGFrZUZyb21JbnN1cmFuY2UIBQ0kdDA1NzA0NjU3MTg5Al8yBAF4AwkAZgIFEXRha2VGcm9tSW5zdXJhbmNlAAAEEXdpdGhkcmF3SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgURdGFrZUZyb21JbnN1cmFuY2UFA25pbAUDbmlsAwkAAAIFEXdpdGhkcmF3SW5zdXJhbmNlBRF3aXRoZHJhd0luc3VyYW5jZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUBeAUBeAQHdW5zdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg51bmxvY2tOZXV0cmlubwkAzAgCCQBlAgUSbGlxdWlkYXRpb25QZW5hbHR5BRF0YWtlRnJvbUluc3VyYW5jZQkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQQQZGVwb3NpdEluc3VyYW5jZQkA/AcECQEQaW5zdXJhbmNlQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ5mZWVUb0luc3VyYW5jZQUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUObm90aWZ5Tm90aW9uYWwFDm5vdGlmeU5vdGlvbmFsCQDOCAIJAM4IAgkAzggCCQEOZGVsZXRlUG9zaXRpb24BBQdfdHJhZGVyCQEJdXBkYXRlQW1tBwUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgkBCHdpdGhkcmF3AggFAWkGY2FsbGVyBQ9mZWVUb0xpcXVpZGF0b3IJAQ11cGRhdGVCYWxhbmNlAQUNbmV3QW1tQmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpwYXlGdW5kaW5nAAQVZnVuZGluZ0Jsb2NrVGltZXN0YW1wCQEZbmV4dEZ1bmRpbmdCbG9ja1RpbWVzdGFtcAADAwMJAGYCBRVmdW5kaW5nQmxvY2tUaW1lc3RhbXAIBQlsYXN0QmxvY2sJdGltZXN0YW1wBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAJAAIBCQCsAgIJAKwCAgkArAICAiFJbnZhbGlkIGZ1bmRpbmcgYmxvY2sgdGltZXN0YW1wOiAJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXACAyA8IAkApAMBBRVmdW5kaW5nQmxvY2tUaW1lc3RhbXAED3VuZGVybHlpbmdQcmljZQkBEmdldE9yYWNsZVR3YXBQcmljZQAEDSR0MDU4Njg0NTg3NDYJAQpnZXRGdW5kaW5nAAQUc2hvcnRQcmVtaXVtRnJhY3Rpb24IBQ0kdDA1ODY4NDU4NzQ2Al8xBBNsb25nUHJlbWl1bUZyYWN0aW9uCAUNJHQwNTg2ODQ1ODc0NgJfMgkBDXVwZGF0ZUZ1bmRpbmcFCQBkAgUVZnVuZGluZ0Jsb2NrVGltZXN0YW1wCQEUZnVuZGluZ1BlcmlvZFNlY29uZHMACQBkAgkBI2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAUTbG9uZ1ByZW1pdW1GcmFjdGlvbgkAZAIJASRsYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ABRRzaG9ydFByZW1pdW1GcmFjdGlvbgkBBGRpdmQCBRNsb25nUHJlbWl1bUZyYWN0aW9uBQ91bmRlcmx5aW5nUHJpY2UJAQRkaXZkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FD3VuZGVybHlpbmdQcmljZQFpAQ5mb3JjZU1vdmVBc3NldAIHX3RyYWRlcgdfYW1vdW50AwMJAQIhPQIJAKcIAQkBDmFkbWluUHVibGljS2V5AAgFAWkGY2FsbGVyBgkAZgIAAAUHX2Ftb3VudAkAAgECIUludmFsaWQgZm9yY2VNb3ZlQXNzZXQgcGFyYW1ldGVycwQHdW5zdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg51bmxvY2tOZXV0cmlubwkAzAgCBQdfYW1vdW50CQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlCQDOCAIJAQh3aXRoZHJhdwIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB190cmFkZXIFB19hbW91bnQJAQ11cGRhdGVCYWxhbmNlAQkAZQIJAQhjYmFsYW5jZQAFB19hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJYWRqdXN0UGVnAQZfcHJpY2UDAwkBAiE9AgkApwgBCQEOYWRtaW5QdWJsaWNLZXkACAUBaQZjYWxsZXIGCQBmAgAABQZfcHJpY2UJAAIBAhxJbnZhbGlkIGFkanVzdFBlZyBwYXJhbWV0ZXJzBA0kdDA1OTc0NjU5ODMyCQEQZ2V0UGVnQWRqdXN0Q29zdAEFBl9wcmljZQQUbmV3UXVvdGVBc3NldFJlc2VydmUIBQ0kdDA1OTc0NjU5ODMyAl8xBA1wZWdDaGFuZ2VDb3N0CAUNJHQwNTk3NDY1OTgzMgJfMgMJAAACBQ1wZWdDaGFuZ2VDb3N0AAAJAAIBAhFOb3RoaW5nIHRvIGFkanVzdAMJAGYCBQ1wZWdDaGFuZ2VDb3N0AAAEEXdpdGhkcmF3SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgUNcGVnQ2hhbmdlQ29zdAUDbmlsBQNuaWwDCQAAAgURd2l0aGRyYXdJbnN1cmFuY2UFEXdpdGhkcmF3SW5zdXJhbmNlBAVzdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg5sb2NrTmV1dHJpbm9TUAkAzAgCCQClCAEJAQ5zdGFraW5nQWRkcmVzcwAJAMwIAgUIQUxMX0ZFRVMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ1wZWdDaGFuZ2VDb3N0BQNuaWwDCQAAAgUFc3Rha2UFBXN0YWtlCQDOCAIJAQ11cGRhdGVCYWxhbmNlAQkAZAIJAQhjYmFsYW5jZQAFDXBlZ0NoYW5nZUNvc3QJARF1cGRhdGVBbW1SZXNlcnZlcwIFFG5ld1F1b3RlQXNzZXRSZXNlcnZlCQEGYnNBc3RSAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQHdW5zdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg51bmxvY2tOZXV0cmlubwkAzAgCCQEDYWJzAQUNcGVnQ2hhbmdlQ29zdAkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQQQZGVwb3NpdEluc3VyYW5jZQkA/AcECQEQaW5zdXJhbmNlQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQACQEDYWJzAQUNcGVnQ2hhbmdlQ29zdAUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UJAM4IAgkBDXVwZGF0ZUJhbGFuY2UBCQBlAgkBCGNiYWxhbmNlAAkBA2FicwEFDXBlZ0NoYW5nZUNvc3QJARF1cGRhdGVBbW1SZXNlcnZlcwIFFG5ld1F1b3RlQXNzZXRSZXNlcnZlCQEGYnNBc3RSAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQV2X2dldAEHX3RyYWRlcgQNJHQwNjEwNTc2MTExNwkBFWludGVybmFsQ2xvc2VQb3NpdGlvbgIFB190cmFkZXIHBAJ4MQgFDSR0MDYxMDU3NjExMTcCXzEEAngyCAUNJHQwNjEwNTc2MTExNwJfMgQCeDMIBQ0kdDA2MTA1NzYxMTE3Al8zBAJ4NAgFDSR0MDYxMDU3NjExMTcCXzQJAAIBCQCsAgIJAKwCAgkArAICCQEBcwEFAngyCQEBcwEFAngzCQEBcwEFAng0CQEBcwEJAQ5nZXRNYXJnaW5SYXRpbwEFB190cmFkZXIBaQEndmlld19jYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50AQdfdHJhZGVyBA0kdDA2MTI2NDYxMzc1CQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBAxwb3NpdGlvblNpemUIBQ0kdDA2MTI2NDYxMzc1Al8xBA5wb3NpdGlvbk1hcmdpbggFDSR0MDYxMjY0NjEzNzUCXzIEA3BvbggFDSR0MDYxMjY0NjEzNzUCXzMEEXBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNjEyNjQ2MTM3NQJfNAQNJHQwNjEzODA2MTQ4MQkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAgUHX3RyYWRlcgUPUE5MX09QVElPTl9TUE9UBBBwb3NpdGlvbk5vdGlvbmFsCAUNJHQwNjEzODA2MTQ4MQJfMQQNdW5yZWFsaXplZFBubAgFDSR0MDYxMzgwNjE0ODECXzIEDSR0MDYxNDg2NjE2NjgJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUMcG9zaXRpb25TaXplBQ5wb3NpdGlvbk1hcmdpbgURcG9zaXRpb25Mc3RVcGRDUEYFDXVucmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDYxNDg2NjE2NjgCXzEEB2JhZERlYnQIBQ0kdDA2MTQ4NjYxNjY4Al8yBA5mdW5kaW5nUGF5bWVudAgFDSR0MDYxNDg2NjE2NjgCXzMJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkBAXMBBQxyZW1haW5NYXJnaW4JAQFzAQUOZnVuZGluZ1BheW1lbnQJAQFzAQkBDmdldE1hcmdpblJhdGlvAQUHX3RyYWRlcgkBAXMBBQ11bnJlYWxpemVkUG5sCQEBcwEFB2JhZERlYnQJAQFzAQUQcG9zaXRpb25Ob3Rpb25hbAFpARV2aWV3X2dldFBlZ0FkanVzdENvc3QBBl9wcmljZQQEY29zdAkBEGdldFBlZ0FkanVzdENvc3QBBQZfcHJpY2UJAAIBCQCkAwEIBQRjb3N0Al8yAWkBD3ZpZXdfZ2V0RnVuZGluZwAED3VuZGVybHlpbmdQcmljZQkBEmdldE9yYWNsZVR3YXBQcmljZQAEDSR0MDYyMDU5NjIxMjEJAQpnZXRGdW5kaW5nAAQUc2hvcnRQcmVtaXVtRnJhY3Rpb24IBQ0kdDA2MjA1OTYyMTIxAl8xBBNsb25nUHJlbWl1bUZyYWN0aW9uCAUNJHQwNjIwNTk2MjEyMQJfMgQLbG9uZ0Z1bmRpbmcJAQRkaXZkAgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgUPdW5kZXJseWluZ1ByaWNlBAxzaG9ydEZ1bmRpbmcJAQRkaXZkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FD3VuZGVybHlpbmdQcmljZQkAAgEJAKwCAgkArAICCQCsAgIJAQFzAQULbG9uZ0Z1bmRpbmcJAQFzAQUMc2hvcnRGdW5kaW5nCQEBcwEJARBnZXRUd2FwU3BvdFByaWNlAAkBAXMBCQESZ2V0T3JhY2xlVHdhcFByaWNlAAECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJAQ5hZG1pblB1YmxpY0tleQAImkqf", "height": 3304565, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4CTSVZ33UVhujiadTKvbr5UtAXrpdBSwT19tGn6zhhc6 Next: 68cGCexcSzKX4nYzsnaPXtEqgBfVSjs2nyP2GS4oJrek Diff:
OldNewDifferences
1717
1818 let h = "k_positionFraction"
1919
20-let i = "k_initialized"
20+let i = "k_positionClosedDate"
2121
22-let j = "k_paused"
22+let j = "k_initialized"
2323
24-let k = "k_fee"
24+let k = "k_paused"
2525
26-let l = "k_fundingPeriod"
26+let l = "k_fee"
2727
28-let m = "k_initMarginRatio"
28+let m = "k_fundingPeriod"
2929
30-let n = "k_mmr"
30+let n = "k_initMarginRatio"
3131
32-let o = "k_liquidationFeeRatio"
32+let o = "k_mmr"
3333
34-let p = "k_spreadLimit"
34+let p = "k_liquidationFeeRatio"
3535
36-let q = "k_maxPriceImpact"
36+let q = "k_partLiquidationRatio"
3737
38-let r = "k_lastDataStr"
38+let r = "k_spreadLimit"
3939
40-let s = "k_lastMinuteId"
40+let s = "k_maxPriceImpact"
4141
42-let t = "k_twapDataLastCumulativePrice"
42+let t = "k_maxPriceSpread"
4343
44-let u = "k_twapDataLastPrice"
44+let u = "k_lastDataStr"
4545
46-let v = "k_twapDataPreviousMinuteId"
46+let v = "k_lastMinuteId"
4747
48-let w = "k_latestLongPremiumFraction"
48+let w = "k_twapDataLastCumulativePrice"
4949
50-let x = "k_latestShortPremiumFraction"
50+let x = "k_twapDataLastPrice"
5151
52-let y = "k_nextFundingBlockMinTimestamp"
52+let y = "k_twapDataPreviousMinuteId"
5353
54-let z = "k_longFundingRate"
54+let z = "k_latestLongPremiumFraction"
5555
56-let A = "k_shortFundingRate"
56+let A = "k_latestShortPremiumFraction"
5757
58-let B = "k_qtAstR"
58+let B = "k_nextFundingBlockMinTimestamp"
5959
60-let C = "k_bsAstR"
60+let C = "k_longFundingRate"
6161
62-let D = "k_totalPositionSize"
62+let D = "k_shortFundingRate"
6363
64-let E = "k_totalLongPositionSize"
64+let E = "k_qtAstR"
6565
66-let F = "k_totalShortPositionSize"
66+let F = "k_bsAstR"
6767
68-let G = "k_cumulativeNotional"
68+let G = "k_totalPositionSize"
6969
70-let H = "k_openInterestNotional"
70+let H = "k_totalLongPositionSize"
7171
72-let I = "k_coordinatorAddress"
72+let I = "k_totalShortPositionSize"
7373
74-let J = "k_insurance_address"
74+let J = "k_cumulativeNotional"
7575
76-let K = "k_admin_address"
76+let K = "k_openInterestNotional"
7777
78-let L = "k_admin_public_key"
78+let L = "k_coordinatorAddress"
7979
80-let M = "k_quote_asset"
80+let M = "k_insurance_address"
8181
82-let N = "k_quote_staking"
82+let N = "k_admin_address"
8383
84-let O = "k_staking_address"
84+let O = "k_admin_public_key"
8585
86-let P = "k_miner_address"
86+let P = "k_quote_asset"
8787
88-func Q () = valueOrErrorMessage(addressFromString(getStringValue(this, I)), "Coordinator not set")
88+let Q = "k_quote_staking"
89+
90+let R = "k_staking_address"
91+
92+let S = "k_miner_address"
93+
94+let T = "k_orders_address"
95+
96+let U = "k_referral_address"
97+
98+func V () = valueOrErrorMessage(addressFromString(getStringValue(this, L)), "Coordinator not set")
8999
90100
91-func R () = addressFromString(getStringValue(Q(), K))
101+func W () = addressFromString(getStringValue(V(), N))
92102
93103
94-func S () = fromBase58String(getStringValue(Q(), L))
104+func X () = fromBase58String(getStringValue(V(), O))
95105
96106
97-func T () = fromBase58String(getStringValue(Q(), M))
107+func Y () = fromBase58String(getStringValue(V(), P))
98108
99109
100-func U () = valueOrErrorMessage(addressFromString(getStringValue(Q(), N)), "Quote asset staking not set")
110+func Z () = valueOrErrorMessage(addressFromString(getStringValue(V(), Q)), "Quote asset staking not set")
101111
102112
103-func V () = valueOrErrorMessage(addressFromString(getStringValue(Q(), O)), "Insurance not set")
113+func aa () = valueOrErrorMessage(addressFromString(getStringValue(V(), R)), "Staking not set")
104114
105115
106-func W () = valueOrErrorMessage(addressFromString(getStringValue(Q(), J)), "Insurance not set")
116+func ab () = valueOrErrorMessage(addressFromString(getStringValue(V(), M)), "Insurance not set")
107117
108118
109-func X () = valueOrErrorMessage(addressFromString(getStringValue(Q(), P)), "Insurance not set")
119+func ac () = valueOrErrorMessage(addressFromString(getStringValue(V(), S)), "Miner not set")
110120
111121
112-let Y = 1
113-
114-let Z = 2
115-
116-let aa = 15
117-
118-let ab = 15
119-
120-let ac = 1000
121-
122-let ad = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
123-
124-let ae = (86400 * ad)
125-
126-let af = 100
127-
128-let ag = 1
129-
130-let ah = 2
131-
132-func ai (aj) = (toString(aj) + ",")
122+func ad () = valueOrErrorMessage(addressFromString(getStringValue(V(), T)), "Orders not set")
133123
134124
135-func ak (aj,al) = fraction(aj, ad, al, HALFEVEN)
125+func ae () = valueOrErrorMessage(addressFromString(getStringValue(V(), U)), "Referral not set")
136126
137127
138-func am (aj,al) = fraction(aj, al, ad, HALFEVEN)
128+let af = 1
129+
130+let ag = 2
131+
132+let ah = 15
133+
134+let ai = 15
135+
136+let aj = 1000
137+
138+let ak = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
139+
140+let al = (86400 * ak)
141+
142+let am = 100
143+
144+let an = 1
145+
146+let ao = 2
147+
148+func ap (aq) = (toString(aq) + ",")
139149
140150
141-func an (aj) = if ((aj > 0))
142- then aj
143- else -(aj)
151+func ar (aq,as) = fraction(aq, ak, as, HALFEVEN)
144152
145153
146-func ao (aj,al) = if ((aj >= al))
147- then aj
148- else al
154+func at (aq,as) = fraction(aq, as, ak, HALFEVEN)
149155
150156
151-func ap (aq,ar) = ((aq + "_") + ar)
157+func au (aq) = if ((aq > 0))
158+ then aq
159+ else -(aq)
152160
153161
154-func as (at) = {
155- func au (av,aw) = ((av + aw) + ",")
162+func av (aq,as) = if ((aq >= as))
163+ then aq
164+ else as
156165
157- let ax = {
158- let ay = at
159- let az = size(ay)
160- let aA = ""
161- func aB (aC,aD) = if ((aD >= az))
162- then aC
163- else au(aC, ay[aD])
164166
165- func aE (aC,aD) = if ((aD >= az))
166- then aC
167+func aw (ax,ay) = ((ax + "_") + ay)
168+
169+
170+func az (aA) = {
171+ func aB (aC,aD) = ((aC + aD) + ",")
172+
173+ let aE = {
174+ let aF = aA
175+ let aG = size(aF)
176+ let aH = ""
177+ func aI (aJ,aK) = if ((aK >= aG))
178+ then aJ
179+ else aB(aJ, aF[aK])
180+
181+ func aL (aJ,aK) = if ((aK >= aG))
182+ then aJ
167183 else throw("List size exceeds 20")
168184
169- aE(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aA, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
185+ aL(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aH, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
170186 }
171- let aF = dropRight(ax, 1)
172- let aG = if ((take(aF, 1) == ","))
173- then drop(aF, 1)
174- else aF
175- aG
187+ let aM = dropRight(aE, 1)
188+ let aN = if ((take(aM, 1) == ","))
189+ then drop(aM, 1)
190+ else aM
191+ aN
176192 }
177193
178194
179-func aH (aI) = split(aI, ",")
195+func aO (aP) = split(aP, ",")
180196
181197
182-func aJ (at,aK,aL) = if ((size(at) > aK))
183- then (removeByIndex(at, 0) :+ aL)
184- else (at :+ aL)
198+func aQ (aA,aR,aS) = if ((size(aA) > aR))
199+ then (removeByIndex(aA, 0) :+ aS)
200+ else (aA :+ aS)
185201
186202
187-func aM (aN) = valueOrErrorMessage(getInteger(this, aN), ("no value for " + aN))
203+func aT (aU) = valueOrErrorMessage(getInteger(this, aU), ("no value for " + aU))
188204
189205
190-func aO () = aM(d)
206+func aV () = aT(d)
191207
192208
193-func aP () = aM(k)
209+func aW () = aT(l)
194210
195211
196-func aQ () = aM(m)
212+func aX () = aT(n)
197213
198214
199-func aR () = aM(B)
215+func aY () = aT(E)
200216
201217
202-func aS () = aM(C)
218+func aZ () = aT(F)
203219
204220
205-func aT () = aM(D)
221+func ba () = aT(G)
206222
207223
208-func aU () = aM(G)
224+func bb () = aT(J)
209225
210226
211-func aV () = aM(H)
227+func bc () = aT(K)
212228
213229
214-func aW () = aM(y)
230+func bd () = aT(B)
215231
216232
217-func aX () = aM(l)
233+func be () = aT(m)
218234
219235
220-func aY () = (aX() * ad)
236+func bf () = (be() * ak)
221237
222238
223-func aZ () = (aX() * ac)
239+func bg () = (be() * aj)
224240
225241
226-func ba () = aM(n)
242+func bh () = aT(o)
227243
228244
229-func bb () = aM(o)
245+func bi () = aT(p)
230246
231247
232-func bc () = aM(p)
248+func bj () = aT(q)
233249
234250
235-func bd () = aM(q)
251+func bk () = aT(r)
236252
237253
238-func be () = aM(w)
254+func bl () = aT(s)
239255
240256
241-func bf () = aM(x)
257+func bm () = aT(t)
242258
243259
244-func bg () = aM(F)
260+func bn () = aT(z)
245261
246262
247-func bh () = aM(E)
263+func bo () = aT(A)
248264
249265
250-func bi (bj,bk,bl) = {
251- let bm = (bj - bk)
252- if (if (bl)
253- then (0 > bm)
266+func bp () = aT(I)
267+
268+
269+func bq () = aT(H)
270+
271+
272+func br (bs) = valueOrElse(getString(ad(), "k_sender"), toString(bs.caller))
273+
274+
275+func bt (bu,bv,bw) = {
276+ let bx = (bu - bv)
277+ if (if (bw)
278+ then (0 > bx)
254279 else false)
255280 then throw("Invalid margin")
256- else if (if (!(bl))
257- then (bm >= 0)
281+ else if (if (!(bw))
282+ then (bx >= 0)
258283 else false)
259284 then throw("Invalid margin")
260285 else true
261286 }
262287
263288
264-func bn (bo) = if ((bo == 0))
289+func by (bz) = if ((bz == 0))
265290 then throw("Should not be called with _positionSize == 0")
266- else if ((bo > 0))
267- then be()
268- else bf()
291+ else if ((bz > 0))
292+ then bn()
293+ else bo()
269294
270295
271-func bp (bq) = {
272- let br = getInteger(this, ap(e, bq))
273- let bs = br
274- if ($isInstanceOf(bs, "Int"))
296+func bA (bB) = {
297+ let bC = getInteger(this, aw(e, bB))
298+ let bD = bC
299+ if ($isInstanceOf(bD, "Int"))
275300 then {
276- let bt = bs
277- $Tuple4(bt, getIntegerValue(this, ap(f, bq)), getIntegerValue(this, ap(g, bq)), getIntegerValue(this, ap(h, bq)))
301+ let bE = bD
302+ $Tuple4(bE, getIntegerValue(this, aw(f, bB)), getIntegerValue(this, aw(g, bB)), getIntegerValue(this, aw(h, bB)))
278303 }
279304 else $Tuple4(0, 0, 0, 0)
280305 }
281306
282307
283-func bu (bq) = if ((bp(bq)._1 == 0))
308+func bF (bB) = if ((bA(bB)._1 == 0))
284309 then throw("No open position")
285310 else true
286311
287312
288-func bv () = valueOrElse(getBoolean(this, i), false)
313+func bG () = valueOrElse(getBoolean(this, j), false)
289314
290315
291-func bw () = valueOrElse(getBoolean(this, j), false)
316+func bH () = valueOrElse(getBoolean(this, k), false)
292317
293318
294-func bx (by,bz,bA) = if (by)
319+func bI (bJ,bK,bL) = if (bJ)
295320 then {
296- let bB = (aS() - bA)
297- if ((0 >= bB))
321+ let bM = (aZ() - bL)
322+ if ((0 >= bM))
298323 then throw("Tx lead to base asset reserve <= 0, revert")
299- else $Tuple4((aR() + bz), bB, (aT() + bA), (aU() + bz))
324+ else $Tuple4((aY() + bK), bM, (ba() + bL), (bb() + bK))
300325 }
301326 else {
302- let bC = (aR() - bz)
303- if ((0 >= bC))
327+ let bN = (aY() - bK)
328+ if ((0 >= bN))
304329 then throw("Tx lead to base quote reserve <= 0, revert")
305- else $Tuple4(bC, (aS() + bA), (aT() - bA), (aU() - bz))
330+ else $Tuple4(bN, (aZ() + bL), (ba() - bL), (bb() - bK))
306331 }
307332
308333
309-func bD (by,bz) = {
310- let bE = aR()
311- let bF = aS()
312- let aN = am(bE, bF)
313- let bG = if (by)
314- then (bE + bz)
315- else (bE - bz)
316- let bH = ak(aN, bG)
317- let bI = an((bH - bF))
318- let bJ = if (by)
319- then bI
320- else -(bI)
321- let bK = bx(by, bz, bI)
322- let bL = bK._1
323- let bM = bK._2
324- let bN = bK._3
325- let bO = bK._4
326- let bP = ak(bE, bF)
327- let bQ = ak(bz, bI)
328- let bR = an((bP - bQ))
329- let bS = (ad - ak(bP, (bP + bR)))
330- let bT = bd()
331- if ((bS > bT))
332- then throw(((((((((((((("Price impact " + toString(bS)) + " > max price impact ") + toString(bT)) + " before quote asset: ") + toString(bE)) + " before base asset: ") + toString(bF)) + " quote asset amount to exchange: ") + toString(bz)) + " price before: ") + toString(bP)) + " marketPrice: ") + toString(bQ)))
333- else $Tuple5(bJ, bL, bM, bN, bO)
334+func bO (bJ,bK) = {
335+ let bP = aY()
336+ let bQ = aZ()
337+ let aU = at(bP, bQ)
338+ let bR = if (bJ)
339+ then (bP + bK)
340+ else (bP - bK)
341+ let bS = ar(aU, bR)
342+ let bT = au((bS - bQ))
343+ let bU = if (bJ)
344+ then bT
345+ else -(bT)
346+ let bV = bI(bJ, bK, bT)
347+ let bW = bV._1
348+ let bX = bV._2
349+ let bY = bV._3
350+ let bZ = bV._4
351+ let ca = ar(bP, bQ)
352+ let cb = ar(bK, bT)
353+ let cc = au((ca - cb))
354+ let cd = (ak - ar(ca, (ca + cc)))
355+ let ce = bl()
356+ if ((cd > ce))
357+ then throw(((((((((((((("Price impact " + toString(cd)) + " > max price impact ") + toString(ce)) + " before quote asset: ") + toString(bP)) + " before base asset: ") + toString(bQ)) + " quote asset amount to exchange: ") + toString(bK)) + " price before: ") + toString(ca)) + " marketPrice: ") + toString(cb)))
358+ else $Tuple5(bU, bW, bX, bY, bZ)
334359 }
335360
336361
337-func bU (bV,bW,bX,bY) = {
338- let bZ = if ((bV != 0))
362+func cf (cg,ch,ci,cj) = {
363+ let ck = if ((cg != 0))
339364 then {
340- let ca = bn(bV)
341- am((ca - bX), bV)
365+ let cl = by(cg)
366+ at((cl - ci), cg)
342367 }
343368 else 0
344- let cb = ((bY - bZ) + bW)
345- let cc = if ((0 > cb))
346- then $Tuple2(0, an(cb))
347- else $Tuple2(an(cb), 0)
348- let cd = cc._1
349- let ce = cc._2
350- $Tuple3(cd, ce, bZ)
369+ let cm = ((cj - ck) + ch)
370+ let cn = if ((0 > cm))
371+ then $Tuple2(0, au(cm))
372+ else $Tuple2(au(cm), 0)
373+ let co = cn._1
374+ let cp = cn._2
375+ $Tuple3(co, cp, ck)
351376 }
352377
353378
354-func cf (by,bA,cg) = {
355- let ch = aR()
356- let ci = aS()
357- let bP = ak(ch, ci)
358- if ((bA == 0))
379+func cq (bJ,bL,cr,cs,ct) = {
380+ let ca = ar(cs, ct)
381+ if ((bL == 0))
359382 then throw("Invalid base asset amount")
360383 else {
361- let aN = am(ch, ci)
362- let cj = if (by)
363- then (ci + bA)
364- else (ci - bA)
365- let ck = ak(aN, cj)
366- let cl = an((ck - ch))
367- let bT = bd()
368- let cm = bx(!(by), cl, bA)
369- let bL = cm._1
370- let bM = cm._2
371- let bN = cm._3
372- let bO = cm._4
373- let bQ = ak(cl, bA)
374- let bR = an((bP - bQ))
375- let bS = (ad - ak(bP, (bP + bR)))
376- if (if ((bS > bT))
377- then cg
384+ let aU = at(cs, ct)
385+ let cu = if (bJ)
386+ then (ct + bL)
387+ else (ct - bL)
388+ let cv = ar(aU, cu)
389+ let cw = au((cv - cs))
390+ let ce = bl()
391+ let cx = bI(!(bJ), cw, bL)
392+ let bW = cx._1
393+ let bX = cx._2
394+ let bY = cx._3
395+ let bZ = cx._4
396+ let cb = ar(cw, bL)
397+ let cc = au((ca - cb))
398+ let cd = (ak - ar(ca, (ca + cc)))
399+ if (if ((cd > ce))
400+ then cr
378401 else false)
379- then throw(((((((((((((("Price impact " + toString(bS)) + " > max price impact ") + toString(bT)) + " before quote asset: ") + toString(ch)) + " before base asset: ") + toString(ci)) + " base asset amount to exchange: ") + toString(bA)) + " price before: ") + toString(bP)) + " market price: ") + toString(bQ)))
380- else $Tuple7(cl, bL, bM, bN, bO, (bh() - (if (by)
381- then an(bA)
382- else 0)), (bg() - (if (!(by))
383- then an(bA)
384- else 0)))
402+ then throw(((((((((((((("Price impact " + toString(cd)) + " > max price impact ") + toString(ce)) + " before quote asset: ") + toString(cs)) + " before base asset: ") + toString(ct)) + " base asset amount to exchange: ") + toString(bL)) + " price before: ") + toString(ca)) + " market price: ") + toString(cb)))
403+ else $Tuple8(cw, bW, bX, bY, bZ, (bq() - (if (bJ)
404+ then au(bL)
405+ else 0)), (bp() - (if (!(bJ))
406+ then au(bL)
407+ else 0)), cd)
385408 }
386409 }
387410
388411
389-func cn () = {
390- let co = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
391- let cp = getStringValue(this, a)
392- let cq = getStringValue(this, b)
393- let cr = valueOrErrorMessage(getInteger(co, cp), ((("Can not get oracle price. Oracle: " + toString(co)) + " key: ") + cp))
394- cr
412+func cy (bJ,bL,cr) = cq(bJ, bL, cr, aY(), aZ())
413+
414+
415+func cz () = {
416+ let cA = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
417+ let cB = getStringValue(this, a)
418+ let cC = getStringValue(this, b)
419+ let cD = valueOrErrorMessage(getInteger(cA, cB), ((("Can not get oracle price. Oracle: " + toString(cA)) + " key: ") + cB))
420+ cD
395421 }
396422
397423
398-func cs () = {
399- let ch = aR()
400- let ci = aS()
401- ak(ch, ci)
424+func cE (cs,ct) = {
425+ let cF = cz()
426+ let cG = ar(cs, ct)
427+ let cH = ar((cF + cG), (2 * ak))
428+ let cI = ar(au((cF - cG)), cH)
429+ if ((cI > bm()))
430+ then throw(((("Price spread " + toString(cI)) + " > max price spread ") + toString(bm())))
431+ else true
402432 }
403433
404434
405-func ct () = {
406- let cu = cn()
407- let cv = cs()
408- (ak(an((cu - cv)), cu) > bc())
435+func cJ () = {
436+ let cs = aY()
437+ let ct = aZ()
438+ ar(cs, ct)
409439 }
410440
411441
412-func cw (bq,cx) = {
413- let cy = bp(bq)
414- let bt = cy._1
415- let cz = cy._2
416- let cA = cy._3
417- let cB = cy._4
418- let cC = an(bt)
419- if ((cC == 0))
420- then throw("Invalid position size")
442+func cK () = {
443+ let cF = cz()
444+ let cL = cJ()
445+ (ar(au((cF - cL)), cF) > bk())
446+ }
447+
448+
449+func cM (bz,cN,cs,ct) = {
450+ let cO = au(bz)
451+ let cP = (0 > bz)
452+ let cQ = if ((cN == an))
453+ then {
454+ let cR = cq(!(cP), cO, false, cs, ct)
455+ let cS = cR._1
456+ let cT = cR._2
457+ let cU = cR._3
458+ let cV = cR._4
459+ cS
460+ }
461+ else at(cO, cz())
462+ cQ
463+ }
464+
465+
466+func cW (bz,cX,cs,ct,cN) = if ((bz == 0))
467+ then throw("Invalid position size")
468+ else {
469+ let cP = (0 > bz)
470+ let cQ = cM(bz, cN, cs, ct)
471+ let cY = if (cP)
472+ then (cX - cQ)
473+ else (cQ - cX)
474+ $Tuple2(cQ, cY)
475+ }
476+
477+
478+func cZ (bB,cN) = {
479+ let da = bA(bB)
480+ let bE = da._1
481+ let db = da._2
482+ let dc = da._3
483+ let dd = da._4
484+ cW(bE, dc, aY(), aZ(), cN)
485+ }
486+
487+
488+func de (df,dg,dh) = ar((df - dg), dh)
489+
490+
491+func di (bB,cN) = {
492+ let dj = bA(bB)
493+ let bE = dj._1
494+ let db = dj._2
495+ let dk = dj._3
496+ let dd = dj._4
497+ let dl = cZ(bB, cN)
498+ let cQ = dl._1
499+ let cY = dl._2
500+ let dm = cf(bE, db, dd, cY)
501+ let co = dm._1
502+ let cp = dm._2
503+ de(co, cp, cQ)
504+ }
505+
506+
507+func dn (bB) = di(bB, an)
508+
509+
510+func do (bB,bz) = {
511+ let dp = av(bj(), (ak - ar(dn(bB), bh())))
512+ let dq = at(au(bz), dp)
513+ let dr = cy((bz > 0), dq, false)
514+ let ds = dr._1
515+ let cd = dr._8
516+ if ((bl() > cd))
517+ then ds
421518 else {
422- let cD = (0 > bt)
423- let cE = if ((cx == ag))
424- then {
425- let cF = cf(!(cD), cC, false)
426- let cG = cF._1
427- let cH = cF._2
428- let cI = cF._3
429- let cJ = cF._4
430- cG
431- }
432- else am(cC, cn())
433- let cK = if (cD)
434- then (cA - cE)
435- else (cE - cA)
436- $Tuple2(cE, cK)
519+ let dt = at(au(bz), bj())
520+ let du = cy((bz > 0), dt, false)._1
521+ du
437522 }
438523 }
439524
440525
441-func cL (cM,cN,cO) = ak((cM - cN), cO)
442-
443-
444-func cP (bq,cx) = {
445- let cQ = bp(bq)
446- let bt = cQ._1
447- let cz = cQ._2
448- let cR = cQ._3
449- let cB = cQ._4
450- let cS = cw(bq, cx)
451- let cE = cS._1
452- let cK = cS._2
453- let cT = bU(bt, cz, cB, cK)
454- let cd = cT._1
455- let ce = cT._2
456- cL(cd, ce, cE)
526+func dv (bB,cr) = {
527+ let dw = bA(bB)
528+ let bE = dw._1
529+ let db = dw._2
530+ let dc = dw._3
531+ let dd = dw._4
532+ let cY = cZ(bB, an)._2
533+ let dx = cf(bE, db, dd, cY)
534+ let co = dx._1
535+ let cp = dx._2
536+ let dt = -(bE)
537+ let dy = cY
538+ let dz = -(co)
539+ let dA = cy((bE > 0), au(bE), cr)
540+ let du = dA._1
541+ let bR = dA._2
542+ let bS = dA._3
543+ let dB = dA._4
544+ let dC = dA._5
545+ let dD = dA._6
546+ let dE = dA._7
547+ let dF = (bc() - dc)
548+ $Tuple12(dt, cp, dy, dz, bR, bS, dB, dC, dF, du, dD, dE)
457549 }
458550
459551
460-func cU (bq) = cP(bq, ag)
552+func dG () = {
553+ let dH = ((lastBlock.timestamp / 1000) / 60)
554+ let dI = (dH - ah)
555+ let dJ = valueOrElse(getString(this, u), "")
556+ let dK = split(dJ, ",")
557+ func dL (aC,dM) = if ((dI >= parseIntValue(dM)))
558+ then (aC :+ parseIntValue(dM))
559+ else aC
461560
561+ let dN = {
562+ let aF = dK
563+ let aG = size(aF)
564+ let aH = nil
565+ func aI (aJ,aK) = if ((aK >= aG))
566+ then aJ
567+ else dL(aJ, aF[aK])
462568
463-func cV (bq,cg) = {
464- let cW = bp(bq)
465- let bt = cW._1
466- let cz = cW._2
467- let cA = cW._3
468- let cB = cW._4
469- let cX = cw(bq, ag)
470- let cH = cX._1
471- let cK = cX._2
472- let cY = bU(bt, cz, cB, cK)
473- let cd = cY._1
474- let ce = cY._2
475- let cZ = -(bt)
476- let da = cK
477- let db = -(cd)
478- let dc = cf((bt > 0), an(bt), cg)
479- let dd = dc._1
480- let bG = dc._2
481- let bH = dc._3
482- let de = dc._4
483- let df = dc._5
484- let dg = dc._6
485- let dh = dc._7
486- let di = (aV() - cA)
487- $Tuple12(cZ, ce, da, db, bG, bH, de, df, di, dd, dg, dh)
569+ func aL (aJ,aK) = if ((aK >= aG))
570+ then aJ
571+ else throw("List size exceeds 20")
572+
573+ aL(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aH, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
574+ }
575+ let dO = if ((size(dN) > 0))
576+ then max(dN)
577+ else parseIntValue(dK[0])
578+ let dP = valueOrElse(getInteger(this, v), 0)
579+ let dQ = valueOrElse(getInteger(this, ((w + "_") + toString(dP))), 0)
580+ let dR = valueOrElse(getInteger(this, ((x + "_") + toString(dP))), 0)
581+ let dS = (dQ + ((dH - dP) * dR))
582+ let dT = valueOrElse(getInteger(this, ((w + "_") + toString(dO))), 0)
583+ let dU = valueOrElse(getInteger(this, ((x + "_") + toString(dO))), 0)
584+ let dV = (dT + ((dI - dO) * dU))
585+ ((dS - dV) / ah)
488586 }
489587
490588
491-func dj () = {
492- let dk = ((lastBlock.timestamp / 1000) / 60)
493- let dl = (dk - aa)
494- let dm = valueOrElse(getString(this, r), "")
495- let dn = split(dm, ",")
496- func do (av,dp) = if ((dl >= parseIntValue(dp)))
497- then (av :+ parseIntValue(dp))
498- else av
499-
500- let dq = {
501- let ay = dn
502- let az = size(ay)
503- let aA = nil
504- func aB (aC,aD) = if ((aD >= az))
505- then aC
506- else do(aC, ay[aD])
507-
508- func aE (aC,aD) = if ((aD >= az))
509- then aC
510- else throw("List size exceeds 20")
511-
512- aE(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aA, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
513- }
514- let dr = if ((size(dq) > 0))
515- then max(dq)
516- else parseIntValue(dn[0])
517- let ds = valueOrElse(getInteger(this, s), 0)
518- let dt = valueOrElse(getInteger(this, ((t + "_") + toString(ds))), 0)
519- let du = valueOrElse(getInteger(this, ((u + "_") + toString(ds))), 0)
520- let dv = (dt + ((dk - ds) * du))
521- let dw = valueOrElse(getInteger(this, ((t + "_") + toString(dr))), 0)
522- let dx = valueOrElse(getInteger(this, ((u + "_") + toString(dr))), 0)
523- let dy = (dw + ((dl - dr) * dx))
524- ((dv - dy) / aa)
589+func dW (dX) = {
590+ let bz = ba()
591+ let dY = (bz > 0)
592+ let dZ = cy(dY, au(bz), false)._1
593+ let ea = aZ()
594+ let eb = at(ea, dX)
595+ let ec = cW(bz, dZ, eb, ea, an)._2
596+ $Tuple2(eb, ec)
525597 }
526598
527599
528-func dz (dA,dB,dC,dD,dE,dF,dG) = [IntegerEntry(m, dA), IntegerEntry(n, dB), IntegerEntry(o, dC), IntegerEntry(l, dD), IntegerEntry(k, dE), IntegerEntry(p, dF), IntegerEntry(q, dG)]
600+func ed () = {
601+ let ee = cz()
602+ let ef = dG()
603+ let eg = (ef - ee)
604+ if (if ((bp() == 0))
605+ then true
606+ else (bq() == 0))
607+ then $Tuple2(0, 0)
608+ else if ((0 > eg))
609+ then {
610+ let eh = ar(at(eg, bf()), al)
611+ let ei = ar(at(eh, bp()), bq())
612+ $Tuple2(eh, ei)
613+ }
614+ else {
615+ let ei = ar(at(eg, bf()), al)
616+ let eh = ar(at(ei, bq()), bp())
617+ $Tuple2(eh, ei)
618+ }
619+ }
529620
530621
531-func dH (dI,dJ,dK,dL,dM) = [IntegerEntry(y, dI), IntegerEntry(w, dJ), IntegerEntry(x, dK), IntegerEntry(z, dL), IntegerEntry(A, dM)]
622+func ej (ek,el,em,en,eo,ep,eq,er,es) = [IntegerEntry(n, ek), IntegerEntry(o, el), IntegerEntry(p, em), IntegerEntry(m, en), IntegerEntry(l, eo), IntegerEntry(r, ep), IntegerEntry(s, eq), IntegerEntry(q, er), IntegerEntry(t, es)]
532623
533624
534-func dN (ar,dO,dP,dQ,ca) = [IntegerEntry(ap(e, ar), dO), IntegerEntry(ap(f, ar), dP), IntegerEntry(ap(g, ar), dQ), IntegerEntry(ap(h, ar), ca)]
625+func et (eu,ev,ew,ex,ey) = [IntegerEntry(B, eu), IntegerEntry(z, ev), IntegerEntry(A, ew), IntegerEntry(C, ex), IntegerEntry(D, ey)]
535626
536627
537-func dR (dS) = {
538- let dk = ((lastBlock.timestamp / 1000) / 60)
539- let dT = valueOrElse(getInteger(this, s), 0)
540- if ((dT > dk))
628+func ez (ay,eA,eB,eC,cl) = [IntegerEntry(aw(e, ay), eA), IntegerEntry(aw(f, ay), eB), IntegerEntry(aw(g, ay), eC), IntegerEntry(aw(h, ay), cl)]
629+
630+
631+func eD (eE) = {
632+ let dH = ((lastBlock.timestamp / 1000) / 60)
633+ let eF = valueOrElse(getInteger(this, v), 0)
634+ if ((eF > dH))
541635 then throw("TWAP out-of-order")
542636 else {
543- let ds = if ((dT == 0))
544- then dk
545- else dT
546- if ((dk > dT))
637+ let dP = if ((eF == 0))
638+ then dH
639+ else eF
640+ if ((dH > eF))
547641 then {
548- let dU = valueOrElse(getInteger(this, ((t + "_") + toString(dT))), 0)
549- let dV = valueOrElse(getInteger(this, ((u + "_") + toString(dT))), dS)
550- let dW = (dU + ((dk - ds) * dV))
551- let dn = aJ(aH(valueOrElse(getString(this, r), "")), aa, toString(dk))
552-[IntegerEntry(ap(t, toString(dk)), dW), IntegerEntry(ap(u, toString(dk)), dS), IntegerEntry(ap(v, toString(dk)), dT), IntegerEntry(s, dk), StringEntry(r, as(dn))]
642+ let eG = valueOrElse(getInteger(this, ((w + "_") + toString(eF))), 0)
643+ let eH = valueOrElse(getInteger(this, ((x + "_") + toString(eF))), eE)
644+ let eI = (eG + ((dH - dP) * eH))
645+ let dK = aQ(aO(valueOrElse(getString(this, u), "")), ah, toString(dH))
646+[IntegerEntry(aw(w, toString(dH)), eI), IntegerEntry(aw(x, toString(dH)), eE), IntegerEntry(aw(y, toString(dH)), eF), IntegerEntry(v, dH), StringEntry(u, az(dK))]
553647 }
554648 else {
555- let dX = valueOrElse(getInteger(this, ap(v, toString(dk))), 0)
556- let dU = valueOrElse(getInteger(this, ap(t, toString(dX))), 0)
557- let dV = valueOrElse(getInteger(this, ap(u, toString(dX))), dS)
558- let dW = (dU + ((dk - dX) * dV))
559-[IntegerEntry(ap(t, toString(dk)), dW), IntegerEntry(ap(u, toString(dk)), dS)]
649+ let eJ = valueOrElse(getInteger(this, aw(y, toString(dH))), 0)
650+ let eG = valueOrElse(getInteger(this, aw(w, toString(eJ))), 0)
651+ let eH = valueOrElse(getInteger(this, aw(x, toString(eJ))), eE)
652+ let eI = (eG + ((dH - eJ) * eH))
653+[IntegerEntry(aw(w, toString(dH)), eI), IntegerEntry(aw(x, toString(dH)), eE)]
560654 }
561655 }
562656 }
563657
564658
565-func dY (bE,bF) = [IntegerEntry(B, bE), IntegerEntry(C, bF)]
659+func eK (bP,bQ) = [IntegerEntry(E, bP), IntegerEntry(F, bQ)]
566660
567661
568-func dZ (bE,bF,ea,eb,ec,ed,ee) = if (((ed - ee) != ea))
569- then throw(((((("Invalid AMM state data: " + toString(ed)) + " + ") + toString(ee)) + " != ") + toString(ea)))
570- else ((dY(bE, bF) ++ [IntegerEntry(D, ea), IntegerEntry(G, eb), IntegerEntry(H, ec), IntegerEntry(E, ed), IntegerEntry(F, ee)]) ++ dR(ak(bE, bF)))
662+func eL (bP,bQ,eM,eN,eO,eP,eQ) = if (((eP - eQ) != eM))
663+ then throw(((((("Invalid AMM state data: " + toString(eP)) + " + ") + toString(eQ)) + " != ") + toString(eM)))
664+ else ((eK(bP, bQ) ++ [IntegerEntry(G, eM), IntegerEntry(J, eN), IntegerEntry(K, eO), IntegerEntry(H, eP), IntegerEntry(I, eQ)]) ++ eD(ar(bP, bQ)))
571665
572666
573-func ef (ar) = [DeleteEntry(ap(e, ar)), DeleteEntry(ap(f, ar)), DeleteEntry(ap(g, ar)), DeleteEntry(ap(h, ar))]
667+func eR (ay) = [DeleteEntry(aw(e, ay)), DeleteEntry(aw(f, ay)), DeleteEntry(aw(g, ay)), DeleteEntry(aw(h, ay)), IntegerEntry(aw(i, ay), lastBlock.timestamp)]
574668
575669
576-func eg (ar,eh) = {
577- let ei = assetBalance(this, T())
578- if ((eh > ei))
579- then throw(((("Unable to withdraw " + toString(eh)) + " from contract balance ") + toString(ei)))
580- else [ScriptTransfer(ar, eh, T())]
670+func eS (ay,eT) = {
671+ let eU = assetBalance(this, Y())
672+ if ((eT > eU))
673+ then throw(((("Unable to withdraw " + toString(eT)) + " from contract balance ") + toString(eU)))
674+ else [ScriptTransfer(ay, eT, Y())]
581675 }
582676
583677
584-func ej (ek) = if ((0 > ek))
678+func eV (bs) = if ((0 > bs))
585679 then throw("Balance")
586- else [IntegerEntry(d, ek)]
680+ else [IntegerEntry(d, bs)]
587681
588682
589-func el (ek) = [ScriptTransfer(V(), ek, T())]
683+func eW (bs) = [ScriptTransfer(aa(), bs, Y())]
590684
591685
592-@Callable(ek)
593-func pause () = if ((ek.caller != R()))
686+@Callable(bs)
687+func pause () = if ((bs.caller != W()))
594688 then throw("Invalid togglePause params")
595- else [BooleanEntry(j, true)]
689+ else [BooleanEntry(k, true)]
596690
597691
598692
599-@Callable(ek)
600-func unpause () = if ((ek.caller != R()))
693+@Callable(bs)
694+func unpause () = if ((bs.caller != W()))
601695 then throw("Invalid togglePause params")
602- else [BooleanEntry(j, false)]
696+ else [BooleanEntry(k, false)]
603697
604698
605699
606-@Callable(ek)
607-func addLiquidity (bz) = if (if ((ek.caller != R()))
700+@Callable(bs)
701+func addLiquidity (bK) = if (if ((bs.caller != W()))
608702 then true
609- else (0 >= bz))
703+ else (0 >= bK))
610704 then throw("Invalid addLiquidity params")
611705 else {
612- let bE = aR()
613- let bF = aS()
614- let dS = ak(bE, bF)
615- let em = ak(bz, dS)
616- let en = (bE + bz)
617- let eo = (bF + em)
618- dY(en, eo)
706+ let bP = aY()
707+ let bQ = aZ()
708+ let eE = ar(bP, bQ)
709+ let eX = ar(bK, eE)
710+ let eY = (bP + bK)
711+ let eZ = (bQ + eX)
712+ eK(eY, eZ)
619713 }
620714
621715
622716
623-@Callable(ek)
624-func removeLiquidity (bz) = if (if ((ek.caller != R()))
717+@Callable(bs)
718+func removeLiquidity (bK) = if (if ((bs.caller != W()))
625719 then true
626- else (0 >= bz))
720+ else (0 >= bK))
627721 then throw("Invalid removeLiquidity params")
628722 else {
629- let bE = aR()
630- let bF = aS()
631- let dS = ak(bE, bF)
632- let ep = ak(bz, dS)
633- let en = (bE - bz)
634- let eo = (bF - ep)
635- dY(en, eo)
723+ let bP = aY()
724+ let bQ = aZ()
725+ let eE = ar(bP, bQ)
726+ let fa = ar(bK, eE)
727+ let eY = (bP - bK)
728+ let eZ = (bQ - fa)
729+ eK(eY, eZ)
636730 }
637731
638732
639733
640-@Callable(ek)
641-func changeSettings (dA,dB,dC,dD,dE,dF,dG) = if ((ek.caller != R()))
734+@Callable(bs)
735+func changeSettings (ek,el,em,en,eo,ep,eq,er,es) = if ((bs.caller != W()))
642736 then throw("Invalid changeSettings params")
643- else dz(dA, dB, dC, dD, dE, dF, dG)
737+ else ej(ek, el, em, en, eo, ep, eq, er, es)
644738
645739
646740
647-@Callable(ek)
648-func initialize (bE,bF,dD,dA,dB,dC,dE,eq,er,es,dF,dG) = if (if (if (if (if (if (if (if (if (if ((0 >= bE))
741+@Callable(bs)
742+func initialize (bP,bQ,en,ek,el,em,eo,fb,fc,fd,ep,eq,er,es) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= bP))
649743 then true
650- else (0 >= bF))
744+ else (0 >= bQ))
651745 then true
652- else (0 >= dD))
746+ else (0 >= en))
653747 then true
654- else (0 >= dA))
748+ else (0 >= ek))
655749 then true
656- else (0 >= dB))
750+ else (0 >= el))
657751 then true
658- else (0 >= dC))
752+ else (0 >= em))
659753 then true
660- else (0 >= dE))
754+ else (0 >= eo))
661755 then true
662- else (0 >= dF))
756+ else (0 >= ep))
663757 then true
664- else (0 >= dG))
758+ else (0 >= eq))
665759 then true
666- else bv())
760+ else (0 >= er))
761+ then true
762+ else (0 >= es))
763+ then true
764+ else bG())
667765 then throw("Invalid initialize parameters")
668- else ((((dZ(bE, bF, 0, 0, 0, 0, 0) ++ dz(dA, dB, dC, dD, dE, dF, dG)) ++ dH((lastBlock.timestamp + dD), 0, 0, 0, 0)) ++ ej(0)) ++ [BooleanEntry(i, true), StringEntry(c, eq), StringEntry(a, er), StringEntry(I, es)])
766+ else ((((eL(bP, bQ, 0, 0, 0, 0, 0) ++ ej(ek, el, em, en, eo, ep, eq, er, es)) ++ et((lastBlock.timestamp + en), 0, 0, 0, 0)) ++ eV(0)) ++ [BooleanEntry(j, true), StringEntry(c, fb), StringEntry(a, fc), StringEntry(L, fd)])
669767
670768
671769
672-@Callable(ek)
673-func setMaxPriceImpact (dG) = if (if ((0 >= dG))
770+@Callable(bs)
771+func setInitMarginRatio (ek) = if (if ((0 >= ek))
674772 then true
675- else !(bv()))
676- then throw("Invalid _maxPriceImpact parameters")
677- else dz(aQ(), ba(), bb(), aX(), aP(), bc(), dG)
773+ else !(bG()))
774+ then throw("Invalid setInitMarginRatio parameters")
775+ else ej(ek, bh(), bi(), be(), aW(), bk(), bl(), bj(), bm())
678776
679777
680778
681-@Callable(ek)
682-func setInitMarginRatio (dA) = if (if ((0 >= dA))
779+@Callable(bs)
780+func decreasePosition (eT,fe,ff) = if (if (if (if (if ((0 >= eT))
683781 then true
684- else !(bv()))
685- then throw("Invalid setInitMarginRatio parameters")
686- else dz(dA, ba(), bb(), aX(), aP(), bc(), bd())
687-
688-
689-
690-@Callable(ek)
691-func decreasePosition (eh,et,eu) = if (if (if (if (if ((0 >= eh))
782+ else !(bG()))
692783 then true
693- else !(bv()))
784+ else !(bt(ar(ak, fe), aX(), true)))
694785 then true
695- else !(bi(ak(ad, et), aQ(), true)))
786+ else !(bF(toString(bs.caller))))
696787 then true
697- else !(bu(toString(ek.caller))))
698- then true
699- else bw())
788+ else bH())
700789 then throw("Invalid decreasePosition parameters")
701790 else {
702- let ev = bp(toString(ek.caller))
703- let ew = ev._1
704- let ex = ev._2
705- let ey = ev._3
706- let ez = ev._4
707- let eA = if ((ew > 0))
708- then Z
709- else Y
710- let eB = (eA == Y)
711- let eC = am(eh, et)
712- let eD = cw(toString(ek.caller), ag)
713- let eE = eD._1
714- let cK = eD._2
715- let eF = if ((eE > eC))
791+ let fg = bA(toString(bs.caller))
792+ let fh = fg._1
793+ let fi = fg._2
794+ let fj = fg._3
795+ let fk = fg._4
796+ let fl = if ((fh > 0))
797+ then ag
798+ else af
799+ let fm = (fl == af)
800+ let fn = at(eT, fe)
801+ let fo = cZ(toString(bs.caller), an)
802+ let fp = fo._1
803+ let cY = fo._2
804+ let fq = if ((fp > fn))
716805 then {
717- let eG = bD(eB, eC)
718- let cZ = eG._1
719- let bG = eG._2
720- let bH = eG._3
721- let de = eG._4
722- let df = eG._5
723- let eH = an(cZ)
724- if (if ((eu != 0))
725- then (eu > eH)
806+ let fr = bO(fm, fn)
807+ let dt = fr._1
808+ let bR = fr._2
809+ let bS = fr._3
810+ let dB = fr._4
811+ let dC = fr._5
812+ let fs = au(dt)
813+ if (if ((ff != 0))
814+ then (ff > fs)
726815 else false)
727- then throw(((("Too little base asset exchanged, got " + toString(eH)) + " expected ") + toString(eu)))
816+ then throw(((("Too little base asset exchanged, got " + toString(fs)) + " expected ") + toString(ff)))
728817 else {
729- let da = ak(am(cK, eH), an(ew))
730- let eI = bU(ew, ex, ez, da)
731- let cd = eI._1
732- let ce = eI._2
733- let bZ = eI._3
734- let dd = eC
735- let eJ = (cK - da)
736- let eK = if ((ew > 0))
737- then ((eE - dd) - eJ)
738- else ((eJ + eE) - dd)
739- let eL = (ew + cZ)
740- $Tuple11(eL, cd, an(eK), bn(eL), bH, bG, de, df, (aV() - eC), (bh() - (if ((eL > 0))
741- then an(cZ)
742- else 0)), (bg() - (if ((0 > eL))
743- then an(cZ)
818+ let dy = ar(at(cY, fs), au(fh))
819+ let ft = cf(fh, fi, fk, dy)
820+ let co = ft._1
821+ let cp = ft._2
822+ let ck = ft._3
823+ let du = fn
824+ let fu = (cY - dy)
825+ let fv = if ((fh > 0))
826+ then ((fp - du) - fu)
827+ else ((fu + fp) - du)
828+ let fw = (fh + dt)
829+ $Tuple11(fw, co, au(fv), by(fw), bS, bR, dB, dC, (bc() - fn), (bq() - (if ((fw > 0))
830+ then au(dt)
831+ else 0)), (bp() - (if ((0 > fw))
832+ then au(dt)
744833 else 0)))
745834 }
746835 }
747836 else throw("Close position first")
748- let eL = eF._1
749- let eM = eF._2
750- let eN = eF._3
751- let eO = eF._4
752- let bH = eF._5
753- let bG = eF._6
754- let de = eF._7
755- let df = eF._8
756- let di = eF._9
757- let dg = eF._10
758- let dh = eF._11
759- let eP = invoke(X(), "notifyNotional", [toString(ek.caller), eN], nil)
760- if ((eP == eP))
761- then (dN(toString(ek.caller), eL, eM, eN, eO) ++ dZ(bG, bH, de, df, di, dg, dh))
837+ let fw = fq._1
838+ let fx = fq._2
839+ let fy = fq._3
840+ let fz = fq._4
841+ let bS = fq._5
842+ let bR = fq._6
843+ let dB = fq._7
844+ let dC = fq._8
845+ let dF = fq._9
846+ let dD = fq._10
847+ let dE = fq._11
848+ let fA = invoke(ac(), "notifyNotional", [toString(bs.caller), fy], nil)
849+ if ((fA == fA))
850+ then (ez(toString(bs.caller), fw, fx, fy, fz) ++ eL(bR, bS, dB, dC, dF, dD, dE))
762851 else throw("Strict value is not equal to itself.")
763852 }
764853
765854
766855
767-@Callable(ek)
768-func increasePosition (eA,et,eu) = {
769- let eQ = ek.payments[0].amount
770- if (if (if (if (if (if (if ((eA != Y))
771- then (eA != Z)
856+@Callable(bs)
857+func increasePosition (fl,fe,ff,fB) = {
858+ let fC = bs.payments[0].amount
859+ if (if (if (if (if (if (if ((fl != af))
860+ then (fl != ag)
772861 else false)
773862 then true
774- else (0 >= eQ))
863+ else (0 >= fC))
775864 then true
776- else !(bv()))
865+ else !(bG()))
777866 then true
778- else (ek.payments[0].assetId != T()))
867+ else (bs.payments[0].assetId != Y()))
779868 then true
780- else !(bi(ak(ad, et), aQ(), true)))
869+ else !(bt(ar(ak, fe), aX(), true)))
781870 then true
782- else bw())
871+ else bH())
783872 then throw("Invalid increasePosition parameters")
784873 else {
785- let eR = am(eQ, aP())
786- let eh = (eQ - eR)
787- let eS = bp(toString(ek.caller))
788- let ew = eS._1
789- let ex = eS._2
790- let ey = eS._3
791- let ez = eS._4
792- let eT = (ew == 0)
793- let eU = if ((ew > 0))
794- then (eA == Y)
795- else (eA == Z)
796- let eV = if (!(eT))
797- then eU
798- else false
799- let eB = (eA == Y)
800- let eW = if (if (eT)
801- then true
802- else eV)
874+ let bB = toString(bs.caller)
875+ let fD = at(fC, aW())
876+ let fE = invoke(ae(), "acceptPaymentWithLink", [bB, fB], [AttachedPayment(Y(), fD)])
877+ if ((fE == fE))
803878 then {
804- let eC = am(eh, et)
805- let eX = bD(eB, eC)
806- let bJ = eX._1
807- let bG = eX._2
808- let bH = eX._3
809- let de = eX._4
810- let df = eX._5
811- if (if ((eu != 0))
812- then (eu > an(bJ))
813- else false)
814- then throw(((("Limit error: " + toString(an(bJ))) + " < ") + toString(eu)))
879+ let fF = {
880+ let bD = fE
881+ if ($isInstanceOf(bD, "Int"))
882+ then {
883+ let fG = bD
884+ fG
885+ }
886+ else throw("Invalid referrerFee")
887+ }
888+ let eT = (fC - fD)
889+ let fH = (fD - fF)
890+ let fI = bA(bB)
891+ let fh = fI._1
892+ let fi = fI._2
893+ let fj = fI._3
894+ let fk = fI._4
895+ let fJ = (fh == 0)
896+ let fK = if ((fh > 0))
897+ then (fl == af)
898+ else (fl == ag)
899+ let fL = if (!(fJ))
900+ then fK
901+ else false
902+ let fm = (fl == af)
903+ let fM = if (if (fJ)
904+ then true
905+ else fL)
906+ then {
907+ let fn = at(eT, fe)
908+ let fN = bO(fm, fn)
909+ let bU = fN._1
910+ let bR = fN._2
911+ let bS = fN._3
912+ let dB = fN._4
913+ let dC = fN._5
914+ if (if ((ff != 0))
915+ then (ff > au(bU))
916+ else false)
917+ then throw(((("Limit error: " + toString(au(bU))) + " < ") + toString(ff)))
918+ else {
919+ let fw = (fh + bU)
920+ let fO = ar(fn, fe)
921+ let fP = cf(fh, fi, fk, fO)
922+ let co = fP._1
923+ let cT = fP._2
924+ let cU = fP._3
925+ if (!(cE(bR, bS)))
926+ then throw("Over max spread limit")
927+ else $Tuple11(fw, co, (fj + fn), by(fw), bS, bR, dB, dC, (bc() + fn), (bq() + (if ((fw > 0))
928+ then au(bU)
929+ else 0)), (bp() + (if ((0 > fw))
930+ then au(bU)
931+ else 0)))
932+ }
933+ }
815934 else {
816- let eL = (ew + bJ)
817- let eY = ak(eC, et)
818- let eZ = bU(ew, ex, ez, eY)
819- let cd = eZ._1
820- let cH = eZ._2
821- let cI = eZ._3
822- $Tuple11(eL, cd, (ey + eC), bn(eL), bH, bG, de, df, (aV() + eC), (bh() + (if ((eL > 0))
823- then an(bJ)
824- else 0)), (bg() + (if ((0 > eL))
825- then an(bJ)
826- else 0)))
935+ let fn = at(eT, fe)
936+ let fQ = cZ(toString(bs.caller), an)
937+ let fp = fQ._1
938+ let cY = fQ._2
939+ if ((fp > fn))
940+ then throw("Use decreasePosition to decrease position size")
941+ else throw("Close position first")
827942 }
828- }
829- else {
830- let eC = am(eh, et)
831- let fa = cw(toString(ek.caller), ag)
832- let eE = fa._1
833- let cK = fa._2
834- if ((eE > eC))
835- then throw("Use decreasePosition to decrease position size")
836- else throw("Close position first")
837- }
838- let eL = eW._1
839- let eM = eW._2
840- let eN = eW._3
841- let eO = eW._4
842- let bH = eW._5
843- let bG = eW._6
844- let de = eW._7
845- let df = eW._8
846- let di = eW._9
847- let dg = eW._10
848- let dh = eW._11
849- let fb = (eR / 2)
850- let fc = (eR - fb)
851- let fd = invoke(U(), "lockNeutrinoSP", [toString(V()), af], [AttachedPayment(T(), eh)])
852- if ((fd == fd))
853- then {
854- let fe = invoke(W(), "deposit", nil, [AttachedPayment(T(), fc)])
855- if ((fe == fe))
943+ let fw = fM._1
944+ let fx = fM._2
945+ let fy = fM._3
946+ let fz = fM._4
947+ let bS = fM._5
948+ let bR = fM._6
949+ let dB = fM._7
950+ let dC = fM._8
951+ let dF = fM._9
952+ let dD = fM._10
953+ let dE = fM._11
954+ let fR = (fH / 2)
955+ let fS = (fH - fR)
956+ let fT = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), eT)])
957+ if ((fT == fT))
856958 then {
857- let ff = invoke(X(), "notifyFees", [toString(ek.caller), eR], nil)
858- if ((ff == ff))
959+ let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)])
960+ if ((fU == fU))
859961 then {
860- let eP = invoke(X(), "notifyNotional", [toString(ek.caller), eN], nil)
861- if ((eP == eP))
862- then (((dN(toString(ek.caller), eL, eM, eN, eO) ++ dZ(bG, bH, de, df, di, dg, dh)) ++ el(fb)) ++ ej((aO() + eh)))
962+ let fV = invoke(ac(), "notifyFees", [bB, fH], nil)
963+ if ((fV == fV))
964+ then {
965+ let fA = invoke(ac(), "notifyNotional", [bB, fy], nil)
966+ if ((fA == fA))
967+ then (((ez(bB, fw, fx, fy, fz) ++ eL(bR, bS, dB, dC, dF, dD, dE)) ++ eW(fR)) ++ eV((aV() + eT)))
968+ else throw("Strict value is not equal to itself.")
969+ }
863970 else throw("Strict value is not equal to itself.")
864971 }
865972 else throw("Strict value is not equal to itself.")
872979
873980
874981
875-@Callable(ek)
982+@Callable(bs)
876983 func addMargin () = {
877- let eQ = ek.payments[0].amount
878- if (if (if (if ((ek.payments[0].assetId != T()))
984+ let fC = bs.payments[0].amount
985+ if (if (if (if ((bs.payments[0].assetId != Y()))
879986 then true
880- else !(bu(toString(ek.caller))))
987+ else !(bF(toString(bs.caller))))
881988 then true
882- else !(bv()))
989+ else !(bG()))
883990 then true
884- else bw())
991+ else bH())
885992 then throw("Invalid addMargin parameters")
886993 else {
887- let eR = am(eQ, aP())
888- let eh = (eQ - eR)
889- let fg = bp(toString(ek.caller))
890- let ew = fg._1
891- let ex = fg._2
892- let ey = fg._3
893- let ez = fg._4
894- let fb = (eR / 2)
895- let fc = (eR - fb)
896- let fd = invoke(U(), "lockNeutrinoSP", [toString(V()), af], [AttachedPayment(T(), eh)])
897- if ((fd == fd))
994+ let bB = toString(bs.caller)
995+ let fD = at(fC, aW())
996+ let fE = invoke(ae(), "acceptPayment", [bB], [AttachedPayment(Y(), fD)])
997+ if ((fE == fE))
898998 then {
899- let fe = invoke(W(), "deposit", nil, [AttachedPayment(T(), fc)])
900- if ((fe == fe))
999+ let fF = {
1000+ let bD = fE
1001+ if ($isInstanceOf(bD, "Int"))
1002+ then {
1003+ let fG = bD
1004+ fG
1005+ }
1006+ else throw("Invalid referrerFee")
1007+ }
1008+ let fH = (fD - fF)
1009+ let eT = (fC - fD)
1010+ let fW = bA(bB)
1011+ let fh = fW._1
1012+ let fi = fW._2
1013+ let fj = fW._3
1014+ let fk = fW._4
1015+ let fR = (fH / 2)
1016+ let fS = (fH - fR)
1017+ let fT = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), eT)])
1018+ if ((fT == fT))
9011019 then {
902- let ff = invoke(X(), "notifyFees", [toString(ek.caller), eR], nil)
903- if ((ff == ff))
904- then ((dN(toString(ek.caller), ew, (ex + eh), ey, ez) ++ el(fb)) ++ ej((aO() + eh)))
905- else throw("Strict value is not equal to itself.")
906- }
907- else throw("Strict value is not equal to itself.")
908- }
909- else throw("Strict value is not equal to itself.")
910- }
911- }
912-
913-
914-
915-@Callable(ek)
916-func removeMargin (eh) = if (if (if (if ((0 >= eh))
917- then true
918- else !(bu(toString(ek.caller))))
919- then true
920- else !(bv()))
921- then true
922- else bw())
923- then throw("Invalid removeMargin parameters")
924- else {
925- let fh = bp(toString(ek.caller))
926- let ew = fh._1
927- let ex = fh._2
928- let ey = fh._3
929- let ez = fh._4
930- let fi = -(eh)
931- let fj = bU(ew, ex, ez, fi)
932- let cd = fj._1
933- let ce = fj._2
934- if ((ce != 0))
935- then throw("Invalid removed margin amount")
936- else {
937- let fk = cL(cd, ce, ey)
938- if (!(bi(fk, aQ(), true)))
939- then throw(((("Too much margin removed: " + toString(fk)) + " < ") + toString(aQ())))
940- else {
941- let fl = invoke(U(), "unlockNeutrino", [eh, toBase58String(T())], nil)
942- if ((fl == fl))
943- then ((dN(toString(ek.caller), ew, cd, ey, bn(ew)) ++ eg(ek.caller, eh)) ++ ej((aO() - eh)))
944- else throw("Strict value is not equal to itself.")
945- }
946- }
947- }
948-
949-
950-
951-@Callable(ek)
952-func closePosition () = if (if (if (!(bu(toString(ek.caller))))
953- then true
954- else !(bv()))
955- then true
956- else bw())
957- then throw("Invalid closePosition parameters")
958- else {
959- let fm = cV(toString(ek.caller), true)
960- let cH = fm._1
961- let fn = fm._2
962- let da = fm._3
963- let db = fm._4
964- let bG = fm._5
965- let bH = fm._6
966- let de = fm._7
967- let df = fm._8
968- let di = fm._9
969- let cI = fm._10
970- let dg = fm._11
971- let dh = fm._12
972- if ((fn > 0))
973- then throw("Unable to close position with bad debt")
974- else {
975- let fo = an(db)
976- let fp = (aO() - fo)
977- let fq = if ((0 > fp))
978- then $Tuple2(0, an(fp))
979- else $Tuple2(fp, 0)
980- let fr = fq._1
981- let fs = fq._2
982- let ft = if ((fs > 0))
983- then {
984- let fu = invoke(W(), "withdraw", [fs], nil)
985- if ((fu == fu))
986- then nil
987- else throw("Strict value is not equal to itself.")
988- }
989- else nil
990- if ((ft == ft))
991- then {
992- let fl = invoke(U(), "unlockNeutrino", [(fo - fs), toBase58String(T())], nil)
993- if ((fl == fl))
994- then {
995- let eP = invoke(X(), "notifyNotional", [toString(ek.caller), 0], nil)
996- if ((eP == eP))
997- then (((ef(toString(ek.caller)) ++ dZ(bG, bH, de, df, di, dg, dh)) ++ eg(ek.caller, fo)) ++ ej(fr))
998- else throw("Strict value is not equal to itself.")
999- }
1000- else throw("Strict value is not equal to itself.")
1001- }
1002- else throw("Strict value is not equal to itself.")
1003- }
1004- }
1005-
1006-
1007-
1008-@Callable(ek)
1009-func liquidate (bq) = {
1010- let fv = cP(bq, ag)
1011- let fk = if (ct())
1012- then {
1013- let fw = cP(bq, ah)
1014- ao(fv, fw)
1015- }
1016- else fv
1017- if (if (if (if (!(bi(fk, ba(), false)))
1018- then true
1019- else !(bu(bq)))
1020- then true
1021- else !(bv()))
1022- then true
1023- else bw())
1024- then throw("Unable to liquidate")
1025- else {
1026- let fx = cV(bq, false)
1027- let cH = fx._1
1028- let ce = fx._2
1029- let cI = fx._3
1030- let cJ = fx._4
1031- let bG = fx._5
1032- let bH = fx._6
1033- let de = fx._7
1034- let df = fx._8
1035- let di = fx._9
1036- let dd = fx._10
1037- let dg = fx._11
1038- let dh = fx._12
1039- let fy = am(dd, bb())
1040- let fz = (fy / 2)
1041- let fc = (fy - fz)
1042- let fp = (aO() - fy)
1043- let fA = if ((0 > fp))
1044- then $Tuple2(0, an(fp))
1045- else $Tuple2(fp, 0)
1046- let fB = fA._1
1047- let fC = fA._2
1048- let ft = if ((fC > 0))
1049- then {
1050- let fu = invoke(W(), "withdraw", [fC], nil)
1051- if ((fu == fu))
1052- then nil
1053- else throw("Strict value is not equal to itself.")
1054- }
1055- else nil
1056- if ((ft == ft))
1057- then {
1058- let fl = invoke(U(), "unlockNeutrino", [(fy - fC), toBase58String(T())], nil)
1059- if ((fl == fl))
1060- then {
1061- let fe = invoke(W(), "deposit", nil, [AttachedPayment(T(), fc)])
1062- if ((fe == fe))
1020+ let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)])
1021+ if ((fU == fU))
10631022 then {
1064- let eP = invoke(X(), "notifyNotional", [bq, 0], nil)
1065- if ((eP == eP))
1066- then (((ef(bq) ++ dZ(bG, bH, de, df, di, dg, dh)) ++ eg(ek.caller, fz)) ++ ej(fB))
1023+ let fV = invoke(ac(), "notifyFees", [bB, fH], nil)
1024+ if ((fV == fV))
1025+ then ((ez(bB, fh, (fi + eT), fj, fk) ++ eW(fR)) ++ eV((aV() + eT)))
10671026 else throw("Strict value is not equal to itself.")
10681027 }
10691028 else throw("Strict value is not equal to itself.")
10761035
10771036
10781037
1079-@Callable(ek)
1080-func payFunding () = {
1081- let fD = aW()
1082- if (if (if ((fD > lastBlock.timestamp))
1038+@Callable(bs)
1039+func removeMargin (eT) = if (if (if (if ((0 >= eT))
1040+ then true
1041+ else !(bF(toString(bs.caller))))
1042+ then true
1043+ else !(bG()))
1044+ then true
1045+ else bH())
1046+ then throw("Invalid removeMargin parameters")
1047+ else {
1048+ let fX = bA(toString(bs.caller))
1049+ let fh = fX._1
1050+ let fi = fX._2
1051+ let fj = fX._3
1052+ let fk = fX._4
1053+ let fY = -(eT)
1054+ let fZ = cf(fh, fi, fk, fY)
1055+ let co = fZ._1
1056+ let cp = fZ._2
1057+ if ((cp != 0))
1058+ then throw("Invalid removed margin amount")
1059+ else {
1060+ let ga = de(co, cp, fj)
1061+ if (!(bt(ga, aX(), true)))
1062+ then throw(((("Too much margin removed: " + toString(ga)) + " < ") + toString(aX())))
1063+ else {
1064+ let gb = invoke(Z(), "unlockNeutrino", [eT, toBase58String(Y())], nil)
1065+ if ((gb == gb))
1066+ then ((ez(toString(bs.caller), fh, co, fj, by(fh)) ++ eS(bs.caller, eT)) ++ eV((aV() - eT)))
1067+ else throw("Strict value is not equal to itself.")
1068+ }
1069+ }
1070+ }
1071+
1072+
1073+
1074+@Callable(bs)
1075+func closePosition () = {
1076+ let gc = br(bs)
1077+ let gd = valueOrErrorMessage(addressFromString(gc), "Invalid caller")
1078+ if (if (if (!(bF(gc)))
10831079 then true
1084- else !(bv()))
1080+ else !(bG()))
10851081 then true
1086- else bw())
1087- then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(fD)))
1082+ else bH())
1083+ then throw("Invalid closePosition parameters")
10881084 else {
1089- let fE = cn()
1090- let fF = dj()
1091- let fG = (fF - fE)
1092- let fH = if (if ((bg() == 0))
1093- then true
1094- else (bh() == 0))
1095- then $Tuple2(0, 0)
1096- else if ((0 > fG))
1097- then {
1098- let fI = ak(am(fG, aY()), ae)
1099- let fJ = ak(am(fI, bg()), bh())
1100- $Tuple2(fI, fJ)
1101- }
1102- else {
1103- let fJ = ak(am(fG, aY()), ae)
1104- let fI = ak(am(fJ, bh()), bg())
1105- $Tuple2(fI, fJ)
1106- }
1107- let fI = fH._1
1108- let fJ = fH._2
1109- dH((fD + aZ()), (be() + fJ), (bf() + fI), ak(fJ, fE), ak(fI, fE))
1085+ let ge = dv(gc, true)
1086+ let cT = ge._1
1087+ let gf = ge._2
1088+ let dy = ge._3
1089+ let dz = ge._4
1090+ let bR = ge._5
1091+ let bS = ge._6
1092+ let dB = ge._7
1093+ let dC = ge._8
1094+ let dF = ge._9
1095+ let cU = ge._10
1096+ let dD = ge._11
1097+ let dE = ge._12
1098+ if ((gf > 0))
1099+ then throw("Unable to close position with bad debt")
1100+ else {
1101+ let gg = au(dz)
1102+ let gh = (aV() - gg)
1103+ let gi = if ((0 > gh))
1104+ then $Tuple2(0, au(gh))
1105+ else $Tuple2(gh, 0)
1106+ let gj = gi._1
1107+ let gk = gi._2
1108+ let fG = if ((gk > 0))
1109+ then {
1110+ let gl = invoke(ab(), "withdraw", [gk], nil)
1111+ if ((gl == gl))
1112+ then nil
1113+ else throw("Strict value is not equal to itself.")
1114+ }
1115+ else nil
1116+ if ((fG == fG))
1117+ then {
1118+ let gb = invoke(Z(), "unlockNeutrino", [(gg - gk), toBase58String(Y())], nil)
1119+ if ((gb == gb))
1120+ then {
1121+ let fA = invoke(ac(), "notifyNotional", [gc, 0], nil)
1122+ if ((fA == fA))
1123+ then (((eR(gc) ++ eL(bR, bS, dB, dC, dF, dD, dE)) ++ eS(gd, gg)) ++ eV(gj))
1124+ else throw("Strict value is not equal to itself.")
1125+ }
1126+ else throw("Strict value is not equal to itself.")
1127+ }
1128+ else throw("Strict value is not equal to itself.")
1129+ }
11101130 }
11111131 }
11121132
11131133
11141134
1115-@Callable(ek)
1116-func v_get (bq) = {
1117- let fK = cV(bq, false)
1118- let cH = fK._1
1119- let cI = fK._2
1120- let cJ = fK._3
1121- let fL = fK._4
1122- throw((((ai(cI) + ai(cJ)) + ai(fL)) + ai(cU(bq))))
1135+@Callable(bs)
1136+func liquidate (bB) = {
1137+ let gm = di(bB, an)
1138+ let ga = if (cK())
1139+ then {
1140+ let gn = di(bB, ao)
1141+ av(gm, gn)
1142+ }
1143+ else gm
1144+ if (if (if (if (!(bt(ga, bh(), false)))
1145+ then true
1146+ else !(bF(bB)))
1147+ then true
1148+ else !(bG()))
1149+ then true
1150+ else bH())
1151+ then throw("Unable to liquidate")
1152+ else if (if (if ((gm > bi()))
1153+ then (bj() > 0)
1154+ else false)
1155+ then (ak > bj())
1156+ else false)
1157+ then {
1158+ let go = bA(bB)
1159+ let fh = go._1
1160+ let fi = go._2
1161+ let fj = go._3
1162+ let fk = go._4
1163+ let fl = if ((fh > 0))
1164+ then ag
1165+ else af
1166+ let fm = (fl == af)
1167+ let du = do(bB, fh)
1168+ let gp = cZ(bB, an)
1169+ let fp = gp._1
1170+ let cY = gp._2
1171+ let gq = bO(fm, du)
1172+ let dt = gq._1
1173+ let bR = gq._2
1174+ let bS = gq._3
1175+ let dB = gq._4
1176+ let dC = gq._5
1177+ let dy = ar(at(cY, au(dt)), au(fh))
1178+ let gr = cf(fh, fi, fk, dy)
1179+ let co = gr._1
1180+ let cp = gr._2
1181+ let ck = gr._3
1182+ let fu = (cY - dy)
1183+ let fv = if ((fh > 0))
1184+ then ((fp - du) - fu)
1185+ else ((fu + fp) - du)
1186+ let gs = at(du, bi())
1187+ let gt = (gs / 2)
1188+ let fS = (gs - gt)
1189+ let gu = (co - gs)
1190+ let fw = (fh + dt)
1191+ let fy = au(fv)
1192+ let gv = by(fw)
1193+ let dF = (bc() - du)
1194+ let gh = (aV() - gs)
1195+ let gw = if ((0 > gh))
1196+ then $Tuple2(0, au(gh))
1197+ else $Tuple2(gh, 0)
1198+ let gx = gw._1
1199+ let gy = gw._2
1200+ let fG = if ((gy > 0))
1201+ then {
1202+ let gl = invoke(ab(), "withdraw", [gy], nil)
1203+ if ((gl == gl))
1204+ then nil
1205+ else throw("Strict value is not equal to itself.")
1206+ }
1207+ else nil
1208+ if ((fG == fG))
1209+ then {
1210+ let gb = invoke(Z(), "unlockNeutrino", [(gs - gy), toBase58String(Y())], nil)
1211+ if ((gb == gb))
1212+ then {
1213+ let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)])
1214+ if ((fU == fU))
1215+ then {
1216+ let fA = invoke(ac(), "notifyNotional", [bB, fy], nil)
1217+ if ((fA == fA))
1218+ then (((ez(bB, fw, gu, fy, gv) ++ eL(bR, bS, dB, dC, dF, (bq() - (if ((fw > 0))
1219+ then au(dt)
1220+ else 0)), (bp() - (if ((0 > fw))
1221+ then au(dt)
1222+ else 0)))) ++ eS(bs.caller, gt)) ++ eV(gx))
1223+ else throw("Strict value is not equal to itself.")
1224+ }
1225+ else throw("Strict value is not equal to itself.")
1226+ }
1227+ else throw("Strict value is not equal to itself.")
1228+ }
1229+ else throw("Strict value is not equal to itself.")
1230+ }
1231+ else {
1232+ let gz = dv(bB, false)
1233+ let cT = gz._1
1234+ let cp = gz._2
1235+ let cU = gz._3
1236+ let cV = gz._4
1237+ let bR = gz._5
1238+ let bS = gz._6
1239+ let dB = gz._7
1240+ let dC = gz._8
1241+ let dF = gz._9
1242+ let du = gz._10
1243+ let dD = gz._11
1244+ let dE = gz._12
1245+ let gs = at(du, bi())
1246+ let gt = (gs / 2)
1247+ let fS = (gs - gt)
1248+ let gh = (aV() - gs)
1249+ let gA = if ((0 > gh))
1250+ then $Tuple2(0, au(gh))
1251+ else $Tuple2(gh, 0)
1252+ let gx = gA._1
1253+ let gy = gA._2
1254+ let fG = if ((gy > 0))
1255+ then {
1256+ let gl = invoke(ab(), "withdraw", [gy], nil)
1257+ if ((gl == gl))
1258+ then nil
1259+ else throw("Strict value is not equal to itself.")
1260+ }
1261+ else nil
1262+ if ((fG == fG))
1263+ then {
1264+ let gb = invoke(Z(), "unlockNeutrino", [(gs - gy), toBase58String(Y())], nil)
1265+ if ((gb == gb))
1266+ then {
1267+ let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)])
1268+ if ((fU == fU))
1269+ then {
1270+ let fA = invoke(ac(), "notifyNotional", [bB, 0], nil)
1271+ if ((fA == fA))
1272+ then (((eR(bB) ++ eL(bR, bS, dB, dC, dF, dD, dE)) ++ eS(bs.caller, gt)) ++ eV(gx))
1273+ else throw("Strict value is not equal to itself.")
1274+ }
1275+ else throw("Strict value is not equal to itself.")
1276+ }
1277+ else throw("Strict value is not equal to itself.")
1278+ }
1279+ else throw("Strict value is not equal to itself.")
1280+ }
11231281 }
11241282
11251283
11261284
1127-@Callable(ek)
1128-func view_calcRemainMarginWithFundingPayment (bq) = {
1129- let fM = bp(bq)
1130- let bt = fM._1
1131- let cz = fM._2
1132- let cR = fM._3
1133- let cB = fM._4
1134- let fN = cw(bq, ag)
1135- let cE = fN._1
1136- let cK = fN._2
1137- let fO = bU(bt, cz, cB, cK)
1138- let cd = fO._1
1139- let ce = fO._2
1140- let bZ = fO._3
1141- throw(((((ai(cd) + ai(bZ)) + ai(cU(bq))) + ai(cK)) + ai(ce)))
1285+@Callable(bs)
1286+func payFunding () = {
1287+ let gB = bd()
1288+ if (if (if ((gB > lastBlock.timestamp))
1289+ then true
1290+ else !(bG()))
1291+ then true
1292+ else bH())
1293+ then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(gB)))
1294+ else {
1295+ let ee = cz()
1296+ let gC = ed()
1297+ let eh = gC._1
1298+ let ei = gC._2
1299+ et((gB + bg()), (bn() + ei), (bo() + eh), ar(ei, ee), ar(eh, ee))
1300+ }
11421301 }
11431302
11441303
11451304
1146-@Callable(ek)
1147-func forceMoveAsset (bq,eh) = if (if ((addressFromPublicKey(S()) != ek.caller))
1305+@Callable(bs)
1306+func forceMoveAsset (bB,eT) = if (if ((addressFromPublicKey(X()) != bs.caller))
11481307 then true
1149- else (0 > eh))
1308+ else (0 > eT))
11501309 then throw("Invalid forceMoveAsset parameters")
11511310 else {
1152- let fl = invoke(U(), "unlockNeutrino", [eh, toBase58String(T())], nil)
1153- if ((fl == fl))
1154- then (eg(addressFromStringValue(bq), eh) ++ ej((aO() - eh)))
1311+ let gb = invoke(Z(), "unlockNeutrino", [eT, toBase58String(Y())], nil)
1312+ if ((gb == gb))
1313+ then (eS(addressFromStringValue(bB), eT) ++ eV((aV() - eT)))
11551314 else throw("Strict value is not equal to itself.")
11561315 }
11571316
11581317
1159-@Verifier(fP)
1160-func fQ () = sigVerify(fP.bodyBytes, fP.proofs[0], S())
1318+
1319+@Callable(bs)
1320+func adjustPeg (dX) = if (if ((addressFromPublicKey(X()) != bs.caller))
1321+ then true
1322+ else (0 > dX))
1323+ then throw("Invalid adjustPeg parameters")
1324+ else {
1325+ let gD = dW(dX)
1326+ let eb = gD._1
1327+ let gE = gD._2
1328+ if ((gE == 0))
1329+ then throw("Nothing to adjust")
1330+ else if ((gE > 0))
1331+ then {
1332+ let gl = invoke(ab(), "withdraw", [gE], nil)
1333+ if ((gl == gl))
1334+ then {
1335+ let fT = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), gE)])
1336+ if ((fT == fT))
1337+ then (eV((aV() + gE)) ++ eK(eb, aZ()))
1338+ else throw("Strict value is not equal to itself.")
1339+ }
1340+ else throw("Strict value is not equal to itself.")
1341+ }
1342+ else {
1343+ let gb = invoke(Z(), "unlockNeutrino", [au(gE), toBase58String(Y())], nil)
1344+ if ((gb == gb))
1345+ then {
1346+ let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), au(gE))])
1347+ if ((fU == fU))
1348+ then (eV((aV() - au(gE))) ++ eK(eb, aZ()))
1349+ else throw("Strict value is not equal to itself.")
1350+ }
1351+ else throw("Strict value is not equal to itself.")
1352+ }
1353+ }
1354+
1355+
1356+
1357+@Callable(bs)
1358+func v_get (bB) = {
1359+ let gF = dv(bB, false)
1360+ let cT = gF._1
1361+ let cU = gF._2
1362+ let cV = gF._3
1363+ let gG = gF._4
1364+ throw((((ap(cU) + ap(cV)) + ap(gG)) + ap(dn(bB))))
1365+ }
1366+
1367+
1368+
1369+@Callable(bs)
1370+func view_calcRemainMarginWithFundingPayment (bB) = {
1371+ let gH = bA(bB)
1372+ let bE = gH._1
1373+ let db = gH._2
1374+ let dk = gH._3
1375+ let dd = gH._4
1376+ let gI = cZ(bB, an)
1377+ let cQ = gI._1
1378+ let cY = gI._2
1379+ let gJ = cf(bE, db, dd, cY)
1380+ let co = gJ._1
1381+ let cp = gJ._2
1382+ let ck = gJ._3
1383+ throw((((((ap(co) + ap(ck)) + ap(dn(bB))) + ap(cY)) + ap(cp)) + ap(cQ)))
1384+ }
1385+
1386+
1387+
1388+@Callable(bs)
1389+func view_getPegAdjustCost (dX) = {
1390+ let ec = dW(dX)
1391+ throw(toString(ec._2))
1392+ }
1393+
1394+
1395+
1396+@Callable(bs)
1397+func view_getFunding () = {
1398+ let ee = cz()
1399+ let gK = ed()
1400+ let eh = gK._1
1401+ let ei = gK._2
1402+ let gL = ar(ei, ee)
1403+ let gM = ar(eh, ee)
1404+ throw((((ap(gL) + ap(gM)) + ap(dG())) + ap(cz())))
1405+ }
1406+
1407+
1408+@Verifier(gN)
1409+func gO () = sigVerify(gN.bodyBytes, gN.proofs[0], X())
11611410
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let a = "k_ora_key"
55
66 let b = "k_ora_block_key"
77
88 let c = "k_ora"
99
1010 let d = "k_balance"
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
20-let i = "k_initialized"
20+let i = "k_positionClosedDate"
2121
22-let j = "k_paused"
22+let j = "k_initialized"
2323
24-let k = "k_fee"
24+let k = "k_paused"
2525
26-let l = "k_fundingPeriod"
26+let l = "k_fee"
2727
28-let m = "k_initMarginRatio"
28+let m = "k_fundingPeriod"
2929
30-let n = "k_mmr"
30+let n = "k_initMarginRatio"
3131
32-let o = "k_liquidationFeeRatio"
32+let o = "k_mmr"
3333
34-let p = "k_spreadLimit"
34+let p = "k_liquidationFeeRatio"
3535
36-let q = "k_maxPriceImpact"
36+let q = "k_partLiquidationRatio"
3737
38-let r = "k_lastDataStr"
38+let r = "k_spreadLimit"
3939
40-let s = "k_lastMinuteId"
40+let s = "k_maxPriceImpact"
4141
42-let t = "k_twapDataLastCumulativePrice"
42+let t = "k_maxPriceSpread"
4343
44-let u = "k_twapDataLastPrice"
44+let u = "k_lastDataStr"
4545
46-let v = "k_twapDataPreviousMinuteId"
46+let v = "k_lastMinuteId"
4747
48-let w = "k_latestLongPremiumFraction"
48+let w = "k_twapDataLastCumulativePrice"
4949
50-let x = "k_latestShortPremiumFraction"
50+let x = "k_twapDataLastPrice"
5151
52-let y = "k_nextFundingBlockMinTimestamp"
52+let y = "k_twapDataPreviousMinuteId"
5353
54-let z = "k_longFundingRate"
54+let z = "k_latestLongPremiumFraction"
5555
56-let A = "k_shortFundingRate"
56+let A = "k_latestShortPremiumFraction"
5757
58-let B = "k_qtAstR"
58+let B = "k_nextFundingBlockMinTimestamp"
5959
60-let C = "k_bsAstR"
60+let C = "k_longFundingRate"
6161
62-let D = "k_totalPositionSize"
62+let D = "k_shortFundingRate"
6363
64-let E = "k_totalLongPositionSize"
64+let E = "k_qtAstR"
6565
66-let F = "k_totalShortPositionSize"
66+let F = "k_bsAstR"
6767
68-let G = "k_cumulativeNotional"
68+let G = "k_totalPositionSize"
6969
70-let H = "k_openInterestNotional"
70+let H = "k_totalLongPositionSize"
7171
72-let I = "k_coordinatorAddress"
72+let I = "k_totalShortPositionSize"
7373
74-let J = "k_insurance_address"
74+let J = "k_cumulativeNotional"
7575
76-let K = "k_admin_address"
76+let K = "k_openInterestNotional"
7777
78-let L = "k_admin_public_key"
78+let L = "k_coordinatorAddress"
7979
80-let M = "k_quote_asset"
80+let M = "k_insurance_address"
8181
82-let N = "k_quote_staking"
82+let N = "k_admin_address"
8383
84-let O = "k_staking_address"
84+let O = "k_admin_public_key"
8585
86-let P = "k_miner_address"
86+let P = "k_quote_asset"
8787
88-func Q () = valueOrErrorMessage(addressFromString(getStringValue(this, I)), "Coordinator not set")
88+let Q = "k_quote_staking"
89+
90+let R = "k_staking_address"
91+
92+let S = "k_miner_address"
93+
94+let T = "k_orders_address"
95+
96+let U = "k_referral_address"
97+
98+func V () = valueOrErrorMessage(addressFromString(getStringValue(this, L)), "Coordinator not set")
8999
90100
91-func R () = addressFromString(getStringValue(Q(), K))
101+func W () = addressFromString(getStringValue(V(), N))
92102
93103
94-func S () = fromBase58String(getStringValue(Q(), L))
104+func X () = fromBase58String(getStringValue(V(), O))
95105
96106
97-func T () = fromBase58String(getStringValue(Q(), M))
107+func Y () = fromBase58String(getStringValue(V(), P))
98108
99109
100-func U () = valueOrErrorMessage(addressFromString(getStringValue(Q(), N)), "Quote asset staking not set")
110+func Z () = valueOrErrorMessage(addressFromString(getStringValue(V(), Q)), "Quote asset staking not set")
101111
102112
103-func V () = valueOrErrorMessage(addressFromString(getStringValue(Q(), O)), "Insurance not set")
113+func aa () = valueOrErrorMessage(addressFromString(getStringValue(V(), R)), "Staking not set")
104114
105115
106-func W () = valueOrErrorMessage(addressFromString(getStringValue(Q(), J)), "Insurance not set")
116+func ab () = valueOrErrorMessage(addressFromString(getStringValue(V(), M)), "Insurance not set")
107117
108118
109-func X () = valueOrErrorMessage(addressFromString(getStringValue(Q(), P)), "Insurance not set")
119+func ac () = valueOrErrorMessage(addressFromString(getStringValue(V(), S)), "Miner not set")
110120
111121
112-let Y = 1
113-
114-let Z = 2
115-
116-let aa = 15
117-
118-let ab = 15
119-
120-let ac = 1000
121-
122-let ad = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
123-
124-let ae = (86400 * ad)
125-
126-let af = 100
127-
128-let ag = 1
129-
130-let ah = 2
131-
132-func ai (aj) = (toString(aj) + ",")
122+func ad () = valueOrErrorMessage(addressFromString(getStringValue(V(), T)), "Orders not set")
133123
134124
135-func ak (aj,al) = fraction(aj, ad, al, HALFEVEN)
125+func ae () = valueOrErrorMessage(addressFromString(getStringValue(V(), U)), "Referral not set")
136126
137127
138-func am (aj,al) = fraction(aj, al, ad, HALFEVEN)
128+let af = 1
129+
130+let ag = 2
131+
132+let ah = 15
133+
134+let ai = 15
135+
136+let aj = 1000
137+
138+let ak = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
139+
140+let al = (86400 * ak)
141+
142+let am = 100
143+
144+let an = 1
145+
146+let ao = 2
147+
148+func ap (aq) = (toString(aq) + ",")
139149
140150
141-func an (aj) = if ((aj > 0))
142- then aj
143- else -(aj)
151+func ar (aq,as) = fraction(aq, ak, as, HALFEVEN)
144152
145153
146-func ao (aj,al) = if ((aj >= al))
147- then aj
148- else al
154+func at (aq,as) = fraction(aq, as, ak, HALFEVEN)
149155
150156
151-func ap (aq,ar) = ((aq + "_") + ar)
157+func au (aq) = if ((aq > 0))
158+ then aq
159+ else -(aq)
152160
153161
154-func as (at) = {
155- func au (av,aw) = ((av + aw) + ",")
162+func av (aq,as) = if ((aq >= as))
163+ then aq
164+ else as
156165
157- let ax = {
158- let ay = at
159- let az = size(ay)
160- let aA = ""
161- func aB (aC,aD) = if ((aD >= az))
162- then aC
163- else au(aC, ay[aD])
164166
165- func aE (aC,aD) = if ((aD >= az))
166- then aC
167+func aw (ax,ay) = ((ax + "_") + ay)
168+
169+
170+func az (aA) = {
171+ func aB (aC,aD) = ((aC + aD) + ",")
172+
173+ let aE = {
174+ let aF = aA
175+ let aG = size(aF)
176+ let aH = ""
177+ func aI (aJ,aK) = if ((aK >= aG))
178+ then aJ
179+ else aB(aJ, aF[aK])
180+
181+ func aL (aJ,aK) = if ((aK >= aG))
182+ then aJ
167183 else throw("List size exceeds 20")
168184
169- aE(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aA, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
185+ aL(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aH, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
170186 }
171- let aF = dropRight(ax, 1)
172- let aG = if ((take(aF, 1) == ","))
173- then drop(aF, 1)
174- else aF
175- aG
187+ let aM = dropRight(aE, 1)
188+ let aN = if ((take(aM, 1) == ","))
189+ then drop(aM, 1)
190+ else aM
191+ aN
176192 }
177193
178194
179-func aH (aI) = split(aI, ",")
195+func aO (aP) = split(aP, ",")
180196
181197
182-func aJ (at,aK,aL) = if ((size(at) > aK))
183- then (removeByIndex(at, 0) :+ aL)
184- else (at :+ aL)
198+func aQ (aA,aR,aS) = if ((size(aA) > aR))
199+ then (removeByIndex(aA, 0) :+ aS)
200+ else (aA :+ aS)
185201
186202
187-func aM (aN) = valueOrErrorMessage(getInteger(this, aN), ("no value for " + aN))
203+func aT (aU) = valueOrErrorMessage(getInteger(this, aU), ("no value for " + aU))
188204
189205
190-func aO () = aM(d)
206+func aV () = aT(d)
191207
192208
193-func aP () = aM(k)
209+func aW () = aT(l)
194210
195211
196-func aQ () = aM(m)
212+func aX () = aT(n)
197213
198214
199-func aR () = aM(B)
215+func aY () = aT(E)
200216
201217
202-func aS () = aM(C)
218+func aZ () = aT(F)
203219
204220
205-func aT () = aM(D)
221+func ba () = aT(G)
206222
207223
208-func aU () = aM(G)
224+func bb () = aT(J)
209225
210226
211-func aV () = aM(H)
227+func bc () = aT(K)
212228
213229
214-func aW () = aM(y)
230+func bd () = aT(B)
215231
216232
217-func aX () = aM(l)
233+func be () = aT(m)
218234
219235
220-func aY () = (aX() * ad)
236+func bf () = (be() * ak)
221237
222238
223-func aZ () = (aX() * ac)
239+func bg () = (be() * aj)
224240
225241
226-func ba () = aM(n)
242+func bh () = aT(o)
227243
228244
229-func bb () = aM(o)
245+func bi () = aT(p)
230246
231247
232-func bc () = aM(p)
248+func bj () = aT(q)
233249
234250
235-func bd () = aM(q)
251+func bk () = aT(r)
236252
237253
238-func be () = aM(w)
254+func bl () = aT(s)
239255
240256
241-func bf () = aM(x)
257+func bm () = aT(t)
242258
243259
244-func bg () = aM(F)
260+func bn () = aT(z)
245261
246262
247-func bh () = aM(E)
263+func bo () = aT(A)
248264
249265
250-func bi (bj,bk,bl) = {
251- let bm = (bj - bk)
252- if (if (bl)
253- then (0 > bm)
266+func bp () = aT(I)
267+
268+
269+func bq () = aT(H)
270+
271+
272+func br (bs) = valueOrElse(getString(ad(), "k_sender"), toString(bs.caller))
273+
274+
275+func bt (bu,bv,bw) = {
276+ let bx = (bu - bv)
277+ if (if (bw)
278+ then (0 > bx)
254279 else false)
255280 then throw("Invalid margin")
256- else if (if (!(bl))
257- then (bm >= 0)
281+ else if (if (!(bw))
282+ then (bx >= 0)
258283 else false)
259284 then throw("Invalid margin")
260285 else true
261286 }
262287
263288
264-func bn (bo) = if ((bo == 0))
289+func by (bz) = if ((bz == 0))
265290 then throw("Should not be called with _positionSize == 0")
266- else if ((bo > 0))
267- then be()
268- else bf()
291+ else if ((bz > 0))
292+ then bn()
293+ else bo()
269294
270295
271-func bp (bq) = {
272- let br = getInteger(this, ap(e, bq))
273- let bs = br
274- if ($isInstanceOf(bs, "Int"))
296+func bA (bB) = {
297+ let bC = getInteger(this, aw(e, bB))
298+ let bD = bC
299+ if ($isInstanceOf(bD, "Int"))
275300 then {
276- let bt = bs
277- $Tuple4(bt, getIntegerValue(this, ap(f, bq)), getIntegerValue(this, ap(g, bq)), getIntegerValue(this, ap(h, bq)))
301+ let bE = bD
302+ $Tuple4(bE, getIntegerValue(this, aw(f, bB)), getIntegerValue(this, aw(g, bB)), getIntegerValue(this, aw(h, bB)))
278303 }
279304 else $Tuple4(0, 0, 0, 0)
280305 }
281306
282307
283-func bu (bq) = if ((bp(bq)._1 == 0))
308+func bF (bB) = if ((bA(bB)._1 == 0))
284309 then throw("No open position")
285310 else true
286311
287312
288-func bv () = valueOrElse(getBoolean(this, i), false)
313+func bG () = valueOrElse(getBoolean(this, j), false)
289314
290315
291-func bw () = valueOrElse(getBoolean(this, j), false)
316+func bH () = valueOrElse(getBoolean(this, k), false)
292317
293318
294-func bx (by,bz,bA) = if (by)
319+func bI (bJ,bK,bL) = if (bJ)
295320 then {
296- let bB = (aS() - bA)
297- if ((0 >= bB))
321+ let bM = (aZ() - bL)
322+ if ((0 >= bM))
298323 then throw("Tx lead to base asset reserve <= 0, revert")
299- else $Tuple4((aR() + bz), bB, (aT() + bA), (aU() + bz))
324+ else $Tuple4((aY() + bK), bM, (ba() + bL), (bb() + bK))
300325 }
301326 else {
302- let bC = (aR() - bz)
303- if ((0 >= bC))
327+ let bN = (aY() - bK)
328+ if ((0 >= bN))
304329 then throw("Tx lead to base quote reserve <= 0, revert")
305- else $Tuple4(bC, (aS() + bA), (aT() - bA), (aU() - bz))
330+ else $Tuple4(bN, (aZ() + bL), (ba() - bL), (bb() - bK))
306331 }
307332
308333
309-func bD (by,bz) = {
310- let bE = aR()
311- let bF = aS()
312- let aN = am(bE, bF)
313- let bG = if (by)
314- then (bE + bz)
315- else (bE - bz)
316- let bH = ak(aN, bG)
317- let bI = an((bH - bF))
318- let bJ = if (by)
319- then bI
320- else -(bI)
321- let bK = bx(by, bz, bI)
322- let bL = bK._1
323- let bM = bK._2
324- let bN = bK._3
325- let bO = bK._4
326- let bP = ak(bE, bF)
327- let bQ = ak(bz, bI)
328- let bR = an((bP - bQ))
329- let bS = (ad - ak(bP, (bP + bR)))
330- let bT = bd()
331- if ((bS > bT))
332- then throw(((((((((((((("Price impact " + toString(bS)) + " > max price impact ") + toString(bT)) + " before quote asset: ") + toString(bE)) + " before base asset: ") + toString(bF)) + " quote asset amount to exchange: ") + toString(bz)) + " price before: ") + toString(bP)) + " marketPrice: ") + toString(bQ)))
333- else $Tuple5(bJ, bL, bM, bN, bO)
334+func bO (bJ,bK) = {
335+ let bP = aY()
336+ let bQ = aZ()
337+ let aU = at(bP, bQ)
338+ let bR = if (bJ)
339+ then (bP + bK)
340+ else (bP - bK)
341+ let bS = ar(aU, bR)
342+ let bT = au((bS - bQ))
343+ let bU = if (bJ)
344+ then bT
345+ else -(bT)
346+ let bV = bI(bJ, bK, bT)
347+ let bW = bV._1
348+ let bX = bV._2
349+ let bY = bV._3
350+ let bZ = bV._4
351+ let ca = ar(bP, bQ)
352+ let cb = ar(bK, bT)
353+ let cc = au((ca - cb))
354+ let cd = (ak - ar(ca, (ca + cc)))
355+ let ce = bl()
356+ if ((cd > ce))
357+ then throw(((((((((((((("Price impact " + toString(cd)) + " > max price impact ") + toString(ce)) + " before quote asset: ") + toString(bP)) + " before base asset: ") + toString(bQ)) + " quote asset amount to exchange: ") + toString(bK)) + " price before: ") + toString(ca)) + " marketPrice: ") + toString(cb)))
358+ else $Tuple5(bU, bW, bX, bY, bZ)
334359 }
335360
336361
337-func bU (bV,bW,bX,bY) = {
338- let bZ = if ((bV != 0))
362+func cf (cg,ch,ci,cj) = {
363+ let ck = if ((cg != 0))
339364 then {
340- let ca = bn(bV)
341- am((ca - bX), bV)
365+ let cl = by(cg)
366+ at((cl - ci), cg)
342367 }
343368 else 0
344- let cb = ((bY - bZ) + bW)
345- let cc = if ((0 > cb))
346- then $Tuple2(0, an(cb))
347- else $Tuple2(an(cb), 0)
348- let cd = cc._1
349- let ce = cc._2
350- $Tuple3(cd, ce, bZ)
369+ let cm = ((cj - ck) + ch)
370+ let cn = if ((0 > cm))
371+ then $Tuple2(0, au(cm))
372+ else $Tuple2(au(cm), 0)
373+ let co = cn._1
374+ let cp = cn._2
375+ $Tuple3(co, cp, ck)
351376 }
352377
353378
354-func cf (by,bA,cg) = {
355- let ch = aR()
356- let ci = aS()
357- let bP = ak(ch, ci)
358- if ((bA == 0))
379+func cq (bJ,bL,cr,cs,ct) = {
380+ let ca = ar(cs, ct)
381+ if ((bL == 0))
359382 then throw("Invalid base asset amount")
360383 else {
361- let aN = am(ch, ci)
362- let cj = if (by)
363- then (ci + bA)
364- else (ci - bA)
365- let ck = ak(aN, cj)
366- let cl = an((ck - ch))
367- let bT = bd()
368- let cm = bx(!(by), cl, bA)
369- let bL = cm._1
370- let bM = cm._2
371- let bN = cm._3
372- let bO = cm._4
373- let bQ = ak(cl, bA)
374- let bR = an((bP - bQ))
375- let bS = (ad - ak(bP, (bP + bR)))
376- if (if ((bS > bT))
377- then cg
384+ let aU = at(cs, ct)
385+ let cu = if (bJ)
386+ then (ct + bL)
387+ else (ct - bL)
388+ let cv = ar(aU, cu)
389+ let cw = au((cv - cs))
390+ let ce = bl()
391+ let cx = bI(!(bJ), cw, bL)
392+ let bW = cx._1
393+ let bX = cx._2
394+ let bY = cx._3
395+ let bZ = cx._4
396+ let cb = ar(cw, bL)
397+ let cc = au((ca - cb))
398+ let cd = (ak - ar(ca, (ca + cc)))
399+ if (if ((cd > ce))
400+ then cr
378401 else false)
379- then throw(((((((((((((("Price impact " + toString(bS)) + " > max price impact ") + toString(bT)) + " before quote asset: ") + toString(ch)) + " before base asset: ") + toString(ci)) + " base asset amount to exchange: ") + toString(bA)) + " price before: ") + toString(bP)) + " market price: ") + toString(bQ)))
380- else $Tuple7(cl, bL, bM, bN, bO, (bh() - (if (by)
381- then an(bA)
382- else 0)), (bg() - (if (!(by))
383- then an(bA)
384- else 0)))
402+ then throw(((((((((((((("Price impact " + toString(cd)) + " > max price impact ") + toString(ce)) + " before quote asset: ") + toString(cs)) + " before base asset: ") + toString(ct)) + " base asset amount to exchange: ") + toString(bL)) + " price before: ") + toString(ca)) + " market price: ") + toString(cb)))
403+ else $Tuple8(cw, bW, bX, bY, bZ, (bq() - (if (bJ)
404+ then au(bL)
405+ else 0)), (bp() - (if (!(bJ))
406+ then au(bL)
407+ else 0)), cd)
385408 }
386409 }
387410
388411
389-func cn () = {
390- let co = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
391- let cp = getStringValue(this, a)
392- let cq = getStringValue(this, b)
393- let cr = valueOrErrorMessage(getInteger(co, cp), ((("Can not get oracle price. Oracle: " + toString(co)) + " key: ") + cp))
394- cr
412+func cy (bJ,bL,cr) = cq(bJ, bL, cr, aY(), aZ())
413+
414+
415+func cz () = {
416+ let cA = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
417+ let cB = getStringValue(this, a)
418+ let cC = getStringValue(this, b)
419+ let cD = valueOrErrorMessage(getInteger(cA, cB), ((("Can not get oracle price. Oracle: " + toString(cA)) + " key: ") + cB))
420+ cD
395421 }
396422
397423
398-func cs () = {
399- let ch = aR()
400- let ci = aS()
401- ak(ch, ci)
424+func cE (cs,ct) = {
425+ let cF = cz()
426+ let cG = ar(cs, ct)
427+ let cH = ar((cF + cG), (2 * ak))
428+ let cI = ar(au((cF - cG)), cH)
429+ if ((cI > bm()))
430+ then throw(((("Price spread " + toString(cI)) + " > max price spread ") + toString(bm())))
431+ else true
402432 }
403433
404434
405-func ct () = {
406- let cu = cn()
407- let cv = cs()
408- (ak(an((cu - cv)), cu) > bc())
435+func cJ () = {
436+ let cs = aY()
437+ let ct = aZ()
438+ ar(cs, ct)
409439 }
410440
411441
412-func cw (bq,cx) = {
413- let cy = bp(bq)
414- let bt = cy._1
415- let cz = cy._2
416- let cA = cy._3
417- let cB = cy._4
418- let cC = an(bt)
419- if ((cC == 0))
420- then throw("Invalid position size")
442+func cK () = {
443+ let cF = cz()
444+ let cL = cJ()
445+ (ar(au((cF - cL)), cF) > bk())
446+ }
447+
448+
449+func cM (bz,cN,cs,ct) = {
450+ let cO = au(bz)
451+ let cP = (0 > bz)
452+ let cQ = if ((cN == an))
453+ then {
454+ let cR = cq(!(cP), cO, false, cs, ct)
455+ let cS = cR._1
456+ let cT = cR._2
457+ let cU = cR._3
458+ let cV = cR._4
459+ cS
460+ }
461+ else at(cO, cz())
462+ cQ
463+ }
464+
465+
466+func cW (bz,cX,cs,ct,cN) = if ((bz == 0))
467+ then throw("Invalid position size")
468+ else {
469+ let cP = (0 > bz)
470+ let cQ = cM(bz, cN, cs, ct)
471+ let cY = if (cP)
472+ then (cX - cQ)
473+ else (cQ - cX)
474+ $Tuple2(cQ, cY)
475+ }
476+
477+
478+func cZ (bB,cN) = {
479+ let da = bA(bB)
480+ let bE = da._1
481+ let db = da._2
482+ let dc = da._3
483+ let dd = da._4
484+ cW(bE, dc, aY(), aZ(), cN)
485+ }
486+
487+
488+func de (df,dg,dh) = ar((df - dg), dh)
489+
490+
491+func di (bB,cN) = {
492+ let dj = bA(bB)
493+ let bE = dj._1
494+ let db = dj._2
495+ let dk = dj._3
496+ let dd = dj._4
497+ let dl = cZ(bB, cN)
498+ let cQ = dl._1
499+ let cY = dl._2
500+ let dm = cf(bE, db, dd, cY)
501+ let co = dm._1
502+ let cp = dm._2
503+ de(co, cp, cQ)
504+ }
505+
506+
507+func dn (bB) = di(bB, an)
508+
509+
510+func do (bB,bz) = {
511+ let dp = av(bj(), (ak - ar(dn(bB), bh())))
512+ let dq = at(au(bz), dp)
513+ let dr = cy((bz > 0), dq, false)
514+ let ds = dr._1
515+ let cd = dr._8
516+ if ((bl() > cd))
517+ then ds
421518 else {
422- let cD = (0 > bt)
423- let cE = if ((cx == ag))
424- then {
425- let cF = cf(!(cD), cC, false)
426- let cG = cF._1
427- let cH = cF._2
428- let cI = cF._3
429- let cJ = cF._4
430- cG
431- }
432- else am(cC, cn())
433- let cK = if (cD)
434- then (cA - cE)
435- else (cE - cA)
436- $Tuple2(cE, cK)
519+ let dt = at(au(bz), bj())
520+ let du = cy((bz > 0), dt, false)._1
521+ du
437522 }
438523 }
439524
440525
441-func cL (cM,cN,cO) = ak((cM - cN), cO)
442-
443-
444-func cP (bq,cx) = {
445- let cQ = bp(bq)
446- let bt = cQ._1
447- let cz = cQ._2
448- let cR = cQ._3
449- let cB = cQ._4
450- let cS = cw(bq, cx)
451- let cE = cS._1
452- let cK = cS._2
453- let cT = bU(bt, cz, cB, cK)
454- let cd = cT._1
455- let ce = cT._2
456- cL(cd, ce, cE)
526+func dv (bB,cr) = {
527+ let dw = bA(bB)
528+ let bE = dw._1
529+ let db = dw._2
530+ let dc = dw._3
531+ let dd = dw._4
532+ let cY = cZ(bB, an)._2
533+ let dx = cf(bE, db, dd, cY)
534+ let co = dx._1
535+ let cp = dx._2
536+ let dt = -(bE)
537+ let dy = cY
538+ let dz = -(co)
539+ let dA = cy((bE > 0), au(bE), cr)
540+ let du = dA._1
541+ let bR = dA._2
542+ let bS = dA._3
543+ let dB = dA._4
544+ let dC = dA._5
545+ let dD = dA._6
546+ let dE = dA._7
547+ let dF = (bc() - dc)
548+ $Tuple12(dt, cp, dy, dz, bR, bS, dB, dC, dF, du, dD, dE)
457549 }
458550
459551
460-func cU (bq) = cP(bq, ag)
552+func dG () = {
553+ let dH = ((lastBlock.timestamp / 1000) / 60)
554+ let dI = (dH - ah)
555+ let dJ = valueOrElse(getString(this, u), "")
556+ let dK = split(dJ, ",")
557+ func dL (aC,dM) = if ((dI >= parseIntValue(dM)))
558+ then (aC :+ parseIntValue(dM))
559+ else aC
461560
561+ let dN = {
562+ let aF = dK
563+ let aG = size(aF)
564+ let aH = nil
565+ func aI (aJ,aK) = if ((aK >= aG))
566+ then aJ
567+ else dL(aJ, aF[aK])
462568
463-func cV (bq,cg) = {
464- let cW = bp(bq)
465- let bt = cW._1
466- let cz = cW._2
467- let cA = cW._3
468- let cB = cW._4
469- let cX = cw(bq, ag)
470- let cH = cX._1
471- let cK = cX._2
472- let cY = bU(bt, cz, cB, cK)
473- let cd = cY._1
474- let ce = cY._2
475- let cZ = -(bt)
476- let da = cK
477- let db = -(cd)
478- let dc = cf((bt > 0), an(bt), cg)
479- let dd = dc._1
480- let bG = dc._2
481- let bH = dc._3
482- let de = dc._4
483- let df = dc._5
484- let dg = dc._6
485- let dh = dc._7
486- let di = (aV() - cA)
487- $Tuple12(cZ, ce, da, db, bG, bH, de, df, di, dd, dg, dh)
569+ func aL (aJ,aK) = if ((aK >= aG))
570+ then aJ
571+ else throw("List size exceeds 20")
572+
573+ aL(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aH, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
574+ }
575+ let dO = if ((size(dN) > 0))
576+ then max(dN)
577+ else parseIntValue(dK[0])
578+ let dP = valueOrElse(getInteger(this, v), 0)
579+ let dQ = valueOrElse(getInteger(this, ((w + "_") + toString(dP))), 0)
580+ let dR = valueOrElse(getInteger(this, ((x + "_") + toString(dP))), 0)
581+ let dS = (dQ + ((dH - dP) * dR))
582+ let dT = valueOrElse(getInteger(this, ((w + "_") + toString(dO))), 0)
583+ let dU = valueOrElse(getInteger(this, ((x + "_") + toString(dO))), 0)
584+ let dV = (dT + ((dI - dO) * dU))
585+ ((dS - dV) / ah)
488586 }
489587
490588
491-func dj () = {
492- let dk = ((lastBlock.timestamp / 1000) / 60)
493- let dl = (dk - aa)
494- let dm = valueOrElse(getString(this, r), "")
495- let dn = split(dm, ",")
496- func do (av,dp) = if ((dl >= parseIntValue(dp)))
497- then (av :+ parseIntValue(dp))
498- else av
499-
500- let dq = {
501- let ay = dn
502- let az = size(ay)
503- let aA = nil
504- func aB (aC,aD) = if ((aD >= az))
505- then aC
506- else do(aC, ay[aD])
507-
508- func aE (aC,aD) = if ((aD >= az))
509- then aC
510- else throw("List size exceeds 20")
511-
512- aE(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aA, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
513- }
514- let dr = if ((size(dq) > 0))
515- then max(dq)
516- else parseIntValue(dn[0])
517- let ds = valueOrElse(getInteger(this, s), 0)
518- let dt = valueOrElse(getInteger(this, ((t + "_") + toString(ds))), 0)
519- let du = valueOrElse(getInteger(this, ((u + "_") + toString(ds))), 0)
520- let dv = (dt + ((dk - ds) * du))
521- let dw = valueOrElse(getInteger(this, ((t + "_") + toString(dr))), 0)
522- let dx = valueOrElse(getInteger(this, ((u + "_") + toString(dr))), 0)
523- let dy = (dw + ((dl - dr) * dx))
524- ((dv - dy) / aa)
589+func dW (dX) = {
590+ let bz = ba()
591+ let dY = (bz > 0)
592+ let dZ = cy(dY, au(bz), false)._1
593+ let ea = aZ()
594+ let eb = at(ea, dX)
595+ let ec = cW(bz, dZ, eb, ea, an)._2
596+ $Tuple2(eb, ec)
525597 }
526598
527599
528-func dz (dA,dB,dC,dD,dE,dF,dG) = [IntegerEntry(m, dA), IntegerEntry(n, dB), IntegerEntry(o, dC), IntegerEntry(l, dD), IntegerEntry(k, dE), IntegerEntry(p, dF), IntegerEntry(q, dG)]
600+func ed () = {
601+ let ee = cz()
602+ let ef = dG()
603+ let eg = (ef - ee)
604+ if (if ((bp() == 0))
605+ then true
606+ else (bq() == 0))
607+ then $Tuple2(0, 0)
608+ else if ((0 > eg))
609+ then {
610+ let eh = ar(at(eg, bf()), al)
611+ let ei = ar(at(eh, bp()), bq())
612+ $Tuple2(eh, ei)
613+ }
614+ else {
615+ let ei = ar(at(eg, bf()), al)
616+ let eh = ar(at(ei, bq()), bp())
617+ $Tuple2(eh, ei)
618+ }
619+ }
529620
530621
531-func dH (dI,dJ,dK,dL,dM) = [IntegerEntry(y, dI), IntegerEntry(w, dJ), IntegerEntry(x, dK), IntegerEntry(z, dL), IntegerEntry(A, dM)]
622+func ej (ek,el,em,en,eo,ep,eq,er,es) = [IntegerEntry(n, ek), IntegerEntry(o, el), IntegerEntry(p, em), IntegerEntry(m, en), IntegerEntry(l, eo), IntegerEntry(r, ep), IntegerEntry(s, eq), IntegerEntry(q, er), IntegerEntry(t, es)]
532623
533624
534-func dN (ar,dO,dP,dQ,ca) = [IntegerEntry(ap(e, ar), dO), IntegerEntry(ap(f, ar), dP), IntegerEntry(ap(g, ar), dQ), IntegerEntry(ap(h, ar), ca)]
625+func et (eu,ev,ew,ex,ey) = [IntegerEntry(B, eu), IntegerEntry(z, ev), IntegerEntry(A, ew), IntegerEntry(C, ex), IntegerEntry(D, ey)]
535626
536627
537-func dR (dS) = {
538- let dk = ((lastBlock.timestamp / 1000) / 60)
539- let dT = valueOrElse(getInteger(this, s), 0)
540- if ((dT > dk))
628+func ez (ay,eA,eB,eC,cl) = [IntegerEntry(aw(e, ay), eA), IntegerEntry(aw(f, ay), eB), IntegerEntry(aw(g, ay), eC), IntegerEntry(aw(h, ay), cl)]
629+
630+
631+func eD (eE) = {
632+ let dH = ((lastBlock.timestamp / 1000) / 60)
633+ let eF = valueOrElse(getInteger(this, v), 0)
634+ if ((eF > dH))
541635 then throw("TWAP out-of-order")
542636 else {
543- let ds = if ((dT == 0))
544- then dk
545- else dT
546- if ((dk > dT))
637+ let dP = if ((eF == 0))
638+ then dH
639+ else eF
640+ if ((dH > eF))
547641 then {
548- let dU = valueOrElse(getInteger(this, ((t + "_") + toString(dT))), 0)
549- let dV = valueOrElse(getInteger(this, ((u + "_") + toString(dT))), dS)
550- let dW = (dU + ((dk - ds) * dV))
551- let dn = aJ(aH(valueOrElse(getString(this, r), "")), aa, toString(dk))
552-[IntegerEntry(ap(t, toString(dk)), dW), IntegerEntry(ap(u, toString(dk)), dS), IntegerEntry(ap(v, toString(dk)), dT), IntegerEntry(s, dk), StringEntry(r, as(dn))]
642+ let eG = valueOrElse(getInteger(this, ((w + "_") + toString(eF))), 0)
643+ let eH = valueOrElse(getInteger(this, ((x + "_") + toString(eF))), eE)
644+ let eI = (eG + ((dH - dP) * eH))
645+ let dK = aQ(aO(valueOrElse(getString(this, u), "")), ah, toString(dH))
646+[IntegerEntry(aw(w, toString(dH)), eI), IntegerEntry(aw(x, toString(dH)), eE), IntegerEntry(aw(y, toString(dH)), eF), IntegerEntry(v, dH), StringEntry(u, az(dK))]
553647 }
554648 else {
555- let dX = valueOrElse(getInteger(this, ap(v, toString(dk))), 0)
556- let dU = valueOrElse(getInteger(this, ap(t, toString(dX))), 0)
557- let dV = valueOrElse(getInteger(this, ap(u, toString(dX))), dS)
558- let dW = (dU + ((dk - dX) * dV))
559-[IntegerEntry(ap(t, toString(dk)), dW), IntegerEntry(ap(u, toString(dk)), dS)]
649+ let eJ = valueOrElse(getInteger(this, aw(y, toString(dH))), 0)
650+ let eG = valueOrElse(getInteger(this, aw(w, toString(eJ))), 0)
651+ let eH = valueOrElse(getInteger(this, aw(x, toString(eJ))), eE)
652+ let eI = (eG + ((dH - eJ) * eH))
653+[IntegerEntry(aw(w, toString(dH)), eI), IntegerEntry(aw(x, toString(dH)), eE)]
560654 }
561655 }
562656 }
563657
564658
565-func dY (bE,bF) = [IntegerEntry(B, bE), IntegerEntry(C, bF)]
659+func eK (bP,bQ) = [IntegerEntry(E, bP), IntegerEntry(F, bQ)]
566660
567661
568-func dZ (bE,bF,ea,eb,ec,ed,ee) = if (((ed - ee) != ea))
569- then throw(((((("Invalid AMM state data: " + toString(ed)) + " + ") + toString(ee)) + " != ") + toString(ea)))
570- else ((dY(bE, bF) ++ [IntegerEntry(D, ea), IntegerEntry(G, eb), IntegerEntry(H, ec), IntegerEntry(E, ed), IntegerEntry(F, ee)]) ++ dR(ak(bE, bF)))
662+func eL (bP,bQ,eM,eN,eO,eP,eQ) = if (((eP - eQ) != eM))
663+ then throw(((((("Invalid AMM state data: " + toString(eP)) + " + ") + toString(eQ)) + " != ") + toString(eM)))
664+ else ((eK(bP, bQ) ++ [IntegerEntry(G, eM), IntegerEntry(J, eN), IntegerEntry(K, eO), IntegerEntry(H, eP), IntegerEntry(I, eQ)]) ++ eD(ar(bP, bQ)))
571665
572666
573-func ef (ar) = [DeleteEntry(ap(e, ar)), DeleteEntry(ap(f, ar)), DeleteEntry(ap(g, ar)), DeleteEntry(ap(h, ar))]
667+func eR (ay) = [DeleteEntry(aw(e, ay)), DeleteEntry(aw(f, ay)), DeleteEntry(aw(g, ay)), DeleteEntry(aw(h, ay)), IntegerEntry(aw(i, ay), lastBlock.timestamp)]
574668
575669
576-func eg (ar,eh) = {
577- let ei = assetBalance(this, T())
578- if ((eh > ei))
579- then throw(((("Unable to withdraw " + toString(eh)) + " from contract balance ") + toString(ei)))
580- else [ScriptTransfer(ar, eh, T())]
670+func eS (ay,eT) = {
671+ let eU = assetBalance(this, Y())
672+ if ((eT > eU))
673+ then throw(((("Unable to withdraw " + toString(eT)) + " from contract balance ") + toString(eU)))
674+ else [ScriptTransfer(ay, eT, Y())]
581675 }
582676
583677
584-func ej (ek) = if ((0 > ek))
678+func eV (bs) = if ((0 > bs))
585679 then throw("Balance")
586- else [IntegerEntry(d, ek)]
680+ else [IntegerEntry(d, bs)]
587681
588682
589-func el (ek) = [ScriptTransfer(V(), ek, T())]
683+func eW (bs) = [ScriptTransfer(aa(), bs, Y())]
590684
591685
592-@Callable(ek)
593-func pause () = if ((ek.caller != R()))
686+@Callable(bs)
687+func pause () = if ((bs.caller != W()))
594688 then throw("Invalid togglePause params")
595- else [BooleanEntry(j, true)]
689+ else [BooleanEntry(k, true)]
596690
597691
598692
599-@Callable(ek)
600-func unpause () = if ((ek.caller != R()))
693+@Callable(bs)
694+func unpause () = if ((bs.caller != W()))
601695 then throw("Invalid togglePause params")
602- else [BooleanEntry(j, false)]
696+ else [BooleanEntry(k, false)]
603697
604698
605699
606-@Callable(ek)
607-func addLiquidity (bz) = if (if ((ek.caller != R()))
700+@Callable(bs)
701+func addLiquidity (bK) = if (if ((bs.caller != W()))
608702 then true
609- else (0 >= bz))
703+ else (0 >= bK))
610704 then throw("Invalid addLiquidity params")
611705 else {
612- let bE = aR()
613- let bF = aS()
614- let dS = ak(bE, bF)
615- let em = ak(bz, dS)
616- let en = (bE + bz)
617- let eo = (bF + em)
618- dY(en, eo)
706+ let bP = aY()
707+ let bQ = aZ()
708+ let eE = ar(bP, bQ)
709+ let eX = ar(bK, eE)
710+ let eY = (bP + bK)
711+ let eZ = (bQ + eX)
712+ eK(eY, eZ)
619713 }
620714
621715
622716
623-@Callable(ek)
624-func removeLiquidity (bz) = if (if ((ek.caller != R()))
717+@Callable(bs)
718+func removeLiquidity (bK) = if (if ((bs.caller != W()))
625719 then true
626- else (0 >= bz))
720+ else (0 >= bK))
627721 then throw("Invalid removeLiquidity params")
628722 else {
629- let bE = aR()
630- let bF = aS()
631- let dS = ak(bE, bF)
632- let ep = ak(bz, dS)
633- let en = (bE - bz)
634- let eo = (bF - ep)
635- dY(en, eo)
723+ let bP = aY()
724+ let bQ = aZ()
725+ let eE = ar(bP, bQ)
726+ let fa = ar(bK, eE)
727+ let eY = (bP - bK)
728+ let eZ = (bQ - fa)
729+ eK(eY, eZ)
636730 }
637731
638732
639733
640-@Callable(ek)
641-func changeSettings (dA,dB,dC,dD,dE,dF,dG) = if ((ek.caller != R()))
734+@Callable(bs)
735+func changeSettings (ek,el,em,en,eo,ep,eq,er,es) = if ((bs.caller != W()))
642736 then throw("Invalid changeSettings params")
643- else dz(dA, dB, dC, dD, dE, dF, dG)
737+ else ej(ek, el, em, en, eo, ep, eq, er, es)
644738
645739
646740
647-@Callable(ek)
648-func initialize (bE,bF,dD,dA,dB,dC,dE,eq,er,es,dF,dG) = if (if (if (if (if (if (if (if (if (if ((0 >= bE))
741+@Callable(bs)
742+func initialize (bP,bQ,en,ek,el,em,eo,fb,fc,fd,ep,eq,er,es) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= bP))
649743 then true
650- else (0 >= bF))
744+ else (0 >= bQ))
651745 then true
652- else (0 >= dD))
746+ else (0 >= en))
653747 then true
654- else (0 >= dA))
748+ else (0 >= ek))
655749 then true
656- else (0 >= dB))
750+ else (0 >= el))
657751 then true
658- else (0 >= dC))
752+ else (0 >= em))
659753 then true
660- else (0 >= dE))
754+ else (0 >= eo))
661755 then true
662- else (0 >= dF))
756+ else (0 >= ep))
663757 then true
664- else (0 >= dG))
758+ else (0 >= eq))
665759 then true
666- else bv())
760+ else (0 >= er))
761+ then true
762+ else (0 >= es))
763+ then true
764+ else bG())
667765 then throw("Invalid initialize parameters")
668- else ((((dZ(bE, bF, 0, 0, 0, 0, 0) ++ dz(dA, dB, dC, dD, dE, dF, dG)) ++ dH((lastBlock.timestamp + dD), 0, 0, 0, 0)) ++ ej(0)) ++ [BooleanEntry(i, true), StringEntry(c, eq), StringEntry(a, er), StringEntry(I, es)])
766+ else ((((eL(bP, bQ, 0, 0, 0, 0, 0) ++ ej(ek, el, em, en, eo, ep, eq, er, es)) ++ et((lastBlock.timestamp + en), 0, 0, 0, 0)) ++ eV(0)) ++ [BooleanEntry(j, true), StringEntry(c, fb), StringEntry(a, fc), StringEntry(L, fd)])
669767
670768
671769
672-@Callable(ek)
673-func setMaxPriceImpact (dG) = if (if ((0 >= dG))
770+@Callable(bs)
771+func setInitMarginRatio (ek) = if (if ((0 >= ek))
674772 then true
675- else !(bv()))
676- then throw("Invalid _maxPriceImpact parameters")
677- else dz(aQ(), ba(), bb(), aX(), aP(), bc(), dG)
773+ else !(bG()))
774+ then throw("Invalid setInitMarginRatio parameters")
775+ else ej(ek, bh(), bi(), be(), aW(), bk(), bl(), bj(), bm())
678776
679777
680778
681-@Callable(ek)
682-func setInitMarginRatio (dA) = if (if ((0 >= dA))
779+@Callable(bs)
780+func decreasePosition (eT,fe,ff) = if (if (if (if (if ((0 >= eT))
683781 then true
684- else !(bv()))
685- then throw("Invalid setInitMarginRatio parameters")
686- else dz(dA, ba(), bb(), aX(), aP(), bc(), bd())
687-
688-
689-
690-@Callable(ek)
691-func decreasePosition (eh,et,eu) = if (if (if (if (if ((0 >= eh))
782+ else !(bG()))
692783 then true
693- else !(bv()))
784+ else !(bt(ar(ak, fe), aX(), true)))
694785 then true
695- else !(bi(ak(ad, et), aQ(), true)))
786+ else !(bF(toString(bs.caller))))
696787 then true
697- else !(bu(toString(ek.caller))))
698- then true
699- else bw())
788+ else bH())
700789 then throw("Invalid decreasePosition parameters")
701790 else {
702- let ev = bp(toString(ek.caller))
703- let ew = ev._1
704- let ex = ev._2
705- let ey = ev._3
706- let ez = ev._4
707- let eA = if ((ew > 0))
708- then Z
709- else Y
710- let eB = (eA == Y)
711- let eC = am(eh, et)
712- let eD = cw(toString(ek.caller), ag)
713- let eE = eD._1
714- let cK = eD._2
715- let eF = if ((eE > eC))
791+ let fg = bA(toString(bs.caller))
792+ let fh = fg._1
793+ let fi = fg._2
794+ let fj = fg._3
795+ let fk = fg._4
796+ let fl = if ((fh > 0))
797+ then ag
798+ else af
799+ let fm = (fl == af)
800+ let fn = at(eT, fe)
801+ let fo = cZ(toString(bs.caller), an)
802+ let fp = fo._1
803+ let cY = fo._2
804+ let fq = if ((fp > fn))
716805 then {
717- let eG = bD(eB, eC)
718- let cZ = eG._1
719- let bG = eG._2
720- let bH = eG._3
721- let de = eG._4
722- let df = eG._5
723- let eH = an(cZ)
724- if (if ((eu != 0))
725- then (eu > eH)
806+ let fr = bO(fm, fn)
807+ let dt = fr._1
808+ let bR = fr._2
809+ let bS = fr._3
810+ let dB = fr._4
811+ let dC = fr._5
812+ let fs = au(dt)
813+ if (if ((ff != 0))
814+ then (ff > fs)
726815 else false)
727- then throw(((("Too little base asset exchanged, got " + toString(eH)) + " expected ") + toString(eu)))
816+ then throw(((("Too little base asset exchanged, got " + toString(fs)) + " expected ") + toString(ff)))
728817 else {
729- let da = ak(am(cK, eH), an(ew))
730- let eI = bU(ew, ex, ez, da)
731- let cd = eI._1
732- let ce = eI._2
733- let bZ = eI._3
734- let dd = eC
735- let eJ = (cK - da)
736- let eK = if ((ew > 0))
737- then ((eE - dd) - eJ)
738- else ((eJ + eE) - dd)
739- let eL = (ew + cZ)
740- $Tuple11(eL, cd, an(eK), bn(eL), bH, bG, de, df, (aV() - eC), (bh() - (if ((eL > 0))
741- then an(cZ)
742- else 0)), (bg() - (if ((0 > eL))
743- then an(cZ)
818+ let dy = ar(at(cY, fs), au(fh))
819+ let ft = cf(fh, fi, fk, dy)
820+ let co = ft._1
821+ let cp = ft._2
822+ let ck = ft._3
823+ let du = fn
824+ let fu = (cY - dy)
825+ let fv = if ((fh > 0))
826+ then ((fp - du) - fu)
827+ else ((fu + fp) - du)
828+ let fw = (fh + dt)
829+ $Tuple11(fw, co, au(fv), by(fw), bS, bR, dB, dC, (bc() - fn), (bq() - (if ((fw > 0))
830+ then au(dt)
831+ else 0)), (bp() - (if ((0 > fw))
832+ then au(dt)
744833 else 0)))
745834 }
746835 }
747836 else throw("Close position first")
748- let eL = eF._1
749- let eM = eF._2
750- let eN = eF._3
751- let eO = eF._4
752- let bH = eF._5
753- let bG = eF._6
754- let de = eF._7
755- let df = eF._8
756- let di = eF._9
757- let dg = eF._10
758- let dh = eF._11
759- let eP = invoke(X(), "notifyNotional", [toString(ek.caller), eN], nil)
760- if ((eP == eP))
761- then (dN(toString(ek.caller), eL, eM, eN, eO) ++ dZ(bG, bH, de, df, di, dg, dh))
837+ let fw = fq._1
838+ let fx = fq._2
839+ let fy = fq._3
840+ let fz = fq._4
841+ let bS = fq._5
842+ let bR = fq._6
843+ let dB = fq._7
844+ let dC = fq._8
845+ let dF = fq._9
846+ let dD = fq._10
847+ let dE = fq._11
848+ let fA = invoke(ac(), "notifyNotional", [toString(bs.caller), fy], nil)
849+ if ((fA == fA))
850+ then (ez(toString(bs.caller), fw, fx, fy, fz) ++ eL(bR, bS, dB, dC, dF, dD, dE))
762851 else throw("Strict value is not equal to itself.")
763852 }
764853
765854
766855
767-@Callable(ek)
768-func increasePosition (eA,et,eu) = {
769- let eQ = ek.payments[0].amount
770- if (if (if (if (if (if (if ((eA != Y))
771- then (eA != Z)
856+@Callable(bs)
857+func increasePosition (fl,fe,ff,fB) = {
858+ let fC = bs.payments[0].amount
859+ if (if (if (if (if (if (if ((fl != af))
860+ then (fl != ag)
772861 else false)
773862 then true
774- else (0 >= eQ))
863+ else (0 >= fC))
775864 then true
776- else !(bv()))
865+ else !(bG()))
777866 then true
778- else (ek.payments[0].assetId != T()))
867+ else (bs.payments[0].assetId != Y()))
779868 then true
780- else !(bi(ak(ad, et), aQ(), true)))
869+ else !(bt(ar(ak, fe), aX(), true)))
781870 then true
782- else bw())
871+ else bH())
783872 then throw("Invalid increasePosition parameters")
784873 else {
785- let eR = am(eQ, aP())
786- let eh = (eQ - eR)
787- let eS = bp(toString(ek.caller))
788- let ew = eS._1
789- let ex = eS._2
790- let ey = eS._3
791- let ez = eS._4
792- let eT = (ew == 0)
793- let eU = if ((ew > 0))
794- then (eA == Y)
795- else (eA == Z)
796- let eV = if (!(eT))
797- then eU
798- else false
799- let eB = (eA == Y)
800- let eW = if (if (eT)
801- then true
802- else eV)
874+ let bB = toString(bs.caller)
875+ let fD = at(fC, aW())
876+ let fE = invoke(ae(), "acceptPaymentWithLink", [bB, fB], [AttachedPayment(Y(), fD)])
877+ if ((fE == fE))
803878 then {
804- let eC = am(eh, et)
805- let eX = bD(eB, eC)
806- let bJ = eX._1
807- let bG = eX._2
808- let bH = eX._3
809- let de = eX._4
810- let df = eX._5
811- if (if ((eu != 0))
812- then (eu > an(bJ))
813- else false)
814- then throw(((("Limit error: " + toString(an(bJ))) + " < ") + toString(eu)))
879+ let fF = {
880+ let bD = fE
881+ if ($isInstanceOf(bD, "Int"))
882+ then {
883+ let fG = bD
884+ fG
885+ }
886+ else throw("Invalid referrerFee")
887+ }
888+ let eT = (fC - fD)
889+ let fH = (fD - fF)
890+ let fI = bA(bB)
891+ let fh = fI._1
892+ let fi = fI._2
893+ let fj = fI._3
894+ let fk = fI._4
895+ let fJ = (fh == 0)
896+ let fK = if ((fh > 0))
897+ then (fl == af)
898+ else (fl == ag)
899+ let fL = if (!(fJ))
900+ then fK
901+ else false
902+ let fm = (fl == af)
903+ let fM = if (if (fJ)
904+ then true
905+ else fL)
906+ then {
907+ let fn = at(eT, fe)
908+ let fN = bO(fm, fn)
909+ let bU = fN._1
910+ let bR = fN._2
911+ let bS = fN._3
912+ let dB = fN._4
913+ let dC = fN._5
914+ if (if ((ff != 0))
915+ then (ff > au(bU))
916+ else false)
917+ then throw(((("Limit error: " + toString(au(bU))) + " < ") + toString(ff)))
918+ else {
919+ let fw = (fh + bU)
920+ let fO = ar(fn, fe)
921+ let fP = cf(fh, fi, fk, fO)
922+ let co = fP._1
923+ let cT = fP._2
924+ let cU = fP._3
925+ if (!(cE(bR, bS)))
926+ then throw("Over max spread limit")
927+ else $Tuple11(fw, co, (fj + fn), by(fw), bS, bR, dB, dC, (bc() + fn), (bq() + (if ((fw > 0))
928+ then au(bU)
929+ else 0)), (bp() + (if ((0 > fw))
930+ then au(bU)
931+ else 0)))
932+ }
933+ }
815934 else {
816- let eL = (ew + bJ)
817- let eY = ak(eC, et)
818- let eZ = bU(ew, ex, ez, eY)
819- let cd = eZ._1
820- let cH = eZ._2
821- let cI = eZ._3
822- $Tuple11(eL, cd, (ey + eC), bn(eL), bH, bG, de, df, (aV() + eC), (bh() + (if ((eL > 0))
823- then an(bJ)
824- else 0)), (bg() + (if ((0 > eL))
825- then an(bJ)
826- else 0)))
935+ let fn = at(eT, fe)
936+ let fQ = cZ(toString(bs.caller), an)
937+ let fp = fQ._1
938+ let cY = fQ._2
939+ if ((fp > fn))
940+ then throw("Use decreasePosition to decrease position size")
941+ else throw("Close position first")
827942 }
828- }
829- else {
830- let eC = am(eh, et)
831- let fa = cw(toString(ek.caller), ag)
832- let eE = fa._1
833- let cK = fa._2
834- if ((eE > eC))
835- then throw("Use decreasePosition to decrease position size")
836- else throw("Close position first")
837- }
838- let eL = eW._1
839- let eM = eW._2
840- let eN = eW._3
841- let eO = eW._4
842- let bH = eW._5
843- let bG = eW._6
844- let de = eW._7
845- let df = eW._8
846- let di = eW._9
847- let dg = eW._10
848- let dh = eW._11
849- let fb = (eR / 2)
850- let fc = (eR - fb)
851- let fd = invoke(U(), "lockNeutrinoSP", [toString(V()), af], [AttachedPayment(T(), eh)])
852- if ((fd == fd))
853- then {
854- let fe = invoke(W(), "deposit", nil, [AttachedPayment(T(), fc)])
855- if ((fe == fe))
943+ let fw = fM._1
944+ let fx = fM._2
945+ let fy = fM._3
946+ let fz = fM._4
947+ let bS = fM._5
948+ let bR = fM._6
949+ let dB = fM._7
950+ let dC = fM._8
951+ let dF = fM._9
952+ let dD = fM._10
953+ let dE = fM._11
954+ let fR = (fH / 2)
955+ let fS = (fH - fR)
956+ let fT = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), eT)])
957+ if ((fT == fT))
856958 then {
857- let ff = invoke(X(), "notifyFees", [toString(ek.caller), eR], nil)
858- if ((ff == ff))
959+ let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)])
960+ if ((fU == fU))
859961 then {
860- let eP = invoke(X(), "notifyNotional", [toString(ek.caller), eN], nil)
861- if ((eP == eP))
862- then (((dN(toString(ek.caller), eL, eM, eN, eO) ++ dZ(bG, bH, de, df, di, dg, dh)) ++ el(fb)) ++ ej((aO() + eh)))
962+ let fV = invoke(ac(), "notifyFees", [bB, fH], nil)
963+ if ((fV == fV))
964+ then {
965+ let fA = invoke(ac(), "notifyNotional", [bB, fy], nil)
966+ if ((fA == fA))
967+ then (((ez(bB, fw, fx, fy, fz) ++ eL(bR, bS, dB, dC, dF, dD, dE)) ++ eW(fR)) ++ eV((aV() + eT)))
968+ else throw("Strict value is not equal to itself.")
969+ }
863970 else throw("Strict value is not equal to itself.")
864971 }
865972 else throw("Strict value is not equal to itself.")
866973 }
867974 else throw("Strict value is not equal to itself.")
868975 }
869976 else throw("Strict value is not equal to itself.")
870977 }
871978 }
872979
873980
874981
875-@Callable(ek)
982+@Callable(bs)
876983 func addMargin () = {
877- let eQ = ek.payments[0].amount
878- if (if (if (if ((ek.payments[0].assetId != T()))
984+ let fC = bs.payments[0].amount
985+ if (if (if (if ((bs.payments[0].assetId != Y()))
879986 then true
880- else !(bu(toString(ek.caller))))
987+ else !(bF(toString(bs.caller))))
881988 then true
882- else !(bv()))
989+ else !(bG()))
883990 then true
884- else bw())
991+ else bH())
885992 then throw("Invalid addMargin parameters")
886993 else {
887- let eR = am(eQ, aP())
888- let eh = (eQ - eR)
889- let fg = bp(toString(ek.caller))
890- let ew = fg._1
891- let ex = fg._2
892- let ey = fg._3
893- let ez = fg._4
894- let fb = (eR / 2)
895- let fc = (eR - fb)
896- let fd = invoke(U(), "lockNeutrinoSP", [toString(V()), af], [AttachedPayment(T(), eh)])
897- if ((fd == fd))
994+ let bB = toString(bs.caller)
995+ let fD = at(fC, aW())
996+ let fE = invoke(ae(), "acceptPayment", [bB], [AttachedPayment(Y(), fD)])
997+ if ((fE == fE))
898998 then {
899- let fe = invoke(W(), "deposit", nil, [AttachedPayment(T(), fc)])
900- if ((fe == fe))
999+ let fF = {
1000+ let bD = fE
1001+ if ($isInstanceOf(bD, "Int"))
1002+ then {
1003+ let fG = bD
1004+ fG
1005+ }
1006+ else throw("Invalid referrerFee")
1007+ }
1008+ let fH = (fD - fF)
1009+ let eT = (fC - fD)
1010+ let fW = bA(bB)
1011+ let fh = fW._1
1012+ let fi = fW._2
1013+ let fj = fW._3
1014+ let fk = fW._4
1015+ let fR = (fH / 2)
1016+ let fS = (fH - fR)
1017+ let fT = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), eT)])
1018+ if ((fT == fT))
9011019 then {
902- let ff = invoke(X(), "notifyFees", [toString(ek.caller), eR], nil)
903- if ((ff == ff))
904- then ((dN(toString(ek.caller), ew, (ex + eh), ey, ez) ++ el(fb)) ++ ej((aO() + eh)))
905- else throw("Strict value is not equal to itself.")
906- }
907- else throw("Strict value is not equal to itself.")
908- }
909- else throw("Strict value is not equal to itself.")
910- }
911- }
912-
913-
914-
915-@Callable(ek)
916-func removeMargin (eh) = if (if (if (if ((0 >= eh))
917- then true
918- else !(bu(toString(ek.caller))))
919- then true
920- else !(bv()))
921- then true
922- else bw())
923- then throw("Invalid removeMargin parameters")
924- else {
925- let fh = bp(toString(ek.caller))
926- let ew = fh._1
927- let ex = fh._2
928- let ey = fh._3
929- let ez = fh._4
930- let fi = -(eh)
931- let fj = bU(ew, ex, ez, fi)
932- let cd = fj._1
933- let ce = fj._2
934- if ((ce != 0))
935- then throw("Invalid removed margin amount")
936- else {
937- let fk = cL(cd, ce, ey)
938- if (!(bi(fk, aQ(), true)))
939- then throw(((("Too much margin removed: " + toString(fk)) + " < ") + toString(aQ())))
940- else {
941- let fl = invoke(U(), "unlockNeutrino", [eh, toBase58String(T())], nil)
942- if ((fl == fl))
943- then ((dN(toString(ek.caller), ew, cd, ey, bn(ew)) ++ eg(ek.caller, eh)) ++ ej((aO() - eh)))
944- else throw("Strict value is not equal to itself.")
945- }
946- }
947- }
948-
949-
950-
951-@Callable(ek)
952-func closePosition () = if (if (if (!(bu(toString(ek.caller))))
953- then true
954- else !(bv()))
955- then true
956- else bw())
957- then throw("Invalid closePosition parameters")
958- else {
959- let fm = cV(toString(ek.caller), true)
960- let cH = fm._1
961- let fn = fm._2
962- let da = fm._3
963- let db = fm._4
964- let bG = fm._5
965- let bH = fm._6
966- let de = fm._7
967- let df = fm._8
968- let di = fm._9
969- let cI = fm._10
970- let dg = fm._11
971- let dh = fm._12
972- if ((fn > 0))
973- then throw("Unable to close position with bad debt")
974- else {
975- let fo = an(db)
976- let fp = (aO() - fo)
977- let fq = if ((0 > fp))
978- then $Tuple2(0, an(fp))
979- else $Tuple2(fp, 0)
980- let fr = fq._1
981- let fs = fq._2
982- let ft = if ((fs > 0))
983- then {
984- let fu = invoke(W(), "withdraw", [fs], nil)
985- if ((fu == fu))
986- then nil
987- else throw("Strict value is not equal to itself.")
988- }
989- else nil
990- if ((ft == ft))
991- then {
992- let fl = invoke(U(), "unlockNeutrino", [(fo - fs), toBase58String(T())], nil)
993- if ((fl == fl))
994- then {
995- let eP = invoke(X(), "notifyNotional", [toString(ek.caller), 0], nil)
996- if ((eP == eP))
997- then (((ef(toString(ek.caller)) ++ dZ(bG, bH, de, df, di, dg, dh)) ++ eg(ek.caller, fo)) ++ ej(fr))
998- else throw("Strict value is not equal to itself.")
999- }
1000- else throw("Strict value is not equal to itself.")
1001- }
1002- else throw("Strict value is not equal to itself.")
1003- }
1004- }
1005-
1006-
1007-
1008-@Callable(ek)
1009-func liquidate (bq) = {
1010- let fv = cP(bq, ag)
1011- let fk = if (ct())
1012- then {
1013- let fw = cP(bq, ah)
1014- ao(fv, fw)
1015- }
1016- else fv
1017- if (if (if (if (!(bi(fk, ba(), false)))
1018- then true
1019- else !(bu(bq)))
1020- then true
1021- else !(bv()))
1022- then true
1023- else bw())
1024- then throw("Unable to liquidate")
1025- else {
1026- let fx = cV(bq, false)
1027- let cH = fx._1
1028- let ce = fx._2
1029- let cI = fx._3
1030- let cJ = fx._4
1031- let bG = fx._5
1032- let bH = fx._6
1033- let de = fx._7
1034- let df = fx._8
1035- let di = fx._9
1036- let dd = fx._10
1037- let dg = fx._11
1038- let dh = fx._12
1039- let fy = am(dd, bb())
1040- let fz = (fy / 2)
1041- let fc = (fy - fz)
1042- let fp = (aO() - fy)
1043- let fA = if ((0 > fp))
1044- then $Tuple2(0, an(fp))
1045- else $Tuple2(fp, 0)
1046- let fB = fA._1
1047- let fC = fA._2
1048- let ft = if ((fC > 0))
1049- then {
1050- let fu = invoke(W(), "withdraw", [fC], nil)
1051- if ((fu == fu))
1052- then nil
1053- else throw("Strict value is not equal to itself.")
1054- }
1055- else nil
1056- if ((ft == ft))
1057- then {
1058- let fl = invoke(U(), "unlockNeutrino", [(fy - fC), toBase58String(T())], nil)
1059- if ((fl == fl))
1060- then {
1061- let fe = invoke(W(), "deposit", nil, [AttachedPayment(T(), fc)])
1062- if ((fe == fe))
1020+ let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)])
1021+ if ((fU == fU))
10631022 then {
1064- let eP = invoke(X(), "notifyNotional", [bq, 0], nil)
1065- if ((eP == eP))
1066- then (((ef(bq) ++ dZ(bG, bH, de, df, di, dg, dh)) ++ eg(ek.caller, fz)) ++ ej(fB))
1023+ let fV = invoke(ac(), "notifyFees", [bB, fH], nil)
1024+ if ((fV == fV))
1025+ then ((ez(bB, fh, (fi + eT), fj, fk) ++ eW(fR)) ++ eV((aV() + eT)))
10671026 else throw("Strict value is not equal to itself.")
10681027 }
10691028 else throw("Strict value is not equal to itself.")
10701029 }
10711030 else throw("Strict value is not equal to itself.")
10721031 }
10731032 else throw("Strict value is not equal to itself.")
10741033 }
10751034 }
10761035
10771036
10781037
1079-@Callable(ek)
1080-func payFunding () = {
1081- let fD = aW()
1082- if (if (if ((fD > lastBlock.timestamp))
1038+@Callable(bs)
1039+func removeMargin (eT) = if (if (if (if ((0 >= eT))
1040+ then true
1041+ else !(bF(toString(bs.caller))))
1042+ then true
1043+ else !(bG()))
1044+ then true
1045+ else bH())
1046+ then throw("Invalid removeMargin parameters")
1047+ else {
1048+ let fX = bA(toString(bs.caller))
1049+ let fh = fX._1
1050+ let fi = fX._2
1051+ let fj = fX._3
1052+ let fk = fX._4
1053+ let fY = -(eT)
1054+ let fZ = cf(fh, fi, fk, fY)
1055+ let co = fZ._1
1056+ let cp = fZ._2
1057+ if ((cp != 0))
1058+ then throw("Invalid removed margin amount")
1059+ else {
1060+ let ga = de(co, cp, fj)
1061+ if (!(bt(ga, aX(), true)))
1062+ then throw(((("Too much margin removed: " + toString(ga)) + " < ") + toString(aX())))
1063+ else {
1064+ let gb = invoke(Z(), "unlockNeutrino", [eT, toBase58String(Y())], nil)
1065+ if ((gb == gb))
1066+ then ((ez(toString(bs.caller), fh, co, fj, by(fh)) ++ eS(bs.caller, eT)) ++ eV((aV() - eT)))
1067+ else throw("Strict value is not equal to itself.")
1068+ }
1069+ }
1070+ }
1071+
1072+
1073+
1074+@Callable(bs)
1075+func closePosition () = {
1076+ let gc = br(bs)
1077+ let gd = valueOrErrorMessage(addressFromString(gc), "Invalid caller")
1078+ if (if (if (!(bF(gc)))
10831079 then true
1084- else !(bv()))
1080+ else !(bG()))
10851081 then true
1086- else bw())
1087- then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(fD)))
1082+ else bH())
1083+ then throw("Invalid closePosition parameters")
10881084 else {
1089- let fE = cn()
1090- let fF = dj()
1091- let fG = (fF - fE)
1092- let fH = if (if ((bg() == 0))
1093- then true
1094- else (bh() == 0))
1095- then $Tuple2(0, 0)
1096- else if ((0 > fG))
1097- then {
1098- let fI = ak(am(fG, aY()), ae)
1099- let fJ = ak(am(fI, bg()), bh())
1100- $Tuple2(fI, fJ)
1101- }
1102- else {
1103- let fJ = ak(am(fG, aY()), ae)
1104- let fI = ak(am(fJ, bh()), bg())
1105- $Tuple2(fI, fJ)
1106- }
1107- let fI = fH._1
1108- let fJ = fH._2
1109- dH((fD + aZ()), (be() + fJ), (bf() + fI), ak(fJ, fE), ak(fI, fE))
1085+ let ge = dv(gc, true)
1086+ let cT = ge._1
1087+ let gf = ge._2
1088+ let dy = ge._3
1089+ let dz = ge._4
1090+ let bR = ge._5
1091+ let bS = ge._6
1092+ let dB = ge._7
1093+ let dC = ge._8
1094+ let dF = ge._9
1095+ let cU = ge._10
1096+ let dD = ge._11
1097+ let dE = ge._12
1098+ if ((gf > 0))
1099+ then throw("Unable to close position with bad debt")
1100+ else {
1101+ let gg = au(dz)
1102+ let gh = (aV() - gg)
1103+ let gi = if ((0 > gh))
1104+ then $Tuple2(0, au(gh))
1105+ else $Tuple2(gh, 0)
1106+ let gj = gi._1
1107+ let gk = gi._2
1108+ let fG = if ((gk > 0))
1109+ then {
1110+ let gl = invoke(ab(), "withdraw", [gk], nil)
1111+ if ((gl == gl))
1112+ then nil
1113+ else throw("Strict value is not equal to itself.")
1114+ }
1115+ else nil
1116+ if ((fG == fG))
1117+ then {
1118+ let gb = invoke(Z(), "unlockNeutrino", [(gg - gk), toBase58String(Y())], nil)
1119+ if ((gb == gb))
1120+ then {
1121+ let fA = invoke(ac(), "notifyNotional", [gc, 0], nil)
1122+ if ((fA == fA))
1123+ then (((eR(gc) ++ eL(bR, bS, dB, dC, dF, dD, dE)) ++ eS(gd, gg)) ++ eV(gj))
1124+ else throw("Strict value is not equal to itself.")
1125+ }
1126+ else throw("Strict value is not equal to itself.")
1127+ }
1128+ else throw("Strict value is not equal to itself.")
1129+ }
11101130 }
11111131 }
11121132
11131133
11141134
1115-@Callable(ek)
1116-func v_get (bq) = {
1117- let fK = cV(bq, false)
1118- let cH = fK._1
1119- let cI = fK._2
1120- let cJ = fK._3
1121- let fL = fK._4
1122- throw((((ai(cI) + ai(cJ)) + ai(fL)) + ai(cU(bq))))
1135+@Callable(bs)
1136+func liquidate (bB) = {
1137+ let gm = di(bB, an)
1138+ let ga = if (cK())
1139+ then {
1140+ let gn = di(bB, ao)
1141+ av(gm, gn)
1142+ }
1143+ else gm
1144+ if (if (if (if (!(bt(ga, bh(), false)))
1145+ then true
1146+ else !(bF(bB)))
1147+ then true
1148+ else !(bG()))
1149+ then true
1150+ else bH())
1151+ then throw("Unable to liquidate")
1152+ else if (if (if ((gm > bi()))
1153+ then (bj() > 0)
1154+ else false)
1155+ then (ak > bj())
1156+ else false)
1157+ then {
1158+ let go = bA(bB)
1159+ let fh = go._1
1160+ let fi = go._2
1161+ let fj = go._3
1162+ let fk = go._4
1163+ let fl = if ((fh > 0))
1164+ then ag
1165+ else af
1166+ let fm = (fl == af)
1167+ let du = do(bB, fh)
1168+ let gp = cZ(bB, an)
1169+ let fp = gp._1
1170+ let cY = gp._2
1171+ let gq = bO(fm, du)
1172+ let dt = gq._1
1173+ let bR = gq._2
1174+ let bS = gq._3
1175+ let dB = gq._4
1176+ let dC = gq._5
1177+ let dy = ar(at(cY, au(dt)), au(fh))
1178+ let gr = cf(fh, fi, fk, dy)
1179+ let co = gr._1
1180+ let cp = gr._2
1181+ let ck = gr._3
1182+ let fu = (cY - dy)
1183+ let fv = if ((fh > 0))
1184+ then ((fp - du) - fu)
1185+ else ((fu + fp) - du)
1186+ let gs = at(du, bi())
1187+ let gt = (gs / 2)
1188+ let fS = (gs - gt)
1189+ let gu = (co - gs)
1190+ let fw = (fh + dt)
1191+ let fy = au(fv)
1192+ let gv = by(fw)
1193+ let dF = (bc() - du)
1194+ let gh = (aV() - gs)
1195+ let gw = if ((0 > gh))
1196+ then $Tuple2(0, au(gh))
1197+ else $Tuple2(gh, 0)
1198+ let gx = gw._1
1199+ let gy = gw._2
1200+ let fG = if ((gy > 0))
1201+ then {
1202+ let gl = invoke(ab(), "withdraw", [gy], nil)
1203+ if ((gl == gl))
1204+ then nil
1205+ else throw("Strict value is not equal to itself.")
1206+ }
1207+ else nil
1208+ if ((fG == fG))
1209+ then {
1210+ let gb = invoke(Z(), "unlockNeutrino", [(gs - gy), toBase58String(Y())], nil)
1211+ if ((gb == gb))
1212+ then {
1213+ let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)])
1214+ if ((fU == fU))
1215+ then {
1216+ let fA = invoke(ac(), "notifyNotional", [bB, fy], nil)
1217+ if ((fA == fA))
1218+ then (((ez(bB, fw, gu, fy, gv) ++ eL(bR, bS, dB, dC, dF, (bq() - (if ((fw > 0))
1219+ then au(dt)
1220+ else 0)), (bp() - (if ((0 > fw))
1221+ then au(dt)
1222+ else 0)))) ++ eS(bs.caller, gt)) ++ eV(gx))
1223+ else throw("Strict value is not equal to itself.")
1224+ }
1225+ else throw("Strict value is not equal to itself.")
1226+ }
1227+ else throw("Strict value is not equal to itself.")
1228+ }
1229+ else throw("Strict value is not equal to itself.")
1230+ }
1231+ else {
1232+ let gz = dv(bB, false)
1233+ let cT = gz._1
1234+ let cp = gz._2
1235+ let cU = gz._3
1236+ let cV = gz._4
1237+ let bR = gz._5
1238+ let bS = gz._6
1239+ let dB = gz._7
1240+ let dC = gz._8
1241+ let dF = gz._9
1242+ let du = gz._10
1243+ let dD = gz._11
1244+ let dE = gz._12
1245+ let gs = at(du, bi())
1246+ let gt = (gs / 2)
1247+ let fS = (gs - gt)
1248+ let gh = (aV() - gs)
1249+ let gA = if ((0 > gh))
1250+ then $Tuple2(0, au(gh))
1251+ else $Tuple2(gh, 0)
1252+ let gx = gA._1
1253+ let gy = gA._2
1254+ let fG = if ((gy > 0))
1255+ then {
1256+ let gl = invoke(ab(), "withdraw", [gy], nil)
1257+ if ((gl == gl))
1258+ then nil
1259+ else throw("Strict value is not equal to itself.")
1260+ }
1261+ else nil
1262+ if ((fG == fG))
1263+ then {
1264+ let gb = invoke(Z(), "unlockNeutrino", [(gs - gy), toBase58String(Y())], nil)
1265+ if ((gb == gb))
1266+ then {
1267+ let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)])
1268+ if ((fU == fU))
1269+ then {
1270+ let fA = invoke(ac(), "notifyNotional", [bB, 0], nil)
1271+ if ((fA == fA))
1272+ then (((eR(bB) ++ eL(bR, bS, dB, dC, dF, dD, dE)) ++ eS(bs.caller, gt)) ++ eV(gx))
1273+ else throw("Strict value is not equal to itself.")
1274+ }
1275+ else throw("Strict value is not equal to itself.")
1276+ }
1277+ else throw("Strict value is not equal to itself.")
1278+ }
1279+ else throw("Strict value is not equal to itself.")
1280+ }
11231281 }
11241282
11251283
11261284
1127-@Callable(ek)
1128-func view_calcRemainMarginWithFundingPayment (bq) = {
1129- let fM = bp(bq)
1130- let bt = fM._1
1131- let cz = fM._2
1132- let cR = fM._3
1133- let cB = fM._4
1134- let fN = cw(bq, ag)
1135- let cE = fN._1
1136- let cK = fN._2
1137- let fO = bU(bt, cz, cB, cK)
1138- let cd = fO._1
1139- let ce = fO._2
1140- let bZ = fO._3
1141- throw(((((ai(cd) + ai(bZ)) + ai(cU(bq))) + ai(cK)) + ai(ce)))
1285+@Callable(bs)
1286+func payFunding () = {
1287+ let gB = bd()
1288+ if (if (if ((gB > lastBlock.timestamp))
1289+ then true
1290+ else !(bG()))
1291+ then true
1292+ else bH())
1293+ then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(gB)))
1294+ else {
1295+ let ee = cz()
1296+ let gC = ed()
1297+ let eh = gC._1
1298+ let ei = gC._2
1299+ et((gB + bg()), (bn() + ei), (bo() + eh), ar(ei, ee), ar(eh, ee))
1300+ }
11421301 }
11431302
11441303
11451304
1146-@Callable(ek)
1147-func forceMoveAsset (bq,eh) = if (if ((addressFromPublicKey(S()) != ek.caller))
1305+@Callable(bs)
1306+func forceMoveAsset (bB,eT) = if (if ((addressFromPublicKey(X()) != bs.caller))
11481307 then true
1149- else (0 > eh))
1308+ else (0 > eT))
11501309 then throw("Invalid forceMoveAsset parameters")
11511310 else {
1152- let fl = invoke(U(), "unlockNeutrino", [eh, toBase58String(T())], nil)
1153- if ((fl == fl))
1154- then (eg(addressFromStringValue(bq), eh) ++ ej((aO() - eh)))
1311+ let gb = invoke(Z(), "unlockNeutrino", [eT, toBase58String(Y())], nil)
1312+ if ((gb == gb))
1313+ then (eS(addressFromStringValue(bB), eT) ++ eV((aV() - eT)))
11551314 else throw("Strict value is not equal to itself.")
11561315 }
11571316
11581317
1159-@Verifier(fP)
1160-func fQ () = sigVerify(fP.bodyBytes, fP.proofs[0], S())
1318+
1319+@Callable(bs)
1320+func adjustPeg (dX) = if (if ((addressFromPublicKey(X()) != bs.caller))
1321+ then true
1322+ else (0 > dX))
1323+ then throw("Invalid adjustPeg parameters")
1324+ else {
1325+ let gD = dW(dX)
1326+ let eb = gD._1
1327+ let gE = gD._2
1328+ if ((gE == 0))
1329+ then throw("Nothing to adjust")
1330+ else if ((gE > 0))
1331+ then {
1332+ let gl = invoke(ab(), "withdraw", [gE], nil)
1333+ if ((gl == gl))
1334+ then {
1335+ let fT = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), gE)])
1336+ if ((fT == fT))
1337+ then (eV((aV() + gE)) ++ eK(eb, aZ()))
1338+ else throw("Strict value is not equal to itself.")
1339+ }
1340+ else throw("Strict value is not equal to itself.")
1341+ }
1342+ else {
1343+ let gb = invoke(Z(), "unlockNeutrino", [au(gE), toBase58String(Y())], nil)
1344+ if ((gb == gb))
1345+ then {
1346+ let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), au(gE))])
1347+ if ((fU == fU))
1348+ then (eV((aV() - au(gE))) ++ eK(eb, aZ()))
1349+ else throw("Strict value is not equal to itself.")
1350+ }
1351+ else throw("Strict value is not equal to itself.")
1352+ }
1353+ }
1354+
1355+
1356+
1357+@Callable(bs)
1358+func v_get (bB) = {
1359+ let gF = dv(bB, false)
1360+ let cT = gF._1
1361+ let cU = gF._2
1362+ let cV = gF._3
1363+ let gG = gF._4
1364+ throw((((ap(cU) + ap(cV)) + ap(gG)) + ap(dn(bB))))
1365+ }
1366+
1367+
1368+
1369+@Callable(bs)
1370+func view_calcRemainMarginWithFundingPayment (bB) = {
1371+ let gH = bA(bB)
1372+ let bE = gH._1
1373+ let db = gH._2
1374+ let dk = gH._3
1375+ let dd = gH._4
1376+ let gI = cZ(bB, an)
1377+ let cQ = gI._1
1378+ let cY = gI._2
1379+ let gJ = cf(bE, db, dd, cY)
1380+ let co = gJ._1
1381+ let cp = gJ._2
1382+ let ck = gJ._3
1383+ throw((((((ap(co) + ap(ck)) + ap(dn(bB))) + ap(cY)) + ap(cp)) + ap(cQ)))
1384+ }
1385+
1386+
1387+
1388+@Callable(bs)
1389+func view_getPegAdjustCost (dX) = {
1390+ let ec = dW(dX)
1391+ throw(toString(ec._2))
1392+ }
1393+
1394+
1395+
1396+@Callable(bs)
1397+func view_getFunding () = {
1398+ let ee = cz()
1399+ let gK = ed()
1400+ let eh = gK._1
1401+ let ei = gK._2
1402+ let gL = ar(ei, ee)
1403+ let gM = ar(eh, ee)
1404+ throw((((ap(gL) + ap(gM)) + ap(dG())) + ap(cz())))
1405+ }
1406+
1407+
1408+@Verifier(gN)
1409+func gO () = sigVerify(gN.bodyBytes, gN.proofs[0], X())
11611410

github/deemru/w8io/3ef1775 
731.46 ms