tx · HEGwPZPWqQBtMHJENPUpGnPnuTz9Ua9bMYUDWnN9sPbN

3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW:  -0.07200000 Waves

2024.02.13 14:00 [4040165] smart account 3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW > SELF 0.00000000 Waves

{ "type": 13, "id": "HEGwPZPWqQBtMHJENPUpGnPnuTz9Ua9bMYUDWnN9sPbN", "fee": 7200000, "feeAssetId": null, "timestamp": 1707821984795, "version": 2, "chainId": 87, "sender": "3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW", "senderPublicKey": "9D3NMf2PEttfNTb8Hk2nbXukn2b2xmoTsZSqQrhvyeN", "proofs": [ "", "3SwtXbWp1ht2JsnURTx7QkM3SCbp2ZNdzToJmkfWpbiVwFPWPjoRoGhLTT9UVXre4tczG9ta4bwLY48yWK5UJCae", "2JT8aJaaJCVcrBzyWVvn8gxCKDRTdjLpqrks7gT95bzEeGhs35GBH5e1FDat3fu1xXWcJitUtvxasehrgPknjpYa" ], "script": "base64:BgKrAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBgoECAEIBBIECgIIARIFCgMIAQgSBgoEAQgIARIFCgMBCAgSDwoNCAgICAgICAgICAgICBIDCgEIEgMKAQgSBQoDCAgBEgYKBAgBCAgSBwoFCAgIAQQSBQoDCAQBEg0KCwgICAEBAQEBAQQEEgkKBwgBAQEBAQESABIAEgASABIAEgASABIAEgMKAQgSAwoBCJgBAARDT05GCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgZjb25maWcAB1NGX1BPT0wCAlNGAAdXWF9QT09MAgJXWAAEQ1BNTQIEY3BtbQAERkxBVAIEZmxhdAAPQ0FQX0ZFRV9OT19MT0FOAgljYXBOb0xvYW4ADENBUF9GRUVfTE9BTgIHY2FwTG9hbgAUU1RPUExPU1NfRkVFX05PX0xPQU4CDnN0b3BMb3NzTm9Mb2FuAA1TVE9QTE9TU19MT0FOAgxzdG9wTG9zc0xvYW4ACExPQU5fRkVFAgRsb2FuAAtOT19MT0FOX0ZFRQIGbm9Mb2FuAAZOT19GRUUCBW5vRmVlAAZTQ0FMRTgAgMLXLwAHU0NBTEUxMACAyK+gJQAHU0NBTEUxNgkAtgIBAICAhP6m3uERAApGRUVfU0NBTEU2AMCEPQAUa1NGUG9vbEFBc3NldEJhbGFuY2UCD0FfYXNzZXRfYmFsYW5jZQAUa1NGUG9vbEJBc3NldEJhbGFuY2UCD0JfYXNzZXRfYmFsYW5jZQAPa1NGUG9vbEFBc3NldElkAgpBX2Fzc2V0X2lkAA9rU0ZQb29sQkFzc2V0SWQCCkJfYXNzZXRfaWQADmtTRlBvb2xTaGFyZUlkAg5zaGFyZV9hc3NldF9pZAASa1NGUG9vbFNoYXJlU3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkACmtTRlBvb2xGZWUCCmNvbW1pc3Npb24ADWtVc2VyUG9zaXRpb24CDV91c2VyUG9zaXRpb24AEWtVc2VyUG9zaXRpb25Qb29sAhFfdXNlclBvc2l0aW9uUG9vbAARa1VzZXJCb3Jyb3dBbW91bnQCGV91c2VyUG9zaXRpb25Cb3Jyb3dBbW91bnQAEmtVc2VyQm9ycm93QXNzZXRJZAIaX3VzZXJQb3NpdGlvbkJvcnJvd0Fzc2V0SWQAEGtVc2VyUG9zaXRpb25OdW0CE191c2VyUG9zaXRpb25OdW1iZXIAFWtVc2VyUG9zaXRpb25JbnRlcmVzdAIVX3VzZXJQb3NpdGlvbkludGVyZXN0ABZrVXNlclBvc2l0aW9uSW5QTWFya2V0AhRfdXNlclBvc2l0aW9uUE1hcmtldAAKa1Bvb2xUb3RhbAIKX3Bvb2xUb3RhbAAOa1Bvb2xUb3RhbExvYW4CDl9wb29sVG90YWxMb2FuABBrUG9vbFRvdGFsTWFya2V0AhBfcG9vbFRvdGFsTWFya2V0ABRrUG9vbFRvdGFsTWFya2V0TG9hbgIUX3Bvb2xUb3RhbE1hcmtldExvYW4AEWtQb29sSW50ZXJlc3RMb2FuAhFfcG9vbEludGVyZXN0TG9hbgATa1Bvb2xJbnRlcmVzdE5vTG9hbgITX3Bvb2xJbnRlcmVzdE5vTG9hbgAXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4CF19wb29sSW50ZXJlc3RNYXJrZXRMb2FuABlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuAhlfcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuAA5rUG9vbENhbkJvcnJvdwIOX3Bvb2xDYW5Cb3Jyb3cADGtQb29sUE1BcmtldAIRX3Bvb2xQdXp6bGVNYXJrZXQAFWtBeGx5SW5GZWVXaXRob3V0TG9hbgIOX2F4bHlGZWVOb0xvYW4AEmtBeGx5SW5GZWVXaXRoTG9hbgIQX2F4bHlGZWVXaXRoTG9hbgARa0F4bHlOb0xvYW5DYXBGZWUCEV9heGx5RmVlQ2FwTm9Mb2FuABNrQXhseVdpdGhMb2FuQ2FwRmVlAhNfYXhseUZlZUNhcFdpdGhMb2FuABZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlAhhfYXhseUZlZVN0b3Bsb3NzV2l0aExvYW4AFGtBeGx5U3RvcExvc3NMb2FuRmVlAhZfYXhseUZlZVN0b3Bsb3NzTm9Mb2FuAAprUmVxdWVzdElkAgtfcmVxdWVzdF9pZAAMa1JlcXVlc3RJdGVyAg1yZXF1ZXN0c19pdGVyAAVrUG9vbAIFcG9vbF8ACWtQb29sVHlwZQIJX3Bvb2xUeXBlAAprU2hhcmVQb29sAgxfcG9vbFNoYXJlSWQADmtQb29sQ2FwQ2hhbmdlAg5fcG9vbENhcENoYW5nZQAPa1Rva2VuTGFzdFByaWNlAgpsYXN0X3ByaWNlAA5rUHJpY2VJbk9yYWNsZQIHX3R3YXA1QgAHa0FjdGl2ZQIGYWN0aXZlAAxrQWN0aXZlVXNlcnMCC2FjdGl2ZVVzZXJzAAtrQWN0aXZlU0ZXWAIHX2FjdGl2ZQALa1Bvb2xBY3RpdmUCC19hY3RpdmVQb29sAA1rVXNlclN0b3BMb3NzAglfc3RvcExvc3MAF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAhdfZmFsbGJhY2tFeGNoYW5nZVN3b3BmaQAOa1Bvb2xQcm94eUFkZHICEV9wb29sUHJveHlBZGRyZXNzAAlrTW9uZXlCb3gCDmF4bHlfbW9uZXlfYm94AA5rU0ZGYXJtaW5nQWRkcgITc3dvcGZpX2Zhcm1pbmdfYWRkcgAMa0xlbmRTZXJ2aWNlAhFsZW5kX3NlcnZpY2VfYWRkcgAPa09wZXJhdG9yQ2FsbFBLAhJhZG1pbl9jYWxsX3B1Yl9rZXkADGtQcmljZU9yYWNsZQIMcHJpY2Vfb3JhY2xlAAtrRXhDb250cmFjdAIRZXhjaGFuZ2VfY29udHJhY3QAD2tXeFN3YXBDb250cmFjdAIQd3hfc3dhcF9jb250cmFjdAAHa1d4UmVzdAIMd3hfcmVzdF9hZGRyAAdrU3dvcElkAgdzd29wX2lkAAVrV3hJZAIFd3hfaWQADGtQTWFya2V0QWRkcgIVcHV6emxlX21hcmtldF9hZGRyZXNzABBrUE1hcmtldFJlc3RBZGRyAhpwdXp6bGVfbWFya2V0X3Jlc3RfYWRkcmVzcwAPa0dyb3VwMUFkbWluMVBLAhVncm91cDFfYWRtaW4xX3B1Yl9rZXkAD2tHcm91cDFBZG1pbjJQSwIVZ3JvdXAxX2FkbWluMl9wdWJfa2V5AA9rR3JvdXAxQWRtaW4zUEsCFWdyb3VwMV9hZG1pbjNfcHViX2tleQAPa0dyb3VwMkFkbWluMVBLAhVncm91cDJfYWRtaW4xX3B1Yl9rZXkAD2tHcm91cDJBZG1pbjJQSwIVZ3JvdXAyX2FkbWluMl9wdWJfa2V5AAhtb25leUJveAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFCWtNb25leUJveAIYTm8gYXhseSBtb25leUJveCBhZGRyZXNzAApleENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgULa0V4Q29udHJhY3QCHE5vIGV4Y2hhbmdlIGNvbnRyYWN0IGFkZHJlc3MAD3ByaWNlT3JhY2xlQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFDGtQcmljZU9yYWNsZQIXTm8gcHJpY2Ugb3JhY2xlIGFkZHJlc3MADnd4U3dhcENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa1d4U3dhcENvbnRyYWN0AhJObyB3eCBzd2FwIGFkZHJlc3MABnd4UmVzdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFB2tXeFJlc3QCEk5vIHd4IHJlc3QgYWRkcmVzcwAGU1dPUElECQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQdrU3dvcElkAgpObyBzd29wIGlkAARXWElECQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQVrV3hJZAIITm8gd3ggaWQAC3BNYXJrZXRBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa1BNYXJrZXRBZGRyAhhObyBwdXp6bGUgbWFya2V0IGFkZHJlc3MAD3BNYXJrZXRSZXN0QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFEGtQTWFya2V0UmVzdEFkZHICHU5vIHB1enpsZSBtYXJrZXQgcmVzdCBhZGRyZXNzAA5ncm91cDFBZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa0dyb3VwMUFkbWluMVBLAhlDYW4ndCBnZXQga0dyb3VwMUFkbWluMVBLAA5ncm91cDFBZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa0dyb3VwMUFkbWluMlBLAhlDYW4ndCBnZXQga0dyb3VwMUFkbWluMlBLAA5ncm91cDFBZG1pbjNQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa0dyb3VwMUFkbWluM1BLAhlDYW4ndCBnZXQga0dyb3VwMUFkbWluM1BLAA5ncm91cDJBZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMkFkbWluMVBLAhlDYW4ndCBnZXQga0dyb3VwMkFkbWluMVBLAA5ncm91cDJBZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMkFkbWluMlBLAhlDYW4ndCBnZXQga0dyb3VwMkFkbWluMVBLAApvcGVyYXRvclBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rT3BlcmF0b3JDYWxsUEsCFENhbid0IGdldCBvcGVyYXRvclBLAQ91bmtub3duUG9vbFR5cGUACQACAQIPV3JvbmcgcG9vbCB0eXBlAQ5nZXRMZW5kU3J2QWRkcgAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQxrTGVuZFNlcnZpY2UCG0Nhbid0IGdldCBsZW5kIHNlcnZpY2UgYWRkcgEOaXNPcGVyYXRvckNhbGwBAWkDAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwYJAAACCAUBaQZjYWxsZXIFCG1vbmV5Qm94BQR1bml0CQACAQIkT25seSBvcGVyYXRvciBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQtpc0FkbWluQ2FsbAEBaQMDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQ5ncm91cDFBZG1pbjFQSwYJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFDmdyb3VwMUFkbWluMlBLBQR1bml0CQACAQIoT25seSBhZG1pbiBncm91cDEgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFBHRoaXMFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc0xhbmRDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgkBDmdldExlbmRTcnZBZGRyAAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQhpc0FjdGl2ZQADCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgYFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50ARBpc0FjdGl2ZUZvclVzZXJzAAMDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGBgcFBHVuaXQJAAIBAilEQXBwIGlzIGluYWN0aXZlIGZvciB1c2VycyBhdCB0aGlzIG1vbWVudAEMaXNQb29sQWN0aXZlAgRwb29sBHR5cGUECldYU0ZBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQR0eXBlBQtrQWN0aXZlU0ZXWAYECnBvb2xBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYDAwUKV1hTRkFjdGl2ZQUKcG9vbEFjdGl2ZQcGBwEOYWNjb3VudEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQACAQILTWF0Y2ggZXJyb3IBEWdldFNGUG9vbEJhbGFuY2VzAQhwb29sQWRkcgkAlAoCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xBQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGJhbGFuY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUUa1NGUG9vbEJBc3NldEJhbGFuY2UCHkNhbid0IGdldCBwb29sIEIgYXNzZXQgYmFsYW5jZQERZ2V0V1hQb29sQmFsYW5jZXMDCHBvb2xBZGRyA2FJZANiSWQJAJQKAgoAAUAJAPwHBAUIcG9vbEFkZHICHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUDYUlkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFA2JJZAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQ9nZXRQb29sQmFsYW5jZXMECHBvb2xBZGRyBHR5cGUDYUlkA2JJZAMJAAACBQR0eXBlBQdTRl9QT09MCQERZ2V0U0ZQb29sQmFsYW5jZXMBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQJAQ91bmtub3duUG9vbFR5cGUAAQ1nZXRTRlBvb2xEYXRhAQhwb29sQWRkcgQLJHQwOTY1NTk3MDQJARFnZXRTRlBvb2xCYWxhbmNlcwEFCHBvb2xBZGRyAwkAAAIFCyR0MDk2NTU5NzA0BQskdDA5NjU1OTcwNAQEYmFsQggFCyR0MDk2NTU5NzA0Al8yBARiYWxBCAULJHQwOTY1NTk3MDQCXzEJAJcKBQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ9rU0ZQb29sQUFzc2V0SWQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEJBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGlkBQRiYWxBBQRiYWxCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFDmtTRlBvb2xTaGFyZUlkAhhDYW4ndCBnZXQgc2hhcmUgYXNzZXQgaWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDWdldFdYUG9vbERhdGEBCHBvb2xBZGRyBANjZmcKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUDY2ZnBQNjZmcEA2FJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQEA2JJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABQMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEIgYXNzZXQgaWQEB3NoYXJlSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAMDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhpDYW4ndCBnZXQgcG9vbCBMUCBhc3NldCBpZAQNJHQwMTA0MDExMDQ2MAkBEWdldFdYUG9vbEJhbGFuY2VzAwUIcG9vbEFkZHIFA2FJZAUDYklkAwkAAAIFDSR0MDEwNDAxMTA0NjAFDSR0MDEwNDAxMTA0NjAEBGJhbEIIBQ0kdDAxMDQwMTEwNDYwAl8yBARiYWxBCAUNJHQwMTA0MDExMDQ2MAJfMQkAlwoFBQNhSWQFA2JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELZ2V0UG9vbERhdGECCHBvb2xBZGRyBHR5cGUDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBDWdldFNGUG9vbERhdGEBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQENZ2V0V1hQb29sRGF0YQEFCHBvb2xBZGRyCQEPdW5rbm93blBvb2xUeXBlAAEOZ2V0U2hhcmVTdXBwbHkDCHBvb2xBZGRyBHR5cGUHc2hhcmVJZAMJAAACBQR0eXBlBQdTRl9QT09MCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFEmtTRlBvb2xTaGFyZVN1cHBseQIcQ2FuJ3QgZ2V0IHNoYXJlIGFzc2V0IHN1cHBseQMJAAACBQR0eXBlBQdXWF9QT09MCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUHc2hhcmVJZAINV3JvbmcgU2hhcmVJZAhxdWFudGl0eQkBD3Vua25vd25Qb29sVHlwZQABEWdldFBvb2xUb3RhbFNoYXJlAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAAAARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4AAAEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQR1c2VyCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0AAAABAQpnZXRBeGx5RmVlAgRwb29sB2ZlZVR5cGUDCQAAAgUHZmVlVHlwZQUMQ0FQX0ZFRV9MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tBeGx5V2l0aExvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUPQ0FQX0ZFRV9OT19MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtBeGx5Tm9Mb2FuQ2FwRmVlAwkAAAIFB2ZlZVR5cGUFCExPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEmtBeGx5SW5GZWVXaXRoTG9hbgMJAAACBQdmZWVUeXBlBQtOT19MT0FOX0ZFRQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRVrQXhseUluRmVlV2l0aG91dExvYW4DCQAAAgUHZmVlVHlwZQUGTk9fRkVFAAAJAAIBAg5Xcm9uZyBmZWUgdHlwZQEQZ2V0U0ZGYXJtaW5nQWRkcgAJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUOa1NGRmFybWluZ0FkZHICHUNhbid0IGdldCBzd29wZmkgZmFybWluZyBhZGRyARBnZXRXWEZhcm1pbmdBZGRyAQhwb29sQWRkcgQJZkNvbnRyYWN0CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyAhMlc19fZmFjdG9yeUNvbnRyYWN0AiJDYW4ndCBnZXQgV1ggZmFjdG9yeSBjb250cmFjdCBhZGRyBApmYWN0cm95Q2ZnCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQlmQ29udHJhY3QCESVzX19mYWN0b3J5Q29uZmlnAhhDYW4ndCBnZXQgV1ggZmFjdG9yeSBjZmcCAl9fCQEHQWRkcmVzcwEJANkEAQkAkQMCBQpmYWN0cm95Q2ZnAAEBDGFzc2V0SWRUb1N0cgEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA2AQBBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAIFV0FWRVMJAAIBAgxOb3QgQXNzZXQgaWQBDmFzc2V0SWRGcm9tU3RyAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFB2Fzc2V0SWQBEGdldEFzc2V0RGVjaW1hbHMBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMACAQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIZGVjaW1hbHMJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARFnZXRBc3NldFByZWNpdGlvbgEHYXNzZXRJZAkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB2Fzc2V0SWQAAAAABQRET1dOAQ5nZXRBc3NldHNQcmljZQEIYXNzZXRJZHMKAQlnZXRQcmljZXMCAWEHYXNzZXRJZAQKYXNzZXRQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUA////////////AQkAzQgCBQFhBQphc3NldFByaWNlCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgENZ2V0U2hhcmVQcmljZQEHc2hhcmVJZAQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUHc2hhcmVJZAUKa1NoYXJlUG9vbAIgQ2FuJ3QgZmluZCBwb29sIGFkZHIgYnkgc2hhcmUgaWQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDEzNDQ5MTM1MTQJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDYUlkCAUNJHQwMTM0NDkxMzUxNAJfMQQDYklkCAUNJHQwMTM0NDkxMzUxNAJfMgQIYUJhbGFuY2UIBQ0kdDAxMzQ0OTEzNTE0Al8zBAhiQmFsYW5jZQgFDSR0MDEzNDQ5MTM1MTQCXzQEBnByaWNlcwkBDmdldEFzc2V0c1ByaWNlAQkAzAgCBQNhSWQJAMwIAgUDYklkBQNuaWwEB2RQcmljZUEJAJEDAgUGcHJpY2VzAAAEB2RQcmljZUIJAJEDAgUGcHJpY2VzAAEDAwkAZgIAAAUHZFByaWNlQQYJAGYCAAAFB2RQcmljZUIA////////////AQQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAQKQVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB3NoYXJlSWQAAAAABQRET1dOBANzdW0JAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgkAawMFA3N1bQUOc2hhcmVQcmVjaXNpb24FC3NoYXJlU3VwcGx5AQ5nZXRTaGFyZVByaWNlcwEIc2hhcmVJZHMKAQlnZXRQcmljZXMCAWEHc2hhcmVJZAkAzQgCBQFhCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQKAAIkbAUIc2hhcmVJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAQ5nZXRDdXJzRW50cmllcwQDYUlkA2JJZAdzaGFyZUlkCHdBbW91bnRzBAxhc3NldHNQcmljZXMJAQ5nZXRBc3NldHNQcmljZQEJAMwIAgUDYUlkCQDMCAIFA2JJZAUDbmlsBApzaGFyZVByaWNlCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQEBnByaWNlcwkAzggCCQDMCAIJAKQDAQkAkQMCBQxhc3NldHNQcmljZXMAAAkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAEJAMwIAgkApAMBBQpzaGFyZVByaWNlBQNuaWwFCHdBbW91bnRzCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tUb2tlbkxhc3RQcmljZQkAuQkCBQZwcmljZXMCASwFA25pbAEYY2FsY1JlcGxlbmlzaEJ5VHdvVG9rZW5zCQVwVHlwZQhwb29sQWRkcgRMUElkBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgMJAAACBQVwVHlwZQUHU0ZfUE9PTAQEcmVwbAoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAiBjYWxjTFBSZXBsZW5pc2hUd29Ub2tlbnNSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUEcG10QQkAzAgCCQCkAwEFBHBtdEIFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFBHJlcGwFBHJlcGwJAJcKBQoAAUAJAJEDAgUEcmVwbAADAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAAEAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkBDGFzc2V0SWRUb1N0cgEJAJEDAgUEcmVwbAACCgABQAkAkQMCBQRyZXBsAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAxNTA3MjE1MzM4CQCUCgIJALUJAgoAAUAJAPwHBAUGd3hSZXN0AiRwb29sRXZhbHVhdGVQdXRCeUFtb3VudEFzc2V0UkVBRE9OTFkJAMwIAgUETFBJZAkAzAgCBQRwbXRBBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fCQC1CQIKAAFACQD8BwQFBnd4UmVzdAIjcG9vbEV2YWx1YXRlUHV0QnlQcmljZUFzc2V0UkVBRE9OTFkJAMwIAgUETFBJZAkAzAgCBQRwbXRCBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fAwkAAAIFDSR0MDE1MDcyMTUzMzgFDSR0MDE1MDcyMTUzMzgECmV2YWxQdXRJbkIIBQ0kdDAxNTA3MjE1MzM4Al8yBApldmFsUHV0SW5BCAUNJHQwMTUwNzIxNTMzOAJfMQQFbHBJbkEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5BAAEEBWxwSW5CCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQgABAwkAZgIFBWxwSW5CBQVscEluQQQDcG10CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQAICQCXCgUFBHBtdEEFA3BtdAkAZQIFBHBtdEIFA3BtdAUDYklkBQVscEluQgQDcG10CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQgAHCQCXCgUFA3BtdAUEcG10QgkAZQIFBHBtdEEFA3BtdAUDYUlkBQVscEluQQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQcIcG9vbEFkZHIFcFR5cGUEcG10QQNhSWQEcG10QgNiSWQEbHBJZAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2FJZAUEcG10QQkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUDYklkBQRwbXRCBQNuaWwECXByb3h5QWRkcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKUIAQUIcG9vbEFkZHIFDmtQb29sUHJveHlBZGRyAgADCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zCQDMCAIJAMwIAgIFZmFsc2UJAMwIAgIBMAUDbmlsBQNuaWwFCHBheW1lbnRzAwkAAAIFBXBUeXBlBQdXWF9QT09MAwkAAAIFCXByb3h5QWRkcgIACQD8BwQFCHBvb2xBZGRyAgNwdXQJAMwIAgDAhD0JAMwIAgcFA25pbAUIcGF5bWVudHMJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAhR3eFJlcGxlbmlzaFR3b1Rva2VucwkAzAgCCQClCAEFCHBvb2xBZGRyCQDMCAIFBGxwSWQJAMwIAgDAhD0JAMwIAgcFA25pbAUIcGF5bWVudHMJAQ91bmtub3duUG9vbFR5cGUAARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQUIcG9vbEFkZHIFcFR5cGUDcG10BXBtdElkBGxwSWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQVwbXRJZAUDcG10BQNuaWwECXByb3h5QWRkcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKUIAQUIcG9vbEFkZHIFDmtQb29sUHJveHlBZGRyAgADCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhVyZXBsZW5pc2hXaXRoT25lVG9rZW4JAMwIAgkAzAgCAgEwCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAQCZmMDCQAAAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKUIAQUIcG9vbEFkZHIFCWtQb29sVHlwZQIEY3BtbQUERkxBVAILcHV0T25lVGtuVjICCXB1dE9uZVRrbgMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhwb29sQWRkcgUCZmMJAMwIAgAACQDMCAIHBQNuaWwFCHBheW1lbnRzCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgITd3hSZXBsZW5pc2hPbmVUb2tlbgkAzAgCCQClCAEFCHBvb2xBZGRyCQDMCAIFBGxwSWQJAMwIAgUCZmMJAMwIAgAACQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEHc3Rha2VMUAUEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudA1zdGFrZVRvTWFya2V0BAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQdzaGFyZUlkBQZhbW91bnQFA25pbAQJcHJveHlBZGRyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAMFDXN0YWtlVG9NYXJrZXQJAPwHBAULcE1hcmtldEFkZHICBnN1cHBseQUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACD2xvY2tTaGFyZVRva2VucwkAzAgCBQRwb29sCQDMCAIAAAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAQIZmFybUFkZHIJARBnZXRXWEZhcm1pbmdBZGRyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhmYXJtQWRkcgIFc3Rha2UFA25pbAUIcGF5bWVudHMJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAgl3eFN0YWtlTHAJAMwIAgkApQgBBQhmYXJtQWRkcgUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABCXVuc3Rha2VMUAUEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudApmcm9tTWFya2V0BAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIABA0kdDAxODA3NTE4NzU3AwUKZnJvbU1hcmtldAkAlQoDBQtwTWFya2V0QWRkcgIId2l0aGRyYXcJAMwIAgUHc2hhcmVJZAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkAlQoDCQEQZ2V0U0ZGYXJtaW5nQWRkcgACE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAQIZmFybUFkZHIJARBnZXRXWEZhcm1pbmdBZGRyAQkBB0FkZHJlc3MBCQDZBAEFBHBvb2wDCQAAAgUJcHJveHlBZGRyAgAJAJUKAwUIZmFybUFkZHICB3Vuc3Rha2UJAMwIAgUHc2hhcmVJZAkAzAgCBQZhbW91bnQFA25pbAkAlQoDCQERQGV4dHJOYXRpdmUoMTA2MikBBQlwcm94eUFkZHICC3d4VW5zdGFrZUxwCQDMCAIJAKUIAQUIZmFybUFkZHIJAMwIAgUHc2hhcmVJZAkAzAgCBQZhbW91bnQFA25pbAkBD3Vua25vd25Qb29sVHlwZQAECGZhcm1BZGRyCAUNJHQwMTgwNzUxODc1NwJfMQQFZk5hbWUIBQ0kdDAxODA3NTE4NzU3Al8yBAZwYXJhbXMIBQ0kdDAxODA3NTE4NzU3Al8zBANpbnYJAPwHBAUIZmFybUFkZHIFBWZOYW1lBQZwYXJhbXMFA25pbAMJAAACBQNpbnYFA2ludgUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARFjYWxjQW1vdW50VG9QYXlTRgcEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQJZmVlU2NhbGU2AMCEPQQDZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQhwb29sQWRkcgUKa1NGUG9vbEZlZQQMYW1udEdldE5vRmVlCQBuBAUQYW1vdW50VG9rZW5Ub0dldAUJZmVlU2NhbGU2CQBlAgUJZmVlU2NhbGU2BQNmZWUFB0NFSUxJTkcEDSR0MDE5MTc5MTk0ODUDCQAAAgUPYXNzZXRUb2tlblRvR2V0BQhhc3NldElkQQQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEIJAGUCBQRiYWxBBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAbgQFDGFtbnRHZXROb0ZlZQUEYmFsQQkAZQIFBGJhbEIFDGFtbnRHZXROb0ZlZQUHQ0VJTElORwkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTkxNzkxOTQ4NQJfMQQKYXNzZXRUb1BheQgFDSR0MDE5MTc5MTk0ODUCXzIJAJQKAgUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkBDWdldFdYU3dhcEZlZXMBBHBvb2wECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBAlmQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgITJXNfX2ZhY3RvcnlDb250cmFjdAIiQ2FuJ3QgZ2V0IFdYIGZhY3RvcnkgY29udHJhY3QgYWRkcgQOcG9vbEZlZURlZmF1bHQJAQV2YWx1ZQEJAJoIAgUOd3hTd2FwQ29udHJhY3QCCyVzX19wb29sRmVlBBJwcm90b2NvbEZlZURlZmF1bHQJAQV2YWx1ZQEJAJoIAgUOd3hTd2FwQ29udHJhY3QCDyVzX19wcm90b2NvbEZlZQQHJG1hdGNoMAkA/AcEBQlmQ29udHJhY3QCEmdldFN3YXBGZWVSRUFET05MWQkAzAgCCQClCAEFCHBvb2xBZGRyBQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBARmZWVzBQckbWF0Y2gwCQCUCgIIBQRmZWVzAl8xCAUEZmVlcwJfMgkAlAoCBQ5wb29sRmVlRGVmYXVsdAUScHJvdG9jb2xGZWVEZWZhdWx0ARFjYWxjQW1vdW50VG9QYXlXWAcEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQEDSR0MDIwMjI1MjAyNjQJAQ1nZXRXWFN3YXBGZWVzAQUEcG9vbAQEcEZlZQgFDSR0MDIwMjI1MjAyNjQCXzEEBXByRmVlCAUNJHQwMjAyMjUyMDI2NAJfMgQIZmVlU2NhbGUJALYCAQCAwtcvBA0kdDAyMDMwNDIwNjEyAwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBrAwUQYW1vdW50VG9rZW5Ub0dldAUEYmFsQgkAZQIFBGJhbEEFEGFtb3VudFRva2VuVG9HZXQJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEEJAGUCBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQQQLYW1vdW50VG9QYXkIBQ0kdDAyMDMwNDIwNjEyAl8xBAphc3NldFRvUGF5CAUNJHQwMjAzMDQyMDYxMgJfMgQSYW1vdW50VG9QYXlXaXRoRmVlCQCgAwEJAL0CBAkAtgIBBQthbW91bnRUb1BheQUIZmVlU2NhbGUJALgCAgUIZmVlU2NhbGUJALYCAQkAZAIFBXByRmVlBQRwRmVlBQdDRUlMSU5HCQCUCgIFCmFzc2V0VG9QYXkFEmFtb3VudFRvUGF5V2l0aEZlZQEQZXhjaGFuZ2VEaXJlY3RseQgFcFR5cGUEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQEBnBvb2xGQgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAgADAwkAAAIFBXBUeXBlBQdTRl9QT09MBgkBAiE9AgUGcG9vbEZCAgAEDSR0MDIxMDUzMjEyNjUDCQAAAgUGcG9vbEZCAgAJAJUKAwUEYmFsQQUEYmFsQgUEcG9vbAQNJHQwMjExNTkyMTIzMgkBEWdldFNGUG9vbEJhbGFuY2VzAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUGcG9vbEZCBAZzZkJhbEEIBQ0kdDAyMTE1OTIxMjMyAl8xBAZzZkJhbEIIBQ0kdDAyMTE1OTIxMjMyAl8yCQCVCgMFBnNmQmFsQQUGc2ZCYWxCBQZwb29sRkIEBXBCYWxBCAUNJHQwMjEwNTMyMTI2NQJfMQQFcEJhbEIIBQ0kdDAyMTA1MzIxMjY1Al8yBAZleFBvb2wIBQ0kdDAyMTA1MzIxMjY1Al8zBA0kdDAyMTI3MDIxMzk2CQERY2FsY0Ftb3VudFRvUGF5U0YHBQZleFBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUFcEJhbEEFBXBCYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAyMTI3MDIxMzk2Al8xBAthbW91bnRUb1BheQgFDSR0MDIxMjcwMjEzOTYCXzIJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUGZXhQb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCCQCkAwEFEGFtb3VudFRva2VuVG9HZXQFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQphc3NldFRvUGF5BQthbW91bnRUb1BheQUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAyMTU5ODIxNzIwCQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBGJhbEEFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDIxNTk4MjE3MjACXzEEC2Ftb3VudFRvUGF5CAUNJHQwMjE1OTgyMTcyMAJfMgkA/AcEBQ53eFN3YXBDb250cmFjdAIEc3dhcAkAzAgCBRBhbW91bnRUb2tlblRvR2V0CQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAkBD3Vua25vd25Qb29sVHlwZQABFWV4Y2hhbmdlRGlyZWN0bHlOb0xpbQUFcFR5cGUEcG9vbA1hbW91bnRUb2tlbkV4DmFzc2V0VG9rZW5Ub0V4D2Fzc2V0VG9rZW5Ub0dldAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQ9hc3NldFRva2VuVG9HZXQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEBnBvb2xGQgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAgAEA2ludgMDCQAAAgUFcFR5cGUFB1NGX1BPT0wGCQECIT0CBQZwb29sRkICAAQGZXhQb29sAwkAAAIFBnBvb2xGQgIABQRwb29sBQZwb29sRkIJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUGZXhQb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCAgExBQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUOYXNzZXRUb2tlblRvRXgFDWFtb3VudFRva2VuRXgFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkA/AcEBQ53eFN3YXBDb250cmFjdAIEc3dhcAkAzAgCAAEJAMwIAgUPYXNzZXRUb2tlblRvR2V0CQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQ5hc3NldFRva2VuVG9FeAUNYW1vdW50VG9rZW5FeAUDbmlsCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQIYmFsQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFD2Fzc2V0VG9rZW5Ub0dldAMJAAACBQhiYWxBZnRlcgUIYmFsQWZ0ZXIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQIcG9vbEFkZHIFcFR5cGUHc2hhcmVJZA91c2VyQ2FuV2l0aGRyYXcEDSR0MDIyODQ5MjMzMjADCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhB3aXRoZHJhd1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2ludgUDaW52CQCUCgIKAAFACQCRAwIFA2ludgAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUDaW52AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJALUJAgoAAUAJAPwHBAUGd3hSZXN0Ahdwb29sRXZhbHVhdGVHZXRSRUFET05MWQkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNpbnYFA2ludgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAEB2Ftb3VudEEIBQ0kdDAyMjg0OTIzMzIwAl8xBAdhbW91bnRCCAUNJHQwMjI4NDkyMzMyMAJfMgkAlAoCBQdhbW91bnRBBQdhbW91bnRCAQtjbGFpbUZhcm1lZAIFcFR5cGUEcG9vbAQJcHJveHlBZGRyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQZTV09QSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDIzNzYwMjM4MzkJAQ1nZXRXWFBvb2xEYXRhAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQDYUlkCAUNJHQwMjM3NjAyMzgzOQJfMQQDYklkCAUNJHQwMjM3NjAyMzgzOQJfMgQEYUJhbAgFDSR0MDIzNzYwMjM4MzkCXzMEBGJCYWwIBQ0kdDAyMzc2MDIzODM5Al80BARscElkCAUNJHQwMjM3NjAyMzgzOQJfNQQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQRXWElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBAhmYXJtQWRkcgkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBANpbnYDCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIZmFybUFkZHICB2NsYWltV3gJAMwIAgUEbHBJZAUDbmlsBQNuaWwJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAg13eENsYWltRmFybWVkCQDMCAIJAKUIAQUIZmFybUFkZHIJAMwIAgUEbHBJZAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECGJhbEFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQRXWElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQRXWElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAEPcmVwbGVuaXNoQnlUeXBlCwVwVHlwZQRwb29sB2ZlZVR5cGUEcG10QQNhSWQEcG10QgNiSWQEYmFsQQRiYWxCBExQSWQLc3Rha2VNYXJrZXQED2xwQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkAwkAAAIFD2xwQmFsYW5jZUJlZm9yZQUPbHBCYWxhbmNlQmVmb3JlBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQNJHQwMjQ2NDQyNTA3MgMDCQBmAgUEcG10QQAACQBmAgUEcG10QgAABwQNJHQwMjQ3MTAyNDgzMgkBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwkFBXBUeXBlBQhwb29sQWRkcgUETFBJZAUEcG10QQUDYUlkBQRwbXRCBQNiSWQFBGJhbEEFBGJhbEIEBnBtdEluQQgFDSR0MDI0NzEwMjQ4MzICXzEEBnBtdEluQggFDSR0MDI0NzEwMjQ4MzICXzIEBmNoYW5nZQgFDSR0MDI0NzEwMjQ4MzICXzMECGNoYW5nZUlkCAUNJHQwMjQ3MTAyNDgzMgJfNAQDaW52CQEYcmVwbGVuaXNoVHdvVG9rZW5zQnlUeXBlBwUIcG9vbEFkZHIFBXBUeXBlBQZwbXRJbkEFA2FJZAUGcG10SW5CBQNiSWQFBExQSWQDCQAAAgUDaW52BQNpbnYJAJQKAgUGY2hhbmdlBQhjaGFuZ2VJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAGYCBQRwbXRBAAAJAJQKAgUEcG10QQUDYUlkAwkAZgIFBHBtdEIAAAkAlAoCBQRwbXRCBQNiSWQJAAIBAhBwbXRzIG11c3QgYmUgPiAwBAZjaGFuZ2UIBQ0kdDAyNDY0NDI1MDcyAl8xBAhjaGFuZ2VJZAgFDSR0MDI0NjQ0MjUwNzICXzIEA2ludgMJAGYCBQZjaGFuZ2UAAAkBF3JlcGxlbmlzaE9uZVRva2VuQnlUeXBlBQUIcG9vbEFkZHIFBXBUeXBlBQZjaGFuZ2UFCGNoYW5nZUlkBQRMUElkBQNuaWwDCQAAAgUDaW52BQNpbnYEDmxwQmFsYW5jZUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBCQDZBAEFBExQSWQEC3RvdGFsU3Rha2VkCQBlAgUObHBCYWxhbmNlQWZ0ZXIFD2xwQmFsYW5jZUJlZm9yZQQNYXhseUZlZUFtb3VudAkAawMFC3RvdGFsU3Rha2VkCQEKZ2V0QXhseUZlZQIFBHBvb2wFB2ZlZVR5cGUFCkZFRV9TQ0FMRTYEEXVzZXJTaGFyZUZvclN0YWtlCQBlAgULdG90YWxTdGFrZWQFDWF4bHlGZWVBbW91bnQDCQBnAgAABRF1c2VyU2hhcmVGb3JTdGFrZQkAAgECKGFtb3VudCBvZiBzdGFrZWQgc2hhcmV0b2tlbnMgbXVzdCBiZSA+IDAEBWludkxQCQEHc3Rha2VMUAUFBHBvb2wFBXBUeXBlBQRMUElkBRF1c2VyU2hhcmVGb3JTdGFrZQULc3Rha2VNYXJrZXQDCQAAAgUFaW52TFAFBWludkxQCQCUCgIFEXVzZXJTaGFyZUZvclN0YWtlBQ1heGx5RmVlQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARByZXBsZW5pc2hFbnRyaWVzCQRwb29sBHVzZXIMc3Rha2VkQW1vdW50DWF4bHlGZWVBbW91bnQGcG9zTnVtB3NoYXJlSWQEdHlwZQh3aXRoTG9hbg1zdGFrZVRvTWFya2V0BAt0b3RhbEFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQPdG90YWxBbW91bnRMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEEXRvdGFsQW1vdW50TWFya2V0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAAABBV0b3RhbEFtb3VudE1hcmtldExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgAABBJwb29sSW50ZXJlc3ROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAEEHBvb2xJbnRlcmVzdExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgAABBhwb29sSW50ZXJlc3RNYXJrZXROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuAAAEFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRdrUG9vbEludGVyZXN0TWFya2V0TG9hbgAABA0kdDAyNjUzMzI3MzU4AwUId2l0aExvYW4DBQ1zdGFrZVRvTWFya2V0CQCUCgIFFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZAIFEXRvdGFsQW1vdW50TWFya2V0BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGQCBRV0b3RhbEFtb3VudE1hcmtldExvYW4FDHN0YWtlZEFtb3VudAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BgUDbmlsCQCUCgIFEHBvb2xJbnRlcmVzdExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGQCBQ90b3RhbEFtb3VudExvYW4FDHN0YWtlZEFtb3VudAUDbmlsAwUNc3Rha2VUb01hcmtldAkAlAoCBRhwb29sSW50ZXJlc3RNYXJrZXROb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZAIFEXRvdGFsQW1vdW50TWFya2V0BQxzdGFrZWRBbW91bnQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAYFA25pbAkAlAoCBRJwb29sSW50ZXJlc3ROb0xvYW4FA25pbAQPY3VyUG9vbEludGVyZXN0CAUNJHQwMjY1MzMyNzM1OAJfMQQHYWRFbnRyeQgFDSR0MDI2NTMzMjczNTgCXzIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgULdG90YWxBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBQ1rVXNlclBvc2l0aW9uBQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUVa1VzZXJQb3NpdGlvbkludGVyZXN0BQ9jdXJQb29sSW50ZXJlc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sBQRwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0FBnBvc051bQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUNYXhseUZlZUFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwFB2FkRW50cnkBCWxpc3RUb0ludAIBYQRpdGVtCQDNCAIFAWEJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQEQZGlyZWN0U3dvcGZpQ1BNTQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBARwbXRQCQC1CQIJAJEDAgUFckFyZ3MAAgIBfAQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANwbXQJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEJAJEDAgUEcG10UAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcG10UAABBQNuaWwEC21pblRvUmVjaXZlCQCRAwIFBXJBcmdzAAMEA2ludgkA/AcEBQRkQXBwAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCBQttaW5Ub1JlY2l2ZQUDbmlsBQNuaWwFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZGlyZWN0Um91dGluZ1N3b3BmaQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA3BtdAQEcG10UAkAtQkCCQCRAwIFBXJBcmdzAAICAXwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQkAkQMCBQRwbXRQAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRwbXRQAAEFA25pbAQEYXJncwQFZUFyZ3MJALUJAgkAkQMCBQVyQXJncwADAgF8BApleGNoYW5nZXJzCQC1CQIJAJEDAgUFZUFyZ3MAAAIBLAQOZXhjaGFuZ2Vyc1R5cGUJALUJAgkAkQMCBQVlQXJncwABAgEsBAVhcmdzMQoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAgIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADBAVhcmdzMgoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADBBFyb3V0aW5nQXNzZXRzS2V5cwkAtQkCCQCRAwIFBWVBcmdzAAQCASwEC21pblRvUmVjaXZlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFZUFyZ3MABQkAzAgCBQpleGNoYW5nZXJzCQDMCAIFDmV4Y2hhbmdlcnNUeXBlCQDMCAIFBWFyZ3MxCQDMCAIFBWFyZ3MyCQDMCAIFEXJvdXRpbmdBc3NldHNLZXlzCQDMCAIFC21pblRvUmVjaXZlBQNuaWwEA2ludgkA/AcEBQRkQXBwAgxyb3V0aW5nVHJhZGUFBGFyZ3MFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEKY2FwaXRhbGl6ZQkEcG9vbAVwVHlwZQd0b2tlbklkC3Rva2VuQW1vdW50A0FJZANCSWQEYmFsQQRiYWxCB3NoYXJlSWQDAwkBAiE9AgUHdG9rZW5JZAUDQUlkCQECIT0CBQd0b2tlbklkBQNCSWQHCQACAQILV3JvbmcgYXNzZXQEEHRvdGFsU2hhcmVBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wDCQAAAgUQdG90YWxTaGFyZUFtb3VudAAACQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3Rva2VuQW1vdW50CQDZBAEFB3Rva2VuSWQFA25pbAAABBh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQRdG90YWxNYXJrZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0AAAEC2xvYW5QZXJjZW50CQBrAwUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQZTQ0FMRTgJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRF0b3RhbE1hcmtldEFtb3VudAQQdG9rZW5zRm9yRmVlTG9hbgkAawMFC3Rva2VuQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BBJ0b2tlbnNGb3JGZWVOb0xvYW4JAGUCBQt0b2tlbkFtb3VudAUQdG9rZW5zRm9yRmVlTG9hbgQLYXhseUZlZUxvYW4JAGsDBRB0b2tlbnNGb3JGZWVMb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFDENBUF9GRUVfTE9BTgUKRkVFX1NDQUxFNgQNYXhseUZlZU5vTG9hbgkAawMFEnRva2Vuc0ZvckZlZU5vTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQ9DQVBfRkVFX05PX0xPQU4FCkZFRV9TQ0FMRTYEB2F4bHlGZWUJAGQCBQtheGx5RmVlTG9hbgUNYXhseUZlZU5vTG9hbgQNJHQwMzAyNzUzMDM3NQMJAAACBQd0b2tlbklkBQNBSWQJAJQKAgkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlAAAJAJQKAgAACQBlAgULdG9rZW5BbW91bnQFB2F4bHlGZWUEBHBtdEEIBQ0kdDAzMDI3NTMwMzc1Al8xBARwbXRCCAUNJHQwMzAyNzUzMDM3NQJfMgQNJHQwMzAzNzgzMDQ4OQkBD3JlcGxlbmlzaEJ5VHlwZQsFBXBUeXBlBQRwb29sBQZOT19GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBwQMc3Rha2VkQW1vdW50CAUNJHQwMzAzNzgzMDQ4OQJfMQQCbmYIBQ0kdDAzMDM3ODMwNDg5Al8yBBNjdXJQb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABApzdGFrZWRMb2FuCQBrAwUMc3Rha2VkQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BAxzdGFrZWROb0xvYW4JAGUCBQxzdGFrZWRBbW91bnQFCnN0YWtlZExvYW4ED25ld0ludGVyZXN0TG9hbgMJAGYCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFE2N1clBvb2xJbnRlcmVzdExvYW4JAGsDBQpzdGFrZWRMb2FuBQdTQ0FMRTEwBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAQRbmV3SW50ZXJlc3ROb0xvYW4DCQBmAgkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQBkAgUVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQBrAwUMc3Rha2VkTm9Mb2FuBQdTQ0FMRTEwCQBlAgUQdG90YWxTaGFyZUFtb3VudAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgUPbmV3SW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4FEW5ld0ludGVyZXN0Tm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBkAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQpzdGFrZWRMb2FuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQdheGx5RmVlCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlbklkBQNuaWwFDHN0YWtlZEFtb3VudAEWY2FwaXRhbGl6ZVB1enpsZU1hcmtldAMEcG9vbAVwVHlwZQdzaGFyZUlkBBB0b3RhbFNoYXJlQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBA1tYXJrZXRCYWxhbmNlCQDwBwIFC3BNYXJrZXRBZGRyCQDZBAEFB3NoYXJlSWQDCQAAAgUNbWFya2V0QmFsYW5jZQUNbWFya2V0QmFsYW5jZQQPbWFya2V0QXZhaWxhYmxlCgABQAkA/AcEBQ9wTWFya2V0UmVzdEFkZHICHGFzc2V0U3VwcGx5QnlBZGRyZXNzUkVBRE9OTFkJAMwIAgkApQgBBQtwTWFya2V0QWRkcgkAzAgCBQdzaGFyZUlkCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFD21hcmtldEF2YWlsYWJsZQUPbWFya2V0QXZhaWxhYmxlBBF0b3RhbE1hcmtldEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQAAAQZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuAAADAwkAAAIFEXRvdGFsTWFya2V0QW1vdW50AAAJAGYCBQ9tYXJrZXRBdmFpbGFibGUAAAcEDnVuc3Rha2VkQW1vdW50CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD21hcmtldEF2YWlsYWJsZQYDCQAAAgUOdW5zdGFrZWRBbW91bnQFDnVuc3Rha2VkQW1vdW50AwkAZgIFDW1hcmtldEJhbGFuY2UFDnVuc3Rha2VkQW1vdW50CQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDnVuc3Rha2VkQW1vdW50CQDZBAEFB3NoYXJlSWQFA25pbAAACQCUCgIFA25pbAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAljYXBBbW91bnQJAGUCBQ9tYXJrZXRBdmFpbGFibGUFEXRvdGFsTWFya2V0QW1vdW50AwkAZwIAAAUJY2FwQW1vdW50CQCUCgIFA25pbAAABBFtYXJrZXRMb2FuUGVyY2VudAkAawMFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4FBlNDQUxFOAURdG90YWxNYXJrZXRBbW91bnQEFnRva2Vuc01hcmtldEZvckZlZUxvYW4JAGsDBQljYXBBbW91bnQFEW1hcmtldExvYW5QZXJjZW50BQZTQ0FMRTgEG3Rva2Vuc01hcmtldEZvckZvckZlZU5vTG9hbgkAZQIFCWNhcEFtb3VudAUWdG9rZW5zTWFya2V0Rm9yRmVlTG9hbgQRYXhseU1hcmtldEZlZUxvYW4JAGsDBRZ0b2tlbnNNYXJrZXRGb3JGZWVMb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFDENBUF9GRUVfTE9BTgUKRkVFX1NDQUxFNgQTYXhseU1hcmtldEZlZU5vTG9hbgkAawMFG3Rva2Vuc01hcmtldEZvckZvckZlZU5vTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQ9DQVBfRkVFX05PX0xPQU4FCkZFRV9TQ0FMRTYEDWF4bHlNYXJrZXRGZWUJAGQCBRFheGx5TWFya2V0RmVlTG9hbgUTYXhseU1hcmtldEZlZU5vTG9hbgMJAGYCBQ1heGx5TWFya2V0RmVlBQ1tYXJrZXRCYWxhbmNlCQCUCgIFA25pbAAABBJzdGFrZWRNYXJrZXRBbW91bnQJAGUCBQljYXBBbW91bnQFDWF4bHlNYXJrZXRGZWUEEHN0YWtlZE1hcmtldExvYW4JAGsDBRJzdGFrZWRNYXJrZXRBbW91bnQFEW1hcmtldExvYW5QZXJjZW50BQZTQ0FMRTgEEnN0YWtlZE1hcmtldE5vTG9hbgkAZQIFEnN0YWtlZE1hcmtldEFtb3VudAUQc3Rha2VkTWFya2V0TG9hbgQZY3VyUG9vbEludGVyZXN0TWFya2V0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuAAAEG2N1clBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFGWtQb29sSW50ZXJlc3RNYXJrZXROb0xvYW4AAAQVbmV3SW50ZXJlc3RNYXJrZXRMb2FuAwkAZgIFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4AAAkAZAIFGWN1clBvb2xJbnRlcmVzdE1hcmtldExvYW4JAGsDBRBzdGFrZWRNYXJrZXRMb2FuBQdTQ0FMRTEwBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuAAAEF25ld0ludGVyZXN0TWFya2V0Tm9Mb2FuAwkAZgIJAGUCBRF0b3RhbE1hcmtldEFtb3VudAUZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgAACQBkAgUbY3VyUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuCQBrAwUSc3Rha2VkTWFya2V0Tm9Mb2FuBQdTQ0FMRTEwCQBlAgURdG90YWxNYXJrZXRBbW91bnQFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4AAAQOdW5zdGFrZWRBbW91bnQJAQl1bnN0YWtlTFAFBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUNYXhseU1hcmtldEZlZQYDCQAAAgUOdW5zdGFrZWRBbW91bnQFDnVuc3Rha2VkQW1vdW50CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4FFW5ld0ludGVyZXN0TWFya2V0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuBRduZXdJbnRlcmVzdE1hcmtldE5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0CQBkAgURdG90YWxNYXJrZXRBbW91bnQFEnN0YWtlZE1hcmtldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgkAZAIFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4FEHN0YWtlZE1hcmtldExvYW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDWF4bHlNYXJrZXRGZWUJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFA25pbAUSc3Rha2VkTWFya2V0QW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMFBHVzZXIEcG9vbAVwb3NJZAhib3Jyb3dlZAtpc01hcmtldFBvcwQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQMdXNlckludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAQScG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABBBwb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQYcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUZa1Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgAABBZwb29sSW50ZXJlc3RNYXJrZXRMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4AAAQMcG9vbEludGVyZXN0AwUIYm9ycm93ZWQDBQtpc01hcmtldFBvcwUWcG9vbEludGVyZXN0TWFya2V0TG9hbgUQcG9vbEludGVyZXN0TG9hbgMFC2lzTWFya2V0UG9zBRhwb29sSW50ZXJlc3RNYXJrZXROb0xvYW4FEnBvb2xJbnRlcmVzdE5vTG9hbgkAZAIFB3BBbW91bnQJAGsDBQdwQW1vdW50CQBlAgUMcG9vbEludGVyZXN0BQx1c2VySW50ZXJlc3QFB1NDQUxFMTABD2NhbGNTdG9wTG9zc0ZlZQQEcG9vbAppc0JvcnJvd2VkCHN0b3BMb3NzCmxwV2l0aGRyYXcEB2ZlZVR5cGUDBQppc0JvcnJvd2VkBQ1TVE9QTE9TU19MT0FOBRRTVE9QTE9TU19GRUVfTk9fTE9BTgMFCHN0b3BMb3NzCQBrAwUKbHBXaXRoZHJhdwkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2AAABDndpdGhkcmF3VG9Vc2VyBQR1c2VyBHBvb2wFcG9zSWQIc3RvcExvc3MNd2l0aGRyYXdUb2tlbgQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQKZnJvbU1hcmtldAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFmtVc2VyUG9zaXRpb25JblBNYXJrZXQHBAppc0JvcnJvd2VkCQBmAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AAAAAAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBQUEdXNlcgUEcG9vbAUFcG9zSWQFCmlzQm9ycm93ZWQFCmZyb21NYXJrZXQEDnBvb2xUb3RhbFNoYXJlCQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBBJwb29sVG90YWxTaGFyZUxvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQRdG90YWxNYXJrZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0AAAEGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgAABAh1c2VyQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHVzZXIECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAgxVbmtub3duIHBvb2wEDSR0MDM2NTQwMzY2MTIJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQGaWRBU3RyCAUNJHQwMzY1NDAzNjYxMgJfMQQGaWRCU3RyCAUNJHQwMzY1NDAzNjYxMgJfMgQEYmFsQQgFDSR0MDM2NTQwMzY2MTICXzMEBGJhbEIIBQ0kdDAzNjU0MDM2NjEyAl80BAdzaGFyZUlkCAUNJHQwMzY1NDAzNjYxMgJfNQQNJHQwMzY2MTUzNjY4MgkAlAoCCQEOYXNzZXRJZEZyb21TdHIBBQZpZEFTdHIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQlN0cgQDaWRBCAUNJHQwMzY2MTUzNjY4MgJfMQQDaWRCCAUNJHQwMzY2MTUzNjY4MgJfMgQLc3RvcExvc3NGZWUJAQ9jYWxjU3RvcExvc3NGZWUEBQRwb29sBQppc0JvcnJvd2VkBQhzdG9wTG9zcwUPdXNlckNhbldpdGhkcmF3BAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIABAtjQmFsQUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFC2NCYWxBQmVmb3JlBQtjQmFsQUJlZm9yZQQLY0JhbEJCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQtjQmFsQkJlZm9yZQULY0JhbEJCZWZvcmUEA2ludgMJAAACBQVwVHlwZQUHU0ZfUE9PTAQDaW52CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFC3N0b3BMb3NzRmVlBQpmcm9tTWFya2V0AwkAAAIFA2ludgUDaW52CQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIId2l0aGRyYXcJAMwIAgkAzAgCCQCkAwEJAGUCBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlBQNuaWwFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJAQl1bnN0YWtlTFAFBQRwb29sBQVwVHlwZQUHc2hhcmVJZAkAZAIFD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUFCmZyb21NYXJrZXQDCQAAAgUDaW52BQNpbnYDCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIcG9vbEFkZHICA2dldAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQlwcm94eUFkZHICE3d4V2l0aGRyYXdUd29Ub2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZpZEFTdHIJAMwIAgUGaWRCU3RyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQKY0JhbEFBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFCmNCYWxBQWZ0ZXIFCmNCYWxBQWZ0ZXIECmNCYWxCQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQpjQmFsQkFmdGVyBQpjQmFsQkFmdGVyBA0kdDAzNzY5MDM3Nzc5CQCUCgIJAGUCBQpjQmFsQUFmdGVyBQtjQmFsQUJlZm9yZQkAZQIFCmNCYWxCQWZ0ZXIFC2NCYWxCQmVmb3JlBA10b2tlbnNBbW91bnRBCAUNJHQwMzc2OTAzNzc3OQJfMQQNdG9rZW5zQW1vdW50QggFDSR0MDM3NjkwMzc3NzkCXzIEDSR0MDM3NzgyMzkwMTgDBQppc0JvcnJvd2VkBAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QQcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUGaWRCU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QgcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUGaWRBU3RyBQZpZEJTdHIJAGUCBQRiYWxBBQ10b2tlbnNBbW91bnRBCQBlAgUEYmFsQgUNdG9rZW5zQW1vdW50QgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQFA25pbAMJAAACBQVleEludgUFZXhJbnYED2NCYWxBQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFD2NCYWxBQWZ0ZXJSZXBheQUPY0JhbEFBZnRlclJlcGF5BA9jQmFsQkFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQ9jQmFsQkFmdGVyUmVwYXkFD2NCYWxCQWZ0ZXJSZXBheQQLY2xvc2VEYnRJbnYDCQBmAgUEZGVidAAACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACCHJlcGF5Rm9yCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQtib3Jyb3dBc3NldAUEZGVidAUDbmlsAAADCQAAAgULY2xvc2VEYnRJbnYFC2Nsb3NlRGJ0SW52AwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEFTdHIJAJQKAgkAZQIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlBQRkZWJ0CQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQkAlAoCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQkAZQIJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlBQRkZWJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFDXRva2Vuc0Ftb3VudEEFDXRva2Vuc0Ftb3VudEIEB3RvVXNlckEIBQ0kdDAzNzc4MjM5MDE4Al8xBAd0b1VzZXJCCAUNJHQwMzc3ODIzOTAxOAJfMgQUcG9vbFRvdGFsTG9hbkVudHJpZXMDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgUScG9vbFRvdGFsU2hhcmVMb2FuBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBBZwb29sVG90YWxNYXJrZXRFbnRyaWVzAwUKZnJvbU1hcmtldAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQJAGUCBRF0b3RhbE1hcmtldEFtb3VudAUPdXNlckNhbldpdGhkcmF3BQNuaWwDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuCQBlAgUZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAUDbmlsBA0kdDAzOTQzMTM5ODI2AwMJAAACBQ13aXRoZHJhd1Rva2VuBQZpZEFTdHIJAGYCBQd0b1VzZXJCAAAHBAZhbXRHZXQJARVleGNoYW5nZURpcmVjdGx5Tm9MaW0FBQVwVHlwZQUEcG9vbAUHdG9Vc2VyQgUGaWRCU3RyBQZpZEFTdHIDCQAAAgUGYW10R2V0BQZhbXRHZXQJAJQKAgkAZAIFB3RvVXNlckEFBmFtdEdldAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwMJAAACBQ13aXRoZHJhd1Rva2VuBQZpZEJTdHIJAGYCBQd0b1VzZXJBAAAHBAZhbXRHZXQJARVleGNoYW5nZURpcmVjdGx5Tm9MaW0FBQVwVHlwZQUEcG9vbAUHdG9Vc2VyQQUGaWRBU3RyBQZpZEJTdHIDCQAAAgUGYW10R2V0BQZhbXRHZXQJAJQKAgAACQBkAgUHdG9Vc2VyQgUGYW10R2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFB3RvVXNlckEFB3RvVXNlckIEC3RvVXNlckFDYWxjCAUNJHQwMzk0MzEzOTgyNgJfMQQLdG9Vc2VyQkNhbGMIBQ0kdDAzOTQzMTM5ODI2Al8yBAdlbnRyaWVzCQDOCAIJAM4IAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFmtVc2VyUG9zaXRpb25JblBNYXJrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIFDnBvb2xUb3RhbFNoYXJlBQ91c2VyQ2FuV2l0aGRyYXcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFC3RvVXNlckFDYWxjBQNpZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFC3RvVXNlckJDYWxjBQNpZEIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3N0b3BMb3NzRmVlCQDZBAEFB3NoYXJlSWQFA25pbAUUcG9vbFRvdGFsTG9hbkVudHJpZXMFFnBvb2xUb3RhbE1hcmtldEVudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFBmlkQVN0cgUGaWRCU3RyBQdzaGFyZUlkBQNuaWwJAJQKAgUHZW50cmllcwkAzAgCBQt0b1VzZXJBQ2FsYwkAzAgCBQt0b1VzZXJCQ2FsYwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxsaXF1aWRhdGVQb3MEBmNhbGxlcgR1c2VyBXBvc0lkB2xBbW91bnQEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wCC25vIHBvc2l0aW9uBAxib3Jyb3dBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AhxUaGVyZSBhcmUgbm8gYm9ycm93IHBvc2l0aW9uBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBApmcm9tTWFya2V0CQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAcED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwUFBHVzZXIFBHBvb2wFBXBvc0lkBgUKZnJvbU1hcmtldAQOcG9vbFRvdGFsU2hhcmUJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wEEnBvb2xUb3RhbFNoYXJlTG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBBF0b3RhbE1hcmtldEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQAAAQZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuAAAECHVzZXJBZGRyCQEHQWRkcmVzcwEJANkEAQUEdXNlcgQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwNDE3NTE0MTgyMwkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBAZpZEFTdHIIBQ0kdDA0MTc1MTQxODIzAl8xBAZpZEJTdHIIBQ0kdDA0MTc1MTQxODIzAl8yBARiYWxBCAUNJHQwNDE3NTE0MTgyMwJfMwQEYmFsQggFDSR0MDQxNzUxNDE4MjMCXzQEB3NoYXJlSWQIBQ0kdDA0MTc1MTQxODIzAl81BA0kdDA0MTgyNjQxODkzCQCUCgIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQVN0cgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRCU3RyBANpZEEIBQ0kdDA0MTgyNjQxODkzAl8xBANpZEIIBQ0kdDA0MTgyNjQxODkzAl8yBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIABAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEEHBvb2xJbnRlcmVzdExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgAABBZwb29sSW50ZXJlc3RNYXJrZXRMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4AAAMJAAACBQxib3Jyb3dBbW91bnQAAAkAAgECK1lvdSBjYW4ndCBsaXF1aWRhdGUgcG9zaXRpb24gd2l0aG91dCBib3Jyb3cEC2NCYWxBQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgULY0JhbEFCZWZvcmUFC2NCYWxBQmVmb3JlBAtjQmFsQkJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFC2NCYWxCQmVmb3JlBQtjQmFsQkJlZm9yZQQDaW52AwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIId2l0aGRyYXcJAMwIAgkAzAgCCQCkAwEFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAQDaW52CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUKZnJvbU1hcmtldAMJAAACBQNpbnYFA2ludgMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhwb29sQWRkcgIDZ2V0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgITd3hXaXRoZHJhd1R3b1Rva2VucwkAzAgCBQRwb29sCQDMCAIFBmlkQVN0cgkAzAgCBQZpZEJTdHIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAAwkAAAIFA2ludgUDaW52BApjQmFsQUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgUKY0JhbEFBZnRlcgUKY0JhbEFBZnRlcgQKY0JhbEJBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFCmNCYWxCQWZ0ZXIFCmNCYWxCQWZ0ZXIEDSR0MDQzMDc3NDMxNjYJAJQKAgkAZQIFCmNCYWxBQWZ0ZXIFC2NCYWxBQmVmb3JlCQBlAgUKY0JhbEJBZnRlcgULY0JhbEJCZWZvcmUEDXRva2Vuc0Ftb3VudEEIBQ0kdDA0MzA3NzQzMTY2Al8xBA10b2tlbnNBbW91bnRCCAUNJHQwNDMwNzc0MzE2NgJfMgQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAZgIFB2xBbW91bnQFDXRva2Vuc0Ftb3VudEEHCQBlAgUHbEFtb3VudAUNdG9rZW5zQW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFBmlkQlN0cgkAZgIFB2xBbW91bnQFDXRva2Vuc0Ftb3VudEIHCQBlAgUHbEFtb3VudAUNdG9rZW5zQW1vdW50QgAABAVleEludgMJAGYCBQ1hbW91bnRUb0dldEV4AAAJARBleGNoYW5nZURpcmVjdGx5CAUFcFR5cGUFBHBvb2wFBmlkQVN0cgUGaWRCU3RyCQBlAgUEYmFsQQUNdG9rZW5zQW1vdW50QQkAZQIFBGJhbEIFDXRva2Vuc0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0BQNuaWwDCQAAAgUFZXhJbnYFBWV4SW52BA9jQmFsQUFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQ9jQmFsQUFmdGVyUmVwYXkFD2NCYWxBQWZ0ZXJSZXBheQQPY0JhbEJBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUPY0JhbEJBZnRlclJlcGF5BQ9jQmFsQkFmdGVyUmVwYXkEDSR0MDQzNjcyNDM4OTkDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAlAoCCQBlAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUFB2xBbW91bnQJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlCQCUCgIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlCQBlAgkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUFB2xBbW91bnQEB3RvVXNlckEIBQ0kdDA0MzY3MjQzODk5Al8xBAd0b1VzZXJCCAUNJHQwNDM2NzI0Mzg5OQJfMgQNJHQwNDM5MDI0Mzk3OQkBD2dldFBvb2xCYWxhbmNlcwQFCHBvb2xBZGRyBQVwVHlwZQUGaWRBU3RyBQZpZEJTdHIECWJhbEFBZnRlcggFDSR0MDQzOTAyNDM5NzkCXzEECWJhbEJBZnRlcggFDSR0MDQzOTAyNDM5NzkCXzIEDSR0MDQzOTgyNDQxMTMJAQ9yZXBsZW5pc2hCeVR5cGULBQVwVHlwZQUEcG9vbAUGTk9fRkVFBQd0b1VzZXJBBQZpZEFTdHIFB3RvVXNlckIFBmlkQlN0cgUEYmFsQQUEYmFsQgUHc2hhcmVJZAUKZnJvbU1hcmtldAQKdXNlclN0YWtlZAgFDSR0MDQzOTgyNDQxMTMCXzEEB2F4bHlGZWUIBQ0kdDA0Mzk4MjQ0MTEzAl8yBA91c2VyTHBMaXF1ZGF0ZWQJAGUCBQ91c2VyQ2FuV2l0aGRyYXcFCnVzZXJTdGFrZWQEDSR0MDQ0MTcyNDQ1MTcDBQpmcm9tTWFya2V0CQCUCgIFFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZQIFEXRvdGFsTWFya2V0QW1vdW50BQ91c2VyTHBMaXF1ZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGUCBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuBQ91c2VyTHBMaXF1ZGF0ZWQFA25pbAkAlAoCBRBwb29sSW50ZXJlc3RMb2FuBQNuaWwED2N1clBvb2xJbnRlcmVzdAgFDSR0MDQ0MTcyNDQ1MTcCXzEEFnBvb2xUb3RhbE1hcmtldEVudHJpZXMIBQ0kdDA0NDE3MjQ0NTE3Al8yCQCUCgIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGUCBQ5wb29sVG90YWxTaGFyZQUPdXNlckxwTGlxdWRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgUScG9vbFRvdGFsU2hhcmVMb2FuBQ91c2VyTHBMaXF1ZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAZQIFB3BBbW91bnQFD3VzZXJMcExpcXVkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QFD2N1clBvb2xJbnRlcmVzdAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFB2xBbW91bnQJAQ5hc3NldElkRnJvbVN0cgEFC2JvcnJvd0Fzc2V0BQNuaWwFFnBvb2xUb3RhbE1hcmtldEVudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFBmlkQVN0cgUGaWRCU3RyBQdzaGFyZUlkBQNuaWwFD3VzZXJMcExpcXVkYXRlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMcGFyc2VSZXF1ZXN0AQlyZXF1ZXN0SWQEB3JlcXVlc3QJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUJcmVxdWVzdElkBQprUmVxdWVzdElkCQCsAgICE05vIHJlcXVlc3Qgd2l0aCBpZCAFCXJlcXVlc3RJZAIBLAQEdXNlcgkAkQMCBQdyZXF1ZXN0AAAEBHBvb2wJAJEDAgUHcmVxdWVzdAABBARwbXRBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAACBANBSWQJAJEDAgUHcmVxdWVzdAADBARwbXRCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAEBANCSWQJAJEDAgUHcmVxdWVzdAAFBARiYWxBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAGBARiYWxCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAHBAdzaGFyZUlkCQCRAwIFB3JlcXVlc3QACAQHYndBc3NldAkAkQMCBQdyZXF1ZXN0AAkECGJ3QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAKBA1zdGFrZVRvTWFya2V0CQAAAgkAkQMCBQdyZXF1ZXN0AAsCBHRydWUJAJ4KDAUEdXNlcgUEcG9vbAUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFB2J3QXNzZXQFCGJ3QW1vdW50BQ1zdGFrZVRvTWFya2V0ARBjYWxjQm9ycm93QW1vdW50BgRwbXRBBHBtdEIDYUlkA2JJZAhsZXZlcmFnZQhib3Jyb3dJZAMDCQECIT0CBQhib3Jyb3dJZAUDYUlkCQECIT0CBQhib3Jyb3dJZAUDYklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQHZFByaWNlQQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2FJZAUOa1ByaWNlSW5PcmFjbGUEB2RQcmljZUIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNiSWQFDmtQcmljZUluT3JhY2xlBAZkZWNQckEJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBAZkZWNQckIJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBAxwYXlkSW5Eb2xsYXIJAGQCCQBrAwUHZFByaWNlQQUEcG10QQUGZGVjUHJBCQBrAwUHZFByaWNlQgUEcG10QgUGZGVjUHJCBA0kdDA0NjI0NTQ2MzQyAwkAAAIFCGJvcnJvd0lkBQNhSWQJAJQKAgUHZFByaWNlQQUGZGVjUHJBCQCUCgIFB2RQcmljZUIFBmRlY1ByQgQLYm9ycm93UHJpY2UIBQ0kdDA0NjI0NTQ2MzQyAl8xBAtib3Jyb3dEZWNQcggFDSR0MDQ2MjQ1NDYzNDICXzIJAGsDCQBrAwUMcGF5ZEluRG9sbGFyCQBlAgUIbGV2ZXJhZ2UAZABkBQtib3Jyb3dEZWNQcgULYm9ycm93UHJpY2UBEnBhcnNlUmVwbGVuaXNoUG10cwMEcG10cwNBSWQDQklkAwkAAAIJAJADAQUEcG10cwACAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNBSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEEDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwABB2Fzc2V0SWQFA0JJZAkAAgECFVdyb25nIHBheW1lbnQgYXNzZXQgQgkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50CAkAkQMCBQRwbXRzAAEGYW1vdW50AwkAAAIJAJADAQUEcG10cwABAwkAAAIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQCUCgIICQCRAwIFBHBtdHMAAAZhbW91bnQAAAMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0JJZAkAlAoCAAAICQCRAwIFBHBtdHMAAAZhbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50CQACAQIcT25lIG9yIHR3byBwYXltZW50cyBleHBlY3RlZAEPY2FsY1ByaWNlSW1wYWN0BARiYWxBBGJhbEIHbmV3QmFsQQduZXdCYWxCBANwcmkJAGgCCQBlAgUGU0NBTEU4CQBrAwkAawMFBGJhbEIFBlNDQUxFOAUEYmFsQQUGU0NBTEU4CQBrAwUHbmV3QmFsQgUGU0NBTEU4BQduZXdCYWxBAGQDCQBmAgAABQNwcmkJAGgCBQNwcmkA////////////AQUDcHJpARFjbGFpbUFuZENoZWNrQW1udAUEcG9vbAVwVHlwZQVjbGFpbQZhbW91bnQGY2hhbmdlBA0kdDA0NzM0MjQ4MDIyAwUFY2xhaW0JAQtjbGFpbUZhcm1lZAIFBXBUeXBlBQRwb29sBAxjbGFpbWVkQXNzZXQDCQAAAgUFcFR5cGUFB1NGX1BPT0wFBlNXT1BJRAMJAAACBQVwVHlwZQUHV1hfUE9PTAQMcHJveHlBZGRyU3RyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAQDaW52AwkBAiE9AgUMcHJveHlBZGRyU3RyAgAECXByb3h5QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUMcHJveHlBZGRyU3RyBAxwcm94eUJhbGFuY2UJAPAHAgUJcHJveHlBZGRyBQRXWElEAwkAZgIFDHByb3h5QmFsYW5jZQAACQD8BwQFCXByb3h5QWRkcgIQd3hDbGFpbUZpbmFsaXplZAkAzAgCBQxwcm94eUJhbGFuY2UFA25pbAUDbmlsBQR1bml0BQR1bml0AwkAAAIFA2ludgUDaW52BQRXWElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAkAlAoCBQZhbW91bnQFDGNsYWltZWRBc3NldAMJAAACBQ0kdDA0NzM0MjQ4MDIyBQ0kdDA0NzM0MjQ4MDIyBApjbGFpbUFzc2V0CAUNJHQwNDczNDI0ODAyMgJfMgQLY2xhaW1BbW91bnQIBQ0kdDA0NzM0MjQ4MDIyAl8xBANiYWwJAQ5hY2NvdW50QmFsYW5jZQEFCmNsYWltQXNzZXQDCQAAAgUDYmFsBQNiYWwDCQBmAgUGYW1vdW50BQNiYWwJAAIBAhlUbyBiaWcgYW1vdW50IHRvIGV4Y2hhbmdlCQCUCgIFC2NsYWltQW1vdW50BQpjbGFpbUFzc2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuHAFpARNnZXRQb29sSW5mb1JFQURPTkxZAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDQ4Mzg5NDg0NzkJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwNDgzODk0ODQ3OQJfMQQDQklkCAUNJHQwNDgzODk0ODQ3OQJfMgQEYmFsQQgFDSR0MDQ4Mzg5NDg0NzkCXzMEBGJhbEIIBQ0kdDA0ODM4OTQ4NDc5Al80BAdzaGFyZUlkCAUNJHQwNDgzODk0ODQ3OQJfNQQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAkAlAoCBQNuaWwJAJgKBgUDQUlkBQNCSWQFB3NoYXJlSWQFBGJhbEEFBGJhbEIFC3NoYXJlU3VwcGx5AWkBGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZAQdzaGFyZUlkBAtzaGFyZVByaWNlcwkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCQCUCgIFA25pbAULc2hhcmVQcmljZXMBaQEiZ2V0VXNlclBvc2l0aW9uU2hhcmVBbW91bnRSRUFET05MWQIEdXNlcgZwb3NOdW0EBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sAhBVbmtub3duIHBvc2l0aW9uBAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BApmcm9tTWFya2V0CQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQZwb3NOdW0FFmtVc2VyUG9zaXRpb25JblBNYXJrZXQHBA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMFBQR1c2VyBQRwb29sBQZwb3NOdW0JAGYCBQxib3Jyb3dBbW91bnQAAAUKZnJvbU1hcmtldAkAlAoCBQNuaWwFD3VzZXJDYW5XaXRoZHJhdwFpARdnZXRVc2VyUG9zaXRpb25SRUFET05MWQMEdXNlcgVwb29scwZwb3NOdW0KAQd1c2VyUG9zAgFhBHBvb2wEDSR0MDQ5NDc3NDk1NDcFAWEECXdBbW91bnRzQQgFDSR0MDQ5NDc3NDk1NDcCXzEECXdBbW91bnRzQggFDSR0MDQ5NDc3NDk1NDcCXzIEBWRlYnRzCAUNJHQwNDk0Nzc0OTU0NwJfMwQLZXFXQW1vdW50c0EIBQ0kdDA0OTQ3NzQ5NTQ3Al80BAtlcVdBbW91bnRzQggFDSR0MDQ5NDc3NDk1NDcCXzUEBWluZGV4CAUNJHQwNDk0Nzc0OTU0NwJfNgMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUNa1VzZXJQb3NpdGlvbgkAmAoGCQDNCAIFCXdBbW91bnRzQQAACQDNCAIFCXdBbW91bnRzQgAACQDNCAIFBWRlYnRzAAAJAM0IAgULZXFXQW1vdW50c0EAAAkAzQgCBQtlcVdBbW91bnRzQgAACQBkAgUFaW5kZXgAAQQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDQ5ODI2NDk5MTYJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwNDk4MjY0OTkxNgJfMQQDQklkCAUNJHQwNDk4MjY0OTkxNgJfMgQEYmFsQQgFDSR0MDQ5ODI2NDk5MTYCXzMEBGJhbEIIBQ0kdDA0OTgyNjQ5OTE2Al80BAdzaGFyZUlkCAUNJHQwNDk4MjY0OTkxNgJfNQQMYm9ycm93QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFEWtVc2VyQm9ycm93QW1vdW50AAAECmZyb21NYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAcED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwUFBHVzZXIFBHBvb2wJAJEDAgUGcG9zTnVtBQVpbmRleAkAZgIFDGJvcnJvd0Ftb3VudAAABQpmcm9tTWFya2V0BA0kdDA1MDI2NjUwMzg2CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwQId0Ftb3VudEEIBQ0kdDA1MDI2NjUwMzg2Al8xBAh3QW1vdW50QggFDSR0MDUwMjY2NTAzODYCXzIDCQBmAgUMYm9ycm93QW1vdW50AAAEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4CQDMCAIFC2JvcnJvd0Fzc2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUEZGVidAUEZGVidAQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAZgIFBGRlYnQFCHdBbW91bnRBBwkAZQIFBGRlYnQFCHdBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUDQklkCQBmAgUEZGVidAUId0Ftb3VudEIHCQBlAgUEZGVidAUId0Ftb3VudEIAAAQLYW1vdW50VG9QYXkDCQBmAgUNYW1vdW50VG9HZXRFeAAAAwkAAAIFBXBUeXBlBQdTRl9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVNGBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIDCQAAAgUFcFR5cGUFB1dYX1BPT0wEAmV4CQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQIBQJleAJfMgkBD3Vua25vd25Qb29sVHlwZQAAAAQNJHQwNTEyOTg1MTUxNwMJAAACBQtib3Jyb3dBc3NldAUDQUlkCQCUCgIJAGUCCQBkAgUId0Ftb3VudEEFDWFtb3VudFRvR2V0RXgFBGRlYnQJAGUCBQh3QW1vdW50QgULYW1vdW50VG9QYXkJAJQKAgkAZQIFCHdBbW91bnRBBQthbW91bnRUb1BheQkAZQIJAGQCBQh3QW1vdW50QgUNYW1vdW50VG9HZXRFeAUEZGVidAQKZXFXQW1vdW50QQgFDSR0MDUxMjk4NTE1MTcCXzEECmVxV0Ftb3VudEIIBQ0kdDA1MTI5ODUxNTE3Al8yCQCYCgYJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCCQDNCAIFBWRlYnRzBQRkZWJ0CQDNCAIFC2VxV0Ftb3VudHNBBQplcVdBbW91bnRBCQDNCAIFC2VxV0Ftb3VudHNCBQplcVdBbW91bnRCCQBkAgUFaW5kZXgAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgUFZGVidHMJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCCQBkAgUFaW5kZXgAAQQNJHQwNTE3NzI1MTg4MwoAAiRsBQVwb29scwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJgKBgUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHdXNlclBvcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBAl3QW1vdW50c0EIBQ0kdDA1MTc3MjUxODgzAl8xBAl3QW1vdW50c0IIBQ0kdDA1MTc3MjUxODgzAl8yBAVkZWJ0cwgFDSR0MDUxNzcyNTE4ODMCXzMEC2VxV0Ftb3VudHNBCAUNJHQwNTE3NzI1MTg4MwJfNAQLZXFXQW1vdW50c0IIBQ0kdDA1MTc3MjUxODgzAl81CQCUCgIFA25pbAkAlwoFBQl3QW1vdW50c0EFCXdBbW91bnRzQgUFZGVidHMFC2VxV0Ftb3VudHNBBQtlcVdBbW91bnRzQgFpAQlyZXBsZW5pc2gEBHBvb2wIbGV2ZXJhZ2UIYm9ycm93SWQNc3Rha2VUb01hcmtldAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwMJAGYCAGQFCGxldmVyYWdlBgkAZgIFCGxldmVyYWdlAKwCCQACAQIfTGV2ZXJhZ2UgY2FuJ3QgYmUgPDEwMCBhbmQgPjMwMAMDCQEBIQEJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYW5Cb3Jyb3cJAGYCBQhsZXZlcmFnZQBkBwkAAgECHVlvdSBjYW4ndCBib3Jyb3cgaW4gdGhpcyBwb29sAwMFDXN0YWtlVG9NYXJrZXQJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFDGtQb29sUE1BcmtldAcHCQACAQImVGhpcyBwb29sIGNhbid0IHN0YWtlIHRvIHB1enpsZSBtYXJrZXQEDSR0MDUyNjQyNTI3MzIJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwNTI2NDI1MjczMgJfMQQDQklkCAUNJHQwNTI2NDI1MjczMgJfMgQEYmFsQQgFDSR0MDUyNjQyNTI3MzICXzMEBGJhbEIIBQ0kdDA1MjY0MjUyNzMyAl80BAdzaGFyZUlkCAUNJHQwNTI2NDI1MjczMgJfNQMDCQECIT0CBQhib3Jyb3dJZAUDQUlkCQECIT0CBQhib3Jyb3dJZAUDQklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQNJHQwNTI4MTM1Mjg3MgkBEnBhcnNlUmVwbGVuaXNoUG10cwMIBQFpCHBheW1lbnRzBQNBSWQFA0JJZAQEcG10QQgFDSR0MDUyODEzNTI4NzICXzEEBHBtdEIIBQ0kdDA1MjgxMzUyODcyAl8yBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQJbmV3UG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgMJAGYCBQhsZXZlcmFnZQBkBAxib3Jyb3dBbW91bnQJARBjYWxjQm9ycm93QW1vdW50BgUEcG10QQUEcG10QgUDQUlkBQNCSWQFCGxldmVyYWdlBQhib3Jyb3dJZAQHcmVxdWVzdAkAuQkCCQDMCAIFBHVzZXIJAMwIAgUEcG9vbAkAzAgCCQCkAwEFBHBtdEEJAMwIAgUDQUlkCQDMCAIJAKQDAQUEcG10QgkAzAgCBQNCSWQJAMwIAgkApAMBBQRiYWxBCQDMCAIJAKQDAQUEYmFsQgkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIJAKQDAQUMYm9ycm93QW1vdW50CQDMCAIJAKUDAQUNc3Rha2VUb01hcmtldAUDbmlsAgEsBAxuZXdSZXF1ZXN0SWQKAAFACQD8BwQFBHRoaXMCEGNyZWF0ZU5ld1JlcXVlc3QJAMwIAgUHcmVxdWVzdAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFDG5ld1JlcXVlc3RJZAUMbmV3UmVxdWVzdElkBARhcmdzCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIFDGJvcnJvd0Ftb3VudAkAzAgCCQClCAEFBHRoaXMJAMwIAgIRcmVwbGVuaXNoRnJvbUxhbmQJAMwIAgkApAMBCQETdmFsdWVPckVycm9yTWVzc2FnZQIFDG5ld1JlcXVlc3RJZAIYQ2FuJ3QgY3JlYXRlIG5ldyByZXF1ZXN0BQNuaWwEA2ludgkA/QcECQEOZ2V0TGVuZFNydkFkZHIAAg1mbGFzaFBvc2l0aW9uBQRhcmdzBQNuaWwDCQAAAgUDaW52BQNpbnYECnVzZXJTdGFrZWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQUNa1VzZXJQb3NpdGlvbgQNJHQwNTM4OTU1Mzk4OQkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwNTM4OTU1Mzk4OQUNJHQwNTM4OTU1Mzk4OQQHbmV3QmFsQggFDSR0MDUzODk1NTM5ODkCXzIEB25ld0JhbEEIBQ0kdDA1Mzg5NTUzOTg5Al8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDU0MDU5NTQxNzQJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDA1NDA1OTU0MTc0Al8xBAh3QW1vdW50QggFDSR0MDU0MDU5NTQxNzQCXzIJAJQKAgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDU0MjI3NTQzNTcJAQ9yZXBsZW5pc2hCeVR5cGULBQVwVHlwZQUEcG9vbAULTk9fTE9BTl9GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBQ1zdGFrZVRvTWFya2V0AwkAAAIFDSR0MDU0MjI3NTQzNTcFDSR0MDU0MjI3NTQzNTcEB2F4bHlGZWUIBQ0kdDA1NDIyNzU0MzU3Al8yBAp1c2VyU3Rha2VkCAUNJHQwNTQyMjc1NDM1NwJfMQQNJHQwNTQzNjM1NDQ1NwkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwNTQzNjM1NDQ1NwUNJHQwNTQzNjM1NDQ1NwQHbmV3QmFsQggFDSR0MDU0MzYzNTQ0NTcCXzIEB25ld0JhbEEIBQ0kdDA1NDM2MzU0NDU3Al8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDU0NTI3NTQ2NDIJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDA1NDUyNzU0NjQyAl8xBAh3QW1vdW50QggFDSR0MDU0NTI3NTQ2NDICXzIJAJQKAgkAzggCCQEQcmVwbGVuaXNoRW50cmllcwkFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFCW5ld1Bvc051bQUHc2hhcmVJZAUFcFR5cGUHBQ1zdGFrZVRvTWFya2V0CQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAkAzAgCBQhwckltcGFjdAkAzAgCBQh3QW1vdW50QQkAzAgCBQh3QW1vdW50QgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3AgRwb29sBXBvc0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQJAQ53aXRoZHJhd1RvVXNlcgUJAKUIAQgFAWkGY2FsbGVyBQRwb29sCQCkAwEFBXBvc0lkBwIAAWkBEHdpdGhkcmF3T25lVG9rZW4DBHBvb2wFcG9zSWQHdG9rZW5JZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50CQEOd2l0aGRyYXdUb1VzZXIFCQClCAEIBQFpBmNhbGxlcgUEcG9vbAkApAMBBQVwb3NJZAcFB3Rva2VuSWQBaQEUY3JlYXRlVXBkYXRlU3RvcExvc3MEBXBvc0lkBnBvb2xJZAdhc3NldElkBXByaWNlCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEEHRva2VuT3JhY2xlUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQZwb29sSWQCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBnBvb2xJZAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZwb29sSWQCAV8JAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQACAQIaVGhlcmUgYXJlIG5vIHVzZXIgcG9zaXRpb24DCQBnAgAABQVwcmljZQkAAgECHFByaWNlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgUFcHJpY2UFEHRva2VuT3JhY2xlUHJpY2UJAAIBAitQcmljZSBtdXN0IGJlIGxlc3MgdGhhbiBjdXJyZW50IHRva2VuIHByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFBXByaWNlBQNuaWwBaQEOZGVsZXRlU3RvcExvc3MDBXBvc0lkBnBvb2xJZAdhc3NldElkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUGcG9vbElkAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQZwb29sSWQFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MJAAIBAghObyBlbnRyeQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFA25pbAFpAQRpbml0DQxtb25leUJveEFkZHINc2ZGYXJtaW5nQWRkcghsZW5kQWRkcg9wcmljZU9yYWNsZUFkZHIQa2VlcGVyRXhDb250cmFjdA53eFN3YXBDb250cmFjdAtzd29wQXNzZXRJZAl3eEFzc2V0SWQOb3BlcmF0b3JQdWJLZXkSZ3JvdXAxQWRtaW4xUHViS2V5Emdyb3VwMUFkbWluMlB1YktleRJncm91cDJBZG1pbjFQdWJLZXkSZ3JvdXAyQWRtaW4yUHViS2V5CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkDCQEJaXNEZWZpbmVkAQkAoggBBQ9rT3BlcmF0b3JDYWxsUEsJAAIBAg5BbHJlYWR5IGluaXRlZAMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUMbW9uZXlCb3hBZGRyCQACAQIjbW9uZXlCb3hBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFDXNmRmFybWluZ0FkZHIJAAIBAiRzZkZhcm1pbmdBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFCGxlbmRBZGRyCQACAQIfbGVuZEFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUPcHJpY2VPcmFjbGVBZGRyCQACAQImcHJpY2VPcmFjbGVBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFEGtlZXBlckV4Q29udHJhY3QJAAIBAidrZWVwZXJFeENvbnRyYWN0IGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQDsBwEJANkEAQULc3dvcEFzc2V0SWQJAAIBAiNzd29wQXNzZXRJZCBpcyBub3QgY29ycmVjdCBhc3NldCBpZAMJAQEhAQkBCWlzRGVmaW5lZAEJAOwHAQkA2QQBBQl3eEFzc2V0SWQJAAIBAiNzd29wQXNzZXRJZCBpcyBub3QgY29ycmVjdCBhc3NldCBpZAMJAQIhPQIJAMgBAQkA2QQBBQ5vcGVyYXRvclB1YktleQAgCQACAQIdb3BlcmF0b3JQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAxQWRtaW4xUHViS2V5ACAJAAIBAiFncm91cDFBZG1pbjFQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAxQWRtaW4yUHViS2V5ACAJAAIBAiFncm91cDFBZG1pbjJQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAyQWRtaW4xUHViS2V5ACAJAAIBAiFncm91cDJBZG1pbjFQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAyQWRtaW4yUHViS2V5ACAJAAIBAiFncm91cDJBZG1pbjJQdWJLZXkgaXMgbm90IGNvcnJlY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa01vbmV5Qm94BQxtb25leUJveEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUOa1NGRmFybWluZ0FkZHIFDXNmRmFybWluZ0FkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa0xlbmRTZXJ2aWNlBQhsZW5kQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQxrUHJpY2VPcmFjbGUFD3ByaWNlT3JhY2xlQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQtrRXhDb250cmFjdAUQa2VlcGVyRXhDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBQ9rV3hTd2FwQ29udHJhY3QFDnd4U3dhcENvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tTd29wSWQFC3N3b3BBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWtXeElkBQl3eEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa09wZXJhdG9yQ2FsbFBLBQ5vcGVyYXRvclB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAxQWRtaW4xUEsFEmdyb3VwMUFkbWluMVB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAxQWRtaW4yUEsFEmdyb3VwMUFkbWluMlB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAyQWRtaW4xUEsFEmdyb3VwMkFkbWluMVB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAyQWRtaW4yUEsFEmdyb3VwMkFkbWluMlB1YktleQUDbmlsAWkBEGNyZWF0ZU5ld1JlcXVlc3QBBnBhcmFtcwkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpBAxuZXdSZXF1ZXN0SWQJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDGtSZXF1ZXN0SXRlcgAAAAEJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQUMbmV3UmVxdWVzdElkBQprUmVxdWVzdElkBQZwYXJhbXMJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtSZXF1ZXN0SXRlcgUMbmV3UmVxdWVzdElkBQNuaWwFDG5ld1JlcXVlc3RJZAFpARFyZXBsZW5pc2hGcm9tTGFuZAEJcmVxdWVzdElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEDSR0MDU5ODYyNTk5ODEJAQxwYXJzZVJlcXVlc3QBBQlyZXF1ZXN0SWQEBHVzZXIIBQ0kdDA1OTg2MjU5OTgxAl8xBARwb29sCAUNJHQwNTk4NjI1OTk4MQJfMgQEcG10QQgFDSR0MDU5ODYyNTk5ODECXzMEA0FJZAgFDSR0MDU5ODYyNTk5ODECXzQEBHBtdEIIBQ0kdDA1OTg2MjU5OTgxAl81BANCSWQIBQ0kdDA1OTg2MjU5OTgxAl82BARiYWxBCAUNJHQwNTk4NjI1OTk4MQJfNwQEYmFsQggFDSR0MDU5ODYyNTk5ODECXzgEB3NoYXJlSWQIBQ0kdDA1OTg2MjU5OTgxAl85BAdid0Fzc2V0CAUNJHQwNTk4NjI1OTk4MQNfMTAECGJ3QW1vdW50CAUNJHQwNTk4NjI1OTk4MQNfMTEEDXN0YWtlVG9NYXJrZXQIBQ0kdDA1OTg2MjU5OTgxA18xMgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECEldyb25nIHBheW1lbnQgc2l6ZQMDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQdid0Fzc2V0BgkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFCGJ3QW1vdW50CQACAQINV3JvbmcgcGF5bWVudAQNJHQwNjAxNzE2MDI3MQMJAAACBQNBSWQFB2J3QXNzZXQJAJQKAgkAZAIFBHBtdEEFCGJ3QW1vdW50BQRwbXRCCQCUCgIFBHBtdEEJAGQCBQRwbXRCBQhid0Ftb3VudAQHcG10QWxsQQgFDSR0MDYwMTcxNjAyNzECXzEEB3BtdEFsbEIIBQ0kdDA2MDE3MTYwMjcxAl8yBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwNjAzNTM2MDQ4MwkBD3JlcGxlbmlzaEJ5VHlwZQsFBXBUeXBlBQRwb29sBQhMT0FOX0ZFRQUHcG10QWxsQQUDQUlkBQdwbXRBbGxCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFDXN0YWtlVG9NYXJrZXQECnVzZXJTdGFrZWQIBQ0kdDA2MDM1MzYwNDgzAl8xBAdheGx5RmVlCAUNJHQwNjAzNTM2MDQ4MwJfMgQGcG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgQNYm9ycm93RW50cmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAUIYndBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRJrVXNlckJvcnJvd0Fzc2V0SWQFB2J3QXNzZXQFA25pbAQHZW50cmllcwkBEHJlcGxlbmlzaEVudHJpZXMJBQRwb29sBQR1c2VyBQp1c2VyU3Rha2VkBQdheGx5RmVlBQZwb3NOdW0FB3NoYXJlSWQFBXBUeXBlBgUNc3Rha2VUb01hcmtldAQNJHQwNjA4NTg2MDk3MwkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDYwODU4NjA5NzMCXzEECHdBbW91bnRCCAUNJHQwNjA4NTg2MDk3MwJfMgkAlAoCCQDNCAIJAM4IAgkAzggCBQdlbnRyaWVzCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAUNYm9ycm93RW50cmllcwkBC0RlbGV0ZUVudHJ5AQkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFCnVzZXJTdGFrZWQBaQEJbGlxdWlkYXRlAwR1c2VyBXBvc0lkD2xpcXVpZGF0ZUFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpCQEMbGlxdWlkYXRlUG9zBAgFAWkGY2FsbGVyBQR1c2VyBQVwb3NJZAUPbGlxdWlkYXRlQW1vdW50AWkBCHN0b3BMb3NzBAR1c2VyBXBvc0lkBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBA1zdG9wTG9zc1ByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzAghObyBlbnRyeQMJAGYCBRB0b2tlbk9yYWNsZVByaWNlBQ1zdG9wTG9zc1ByaWNlCQACAQIjVG9rZW4gcHJpY2UgZ3JlYXRlciBzdG9wIGxvc3MgcHJpY2UEA3JlcwkBDndpdGhkcmF3VG9Vc2VyBQUEdXNlcgUEcG9vbAkApAMBBQVwb3NJZAYCAAkAlAoCCQDNCAIIBQNyZXMCXzEJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQVwb3NJZAIBXwUEcG9vbAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwgFA3JlcwJfMgFpAQxjYXBpdGFsaXplRXgFBHBvb2wFcm91dGUJdG9rZW5Ub0lkEGFtb3VudFRvRXhjaGFuZ2UFY2xhaW0JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBAZjaGFuZ2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQAABAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEDSR0MDYyMzg5NjI0NTUJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDQUlkCAUNJHQwNjIzODk2MjQ1NQJfMQQDQklkCAUNJHQwNjIzODk2MjQ1NQJfMgQEYmFsQQgFDSR0MDYyMzg5NjI0NTUCXzMEBGJhbEIIBQ0kdDA2MjM4OTYyNDU1Al80BAdzaGFyZUlkCAUNJHQwNjIzODk2MjQ1NQJfNQQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQMaXNNYXJrZXRQb29sCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAUMa1Bvb2xQTUFya2V0BwQNJHQwNjI1ODQ2MzQxNQMJAGYCBRBhbW91bnRUb0V4Y2hhbmdlAAAEDSR0MDYyNjQ2NjI3NDgJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQUQYW1vdW50VG9FeGNoYW5nZQUGY2hhbmdlAwkAAAIFDSR0MDYyNjQ2NjI3NDgFDSR0MDYyNjQ2NjI3NDgEDGNsYWltZWRBc3NldAgFDSR0MDYyNjQ2NjI3NDgCXzIEDWNsYWltZWRBbW91bnQIBQ0kdDA2MjY0NjYyNzQ4Al8xBAVyQXJncwkAtQkCBQVyb3V0ZQICX18ED2V4Y2hhbmdlZEFtb3VudAMJAGYCBRBhbW91bnRUb0V4Y2hhbmdlAAADCQAAAgkAkQMCBQVyQXJncwAAAhBkaXJlY3RTd29wZmlDUE1NCQEQZGlyZWN0U3dvcGZpQ1BNTQIFBXJBcmdzBQl0b2tlblRvSWQDCQAAAgkAkQMCBQVyQXJncwAAAg1yb3V0aW5nU3dvcGZpCQETZGlyZWN0Um91dGluZ1N3b3BmaQIFBXJBcmdzBQl0b2tlblRvSWQJAAIBAgtXcm9uZyByb3V0ZQAAAwkAAAIFD2V4Y2hhbmdlZEFtb3VudAUPZXhjaGFuZ2VkQW1vdW50BAluZXdDaGFuZ2UJAGUCCQBkAgUNY2xhaW1lZEFtb3VudAUGY2hhbmdlBRBhbW91bnRUb0V4Y2hhbmdlBAtjaGFuZ2VFbnRyeQMJAGcCBQluZXdDaGFuZ2UAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQUJbmV3Q2hhbmdlBQNuaWwFA25pbAQNJHQwNjMyNDU2MzM1NQkBCmNhcGl0YWxpemUJBQRwb29sBQVwVHlwZQUJdG9rZW5Ub0lkBQ9leGNoYW5nZWRBbW91bnQFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBAtjYXBFbnRlcmlzZQgFDSR0MDYzMjQ1NjMzNTUCXzEEBnN0YWtlZAgFDSR0MDYzMjQ1NjMzNTUCXzIJAJQKAgkAzggCBQtjYXBFbnRlcmlzZQULY2hhbmdlRW50cnkFBnN0YWtlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQNuaWwAAAQLY2FwRW50ZXJpc2UIBQ0kdDA2MjU4NDYzNDE1Al8xBAZzdGFrZWQIBQ0kdDA2MjU4NDYzNDE1Al8yBA0kdDA2MzQxODYzNTM1AwUMaXNNYXJrZXRQb29sCQEWY2FwaXRhbGl6ZVB1enpsZU1hcmtldAMFBHBvb2wFBXBUeXBlBQdzaGFyZUlkCQCUCgIFA25pbAAABBBtYXJrZXRDYXBFbnRlcmlzCAUNJHQwNjM0MTg2MzUzNQJfMQQMc3Rha2VkTWFya2V0CAUNJHQwNjM0MTg2MzUzNQJfMgkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgkAZAIFEHRvdGFsU2hhcmVBbW91bnQFBnN0YWtlZAUMc3Rha2VkTWFya2V0BQNuaWwFC2NhcEVudGVyaXNlBRBtYXJrZXRDYXBFbnRlcmlzCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAUDbmlsAWkBDmNhcGl0YWxpemVOb0V4AwRwb29sBWNsYWltEWFtb3VudEZyb21CYWxhbmNlCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBA0kdDA2Mzk3MDY0MDM2CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEA0FJZAgFDSR0MDYzOTcwNjQwMzYCXzEEA0JJZAgFDSR0MDYzOTcwNjQwMzYCXzIEBGJhbEEIBQ0kdDA2Mzk3MDY0MDM2Al8zBARiYWxCCAUNJHQwNjM5NzA2NDAzNgJfNAQHc2hhcmVJZAgFDSR0MDYzOTcwNjQwMzYCXzUEDSR0MDY0MDM5NjQxMzcJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQURYW1vdW50RnJvbUJhbGFuY2UAAAMJAAACBQ0kdDA2NDAzOTY0MTM3BQ0kdDA2NDAzOTY0MTM3BAxjbGFpbWVkQXNzZXQIBQ0kdDA2NDAzOTY0MTM3Al8yBA1jbGFpbWVkQW1vdW50CAUNJHQwNjQwMzk2NDEzNwJfMQkBCmNhcGl0YWxpemUJBQRwb29sBQVwVHlwZQkBDGFzc2V0SWRUb1N0cgEFDGNsYWltZWRBc3NldAkAZAIFDWNsYWltZWRBbW91bnQFEWFtb3VudEZyb21CYWxhbmNlBQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtpbml0TmV3UG9vbAsEdHlwZQhwb29sVHlwZQhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JY2FuQm9ycm93CmNhblBNYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDAwkBAiE9AgUEdHlwZQUHU0ZfUE9PTAkBAiE9AgUEdHlwZQUHV1hfUE9PTAcJAAIBAgpXcm9uZyB0eXBlAwMJAQIhPQIFCHBvb2xUeXBlBQRDUE1NCQECIT0CBQhwb29sVHlwZQUERkxBVAcJAAIBAg9Xcm9uZyBwb29sIHR5cGUEDSR0MDY0NzQ0NjQ4MzgJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQhwb29sQWRkcgUEdHlwZQQDYUlkCAUNJHQwNjQ3NDQ2NDgzOAJfMQQDYklkCAUNJHQwNjQ3NDQ2NDgzOAJfMgQEYUJhbAgFDSR0MDY0NzQ0NjQ4MzgCXzMEBGJCYWwIBQ0kdDA2NDc0NDY0ODM4Al80BAdzaGFyZUlkCAUNJHQwNjQ3NDQ2NDgzOAJfNQMJAGYCAAAFC2luRmVlTm9Mb2FuCQACAQIiaW5GZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCWluRmVlTG9hbgkAAgECIGluRmVlTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUMY2FwRmVlTm9Mb2FuCQACAQIjY2FwRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQ5jYXBGZWVXaXRoTG9hbgkAAgECJWNhcEZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRFzdG9wbG9zc0ZlZU5vTG9hbgkAAgECKHN0b3Bsb3NzRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQACAQIqc3RvcGxvc3NGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRVrQXhseUluRmVlV2l0aG91dExvYW4FC2luRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRJrQXhseUluRmVlV2l0aExvYW4FCWluRmVlTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa0F4bHlOb0xvYW5DYXBGZWUFDGNhcEZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa0F4bHlXaXRoTG9hbkNhcEZlZQUOY2FwRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUFEXN0b3Bsb3NzRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRRrQXhseVN0b3BMb3NzTG9hbkZlZQUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa1Bvb2xJbnRlcmVzdExvYW4AAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIcG9vbEFkZHIFCWtQb29sVHlwZQUIcG9vbFR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sBQhwb29sQWRkcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQhwb29sQWRkcgUOa1Bvb2xDYW5Cb3Jyb3cFCWNhbkJvcnJvdwkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQhwb29sQWRkcgUMa1Bvb2xQTUFya2V0BQpjYW5QTWFya2V0BQNuaWwBaQEOdXBkYXRlUG9vbEZlZXMHCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUIcG9vbEFkZHIJAAIBCQCsAgICGkNhbid0IGZpbmQgcG9vbCB3aXRoIGFkZHIgBQhwb29sQWRkcgMJAGYCAAAFC2luRmVlTm9Mb2FuCQACAQIiaW5GZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCWluRmVlTG9hbgkAAgECIGluRmVlTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUMY2FwRmVlTm9Mb2FuCQACAQIjY2FwRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQ5jYXBGZWVXaXRoTG9hbgkAAgECJWNhcEZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRFzdG9wbG9zc0ZlZU5vTG9hbgkAAgECKHN0b3Bsb3NzRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQACAQIqc3RvcGxvc3NGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRVrQXhseUluRmVlV2l0aG91dExvYW4FC2luRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRJrQXhseUluRmVlV2l0aExvYW4FCWluRmVlTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa0F4bHlOb0xvYW5DYXBGZWUFDGNhcEZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa0F4bHlXaXRoTG9hbkNhcEZlZQUOY2FwRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUFEXN0b3Bsb3NzRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRRrQXhseVN0b3BMb3NzTG9hbkZlZQUTc3RvcGxvc3NGZWVXaXRoTG9hbgUDbmlsAWkBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhNkQXBwIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgUDbmlsAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAgECFWRBcHAgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcFA25pbAFpARBhY3RpdmF0ZUZvclVzZXJzAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgkAAgECHWRBcHAgYWxyZWFkeSBhY3RpdmUgZm9yIHVzZXJzCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrQWN0aXZlVXNlcnMGBQNuaWwBaQEQc2h1dGRvd25Gb3JVc2VycwAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgkAAgECH2RBcHAgYWxyZWFkeSBzaHV0ZG93biBmb3IgdXNlcnMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtBY3RpdmVVc2VycwcFA25pbAFpAQphY3RpdmF0ZVNGAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhVTV09QRkkgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGBQNuaWwBaQEKc2h1dGRvd25TRgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhdTV09QRkkgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAcFA25pbAFpAQphY3RpdmF0ZVdYAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhFXWCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYFA25pbAFpAQpzaHV0ZG93bldYAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECE1dYIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gHBQNuaWwBaQEMYWN0aXZhdGVQb29sAQRwb29sCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sCQACAQIMVW5rbm93biBwb29sAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgkAAgECE1Bvb2wgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGBQNuaWwBaQEMc2h1dGRvd25Qb29sAQRwb29sCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sCQACAQIMVW5rbm93biBwb29sAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGCQACAQIVUG9vbCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBwUDbmlsAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUOZ3JvdXAxQWRtaW4xUEsAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQ5ncm91cDFBZG1pbjJQSwABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDmdyb3VwMUFkbWluM1BLAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBRNtdWx0aVNpZ25lZEJ5QWRtaW5z2SdXPA==", "height": 4040165, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2QjZ9zqpdMCqEYxNBnYTXw28K6fwYs9i8geoYsRTdmLs Next: HzYeXTtiupnFZBAHDK7JbTPWbaX4BUDyfJM2wfZmKZ4f Diff:
OldNewDifferences
14251425
14261426
14271427 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1428- let $t04734247604 = if (claim)
1428+ let $t04734248022 = if (claim)
14291429 then claimFarmed(pType, pool)
14301430 else {
14311431 let claimedAsset = if ((pType == SF_POOL))
14321432 then SWOPID
14331433 else if ((pType == WX_POOL))
1434- then WXID
1434+ then {
1435+ let proxyAddrStr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
1436+ let inv = if ((proxyAddrStr != ""))
1437+ then {
1438+ let proxyAddr = addressFromStringValue(proxyAddrStr)
1439+ let proxyBalance = assetBalance(proxyAddr, WXID)
1440+ if ((proxyBalance > 0))
1441+ then invoke(proxyAddr, "wxClaimFinalized", [proxyBalance], nil)
1442+ else unit
1443+ }
1444+ else unit
1445+ if ((inv == inv))
1446+ then WXID
1447+ else throw("Strict value is not equal to itself.")
1448+ }
14351449 else unknownPoolType()
14361450 $Tuple2(amount, claimedAsset)
14371451 }
1438- if (($t04734247604 == $t04734247604))
1452+ if (($t04734248022 == $t04734248022))
14391453 then {
1440- let claimAsset = $t04734247604._2
1441- let claimAmount = $t04734247604._1
1454+ let claimAsset = $t04734248022._2
1455+ let claimAmount = $t04734248022._1
14421456 let bal = accountBalance(claimAsset)
14431457 if ((bal == bal))
14441458 then if ((amount > bal))
14541468 func getPoolInfoREADONLY (pool) = {
14551469 let poolAddr = addressFromStringValue(pool)
14561470 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1457- let $t04797148061 = getPoolData(Address(fromBase58String(pool)), pType)
1458- let AId = $t04797148061._1
1459- let BId = $t04797148061._2
1460- let balA = $t04797148061._3
1461- let balB = $t04797148061._4
1462- let shareId = $t04797148061._5
1471+ let $t04838948479 = getPoolData(Address(fromBase58String(pool)), pType)
1472+ let AId = $t04838948479._1
1473+ let BId = $t04838948479._2
1474+ let balA = $t04838948479._3
1475+ let balB = $t04838948479._4
1476+ let shareId = $t04838948479._5
14631477 let shareSupply = getShareSupply(poolAddr, pType, shareId)
14641478 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
14651479 }
14881502 @Callable(i)
14891503 func getUserPositionREADONLY (user,pools,posNum) = {
14901504 func userPos (a,pool) = {
1491- let $t04905949129 = a
1492- let wAmountsA = $t04905949129._1
1493- let wAmountsB = $t04905949129._2
1494- let debts = $t04905949129._3
1495- let eqWAmountsA = $t04905949129._4
1496- let eqWAmountsB = $t04905949129._5
1497- let index = $t04905949129._6
1505+ let $t04947749547 = a
1506+ let wAmountsA = $t04947749547._1
1507+ let wAmountsB = $t04947749547._2
1508+ let debts = $t04947749547._3
1509+ let eqWAmountsA = $t04947749547._4
1510+ let eqWAmountsB = $t04947749547._5
1511+ let index = $t04947749547._6
14981512 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
14991513 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
15001514 else {
15011515 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1502- let $t04940849498 = getPoolData(Address(fromBase58String(pool)), pType)
1503- let AId = $t04940849498._1
1504- let BId = $t04940849498._2
1505- let balA = $t04940849498._3
1506- let balB = $t04940849498._4
1507- let shareId = $t04940849498._5
1516+ let $t04982649916 = getPoolData(Address(fromBase58String(pool)), pType)
1517+ let AId = $t04982649916._1
1518+ let BId = $t04982649916._2
1519+ let balA = $t04982649916._3
1520+ let balB = $t04982649916._4
1521+ let shareId = $t04982649916._5
15081522 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
15091523 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPositionInPMarket)), false)
15101524 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0), fromMarket)
1511- let $t04984849968 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1512- let wAmountA = $t04984849968._1
1513- let wAmountB = $t04984849968._2
1525+ let $t05026650386 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1526+ let wAmountA = $t05026650386._1
1527+ let wAmountB = $t05026650386._2
15141528 if ((borrowAmount > 0))
15151529 then {
15161530 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
15441558 }
15451559 else unknownPoolType()
15461560 else 0
1547- let $t05088051099 = if ((borrowAsset == AId))
1561+ let $t05129851517 = if ((borrowAsset == AId))
15481562 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
15491563 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1550- let eqWAmountA = $t05088051099._1
1551- let eqWAmountB = $t05088051099._2
1564+ let eqWAmountA = $t05129851517._1
1565+ let eqWAmountB = $t05129851517._2
15521566 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
15531567 }
15541568 else throw("Strict value is not equal to itself.")
15571571 }
15581572 }
15591573
1560- let $t05135451465 = {
1574+ let $t05177251883 = {
15611575 let $l = pools
15621576 let $s = size($l)
15631577 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
15711585
15721586 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
15731587 }
1574- let wAmountsA = $t05135451465._1
1575- let wAmountsB = $t05135451465._2
1576- let debts = $t05135451465._3
1577- let eqWAmountsA = $t05135451465._4
1578- let eqWAmountsB = $t05135451465._5
1588+ let wAmountsA = $t05177251883._1
1589+ let wAmountsB = $t05177251883._2
1590+ let debts = $t05177251883._3
1591+ let eqWAmountsA = $t05177251883._4
1592+ let eqWAmountsB = $t05177251883._5
15791593 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
15801594 }
15811595
15991613 else false)
16001614 then throw("This pool can't stake to puzzle market")
16011615 else {
1602- let $t05222452314 = getPoolData(Address(fromBase58String(pool)), pType)
1603- let AId = $t05222452314._1
1604- let BId = $t05222452314._2
1605- let balA = $t05222452314._3
1606- let balB = $t05222452314._4
1607- let shareId = $t05222452314._5
1616+ let $t05264252732 = getPoolData(Address(fromBase58String(pool)), pType)
1617+ let AId = $t05264252732._1
1618+ let BId = $t05264252732._2
1619+ let balA = $t05264252732._3
1620+ let balB = $t05264252732._4
1621+ let shareId = $t05264252732._5
16081622 if (if ((borrowId != AId))
16091623 then (borrowId != BId)
16101624 else false)
16111625 then throw("Wrong borrow asset")
16121626 else {
1613- let $t05239552454 = parseReplenishPmts(i.payments, AId, BId)
1614- let pmtA = $t05239552454._1
1615- let pmtB = $t05239552454._2
1627+ let $t05281352872 = parseReplenishPmts(i.payments, AId, BId)
1628+ let pmtA = $t05281352872._1
1629+ let pmtB = $t05281352872._2
16161630 let user = toString(i.caller)
16171631 let newPosNum = getNewUserPositionNumber(user)
16181632 if ((leverage > 100))
16321646 if ((inv == inv))
16331647 then {
16341648 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1635- let $t05347753571 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1636- if (($t05347753571 == $t05347753571))
1649+ let $t05389553989 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1650+ if (($t05389553989 == $t05389553989))
16371651 then {
1638- let newBalB = $t05347753571._2
1639- let newBalA = $t05347753571._1
1652+ let newBalB = $t05389553989._2
1653+ let newBalA = $t05389553989._1
16401654 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1641- let $t05364153756 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1642- let wAmountA = $t05364153756._1
1643- let wAmountB = $t05364153756._2
1655+ let $t05405954174 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1656+ let wAmountA = $t05405954174._1
1657+ let wAmountB = $t05405954174._2
16441658 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
16451659 }
16461660 else throw("Strict value is not equal to itself.")
16501664 else throw("Strict value is not equal to itself.")
16511665 }
16521666 else {
1653- let $t05380953939 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1654- if (($t05380953939 == $t05380953939))
1667+ let $t05422754357 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1668+ if (($t05422754357 == $t05422754357))
16551669 then {
1656- let axlyFee = $t05380953939._2
1657- let userStaked = $t05380953939._1
1658- let $t05394554039 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1659- if (($t05394554039 == $t05394554039))
1670+ let axlyFee = $t05422754357._2
1671+ let userStaked = $t05422754357._1
1672+ let $t05436354457 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1673+ if (($t05436354457 == $t05436354457))
16601674 then {
1661- let newBalB = $t05394554039._2
1662- let newBalA = $t05394554039._1
1675+ let newBalB = $t05436354457._2
1676+ let newBalA = $t05436354457._1
16631677 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1664- let $t05410954224 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1665- let wAmountA = $t05410954224._1
1666- let wAmountB = $t05410954224._2
1678+ let $t05452754642 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1679+ let wAmountA = $t05452754642._1
1680+ let wAmountB = $t05452754642._2
16671681 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
16681682 }
16691683 else throw("Strict value is not equal to itself.")
17661780
17671781 @Callable(i)
17681782 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1769- let $t05944459563 = parseRequest(requestId)
1770- let user = $t05944459563._1
1771- let pool = $t05944459563._2
1772- let pmtA = $t05944459563._3
1773- let AId = $t05944459563._4
1774- let pmtB = $t05944459563._5
1775- let BId = $t05944459563._6
1776- let balA = $t05944459563._7
1777- let balB = $t05944459563._8
1778- let shareId = $t05944459563._9
1779- let bwAsset = $t05944459563._10
1780- let bwAmount = $t05944459563._11
1781- let stakeToMarket = $t05944459563._12
1783+ let $t05986259981 = parseRequest(requestId)
1784+ let user = $t05986259981._1
1785+ let pool = $t05986259981._2
1786+ let pmtA = $t05986259981._3
1787+ let AId = $t05986259981._4
1788+ let pmtB = $t05986259981._5
1789+ let BId = $t05986259981._6
1790+ let balA = $t05986259981._7
1791+ let balB = $t05986259981._8
1792+ let shareId = $t05986259981._9
1793+ let bwAsset = $t05986259981._10
1794+ let bwAmount = $t05986259981._11
1795+ let stakeToMarket = $t05986259981._12
17821796 if ((size(i.payments) != 1))
17831797 then throw("Wrong payment size")
17841798 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
17861800 else (i.payments[0].amount != bwAmount))
17871801 then throw("Wrong payment")
17881802 else {
1789- let $t05975359853 = if ((AId == bwAsset))
1803+ let $t06017160271 = if ((AId == bwAsset))
17901804 then $Tuple2((pmtA + bwAmount), pmtB)
17911805 else $Tuple2(pmtA, (pmtB + bwAmount))
1792- let pmtAllA = $t05975359853._1
1793- let pmtAllB = $t05975359853._2
1806+ let pmtAllA = $t06017160271._1
1807+ let pmtAllB = $t06017160271._2
17941808 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1795- let $t05993560065 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1796- let userStaked = $t05993560065._1
1797- let axlyFee = $t05993560065._2
1809+ let $t06035360483 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1810+ let userStaked = $t06035360483._1
1811+ let axlyFee = $t06035360483._2
17981812 let posNum = getNewUserPositionNumber(user)
17991813 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
18001814 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1801- let $t06044060555 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1802- let wAmountA = $t06044060555._1
1803- let wAmountB = $t06044060555._2
1815+ let $t06085860973 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1816+ let wAmountA = $t06085860973._1
1817+ let wAmountB = $t06085860973._2
18041818 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
18051819 }
18061820 }))
18311845 let pType = getStringValue(this, (kPool + pool))
18321846 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
18331847 let poolAddr = Address(fromBase58String(pool))
1834- let $t06197162037 = getPoolData(poolAddr, pType)
1835- let AId = $t06197162037._1
1836- let BId = $t06197162037._2
1837- let balA = $t06197162037._3
1838- let balB = $t06197162037._4
1839- let shareId = $t06197162037._5
1848+ let $t06238962455 = getPoolData(poolAddr, pType)
1849+ let AId = $t06238962455._1
1850+ let BId = $t06238962455._2
1851+ let balA = $t06238962455._3
1852+ let balB = $t06238962455._4
1853+ let shareId = $t06238962455._5
18401854 let totalShareAmount = getPoolTotalShare(pool)
18411855 let isMarketPool = valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false)
1842- let $t06216662997 = if ((amountToExchange > 0))
1856+ let $t06258463415 = if ((amountToExchange > 0))
18431857 then {
1844- let $t06222862330 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1845- if (($t06222862330 == $t06222862330))
1858+ let $t06264662748 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1859+ if (($t06264662748 == $t06264662748))
18461860 then {
1847- let claimedAsset = $t06222862330._2
1848- let claimedAmount = $t06222862330._1
1861+ let claimedAsset = $t06264662748._2
1862+ let claimedAmount = $t06264662748._1
18491863 let rArgs = split(route, "__")
18501864 let exchangedAmount = if ((amountToExchange > 0))
18511865 then if ((rArgs[0] == "directSwopfiCPMM"))
18601874 let changeEntry = if ((newChange >= 0))
18611875 then [IntegerEntry((pool + kPoolCapChange), newChange)]
18621876 else nil
1863- let $t06282762937 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1864- let capEnterise = $t06282762937._1
1865- let staked = $t06282762937._2
1877+ let $t06324563355 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1878+ let capEnterise = $t06324563355._1
1879+ let staked = $t06324563355._2
18661880 $Tuple2((capEnterise ++ changeEntry), staked)
18671881 }
18681882 else throw("Strict value is not equal to itself.")
18701884 else throw("Strict value is not equal to itself.")
18711885 }
18721886 else $Tuple2(nil, 0)
1873- let capEnterise = $t06216662997._1
1874- let staked = $t06216662997._2
1875- let $t06300063117 = if (isMarketPool)
1887+ let capEnterise = $t06258463415._1
1888+ let staked = $t06258463415._2
1889+ let $t06341863535 = if (isMarketPool)
18761890 then capitalizePuzzleMarket(pool, pType, shareId)
18771891 else $Tuple2(nil, 0)
1878- let marketCapEnteris = $t06300063117._1
1879- let stakedMarket = $t06300063117._2
1892+ let marketCapEnteris = $t06341863535._1
1893+ let stakedMarket = $t06341863535._2
18801894 ((([IntegerEntry((pool + kPoolTotal), ((totalShareAmount + staked) + stakedMarket))] ++ capEnterise) ++ marketCapEnteris) ++ getCursEntries(AId, BId, shareId, nil))
18811895 }))
18821896
18861900 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
18871901 let pType = getStringValue(this, (kPool + pool))
18881902 let poolAddr = Address(fromBase58String(pool))
1889- let $t06355263618 = getPoolData(poolAddr, pType)
1890- let AId = $t06355263618._1
1891- let BId = $t06355263618._2
1892- let balA = $t06355263618._3
1893- let balB = $t06355263618._4
1894- let shareId = $t06355263618._5
1895- let $t06362163719 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1896- if (($t06362163719 == $t06362163719))
1903+ let $t06397064036 = getPoolData(poolAddr, pType)
1904+ let AId = $t06397064036._1
1905+ let BId = $t06397064036._2
1906+ let balA = $t06397064036._3
1907+ let balB = $t06397064036._4
1908+ let shareId = $t06397064036._5
1909+ let $t06403964137 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1910+ if (($t06403964137 == $t06403964137))
18971911 then {
1898- let claimedAsset = $t06362163719._2
1899- let claimedAmount = $t06362163719._1
1912+ let claimedAsset = $t06403964137._2
1913+ let claimedAmount = $t06403964137._1
19001914 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance), AId, BId, balA, balB, shareId)
19011915 }
19021916 else throw("Strict value is not equal to itself.")
19141928 else false)
19151929 then throw("Wrong pool type")
19161930 else {
1917- let $t06432664420 = getPoolData(Address(fromBase58String(poolAddr)), type)
1918- let aId = $t06432664420._1
1919- let bId = $t06432664420._2
1920- let aBal = $t06432664420._3
1921- let bBal = $t06432664420._4
1922- let shareId = $t06432664420._5
1931+ let $t06474464838 = getPoolData(Address(fromBase58String(poolAddr)), type)
1932+ let aId = $t06474464838._1
1933+ let bId = $t06474464838._2
1934+ let aBal = $t06474464838._3
1935+ let bBal = $t06474464838._4
1936+ let shareId = $t06474464838._5
19231937 if ((0 > inFeeNoLoan))
19241938 then throw("inFeeNoLoan must be greater than 0")
19251939 else if ((0 > inFeeLoan))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let CONF = addressFromStringValue(getStringValue(this, "config"))
55
66 let SF_POOL = "SF"
77
88 let WX_POOL = "WX"
99
1010 let CPMM = "cpmm"
1111
1212 let FLAT = "flat"
1313
1414 let CAP_FEE_NO_LOAN = "capNoLoan"
1515
1616 let CAP_FEE_LOAN = "capLoan"
1717
1818 let STOPLOSS_FEE_NO_LOAN = "stopLossNoLoan"
1919
2020 let STOPLOSS_LOAN = "stopLossLoan"
2121
2222 let LOAN_FEE = "loan"
2323
2424 let NO_LOAN_FEE = "noLoan"
2525
2626 let NO_FEE = "noFee"
2727
2828 let SCALE8 = 100000000
2929
3030 let SCALE10 = 10000000000
3131
3232 let SCALE16 = toBigInt(10000000000000000)
3333
3434 let FEE_SCALE6 = 1000000
3535
3636 let kSFPoolAAssetBalance = "A_asset_balance"
3737
3838 let kSFPoolBAssetBalance = "B_asset_balance"
3939
4040 let kSFPoolAAssetId = "A_asset_id"
4141
4242 let kSFPoolBAssetId = "B_asset_id"
4343
4444 let kSFPoolShareId = "share_asset_id"
4545
4646 let kSFPoolShareSupply = "share_asset_supply"
4747
4848 let kSFPoolFee = "commission"
4949
5050 let kUserPosition = "_userPosition"
5151
5252 let kUserPositionPool = "_userPositionPool"
5353
5454 let kUserBorrowAmount = "_userPositionBorrowAmount"
5555
5656 let kUserBorrowAssetId = "_userPositionBorrowAssetId"
5757
5858 let kUserPositionNum = "_userPositionNumber"
5959
6060 let kUserPositionInterest = "_userPositionInterest"
6161
6262 let kUserPositionInPMarket = "_userPositionPMarket"
6363
6464 let kPoolTotal = "_poolTotal"
6565
6666 let kPoolTotalLoan = "_poolTotalLoan"
6767
6868 let kPoolTotalMarket = "_poolTotalMarket"
6969
7070 let kPoolTotalMarketLoan = "_poolTotalMarketLoan"
7171
7272 let kPoolInterestLoan = "_poolInterestLoan"
7373
7474 let kPoolInterestNoLoan = "_poolInterestNoLoan"
7575
7676 let kPoolInterestMarketLoan = "_poolInterestMarketLoan"
7777
7878 let kPoolInterestMarketNoLoan = "_poolInterestMarketNoLoan"
7979
8080 let kPoolCanBorrow = "_poolCanBorrow"
8181
8282 let kPoolPMArket = "_poolPuzzleMarket"
8383
8484 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
8585
8686 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
8787
8888 let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
8989
9090 let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
9191
9292 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
9393
9494 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
9595
9696 let kRequestId = "_request_id"
9797
9898 let kRequestIter = "requests_iter"
9999
100100 let kPool = "pool_"
101101
102102 let kPoolType = "_poolType"
103103
104104 let kSharePool = "_poolShareId"
105105
106106 let kPoolCapChange = "_poolCapChange"
107107
108108 let kTokenLastPrice = "last_price"
109109
110110 let kPriceInOracle = "_twap5B"
111111
112112 let kActive = "active"
113113
114114 let kActiveUsers = "activeUsers"
115115
116116 let kActiveSFWX = "_active"
117117
118118 let kPoolActive = "_activePool"
119119
120120 let kUserStopLoss = "_stopLoss"
121121
122122 let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
123123
124124 let kPoolProxyAddr = "_poolProxyAddress"
125125
126126 let kMoneyBox = "axly_money_box"
127127
128128 let kSFFarmingAddr = "swopfi_farming_addr"
129129
130130 let kLendService = "lend_service_addr"
131131
132132 let kOperatorCallPK = "admin_call_pub_key"
133133
134134 let kPriceOracle = "price_oracle"
135135
136136 let kExContract = "exchange_contract"
137137
138138 let kWxSwapContract = "wx_swap_contract"
139139
140140 let kWxRest = "wx_rest_addr"
141141
142142 let kSwopId = "swop_id"
143143
144144 let kWxId = "wx_id"
145145
146146 let kPMarketAddr = "puzzle_market_address"
147147
148148 let kPMarketRestAddr = "puzzle_market_rest_address"
149149
150150 let kGroup1Admin1PK = "group1_admin1_pub_key"
151151
152152 let kGroup1Admin2PK = "group1_admin2_pub_key"
153153
154154 let kGroup1Admin3PK = "group1_admin3_pub_key"
155155
156156 let kGroup2Admin1PK = "group2_admin1_pub_key"
157157
158158 let kGroup2Admin2PK = "group2_admin2_pub_key"
159159
160160 let moneyBox = addressFromStringValue(valueOrErrorMessage(getString(CONF, kMoneyBox), "No axly moneyBox address"))
161161
162162 let exContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kExContract), "No exchange contract address"))
163163
164164 let priceOracleAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPriceOracle), "No price oracle address"))
165165
166166 let wxSwapContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxSwapContract), "No wx swap address"))
167167
168168 let wxRest = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxRest), "No wx rest address"))
169169
170170 let SWOPID = fromBase58String(valueOrErrorMessage(getString(CONF, kSwopId), "No swop id"))
171171
172172 let WXID = fromBase58String(valueOrErrorMessage(getString(CONF, kWxId), "No wx id"))
173173
174174 let pMarketAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketAddr), "No puzzle market address"))
175175
176176 let pMarketRestAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketRestAddr), "No puzzle market rest address"))
177177
178178 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
179179
180180 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
181181
182182 let group1Admin3PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin3PK), "Can't get kGroup1Admin3PK"))
183183
184184 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
185185
186186 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
187187
188188 let operatorPK = fromBase58String(valueOrErrorMessage(getString(CONF, kOperatorCallPK), "Can't get operatorPK"))
189189
190190 func unknownPoolType () = throw("Wrong pool type")
191191
192192
193193 func getLendSrvAddr () = addressFromStringValue(valueOrErrorMessage(getString(CONF, kLendService), "Can't get lend service addr"))
194194
195195
196196 func isOperatorCall (i) = if (if ((i.callerPublicKey == operatorPK))
197197 then true
198198 else (i.caller == moneyBox))
199199 then unit
200200 else throw("Only operator can call this function")
201201
202202
203203 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
204204 then true
205205 else (i.callerPublicKey == group1Admin2PK))
206206 then unit
207207 else throw("Only admin group1 can call this function")
208208
209209
210210 func isSelfCall (i) = if ((i.caller == this))
211211 then unit
212212 else throw("Only contract itself can call this function")
213213
214214
215215 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
216216 then unit
217217 else throw("Only land contract can call this function")
218218
219219
220220 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
221221 then unit
222222 else throw("DApp is inactive at this moment")
223223
224224
225225 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
226226 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
227227 else false)
228228 then unit
229229 else throw("DApp is inactive for users at this moment")
230230
231231
232232 func isPoolActive (pool,type) = {
233233 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
234234 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
235235 if (if (WXSFActive)
236236 then poolActive
237237 else false)
238238 then true
239239 else false
240240 }
241241
242242
243243 func accountBalance (assetId) = match assetId {
244244 case id: ByteVector =>
245245 assetBalance(this, id)
246246 case waves: Unit =>
247247 wavesBalance(this).available
248248 case _ =>
249249 throw("Match error")
250250 }
251251
252252
253253 func getSFPoolBalances (poolAddr) = $Tuple2(valueOrErrorMessage(getInteger(poolAddr, kSFPoolAAssetBalance), "Can't get pool A asset balance"), valueOrErrorMessage(getInteger(poolAddr, kSFPoolBAssetBalance), "Can't get pool B asset balance"))
254254
255255
256256 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
257257 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
258258 if ($isInstanceOf(@, "Int"))
259259 then @
260260 else throw(($getType(@) + " couldn't be cast to Int"))
261261 }, {
262262 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
263263 if ($isInstanceOf(@, "Int"))
264264 then @
265265 else throw(($getType(@) + " couldn't be cast to Int"))
266266 })
267267
268268
269269 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
270270 then getSFPoolBalances(poolAddr)
271271 else if ((type == WX_POOL))
272272 then getWXPoolBalances(poolAddr, aId, bId)
273273 else unknownPoolType()
274274
275275
276276 func getSFPoolData (poolAddr) = {
277277 let $t096559704 = getSFPoolBalances(poolAddr)
278278 if (($t096559704 == $t096559704))
279279 then {
280280 let balB = $t096559704._2
281281 let balA = $t096559704._1
282282 $Tuple5(valueOrErrorMessage(getString(poolAddr, kSFPoolAAssetId), "Can't get pool A asset id"), valueOrErrorMessage(getString(poolAddr, kSFPoolBAssetId), "Can't get pool B asset id"), balA, balB, valueOrErrorMessage(getString(poolAddr, kSFPoolShareId), "Can't get share asset id"))
283283 }
284284 else throw("Strict value is not equal to itself.")
285285 }
286286
287287
288288 func getWXPoolData (poolAddr) = {
289289 let cfg = {
290290 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
291291 if ($isInstanceOf(@, "List[Any]"))
292292 then @
293293 else throw(($getType(@) + " couldn't be cast to List[Any]"))
294294 }
295295 if ((cfg == cfg))
296296 then {
297297 let aId = valueOrErrorMessage({
298298 let @ = cfg[4]
299299 if ($isInstanceOf(@, "String"))
300300 then @
301301 else unit
302302 }, "Can't get pool A asset id")
303303 let bId = valueOrErrorMessage({
304304 let @ = cfg[5]
305305 if ($isInstanceOf(@, "String"))
306306 then @
307307 else unit
308308 }, "Can't get pool B asset id")
309309 let shareId = valueOrErrorMessage({
310310 let @ = cfg[3]
311311 if ($isInstanceOf(@, "String"))
312312 then @
313313 else unit
314314 }, "Can't get pool LP asset id")
315315 let $t01040110460 = getWXPoolBalances(poolAddr, aId, bId)
316316 if (($t01040110460 == $t01040110460))
317317 then {
318318 let balB = $t01040110460._2
319319 let balA = $t01040110460._1
320320 $Tuple5(aId, bId, balA, balB, shareId)
321321 }
322322 else throw("Strict value is not equal to itself.")
323323 }
324324 else throw("Strict value is not equal to itself.")
325325 }
326326
327327
328328 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
329329 then getSFPoolData(poolAddr)
330330 else if ((type == WX_POOL))
331331 then getWXPoolData(poolAddr)
332332 else unknownPoolType()
333333
334334
335335 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
336336 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
337337 else if ((type == WX_POOL))
338338 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
339339 else unknownPoolType()
340340
341341
342342 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
343343
344344
345345 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
346346
347347
348348 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
349349
350350
351351 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
352352 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
353353 else if ((feeType == CAP_FEE_NO_LOAN))
354354 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
355355 else if ((feeType == LOAN_FEE))
356356 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
357357 else if ((feeType == NO_LOAN_FEE))
358358 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
359359 else if ((feeType == NO_FEE))
360360 then 0
361361 else throw("Wrong fee type")
362362
363363
364364 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(CONF, kSFFarmingAddr), "Can't get swopfi farming addr")))
365365
366366
367367 func getWXFarmingAddr (poolAddr) = {
368368 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
369369 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
370370 Address(fromBase58String(factroyCfg[1]))
371371 }
372372
373373
374374 func assetIdToStr (assetId) = match assetId {
375375 case id: ByteVector =>
376376 toBase58String(id)
377377 case waves: Unit =>
378378 "WAVES"
379379 case _ =>
380380 throw("Not Asset id")
381381 }
382382
383383
384384 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
385385 then unit
386386 else fromBase58String(assetId)
387387
388388
389389 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
390390 then 8
391391 else match assetInfo(fromBase58String(assetId)) {
392392 case asset: Asset =>
393393 asset.decimals
394394 case _ =>
395395 throw("Can't find asset")
396396 }
397397
398398
399399 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
400400
401401
402402 func getAssetsPrice (assetIds) = {
403403 func getPrices (a,assetId) = {
404404 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
405405 (a :+ assetPrice)
406406 }
407407
408408 let $l = assetIds
409409 let $s = size($l)
410410 let $acc0 = nil
411411 func $f0_1 ($a,$i) = if (($i >= $s))
412412 then $a
413413 else getPrices($a, $l[$i])
414414
415415 func $f0_2 ($a,$i) = if (($i >= $s))
416416 then $a
417417 else throw("List size exceeds 50")
418418
419419 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
420420 }
421421
422422
423423 func getSharePrice (shareId) = {
424424 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
425425 let poolAddr = Address(fromBase58String(pool))
426426 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
427427 let $t01344913514 = getPoolData(poolAddr, pType)
428428 let aId = $t01344913514._1
429429 let bId = $t01344913514._2
430430 let aBalance = $t01344913514._3
431431 let bBalance = $t01344913514._4
432432 let prices = getAssetsPrice([aId, bId])
433433 let dPriceA = prices[0]
434434 let dPriceB = prices[1]
435435 if (if ((0 > dPriceA))
436436 then true
437437 else (0 > dPriceB))
438438 then -1
439439 else {
440440 let shareSupply = getShareSupply(poolAddr, pType, shareId)
441441 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
442442 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
443443 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
444444 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
445445 fraction(sum, sharePrecision, shareSupply)
446446 }
447447 }
448448
449449
450450 func getSharePrices (shareIds) = {
451451 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
452452
453453 let $l = shareIds
454454 let $s = size($l)
455455 let $acc0 = nil
456456 func $f0_1 ($a,$i) = if (($i >= $s))
457457 then $a
458458 else getPrices($a, $l[$i])
459459
460460 func $f0_2 ($a,$i) = if (($i >= $s))
461461 then $a
462462 else throw("List size exceeds 20")
463463
464464 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
465465 }
466466
467467
468468 func getCursEntries (aId,bId,shareId,wAmounts) = {
469469 let assetsPrices = getAssetsPrice([aId, bId])
470470 let sharePrice = getSharePrice(shareId)
471471 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
472472 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
473473 }
474474
475475
476476 func calcReplenishByTwoTokens (pType,poolAddr,LPId,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
477477 then {
478478 let repl = {
479479 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
480480 if ($isInstanceOf(@, "List[Any]"))
481481 then @
482482 else throw(($getType(@) + " couldn't be cast to List[Any]"))
483483 }
484484 if ((repl == repl))
485485 then $Tuple5({
486486 let @ = repl[3]
487487 if ($isInstanceOf(@, "Int"))
488488 then @
489489 else throw(($getType(@) + " couldn't be cast to Int"))
490490 }, {
491491 let @ = repl[4]
492492 if ($isInstanceOf(@, "Int"))
493493 then @
494494 else throw(($getType(@) + " couldn't be cast to Int"))
495495 }, {
496496 let @ = repl[1]
497497 if ($isInstanceOf(@, "Int"))
498498 then @
499499 else throw(($getType(@) + " couldn't be cast to Int"))
500500 }, assetIdToStr(repl[2]), {
501501 let @ = repl[0]
502502 if ($isInstanceOf(@, "Int"))
503503 then @
504504 else throw(($getType(@) + " couldn't be cast to Int"))
505505 })
506506 else throw("Strict value is not equal to itself.")
507507 }
508508 else if ((pType == WX_POOL))
509509 then {
510510 let $t01507215338 = $Tuple2(split({
511511 let @ = invoke(wxRest, "poolEvaluatePutByAmountAssetREADONLY", [LPId, pmtA], nil)
512512 if ($isInstanceOf(@, "String"))
513513 then @
514514 else throw(($getType(@) + " couldn't be cast to String"))
515515 }, "__"), split({
516516 let @ = invoke(wxRest, "poolEvaluatePutByPriceAssetREADONLY", [LPId, pmtB], nil)
517517 if ($isInstanceOf(@, "String"))
518518 then @
519519 else throw(($getType(@) + " couldn't be cast to String"))
520520 }, "__"))
521521 if (($t01507215338 == $t01507215338))
522522 then {
523523 let evalPutInB = $t01507215338._2
524524 let evalPutInA = $t01507215338._1
525525 let lpInA = parseIntValue(evalPutInA[1])
526526 let lpInB = parseIntValue(evalPutInB[1])
527527 if ((lpInB > lpInA))
528528 then {
529529 let pmt = parseIntValue(evalPutInA[8])
530530 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
531531 }
532532 else {
533533 let pmt = parseIntValue(evalPutInB[7])
534534 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
535535 }
536536 }
537537 else throw("Strict value is not equal to itself.")
538538 }
539539 else unknownPoolType()
540540
541541
542542 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId,lpId) = {
543543 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
544544 let proxyAddr = valueOrElse(getString(this, (toString(poolAddr) + kPoolProxyAddr)), "")
545545 if ((pType == SF_POOL))
546546 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
547547 else if ((pType == WX_POOL))
548548 then if ((proxyAddr == ""))
549549 then invoke(poolAddr, "put", [1000000, false], payments)
550550 else invoke(addressFromStringValue(proxyAddr), "wxReplenishTwoTokens", [toString(poolAddr), lpId, 1000000, false], payments)
551551 else unknownPoolType()
552552 }
553553
554554
555555 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId,lpId) = {
556556 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
557557 let proxyAddr = valueOrElse(getString(this, (toString(poolAddr) + kPoolProxyAddr)), "")
558558 if ((pType == SF_POOL))
559559 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
560560 else if ((pType == WX_POOL))
561561 then {
562562 let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
563563 then "putOneTknV2"
564564 else "putOneTkn"
565565 if ((proxyAddr == ""))
566566 then invoke(poolAddr, fc, [0, false], payments)
567567 else invoke(addressFromStringValue(proxyAddr), "wxReplenishOneToken", [toString(poolAddr), lpId, fc, 0, false], payments)
568568 }
569569 else unknownPoolType()
570570 }
571571
572572
573573 func stakeLP (pool,pType,shareId,amount,stakeToMarket) = {
574574 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
575575 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
576576 if (stakeToMarket)
577577 then invoke(pMarketAddr, "supply", nil, payments)
578578 else if ((pType == SF_POOL))
579579 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
580580 else if ((pType == WX_POOL))
581581 then {
582582 let farmAddr = getWXFarmingAddr(addressFromStringValue(pool))
583583 if ((proxyAddr == ""))
584584 then invoke(farmAddr, "stake", nil, payments)
585585 else invoke(addressFromStringValue(proxyAddr), "wxStakeLp", [toString(farmAddr)], payments)
586586 }
587587 else unknownPoolType()
588588 }
589589
590590
591591 func unstakeLP (pool,pType,shareId,amount,fromMarket) = {
592592 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
593593 let $t01807518757 = if (fromMarket)
594594 then $Tuple3(pMarketAddr, "withdraw", [shareId, amount])
595595 else if ((pType == SF_POOL))
596596 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
597597 else if ((pType == WX_POOL))
598598 then {
599599 let farmAddr = getWXFarmingAddr(Address(fromBase58String(pool)))
600600 if ((proxyAddr == ""))
601601 then $Tuple3(farmAddr, "unstake", [shareId, amount])
602602 else $Tuple3(addressFromStringValue(proxyAddr), "wxUnstakeLp", [toString(farmAddr), shareId, amount])
603603 }
604604 else unknownPoolType()
605605 let farmAddr = $t01807518757._1
606606 let fName = $t01807518757._2
607607 let params = $t01807518757._3
608608 let inv = invoke(farmAddr, fName, params, nil)
609609 if ((inv == inv))
610610 then amount
611611 else throw("Strict value is not equal to itself.")
612612 }
613613
614614
615615 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
616616 let poolAddr = Address(fromBase58String(pool))
617617 let feeScale6 = 1000000
618618 let fee = getIntegerValue(poolAddr, kSFPoolFee)
619619 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
620620 let $t01917919485 = if ((assetTokenToGet == assetIdA))
621621 then {
622622 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
623623 $Tuple2(amountToPay, assetIdB)
624624 }
625625 else {
626626 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
627627 $Tuple2(amountToPay, assetIdA)
628628 }
629629 let amountToPay = $t01917919485._1
630630 let assetToPay = $t01917919485._2
631631 $Tuple2(assetToPay, amountToPay)
632632 }
633633
634634
635635 func getWXSwapFees (pool) = {
636636 let poolAddr = addressFromStringValue(pool)
637637 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
638638 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
639639 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
640640 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
641641 case fees: (Int, Int) =>
642642 $Tuple2(fees._1, fees._2)
643643 case _ =>
644644 $Tuple2(poolFeeDefault, protocolFeeDefault)
645645 }
646646 }
647647
648648
649649 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
650650 let $t02022520264 = getWXSwapFees(pool)
651651 let pFee = $t02022520264._1
652652 let prFee = $t02022520264._2
653653 let feeScale = toBigInt(100000000)
654654 let $t02030420612 = if ((assetTokenToGet == assetIdA))
655655 then {
656656 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
657657 $Tuple2(amountToPay, assetIdB)
658658 }
659659 else {
660660 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
661661 $Tuple2(amountToPay, assetIdA)
662662 }
663663 let amountToPay = $t02030420612._1
664664 let assetToPay = $t02030420612._2
665665 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
666666 $Tuple2(assetToPay, amountToPayWithFee)
667667 }
668668
669669
670670 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
671671 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
672672 if (if ((pType == SF_POOL))
673673 then true
674674 else (poolFB != ""))
675675 then {
676676 let $t02105321265 = if ((poolFB == ""))
677677 then $Tuple3(balA, balB, pool)
678678 else {
679679 let $t02115921232 = getSFPoolBalances(addressFromStringValue(poolFB))
680680 let sfBalA = $t02115921232._1
681681 let sfBalB = $t02115921232._2
682682 $Tuple3(sfBalA, sfBalB, poolFB)
683683 }
684684 let pBalA = $t02105321265._1
685685 let pBalB = $t02105321265._2
686686 let exPool = $t02105321265._3
687687 let $t02127021396 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
688688 let assetToPay = $t02127021396._1
689689 let amountToPay = $t02127021396._2
690690 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
691691 }
692692 else if ((pType == WX_POOL))
693693 then {
694694 let $t02159821720 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
695695 let assetToPay = $t02159821720._1
696696 let amountToPay = $t02159821720._2
697697 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
698698 }
699699 else unknownPoolType()
700700 }
701701
702702
703703 func exchangeDirectlyNoLim (pType,pool,amountTokenEx,assetTokenToEx,assetTokenToGet) = {
704704 let balBefore = accountBalance(assetIdFromStr(assetTokenToGet))
705705 if ((balBefore == balBefore))
706706 then {
707707 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
708708 let inv = if (if ((pType == SF_POOL))
709709 then true
710710 else (poolFB != ""))
711711 then {
712712 let exPool = if ((poolFB == ""))
713713 then pool
714714 else poolFB
715715 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", ["1"]], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
716716 }
717717 else if ((pType == WX_POOL))
718718 then invoke(wxSwapContract, "swap", [1, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
719719 else unknownPoolType()
720720 if ((inv == inv))
721721 then {
722722 let balAfter = accountBalance(assetIdFromStr(assetTokenToGet))
723723 if ((balAfter == balAfter))
724724 then (balAfter - balBefore)
725725 else throw("Strict value is not equal to itself.")
726726 }
727727 else throw("Strict value is not equal to itself.")
728728 }
729729 else throw("Strict value is not equal to itself.")
730730 }
731731
732732
733733 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
734734 let $t02284923320 = if ((pType == SF_POOL))
735735 then {
736736 let inv = {
737737 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
738738 if ($isInstanceOf(@, "List[Any]"))
739739 then @
740740 else throw(($getType(@) + " couldn't be cast to List[Any]"))
741741 }
742742 if ((inv == inv))
743743 then $Tuple2({
744744 let @ = inv[0]
745745 if ($isInstanceOf(@, "Int"))
746746 then @
747747 else throw(($getType(@) + " couldn't be cast to Int"))
748748 }, {
749749 let @ = inv[1]
750750 if ($isInstanceOf(@, "Int"))
751751 then @
752752 else throw(($getType(@) + " couldn't be cast to Int"))
753753 })
754754 else throw("Strict value is not equal to itself.")
755755 }
756756 else if ((pType == WX_POOL))
757757 then {
758758 let inv = split({
759759 let @ = invoke(wxRest, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
760760 if ($isInstanceOf(@, "String"))
761761 then @
762762 else throw(($getType(@) + " couldn't be cast to String"))
763763 }, "__")
764764 if ((inv == inv))
765765 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
766766 else throw("Strict value is not equal to itself.")
767767 }
768768 else unknownPoolType()
769769 let amountA = $t02284923320._1
770770 let amountB = $t02284923320._2
771771 $Tuple2(amountA, amountB)
772772 }
773773
774774
775775 func claimFarmed (pType,pool) = {
776776 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
777777 if ((pType == SF_POOL))
778778 then {
779779 let balBefore = accountBalance(SWOPID)
780780 if ((balBefore == balBefore))
781781 then {
782782 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
783783 if ((inv == inv))
784784 then {
785785 let balAfter = accountBalance(SWOPID)
786786 $Tuple2((balAfter - balBefore), SWOPID)
787787 }
788788 else throw("Strict value is not equal to itself.")
789789 }
790790 else throw("Strict value is not equal to itself.")
791791 }
792792 else if ((pType == WX_POOL))
793793 then {
794794 let $t02376023839 = getWXPoolData(addressFromStringValue(pool))
795795 let aId = $t02376023839._1
796796 let bId = $t02376023839._2
797797 let aBal = $t02376023839._3
798798 let bBal = $t02376023839._4
799799 let lpId = $t02376023839._5
800800 let balBefore = accountBalance(WXID)
801801 if ((balBefore == balBefore))
802802 then {
803803 let farmAddr = getWXFarmingAddr(addressFromStringValue(pool))
804804 let inv = if ((proxyAddr == ""))
805805 then invoke(farmAddr, "claimWx", [lpId], nil)
806806 else invoke(addressFromStringValue(proxyAddr), "wxClaimFarmed", [toString(farmAddr), lpId], nil)
807807 if ((inv == inv))
808808 then {
809809 let balAfter = accountBalance(WXID)
810810 $Tuple2((balAfter - balBefore), WXID)
811811 }
812812 else throw("Strict value is not equal to itself.")
813813 }
814814 else throw("Strict value is not equal to itself.")
815815 }
816816 else unknownPoolType()
817817 }
818818
819819
820820 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId,stakeMarket) = {
821821 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
822822 if ((lpBalanceBefore == lpBalanceBefore))
823823 then {
824824 let poolAddr = addressFromStringValue(pool)
825825 let $t02464425072 = if (if ((pmtA > 0))
826826 then (pmtB > 0)
827827 else false)
828828 then {
829829 let $t02471024832 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
830830 let pmtInA = $t02471024832._1
831831 let pmtInB = $t02471024832._2
832832 let change = $t02471024832._3
833833 let changeId = $t02471024832._4
834834 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId, LPId)
835835 if ((inv == inv))
836836 then $Tuple2(change, changeId)
837837 else throw("Strict value is not equal to itself.")
838838 }
839839 else if ((pmtA > 0))
840840 then $Tuple2(pmtA, aId)
841841 else if ((pmtB > 0))
842842 then $Tuple2(pmtB, bId)
843843 else throw("pmts must be > 0")
844844 let change = $t02464425072._1
845845 let changeId = $t02464425072._2
846846 let inv = if ((change > 0))
847847 then replenishOneTokenByType(poolAddr, pType, change, changeId, LPId)
848848 else nil
849849 if ((inv == inv))
850850 then {
851851 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
852852 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
853853 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
854854 let userShareForStake = (totalStaked - axlyFeeAmount)
855855 if ((0 >= userShareForStake))
856856 then throw("amount of staked sharetokens must be > 0")
857857 else {
858858 let invLP = stakeLP(pool, pType, LPId, userShareForStake, stakeMarket)
859859 if ((invLP == invLP))
860860 then $Tuple2(userShareForStake, axlyFeeAmount)
861861 else throw("Strict value is not equal to itself.")
862862 }
863863 }
864864 else throw("Strict value is not equal to itself.")
865865 }
866866 else throw("Strict value is not equal to itself.")
867867 }
868868
869869
870870 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan,stakeToMarket) = {
871871 let totalAmount = getPoolTotalShare(pool)
872872 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
873873 let totalAmountMarket = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
874874 let totalAmountMarketLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
875875 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
876876 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
877877 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
878878 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
879879 let $t02653327358 = if (withLoan)
880880 then if (stakeToMarket)
881881 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
882882 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
883883 else if (stakeToMarket)
884884 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
885885 else $Tuple2(poolInterestNoLoan, nil)
886886 let curPoolInterest = $t02653327358._1
887887 let adEntry = $t02653327358._2
888888 ([IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPosition), stakedAmount), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInterest), curPoolInterest), StringEntry((((user + "_") + toString(posNum)) + kUserPositionPool), pool), IntegerEntry((user + kUserPositionNum), posNum), ScriptTransfer(moneyBox, axlyFeeAmount, fromBase58String(shareId))] ++ adEntry)
889889 }
890890
891891
892892 func listToInt (a,item) = (a :+ parseIntValue(item))
893893
894894
895895 func directSwopfiCPMM (rArgs,tokenTo) = {
896896 let dApp = addressFromStringValue(rArgs[1])
897897 let pmtP = split(rArgs[2], "|")
898898 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
899899 if ((tokenBalanceBefore == tokenBalanceBefore))
900900 then {
901901 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
902902 let minToRecive = rArgs[3]
903903 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
904904 if ((inv == inv))
905905 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
906906 else throw("Strict value is not equal to itself.")
907907 }
908908 else throw("Strict value is not equal to itself.")
909909 }
910910
911911
912912 func directRoutingSwopfi (rArgs,tokenTo) = {
913913 let dApp = addressFromStringValue(rArgs[1])
914914 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
915915 if ((tokenBalanceBefore == tokenBalanceBefore))
916916 then {
917917 let pmt = {
918918 let pmtP = split(rArgs[2], "|")
919919 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
920920 }
921921 let args = {
922922 let eArgs = split(rArgs[3], "|")
923923 let exchangers = split(eArgs[0], ",")
924924 let exchangersType = split(eArgs[1], ",")
925925 let args1 = {
926926 let $l = split(eArgs[2], ",")
927927 let $s = size($l)
928928 let $acc0 = nil
929929 func $f0_1 ($a,$i) = if (($i >= $s))
930930 then $a
931931 else listToInt($a, $l[$i])
932932
933933 func $f0_2 ($a,$i) = if (($i >= $s))
934934 then $a
935935 else throw("List size exceeds 3")
936936
937937 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
938938 }
939939 let args2 = {
940940 let $l = split(eArgs[3], ",")
941941 let $s = size($l)
942942 let $acc0 = nil
943943 func $f1_1 ($a,$i) = if (($i >= $s))
944944 then $a
945945 else listToInt($a, $l[$i])
946946
947947 func $f1_2 ($a,$i) = if (($i >= $s))
948948 then $a
949949 else throw("List size exceeds 3")
950950
951951 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
952952 }
953953 let routingAssetsKeys = split(eArgs[4], ",")
954954 let minToRecive = parseIntValue(eArgs[5])
955955 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
956956 }
957957 let inv = invoke(dApp, "routingTrade", args, pmt)
958958 if ((inv == inv))
959959 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
960960 else throw("Strict value is not equal to itself.")
961961 }
962962 else throw("Strict value is not equal to itself.")
963963 }
964964
965965
966966 func capitalize (pool,pType,tokenId,tokenAmount,AId,BId,balA,balB,shareId) = if (if ((tokenId != AId))
967967 then (tokenId != BId)
968968 else false)
969969 then throw("Wrong asset")
970970 else {
971971 let totalShareAmount = getPoolTotalShare(pool)
972972 if ((totalShareAmount == 0))
973973 then $Tuple2([ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))], 0)
974974 else {
975975 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
976976 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
977977 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, (totalShareAmount - totalMarketAmount))
978978 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
979979 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
980980 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
981981 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
982982 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
983983 let $t03027530375 = if ((tokenId == AId))
984984 then $Tuple2((tokenAmount - axlyFee), 0)
985985 else $Tuple2(0, (tokenAmount - axlyFee))
986986 let pmtA = $t03027530375._1
987987 let pmtB = $t03027530375._2
988988 let $t03037830489 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
989989 let stakedAmount = $t03037830489._1
990990 let nf = $t03037830489._2
991991 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
992992 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
993993 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
994994 let stakedNoLoan = (stakedAmount - stakedLoan)
995995 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
996996 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
997997 else 0
998998 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
999999 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
10001000 else 0
10011001 $Tuple2([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))], stakedAmount)
10021002 }
10031003 }
10041004
10051005
10061006 func capitalizePuzzleMarket (pool,pType,shareId) = {
10071007 let totalShareAmount = getPoolTotalShare(pool)
10081008 let marketBalance = assetBalance(pMarketAddr, fromBase58String(shareId))
10091009 if ((marketBalance == marketBalance))
10101010 then {
10111011 let marketAvailable = {
10121012 let @ = invoke(pMarketRestAddr, "assetSupplyByAddressREADONLY", [toString(pMarketAddr), shareId, toString(this)], nil)
10131013 if ($isInstanceOf(@, "Int"))
10141014 then @
10151015 else throw(($getType(@) + " couldn't be cast to Int"))
10161016 }
10171017 if ((marketAvailable == marketAvailable))
10181018 then {
10191019 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
10201020 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
10211021 if (if ((totalMarketAmount == 0))
10221022 then (marketAvailable > 0)
10231023 else false)
10241024 then {
10251025 let unstakedAmount = unstakeLP(pool, pType, shareId, marketAvailable, true)
10261026 if ((unstakedAmount == unstakedAmount))
10271027 then if ((marketBalance > unstakedAmount))
10281028 then $Tuple2([ScriptTransfer(moneyBox, unstakedAmount, fromBase58String(shareId))], 0)
10291029 else $Tuple2(nil, 0)
10301030 else throw("Strict value is not equal to itself.")
10311031 }
10321032 else {
10331033 let capAmount = (marketAvailable - totalMarketAmount)
10341034 if ((0 >= capAmount))
10351035 then $Tuple2(nil, 0)
10361036 else {
10371037 let marketLoanPercent = fraction(totalMarketAmountWithLoan, SCALE8, totalMarketAmount)
10381038 let tokensMarketForFeeLoan = fraction(capAmount, marketLoanPercent, SCALE8)
10391039 let tokensMarketForForFeeNoLoan = (capAmount - tokensMarketForFeeLoan)
10401040 let axlyMarketFeeLoan = fraction(tokensMarketForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
10411041 let axlyMarketFeeNoLoan = fraction(tokensMarketForForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
10421042 let axlyMarketFee = (axlyMarketFeeLoan + axlyMarketFeeNoLoan)
10431043 if ((axlyMarketFee > marketBalance))
10441044 then $Tuple2(nil, 0)
10451045 else {
10461046 let stakedMarketAmount = (capAmount - axlyMarketFee)
10471047 let stakedMarketLoan = fraction(stakedMarketAmount, marketLoanPercent, SCALE8)
10481048 let stakedMarketNoLoan = (stakedMarketAmount - stakedMarketLoan)
10491049 let curPoolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
10501050 let curPoolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
10511051 let newInterestMarketLoan = if ((totalMarketAmountWithLoan > 0))
10521052 then (curPoolInterestMarketLoan + fraction(stakedMarketLoan, SCALE10, totalMarketAmountWithLoan))
10531053 else 0
10541054 let newInterestMarketNoLoan = if (((totalMarketAmount - totalMarketAmountWithLoan) > 0))
10551055 then (curPoolInterestMarketNoLoan + fraction(stakedMarketNoLoan, SCALE10, (totalMarketAmount - totalMarketAmountWithLoan)))
10561056 else 0
10571057 let unstakedAmount = unstakeLP(pool, pType, shareId, axlyMarketFee, true)
10581058 if ((unstakedAmount == unstakedAmount))
10591059 then $Tuple2([IntegerEntry((pool + kPoolInterestMarketLoan), newInterestMarketLoan), IntegerEntry((pool + kPoolInterestMarketNoLoan), newInterestMarketNoLoan), IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount + stakedMarketAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan + stakedMarketLoan)), ScriptTransfer(moneyBox, axlyMarketFee, assetIdFromStr(shareId))], stakedMarketAmount)
10601060 else throw("Strict value is not equal to itself.")
10611061 }
10621062 }
10631063 }
10641064 }
10651065 else throw("Strict value is not equal to itself.")
10661066 }
10671067 else throw("Strict value is not equal to itself.")
10681068 }
10691069
10701070
10711071 func userCanWithdrawShareCalc (user,pool,posId,borrowed,isMarketPos) = {
10721072 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
10731073 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
10741074 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
10751075 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
10761076 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
10771077 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
10781078 let poolInterest = if (borrowed)
10791079 then if (isMarketPos)
10801080 then poolInterestMarketLoan
10811081 else poolInterestLoan
10821082 else if (isMarketPos)
10831083 then poolInterestMarketNoLoan
10841084 else poolInterestNoLoan
10851085 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
10861086 }
10871087
10881088
10891089 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
10901090 let feeType = if (isBorrowed)
10911091 then STOPLOSS_LOAN
10921092 else STOPLOSS_FEE_NO_LOAN
10931093 if (stopLoss)
10941094 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
10951095 else 0
10961096 }
10971097
10981098
10991099 func withdrawToUser (user,pool,posId,stopLoss,withdrawToken) = {
11001100 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
11011101 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
11021102 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
11031103 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed, fromMarket)
11041104 let poolTotalShare = getPoolTotalShare(pool)
11051105 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
11061106 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
11071107 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
11081108 let userAddr = Address(fromBase58String(user))
11091109 let poolAddr = Address(fromBase58String(pool))
11101110 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
11111111 let $t03654036612 = getPoolData(poolAddr, pType)
11121112 let idAStr = $t03654036612._1
11131113 let idBStr = $t03654036612._2
11141114 let balA = $t03654036612._3
11151115 let balB = $t03654036612._4
11161116 let shareId = $t03654036612._5
11171117 let $t03661536682 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
11181118 let idA = $t03661536682._1
11191119 let idB = $t03661536682._2
11201120 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
11211121 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
11221122 let cBalABefore = accountBalance(idA)
11231123 if ((cBalABefore == cBalABefore))
11241124 then {
11251125 let cBalBBefore = accountBalance(idB)
11261126 if ((cBalBBefore == cBalBBefore))
11271127 then {
11281128 let inv = if ((pType == SF_POOL))
11291129 then {
11301130 let inv = unstakeLP(pool, pType, shareId, stopLossFee, fromMarket)
11311131 if ((inv == inv))
11321132 then invoke(poolAddr, "callFunction", ["withdraw", [toString((userCanWithdraw - stopLossFee))]], nil)
11331133 else throw("Strict value is not equal to itself.")
11341134 }
11351135 else if ((pType == WX_POOL))
11361136 then {
11371137 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee), fromMarket)
11381138 if ((inv == inv))
11391139 then if ((proxyAddr == ""))
11401140 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
11411141 else invoke(addressFromStringValue(proxyAddr), "wxWithdrawTwoTokens", [pool, idAStr, idBStr], [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
11421142 else throw("Strict value is not equal to itself.")
11431143 }
11441144 else unknownPoolType()
11451145 if ((inv == inv))
11461146 then {
11471147 let cBalAAfter = accountBalance(idA)
11481148 if ((cBalAAfter == cBalAAfter))
11491149 then {
11501150 let cBalBAfter = accountBalance(idB)
11511151 if ((cBalBAfter == cBalBAfter))
11521152 then {
11531153 let $t03769037779 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
11541154 let tokensAmountA = $t03769037779._1
11551155 let tokensAmountB = $t03769037779._2
11561156 let $t03778239018 = if (isBorrowed)
11571157 then {
11581158 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
11591159 let debt = {
11601160 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
11611161 if ($isInstanceOf(@, "Int"))
11621162 then @
11631163 else throw(($getType(@) + " couldn't be cast to Int"))
11641164 }
11651165 if ((debt == debt))
11661166 then {
11671167 let amountToGetEx = if (if ((borrowAsset == idAStr))
11681168 then (debt > tokensAmountA)
11691169 else false)
11701170 then (debt - tokensAmountA)
11711171 else if (if ((borrowAsset == idBStr))
11721172 then (debt > tokensAmountB)
11731173 else false)
11741174 then (debt - tokensAmountB)
11751175 else 0
11761176 let exInv = if ((amountToGetEx > 0))
11771177 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
11781178 else nil
11791179 if ((exInv == exInv))
11801180 then {
11811181 let cBalAAfterRepay = accountBalance(idA)
11821182 if ((cBalAAfterRepay == cBalAAfterRepay))
11831183 then {
11841184 let cBalBAfterRepay = accountBalance(idB)
11851185 if ((cBalBAfterRepay == cBalBAfterRepay))
11861186 then {
11871187 let closeDbtInv = if ((debt > 0))
11881188 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
11891189 else 0
11901190 if ((closeDbtInv == closeDbtInv))
11911191 then if ((borrowAsset == idAStr))
11921192 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
11931193 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
11941194 else throw("Strict value is not equal to itself.")
11951195 }
11961196 else throw("Strict value is not equal to itself.")
11971197 }
11981198 else throw("Strict value is not equal to itself.")
11991199 }
12001200 else throw("Strict value is not equal to itself.")
12011201 }
12021202 else throw("Strict value is not equal to itself.")
12031203 }
12041204 else $Tuple2(tokensAmountA, tokensAmountB)
12051205 let toUserA = $t03778239018._1
12061206 let toUserB = $t03778239018._2
12071207 let poolTotalLoanEntries = if (isBorrowed)
12081208 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
12091209 else nil
12101210 let poolTotalMarketEntries = if (fromMarket)
12111211 then ([IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userCanWithdraw))] ++ (if (isBorrowed)
12121212 then [IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userCanWithdraw))]
12131213 else nil))
12141214 else nil
12151215 let $t03943139826 = if (if ((withdrawToken == idAStr))
12161216 then (toUserB > 0)
12171217 else false)
12181218 then {
12191219 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserB, idBStr, idAStr)
12201220 if ((amtGet == amtGet))
12211221 then $Tuple2((toUserA + amtGet), 0)
12221222 else throw("Strict value is not equal to itself.")
12231223 }
12241224 else if (if ((withdrawToken == idBStr))
12251225 then (toUserA > 0)
12261226 else false)
12271227 then {
12281228 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserA, idAStr, idBStr)
12291229 if ((amtGet == amtGet))
12301230 then $Tuple2(0, (toUserB + amtGet))
12311231 else throw("Strict value is not equal to itself.")
12321232 }
12331233 else $Tuple2(toUserA, toUserB)
12341234 let toUserACalc = $t03943139826._1
12351235 let toUserBCalc = $t03943139826._2
12361236 let entries = ((([DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition)), DeleteEntry((((user + "_") + posId) + kUserPositionPool)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), IntegerEntry((pool + kPoolTotal), (poolTotalShare - userCanWithdraw)), ScriptTransfer(userAddr, toUserACalc, idA), ScriptTransfer(userAddr, toUserBCalc, idB), ScriptTransfer(moneyBox, stopLossFee, fromBase58String(shareId))] ++ poolTotalLoanEntries) ++ poolTotalMarketEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil))
12371237 $Tuple2(entries, [toUserACalc, toUserBCalc])
12381238 }
12391239 else throw("Strict value is not equal to itself.")
12401240 }
12411241 else throw("Strict value is not equal to itself.")
12421242 }
12431243 else throw("Strict value is not equal to itself.")
12441244 }
12451245 else throw("Strict value is not equal to itself.")
12461246 }
12471247 else throw("Strict value is not equal to itself.")
12481248 }
12491249
12501250
12511251 func liquidatePos (caller,user,posId,lAmount) = {
12521252 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
12531253 let borrowAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), "There are no borrow position")
12541254 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
12551255 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
12561256 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, true, fromMarket)
12571257 let poolTotalShare = getPoolTotalShare(pool)
12581258 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
12591259 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
12601260 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
12611261 let userAddr = Address(fromBase58String(user))
12621262 let poolAddr = Address(fromBase58String(pool))
12631263 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
12641264 let $t04175141823 = getPoolData(poolAddr, pType)
12651265 let idAStr = $t04175141823._1
12661266 let idBStr = $t04175141823._2
12671267 let balA = $t04175141823._3
12681268 let balB = $t04175141823._4
12691269 let shareId = $t04175141823._5
12701270 let $t04182641893 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
12711271 let idA = $t04182641893._1
12721272 let idB = $t04182641893._2
12731273 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
12741274 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
12751275 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
12761276 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
12771277 if ((borrowAmount == 0))
12781278 then throw("You can't liquidate position without borrow")
12791279 else {
12801280 let cBalABefore = accountBalance(idA)
12811281 if ((cBalABefore == cBalABefore))
12821282 then {
12831283 let cBalBBefore = accountBalance(idB)
12841284 if ((cBalBBefore == cBalBBefore))
12851285 then {
12861286 let inv = if ((pType == SF_POOL))
12871287 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
12881288 else if ((pType == WX_POOL))
12891289 then {
12901290 let inv = unstakeLP(pool, pType, shareId, userCanWithdraw, fromMarket)
12911291 if ((inv == inv))
12921292 then if ((proxyAddr == ""))
12931293 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
12941294 else invoke(addressFromStringValue(proxyAddr), "wxWithdrawTwoTokens", [pool, idAStr, idBStr], [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
12951295 else throw("Strict value is not equal to itself.")
12961296 }
12971297 else unknownPoolType()
12981298 if ((inv == inv))
12991299 then {
13001300 let cBalAAfter = accountBalance(idA)
13011301 if ((cBalAAfter == cBalAAfter))
13021302 then {
13031303 let cBalBAfter = accountBalance(idB)
13041304 if ((cBalBAfter == cBalBAfter))
13051305 then {
13061306 let $t04307743166 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
13071307 let tokensAmountA = $t04307743166._1
13081308 let tokensAmountB = $t04307743166._2
13091309 let amountToGetEx = if (if ((borrowAsset == idAStr))
13101310 then (lAmount > tokensAmountA)
13111311 else false)
13121312 then (lAmount - tokensAmountA)
13131313 else if (if ((borrowAsset == idBStr))
13141314 then (lAmount > tokensAmountB)
13151315 else false)
13161316 then (lAmount - tokensAmountB)
13171317 else 0
13181318 let exInv = if ((amountToGetEx > 0))
13191319 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
13201320 else nil
13211321 if ((exInv == exInv))
13221322 then {
13231323 let cBalAAfterRepay = accountBalance(idA)
13241324 if ((cBalAAfterRepay == cBalAAfterRepay))
13251325 then {
13261326 let cBalBAfterRepay = accountBalance(idB)
13271327 if ((cBalBAfterRepay == cBalBAfterRepay))
13281328 then {
13291329 let $t04367243899 = if ((borrowAsset == idAStr))
13301330 then $Tuple2(((cBalAAfterRepay - cBalABefore) - lAmount), (cBalBAfterRepay - cBalBBefore))
13311331 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - lAmount))
13321332 let toUserA = $t04367243899._1
13331333 let toUserB = $t04367243899._2
13341334 let $t04390243979 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
13351335 let balAAfter = $t04390243979._1
13361336 let balBAfter = $t04390243979._2
13371337 let $t04398244113 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
13381338 let userStaked = $t04398244113._1
13391339 let axlyFee = $t04398244113._2
13401340 let userLpLiqudated = (userCanWithdraw - userStaked)
13411341 let $t04417244517 = if (fromMarket)
13421342 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userLpLiqudated)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userLpLiqudated))])
13431343 else $Tuple2(poolInterestLoan, nil)
13441344 let curPoolInterest = $t04417244517._1
13451345 let poolTotalMarketEntries = $t04417244517._2
13461346 $Tuple2((([IntegerEntry((pool + kPoolTotal), (poolTotalShare - userLpLiqudated)), IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userLpLiqudated)), IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition), (pAmount - userLpLiqudated)), IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest), curPoolInterest), ScriptTransfer(caller, lAmount, assetIdFromStr(borrowAsset))] ++ poolTotalMarketEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil)), userLpLiqudated)
13471347 }
13481348 else throw("Strict value is not equal to itself.")
13491349 }
13501350 else throw("Strict value is not equal to itself.")
13511351 }
13521352 else throw("Strict value is not equal to itself.")
13531353 }
13541354 else throw("Strict value is not equal to itself.")
13551355 }
13561356 else throw("Strict value is not equal to itself.")
13571357 }
13581358 else throw("Strict value is not equal to itself.")
13591359 }
13601360 else throw("Strict value is not equal to itself.")
13611361 }
13621362 else throw("Strict value is not equal to itself.")
13631363 }
13641364 }
13651365
13661366
13671367 func parseRequest (requestId) = {
13681368 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
13691369 let user = request[0]
13701370 let pool = request[1]
13711371 let pmtA = parseIntValue(request[2])
13721372 let AId = request[3]
13731373 let pmtB = parseIntValue(request[4])
13741374 let BId = request[5]
13751375 let balA = parseIntValue(request[6])
13761376 let balB = parseIntValue(request[7])
13771377 let shareId = request[8]
13781378 let bwAsset = request[9]
13791379 let bwAmount = parseIntValue(request[10])
13801380 let stakeToMarket = (request[11] == "true")
13811381 $Tuple12(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount, stakeToMarket)
13821382 }
13831383
13841384
13851385 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
13861386 then (borrowId != bId)
13871387 else false)
13881388 then throw("Wrong borrow asset")
13891389 else {
13901390 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
13911391 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
13921392 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
13931393 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
13941394 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
13951395 let $t04624546342 = if ((borrowId == aId))
13961396 then $Tuple2(dPriceA, decPrA)
13971397 else $Tuple2(dPriceB, decPrB)
13981398 let borrowPrice = $t04624546342._1
13991399 let borrowDecPr = $t04624546342._2
14001400 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
14011401 }
14021402
14031403
14041404 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
14051405 then if ((assetIdToStr(pmts[0].assetId) != AId))
14061406 then throw("Wrong payment asset A")
14071407 else if ((assetIdToStr(pmts[1].assetId) != BId))
14081408 then throw("Wrong payment asset B")
14091409 else $Tuple2(pmts[0].amount, pmts[1].amount)
14101410 else if ((size(pmts) == 1))
14111411 then if ((assetIdToStr(pmts[0].assetId) == AId))
14121412 then $Tuple2(pmts[0].amount, 0)
14131413 else if ((assetIdToStr(pmts[0].assetId) == BId))
14141414 then $Tuple2(0, pmts[0].amount)
14151415 else throw("Wrong payment")
14161416 else throw("One or two payments expected")
14171417
14181418
14191419 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
14201420 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
14211421 if ((0 > pri))
14221422 then (pri * -1)
14231423 else pri
14241424 }
14251425
14261426
14271427 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1428- let $t04734247604 = if (claim)
1428+ let $t04734248022 = if (claim)
14291429 then claimFarmed(pType, pool)
14301430 else {
14311431 let claimedAsset = if ((pType == SF_POOL))
14321432 then SWOPID
14331433 else if ((pType == WX_POOL))
1434- then WXID
1434+ then {
1435+ let proxyAddrStr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
1436+ let inv = if ((proxyAddrStr != ""))
1437+ then {
1438+ let proxyAddr = addressFromStringValue(proxyAddrStr)
1439+ let proxyBalance = assetBalance(proxyAddr, WXID)
1440+ if ((proxyBalance > 0))
1441+ then invoke(proxyAddr, "wxClaimFinalized", [proxyBalance], nil)
1442+ else unit
1443+ }
1444+ else unit
1445+ if ((inv == inv))
1446+ then WXID
1447+ else throw("Strict value is not equal to itself.")
1448+ }
14351449 else unknownPoolType()
14361450 $Tuple2(amount, claimedAsset)
14371451 }
1438- if (($t04734247604 == $t04734247604))
1452+ if (($t04734248022 == $t04734248022))
14391453 then {
1440- let claimAsset = $t04734247604._2
1441- let claimAmount = $t04734247604._1
1454+ let claimAsset = $t04734248022._2
1455+ let claimAmount = $t04734248022._1
14421456 let bal = accountBalance(claimAsset)
14431457 if ((bal == bal))
14441458 then if ((amount > bal))
14451459 then throw("To big amount to exchange")
14461460 else $Tuple2(claimAmount, claimAsset)
14471461 else throw("Strict value is not equal to itself.")
14481462 }
14491463 else throw("Strict value is not equal to itself.")
14501464 }
14511465
14521466
14531467 @Callable(i)
14541468 func getPoolInfoREADONLY (pool) = {
14551469 let poolAddr = addressFromStringValue(pool)
14561470 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1457- let $t04797148061 = getPoolData(Address(fromBase58String(pool)), pType)
1458- let AId = $t04797148061._1
1459- let BId = $t04797148061._2
1460- let balA = $t04797148061._3
1461- let balB = $t04797148061._4
1462- let shareId = $t04797148061._5
1471+ let $t04838948479 = getPoolData(Address(fromBase58String(pool)), pType)
1472+ let AId = $t04838948479._1
1473+ let BId = $t04838948479._2
1474+ let balA = $t04838948479._3
1475+ let balB = $t04838948479._4
1476+ let shareId = $t04838948479._5
14631477 let shareSupply = getShareSupply(poolAddr, pType, shareId)
14641478 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
14651479 }
14661480
14671481
14681482
14691483 @Callable(i)
14701484 func getShareAssetPriceREADONLY (shareId) = {
14711485 let sharePrices = getSharePrice(shareId)
14721486 $Tuple2(nil, sharePrices)
14731487 }
14741488
14751489
14761490
14771491 @Callable(i)
14781492 func getUserPositionShareAmountREADONLY (user,posNum) = {
14791493 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
14801494 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
14811495 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum) + kUserPositionInPMarket)), false)
14821496 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0), fromMarket)
14831497 $Tuple2(nil, userCanWithdraw)
14841498 }
14851499
14861500
14871501
14881502 @Callable(i)
14891503 func getUserPositionREADONLY (user,pools,posNum) = {
14901504 func userPos (a,pool) = {
1491- let $t04905949129 = a
1492- let wAmountsA = $t04905949129._1
1493- let wAmountsB = $t04905949129._2
1494- let debts = $t04905949129._3
1495- let eqWAmountsA = $t04905949129._4
1496- let eqWAmountsB = $t04905949129._5
1497- let index = $t04905949129._6
1505+ let $t04947749547 = a
1506+ let wAmountsA = $t04947749547._1
1507+ let wAmountsB = $t04947749547._2
1508+ let debts = $t04947749547._3
1509+ let eqWAmountsA = $t04947749547._4
1510+ let eqWAmountsB = $t04947749547._5
1511+ let index = $t04947749547._6
14981512 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
14991513 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
15001514 else {
15011515 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1502- let $t04940849498 = getPoolData(Address(fromBase58String(pool)), pType)
1503- let AId = $t04940849498._1
1504- let BId = $t04940849498._2
1505- let balA = $t04940849498._3
1506- let balB = $t04940849498._4
1507- let shareId = $t04940849498._5
1516+ let $t04982649916 = getPoolData(Address(fromBase58String(pool)), pType)
1517+ let AId = $t04982649916._1
1518+ let BId = $t04982649916._2
1519+ let balA = $t04982649916._3
1520+ let balB = $t04982649916._4
1521+ let shareId = $t04982649916._5
15081522 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
15091523 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPositionInPMarket)), false)
15101524 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0), fromMarket)
1511- let $t04984849968 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1512- let wAmountA = $t04984849968._1
1513- let wAmountB = $t04984849968._2
1525+ let $t05026650386 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1526+ let wAmountA = $t05026650386._1
1527+ let wAmountB = $t05026650386._2
15141528 if ((borrowAmount > 0))
15151529 then {
15161530 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
15171531 let debt = {
15181532 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
15191533 if ($isInstanceOf(@, "Int"))
15201534 then @
15211535 else throw(($getType(@) + " couldn't be cast to Int"))
15221536 }
15231537 if ((debt == debt))
15241538 then {
15251539 let amountToGetEx = if (if ((borrowAsset == AId))
15261540 then (debt > wAmountA)
15271541 else false)
15281542 then (debt - wAmountA)
15291543 else if (if ((borrowAsset == BId))
15301544 then (debt > wAmountB)
15311545 else false)
15321546 then (debt - wAmountB)
15331547 else 0
15341548 let amountToPay = if ((amountToGetEx > 0))
15351549 then if ((pType == SF_POOL))
15361550 then {
15371551 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
15381552 ex._2
15391553 }
15401554 else if ((pType == WX_POOL))
15411555 then {
15421556 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
15431557 ex._2
15441558 }
15451559 else unknownPoolType()
15461560 else 0
1547- let $t05088051099 = if ((borrowAsset == AId))
1561+ let $t05129851517 = if ((borrowAsset == AId))
15481562 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
15491563 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1550- let eqWAmountA = $t05088051099._1
1551- let eqWAmountB = $t05088051099._2
1564+ let eqWAmountA = $t05129851517._1
1565+ let eqWAmountB = $t05129851517._2
15521566 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
15531567 }
15541568 else throw("Strict value is not equal to itself.")
15551569 }
15561570 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
15571571 }
15581572 }
15591573
1560- let $t05135451465 = {
1574+ let $t05177251883 = {
15611575 let $l = pools
15621576 let $s = size($l)
15631577 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
15641578 func $f0_1 ($a,$i) = if (($i >= $s))
15651579 then $a
15661580 else userPos($a, $l[$i])
15671581
15681582 func $f0_2 ($a,$i) = if (($i >= $s))
15691583 then $a
15701584 else throw("List size exceeds 20")
15711585
15721586 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
15731587 }
1574- let wAmountsA = $t05135451465._1
1575- let wAmountsB = $t05135451465._2
1576- let debts = $t05135451465._3
1577- let eqWAmountsA = $t05135451465._4
1578- let eqWAmountsB = $t05135451465._5
1588+ let wAmountsA = $t05177251883._1
1589+ let wAmountsB = $t05177251883._2
1590+ let debts = $t05177251883._3
1591+ let eqWAmountsA = $t05177251883._4
1592+ let eqWAmountsB = $t05177251883._5
15791593 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
15801594 }
15811595
15821596
15831597
15841598 @Callable(i)
15851599 func replenish (pool,leverage,borrowId,stakeToMarket) = valueOrElse(isActiveForUsers(), {
15861600 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
15871601 if (!(isPoolActive(pool, pType)))
15881602 then throw("Pool not active at this moment")
15891603 else if (if ((100 > leverage))
15901604 then true
15911605 else (leverage > 300))
15921606 then throw("Leverage can't be <100 and >300")
15931607 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
15941608 then (leverage > 100)
15951609 else false)
15961610 then throw("You can't borrow in this pool")
15971611 else if (if (stakeToMarket)
15981612 then !(valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false))
15991613 else false)
16001614 then throw("This pool can't stake to puzzle market")
16011615 else {
1602- let $t05222452314 = getPoolData(Address(fromBase58String(pool)), pType)
1603- let AId = $t05222452314._1
1604- let BId = $t05222452314._2
1605- let balA = $t05222452314._3
1606- let balB = $t05222452314._4
1607- let shareId = $t05222452314._5
1616+ let $t05264252732 = getPoolData(Address(fromBase58String(pool)), pType)
1617+ let AId = $t05264252732._1
1618+ let BId = $t05264252732._2
1619+ let balA = $t05264252732._3
1620+ let balB = $t05264252732._4
1621+ let shareId = $t05264252732._5
16081622 if (if ((borrowId != AId))
16091623 then (borrowId != BId)
16101624 else false)
16111625 then throw("Wrong borrow asset")
16121626 else {
1613- let $t05239552454 = parseReplenishPmts(i.payments, AId, BId)
1614- let pmtA = $t05239552454._1
1615- let pmtB = $t05239552454._2
1627+ let $t05281352872 = parseReplenishPmts(i.payments, AId, BId)
1628+ let pmtA = $t05281352872._1
1629+ let pmtB = $t05281352872._2
16161630 let user = toString(i.caller)
16171631 let newPosNum = getNewUserPositionNumber(user)
16181632 if ((leverage > 100))
16191633 then {
16201634 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
16211635 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount), toString(stakeToMarket)], ",")
16221636 let newRequestId = {
16231637 let @ = invoke(this, "createNewRequest", [request], nil)
16241638 if ($isInstanceOf(@, "Int"))
16251639 then @
16261640 else throw(($getType(@) + " couldn't be cast to Int"))
16271641 }
16281642 if ((newRequestId == newRequestId))
16291643 then {
16301644 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
16311645 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
16321646 if ((inv == inv))
16331647 then {
16341648 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1635- let $t05347753571 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1636- if (($t05347753571 == $t05347753571))
1649+ let $t05389553989 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1650+ if (($t05389553989 == $t05389553989))
16371651 then {
1638- let newBalB = $t05347753571._2
1639- let newBalA = $t05347753571._1
1652+ let newBalB = $t05389553989._2
1653+ let newBalA = $t05389553989._1
16401654 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1641- let $t05364153756 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1642- let wAmountA = $t05364153756._1
1643- let wAmountB = $t05364153756._2
1655+ let $t05405954174 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1656+ let wAmountA = $t05405954174._1
1657+ let wAmountB = $t05405954174._2
16441658 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
16451659 }
16461660 else throw("Strict value is not equal to itself.")
16471661 }
16481662 else throw("Strict value is not equal to itself.")
16491663 }
16501664 else throw("Strict value is not equal to itself.")
16511665 }
16521666 else {
1653- let $t05380953939 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1654- if (($t05380953939 == $t05380953939))
1667+ let $t05422754357 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1668+ if (($t05422754357 == $t05422754357))
16551669 then {
1656- let axlyFee = $t05380953939._2
1657- let userStaked = $t05380953939._1
1658- let $t05394554039 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1659- if (($t05394554039 == $t05394554039))
1670+ let axlyFee = $t05422754357._2
1671+ let userStaked = $t05422754357._1
1672+ let $t05436354457 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1673+ if (($t05436354457 == $t05436354457))
16601674 then {
1661- let newBalB = $t05394554039._2
1662- let newBalA = $t05394554039._1
1675+ let newBalB = $t05436354457._2
1676+ let newBalA = $t05436354457._1
16631677 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1664- let $t05410954224 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1665- let wAmountA = $t05410954224._1
1666- let wAmountB = $t05410954224._2
1678+ let $t05452754642 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1679+ let wAmountA = $t05452754642._1
1680+ let wAmountB = $t05452754642._2
16671681 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
16681682 }
16691683 else throw("Strict value is not equal to itself.")
16701684 }
16711685 else throw("Strict value is not equal to itself.")
16721686 }
16731687 }
16741688 }
16751689 })
16761690
16771691
16781692
16791693 @Callable(i)
16801694 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
16811695 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
16821696 if (!(isPoolActive(pool, pType)))
16831697 then throw("Pool not active at this moment")
16841698 else withdrawToUser(toString(i.caller), pool, toString(posId), false, "")
16851699 })
16861700
16871701
16881702
16891703 @Callable(i)
16901704 func withdrawOneToken (pool,posId,tokenId) = valueOrElse(isActiveForUsers(), {
16911705 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
16921706 if (!(isPoolActive(pool, pType)))
16931707 then throw("Pool not active at this moment")
16941708 else withdrawToUser(toString(i.caller), pool, toString(posId), false, tokenId)
16951709 })
16961710
16971711
16981712
16991713 @Callable(i)
17001714 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
17011715 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
17021716 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
17031717 if (!(isPoolActive(poolId, pType)))
17041718 then throw("Pool not active at this moment")
17051719 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
17061720 then throw("There are no user position")
17071721 else if ((0 >= price))
17081722 then throw("Price must be greater than 0")
17091723 else if ((price > tokenOraclePrice))
17101724 then throw("Price must be less than current token price")
17111725 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
17121726 })
17131727
17141728
17151729
17161730 @Callable(i)
17171731 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
17181732 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
17191733 if (!(isPoolActive(poolId, pType)))
17201734 then throw("Pool not active at this moment")
17211735 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
17221736 then throw("No entry")
17231737 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
17241738 })
17251739
17261740
17271741
17281742 @Callable(i)
17291743 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
17301744 then throw("Already inited")
17311745 else if (!(isDefined(addressFromString(moneyBoxAddr))))
17321746 then throw("moneyBoxAddr is not correct address")
17331747 else if (!(isDefined(addressFromString(sfFarmingAddr))))
17341748 then throw("sfFarmingAddr is not correct address")
17351749 else if (!(isDefined(addressFromString(lendAddr))))
17361750 then throw("lendAddr is not correct address")
17371751 else if (!(isDefined(addressFromString(priceOracleAddr))))
17381752 then throw("priceOracleAddr is not correct address")
17391753 else if (!(isDefined(addressFromString(keeperExContract))))
17401754 then throw("keeperExContract is not correct address")
17411755 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
17421756 then throw("swopAssetId is not correct asset id")
17431757 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
17441758 then throw("swopAssetId is not correct asset id")
17451759 else if ((size(fromBase58String(operatorPubKey)) != 32))
17461760 then throw("operatorPubKey is not correct")
17471761 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
17481762 then throw("group1Admin1PubKey is not correct")
17491763 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
17501764 then throw("group1Admin2PubKey is not correct")
17511765 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
17521766 then throw("group2Admin1PubKey is not correct")
17531767 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
17541768 then throw("group2Admin2PubKey is not correct")
17551769 else [StringEntry(kMoneyBox, moneyBoxAddr), StringEntry(kSFFarmingAddr, sfFarmingAddr), StringEntry(kLendService, lendAddr), StringEntry(kPriceOracle, priceOracleAddr), StringEntry(kExContract, keeperExContract), StringEntry(kWxSwapContract, wxSwapContract), StringEntry(kSwopId, swopAssetId), StringEntry(kWxId, wxAssetId), StringEntry(kOperatorCallPK, operatorPubKey), StringEntry(kGroup1Admin1PK, group1Admin1PubKey), StringEntry(kGroup1Admin2PK, group1Admin2PubKey), StringEntry(kGroup2Admin1PK, group2Admin1PubKey), StringEntry(kGroup2Admin2PK, group2Admin2PubKey)])
17561770
17571771
17581772
17591773 @Callable(i)
17601774 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
17611775 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
17621776 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
17631777 })
17641778
17651779
17661780
17671781 @Callable(i)
17681782 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1769- let $t05944459563 = parseRequest(requestId)
1770- let user = $t05944459563._1
1771- let pool = $t05944459563._2
1772- let pmtA = $t05944459563._3
1773- let AId = $t05944459563._4
1774- let pmtB = $t05944459563._5
1775- let BId = $t05944459563._6
1776- let balA = $t05944459563._7
1777- let balB = $t05944459563._8
1778- let shareId = $t05944459563._9
1779- let bwAsset = $t05944459563._10
1780- let bwAmount = $t05944459563._11
1781- let stakeToMarket = $t05944459563._12
1783+ let $t05986259981 = parseRequest(requestId)
1784+ let user = $t05986259981._1
1785+ let pool = $t05986259981._2
1786+ let pmtA = $t05986259981._3
1787+ let AId = $t05986259981._4
1788+ let pmtB = $t05986259981._5
1789+ let BId = $t05986259981._6
1790+ let balA = $t05986259981._7
1791+ let balB = $t05986259981._8
1792+ let shareId = $t05986259981._9
1793+ let bwAsset = $t05986259981._10
1794+ let bwAmount = $t05986259981._11
1795+ let stakeToMarket = $t05986259981._12
17821796 if ((size(i.payments) != 1))
17831797 then throw("Wrong payment size")
17841798 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
17851799 then true
17861800 else (i.payments[0].amount != bwAmount))
17871801 then throw("Wrong payment")
17881802 else {
1789- let $t05975359853 = if ((AId == bwAsset))
1803+ let $t06017160271 = if ((AId == bwAsset))
17901804 then $Tuple2((pmtA + bwAmount), pmtB)
17911805 else $Tuple2(pmtA, (pmtB + bwAmount))
1792- let pmtAllA = $t05975359853._1
1793- let pmtAllB = $t05975359853._2
1806+ let pmtAllA = $t06017160271._1
1807+ let pmtAllB = $t06017160271._2
17941808 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1795- let $t05993560065 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1796- let userStaked = $t05993560065._1
1797- let axlyFee = $t05993560065._2
1809+ let $t06035360483 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1810+ let userStaked = $t06035360483._1
1811+ let axlyFee = $t06035360483._2
17981812 let posNum = getNewUserPositionNumber(user)
17991813 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
18001814 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1801- let $t06044060555 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1802- let wAmountA = $t06044060555._1
1803- let wAmountB = $t06044060555._2
1815+ let $t06085860973 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1816+ let wAmountA = $t06085860973._1
1817+ let wAmountB = $t06085860973._2
18041818 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
18051819 }
18061820 }))
18071821
18081822
18091823
18101824 @Callable(i)
18111825 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), liquidatePos(i.caller, user, posId, liquidateAmount)))
18121826
18131827
18141828
18151829 @Callable(i)
18161830 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
18171831 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
18181832 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
18191833 if ((tokenOraclePrice > stopLossPrice))
18201834 then throw("Token price greater stop loss price")
18211835 else {
18221836 let res = withdrawToUser(user, pool, toString(posId), true, "")
18231837 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
18241838 }
18251839 }))
18261840
18271841
18281842
18291843 @Callable(i)
18301844 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
18311845 let pType = getStringValue(this, (kPool + pool))
18321846 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
18331847 let poolAddr = Address(fromBase58String(pool))
1834- let $t06197162037 = getPoolData(poolAddr, pType)
1835- let AId = $t06197162037._1
1836- let BId = $t06197162037._2
1837- let balA = $t06197162037._3
1838- let balB = $t06197162037._4
1839- let shareId = $t06197162037._5
1848+ let $t06238962455 = getPoolData(poolAddr, pType)
1849+ let AId = $t06238962455._1
1850+ let BId = $t06238962455._2
1851+ let balA = $t06238962455._3
1852+ let balB = $t06238962455._4
1853+ let shareId = $t06238962455._5
18401854 let totalShareAmount = getPoolTotalShare(pool)
18411855 let isMarketPool = valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false)
1842- let $t06216662997 = if ((amountToExchange > 0))
1856+ let $t06258463415 = if ((amountToExchange > 0))
18431857 then {
1844- let $t06222862330 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1845- if (($t06222862330 == $t06222862330))
1858+ let $t06264662748 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1859+ if (($t06264662748 == $t06264662748))
18461860 then {
1847- let claimedAsset = $t06222862330._2
1848- let claimedAmount = $t06222862330._1
1861+ let claimedAsset = $t06264662748._2
1862+ let claimedAmount = $t06264662748._1
18491863 let rArgs = split(route, "__")
18501864 let exchangedAmount = if ((amountToExchange > 0))
18511865 then if ((rArgs[0] == "directSwopfiCPMM"))
18521866 then directSwopfiCPMM(rArgs, tokenToId)
18531867 else if ((rArgs[0] == "routingSwopfi"))
18541868 then directRoutingSwopfi(rArgs, tokenToId)
18551869 else throw("Wrong route")
18561870 else 0
18571871 if ((exchangedAmount == exchangedAmount))
18581872 then {
18591873 let newChange = ((claimedAmount + change) - amountToExchange)
18601874 let changeEntry = if ((newChange >= 0))
18611875 then [IntegerEntry((pool + kPoolCapChange), newChange)]
18621876 else nil
1863- let $t06282762937 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1864- let capEnterise = $t06282762937._1
1865- let staked = $t06282762937._2
1877+ let $t06324563355 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1878+ let capEnterise = $t06324563355._1
1879+ let staked = $t06324563355._2
18661880 $Tuple2((capEnterise ++ changeEntry), staked)
18671881 }
18681882 else throw("Strict value is not equal to itself.")
18691883 }
18701884 else throw("Strict value is not equal to itself.")
18711885 }
18721886 else $Tuple2(nil, 0)
1873- let capEnterise = $t06216662997._1
1874- let staked = $t06216662997._2
1875- let $t06300063117 = if (isMarketPool)
1887+ let capEnterise = $t06258463415._1
1888+ let staked = $t06258463415._2
1889+ let $t06341863535 = if (isMarketPool)
18761890 then capitalizePuzzleMarket(pool, pType, shareId)
18771891 else $Tuple2(nil, 0)
1878- let marketCapEnteris = $t06300063117._1
1879- let stakedMarket = $t06300063117._2
1892+ let marketCapEnteris = $t06341863535._1
1893+ let stakedMarket = $t06341863535._2
18801894 ((([IntegerEntry((pool + kPoolTotal), ((totalShareAmount + staked) + stakedMarket))] ++ capEnterise) ++ marketCapEnteris) ++ getCursEntries(AId, BId, shareId, nil))
18811895 }))
18821896
18831897
18841898
18851899 @Callable(i)
18861900 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
18871901 let pType = getStringValue(this, (kPool + pool))
18881902 let poolAddr = Address(fromBase58String(pool))
1889- let $t06355263618 = getPoolData(poolAddr, pType)
1890- let AId = $t06355263618._1
1891- let BId = $t06355263618._2
1892- let balA = $t06355263618._3
1893- let balB = $t06355263618._4
1894- let shareId = $t06355263618._5
1895- let $t06362163719 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1896- if (($t06362163719 == $t06362163719))
1903+ let $t06397064036 = getPoolData(poolAddr, pType)
1904+ let AId = $t06397064036._1
1905+ let BId = $t06397064036._2
1906+ let balA = $t06397064036._3
1907+ let balB = $t06397064036._4
1908+ let shareId = $t06397064036._5
1909+ let $t06403964137 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1910+ if (($t06403964137 == $t06403964137))
18971911 then {
1898- let claimedAsset = $t06362163719._2
1899- let claimedAmount = $t06362163719._1
1912+ let claimedAsset = $t06403964137._2
1913+ let claimedAmount = $t06403964137._1
19001914 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance), AId, BId, balA, balB, shareId)
19011915 }
19021916 else throw("Strict value is not equal to itself.")
19031917 }))
19041918
19051919
19061920
19071921 @Callable(i)
19081922 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow,canPMarket) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
19091923 then (type != WX_POOL)
19101924 else false)
19111925 then throw("Wrong type")
19121926 else if (if ((poolType != CPMM))
19131927 then (poolType != FLAT)
19141928 else false)
19151929 then throw("Wrong pool type")
19161930 else {
1917- let $t06432664420 = getPoolData(Address(fromBase58String(poolAddr)), type)
1918- let aId = $t06432664420._1
1919- let bId = $t06432664420._2
1920- let aBal = $t06432664420._3
1921- let bBal = $t06432664420._4
1922- let shareId = $t06432664420._5
1931+ let $t06474464838 = getPoolData(Address(fromBase58String(poolAddr)), type)
1932+ let aId = $t06474464838._1
1933+ let bId = $t06474464838._2
1934+ let aBal = $t06474464838._3
1935+ let bBal = $t06474464838._4
1936+ let shareId = $t06474464838._5
19231937 if ((0 > inFeeNoLoan))
19241938 then throw("inFeeNoLoan must be greater than 0")
19251939 else if ((0 > inFeeLoan))
19261940 then throw("inFeeLoan must be greater than 0")
19271941 else if ((0 > capFeeNoLoan))
19281942 then throw("capFeeNoLoan must be greater than 0")
19291943 else if ((0 > capFeeWithLoan))
19301944 then throw("capFeeWithLoan must be greater than 0")
19311945 else if ((0 > stoplossFeeNoLoan))
19321946 then throw("stoplossFeeNoLoan must be greater than 0")
19331947 else if ((0 > stoplossFeeWithLoan))
19341948 then throw("stoplossFeeWithLoan must be greater than 0")
19351949 else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan), IntegerEntry((poolAddr + kPoolInterestLoan), 0), IntegerEntry((poolAddr + kPoolInterestNoLoan), 0), StringEntry((kPool + poolAddr), type), StringEntry((poolAddr + kPoolType), poolType), StringEntry((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow), BooleanEntry((poolAddr + kPoolPMArket), canPMarket)]
19361950 }))
19371951
19381952
19391953
19401954 @Callable(i)
19411955 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
19421956 then throw(("Can't find pool with addr " + poolAddr))
19431957 else if ((0 > inFeeNoLoan))
19441958 then throw("inFeeNoLoan must be greater than 0")
19451959 else if ((0 > inFeeLoan))
19461960 then throw("inFeeLoan must be greater than 0")
19471961 else if ((0 > capFeeNoLoan))
19481962 then throw("capFeeNoLoan must be greater than 0")
19491963 else if ((0 > capFeeWithLoan))
19501964 then throw("capFeeWithLoan must be greater than 0")
19511965 else if ((0 > stoplossFeeNoLoan))
19521966 then throw("stoplossFeeNoLoan must be greater than 0")
19531967 else if ((0 > stoplossFeeWithLoan))
19541968 then throw("stoplossFeeWithLoan must be greater than 0")
19551969 else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan)]))
19561970
19571971
19581972
19591973 @Callable(i)
19601974 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
19611975 then throw("dApp already active")
19621976 else [BooleanEntry(kActive, true)])
19631977
19641978
19651979
19661980 @Callable(i)
19671981 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
19681982 then throw("dApp already shutdown")
19691983 else [BooleanEntry(kActive, false)])
19701984
19711985
19721986
19731987 @Callable(i)
19741988 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
19751989 then throw("dApp already active for users")
19761990 else [BooleanEntry(kActiveUsers, true)])
19771991
19781992
19791993
19801994 @Callable(i)
19811995 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
19821996 then throw("dApp already shutdown for users")
19831997 else [BooleanEntry(kActiveUsers, false)])
19841998
19851999
19862000
19872001 @Callable(i)
19882002 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
19892003 then throw("SWOPFI already active")
19902004 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
19912005
19922006
19932007
19942008 @Callable(i)
19952009 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
19962010 then throw("SWOPFI already shutdown")
19972011 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
19982012
19992013
20002014
20012015 @Callable(i)
20022016 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
20032017 then throw("WX already active")
20042018 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
20052019
20062020
20072021
20082022 @Callable(i)
20092023 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
20102024 then throw("WX already shutdown")
20112025 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
20122026
20132027
20142028
20152029 @Callable(i)
20162030 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
20172031 then throw("Unknown pool")
20182032 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
20192033 then throw("Pool already active")
20202034 else [BooleanEntry((pool + kPoolActive), true)])
20212035
20222036
20232037
20242038 @Callable(i)
20252039 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
20262040 then throw("Unknown pool")
20272041 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
20282042 then throw("Pool already shutdown")
20292043 else [BooleanEntry((pool + kPoolActive), false)])
20302044
20312045
20322046 @Verifier(tx)
20332047 func verify () = {
20342048 let multiSignedByAdmins = {
20352049 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
20362050 then 1
20372051 else 0
20382052 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group1Admin2PK))
20392053 then 1
20402054 else 0
20412055 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], group1Admin3PK))
20422056 then 1
20432057 else 0
20442058 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
20452059 }
20462060 multiSignedByAdmins
20472061 }
20482062

github/deemru/w8io/3ef1775 
261.61 ms