tx · DhqQtkKkCNLR2zhKL1w7xxKA6VsT3gYVxv4ZrSCA9uL9

3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW:  -0.07600000 Waves

2024.04.08 11:34 [4119499] smart account 3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW > SELF 0.00000000 Waves

{ "type": 13, "id": "DhqQtkKkCNLR2zhKL1w7xxKA6VsT3gYVxv4ZrSCA9uL9", "fee": 7600000, "feeAssetId": null, "timestamp": 1712565271023, "version": 2, "chainId": 87, "sender": "3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW", "senderPublicKey": "9D3NMf2PEttfNTb8Hk2nbXukn2b2xmoTsZSqQrhvyeN", "proofs": [ "", "3hmJnnqNLz8bpnJz7hzw4qKP6YKohwrpEHKWHiEBw7KYHgacyNgWyQoqkNtNDijTJwQLYWNYxcYYJK3pErTtZSUx", "5c7NyUkPbZFonWBBVtqyFcDQveBSf2fj4vTDVi1NSrNFbd5m2n1ZV7CQ78ehLLFt2CG7jF6pWR5Vs9MPU1rxHy5j" ], "script": "base64:BgKsAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBgoECAEIBBIECgIIARIFCgMIAQgSBgoEAQgIARIFCgMBCAgSDwoNCAgICAgICAgICAgICBIDCgEIEgMKAQgSBQoDCAgBEgYKBAgBCAgSBwoFCAgIAQQSBQoDCAQBEg4KDAgICAEBAQEBAQQECBIJCgcIAQEBAQEBEgASABIAEgASABIAEgASABIDCgEIEgMKAQibAQAEQ09ORgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIGY29uZmlnAAdTRl9QT09MAgJTRgAHV1hfUE9PTAICV1gABENQTU0CBGNwbW0ABEZMQVQCBGZsYXQAD0NBUF9GRUVfTk9fTE9BTgIJY2FwTm9Mb2FuAAxDQVBfRkVFX0xPQU4CB2NhcExvYW4AFFNUT1BMT1NTX0ZFRV9OT19MT0FOAg5zdG9wTG9zc05vTG9hbgANU1RPUExPU1NfTE9BTgIMc3RvcExvc3NMb2FuAAhMT0FOX0ZFRQIEbG9hbgALTk9fTE9BTl9GRUUCBm5vTG9hbgAGTk9fRkVFAgVub0ZlZQAGU0NBTEU4AIDC1y8AB1NDQUxFMTAAgMivoCUAB1NDQUxFMTYJALYCAQCAgIT+pt7hEQAKRkVFX1NDQUxFNgDAhD0AFGtTRlBvb2xBQXNzZXRCYWxhbmNlAg9BX2Fzc2V0X2JhbGFuY2UAFGtTRlBvb2xCQXNzZXRCYWxhbmNlAg9CX2Fzc2V0X2JhbGFuY2UAD2tTRlBvb2xBQXNzZXRJZAIKQV9hc3NldF9pZAAPa1NGUG9vbEJBc3NldElkAgpCX2Fzc2V0X2lkAA5rU0ZQb29sU2hhcmVJZAIOc2hhcmVfYXNzZXRfaWQAEmtTRlBvb2xTaGFyZVN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AAprU0ZQb29sRmVlAgpjb21taXNzaW9uAA1rVXNlclBvc2l0aW9uAg1fdXNlclBvc2l0aW9uABFrVXNlclBvc2l0aW9uUG9vbAIRX3VzZXJQb3NpdGlvblBvb2wAEWtVc2VyQm9ycm93QW1vdW50AhlfdXNlclBvc2l0aW9uQm9ycm93QW1vdW50ABJrVXNlckJvcnJvd0Fzc2V0SWQCGl91c2VyUG9zaXRpb25Cb3Jyb3dBc3NldElkABBrVXNlclBvc2l0aW9uTnVtAhNfdXNlclBvc2l0aW9uTnVtYmVyABVrVXNlclBvc2l0aW9uSW50ZXJlc3QCFV91c2VyUG9zaXRpb25JbnRlcmVzdAAWa1VzZXJQb3NpdGlvbkluUE1hcmtldAIUX3VzZXJQb3NpdGlvblBNYXJrZXQACmtQb29sVG90YWwCCl9wb29sVG90YWwADmtQb29sVG90YWxMb2FuAg5fcG9vbFRvdGFsTG9hbgAQa1Bvb2xUb3RhbE1hcmtldAIQX3Bvb2xUb3RhbE1hcmtldAAUa1Bvb2xUb3RhbE1hcmtldExvYW4CFF9wb29sVG90YWxNYXJrZXRMb2FuABFrUG9vbEludGVyZXN0TG9hbgIRX3Bvb2xJbnRlcmVzdExvYW4AE2tQb29sSW50ZXJlc3ROb0xvYW4CE19wb29sSW50ZXJlc3ROb0xvYW4AF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuAhdfcG9vbEludGVyZXN0TWFya2V0TG9hbgAZa1Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgIZX3Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgAYa1Bvb2xBbGxvd2VkQm9ycm93QXNzZXRzAhhfcG9vbEFsbG93ZWRCb3Jyb3dBc3NldHMADmtQb29sQ2FuQm9ycm93Ag5fcG9vbENhbkJvcnJvdwAMa1Bvb2xQTUFya2V0AhFfcG9vbFB1enpsZU1hcmtldAAVa0F4bHlJbkZlZVdpdGhvdXRMb2FuAg5fYXhseUZlZU5vTG9hbgASa0F4bHlJbkZlZVdpdGhMb2FuAhBfYXhseUZlZVdpdGhMb2FuABFrQXhseU5vTG9hbkNhcEZlZQIRX2F4bHlGZWVDYXBOb0xvYW4AE2tBeGx5V2l0aExvYW5DYXBGZWUCE19heGx5RmVlQ2FwV2l0aExvYW4AFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUCGF9heGx5RmVlU3RvcGxvc3NXaXRoTG9hbgAUa0F4bHlTdG9wTG9zc0xvYW5GZWUCFl9heGx5RmVlU3RvcGxvc3NOb0xvYW4ACmtSZXF1ZXN0SWQCC19yZXF1ZXN0X2lkAAxrUmVxdWVzdEl0ZXICDXJlcXVlc3RzX2l0ZXIABWtQb29sAgVwb29sXwAJa1Bvb2xUeXBlAglfcG9vbFR5cGUACmtTaGFyZVBvb2wCDF9wb29sU2hhcmVJZAAOa1Bvb2xDYXBDaGFuZ2UCDl9wb29sQ2FwQ2hhbmdlAA9rVG9rZW5MYXN0UHJpY2UCCmxhc3RfcHJpY2UADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCAAdrQWN0aXZlAgZhY3RpdmUADGtBY3RpdmVVc2VycwILYWN0aXZlVXNlcnMAC2tBY3RpdmVTRldYAgdfYWN0aXZlAAtrUG9vbEFjdGl2ZQILX2FjdGl2ZVBvb2wADWtVc2VyU3RvcExvc3MCCV9zdG9wTG9zcwAXa0ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkCF19mYWxsYmFja0V4Y2hhbmdlU3dvcGZpAA5rUG9vbFByb3h5QWRkcgIRX3Bvb2xQcm94eUFkZHJlc3MACWtNb25leUJveAIOYXhseV9tb25leV9ib3gADmtTRkZhcm1pbmdBZGRyAhNzd29wZmlfZmFybWluZ19hZGRyAAxrTGVuZFNlcnZpY2UCEWxlbmRfc2VydmljZV9hZGRyAA9rT3BlcmF0b3JDYWxsUEsCEmFkbWluX2NhbGxfcHViX2tleQAMa1ByaWNlT3JhY2xlAgxwcmljZV9vcmFjbGUAC2tFeENvbnRyYWN0AhFleGNoYW5nZV9jb250cmFjdAAPa1d4U3dhcENvbnRyYWN0AhB3eF9zd2FwX2NvbnRyYWN0AAdrV3hSZXN0Agx3eF9yZXN0X2FkZHIAB2tTd29wSWQCB3N3b3BfaWQABWtXeElkAgV3eF9pZAAMa1BNYXJrZXRBZGRyAhVwdXp6bGVfbWFya2V0X2FkZHJlc3MAEGtQTWFya2V0UmVzdEFkZHICGnB1enpsZV9tYXJrZXRfcmVzdF9hZGRyZXNzAA9rR3JvdXAxQWRtaW4xUEsCFWdyb3VwMV9hZG1pbjFfcHViX2tleQAPa0dyb3VwMUFkbWluMlBLAhVncm91cDFfYWRtaW4yX3B1Yl9rZXkAD2tHcm91cDFBZG1pbjNQSwIVZ3JvdXAxX2FkbWluM19wdWJfa2V5AA9rR3JvdXAyQWRtaW4xUEsCFWdyb3VwMl9hZG1pbjFfcHViX2tleQAPa0dyb3VwMkFkbWluMlBLAhVncm91cDJfYWRtaW4yX3B1Yl9rZXkACG1vbmV5Qm94CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQtrRXhDb250cmFjdAIcTm8gZXhjaGFuZ2UgY29udHJhY3QgYWRkcmVzcwAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa1ByaWNlT3JhY2xlAhdObyBwcmljZSBvcmFjbGUgYWRkcmVzcwAOd3hTd2FwQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGd3hSZXN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUHa1d4UmVzdAISTm8gd3ggcmVzdCBhZGRyZXNzAAZTV09QSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFB2tTd29wSWQCCk5vIHN3b3AgaWQABFdYSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFBWtXeElkAghObyB3eCBpZAALcE1hcmtldEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQxrUE1hcmtldEFkZHICGE5vIHB1enpsZSBtYXJrZXQgYWRkcmVzcwAPcE1hcmtldFJlc3RBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUQa1BNYXJrZXRSZXN0QWRkcgIdTm8gcHV6emxlIG1hcmtldCByZXN0IGFkZHJlc3MADmdyb3VwMUFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4xUEsADmdyb3VwMUFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4yUEsADmdyb3VwMUFkbWluM1BLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4zUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4zUEsADmdyb3VwMkFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsADmdyb3VwMkFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsACm9wZXJhdG9yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsBD3Vua25vd25Qb29sVHlwZQAJAAIBAg9Xcm9uZyBwb29sIHR5cGUBDmdldExlbmRTcnZBZGRyAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFDGtMZW5kU2VydmljZQIbQ2FuJ3QgZ2V0IGxlbmQgc2VydmljZSBhZGRyAQ5pc09wZXJhdG9yQ2FsbAEBaQMDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQpvcGVyYXRvclBLBgkAAAIIBQFpBmNhbGxlcgUIbW9uZXlCb3gFBHVuaXQJAAIBAiRPbmx5IG9wZXJhdG9yIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BC2lzQWRtaW5DYWxsAQFpAwMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFDmdyb3VwMUFkbWluMVBLBgkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUOZ3JvdXAxQWRtaW4yUEsFBHVuaXQJAAIBAihPbmx5IGFkbWluIGdyb3VwMSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzTGFuZENhbGwBAWkDCQAAAggFAWkGY2FsbGVyCQEOZ2V0TGVuZFNydkFkZHIABQR1bml0CQACAQIpT25seSBsYW5kIGNvbnRyYWN0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCGlzQWN0aXZlAAMJAAACCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGBgUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBEGlzQWN0aXZlRm9yVXNlcnMAAwMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAACCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYGBwUEdW5pdAkAAgECKURBcHAgaXMgaW5hY3RpdmUgZm9yIHVzZXJzIGF0IHRoaXMgbW9tZW50AQxpc1Bvb2xBY3RpdmUCBHBvb2wEdHlwZQQKV1hTRkFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHR5cGUFC2tBY3RpdmVTRldYBgQKcG9vbEFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgMDBQpXWFNGQWN0aXZlBQpwb29sQWN0aXZlBwYHAQ5hY2NvdW50QmFsYW5jZQEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA8AcCBQR0aGlzBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAAIBAgtNYXRjaCBlcnJvcgERZ2V0U0ZQb29sQmFsYW5jZXMBCHBvb2xBZGRyCQCUCgIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUUa1NGUG9vbEFBc3NldEJhbGFuY2UCHkNhbid0IGdldCBwb29sIEEgYXNzZXQgYmFsYW5jZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQkFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBiYWxhbmNlARFnZXRXWFBvb2xCYWxhbmNlcwMIcG9vbEFkZHIDYUlkA2JJZAkAlAoCCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNhSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAPwHBAUIcG9vbEFkZHICHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUDYklkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBD2dldFBvb2xCYWxhbmNlcwQIcG9vbEFkZHIEdHlwZQNhSWQDYklkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARFnZXRTRlBvb2xCYWxhbmNlcwEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJARFnZXRXWFBvb2xCYWxhbmNlcwMFCHBvb2xBZGRyBQNhSWQFA2JJZAkBD3Vua25vd25Qb29sVHlwZQABDWdldFNGUG9vbERhdGEBCHBvb2xBZGRyBAskdDA5NzM5OTc4OAkBEWdldFNGUG9vbEJhbGFuY2VzAQUIcG9vbEFkZHIDCQAAAgULJHQwOTczOTk3ODgFCyR0MDk3Mzk5Nzg4BARiYWxCCAULJHQwOTczOTk3ODgCXzIEBGJhbEEIBQskdDA5NzM5OTc4OAJfMQkAlwoFCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xBQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ9rU0ZQb29sQkFzc2V0SWQCGUNhbid0IGdldCBwb29sIEIgYXNzZXQgaWQFBGJhbEEFBGJhbEIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUOa1NGUG9vbFNoYXJlSWQCGENhbid0IGdldCBzaGFyZSBhc3NldCBpZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgENZ2V0V1hQb29sRGF0YQEIcG9vbEFkZHIEA2NmZwoAAUAJAPwHBAUIcG9vbEFkZHICHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQNjZmcFA2NmZwQDYUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAEAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAQDYklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAFAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAQHc2hhcmVJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcAAwMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGkNhbid0IGdldCBwb29sIExQIGFzc2V0IGlkBA0kdDAxMDQ4NTEwNTQ0CQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQDCQAAAgUNJHQwMTA0ODUxMDU0NAUNJHQwMTA0ODUxMDU0NAQEYmFsQggFDSR0MDEwNDg1MTA1NDQCXzIEBGJhbEEIBQ0kdDAxMDQ4NTEwNTQ0Al8xCQCXCgUFA2FJZAUDYklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRQb29sRGF0YQIIcG9vbEFkZHIEdHlwZQMJAAACBQR0eXBlBQdTRl9QT09MCQENZ2V0U0ZQb29sRGF0YQEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJAQ1nZXRXWFBvb2xEYXRhAQUIcG9vbEFkZHIJAQ91bmtub3duUG9vbFR5cGUAAQ5nZXRTaGFyZVN1cHBseQMIcG9vbEFkZHIEdHlwZQdzaGFyZUlkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUSa1NGUG9vbFNoYXJlU3VwcGx5AhxDYW4ndCBnZXQgc2hhcmUgYXNzZXQgc3VwcGx5AwkAAAIFBHR5cGUFB1dYX1BPT0wICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQdzaGFyZUlkAg1Xcm9uZyBTaGFyZUlkCHF1YW50aXR5CQEPdW5rbm93blBvb2xUeXBlAAERZ2V0UG9vbFRvdGFsU2hhcmUBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQprUG9vbFRvdGFsAAABGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgAAARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBHVzZXIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQAAAAEBCmdldEF4bHlGZWUCBHBvb2wHZmVlVHlwZQMJAAACBQdmZWVUeXBlBQxDQVBfRkVFX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa0F4bHlXaXRoTG9hbkNhcEZlZQMJAAACBQdmZWVUeXBlBQ9DQVBfRkVFX05PX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa0F4bHlOb0xvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUITE9BTl9GRUUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUSa0F4bHlJbkZlZVdpdGhMb2FuAwkAAAIFB2ZlZVR5cGUFC05PX0xPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgMJAAACBQdmZWVUeXBlBQZOT19GRUUAAAkAAgECDldyb25nIGZlZSB0eXBlARBnZXRTRkZhcm1pbmdBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ5rU0ZGYXJtaW5nQWRkcgIdQ2FuJ3QgZ2V0IHN3b3BmaSBmYXJtaW5nIGFkZHIBEGdldFdYRmFybWluZ0FkZHIBCHBvb2xBZGRyBAlmQ29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIECmZhY3Ryb3lDZmcJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCWZDb250cmFjdAIRJXNfX2ZhY3RvcnlDb25maWcCGENhbid0IGdldCBXWCBmYWN0b3J5IGNmZwICX18JAQdBZGRyZXNzAQkA2QQBCQCRAwIFCmZhY3Ryb3lDZmcAAQEMYXNzZXRJZFRvU3RyAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECDE5vdCBBc3NldCBpZAEOYXNzZXRJZEZyb21TdHIBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2l0aW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BDmdldEFzc2V0c1ByaWNlAQhhc3NldElkcwoBCWdldFByaWNlcwIBYQdhc3NldElkBAphc3NldFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BCQDNCAIFAWEFCmFzc2V0UHJpY2UKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyAQ1nZXRTaGFyZVByaWNlAQdzaGFyZUlkBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sAiBDYW4ndCBmaW5kIHBvb2wgYWRkciBieSBzaGFyZSBpZAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMTM1MzMxMzU5OAkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANhSWQIBQ0kdDAxMzUzMzEzNTk4Al8xBANiSWQIBQ0kdDAxMzUzMzEzNTk4Al8yBAhhQmFsYW5jZQgFDSR0MDEzNTMzMTM1OTgCXzMECGJCYWxhbmNlCAUNJHQwMTM1MzMxMzU5OAJfNAQGcHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQHZFByaWNlQQkAkQMCBQZwcmljZXMAAAQHZFByaWNlQgkAkQMCBQZwcmljZXMAAQQKQVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB3NoYXJlSWQAAAAABQRET1dOBAtzaGFyZVN1cHBseQkBDmdldFNoYXJlU3VwcGx5AwUIcG9vbEFkZHIFBXBUeXBlBQdzaGFyZUlkBANzdW0DAwkAZgIFB2RQcmljZUEAAAkAZgIFB2RQcmljZUIAAAcJAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgMJAGYCBQdkUHJpY2VBAAAJAGgCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24AAgMJAGYCBQdkUHJpY2VCAAAJAGgCCQBrAwUIYkJhbGFuY2UFB2RQcmljZUIFCkJQcmVjaXNpb24AAgD///////////8BAwkAZgIAAAUDc3VtAP///////////wEJAGsDBQNzdW0FDnNoYXJlUHJlY2lzaW9uBQtzaGFyZVN1cHBseQEOZ2V0U2hhcmVQcmljZXMBCHNoYXJlSWRzCgEJZ2V0UHJpY2VzAgFhB3NoYXJlSWQJAM0IAgUBYQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCgACJGwFCHNoYXJlSWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAEOZ2V0Q3Vyc0VudHJpZXMEA2FJZANiSWQHc2hhcmVJZAh3QW1vdW50cwQMYXNzZXRzUHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQKc2hhcmVQcmljZQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkBAZwcmljZXMJAM4IAgkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAAJAMwIAgkApAMBCQCRAwIFDGFzc2V0c1ByaWNlcwABCQDMCAIJAKQDAQUKc2hhcmVQcmljZQUDbmlsBQh3QW1vdW50cwkAzAgCCQELU3RyaW5nRW50cnkCBQ9rVG9rZW5MYXN0UHJpY2UJALkJAgUGcHJpY2VzAgEsBQNuaWwBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwkFcFR5cGUIcG9vbEFkZHIETFBJZARwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIDCQAAAgUFcFR5cGUFB1NGX1BPT0wEBHJlcGwKAAFACQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIgY2FsY0xQUmVwbGVuaXNoVHdvVG9rZW5zUkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFBHBtdEEJAMwIAgkApAMBBQRwbXRCBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQRyZXBsBQRyZXBsCQCXCgUKAAFACQCRAwIFBHJlcGwAAwMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwABAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAQxhc3NldElkVG9TdHIBCQCRAwIFBHJlcGwAAgoAAUAJAJEDAgUEcmVwbAAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTUzNTMxNTYxOQkAlAoCCQC1CQIKAAFACQD8BwQFBnd4UmVzdAIkcG9vbEV2YWx1YXRlUHV0QnlBbW91bnRBc3NldFJFQURPTkxZCQDMCAIFBExQSWQJAMwIAgUEcG10QQUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwkAtQkCCgABQAkA/AcEBQZ3eFJlc3QCI3Bvb2xFdmFsdWF0ZVB1dEJ5UHJpY2VBc3NldFJFQURPTkxZCQDMCAIFBExQSWQJAMwIAgUEcG10QgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQ0kdDAxNTM1MzE1NjE5BQ0kdDAxNTM1MzE1NjE5BApldmFsUHV0SW5CCAUNJHQwMTUzNTMxNTYxOQJfMgQKZXZhbFB1dEluQQgFDSR0MDE1MzUzMTU2MTkCXzEEBWxwSW5BCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQABBAVscEluQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIAAQMJAGYCBQVscEluQgUFbHBJbkEEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEACAkAlwoFBQRwbXRBBQNwbXQJAGUCBQRwbXRCBQNwbXQFA2JJZAUFbHBJbkIEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIABwkAlwoFBQNwbXQFBHBtdEIJAGUCBQRwbXRBBQNwbXQFA2FJZAUFbHBJbkEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUHCHBvb2xBZGRyBXBUeXBlBHBtdEEDYUlkBHBtdEIDYklkBGxwSWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNhSWQFBHBtdEEJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2JJZAUEcG10QgUDbmlsBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQ5rUG9vbFByb3h5QWRkcgIAAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwkAzAgCCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhwb29sQWRkcgIDcHV0CQDMCAIAwIQ9CQDMCAIHBQNuaWwFCHBheW1lbnRzCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgIUd3hSZXBsZW5pc2hUd29Ub2tlbnMJAMwIAgkApQgBBQhwb29sQWRkcgkAzAgCBQRscElkCQDMCAIAwIQ9CQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEXcmVwbGVuaXNoT25lVG9rZW5CeVR5cGUFCHBvb2xBZGRyBXBUeXBlA3BtdAVwbXRJZARscElkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUFcG10SWQFA3BtdAUDbmlsBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQ5rUG9vbFByb3h5QWRkcgIAAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIVcmVwbGVuaXNoV2l0aE9uZVRva2VuCQDMCAIJAMwIAgIBMAkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wEAmZjAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQlrUG9vbFR5cGUCBGNwbW0FBEZMQVQCC3B1dE9uZVRrblYyAglwdXRPbmVUa24DCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIcG9vbEFkZHIFAmZjCQDMCAIAAAkAzAgCBwUDbmlsBQhwYXltZW50cwkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQlwcm94eUFkZHICE3d4UmVwbGVuaXNoT25lVG9rZW4JAMwIAgkApQgBBQhwb29sQWRkcgkAzAgCBQRscElkCQDMCAIFAmZjCQDMCAIAAAkAzAgCBwUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABB3N0YWtlTFAFBHBvb2wFcFR5cGUHc2hhcmVJZAZhbW91bnQNc3Rha2VUb01hcmtldAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAUGYW1vdW50BQNuaWwECXByb3h5QWRkcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sUHJveHlBZGRyAgADBQ1zdGFrZVRvTWFya2V0CQD8BwQFC3BNYXJrZXRBZGRyAgZzdXBwbHkFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCAAAFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wECGZhcm1BZGRyCQEQZ2V0V1hGYXJtaW5nQWRkcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wDCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIZmFybUFkZHICBXN0YWtlBQNuaWwFCHBheW1lbnRzCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgIJd3hTdGFrZUxwCQDMCAIJAKUIAQUIZmFybUFkZHIFA25pbAUIcGF5bWVudHMJAQ91bmtub3duUG9vbFR5cGUAAQl1bnN0YWtlTFAFBHBvb2wFcFR5cGUHc2hhcmVJZAZhbW91bnQKZnJvbU1hcmtldAQJcHJveHlBZGRyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAQNJHQwMTgzNTYxOTAzOAMFCmZyb21NYXJrZXQJAJUKAwULcE1hcmtldEFkZHICCHdpdGhkcmF3CQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAJUKAwkBEGdldFNGRmFybWluZ0FkZHIAAhN3aXRoZHJhd1NoYXJlVG9rZW5zCQDMCAIFBHBvb2wJAMwIAgUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1dYX1BPT0wECGZhcm1BZGRyCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAwkAAAIFCXByb3h5QWRkcgIACQCVCgMFCGZhcm1BZGRyAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAJUKAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAgt3eFVuc3Rha2VMcAkAzAgCCQClCAEFCGZhcm1BZGRyCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAQ91bmtub3duUG9vbFR5cGUABAhmYXJtQWRkcggFDSR0MDE4MzU2MTkwMzgCXzEEBWZOYW1lCAUNJHQwMTgzNTYxOTAzOAJfMgQGcGFyYW1zCAUNJHQwMTgzNTYxOTAzOAJfMwQDaW52CQD8BwQFCGZhcm1BZGRyBQVmTmFtZQUGcGFyYW1zBQNuaWwDCQAAAgUDaW52BQNpbnYFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAbgQFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBQdDRUlMSU5HBA0kdDAxOTQ2MDE5NzY2AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxCCQBlAgUEYmFsQQUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEEJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE5NDYwMTk3NjYCXzEECmFzc2V0VG9QYXkIBQ0kdDAxOTQ2MDE5NzY2Al8yCQCUCgIFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5AQ1nZXRXWFN3YXBGZWVzAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDnBvb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQScHJvdG9jb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEByRtYXRjaDAJAPwHBAUJZkNvbnRyYWN0AhJnZXRTd2FwRmVlUkVBRE9OTFkJAMwIAgkApQgBBQhwb29sQWRkcgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQEZmVlcwUHJG1hdGNoMAkAlAoCCAUEZmVlcwJfMQgFBGZlZXMCXzIJAJQKAgUOcG9vbEZlZURlZmF1bHQFEnByb3RvY29sRmVlRGVmYXVsdAEQZ2V0V1hQb29sUmV2ZXJzZQMIcG9vbEFkZHIHYXNzZXRJbghhc3NldE91dAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDGxwTm9uUmV2ZXJzZQoAAUAJAPwHBAUJZkNvbnRyYWN0AiBnZXRMcEFzc2V0RnJvbVBvb2xBc3NldHNSRUFET05MWQkAzAgCBQdhc3NldEluCQDMCAIFCGFzc2V0T3V0BQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQECWxwUmV2ZXJzZQoAAUAJAPwHBAUJZkNvbnRyYWN0AiBnZXRMcEFzc2V0RnJvbVBvb2xBc3NldHNSRUFET05MWQkAzAgCBQhhc3NldE91dAkAzAgCBQdhc3NldEluBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQDCQECIT0CBQxscE5vblJldmVyc2UFBHVuaXQHAwkBAiE9AgUJbHBSZXZlcnNlBQR1bml0BgkAAgECEVBvb2wgaXMgbm90IGV4aXN0AQ1jYWxjRmxhdFRvUGF5BwRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAQHYXNzZXRJbgMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBQhhc3NldElkQgUIYXNzZXRJZEEECGFtb3V0R2V0CgABQAkA/AcEBQ53eFN3YXBDb250cmFjdAIVc3dhcENhbGN1bGF0ZVJFQURPTkxZCQDMCAIFEGFtb3VudFRva2VuVG9HZXQJAMwIAgUHYXNzZXRJbgkAzAgCBQ9hc3NldFRva2VuVG9HZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQhhbW91dEdldAUIYW1vdXRHZXQDCQAAAgUIYW1vdXRHZXQFEGFtb3VudFRva2VuVG9HZXQJAJQKAgUHYXNzZXRJbgUQYW1vdW50VG9rZW5Ub0dldAQNJHQwMjEzNzkyMTgzMAQDYVBNAwkAZgIFEGFtb3VudFRva2VuVG9HZXQFCGFtb3V0R2V0CQBrAwUQYW1vdW50VG9rZW5Ub0dldABuAGQJAGsDBRBhbW91bnRUb2tlblRvR2V0AFoAZAQMYW1vdW50R2V0TWF4CgABQAkA/AcEBQ53eFN3YXBDb250cmFjdAIVc3dhcENhbGN1bGF0ZVJFQURPTkxZCQDMCAIFA2FQTQkAzAgCBQdhc3NldEluCQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFDGFtb3VudEdldE1heAUMYW1vdW50R2V0TWF4AwkAZgIFCGFtb3V0R2V0BQxhbW91bnRHZXRNYXgJAJQKAgUDYVBNCQBrAwUDYVBNAG4AZAkAlAoCBRBhbW91bnRUb2tlblRvR2V0BQNhUE0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDmFtb3VudFRvUGF5TWluCAUNJHQwMjEzNzkyMTgzMAJfMQQOYW1vdW50VG9QYXlNYXgIBQ0kdDAyMTM3OTIxODMwAl8yCgEDaGRtAgFhBWluZGV4BA0kdDAyMTg3NzIxODk4BQFhBANwYXkIBQ0kdDAyMTg3NzIxODk4Al8xBAZwYXlNYXgIBQ0kdDAyMTg3NzIxODk4Al8yBAdwYXlOZXh0CQBpAgkAZAIFA3BheQUGcGF5TWF4AAIEDWFtb3VudEdldE5leHQKAAFACQD8BwQFDnd4U3dhcENvbnRyYWN0AhVzd2FwQ2FsY3VsYXRlUkVBRE9OTFkJAMwIAgUHcGF5TmV4dAkAzAgCBQdhc3NldEluCQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFDWFtb3VudEdldE5leHQFDWFtb3VudEdldE5leHQDCQBmAgUQYW1vdW50VG9rZW5Ub0dldAUNYW1vdW50R2V0TmV4dAkAlAoCBQdwYXlOZXh0BQZwYXlNYXgJAJQKAgUDcGF5BQdwYXlOZXh0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAxyZXNBbW50VG9QYXkKAAIkbAkAzAgCAAEJAMwIAgACBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFDmFtb3VudFRvUGF5TWluBQ5hbW91bnRUb1BheU1heAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDaGRtAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgQLYW1vdW50VG9QYXkDCQBmAgUQYW1vdW50VG9rZW5Ub0dldAUIYW1vdXRHZXQIBQxyZXNBbW50VG9QYXkCXzIIBQxyZXNBbW50VG9QYXkCXzEJAJQKAgUHYXNzZXRJbgULYW1vdW50VG9QYXkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BEWNhbGNBbW91bnRUb1BheVdYBwRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAQNJHQwMjI0OTQyMjUzMwkBDWdldFdYU3dhcEZlZXMBBQRwb29sBARwRmVlCAUNJHQwMjI0OTQyMjUzMwJfMQQFcHJGZWUIBQ0kdDAyMjQ5NDIyNTMzAl8yBAhwb29sVHlwZQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFCWtQb29sVHlwZQUEQ1BNTQQIZmVlU2NhbGUJALYCAQCAwtcvAwkAAAIFCHBvb2xUeXBlBQRGTEFUCQENY2FsY0ZsYXRUb1BheQcFBHBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUEYmFsQQUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BA0kdDAyMjc2NjIzMDc0AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBrAwUQYW1vdW50VG9rZW5Ub0dldAUEYmFsQgkAZQIFBGJhbEEFEGFtb3VudFRva2VuVG9HZXQJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEEJAGUCBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQQQLYW1vdW50VG9QYXkIBQ0kdDAyMjc2NjIzMDc0Al8xBAphc3NldFRvUGF5CAUNJHQwMjI3NjYyMzA3NAJfMgQSYW1vdW50VG9QYXlXaXRoRmVlCQCgAwEJAL0CBAkAtgIBBQthbW91bnRUb1BheQUIZmVlU2NhbGUJALgCAgUIZmVlU2NhbGUJALYCAQkAZAIFBXByRmVlBQRwRmVlBQdDRUlMSU5HCQCUCgIFCmFzc2V0VG9QYXkFEmFtb3VudFRvUGF5V2l0aEZlZQEQZXhjaGFuZ2VEaXJlY3RseQgFcFR5cGUEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQEBnBvb2xGQgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAgADAwkAAAIFBXBUeXBlBQdTRl9QT09MBgkBAiE9AgUGcG9vbEZCAgAEDSR0MDIzNTE1MjM3MjcDCQAAAgUGcG9vbEZCAgAJAJUKAwUEYmFsQQUEYmFsQgUEcG9vbAQNJHQwMjM2MjEyMzY5NAkBEWdldFNGUG9vbEJhbGFuY2VzAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUGcG9vbEZCBAZzZkJhbEEIBQ0kdDAyMzYyMTIzNjk0Al8xBAZzZkJhbEIIBQ0kdDAyMzYyMTIzNjk0Al8yCQCVCgMFBnNmQmFsQQUGc2ZCYWxCBQZwb29sRkIEBXBCYWxBCAUNJHQwMjM1MTUyMzcyNwJfMQQFcEJhbEIIBQ0kdDAyMzUxNTIzNzI3Al8yBAZleFBvb2wIBQ0kdDAyMzUxNTIzNzI3Al8zBA0kdDAyMzczMjIzODU4CQERY2FsY0Ftb3VudFRvUGF5U0YHBQZleFBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUFcEJhbEEFBXBCYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAyMzczMjIzODU4Al8xBAthbW91bnRUb1BheQgFDSR0MDIzNzMyMjM4NTgCXzIJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUGZXhQb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCCQCkAwEFEGFtb3VudFRva2VuVG9HZXQFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQphc3NldFRvUGF5BQthbW91bnRUb1BheQUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAyNDA2MDI0MTgyCQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBGJhbEEFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDI0MDYwMjQxODICXzEEC2Ftb3VudFRvUGF5CAUNJHQwMjQwNjAyNDE4MgJfMgkA/AcEBQ53eFN3YXBDb250cmFjdAIEc3dhcAkAzAgCBRBhbW91bnRUb2tlblRvR2V0CQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAkBD3Vua25vd25Qb29sVHlwZQABFWV4Y2hhbmdlRGlyZWN0bHlOb0xpbQUFcFR5cGUEcG9vbA1hbW91bnRUb2tlbkV4DmFzc2V0VG9rZW5Ub0V4D2Fzc2V0VG9rZW5Ub0dldAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQ9hc3NldFRva2VuVG9HZXQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEBnBvb2xGQgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAgAEA2ludgMDCQAAAgUFcFR5cGUFB1NGX1BPT0wGCQECIT0CBQZwb29sRkICAAQGZXhQb29sAwkAAAIFBnBvb2xGQgIABQRwb29sBQZwb29sRkIJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUGZXhQb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCAgExBQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUOYXNzZXRUb2tlblRvRXgFDWFtb3VudFRva2VuRXgFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkA/AcEBQ53eFN3YXBDb250cmFjdAIEc3dhcAkAzAgCAAEJAMwIAgUPYXNzZXRUb2tlblRvR2V0CQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQ5hc3NldFRva2VuVG9FeAUNYW1vdW50VG9rZW5FeAUDbmlsCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQIYmFsQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFD2Fzc2V0VG9rZW5Ub0dldAMJAAACBQhiYWxBZnRlcgUIYmFsQWZ0ZXIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQIcG9vbEFkZHIFcFR5cGUHc2hhcmVJZA91c2VyQ2FuV2l0aGRyYXcEDSR0MDI1MzExMjU3ODIDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhB3aXRoZHJhd1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2ludgUDaW52CQCUCgIKAAFACQCRAwIFA2ludgAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUDaW52AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJALUJAgoAAUAJAPwHBAUGd3hSZXN0Ahdwb29sRXZhbHVhdGVHZXRSRUFET05MWQkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNpbnYFA2ludgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAEB2Ftb3VudEEIBQ0kdDAyNTMxMTI1NzgyAl8xBAdhbW91bnRCCAUNJHQwMjUzMTEyNTc4MgJfMgkAlAoCBQdhbW91bnRBBQdhbW91bnRCAQtjbGFpbUZhcm1lZAIFcFR5cGUEcG9vbAQJcHJveHlBZGRyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQZTV09QSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDI2MjIyMjYzMDEJAQ1nZXRXWFBvb2xEYXRhAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQDYUlkCAUNJHQwMjYyMjIyNjMwMQJfMQQDYklkCAUNJHQwMjYyMjIyNjMwMQJfMgQEYUJhbAgFDSR0MDI2MjIyMjYzMDECXzMEBGJCYWwIBQ0kdDAyNjIyMjI2MzAxAl80BARscElkCAUNJHQwMjYyMjIyNjMwMQJfNQQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQRXWElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBAhmYXJtQWRkcgkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBANpbnYDCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIZmFybUFkZHICB2NsYWltV3gJAMwIAgUEbHBJZAUDbmlsBQNuaWwJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAg13eENsYWltRmFybWVkCQDMCAIJAKUIAQUIZmFybUFkZHIJAMwIAgUEbHBJZAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECGJhbEFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQRXWElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQRXWElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAEPcmVwbGVuaXNoQnlUeXBlCwVwVHlwZQRwb29sB2ZlZVR5cGUEcG10QQNhSWQEcG10QgNiSWQEYmFsQQRiYWxCBExQSWQLc3Rha2VNYXJrZXQED2xwQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkAwkAAAIFD2xwQmFsYW5jZUJlZm9yZQUPbHBCYWxhbmNlQmVmb3JlBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQNJHQwMjcxMDYyNzUzNAMDCQBmAgUEcG10QQAACQBmAgUEcG10QgAABwQNJHQwMjcxNzIyNzI5NAkBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwkFBXBUeXBlBQhwb29sQWRkcgUETFBJZAUEcG10QQUDYUlkBQRwbXRCBQNiSWQFBGJhbEEFBGJhbEIEBnBtdEluQQgFDSR0MDI3MTcyMjcyOTQCXzEEBnBtdEluQggFDSR0MDI3MTcyMjcyOTQCXzIEBmNoYW5nZQgFDSR0MDI3MTcyMjcyOTQCXzMECGNoYW5nZUlkCAUNJHQwMjcxNzIyNzI5NAJfNAQDaW52CQEYcmVwbGVuaXNoVHdvVG9rZW5zQnlUeXBlBwUIcG9vbEFkZHIFBXBUeXBlBQZwbXRJbkEFA2FJZAUGcG10SW5CBQNiSWQFBExQSWQDCQAAAgUDaW52BQNpbnYJAJQKAgUGY2hhbmdlBQhjaGFuZ2VJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAGYCBQRwbXRBAAAJAJQKAgUEcG10QQUDYUlkAwkAZgIFBHBtdEIAAAkAlAoCBQRwbXRCBQNiSWQJAAIBAhBwbXRzIG11c3QgYmUgPiAwBAZjaGFuZ2UIBQ0kdDAyNzEwNjI3NTM0Al8xBAhjaGFuZ2VJZAgFDSR0MDI3MTA2Mjc1MzQCXzIEA2ludgMJAGYCBQZjaGFuZ2UAAAkBF3JlcGxlbmlzaE9uZVRva2VuQnlUeXBlBQUIcG9vbEFkZHIFBXBUeXBlBQZjaGFuZ2UFCGNoYW5nZUlkBQRMUElkBQNuaWwDCQAAAgUDaW52BQNpbnYEDmxwQmFsYW5jZUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBCQDZBAEFBExQSWQEC3RvdGFsU3Rha2VkCQBlAgUObHBCYWxhbmNlQWZ0ZXIFD2xwQmFsYW5jZUJlZm9yZQQNYXhseUZlZUFtb3VudAkAawMFC3RvdGFsU3Rha2VkCQEKZ2V0QXhseUZlZQIFBHBvb2wFB2ZlZVR5cGUFCkZFRV9TQ0FMRTYEEXVzZXJTaGFyZUZvclN0YWtlCQBlAgULdG90YWxTdGFrZWQFDWF4bHlGZWVBbW91bnQDCQBnAgAABRF1c2VyU2hhcmVGb3JTdGFrZQkAAgECKGFtb3VudCBvZiBzdGFrZWQgc2hhcmV0b2tlbnMgbXVzdCBiZSA+IDAEBWludkxQCQEHc3Rha2VMUAUFBHBvb2wFBXBUeXBlBQRMUElkBRF1c2VyU2hhcmVGb3JTdGFrZQULc3Rha2VNYXJrZXQDCQAAAgUFaW52TFAFBWludkxQCQCUCgIFEXVzZXJTaGFyZUZvclN0YWtlBQ1heGx5RmVlQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARByZXBsZW5pc2hFbnRyaWVzCQRwb29sBHVzZXIMc3Rha2VkQW1vdW50DWF4bHlGZWVBbW91bnQGcG9zTnVtB3NoYXJlSWQEdHlwZQh3aXRoTG9hbg1zdGFrZVRvTWFya2V0BAt0b3RhbEFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQPdG90YWxBbW91bnRMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEEXRvdGFsQW1vdW50TWFya2V0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAAABBV0b3RhbEFtb3VudE1hcmtldExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgAABBJwb29sSW50ZXJlc3ROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAEEHBvb2xJbnRlcmVzdExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgAABBhwb29sSW50ZXJlc3RNYXJrZXROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuAAAEFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRdrUG9vbEludGVyZXN0TWFya2V0TG9hbgAABA0kdDAyODk5NTI5ODIwAwUId2l0aExvYW4DBQ1zdGFrZVRvTWFya2V0CQCUCgIFFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZAIFEXRvdGFsQW1vdW50TWFya2V0BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGQCBRV0b3RhbEFtb3VudE1hcmtldExvYW4FDHN0YWtlZEFtb3VudAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BgUDbmlsCQCUCgIFEHBvb2xJbnRlcmVzdExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGQCBQ90b3RhbEFtb3VudExvYW4FDHN0YWtlZEFtb3VudAUDbmlsAwUNc3Rha2VUb01hcmtldAkAlAoCBRhwb29sSW50ZXJlc3RNYXJrZXROb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZAIFEXRvdGFsQW1vdW50TWFya2V0BQxzdGFrZWRBbW91bnQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAYFA25pbAkAlAoCBRJwb29sSW50ZXJlc3ROb0xvYW4FA25pbAQPY3VyUG9vbEludGVyZXN0CAUNJHQwMjg5OTUyOTgyMAJfMQQHYWRFbnRyeQgFDSR0MDI4OTk1Mjk4MjACXzIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgULdG90YWxBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBQ1rVXNlclBvc2l0aW9uBQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUVa1VzZXJQb3NpdGlvbkludGVyZXN0BQ9jdXJQb29sSW50ZXJlc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sBQRwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0FBnBvc051bQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUNYXhseUZlZUFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwFB2FkRW50cnkBCWxpc3RUb0ludAIBYQRpdGVtCQDNCAIFAWEJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQEQZGlyZWN0U3dvcGZpQ1BNTQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBARwbXRQCQC1CQIJAJEDAgUFckFyZ3MAAgIBfAQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANwbXQJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEJAJEDAgUEcG10UAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcG10UAABBQNuaWwEC21pblRvUmVjaXZlCQCRAwIFBXJBcmdzAAMEA2ludgkA/AcEBQRkQXBwAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCBQttaW5Ub1JlY2l2ZQUDbmlsBQNuaWwFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZGlyZWN0Um91dGluZ1N3b3BmaQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA3BtdAQEcG10UAkAtQkCCQCRAwIFBXJBcmdzAAICAXwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQkAkQMCBQRwbXRQAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRwbXRQAAEFA25pbAQEYXJncwQFZUFyZ3MJALUJAgkAkQMCBQVyQXJncwADAgF8BApleGNoYW5nZXJzCQC1CQIJAJEDAgUFZUFyZ3MAAAIBLAQOZXhjaGFuZ2Vyc1R5cGUJALUJAgkAkQMCBQVlQXJncwABAgEsBAVhcmdzMQoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAgIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADBAVhcmdzMgoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADBBFyb3V0aW5nQXNzZXRzS2V5cwkAtQkCCQCRAwIFBWVBcmdzAAQCASwEC21pblRvUmVjaXZlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFZUFyZ3MABQkAzAgCBQpleGNoYW5nZXJzCQDMCAIFDmV4Y2hhbmdlcnNUeXBlCQDMCAIFBWFyZ3MxCQDMCAIFBWFyZ3MyCQDMCAIFEXJvdXRpbmdBc3NldHNLZXlzCQDMCAIFC21pblRvUmVjaXZlBQNuaWwEA2ludgkA/AcEBQRkQXBwAgxyb3V0aW5nVHJhZGUFBGFyZ3MFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEKY2FwaXRhbGl6ZQkEcG9vbAVwVHlwZQd0b2tlbklkC3Rva2VuQW1vdW50A0FJZANCSWQEYmFsQQRiYWxCB3NoYXJlSWQDAwkBAiE9AgUHdG9rZW5JZAUDQUlkCQECIT0CBQd0b2tlbklkBQNCSWQHCQACAQILV3JvbmcgYXNzZXQEEHRvdGFsU2hhcmVBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wDCQAAAgUQdG90YWxTaGFyZUFtb3VudAAACQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3Rva2VuQW1vdW50CQDZBAEFB3Rva2VuSWQFA25pbAAABBh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQRdG90YWxNYXJrZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0AAADCQBmAgAACQBlAgkAZQIFEHRvdGFsU2hhcmVBbW91bnQFEXRvdGFsTWFya2V0QW1vdW50BRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4JAAIBAkNFcnJvciB3aXRoIHNoYXJlIGFtb3VudCB0b3RhbFNoYXJlQW1vdW50IDwgdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBAtsb2FuUGVyY2VudAkAawMFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUGU0NBTEU4CQBlAgUQdG90YWxTaGFyZUFtb3VudAURdG90YWxNYXJrZXRBbW91bnQEEHRva2Vuc0ZvckZlZUxvYW4JAGsDBQt0b2tlbkFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQSdG9rZW5zRm9yRmVlTm9Mb2FuCQBlAgULdG9rZW5BbW91bnQFEHRva2Vuc0ZvckZlZUxvYW4EC2F4bHlGZWVMb2FuCQBrAwUQdG9rZW5zRm9yRmVlTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQxDQVBfRkVFX0xPQU4FCkZFRV9TQ0FMRTYEDWF4bHlGZWVOb0xvYW4JAGsDBRJ0b2tlbnNGb3JGZWVOb0xvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUPQ0FQX0ZFRV9OT19MT0FOBQpGRUVfU0NBTEU2BAdheGx5RmVlCQBkAgULYXhseUZlZUxvYW4FDWF4bHlGZWVOb0xvYW4EDSR0MDMyODk4MzI5OTgDCQAAAgUHdG9rZW5JZAUDQUlkCQCUCgIJAGUCBQt0b2tlbkFtb3VudAUHYXhseUZlZQAACQCUCgIAAAkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlBARwbXRBCAUNJHQwMzI4OTgzMjk5OAJfMQQEcG10QggFDSR0MDMyODk4MzI5OTgCXzIEDSR0MDMzMDAxMzMxMTIJAQ9yZXBsZW5pc2hCeVR5cGULBQVwVHlwZQUEcG9vbAUGTk9fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAcEDHN0YWtlZEFtb3VudAgFDSR0MDMzMDAxMzMxMTICXzEEAm5mCAUNJHQwMzMwMDEzMzExMgJfMgQTY3VyUG9vbEludGVyZXN0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuAAAEFWN1clBvb2xJbnRlcmVzdE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAQKc3Rha2VkTG9hbgkAawMFDHN0YWtlZEFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQMc3Rha2VkTm9Mb2FuCQBlAgUMc3Rha2VkQW1vdW50BQpzdGFrZWRMb2FuBA9uZXdJbnRlcmVzdExvYW4DCQBmAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAGQCBRNjdXJQb29sSW50ZXJlc3RMb2FuCQBrAwUKc3Rha2VkTG9hbgUHU0NBTEUxMAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAEEW5ld0ludGVyZXN0Tm9Mb2FuAwkAZgIJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFFWN1clBvb2xJbnRlcmVzdE5vTG9hbgkAawMFDHN0YWtlZE5vTG9hbgUHU0NBTEUxMAkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4FD25ld0ludGVyZXN0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuBRFuZXdJbnRlcmVzdE5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZAIFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUKc3Rha2VkTG9hbgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUHYXhseUZlZQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5JZAUDbmlsBQxzdGFrZWRBbW91bnQBFmNhcGl0YWxpemVQdXp6bGVNYXJrZXQDBHBvb2wFcFR5cGUHc2hhcmVJZAQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQNbWFya2V0QmFsYW5jZQkA8AcCBQtwTWFya2V0QWRkcgkA2QQBBQdzaGFyZUlkAwkAAAIFDW1hcmtldEJhbGFuY2UFDW1hcmtldEJhbGFuY2UED21hcmtldEF2YWlsYWJsZQoAAUAJAPwHBAUPcE1hcmtldFJlc3RBZGRyAhxhc3NldFN1cHBseUJ5QWRkcmVzc1JFQURPTkxZCQDMCAIJAKUIAQULcE1hcmtldEFkZHIJAMwIAgUHc2hhcmVJZAkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQ9tYXJrZXRBdmFpbGFibGUFD21hcmtldEF2YWlsYWJsZQQRdG90YWxNYXJrZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0AAAEGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgAAAwMJAAACBRF0b3RhbE1hcmtldEFtb3VudAAACQBmAgUPbWFya2V0QXZhaWxhYmxlAAAHBA51bnN0YWtlZEFtb3VudAkBCXVuc3Rha2VMUAUFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ9tYXJrZXRBdmFpbGFibGUGAwkAAAIFDnVuc3Rha2VkQW1vdW50BQ51bnN0YWtlZEFtb3VudAMJAGYCBQ1tYXJrZXRCYWxhbmNlBQ51bnN0YWtlZEFtb3VudAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQ51bnN0YWtlZEFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwAAAkAlAoCBQNuaWwAAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQJY2FwQW1vdW50CQBlAgUPbWFya2V0QXZhaWxhYmxlBRF0b3RhbE1hcmtldEFtb3VudAMJAGcCAAAFCWNhcEFtb3VudAkAlAoCBQNuaWwAAAQRbWFya2V0TG9hblBlcmNlbnQJAGsDBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuBQZTQ0FMRTgFEXRvdGFsTWFya2V0QW1vdW50BBZ0b2tlbnNNYXJrZXRGb3JGZWVMb2FuCQBrAwUJY2FwQW1vdW50BRFtYXJrZXRMb2FuUGVyY2VudAUGU0NBTEU4BBt0b2tlbnNNYXJrZXRGb3JGb3JGZWVOb0xvYW4JAGUCBQljYXBBbW91bnQFFnRva2Vuc01hcmtldEZvckZlZUxvYW4EEWF4bHlNYXJrZXRGZWVMb2FuCQBrAwUWdG9rZW5zTWFya2V0Rm9yRmVlTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQxDQVBfRkVFX0xPQU4FCkZFRV9TQ0FMRTYEE2F4bHlNYXJrZXRGZWVOb0xvYW4JAGsDBRt0b2tlbnNNYXJrZXRGb3JGb3JGZWVOb0xvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUPQ0FQX0ZFRV9OT19MT0FOBQpGRUVfU0NBTEU2BA1heGx5TWFya2V0RmVlCQBkAgURYXhseU1hcmtldEZlZUxvYW4FE2F4bHlNYXJrZXRGZWVOb0xvYW4DCQBmAgUNYXhseU1hcmtldEZlZQUNbWFya2V0QmFsYW5jZQkAlAoCBQNuaWwAAAQSc3Rha2VkTWFya2V0QW1vdW50CQBlAgUJY2FwQW1vdW50BQ1heGx5TWFya2V0RmVlBBBzdGFrZWRNYXJrZXRMb2FuCQBrAwUSc3Rha2VkTWFya2V0QW1vdW50BRFtYXJrZXRMb2FuUGVyY2VudAUGU0NBTEU4BBJzdGFrZWRNYXJrZXROb0xvYW4JAGUCBRJzdGFrZWRNYXJrZXRBbW91bnQFEHN0YWtlZE1hcmtldExvYW4EGWN1clBvb2xJbnRlcmVzdE1hcmtldExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRdrUG9vbEludGVyZXN0TWFya2V0TG9hbgAABBtjdXJQb29sSW50ZXJlc3RNYXJrZXROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuAAAEFW5ld0ludGVyZXN0TWFya2V0TG9hbgMJAGYCBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuAAAJAGQCBRljdXJQb29sSW50ZXJlc3RNYXJrZXRMb2FuCQBrAwUQc3Rha2VkTWFya2V0TG9hbgUHU0NBTEUxMAUZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgAABBduZXdJbnRlcmVzdE1hcmtldE5vTG9hbgMJAGYCCQBlAgURdG90YWxNYXJrZXRBbW91bnQFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4AAAkAZAIFG2N1clBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkAawMFEnN0YWtlZE1hcmtldE5vTG9hbgUHU0NBTEUxMAkAZQIFEXRvdGFsTWFya2V0QW1vdW50BRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuAAAEDnVuc3Rha2VkQW1vdW50CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFDWF4bHlNYXJrZXRGZWUGAwkAAAIFDnVuc3Rha2VkQW1vdW50BQ51bnN0YWtlZEFtb3VudAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuBRVuZXdJbnRlcmVzdE1hcmtldExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUZa1Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgUXbmV3SW50ZXJlc3RNYXJrZXROb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZAIFEXRvdGFsTWFya2V0QW1vdW50BRJzdGFrZWRNYXJrZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGQCBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuBRBzdGFrZWRNYXJrZXRMb2FuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQ1heGx5TWFya2V0RmVlCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQNuaWwFEnN0YWtlZE1hcmtldEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBQR1c2VyBHBvb2wFcG9zSWQIYm9ycm93ZWQLaXNNYXJrZXRQb3MEB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24EDHVzZXJJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QEEnBvb2xJbnRlcmVzdE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAQQcG9vbEludGVyZXN0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuAAAEGHBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFGWtQb29sSW50ZXJlc3RNYXJrZXROb0xvYW4AAAQWcG9vbEludGVyZXN0TWFya2V0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuAAAEDHBvb2xJbnRlcmVzdAMFCGJvcnJvd2VkAwULaXNNYXJrZXRQb3MFFnBvb2xJbnRlcmVzdE1hcmtldExvYW4FEHBvb2xJbnRlcmVzdExvYW4DBQtpc01hcmtldFBvcwUYcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuBRJwb29sSW50ZXJlc3ROb0xvYW4JAGQCBQdwQW1vdW50CQBrAwUHcEFtb3VudAkAZQIFDHBvb2xJbnRlcmVzdAUMdXNlckludGVyZXN0BQdTQ0FMRTEwAQ9jYWxjU3RvcExvc3NGZWUEBHBvb2wKaXNCb3Jyb3dlZAhzdG9wTG9zcwpscFdpdGhkcmF3BAdmZWVUeXBlAwUKaXNCb3Jyb3dlZAUNU1RPUExPU1NfTE9BTgUUU1RPUExPU1NfRkVFX05PX0xPQU4DBQhzdG9wTG9zcwkAawMFCmxwV2l0aGRyYXcJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgAAAQ53aXRoZHJhd1RvVXNlcgUEdXNlcgRwb29sBXBvc0lkCHN0b3BMb3NzDXdpdGhkcmF3VG9rZW4EB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24ECmZyb21NYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BwQKaXNCb3Jyb3dlZAkAZgIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAAAAAAED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwUFBHVzZXIFBHBvb2wFBXBvc0lkBQppc0JvcnJvd2VkBQpmcm9tTWFya2V0BA5wb29sVG90YWxTaGFyZQkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQScG9vbFRvdGFsU2hhcmVMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEEXRvdGFsTWFya2V0QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAAABBl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4AAAQIdXNlckFkZHIJAQdBZGRyZXNzAQkA2QQBBQR1c2VyBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDAzOTE2NjM5MjM4CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEBmlkQVN0cggFDSR0MDM5MTY2MzkyMzgCXzEEBmlkQlN0cggFDSR0MDM5MTY2MzkyMzgCXzIEBGJhbEEIBQ0kdDAzOTE2NjM5MjM4Al8zBARiYWxCCAUNJHQwMzkxNjYzOTIzOAJfNAQHc2hhcmVJZAgFDSR0MDM5MTY2MzkyMzgCXzUEDSR0MDM5MjQxMzkzMDgJAJQKAgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRBU3RyCQEOYXNzZXRJZEZyb21TdHIBBQZpZEJTdHIEA2lkQQgFDSR0MDM5MjQxMzkzMDgCXzEEA2lkQggFDSR0MDM5MjQxMzkzMDgCXzIEC3N0b3BMb3NzRmVlCQEPY2FsY1N0b3BMb3NzRmVlBAUEcG9vbAUKaXNCb3Jyb3dlZAUIc3RvcExvc3MFD3VzZXJDYW5XaXRoZHJhdwQJcHJveHlBZGRyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAQLY0JhbEFCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQtjQmFsQUJlZm9yZQULY0JhbEFCZWZvcmUEC2NCYWxCQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgULY0JhbEJCZWZvcmUFC2NCYWxCQmVmb3JlBANpbnYDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgkBCXVuc3Rha2VMUAUFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQtzdG9wTG9zc0ZlZQUKZnJvbU1hcmtldAMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICCHdpdGhkcmF3CQDMCAIJAMwIAgkApAMBCQBlAgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQUDbmlsBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQDaW52CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQJAGQCBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlBQpmcm9tTWFya2V0AwkAAAIFA2ludgUDaW52AwkAAAIFCXByb3h5QWRkcgIACQD8BwQFCHBvb2xBZGRyAgNnZXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BQNuaWwJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAhN3eFdpdGhkcmF3VHdvVG9rZW5zCQDMCAIFBHBvb2wJAMwIAgUGaWRBU3RyCQDMCAIFBmlkQlN0cgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQADCQAAAgUDaW52BQNpbnYECmNCYWxBQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQpjQmFsQUFmdGVyBQpjQmFsQUFmdGVyBApjQmFsQkFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUKY0JhbEJBZnRlcgUKY0JhbEJBZnRlcgQNJHQwNDAzMTY0MDQwNQkAlAoCCQBlAgUKY0JhbEFBZnRlcgULY0JhbEFCZWZvcmUJAGUCBQpjQmFsQkFmdGVyBQtjQmFsQkJlZm9yZQQNdG9rZW5zQW1vdW50QQgFDSR0MDQwMzE2NDA0MDUCXzEEDXRva2Vuc0Ftb3VudEIIBQ0kdDA0MDMxNjQwNDA1Al8yBA0kdDA0MDQwODQxNjUzAwUKaXNCb3Jyb3dlZAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkCQDMCAIFC2JvcnJvd0Fzc2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUEZGVidAUEZGVidAQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEEHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFBmlkQlN0cgkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEIHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QgAABAVleEludgMJAGYCBQ1hbW91bnRUb0dldEV4AAAJARBleGNoYW5nZURpcmVjdGx5CAUFcFR5cGUFBHBvb2wFBmlkQVN0cgUGaWRCU3RyCQBlAgUEYmFsQQUNdG9rZW5zQW1vdW50QQkAZQIFBGJhbEIFDXRva2Vuc0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0BQNuaWwDCQAAAgUFZXhJbnYFBWV4SW52BA9jQmFsQUFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQ9jQmFsQUFmdGVyUmVwYXkFD2NCYWxBQWZ0ZXJSZXBheQQPY0JhbEJBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUPY0JhbEJBZnRlclJlcGF5BQ9jQmFsQkFmdGVyUmVwYXkEC2Nsb3NlRGJ0SW52AwkAZgIFBGRlYnQAAAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAghyZXBheUZvcgkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQJAMwIAgUHc2hhcmVJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQtib3Jyb3dBc3NldAUEZGVidAUDbmlsAAADCQAAAgULY2xvc2VEYnRJbnYFC2Nsb3NlRGJ0SW52AwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEFTdHIJAJQKAgkAZQIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlBQRkZWJ0CQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQkAlAoCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQkAZQIJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlBQRkZWJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFDXRva2Vuc0Ftb3VudEEFDXRva2Vuc0Ftb3VudEIEB3RvVXNlckEIBQ0kdDA0MDQwODQxNjUzAl8xBAd0b1VzZXJCCAUNJHQwNDA0MDg0MTY1MwJfMgQUcG9vbFRvdGFsTG9hbkVudHJpZXMDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgUScG9vbFRvdGFsU2hhcmVMb2FuBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBBZwb29sVG90YWxNYXJrZXRFbnRyaWVzAwUKZnJvbU1hcmtldAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQJAGUCBRF0b3RhbE1hcmtldEFtb3VudAUPdXNlckNhbldpdGhkcmF3BQNuaWwDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuCQBlAgUZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAUDbmlsBA0kdDA0MjA2NjQyNDYxAwMJAAACBQ13aXRoZHJhd1Rva2VuBQZpZEFTdHIJAGYCBQd0b1VzZXJCAAAHBAZhbXRHZXQJARVleGNoYW5nZURpcmVjdGx5Tm9MaW0FBQVwVHlwZQUEcG9vbAUHdG9Vc2VyQgUGaWRCU3RyBQZpZEFTdHIDCQAAAgUGYW10R2V0BQZhbXRHZXQJAJQKAgkAZAIFB3RvVXNlckEFBmFtdEdldAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwMJAAACBQ13aXRoZHJhd1Rva2VuBQZpZEJTdHIJAGYCBQd0b1VzZXJBAAAHBAZhbXRHZXQJARVleGNoYW5nZURpcmVjdGx5Tm9MaW0FBQVwVHlwZQUEcG9vbAUHdG9Vc2VyQQUGaWRBU3RyBQZpZEJTdHIDCQAAAgUGYW10R2V0BQZhbXRHZXQJAJQKAgAACQBkAgUHdG9Vc2VyQgUGYW10R2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFB3RvVXNlckEFB3RvVXNlckIEC3RvVXNlckFDYWxjCAUNJHQwNDIwNjY0MjQ2MQJfMQQLdG9Vc2VyQkNhbGMIBQ0kdDA0MjA2NjQyNDYxAl8yBAdlbnRyaWVzCQDOCAIJAM4IAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFmtVc2VyUG9zaXRpb25JblBNYXJrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIFDnBvb2xUb3RhbFNoYXJlBQ91c2VyQ2FuV2l0aGRyYXcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFC3RvVXNlckFDYWxjBQNpZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFC3RvVXNlckJDYWxjBQNpZEIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3N0b3BMb3NzRmVlCQDZBAEFB3NoYXJlSWQFA25pbAUUcG9vbFRvdGFsTG9hbkVudHJpZXMFFnBvb2xUb3RhbE1hcmtldEVudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFBmlkQVN0cgUGaWRCU3RyBQdzaGFyZUlkBQNuaWwJAJQKAgUHZW50cmllcwkAzAgCBQt0b1VzZXJBQ2FsYwkAzAgCBQt0b1VzZXJCQ2FsYwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxsaXF1aWRhdGVQb3MEBmNhbGxlcgR1c2VyBXBvc0lkB2xBbW91bnQEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wCC25vIHBvc2l0aW9uBAxib3Jyb3dBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AhxUaGVyZSBhcmUgbm8gYm9ycm93IHBvc2l0aW9uBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBApmcm9tTWFya2V0CQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAcED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwUFBHVzZXIFBHBvb2wFBXBvc0lkBgUKZnJvbU1hcmtldAQOcG9vbFRvdGFsU2hhcmUJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wEEnBvb2xUb3RhbFNoYXJlTG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBBF0b3RhbE1hcmtldEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQAAAQZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuAAAECHVzZXJBZGRyCQEHQWRkcmVzcwEJANkEAQUEdXNlcgQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwNDQzODY0NDQ1OAkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBAZpZEFTdHIIBQ0kdDA0NDM4NjQ0NDU4Al8xBAZpZEJTdHIIBQ0kdDA0NDM4NjQ0NDU4Al8yBARiYWxBCAUNJHQwNDQzODY0NDQ1OAJfMwQEYmFsQggFDSR0MDQ0Mzg2NDQ0NTgCXzQEB3NoYXJlSWQIBQ0kdDA0NDM4NjQ0NDU4Al81BA0kdDA0NDQ2MTQ0NTI4CQCUCgIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQVN0cgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRCU3RyBANpZEEIBQ0kdDA0NDQ2MTQ0NTI4Al8xBANpZEIIBQ0kdDA0NDQ2MTQ0NTI4Al8yBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIABAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEEHBvb2xJbnRlcmVzdExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgAABBZwb29sSW50ZXJlc3RNYXJrZXRMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4AAAMJAAACBQxib3Jyb3dBbW91bnQAAAkAAgECK1lvdSBjYW4ndCBsaXF1aWRhdGUgcG9zaXRpb24gd2l0aG91dCBib3Jyb3cEC2NCYWxBQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgULY0JhbEFCZWZvcmUFC2NCYWxBQmVmb3JlBAtjQmFsQkJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFC2NCYWxCQmVmb3JlBQtjQmFsQkJlZm9yZQQDaW52AwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIId2l0aGRyYXcJAMwIAgkAzAgCCQCkAwEFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAQDaW52CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUKZnJvbU1hcmtldAMJAAACBQNpbnYFA2ludgMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhwb29sQWRkcgIDZ2V0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgITd3hXaXRoZHJhd1R3b1Rva2VucwkAzAgCBQRwb29sCQDMCAIFBmlkQVN0cgkAzAgCBQZpZEJTdHIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAAwkAAAIFA2ludgUDaW52BApjQmFsQUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgUKY0JhbEFBZnRlcgUKY0JhbEFBZnRlcgQKY0JhbEJBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFCmNCYWxCQWZ0ZXIFCmNCYWxCQWZ0ZXIEDSR0MDQ1NzEyNDU4MDEJAJQKAgkAZQIFCmNCYWxBQWZ0ZXIFC2NCYWxBQmVmb3JlCQBlAgUKY0JhbEJBZnRlcgULY0JhbEJCZWZvcmUEDXRva2Vuc0Ftb3VudEEIBQ0kdDA0NTcxMjQ1ODAxAl8xBA10b2tlbnNBbW91bnRCCAUNJHQwNDU3MTI0NTgwMQJfMgQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAZgIFB2xBbW91bnQFDXRva2Vuc0Ftb3VudEEHCQBlAgUHbEFtb3VudAUNdG9rZW5zQW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFBmlkQlN0cgkAZgIFB2xBbW91bnQFDXRva2Vuc0Ftb3VudEIHCQBlAgUHbEFtb3VudAUNdG9rZW5zQW1vdW50QgAABAVleEludgMJAGYCBQ1hbW91bnRUb0dldEV4AAAJARBleGNoYW5nZURpcmVjdGx5CAUFcFR5cGUFBHBvb2wFBmlkQVN0cgUGaWRCU3RyCQBlAgUEYmFsQQUNdG9rZW5zQW1vdW50QQkAZQIFBGJhbEIFDXRva2Vuc0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0BQNuaWwDCQAAAgUFZXhJbnYFBWV4SW52BA9jQmFsQUFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQ9jQmFsQUFmdGVyUmVwYXkFD2NCYWxBQWZ0ZXJSZXBheQQPY0JhbEJBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUPY0JhbEJBZnRlclJlcGF5BQ9jQmFsQkFmdGVyUmVwYXkEDSR0MDQ2MzA3NDY1MzQDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAlAoCCQBlAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUFB2xBbW91bnQJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlCQCUCgIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlCQBlAgkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUFB2xBbW91bnQEB3RvVXNlckEIBQ0kdDA0NjMwNzQ2NTM0Al8xBAd0b1VzZXJCCAUNJHQwNDYzMDc0NjUzNAJfMgQNJHQwNDY1Mzc0NjYxNAkBD2dldFBvb2xCYWxhbmNlcwQFCHBvb2xBZGRyBQVwVHlwZQUGaWRBU3RyBQZpZEJTdHIECWJhbEFBZnRlcggFDSR0MDQ2NTM3NDY2MTQCXzEECWJhbEJBZnRlcggFDSR0MDQ2NTM3NDY2MTQCXzIEDSR0MDQ2NjE3NDY3NDgJAQ9yZXBsZW5pc2hCeVR5cGULBQVwVHlwZQUEcG9vbAUGTk9fRkVFBQd0b1VzZXJBBQZpZEFTdHIFB3RvVXNlckIFBmlkQlN0cgUEYmFsQQUEYmFsQgUHc2hhcmVJZAUKZnJvbU1hcmtldAQKdXNlclN0YWtlZAgFDSR0MDQ2NjE3NDY3NDgCXzEEB2F4bHlGZWUIBQ0kdDA0NjYxNzQ2NzQ4Al8yBA91c2VyTHBMaXF1ZGF0ZWQJAGUCBQ91c2VyQ2FuV2l0aGRyYXcFCnVzZXJTdGFrZWQEDSR0MDQ2ODA3NDcxNTIDBQpmcm9tTWFya2V0CQCUCgIFFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZQIFEXRvdGFsTWFya2V0QW1vdW50BQ91c2VyTHBMaXF1ZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGUCBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuBQ91c2VyTHBMaXF1ZGF0ZWQFA25pbAkAlAoCBRBwb29sSW50ZXJlc3RMb2FuBQNuaWwED2N1clBvb2xJbnRlcmVzdAgFDSR0MDQ2ODA3NDcxNTICXzEEFnBvb2xUb3RhbE1hcmtldEVudHJpZXMIBQ0kdDA0NjgwNzQ3MTUyAl8yCQCUCgIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGUCBQ5wb29sVG90YWxTaGFyZQUPdXNlckxwTGlxdWRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgUScG9vbFRvdGFsU2hhcmVMb2FuBQ91c2VyTHBMaXF1ZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAZQIFB3BBbW91bnQFD3VzZXJMcExpcXVkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QFD2N1clBvb2xJbnRlcmVzdAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFB2xBbW91bnQJAQ5hc3NldElkRnJvbVN0cgEFC2JvcnJvd0Fzc2V0BQNuaWwFFnBvb2xUb3RhbE1hcmtldEVudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFBmlkQVN0cgUGaWRCU3RyBQdzaGFyZUlkBQNuaWwFD3VzZXJMcExpcXVkYXRlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMcGFyc2VSZXF1ZXN0AQlyZXF1ZXN0SWQEB3JlcXVlc3QJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUJcmVxdWVzdElkBQprUmVxdWVzdElkCQCsAgICE05vIHJlcXVlc3Qgd2l0aCBpZCAFCXJlcXVlc3RJZAIBLAQEdXNlcgkAkQMCBQdyZXF1ZXN0AAAEBHBvb2wJAJEDAgUHcmVxdWVzdAABBARwbXRBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAACBANBSWQJAJEDAgUHcmVxdWVzdAADBARwbXRCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAEBANCSWQJAJEDAgUHcmVxdWVzdAAFBARiYWxBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAGBARiYWxCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAHBAdzaGFyZUlkCQCRAwIFB3JlcXVlc3QACAQHYndBc3NldAkAkQMCBQdyZXF1ZXN0AAkECGJ3QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAKBA1zdGFrZVRvTWFya2V0CQAAAgkAkQMCBQdyZXF1ZXN0AAsCBHRydWUJAJ4KDAUEdXNlcgUEcG9vbAUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFB2J3QXNzZXQFCGJ3QW1vdW50BQ1zdGFrZVRvTWFya2V0ARBjYWxjQm9ycm93QW1vdW50CARwbXRBBHBtdEIEYmFsQQRiYWxCA2FJZANiSWQIbGV2ZXJhZ2UIYm9ycm93SWQEDHByaWNlT3JhY2xlQQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUDYUlkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BBAxwcmljZU9yYWNsZUIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2JJZAUOa1ByaWNlSW5PcmFjbGUA////////////AQMDCQECIT0CBQhib3Jyb3dJZAUDYUlkCQECIT0CBQhib3Jyb3dJZAUDYklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAMDCQAAAgUMcHJpY2VPcmFjbGVBAP///////////wEJAAACBQxwcmljZU9yYWNsZUIA////////////AQcJAAIBAjNDYW4ndCBjYWxjIGRlcG9zaXQgcHJpY2UsIG5vIHRva2VuIHByaWNlcyBpbiBvcmFjbGUEBmRlY1ByQQkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04EBmRlY1ByQgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2JJZAAAAAAFBERPV04EB2RQcmljZUEDCQECIT0CBQxwcmljZU9yYWNsZUEA////////////AQUMcHJpY2VPcmFjbGVBCQBrAwkAawMFBGJhbEIFBmRlY1ByQQUEYmFsQQUMcHJpY2VPcmFjbGVCBQZkZWNQckIEB2RQcmljZUIDCQECIT0CBQxwcmljZU9yYWNsZUIA////////////AQUMcHJpY2VPcmFjbGVCCQBrAwkAawMFBGJhbEEFBmRlY1ByQgUEYmFsQgUMcHJpY2VPcmFjbGVBBQZkZWNQckEEDHBheWRJbkRvbGxhcgkAZAIJAGsDBQdkUHJpY2VBBQRwbXRBBQZkZWNQckEJAGsDBQdkUHJpY2VCBQRwbXRCBQZkZWNQckIEDSR0MDQ5Mjk2NDkzOTMDCQAAAgUIYm9ycm93SWQFA2FJZAkAlAoCBQdkUHJpY2VBBQZkZWNQckEJAJQKAgUHZFByaWNlQgUGZGVjUHJCBAtib3Jyb3dQcmljZQgFDSR0MDQ5Mjk2NDkzOTMCXzEEC2JvcnJvd0RlY1ByCAUNJHQwNDkyOTY0OTM5MwJfMgkAawMJAGsDBQxwYXlkSW5Eb2xsYXIJAGUCBQhsZXZlcmFnZQBkAGQFC2JvcnJvd0RlY1ByBQtib3Jyb3dQcmljZQEScGFyc2VSZXBsZW5pc2hQbXRzAwRwbXRzA0FJZANCSWQDCQAAAgkAkAMBBQRwbXRzAAIDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0FJZAkAAgECFVdyb25nIHBheW1lbnQgYXNzZXQgQQMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAEHYXNzZXRJZAUDQklkCQACAQIVV3JvbmcgcGF5bWVudCBhc3NldCBCCQCUCgIICQCRAwIFBHBtdHMAAAZhbW91bnQICQCRAwIFBHBtdHMAAQZhbW91bnQDCQAAAgkAkAMBBQRwbXRzAAEDCQAAAgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNBSWQJAJQKAggJAJEDAgUEcG10cwAABmFtb3VudAAAAwkAAAIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQklkCQCUCgIAAAgJAJEDAgUEcG10cwAABmFtb3VudAkAAgECDVdyb25nIHBheW1lbnQJAAIBAhxPbmUgb3IgdHdvIHBheW1lbnRzIGV4cGVjdGVkAQ9jYWxjUHJpY2VJbXBhY3QEBGJhbEEEYmFsQgduZXdCYWxBB25ld0JhbEIEA3ByaQkAaAIJAGUCBQZTQ0FMRTgJAGsDCQBrAwUEYmFsQgUGU0NBTEU4BQRiYWxBBQZTQ0FMRTgJAGsDBQduZXdCYWxCBQZTQ0FMRTgFB25ld0JhbEEAZAMJAGYCAAAFA3ByaQkAaAIFA3ByaQD///////////8BBQNwcmkBEWNsYWltQW5kQ2hlY2tBbW50BQRwb29sBXBUeXBlBWNsYWltEGFtb3VudFRvRXhjaGFuZ2URYW1vdW50RnJvbUJhbGFuY2UEDSR0MDUwNDE0NTEyNjUDBQVjbGFpbQQHY2xhaW1lZAkBC2NsYWltRmFybWVkAgUFcFR5cGUFBHBvb2wDCQBmAgUQYW1vdW50VG9FeGNoYW5nZQAACQCUCgIFEGFtb3VudFRvRXhjaGFuZ2UIBQdjbGFpbWVkAl8yCQCUCgIJAGQCCAUHY2xhaW1lZAJfMQURYW1vdW50RnJvbUJhbGFuY2UIBQdjbGFpbWVkAl8yBAxjbGFpbWVkQXNzZXQDCQAAAgUFcFR5cGUFB1NGX1BPT0wFBlNXT1BJRAMJAAACBQVwVHlwZQUHV1hfUE9PTAQMcHJveHlBZGRyU3RyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAQDaW52AwkBAiE9AgUMcHJveHlBZGRyU3RyAgAECXByb3h5QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUMcHJveHlBZGRyU3RyBAxwcm94eUJhbGFuY2UJAPAHAgUJcHJveHlBZGRyBQRXWElEAwkAZgIFDHByb3h5QmFsYW5jZQAACQD8BwQFCXByb3h5QWRkcgIQd3hDbGFpbUZpbmFsaXplZAkAzAgCBQxwcm94eUJhbGFuY2UFA25pbAUDbmlsBQR1bml0BQR1bml0AwkAAAIFA2ludgUDaW52BQRXWElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAkAlAoCCQBkAgUQYW1vdW50VG9FeGNoYW5nZQURYW1vdW50RnJvbUJhbGFuY2UFDGNsYWltZWRBc3NldAMJAAACBQ0kdDA1MDQxNDUxMjY1BQ0kdDA1MDQxNDUxMjY1BAVhc3NldAgFDSR0MDUwNDE0NTEyNjUCXzIEBmFtb3VudAgFDSR0MDUwNDE0NTEyNjUCXzEEA2JhbAkBDmFjY291bnRCYWxhbmNlAQUFYXNzZXQDCQAAAgUDYmFsBQNiYWwDCQBmAgUGYW1vdW50BQNiYWwJAAIBAhlUbyBiaWcgYW1vdW50IHRvIGV4Y2hhbmdlCQCUCgIFBmFtb3VudAUFYXNzZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4cAWkBE2dldFBvb2xJbmZvUkVBRE9OTFkBBHBvb2wECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwNTE2MTc1MTcwNwkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDA1MTYxNzUxNzA3Al8xBANCSWQIBQ0kdDA1MTYxNzUxNzA3Al8yBARiYWxBCAUNJHQwNTE2MTc1MTcwNwJfMwQEYmFsQggFDSR0MDUxNjE3NTE3MDcCXzQEB3NoYXJlSWQIBQ0kdDA1MTYxNzUxNzA3Al81BAtzaGFyZVN1cHBseQkBDmdldFNoYXJlU3VwcGx5AwUIcG9vbEFkZHIFBXBUeXBlBQdzaGFyZUlkCQCUCgIFA25pbAkAmAoGBQNBSWQFA0JJZAUHc2hhcmVJZAUEYmFsQQUEYmFsQgULc2hhcmVTdXBwbHkBaQEaZ2V0U2hhcmVBc3NldFByaWNlUkVBRE9OTFkBB3NoYXJlSWQEC3NoYXJlUHJpY2VzCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQJAJQKAgUDbmlsBQtzaGFyZVByaWNlcwFpASJnZXRVc2VyUG9zaXRpb25TaGFyZUFtb3VudFJFQURPTkxZAgR1c2VyBnBvc051bQQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBnBvc051bQURa1VzZXJQb3NpdGlvblBvb2wCEFVua25vd24gcG9zaXRpb24EDGJvcnJvd0Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBnBvc051bQURa1VzZXJCb3Jyb3dBbW91bnQECmZyb21NYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBnBvc051bQUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAcED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwUFBHVzZXIFBHBvb2wFBnBvc051bQkAZgIFDGJvcnJvd0Ftb3VudAAABQpmcm9tTWFya2V0CQCUCgIFA25pbAUPdXNlckNhbldpdGhkcmF3AWkBF2dldFVzZXJQb3NpdGlvblJFQURPTkxZAwR1c2VyBXBvb2xzBnBvc051bQoBB3VzZXJQb3MCAWEEcG9vbAQNJHQwNTI3MDU1Mjc3NQUBYQQJd0Ftb3VudHNBCAUNJHQwNTI3MDU1Mjc3NQJfMQQJd0Ftb3VudHNCCAUNJHQwNTI3MDU1Mjc3NQJfMgQFZGVidHMIBQ0kdDA1MjcwNTUyNzc1Al8zBAtlcVdBbW91bnRzQQgFDSR0MDUyNzA1NTI3NzUCXzQEC2VxV0Ftb3VudHNCCAUNJHQwNTI3MDU1Mjc3NQJfNQQFaW5kZXgIBQ0kdDA1MjcwNTUyNzc1Al82AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BQ1rVXNlclBvc2l0aW9uCQCYCgYJAM0IAgUJd0Ftb3VudHNBAAAJAM0IAgUJd0Ftb3VudHNCAAAJAM0IAgUFZGVidHMAAAkAzQgCBQtlcVdBbW91bnRzQQAACQDNCAIFC2VxV0Ftb3VudHNCAAAJAGQCBQVpbmRleAABBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwNTMwNTQ1MzE0NAkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDA1MzA1NDUzMTQ0Al8xBANCSWQIBQ0kdDA1MzA1NDUzMTQ0Al8yBARiYWxBCAUNJHQwNTMwNTQ1MzE0NAJfMwQEYmFsQggFDSR0MDUzMDU0NTMxNDQCXzQEB3NoYXJlSWQIBQ0kdDA1MzA1NDUzMTQ0Al81BAxib3Jyb3dBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAURa1VzZXJCb3Jyb3dBbW91bnQAAAQKZnJvbU1hcmtldAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BwQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBQUEdXNlcgUEcG9vbAkAkQMCBQZwb3NOdW0FBWluZGV4CQBmAgUMYm9ycm93QW1vdW50AAAFCmZyb21NYXJrZXQEDSR0MDUzNDk0NTM2MTQJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BAh3QW1vdW50QQgFDSR0MDUzNDk0NTM2MTQCXzEECHdBbW91bnRCCAUNJHQwNTM0OTQ1MzYxNAJfMgMJAGYCBQxib3Jyb3dBbW91bnQAAAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFEmtVc2VyQm9ycm93QXNzZXRJZAQEZGVidAoAAUAJAPwHBAkBDmdldExlbmRTcnZBZGRyAAIMZ2V0QXNzZXREZWJ0CQDMCAIHCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUDQUlkCQBmAgUEZGVidAUId0Ftb3VudEEHCQBlAgUEZGVidAUId0Ftb3VudEEDAwkAAAIFC2JvcnJvd0Fzc2V0BQNCSWQJAGYCBQRkZWJ0BQh3QW1vdW50QgcJAGUCBQRkZWJ0BQh3QW1vdW50QgAABAthbW91bnRUb1BheQMJAGYCBQ1hbW91bnRUb0dldEV4AAADCQAAAgUFcFR5cGUFB1NGX1BPT0wEAmV4CQERY2FsY0Ftb3VudFRvUGF5U0YHBQRwb29sBQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQIBQJleAJfMgMJAAACBQVwVHlwZQUHV1hfUE9PTAQCZXgJARFjYWxjQW1vdW50VG9QYXlXWAcFBHBvb2wFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAgFAmV4Al8yCQEPdW5rbm93blBvb2xUeXBlAAAABA0kdDA1NDUyNjU0NzQ1AwkAAAIFC2JvcnJvd0Fzc2V0BQNBSWQJAJQKAgkAZQIJAGQCBQh3QW1vdW50QQUNYW1vdW50VG9HZXRFeAUEZGVidAkAZQIFCHdBbW91bnRCBQthbW91bnRUb1BheQkAlAoCCQBlAgUId0Ftb3VudEEFC2Ftb3VudFRvUGF5CQBlAgkAZAIFCHdBbW91bnRCBQ1hbW91bnRUb0dldEV4BQRkZWJ0BAplcVdBbW91bnRBCAUNJHQwNTQ1MjY1NDc0NQJfMQQKZXFXQW1vdW50QggFDSR0MDU0NTI2NTQ3NDUCXzIJAJgKBgkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIJAM0IAgUFZGVidHMFBGRlYnQJAM0IAgULZXFXQW1vdW50c0EFCmVxV0Ftb3VudEEJAM0IAgULZXFXQW1vdW50c0IFCmVxV0Ftb3VudEIJAGQCBQVpbmRleAABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCYCgYJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCBQVkZWJ0cwkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIJAGQCBQVpbmRleAABBA0kdDA1NTAwMDU1MTExCgACJGwFBXBvb2xzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAmAoGBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQd1c2VyUG9zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQECXdBbW91bnRzQQgFDSR0MDU1MDAwNTUxMTECXzEECXdBbW91bnRzQggFDSR0MDU1MDAwNTUxMTECXzIEBWRlYnRzCAUNJHQwNTUwMDA1NTExMQJfMwQLZXFXQW1vdW50c0EIBQ0kdDA1NTAwMDU1MTExAl80BAtlcVdBbW91bnRzQggFDSR0MDU1MDAwNTUxMTECXzUJAJQKAgUDbmlsCQCXCgUFCXdBbW91bnRzQQUJd0Ftb3VudHNCBQVkZWJ0cwULZXFXQW1vdW50c0EFC2VxV0Ftb3VudHNCAWkBCXJlcGxlbmlzaAQEcG9vbAhsZXZlcmFnZQhib3Jyb3dJZA1zdGFrZVRvTWFya2V0CQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA5hbGxvd2VkQkFzc2V0cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFGGtQb29sQWxsb3dlZEJvcnJvd0Fzc2V0cwIAAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDAwkAZgIAZAUIbGV2ZXJhZ2UGCQBmAgUIbGV2ZXJhZ2UArAIJAAIBAh9MZXZlcmFnZSBjYW4ndCBiZSA8MTAwIGFuZCA+MzAwAwMJAQEhAQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhbkJvcnJvdwkAZgIFCGxldmVyYWdlAGQHCQACAQIdWW91IGNhbid0IGJvcnJvdyBpbiB0aGlzIHBvb2wDAwMJAGYCBQhsZXZlcmFnZQBkCQECIT0CBQ5hbGxvd2VkQkFzc2V0cwIABwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAtQkCBQ5hbGxvd2VkQkFzc2V0cwIBLAUIYm9ycm93SWQHCQACAQIbWW91IGNhbid0IGJvcnJvdyB0aGlzIGFzc2V0AwMFDXN0YWtlVG9NYXJrZXQJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFDGtQb29sUE1BcmtldAcHCQACAQImVGhpcyBwb29sIGNhbid0IHN0YWtlIHRvIHB1enpsZSBtYXJrZXQEDSR0MDU2MTA0NTYxOTQJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwNTYxMDQ1NjE5NAJfMQQDQklkCAUNJHQwNTYxMDQ1NjE5NAJfMgQEYmFsQQgFDSR0MDU2MTA0NTYxOTQCXzMEBGJhbEIIBQ0kdDA1NjEwNDU2MTk0Al80BAdzaGFyZUlkCAUNJHQwNTYxMDQ1NjE5NAJfNQMDCQECIT0CBQhib3Jyb3dJZAUDQUlkCQECIT0CBQhib3Jyb3dJZAUDQklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQNJHQwNTYyNzU1NjMzNAkBEnBhcnNlUmVwbGVuaXNoUG10cwMIBQFpCHBheW1lbnRzBQNBSWQFA0JJZAQEcG10QQgFDSR0MDU2Mjc1NTYzMzQCXzEEBHBtdEIIBQ0kdDA1NjI3NTU2MzM0Al8yBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQJbmV3UG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgMJAGYCBQhsZXZlcmFnZQBkBAxib3Jyb3dBbW91bnQJARBjYWxjQm9ycm93QW1vdW50CAUEcG10QQUEcG10QgUEYmFsQQUEYmFsQgUDQUlkBQNCSWQFCGxldmVyYWdlBQhib3Jyb3dJZAQHcmVxdWVzdAkAuQkCCQDMCAIFBHVzZXIJAMwIAgUEcG9vbAkAzAgCCQCkAwEFBHBtdEEJAMwIAgUDQUlkCQDMCAIJAKQDAQUEcG10QgkAzAgCBQNCSWQJAMwIAgkApAMBBQRiYWxBCQDMCAIJAKQDAQUEYmFsQgkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIJAKQDAQUMYm9ycm93QW1vdW50CQDMCAIJAKUDAQUNc3Rha2VUb01hcmtldAUDbmlsAgEsBAxuZXdSZXF1ZXN0SWQKAAFACQD8BwQFBHRoaXMCEGNyZWF0ZU5ld1JlcXVlc3QJAMwIAgUHcmVxdWVzdAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFDG5ld1JlcXVlc3RJZAUMbmV3UmVxdWVzdElkBARhcmdzCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIFDGJvcnJvd0Ftb3VudAkAzAgCCQClCAEFBHRoaXMJAMwIAgIRcmVwbGVuaXNoRnJvbUxhbmQJAMwIAgkApAMBCQETdmFsdWVPckVycm9yTWVzc2FnZQIFDG5ld1JlcXVlc3RJZAIYQ2FuJ3QgY3JlYXRlIG5ldyByZXF1ZXN0BQNuaWwEA2ludgkA/QcECQEOZ2V0TGVuZFNydkFkZHIAAg1mbGFzaFBvc2l0aW9uBQRhcmdzBQNuaWwDCQAAAgUDaW52BQNpbnYECnVzZXJTdGFrZWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQUNa1VzZXJQb3NpdGlvbgQNJHQwNTczNjk1NzQ2MwkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwNTczNjk1NzQ2MwUNJHQwNTczNjk1NzQ2MwQHbmV3QmFsQggFDSR0MDU3MzY5NTc0NjMCXzIEB25ld0JhbEEIBQ0kdDA1NzM2OTU3NDYzAl8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDU3NTMzNTc2NDgJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDA1NzUzMzU3NjQ4Al8xBAh3QW1vdW50QggFDSR0MDU3NTMzNTc2NDgCXzIED2Z1dHVyZUJvcnJvd0FweQkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAhZjYWxjdWxhdGVUb2tlbkludGVyZXN0CQDMCAIFCGJvcnJvd0lkCQDMCAIHBQNuaWwFA25pbAMJAAACBQ9mdXR1cmVCb3Jyb3dBcHkFD2Z1dHVyZUJvcnJvd0FweQkAlAoCBQNuaWwJAMwIAgUIcHJJbXBhY3QJAMwIAgUId0Ftb3VudEEJAMwIAgUId0Ftb3VudEIJAMwIAgUPZnV0dXJlQm9ycm93QXB5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDU3ODIwNTc5NTAJAQ9yZXBsZW5pc2hCeVR5cGULBQVwVHlwZQUEcG9vbAULTk9fTE9BTl9GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBQ1zdGFrZVRvTWFya2V0AwkAAAIFDSR0MDU3ODIwNTc5NTAFDSR0MDU3ODIwNTc5NTAEB2F4bHlGZWUIBQ0kdDA1NzgyMDU3OTUwAl8yBAp1c2VyU3Rha2VkCAUNJHQwNTc4MjA1Nzk1MAJfMQQNJHQwNTc5NTY1ODA1MAkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwNTc5NTY1ODA1MAUNJHQwNTc5NTY1ODA1MAQHbmV3QmFsQggFDSR0MDU3OTU2NTgwNTACXzIEB25ld0JhbEEIBQ0kdDA1Nzk1NjU4MDUwAl8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDU4MTIwNTgyMzUJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDA1ODEyMDU4MjM1Al8xBAh3QW1vdW50QggFDSR0MDU4MTIwNTgyMzUCXzIJAJQKAgkAzggCCQEQcmVwbGVuaXNoRW50cmllcwkFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFCW5ld1Bvc051bQUHc2hhcmVJZAUFcFR5cGUHBQ1zdGFrZVRvTWFya2V0CQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAkAzAgCBQhwckltcGFjdAkAzAgCBQh3QW1vdW50QQkAzAgCBQh3QW1vdW50QgkAzAgCAAAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwIEcG9vbAVwb3NJZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50CQEOd2l0aGRyYXdUb1VzZXIFCQClCAEIBQFpBmNhbGxlcgUEcG9vbAkApAMBBQVwb3NJZAcCAAFpARB3aXRoZHJhd09uZVRva2VuAwRwb29sBXBvc0lkB3Rva2VuSWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQRwb29sBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAkBDndpdGhkcmF3VG9Vc2VyBQkApQgBCAUBaQZjYWxsZXIFBHBvb2wJAKQDAQUFcG9zSWQHBQd0b2tlbklkAWkBFGNyZWF0ZVVwZGF0ZVN0b3BMb3NzBAVwb3NJZAZwb29sSWQHYXNzZXRJZAVwcmljZQkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABBB0b2tlbk9yYWNsZVByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUGcG9vbElkAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQZwb29sSWQFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGcG9vbElkAgFfCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAAgECGlRoZXJlIGFyZSBubyB1c2VyIHBvc2l0aW9uAwkAZwIAAAUFcHJpY2UJAAIBAhxQcmljZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIFBXByaWNlBRB0b2tlbk9yYWNsZVByaWNlCQACAQIrUHJpY2UgbXVzdCBiZSBsZXNzIHRoYW4gY3VycmVudCB0b2tlbiBwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQVwcmljZQUDbmlsAWkBDmRlbGV0ZVN0b3BMb3NzAwVwb3NJZAZwb29sSWQHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBnBvb2xJZAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUGcG9vbElkBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzCQACAQIITm8gZW50cnkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQNuaWwBaQEEaW5pdA0MbW9uZXlCb3hBZGRyDXNmRmFybWluZ0FkZHIIbGVuZEFkZHIPcHJpY2VPcmFjbGVBZGRyEGtlZXBlckV4Q29udHJhY3QOd3hTd2FwQ29udHJhY3QLc3dvcEFzc2V0SWQJd3hBc3NldElkDm9wZXJhdG9yUHViS2V5Emdyb3VwMUFkbWluMVB1YktleRJncm91cDFBZG1pbjJQdWJLZXkSZ3JvdXAyQWRtaW4xUHViS2V5Emdyb3VwMkFkbWluMlB1YktleQkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpAwkBCWlzRGVmaW5lZAEJAKIIAQUPa09wZXJhdG9yQ2FsbFBLCQACAQIOQWxyZWFkeSBpbml0ZWQDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFDG1vbmV5Qm94QWRkcgkAAgECI21vbmV5Qm94QWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQ1zZkZhcm1pbmdBZGRyCQACAQIkc2ZGYXJtaW5nQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQhsZW5kQWRkcgkAAgECH2xlbmRBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFD3ByaWNlT3JhY2xlQWRkcgkAAgECJnByaWNlT3JhY2xlQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBRBrZWVwZXJFeENvbnRyYWN0CQACAQIna2VlcGVyRXhDb250cmFjdCBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFC3N3b3BBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQEBIQEJAQlpc0RlZmluZWQBCQDsBwEJANkEAQUJd3hBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQECIT0CCQDIAQEJANkEAQUOb3BlcmF0b3JQdWJLZXkAIAkAAgECHW9wZXJhdG9yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtNb25leUJveAUMbW9uZXlCb3hBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDmtTRkZhcm1pbmdBZGRyBQ1zZkZhcm1pbmdBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtMZW5kU2VydmljZQUIbGVuZEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa1ByaWNlT3JhY2xlBQ9wcmljZU9yYWNsZUFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa0V4Q29udHJhY3QFEGtlZXBlckV4Q29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa1d4U3dhcENvbnRyYWN0BQ53eFN3YXBDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBQdrU3dvcElkBQtzd29wQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQVrV3hJZAUJd3hBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tPcGVyYXRvckNhbGxQSwUOb3BlcmF0b3JQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMVBLBRJncm91cDFBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMlBLBRJncm91cDFBZG1pbjJQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMVBLBRJncm91cDJBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMlBLBRJncm91cDJBZG1pbjJQdWJLZXkFA25pbAFpARBjcmVhdGVOZXdSZXF1ZXN0AQZwYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQMbmV3UmVxdWVzdElkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQxrUmVxdWVzdEl0ZXIAAAABCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCkAwEFDG5ld1JlcXVlc3RJZAUKa1JlcXVlc3RJZAUGcGFyYW1zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrUmVxdWVzdEl0ZXIFDG5ld1JlcXVlc3RJZAUDbmlsBQxuZXdSZXF1ZXN0SWQBaQERcmVwbGVuaXNoRnJvbUxhbmQBCXJlcXVlc3RJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBA0kdDA2MzQ1ODYzNTc3CQEMcGFyc2VSZXF1ZXN0AQUJcmVxdWVzdElkBAR1c2VyCAUNJHQwNjM0NTg2MzU3NwJfMQQEcG9vbAgFDSR0MDYzNDU4NjM1NzcCXzIEBHBtdEEIBQ0kdDA2MzQ1ODYzNTc3Al8zBANBSWQIBQ0kdDA2MzQ1ODYzNTc3Al80BARwbXRCCAUNJHQwNjM0NTg2MzU3NwJfNQQDQklkCAUNJHQwNjM0NTg2MzU3NwJfNgQEYmFsQQgFDSR0MDYzNDU4NjM1NzcCXzcEBGJhbEIIBQ0kdDA2MzQ1ODYzNTc3Al84BAdzaGFyZUlkCAUNJHQwNjM0NTg2MzU3NwJfOQQHYndBc3NldAgFDSR0MDYzNDU4NjM1NzcDXzEwBAhid0Ftb3VudAgFDSR0MDYzNDU4NjM1NzcDXzExBA1zdGFrZVRvTWFya2V0CAUNJHQwNjM0NTg2MzU3NwNfMTIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhJXcm9uZyBwYXltZW50IHNpemUDAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUHYndBc3NldAYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQhid0Ftb3VudAkAAgECDVdyb25nIHBheW1lbnQEDSR0MDYzNzY3NjM4NjcDCQAAAgUDQUlkBQdid0Fzc2V0CQCUCgIJAGQCBQRwbXRBBQhid0Ftb3VudAUEcG10QgkAlAoCBQRwbXRBCQBkAgUEcG10QgUIYndBbW91bnQEB3BtdEFsbEEIBQ0kdDA2Mzc2NzYzODY3Al8xBAdwbXRBbGxCCAUNJHQwNjM3Njc2Mzg2NwJfMgQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAgxVbmtub3duIHBvb2wEDSR0MDYzOTQ5NjQwNzkJAQ9yZXBsZW5pc2hCeVR5cGULBQVwVHlwZQUEcG9vbAUITE9BTl9GRUUFB3BtdEFsbEEFA0FJZAUHcG10QWxsQgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBQ1zdGFrZVRvTWFya2V0BAp1c2VyU3Rha2VkCAUNJHQwNjM5NDk2NDA3OQJfMQQHYXhseUZlZQgFDSR0MDYzOTQ5NjQwNzkCXzIEBnBvc051bQkBGGdldE5ld1VzZXJQb3NpdGlvbk51bWJlcgEFBHVzZXIEDWJvcnJvd0VudHJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQURa1VzZXJCb3Jyb3dBbW91bnQFCGJ3QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUSa1VzZXJCb3Jyb3dBc3NldElkBQdid0Fzc2V0BQNuaWwEB2VudHJpZXMJARByZXBsZW5pc2hFbnRyaWVzCQUEcG9vbAUEdXNlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUGcG9zTnVtBQdzaGFyZUlkBQVwVHlwZQYFDXN0YWtlVG9NYXJrZXQEDSR0MDY0NDU0NjQ1NjkJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDA2NDQ1NDY0NTY5Al8xBAh3QW1vdW50QggFDSR0MDY0NDU0NjQ1NjkCXzIJAJQKAgkAzQgCCQDOCAIJAM4IAgUHZW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQJAMwIAgkApAMBBQh3QW1vdW50QQkAzAgCCQCkAwEFCHdBbW91bnRCBQNuaWwFDWJvcnJvd0VudHJpZXMJAQtEZWxldGVFbnRyeQEJAKwCAgUJcmVxdWVzdElkBQprUmVxdWVzdElkBQp1c2VyU3Rha2VkAWkBCWxpcXVpZGF0ZQMEdXNlcgVwb3NJZA9saXF1aWRhdGVBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQppc0xhbmRDYWxsAQUBaQkBDGxpcXVpZGF0ZVBvcwQIBQFpBmNhbGxlcgUEdXNlcgUFcG9zSWQFD2xpcXVpZGF0ZUFtb3VudAFpAQhzdG9wTG9zcwQEdXNlcgVwb3NJZARwb29sB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEEHRva2VuT3JhY2xlUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQQNc3RvcExvc3NQcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQVwb3NJZAIBXwUEcG9vbAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwIITm8gZW50cnkDCQBmAgUQdG9rZW5PcmFjbGVQcmljZQUNc3RvcExvc3NQcmljZQkAAgECI1Rva2VuIHByaWNlIGdyZWF0ZXIgc3RvcCBsb3NzIHByaWNlBANyZXMJAQ53aXRoZHJhd1RvVXNlcgUFBHVzZXIFBHBvb2wJAKQDAQUFcG9zSWQGAgAJAJQKAgkAzQgCCAUDcmVzAl8xCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQCAV8FBHBvb2wCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MIBQNyZXMCXzIBaQEMY2FwaXRhbGl6ZUV4BQRwb29sBXJvdXRlCXRva2VuVG9JZBBhbW91bnRUb0V4Y2hhbmdlBWNsYWltCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQGY2hhbmdlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UAAAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBA0kdDA2NTk4NTY2MDUxCQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEA0FJZAgFDSR0MDY1OTg1NjYwNTECXzEEA0JJZAgFDSR0MDY1OTg1NjYwNTECXzIEBGJhbEEIBQ0kdDA2NTk4NTY2MDUxAl8zBARiYWxCCAUNJHQwNjU5ODU2NjA1MQJfNAQHc2hhcmVJZAgFDSR0MDY1OTg1NjYwNTECXzUEEHRvdGFsU2hhcmVBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wEDGlzTWFya2V0UG9vbAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFDGtQb29sUE1BcmtldAcEDSR0MDY2MTgwNjcwMDYDCQBmAgUQYW1vdW50VG9FeGNoYW5nZQAABA0kdDA2NjI0MjY2MzM5CQERY2xhaW1BbmRDaGVja0FtbnQFBQRwb29sBQVwVHlwZQUFY2xhaW0FEGFtb3VudFRvRXhjaGFuZ2UAAAMJAAACBQ0kdDA2NjI0MjY2MzM5BQ0kdDA2NjI0MjY2MzM5BAxjbGFpbWVkQXNzZXQIBQ0kdDA2NjI0MjY2MzM5Al8yBA1jbGFpbWVkQW1vdW50CAUNJHQwNjYyNDI2NjMzOQJfMQQFckFyZ3MJALUJAgUFcm91dGUCAl9fBA9leGNoYW5nZWRBbW91bnQDCQBmAgUQYW1vdW50VG9FeGNoYW5nZQAAAwkAAAIJAJEDAgUFckFyZ3MAAAIQZGlyZWN0U3dvcGZpQ1BNTQkBEGRpcmVjdFN3b3BmaUNQTU0CBQVyQXJncwUJdG9rZW5Ub0lkAwkAAAIJAJEDAgUFckFyZ3MAAAINcm91dGluZ1N3b3BmaQkBE2RpcmVjdFJvdXRpbmdTd29wZmkCBQVyQXJncwUJdG9rZW5Ub0lkCQACAQILV3Jvbmcgcm91dGUAAAMJAAACBQ9leGNoYW5nZWRBbW91bnQFD2V4Y2hhbmdlZEFtb3VudAQJbmV3Q2hhbmdlCQBlAgkAZAIFDWNsYWltZWRBbW91bnQFBmNoYW5nZQUQYW1vdW50VG9FeGNoYW5nZQQLY2hhbmdlRW50cnkDCQBnAgUJbmV3Q2hhbmdlAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UFCW5ld0NoYW5nZQUDbmlsBQNuaWwEDSR0MDY2ODM2NjY5NDYJAQpjYXBpdGFsaXplCQUEcG9vbAUFcFR5cGUFCXRva2VuVG9JZAUPZXhjaGFuZ2VkQW1vdW50BQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQLY2FwRW50ZXJpc2UIBQ0kdDA2NjgzNjY2OTQ2Al8xBAZzdGFrZWQIBQ0kdDA2NjgzNjY2OTQ2Al8yCQCUCgIJAM4IAgULY2FwRW50ZXJpc2UFC2NoYW5nZUVudHJ5BQZzdGFrZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUDbmlsAAAEC2NhcEVudGVyaXNlCAUNJHQwNjYxODA2NzAwNgJfMQQGc3Rha2VkCAUNJHQwNjYxODA2NzAwNgJfMgQNJHQwNjcwMDk2NzEyNgMFDGlzTWFya2V0UG9vbAkBFmNhcGl0YWxpemVQdXp6bGVNYXJrZXQDBQRwb29sBQVwVHlwZQUHc2hhcmVJZAkAlAoCBQNuaWwAAAQQbWFya2V0Q2FwRW50ZXJpcwgFDSR0MDY3MDA5NjcxMjYCXzEEDHN0YWtlZE1hcmtldAgFDSR0MDY3MDA5NjcxMjYCXzIJAM4IAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZAIJAGQCBRB0b3RhbFNoYXJlQW1vdW50BQZzdGFrZWQFDHN0YWtlZE1hcmtldAUDbmlsBQtjYXBFbnRlcmlzZQUQbWFya2V0Q2FwRW50ZXJpcwkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQFA25pbAFpAQ5jYXBpdGFsaXplTm9FeAMEcG9vbAVjbGFpbRFhbW91bnRGcm9tQmFsYW5jZQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQNJHQwNjc1NjE2NzYyNwkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANBSWQIBQ0kdDA2NzU2MTY3NjI3Al8xBANCSWQIBQ0kdDA2NzU2MTY3NjI3Al8yBARiYWxBCAUNJHQwNjc1NjE2NzYyNwJfMwQEYmFsQggFDSR0MDY3NTYxNjc2MjcCXzQEB3NoYXJlSWQIBQ0kdDA2NzU2MTY3NjI3Al81BBB0b3RhbFNoYXJlQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBA0kdDA2NzY3OTY3Nzc3CQERY2xhaW1BbmRDaGVja0FtbnQFBQRwb29sBQVwVHlwZQUFY2xhaW0AAAURYW1vdW50RnJvbUJhbGFuY2UDCQAAAgUNJHQwNjc2Nzk2Nzc3NwUNJHQwNjc2Nzk2Nzc3NwQMY2xhaW1lZEFzc2V0CAUNJHQwNjc2Nzk2Nzc3NwJfMgQNY2xhaW1lZEFtb3VudAgFDSR0MDY3Njc5Njc3NzcCXzEEDSR0MDY3NzgwNjc5MDYJAQpjYXBpdGFsaXplCQUEcG9vbAUFcFR5cGUJAQxhc3NldElkVG9TdHIBBQxjbGFpbWVkQXNzZXQFDWNsYWltZWRBbW91bnQFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBAtjYXBFbnRlcmlzZQgFDSR0MDY3NzgwNjc5MDYCXzEEBnN0YWtlZAgFDSR0MDY3NzgwNjc5MDYCXzIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGQCBRB0b3RhbFNoYXJlQW1vdW50BQZzdGFrZWQFA25pbAULY2FwRW50ZXJpc2UJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELaW5pdE5ld1Bvb2wMBHR5cGUIcG9vbFR5cGUIcG9vbEFkZHILaW5GZWVOb0xvYW4JaW5GZWVMb2FuDGNhcEZlZU5vTG9hbg5jYXBGZWVXaXRoTG9hbhFzdG9wbG9zc0ZlZU5vTG9hbhNzdG9wbG9zc0ZlZVdpdGhMb2FuCWNhbkJvcnJvdwpjYW5QTWFya2V0E2FsbG93ZWRCb3Jyb3dBc3NldHMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDAwkBAiE9AgUEdHlwZQUHU0ZfUE9PTAkBAiE9AgUEdHlwZQUHV1hfUE9PTAcJAAIBAgpXcm9uZyB0eXBlAwMJAQIhPQIFCHBvb2xUeXBlBQRDUE1NCQECIT0CBQhwb29sVHlwZQUERkxBVAcJAAIBAg9Xcm9uZyBwb29sIHR5cGUEDSR0MDY4NTYwNjg2NTQJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQhwb29sQWRkcgUEdHlwZQQDYUlkCAUNJHQwNjg1NjA2ODY1NAJfMQQDYklkCAUNJHQwNjg1NjA2ODY1NAJfMgQEYUJhbAgFDSR0MDY4NTYwNjg2NTQCXzMEBGJCYWwIBQ0kdDA2ODU2MDY4NjU0Al80BAdzaGFyZUlkCAUNJHQwNjg1NjA2ODY1NAJfNQMJAGYCAAAFC2luRmVlTm9Mb2FuCQACAQIiaW5GZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCWluRmVlTG9hbgkAAgECIGluRmVlTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUMY2FwRmVlTm9Mb2FuCQACAQIjY2FwRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQ5jYXBGZWVXaXRoTG9hbgkAAgECJWNhcEZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRFzdG9wbG9zc0ZlZU5vTG9hbgkAAgECKHN0b3Bsb3NzRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQACAQIqc3RvcGxvc3NGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwBBhhbGxvd2VkQm9ycm93QXNzZXRzRW50cnkDCQECIT0CBRNhbGxvd2VkQm9ycm93QXNzZXRzAgAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhwb29sQWRkcgUYa1Bvb2xBbGxvd2VkQm9ycm93QXNzZXRzBRNhbGxvd2VkQm9ycm93QXNzZXRzBQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRVrQXhseUluRmVlV2l0aG91dExvYW4FC2luRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRJrQXhseUluRmVlV2l0aExvYW4FCWluRmVlTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa0F4bHlOb0xvYW5DYXBGZWUFDGNhcEZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa0F4bHlXaXRoTG9hbkNhcEZlZQUOY2FwRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUFEXN0b3Bsb3NzRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRRrQXhseVN0b3BMb3NzTG9hbkZlZQUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa1Bvb2xJbnRlcmVzdExvYW4AAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIcG9vbEFkZHIFCWtQb29sVHlwZQUIcG9vbFR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sBQhwb29sQWRkcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQhwb29sQWRkcgUOa1Bvb2xDYW5Cb3Jyb3cFCWNhbkJvcnJvdwkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQhwb29sQWRkcgUMa1Bvb2xQTUFya2V0BQpjYW5QTWFya2V0BQNuaWwFGGFsbG93ZWRCb3Jyb3dBc3NldHNFbnRyeQFpAQ51cGRhdGVQb29sRmVlcwcIcG9vbEFkZHILaW5GZWVOb0xvYW4JaW5GZWVMb2FuDGNhcEZlZU5vTG9hbg5jYXBGZWVXaXRoTG9hbhFzdG9wbG9zc0ZlZU5vTG9hbhNzdG9wbG9zc0ZlZVdpdGhMb2FuCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQhwb29sQWRkcgkAAgEJAKwCAgIaQ2FuJ3QgZmluZCBwb29sIHdpdGggYWRkciAFCHBvb2xBZGRyAwkAZgIAAAULaW5GZWVOb0xvYW4JAAIBAiJpbkZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUJaW5GZWVMb2FuCQACAQIgaW5GZWVMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQxjYXBGZWVOb0xvYW4JAAIBAiNjYXBGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDmNhcEZlZVdpdGhMb2FuCQACAQIlY2FwRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFEXN0b3Bsb3NzRmVlTm9Mb2FuCQACAQIoc3RvcGxvc3NGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAAIBAipzdG9wbG9zc0ZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgULaW5GZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEmtBeGx5SW5GZWVXaXRoTG9hbgUJaW5GZWVMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrQXhseU5vTG9hbkNhcEZlZQUMY2FwRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrQXhseVdpdGhMb2FuQ2FwRmVlBQ5jYXBGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQURc3RvcGxvc3NGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFGtBeGx5U3RvcExvc3NMb2FuRmVlBRNzdG9wbG9zc0ZlZVdpdGhMb2FuBQNuaWwBaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAgECE2RBcHAgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGBQNuaWwBaQEIc2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQIVZEFwcCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBwUDbmlsAWkBEGFjdGl2YXRlRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGCQACAQIdZEFwcCBhbHJlYWR5IGFjdGl2ZSBmb3IgdXNlcnMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtBY3RpdmVVc2VycwYFA25pbAFpARBzaHV0ZG93bkZvclVzZXJzAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGCQACAQIfZEFwcCBhbHJlYWR5IHNodXRkb3duIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBwUDbmlsAWkBCmFjdGl2YXRlU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECFVNXT1BGSSBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYFA25pbAFpAQpzaHV0ZG93blNGAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECF1NXT1BGSSBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBCmFjdGl2YXRlV1gACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECEVdYIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duV1gACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQITV1ggYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAcFA25pbAFpAQxhY3RpdmF0ZVBvb2wBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wJAAIBAgxVbmtub3duIHBvb2wDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGCQACAQITUG9vbCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYFA25pbAFpAQxzaHV0ZG93blBvb2wBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wJAAIBAgxVbmtub3duIHBvb2wDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhVQb29sIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUHBQNuaWwBAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ5ncm91cDFBZG1pbjFQSwABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDmdyb3VwMUFkbWluMlBLAAEAAAQSYWRtaW5QdWJLZXkzU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUOZ3JvdXAxQWRtaW4zUEsAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIFE211bHRpU2lnbmVkQnlBZG1pbnMJUVhO", "height": 4119499, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2SsnougSRD2cfKNZdF4Ev8TmcfP2HJ8WwVUy4nVLJRJy Next: 3WpS4ezCtFKyAScRtTXzy1oScwekqyZfxxdYjMho6uBs Diff:
OldNewDifferences
688688 then if ((amoutGet == amountTokenToGet))
689689 then $Tuple2(assetIn, amountTokenToGet)
690690 else {
691- let amountToPayMax = {
691+ let $t02137921830 = {
692692 let aPM = if ((amountTokenToGet > amoutGet))
693693 then fraction(amountTokenToGet, 110, 100)
694694 else fraction(amountTokenToGet, 90, 100)
700700 }
701701 if ((amountGetMax == amountGetMax))
702702 then if ((amoutGet > amountGetMax))
703- then fraction(aPM, 110, 100)
704- else aPM
703+ then $Tuple2(aPM, fraction(aPM, 110, 100))
704+ else $Tuple2(amountTokenToGet, aPM)
705705 else throw("Strict value is not equal to itself.")
706706 }
707+ let amountToPayMin = $t02137921830._1
708+ let amountToPayMax = $t02137921830._2
707709 func hdm (a,index) = {
708- let $t02183221853 = a
709- let pay = $t02183221853._1
710- let payMax = $t02183221853._2
710+ let $t02187721898 = a
711+ let pay = $t02187721898._1
712+ let payMax = $t02187721898._2
711713 let payNext = ((pay + payMax) / 2)
712714 let amountGetNext = {
713715 let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [payNext, assetIn, assetTokenToGet], nil)
725727 let resAmntToPay = {
726728 let $l = [1, 2]
727729 let $s = size($l)
728- let $acc0 = $Tuple2(amountTokenToGet, amountToPayMax)
730+ let $acc0 = $Tuple2(amountToPayMin, amountToPayMax)
729731 func $f0_1 ($a,$i) = if (($i >= $s))
730732 then $a
731733 else hdm($a, $l[$i])
746748
747749
748750 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
749- let $t02245122490 = getWXSwapFees(pool)
750- let pFee = $t02245122490._1
751- let prFee = $t02245122490._2
751+ let $t02249422533 = getWXSwapFees(pool)
752+ let pFee = $t02249422533._1
753+ let prFee = $t02249422533._2
752754 let poolType = valueOrElse(getString(this, (pool + kPoolType)), CPMM)
753755 let feeScale = toBigInt(100000000)
754756 if ((poolType == FLAT))
755757 then calcFlatToPay(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
756758 else {
757- let $t02272323031 = if ((assetTokenToGet == assetIdA))
759+ let $t02276623074 = if ((assetTokenToGet == assetIdA))
758760 then {
759761 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
760762 $Tuple2(amountToPay, assetIdB)
763765 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
764766 $Tuple2(amountToPay, assetIdA)
765767 }
766- let amountToPay = $t02272323031._1
767- let assetToPay = $t02272323031._2
768+ let amountToPay = $t02276623074._1
769+ let assetToPay = $t02276623074._2
768770 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
769771 $Tuple2(assetToPay, amountToPayWithFee)
770772 }
777779 then true
778780 else (poolFB != ""))
779781 then {
780- let $t02347223684 = if ((poolFB == ""))
782+ let $t02351523727 = if ((poolFB == ""))
781783 then $Tuple3(balA, balB, pool)
782784 else {
783- let $t02357823651 = getSFPoolBalances(addressFromStringValue(poolFB))
784- let sfBalA = $t02357823651._1
785- let sfBalB = $t02357823651._2
785+ let $t02362123694 = getSFPoolBalances(addressFromStringValue(poolFB))
786+ let sfBalA = $t02362123694._1
787+ let sfBalB = $t02362123694._2
786788 $Tuple3(sfBalA, sfBalB, poolFB)
787789 }
788- let pBalA = $t02347223684._1
789- let pBalB = $t02347223684._2
790- let exPool = $t02347223684._3
791- let $t02368923815 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
792- let assetToPay = $t02368923815._1
793- let amountToPay = $t02368923815._2
790+ let pBalA = $t02351523727._1
791+ let pBalB = $t02351523727._2
792+ let exPool = $t02351523727._3
793+ let $t02373223858 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
794+ let assetToPay = $t02373223858._1
795+ let amountToPay = $t02373223858._2
794796 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
795797 }
796798 else if ((pType == WX_POOL))
797799 then {
798- let $t02401724139 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
799- let assetToPay = $t02401724139._1
800- let amountToPay = $t02401724139._2
800+ let $t02406024182 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
801+ let assetToPay = $t02406024182._1
802+ let amountToPay = $t02406024182._2
801803 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
802804 }
803805 else unknownPoolType()
835837
836838
837839 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
838- let $t02526825739 = if ((pType == SF_POOL))
840+ let $t02531125782 = if ((pType == SF_POOL))
839841 then {
840842 let inv = {
841843 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
870872 else throw("Strict value is not equal to itself.")
871873 }
872874 else unknownPoolType()
873- let amountA = $t02526825739._1
874- let amountB = $t02526825739._2
875+ let amountA = $t02531125782._1
876+ let amountB = $t02531125782._2
875877 $Tuple2(amountA, amountB)
876878 }
877879
895897 }
896898 else if ((pType == WX_POOL))
897899 then {
898- let $t02617926258 = getWXPoolData(addressFromStringValue(pool))
899- let aId = $t02617926258._1
900- let bId = $t02617926258._2
901- let aBal = $t02617926258._3
902- let bBal = $t02617926258._4
903- let lpId = $t02617926258._5
900+ let $t02622226301 = getWXPoolData(addressFromStringValue(pool))
901+ let aId = $t02622226301._1
902+ let bId = $t02622226301._2
903+ let aBal = $t02622226301._3
904+ let bBal = $t02622226301._4
905+ let lpId = $t02622226301._5
904906 let balBefore = accountBalance(WXID)
905907 if ((balBefore == balBefore))
906908 then {
926928 if ((lpBalanceBefore == lpBalanceBefore))
927929 then {
928930 let poolAddr = addressFromStringValue(pool)
929- let $t02706327491 = if (if ((pmtA > 0))
931+ let $t02710627534 = if (if ((pmtA > 0))
930932 then (pmtB > 0)
931933 else false)
932934 then {
933- let $t02712927251 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
934- let pmtInA = $t02712927251._1
935- let pmtInB = $t02712927251._2
936- let change = $t02712927251._3
937- let changeId = $t02712927251._4
935+ let $t02717227294 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
936+ let pmtInA = $t02717227294._1
937+ let pmtInB = $t02717227294._2
938+ let change = $t02717227294._3
939+ let changeId = $t02717227294._4
938940 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId, LPId)
939941 if ((inv == inv))
940942 then $Tuple2(change, changeId)
945947 else if ((pmtB > 0))
946948 then $Tuple2(pmtB, bId)
947949 else throw("pmts must be > 0")
948- let change = $t02706327491._1
949- let changeId = $t02706327491._2
950+ let change = $t02710627534._1
951+ let changeId = $t02710627534._2
950952 let inv = if ((change > 0))
951953 then replenishOneTokenByType(poolAddr, pType, change, changeId, LPId)
952954 else nil
980982 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
981983 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
982984 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
983- let $t02895229777 = if (withLoan)
985+ let $t02899529820 = if (withLoan)
984986 then if (stakeToMarket)
985987 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
986988 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
987989 else if (stakeToMarket)
988990 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
989991 else $Tuple2(poolInterestNoLoan, nil)
990- let curPoolInterest = $t02895229777._1
991- let adEntry = $t02895229777._2
992+ let curPoolInterest = $t02899529820._1
993+ let adEntry = $t02899529820._2
992994 ([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)
993995 }
994996
10871089 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
10881090 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
10891091 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
1090- let $t03285532955 = if ((tokenId == AId))
1092+ let $t03289832998 = if ((tokenId == AId))
10911093 then $Tuple2((tokenAmount - axlyFee), 0)
10921094 else $Tuple2(0, (tokenAmount - axlyFee))
1093- let pmtA = $t03285532955._1
1094- let pmtB = $t03285532955._2
1095- let $t03295833069 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1096- let stakedAmount = $t03295833069._1
1097- let nf = $t03295833069._2
1095+ let pmtA = $t03289832998._1
1096+ let pmtB = $t03289832998._2
1097+ let $t03300133112 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1098+ let stakedAmount = $t03300133112._1
1099+ let nf = $t03300133112._2
10981100 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
10991101 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
11001102 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
12161218 let userAddr = Address(fromBase58String(user))
12171219 let poolAddr = Address(fromBase58String(pool))
12181220 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1219- let $t03912339195 = getPoolData(poolAddr, pType)
1220- let idAStr = $t03912339195._1
1221- let idBStr = $t03912339195._2
1222- let balA = $t03912339195._3
1223- let balB = $t03912339195._4
1224- let shareId = $t03912339195._5
1225- let $t03919839265 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1226- let idA = $t03919839265._1
1227- let idB = $t03919839265._2
1221+ let $t03916639238 = getPoolData(poolAddr, pType)
1222+ let idAStr = $t03916639238._1
1223+ let idBStr = $t03916639238._2
1224+ let balA = $t03916639238._3
1225+ let balB = $t03916639238._4
1226+ let shareId = $t03916639238._5
1227+ let $t03924139308 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1228+ let idA = $t03924139308._1
1229+ let idB = $t03924139308._2
12281230 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
12291231 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
12301232 let cBalABefore = accountBalance(idA)
12581260 let cBalBAfter = accountBalance(idB)
12591261 if ((cBalBAfter == cBalBAfter))
12601262 then {
1261- let $t04027340362 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1262- let tokensAmountA = $t04027340362._1
1263- let tokensAmountB = $t04027340362._2
1264- let $t04036541610 = if (isBorrowed)
1263+ let $t04031640405 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1264+ let tokensAmountA = $t04031640405._1
1265+ let tokensAmountB = $t04031640405._2
1266+ let $t04040841653 = if (isBorrowed)
12651267 then {
12661268 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
12671269 let debt = {
13101312 else throw("Strict value is not equal to itself.")
13111313 }
13121314 else $Tuple2(tokensAmountA, tokensAmountB)
1313- let toUserA = $t04036541610._1
1314- let toUserB = $t04036541610._2
1315+ let toUserA = $t04040841653._1
1316+ let toUserB = $t04040841653._2
13151317 let poolTotalLoanEntries = if (isBorrowed)
13161318 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
13171319 else nil
13201322 then [IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userCanWithdraw))]
13211323 else nil))
13221324 else nil
1323- let $t04202342418 = if (if ((withdrawToken == idAStr))
1325+ let $t04206642461 = if (if ((withdrawToken == idAStr))
13241326 then (toUserB > 0)
13251327 else false)
13261328 then {
13391341 else throw("Strict value is not equal to itself.")
13401342 }
13411343 else $Tuple2(toUserA, toUserB)
1342- let toUserACalc = $t04202342418._1
1343- let toUserBCalc = $t04202342418._2
1344+ let toUserACalc = $t04206642461._1
1345+ let toUserBCalc = $t04206642461._2
13441346 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))
13451347 $Tuple2(entries, [toUserACalc, toUserBCalc])
13461348 }
13691371 let userAddr = Address(fromBase58String(user))
13701372 let poolAddr = Address(fromBase58String(pool))
13711373 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1372- let $t04434344415 = getPoolData(poolAddr, pType)
1373- let idAStr = $t04434344415._1
1374- let idBStr = $t04434344415._2
1375- let balA = $t04434344415._3
1376- let balB = $t04434344415._4
1377- let shareId = $t04434344415._5
1378- let $t04441844485 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1379- let idA = $t04441844485._1
1380- let idB = $t04441844485._2
1374+ let $t04438644458 = getPoolData(poolAddr, pType)
1375+ let idAStr = $t04438644458._1
1376+ let idBStr = $t04438644458._2
1377+ let balA = $t04438644458._3
1378+ let balB = $t04438644458._4
1379+ let shareId = $t04438644458._5
1380+ let $t04446144528 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1381+ let idA = $t04446144528._1
1382+ let idB = $t04446144528._2
13811383 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
13821384 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
13831385 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
14111413 let cBalBAfter = accountBalance(idB)
14121414 if ((cBalBAfter == cBalBAfter))
14131415 then {
1414- let $t04566945758 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1415- let tokensAmountA = $t04566945758._1
1416- let tokensAmountB = $t04566945758._2
1416+ let $t04571245801 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1417+ let tokensAmountA = $t04571245801._1
1418+ let tokensAmountB = $t04571245801._2
14171419 let amountToGetEx = if (if ((borrowAsset == idAStr))
14181420 then (lAmount > tokensAmountA)
14191421 else false)
14341436 let cBalBAfterRepay = accountBalance(idB)
14351437 if ((cBalBAfterRepay == cBalBAfterRepay))
14361438 then {
1437- let $t04626446491 = if ((borrowAsset == idAStr))
1439+ let $t04630746534 = if ((borrowAsset == idAStr))
14381440 then $Tuple2(((cBalAAfterRepay - cBalABefore) - lAmount), (cBalBAfterRepay - cBalBBefore))
14391441 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - lAmount))
1440- let toUserA = $t04626446491._1
1441- let toUserB = $t04626446491._2
1442- let $t04649446571 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1443- let balAAfter = $t04649446571._1
1444- let balBAfter = $t04649446571._2
1445- let $t04657446705 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1446- let userStaked = $t04657446705._1
1447- let axlyFee = $t04657446705._2
1442+ let toUserA = $t04630746534._1
1443+ let toUserB = $t04630746534._2
1444+ let $t04653746614 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1445+ let balAAfter = $t04653746614._1
1446+ let balBAfter = $t04653746614._2
1447+ let $t04661746748 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1448+ let userStaked = $t04661746748._1
1449+ let axlyFee = $t04661746748._2
14481450 let userLpLiqudated = (userCanWithdraw - userStaked)
1449- let $t04676447109 = if (fromMarket)
1451+ let $t04680747152 = if (fromMarket)
14501452 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userLpLiqudated)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userLpLiqudated))])
14511453 else $Tuple2(poolInterestLoan, nil)
1452- let curPoolInterest = $t04676447109._1
1453- let poolTotalMarketEntries = $t04676447109._2
1454+ let curPoolInterest = $t04680747152._1
1455+ let poolTotalMarketEntries = $t04680747152._2
14541456 $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)
14551457 }
14561458 else throw("Strict value is not equal to itself.")
15111513 then priceOracleB
15121514 else fraction(fraction(balA, decPrB, balB), priceOracleA, decPrA)
15131515 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1514- let $t04925349350 = if ((borrowId == aId))
1516+ let $t04929649393 = if ((borrowId == aId))
15151517 then $Tuple2(dPriceA, decPrA)
15161518 else $Tuple2(dPriceB, decPrB)
1517- let borrowPrice = $t04925349350._1
1518- let borrowDecPr = $t04925349350._2
1519+ let borrowPrice = $t04929649393._1
1520+ let borrowDecPr = $t04929649393._2
15191521 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
15201522 }
15211523 }
15451547
15461548
15471549 func claimAndCheckAmnt (pool,pType,claim,amountToExchange,amountFromBalance) = {
1548- let $t05037151222 = if (claim)
1550+ let $t05041451265 = if (claim)
15491551 then {
15501552 let claimed = claimFarmed(pType, pool)
15511553 if ((amountToExchange > 0))
15741576 else unknownPoolType()
15751577 $Tuple2((amountToExchange + amountFromBalance), claimedAsset)
15761578 }
1577- if (($t05037151222 == $t05037151222))
1579+ if (($t05041451265 == $t05041451265))
15781580 then {
1579- let asset = $t05037151222._2
1580- let amount = $t05037151222._1
1581+ let asset = $t05041451265._2
1582+ let amount = $t05041451265._1
15811583 let bal = accountBalance(asset)
15821584 if ((bal == bal))
15831585 then if ((amount > bal))
15931595 func getPoolInfoREADONLY (pool) = {
15941596 let poolAddr = addressFromStringValue(pool)
15951597 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1596- let $t05157451664 = getPoolData(Address(fromBase58String(pool)), pType)
1597- let AId = $t05157451664._1
1598- let BId = $t05157451664._2
1599- let balA = $t05157451664._3
1600- let balB = $t05157451664._4
1601- let shareId = $t05157451664._5
1598+ let $t05161751707 = getPoolData(Address(fromBase58String(pool)), pType)
1599+ let AId = $t05161751707._1
1600+ let BId = $t05161751707._2
1601+ let balA = $t05161751707._3
1602+ let balB = $t05161751707._4
1603+ let shareId = $t05161751707._5
16021604 let shareSupply = getShareSupply(poolAddr, pType, shareId)
16031605 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
16041606 }
16271629 @Callable(i)
16281630 func getUserPositionREADONLY (user,pools,posNum) = {
16291631 func userPos (a,pool) = {
1630- let $t05266252732 = a
1631- let wAmountsA = $t05266252732._1
1632- let wAmountsB = $t05266252732._2
1633- let debts = $t05266252732._3
1634- let eqWAmountsA = $t05266252732._4
1635- let eqWAmountsB = $t05266252732._5
1636- let index = $t05266252732._6
1632+ let $t05270552775 = a
1633+ let wAmountsA = $t05270552775._1
1634+ let wAmountsB = $t05270552775._2
1635+ let debts = $t05270552775._3
1636+ let eqWAmountsA = $t05270552775._4
1637+ let eqWAmountsB = $t05270552775._5
1638+ let index = $t05270552775._6
16371639 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
16381640 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
16391641 else {
16401642 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1641- let $t05301153101 = getPoolData(Address(fromBase58String(pool)), pType)
1642- let AId = $t05301153101._1
1643- let BId = $t05301153101._2
1644- let balA = $t05301153101._3
1645- let balB = $t05301153101._4
1646- let shareId = $t05301153101._5
1643+ let $t05305453144 = getPoolData(Address(fromBase58String(pool)), pType)
1644+ let AId = $t05305453144._1
1645+ let BId = $t05305453144._2
1646+ let balA = $t05305453144._3
1647+ let balB = $t05305453144._4
1648+ let shareId = $t05305453144._5
16471649 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
16481650 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPositionInPMarket)), false)
16491651 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0), fromMarket)
1650- let $t05345153571 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1651- let wAmountA = $t05345153571._1
1652- let wAmountB = $t05345153571._2
1652+ let $t05349453614 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1653+ let wAmountA = $t05349453614._1
1654+ let wAmountB = $t05349453614._2
16531655 if ((borrowAmount > 0))
16541656 then {
16551657 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
16831685 }
16841686 else unknownPoolType()
16851687 else 0
1686- let $t05448354702 = if ((borrowAsset == AId))
1688+ let $t05452654745 = if ((borrowAsset == AId))
16871689 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
16881690 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1689- let eqWAmountA = $t05448354702._1
1690- let eqWAmountB = $t05448354702._2
1691+ let eqWAmountA = $t05452654745._1
1692+ let eqWAmountB = $t05452654745._2
16911693 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
16921694 }
16931695 else throw("Strict value is not equal to itself.")
16961698 }
16971699 }
16981700
1699- let $t05495755068 = {
1701+ let $t05500055111 = {
17001702 let $l = pools
17011703 let $s = size($l)
17021704 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
17101712
17111713 $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)
17121714 }
1713- let wAmountsA = $t05495755068._1
1714- let wAmountsB = $t05495755068._2
1715- let debts = $t05495755068._3
1716- let eqWAmountsA = $t05495755068._4
1717- let eqWAmountsB = $t05495755068._5
1715+ let wAmountsA = $t05500055111._1
1716+ let wAmountsB = $t05500055111._2
1717+ let debts = $t05500055111._3
1718+ let eqWAmountsA = $t05500055111._4
1719+ let eqWAmountsB = $t05500055111._5
17181720 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
17191721 }
17201722
17451747 else false)
17461748 then throw("This pool can't stake to puzzle market")
17471749 else {
1748- let $t05606156151 = getPoolData(Address(fromBase58String(pool)), pType)
1749- let AId = $t05606156151._1
1750- let BId = $t05606156151._2
1751- let balA = $t05606156151._3
1752- let balB = $t05606156151._4
1753- let shareId = $t05606156151._5
1750+ let $t05610456194 = getPoolData(Address(fromBase58String(pool)), pType)
1751+ let AId = $t05610456194._1
1752+ let BId = $t05610456194._2
1753+ let balA = $t05610456194._3
1754+ let balB = $t05610456194._4
1755+ let shareId = $t05610456194._5
17541756 if (if ((borrowId != AId))
17551757 then (borrowId != BId)
17561758 else false)
17571759 then throw("Wrong borrow asset")
17581760 else {
1759- let $t05623256291 = parseReplenishPmts(i.payments, AId, BId)
1760- let pmtA = $t05623256291._1
1761- let pmtB = $t05623256291._2
1761+ let $t05627556334 = parseReplenishPmts(i.payments, AId, BId)
1762+ let pmtA = $t05627556334._1
1763+ let pmtB = $t05627556334._2
17621764 let user = toString(i.caller)
17631765 let newPosNum = getNewUserPositionNumber(user)
17641766 if ((leverage > 100))
17781780 if ((inv == inv))
17791781 then {
17801782 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1781- let $t05732657420 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1782- if (($t05732657420 == $t05732657420))
1783+ let $t05736957463 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1784+ if (($t05736957463 == $t05736957463))
17831785 then {
1784- let newBalB = $t05732657420._2
1785- let newBalA = $t05732657420._1
1786+ let newBalB = $t05736957463._2
1787+ let newBalA = $t05736957463._1
17861788 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1787- let $t05749057605 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1788- let wAmountA = $t05749057605._1
1789- let wAmountB = $t05749057605._2
1789+ let $t05753357648 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1790+ let wAmountA = $t05753357648._1
1791+ let wAmountB = $t05753357648._2
17901792 let futureBorrowApy = invoke(getLendSrvAddr(), "calculateTokenInterest", [borrowId, false], nil)
17911793 if ((futureBorrowApy == futureBorrowApy))
17921794 then $Tuple2(nil, [prImpact, wAmountA, wAmountB, futureBorrowApy])
17991801 else throw("Strict value is not equal to itself.")
18001802 }
18011803 else {
1802- let $t05777757907 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1803- if (($t05777757907 == $t05777757907))
1804+ let $t05782057950 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1805+ if (($t05782057950 == $t05782057950))
18041806 then {
1805- let axlyFee = $t05777757907._2
1806- let userStaked = $t05777757907._1
1807- let $t05791358007 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1808- if (($t05791358007 == $t05791358007))
1807+ let axlyFee = $t05782057950._2
1808+ let userStaked = $t05782057950._1
1809+ let $t05795658050 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1810+ if (($t05795658050 == $t05795658050))
18091811 then {
1810- let newBalB = $t05791358007._2
1811- let newBalA = $t05791358007._1
1812+ let newBalB = $t05795658050._2
1813+ let newBalA = $t05795658050._1
18121814 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1813- let $t05807758192 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1814- let wAmountA = $t05807758192._1
1815- let wAmountB = $t05807758192._2
1815+ let $t05812058235 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1816+ let wAmountA = $t05812058235._1
1817+ let wAmountB = $t05812058235._2
18161818 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB, 0])
18171819 }
18181820 else throw("Strict value is not equal to itself.")
19151917
19161918 @Callable(i)
19171919 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1918- let $t06341563534 = parseRequest(requestId)
1919- let user = $t06341563534._1
1920- let pool = $t06341563534._2
1921- let pmtA = $t06341563534._3
1922- let AId = $t06341563534._4
1923- let pmtB = $t06341563534._5
1924- let BId = $t06341563534._6
1925- let balA = $t06341563534._7
1926- let balB = $t06341563534._8
1927- let shareId = $t06341563534._9
1928- let bwAsset = $t06341563534._10
1929- let bwAmount = $t06341563534._11
1930- let stakeToMarket = $t06341563534._12
1920+ let $t06345863577 = parseRequest(requestId)
1921+ let user = $t06345863577._1
1922+ let pool = $t06345863577._2
1923+ let pmtA = $t06345863577._3
1924+ let AId = $t06345863577._4
1925+ let pmtB = $t06345863577._5
1926+ let BId = $t06345863577._6
1927+ let balA = $t06345863577._7
1928+ let balB = $t06345863577._8
1929+ let shareId = $t06345863577._9
1930+ let bwAsset = $t06345863577._10
1931+ let bwAmount = $t06345863577._11
1932+ let stakeToMarket = $t06345863577._12
19311933 if ((size(i.payments) != 1))
19321934 then throw("Wrong payment size")
19331935 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
19351937 else (i.payments[0].amount != bwAmount))
19361938 then throw("Wrong payment")
19371939 else {
1938- let $t06372463824 = if ((AId == bwAsset))
1940+ let $t06376763867 = if ((AId == bwAsset))
19391941 then $Tuple2((pmtA + bwAmount), pmtB)
19401942 else $Tuple2(pmtA, (pmtB + bwAmount))
1941- let pmtAllA = $t06372463824._1
1942- let pmtAllB = $t06372463824._2
1943+ let pmtAllA = $t06376763867._1
1944+ let pmtAllB = $t06376763867._2
19431945 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1944- let $t06390664036 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1945- let userStaked = $t06390664036._1
1946- let axlyFee = $t06390664036._2
1946+ let $t06394964079 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1947+ let userStaked = $t06394964079._1
1948+ let axlyFee = $t06394964079._2
19471949 let posNum = getNewUserPositionNumber(user)
19481950 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
19491951 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1950- let $t06441164526 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1951- let wAmountA = $t06441164526._1
1952- let wAmountB = $t06441164526._2
1952+ let $t06445464569 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1953+ let wAmountA = $t06445464569._1
1954+ let wAmountB = $t06445464569._2
19531955 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
19541956 }
19551957 }))
19801982 let pType = getStringValue(this, (kPool + pool))
19811983 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
19821984 let poolAddr = Address(fromBase58String(pool))
1983- let $t06594266008 = getPoolData(poolAddr, pType)
1984- let AId = $t06594266008._1
1985- let BId = $t06594266008._2
1986- let balA = $t06594266008._3
1987- let balB = $t06594266008._4
1988- let shareId = $t06594266008._5
1985+ let $t06598566051 = getPoolData(poolAddr, pType)
1986+ let AId = $t06598566051._1
1987+ let BId = $t06598566051._2
1988+ let balA = $t06598566051._3
1989+ let balB = $t06598566051._4
1990+ let shareId = $t06598566051._5
19891991 let totalShareAmount = getPoolTotalShare(pool)
19901992 let isMarketPool = valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false)
1991- let $t06613766963 = if ((amountToExchange > 0))
1993+ let $t06618067006 = if ((amountToExchange > 0))
19921994 then {
1993- let $t06619966296 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1994- if (($t06619966296 == $t06619966296))
1995+ let $t06624266339 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1996+ if (($t06624266339 == $t06624266339))
19951997 then {
1996- let claimedAsset = $t06619966296._2
1997- let claimedAmount = $t06619966296._1
1998+ let claimedAsset = $t06624266339._2
1999+ let claimedAmount = $t06624266339._1
19982000 let rArgs = split(route, "__")
19992001 let exchangedAmount = if ((amountToExchange > 0))
20002002 then if ((rArgs[0] == "directSwopfiCPMM"))
20092011 let changeEntry = if ((newChange >= 0))
20102012 then [IntegerEntry((pool + kPoolCapChange), newChange)]
20112013 else nil
2012- let $t06679366903 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
2013- let capEnterise = $t06679366903._1
2014- let staked = $t06679366903._2
2014+ let $t06683666946 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
2015+ let capEnterise = $t06683666946._1
2016+ let staked = $t06683666946._2
20152017 $Tuple2((capEnterise ++ changeEntry), staked)
20162018 }
20172019 else throw("Strict value is not equal to itself.")
20192021 else throw("Strict value is not equal to itself.")
20202022 }
20212023 else $Tuple2(nil, 0)
2022- let capEnterise = $t06613766963._1
2023- let staked = $t06613766963._2
2024- let $t06696667083 = if (isMarketPool)
2024+ let capEnterise = $t06618067006._1
2025+ let staked = $t06618067006._2
2026+ let $t06700967126 = if (isMarketPool)
20252027 then capitalizePuzzleMarket(pool, pType, shareId)
20262028 else $Tuple2(nil, 0)
2027- let marketCapEnteris = $t06696667083._1
2028- let stakedMarket = $t06696667083._2
2029+ let marketCapEnteris = $t06700967126._1
2030+ let stakedMarket = $t06700967126._2
20292031 ((([IntegerEntry((pool + kPoolTotal), ((totalShareAmount + staked) + stakedMarket))] ++ capEnterise) ++ marketCapEnteris) ++ getCursEntries(AId, BId, shareId, nil))
20302032 }))
20312033
20352037 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
20362038 let pType = getStringValue(this, (kPool + pool))
20372039 let poolAddr = Address(fromBase58String(pool))
2038- let $t06751867584 = getPoolData(poolAddr, pType)
2039- let AId = $t06751867584._1
2040- let BId = $t06751867584._2
2041- let balA = $t06751867584._3
2042- let balB = $t06751867584._4
2043- let shareId = $t06751867584._5
2040+ let $t06756167627 = getPoolData(poolAddr, pType)
2041+ let AId = $t06756167627._1
2042+ let BId = $t06756167627._2
2043+ let balA = $t06756167627._3
2044+ let balB = $t06756167627._4
2045+ let shareId = $t06756167627._5
20442046 let totalShareAmount = getPoolTotalShare(pool)
2045- let $t06763667734 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2046- if (($t06763667734 == $t06763667734))
2047+ let $t06767967777 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2048+ if (($t06767967777 == $t06767967777))
20472049 then {
2048- let claimedAsset = $t06763667734._2
2049- let claimedAmount = $t06763667734._1
2050- let $t06773767863 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2051- let capEnterise = $t06773767863._1
2052- let staked = $t06773767863._2
2050+ let claimedAsset = $t06767967777._2
2051+ let claimedAmount = $t06767967777._1
2052+ let $t06778067906 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2053+ let capEnterise = $t06778067906._1
2054+ let staked = $t06778067906._2
20532055 (([IntegerEntry((pool + kPoolTotal), (totalShareAmount + staked))] ++ capEnterise) ++ getCursEntries(AId, BId, shareId, nil))
20542056 }
20552057 else throw("Strict value is not equal to itself.")
20672069 else false)
20682070 then throw("Wrong pool type")
20692071 else {
2070- let $t06851768611 = getPoolData(Address(fromBase58String(poolAddr)), type)
2071- let aId = $t06851768611._1
2072- let bId = $t06851768611._2
2073- let aBal = $t06851768611._3
2074- let bBal = $t06851768611._4
2075- let shareId = $t06851768611._5
2072+ let $t06856068654 = getPoolData(Address(fromBase58String(poolAddr)), type)
2073+ let aId = $t06856068654._1
2074+ let bId = $t06856068654._2
2075+ let aBal = $t06856068654._3
2076+ let bBal = $t06856068654._4
2077+ let shareId = $t06856068654._5
20762078 if ((0 > inFeeNoLoan))
20772079 then throw("inFeeNoLoan must be greater than 0")
20782080 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 kPoolAllowedBorrowAssets = "_poolAllowedBorrowAssets"
8181
8282 let kPoolCanBorrow = "_poolCanBorrow"
8383
8484 let kPoolPMArket = "_poolPuzzleMarket"
8585
8686 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
8787
8888 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
8989
9090 let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
9191
9292 let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
9393
9494 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
9595
9696 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
9797
9898 let kRequestId = "_request_id"
9999
100100 let kRequestIter = "requests_iter"
101101
102102 let kPool = "pool_"
103103
104104 let kPoolType = "_poolType"
105105
106106 let kSharePool = "_poolShareId"
107107
108108 let kPoolCapChange = "_poolCapChange"
109109
110110 let kTokenLastPrice = "last_price"
111111
112112 let kPriceInOracle = "_twap5B"
113113
114114 let kActive = "active"
115115
116116 let kActiveUsers = "activeUsers"
117117
118118 let kActiveSFWX = "_active"
119119
120120 let kPoolActive = "_activePool"
121121
122122 let kUserStopLoss = "_stopLoss"
123123
124124 let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
125125
126126 let kPoolProxyAddr = "_poolProxyAddress"
127127
128128 let kMoneyBox = "axly_money_box"
129129
130130 let kSFFarmingAddr = "swopfi_farming_addr"
131131
132132 let kLendService = "lend_service_addr"
133133
134134 let kOperatorCallPK = "admin_call_pub_key"
135135
136136 let kPriceOracle = "price_oracle"
137137
138138 let kExContract = "exchange_contract"
139139
140140 let kWxSwapContract = "wx_swap_contract"
141141
142142 let kWxRest = "wx_rest_addr"
143143
144144 let kSwopId = "swop_id"
145145
146146 let kWxId = "wx_id"
147147
148148 let kPMarketAddr = "puzzle_market_address"
149149
150150 let kPMarketRestAddr = "puzzle_market_rest_address"
151151
152152 let kGroup1Admin1PK = "group1_admin1_pub_key"
153153
154154 let kGroup1Admin2PK = "group1_admin2_pub_key"
155155
156156 let kGroup1Admin3PK = "group1_admin3_pub_key"
157157
158158 let kGroup2Admin1PK = "group2_admin1_pub_key"
159159
160160 let kGroup2Admin2PK = "group2_admin2_pub_key"
161161
162162 let moneyBox = addressFromStringValue(valueOrErrorMessage(getString(CONF, kMoneyBox), "No axly moneyBox address"))
163163
164164 let exContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kExContract), "No exchange contract address"))
165165
166166 let priceOracleAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPriceOracle), "No price oracle address"))
167167
168168 let wxSwapContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxSwapContract), "No wx swap address"))
169169
170170 let wxRest = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxRest), "No wx rest address"))
171171
172172 let SWOPID = fromBase58String(valueOrErrorMessage(getString(CONF, kSwopId), "No swop id"))
173173
174174 let WXID = fromBase58String(valueOrErrorMessage(getString(CONF, kWxId), "No wx id"))
175175
176176 let pMarketAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketAddr), "No puzzle market address"))
177177
178178 let pMarketRestAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketRestAddr), "No puzzle market rest address"))
179179
180180 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
181181
182182 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
183183
184184 let group1Admin3PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin3PK), "Can't get kGroup1Admin3PK"))
185185
186186 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
187187
188188 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
189189
190190 let operatorPK = fromBase58String(valueOrErrorMessage(getString(CONF, kOperatorCallPK), "Can't get operatorPK"))
191191
192192 func unknownPoolType () = throw("Wrong pool type")
193193
194194
195195 func getLendSrvAddr () = addressFromStringValue(valueOrErrorMessage(getString(CONF, kLendService), "Can't get lend service addr"))
196196
197197
198198 func isOperatorCall (i) = if (if ((i.callerPublicKey == operatorPK))
199199 then true
200200 else (i.caller == moneyBox))
201201 then unit
202202 else throw("Only operator can call this function")
203203
204204
205205 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
206206 then true
207207 else (i.callerPublicKey == group1Admin2PK))
208208 then unit
209209 else throw("Only admin group1 can call this function")
210210
211211
212212 func isSelfCall (i) = if ((i.caller == this))
213213 then unit
214214 else throw("Only contract itself can call this function")
215215
216216
217217 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
218218 then unit
219219 else throw("Only land contract can call this function")
220220
221221
222222 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
223223 then unit
224224 else throw("DApp is inactive at this moment")
225225
226226
227227 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
228228 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
229229 else false)
230230 then unit
231231 else throw("DApp is inactive for users at this moment")
232232
233233
234234 func isPoolActive (pool,type) = {
235235 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
236236 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
237237 if (if (WXSFActive)
238238 then poolActive
239239 else false)
240240 then true
241241 else false
242242 }
243243
244244
245245 func accountBalance (assetId) = match assetId {
246246 case id: ByteVector =>
247247 assetBalance(this, id)
248248 case waves: Unit =>
249249 wavesBalance(this).available
250250 case _ =>
251251 throw("Match error")
252252 }
253253
254254
255255 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"))
256256
257257
258258 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
259259 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
260260 if ($isInstanceOf(@, "Int"))
261261 then @
262262 else throw(($getType(@) + " couldn't be cast to Int"))
263263 }, {
264264 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
265265 if ($isInstanceOf(@, "Int"))
266266 then @
267267 else throw(($getType(@) + " couldn't be cast to Int"))
268268 })
269269
270270
271271 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
272272 then getSFPoolBalances(poolAddr)
273273 else if ((type == WX_POOL))
274274 then getWXPoolBalances(poolAddr, aId, bId)
275275 else unknownPoolType()
276276
277277
278278 func getSFPoolData (poolAddr) = {
279279 let $t097399788 = getSFPoolBalances(poolAddr)
280280 if (($t097399788 == $t097399788))
281281 then {
282282 let balB = $t097399788._2
283283 let balA = $t097399788._1
284284 $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"))
285285 }
286286 else throw("Strict value is not equal to itself.")
287287 }
288288
289289
290290 func getWXPoolData (poolAddr) = {
291291 let cfg = {
292292 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
293293 if ($isInstanceOf(@, "List[Any]"))
294294 then @
295295 else throw(($getType(@) + " couldn't be cast to List[Any]"))
296296 }
297297 if ((cfg == cfg))
298298 then {
299299 let aId = valueOrErrorMessage({
300300 let @ = cfg[4]
301301 if ($isInstanceOf(@, "String"))
302302 then @
303303 else unit
304304 }, "Can't get pool A asset id")
305305 let bId = valueOrErrorMessage({
306306 let @ = cfg[5]
307307 if ($isInstanceOf(@, "String"))
308308 then @
309309 else unit
310310 }, "Can't get pool B asset id")
311311 let shareId = valueOrErrorMessage({
312312 let @ = cfg[3]
313313 if ($isInstanceOf(@, "String"))
314314 then @
315315 else unit
316316 }, "Can't get pool LP asset id")
317317 let $t01048510544 = getWXPoolBalances(poolAddr, aId, bId)
318318 if (($t01048510544 == $t01048510544))
319319 then {
320320 let balB = $t01048510544._2
321321 let balA = $t01048510544._1
322322 $Tuple5(aId, bId, balA, balB, shareId)
323323 }
324324 else throw("Strict value is not equal to itself.")
325325 }
326326 else throw("Strict value is not equal to itself.")
327327 }
328328
329329
330330 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
331331 then getSFPoolData(poolAddr)
332332 else if ((type == WX_POOL))
333333 then getWXPoolData(poolAddr)
334334 else unknownPoolType()
335335
336336
337337 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
338338 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
339339 else if ((type == WX_POOL))
340340 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
341341 else unknownPoolType()
342342
343343
344344 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
345345
346346
347347 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
348348
349349
350350 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
351351
352352
353353 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
354354 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
355355 else if ((feeType == CAP_FEE_NO_LOAN))
356356 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
357357 else if ((feeType == LOAN_FEE))
358358 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
359359 else if ((feeType == NO_LOAN_FEE))
360360 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
361361 else if ((feeType == NO_FEE))
362362 then 0
363363 else throw("Wrong fee type")
364364
365365
366366 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(CONF, kSFFarmingAddr), "Can't get swopfi farming addr")))
367367
368368
369369 func getWXFarmingAddr (poolAddr) = {
370370 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
371371 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
372372 Address(fromBase58String(factroyCfg[1]))
373373 }
374374
375375
376376 func assetIdToStr (assetId) = match assetId {
377377 case id: ByteVector =>
378378 toBase58String(id)
379379 case waves: Unit =>
380380 "WAVES"
381381 case _ =>
382382 throw("Not Asset id")
383383 }
384384
385385
386386 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
387387 then unit
388388 else fromBase58String(assetId)
389389
390390
391391 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
392392 then 8
393393 else match assetInfo(fromBase58String(assetId)) {
394394 case asset: Asset =>
395395 asset.decimals
396396 case _ =>
397397 throw("Can't find asset")
398398 }
399399
400400
401401 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
402402
403403
404404 func getAssetsPrice (assetIds) = {
405405 func getPrices (a,assetId) = {
406406 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
407407 (a :+ assetPrice)
408408 }
409409
410410 let $l = assetIds
411411 let $s = size($l)
412412 let $acc0 = nil
413413 func $f0_1 ($a,$i) = if (($i >= $s))
414414 then $a
415415 else getPrices($a, $l[$i])
416416
417417 func $f0_2 ($a,$i) = if (($i >= $s))
418418 then $a
419419 else throw("List size exceeds 50")
420420
421421 $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)
422422 }
423423
424424
425425 func getSharePrice (shareId) = {
426426 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
427427 let poolAddr = Address(fromBase58String(pool))
428428 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
429429 let $t01353313598 = getPoolData(poolAddr, pType)
430430 let aId = $t01353313598._1
431431 let bId = $t01353313598._2
432432 let aBalance = $t01353313598._3
433433 let bBalance = $t01353313598._4
434434 let prices = getAssetsPrice([aId, bId])
435435 let dPriceA = prices[0]
436436 let dPriceB = prices[1]
437437 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
438438 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
439439 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
440440 let shareSupply = getShareSupply(poolAddr, pType, shareId)
441441 let sum = if (if ((dPriceA > 0))
442442 then (dPriceB > 0)
443443 else false)
444444 then (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
445445 else if ((dPriceA > 0))
446446 then (fraction(aBalance, dPriceA, APrecision) * 2)
447447 else if ((dPriceB > 0))
448448 then (fraction(bBalance, dPriceB, BPrecision) * 2)
449449 else -1
450450 if ((0 > sum))
451451 then -1
452452 else fraction(sum, sharePrecision, shareSupply)
453453 }
454454
455455
456456 func getSharePrices (shareIds) = {
457457 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
458458
459459 let $l = shareIds
460460 let $s = size($l)
461461 let $acc0 = nil
462462 func $f0_1 ($a,$i) = if (($i >= $s))
463463 then $a
464464 else getPrices($a, $l[$i])
465465
466466 func $f0_2 ($a,$i) = if (($i >= $s))
467467 then $a
468468 else throw("List size exceeds 20")
469469
470470 $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)
471471 }
472472
473473
474474 func getCursEntries (aId,bId,shareId,wAmounts) = {
475475 let assetsPrices = getAssetsPrice([aId, bId])
476476 let sharePrice = getSharePrice(shareId)
477477 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
478478 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
479479 }
480480
481481
482482 func calcReplenishByTwoTokens (pType,poolAddr,LPId,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
483483 then {
484484 let repl = {
485485 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
486486 if ($isInstanceOf(@, "List[Any]"))
487487 then @
488488 else throw(($getType(@) + " couldn't be cast to List[Any]"))
489489 }
490490 if ((repl == repl))
491491 then $Tuple5({
492492 let @ = repl[3]
493493 if ($isInstanceOf(@, "Int"))
494494 then @
495495 else throw(($getType(@) + " couldn't be cast to Int"))
496496 }, {
497497 let @ = repl[4]
498498 if ($isInstanceOf(@, "Int"))
499499 then @
500500 else throw(($getType(@) + " couldn't be cast to Int"))
501501 }, {
502502 let @ = repl[1]
503503 if ($isInstanceOf(@, "Int"))
504504 then @
505505 else throw(($getType(@) + " couldn't be cast to Int"))
506506 }, assetIdToStr(repl[2]), {
507507 let @ = repl[0]
508508 if ($isInstanceOf(@, "Int"))
509509 then @
510510 else throw(($getType(@) + " couldn't be cast to Int"))
511511 })
512512 else throw("Strict value is not equal to itself.")
513513 }
514514 else if ((pType == WX_POOL))
515515 then {
516516 let $t01535315619 = $Tuple2(split({
517517 let @ = invoke(wxRest, "poolEvaluatePutByAmountAssetREADONLY", [LPId, pmtA], nil)
518518 if ($isInstanceOf(@, "String"))
519519 then @
520520 else throw(($getType(@) + " couldn't be cast to String"))
521521 }, "__"), split({
522522 let @ = invoke(wxRest, "poolEvaluatePutByPriceAssetREADONLY", [LPId, pmtB], nil)
523523 if ($isInstanceOf(@, "String"))
524524 then @
525525 else throw(($getType(@) + " couldn't be cast to String"))
526526 }, "__"))
527527 if (($t01535315619 == $t01535315619))
528528 then {
529529 let evalPutInB = $t01535315619._2
530530 let evalPutInA = $t01535315619._1
531531 let lpInA = parseIntValue(evalPutInA[1])
532532 let lpInB = parseIntValue(evalPutInB[1])
533533 if ((lpInB > lpInA))
534534 then {
535535 let pmt = parseIntValue(evalPutInA[8])
536536 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
537537 }
538538 else {
539539 let pmt = parseIntValue(evalPutInB[7])
540540 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
541541 }
542542 }
543543 else throw("Strict value is not equal to itself.")
544544 }
545545 else unknownPoolType()
546546
547547
548548 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId,lpId) = {
549549 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
550550 let proxyAddr = valueOrElse(getString(this, (toString(poolAddr) + kPoolProxyAddr)), "")
551551 if ((pType == SF_POOL))
552552 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
553553 else if ((pType == WX_POOL))
554554 then if ((proxyAddr == ""))
555555 then invoke(poolAddr, "put", [1000000, false], payments)
556556 else invoke(addressFromStringValue(proxyAddr), "wxReplenishTwoTokens", [toString(poolAddr), lpId, 1000000, false], payments)
557557 else unknownPoolType()
558558 }
559559
560560
561561 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId,lpId) = {
562562 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
563563 let proxyAddr = valueOrElse(getString(this, (toString(poolAddr) + kPoolProxyAddr)), "")
564564 if ((pType == SF_POOL))
565565 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
566566 else if ((pType == WX_POOL))
567567 then {
568568 let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
569569 then "putOneTknV2"
570570 else "putOneTkn"
571571 if ((proxyAddr == ""))
572572 then invoke(poolAddr, fc, [0, false], payments)
573573 else invoke(addressFromStringValue(proxyAddr), "wxReplenishOneToken", [toString(poolAddr), lpId, fc, 0, false], payments)
574574 }
575575 else unknownPoolType()
576576 }
577577
578578
579579 func stakeLP (pool,pType,shareId,amount,stakeToMarket) = {
580580 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
581581 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
582582 if (stakeToMarket)
583583 then invoke(pMarketAddr, "supply", nil, payments)
584584 else if ((pType == SF_POOL))
585585 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
586586 else if ((pType == WX_POOL))
587587 then {
588588 let farmAddr = getWXFarmingAddr(addressFromStringValue(pool))
589589 if ((proxyAddr == ""))
590590 then invoke(farmAddr, "stake", nil, payments)
591591 else invoke(addressFromStringValue(proxyAddr), "wxStakeLp", [toString(farmAddr)], payments)
592592 }
593593 else unknownPoolType()
594594 }
595595
596596
597597 func unstakeLP (pool,pType,shareId,amount,fromMarket) = {
598598 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
599599 let $t01835619038 = if (fromMarket)
600600 then $Tuple3(pMarketAddr, "withdraw", [shareId, amount])
601601 else if ((pType == SF_POOL))
602602 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
603603 else if ((pType == WX_POOL))
604604 then {
605605 let farmAddr = getWXFarmingAddr(Address(fromBase58String(pool)))
606606 if ((proxyAddr == ""))
607607 then $Tuple3(farmAddr, "unstake", [shareId, amount])
608608 else $Tuple3(addressFromStringValue(proxyAddr), "wxUnstakeLp", [toString(farmAddr), shareId, amount])
609609 }
610610 else unknownPoolType()
611611 let farmAddr = $t01835619038._1
612612 let fName = $t01835619038._2
613613 let params = $t01835619038._3
614614 let inv = invoke(farmAddr, fName, params, nil)
615615 if ((inv == inv))
616616 then amount
617617 else throw("Strict value is not equal to itself.")
618618 }
619619
620620
621621 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
622622 let poolAddr = Address(fromBase58String(pool))
623623 let feeScale6 = 1000000
624624 let fee = getIntegerValue(poolAddr, kSFPoolFee)
625625 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
626626 let $t01946019766 = if ((assetTokenToGet == assetIdA))
627627 then {
628628 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
629629 $Tuple2(amountToPay, assetIdB)
630630 }
631631 else {
632632 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
633633 $Tuple2(amountToPay, assetIdA)
634634 }
635635 let amountToPay = $t01946019766._1
636636 let assetToPay = $t01946019766._2
637637 $Tuple2(assetToPay, amountToPay)
638638 }
639639
640640
641641 func getWXSwapFees (pool) = {
642642 let poolAddr = addressFromStringValue(pool)
643643 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
644644 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
645645 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
646646 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
647647 case fees: (Int, Int) =>
648648 $Tuple2(fees._1, fees._2)
649649 case _ =>
650650 $Tuple2(poolFeeDefault, protocolFeeDefault)
651651 }
652652 }
653653
654654
655655 func getWXPoolReverse (poolAddr,assetIn,assetOut) = {
656656 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
657657 let lpNonReverse = {
658658 let @ = invoke(fContract, "getLpAssetFromPoolAssetsREADONLY", [assetIn, assetOut], nil)
659659 if ($isInstanceOf(@, "String"))
660660 then @
661661 else unit
662662 }
663663 let lpReverse = {
664664 let @ = invoke(fContract, "getLpAssetFromPoolAssetsREADONLY", [assetOut, assetIn], nil)
665665 if ($isInstanceOf(@, "String"))
666666 then @
667667 else unit
668668 }
669669 if ((lpNonReverse != unit))
670670 then false
671671 else if ((lpReverse != unit))
672672 then true
673673 else throw("Pool is not exist")
674674 }
675675
676676
677677 func calcFlatToPay (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
678678 let assetIn = if ((assetTokenToGet == assetIdA))
679679 then assetIdB
680680 else assetIdA
681681 let amoutGet = {
682682 let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [amountTokenToGet, assetIn, assetTokenToGet], nil)
683683 if ($isInstanceOf(@, "Int"))
684684 then @
685685 else throw(($getType(@) + " couldn't be cast to Int"))
686686 }
687687 if ((amoutGet == amoutGet))
688688 then if ((amoutGet == amountTokenToGet))
689689 then $Tuple2(assetIn, amountTokenToGet)
690690 else {
691- let amountToPayMax = {
691+ let $t02137921830 = {
692692 let aPM = if ((amountTokenToGet > amoutGet))
693693 then fraction(amountTokenToGet, 110, 100)
694694 else fraction(amountTokenToGet, 90, 100)
695695 let amountGetMax = {
696696 let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [aPM, assetIn, assetTokenToGet], nil)
697697 if ($isInstanceOf(@, "Int"))
698698 then @
699699 else throw(($getType(@) + " couldn't be cast to Int"))
700700 }
701701 if ((amountGetMax == amountGetMax))
702702 then if ((amoutGet > amountGetMax))
703- then fraction(aPM, 110, 100)
704- else aPM
703+ then $Tuple2(aPM, fraction(aPM, 110, 100))
704+ else $Tuple2(amountTokenToGet, aPM)
705705 else throw("Strict value is not equal to itself.")
706706 }
707+ let amountToPayMin = $t02137921830._1
708+ let amountToPayMax = $t02137921830._2
707709 func hdm (a,index) = {
708- let $t02183221853 = a
709- let pay = $t02183221853._1
710- let payMax = $t02183221853._2
710+ let $t02187721898 = a
711+ let pay = $t02187721898._1
712+ let payMax = $t02187721898._2
711713 let payNext = ((pay + payMax) / 2)
712714 let amountGetNext = {
713715 let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [payNext, assetIn, assetTokenToGet], nil)
714716 if ($isInstanceOf(@, "Int"))
715717 then @
716718 else throw(($getType(@) + " couldn't be cast to Int"))
717719 }
718720 if ((amountGetNext == amountGetNext))
719721 then if ((amountTokenToGet > amountGetNext))
720722 then $Tuple2(payNext, payMax)
721723 else $Tuple2(pay, payNext)
722724 else throw("Strict value is not equal to itself.")
723725 }
724726
725727 let resAmntToPay = {
726728 let $l = [1, 2]
727729 let $s = size($l)
728- let $acc0 = $Tuple2(amountTokenToGet, amountToPayMax)
730+ let $acc0 = $Tuple2(amountToPayMin, amountToPayMax)
729731 func $f0_1 ($a,$i) = if (($i >= $s))
730732 then $a
731733 else hdm($a, $l[$i])
732734
733735 func $f0_2 ($a,$i) = if (($i >= $s))
734736 then $a
735737 else throw("List size exceeds 2")
736738
737739 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
738740 }
739741 let amountToPay = if ((amountTokenToGet > amoutGet))
740742 then resAmntToPay._2
741743 else resAmntToPay._1
742744 $Tuple2(assetIn, amountToPay)
743745 }
744746 else throw("Strict value is not equal to itself.")
745747 }
746748
747749
748750 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
749- let $t02245122490 = getWXSwapFees(pool)
750- let pFee = $t02245122490._1
751- let prFee = $t02245122490._2
751+ let $t02249422533 = getWXSwapFees(pool)
752+ let pFee = $t02249422533._1
753+ let prFee = $t02249422533._2
752754 let poolType = valueOrElse(getString(this, (pool + kPoolType)), CPMM)
753755 let feeScale = toBigInt(100000000)
754756 if ((poolType == FLAT))
755757 then calcFlatToPay(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
756758 else {
757- let $t02272323031 = if ((assetTokenToGet == assetIdA))
759+ let $t02276623074 = if ((assetTokenToGet == assetIdA))
758760 then {
759761 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
760762 $Tuple2(amountToPay, assetIdB)
761763 }
762764 else {
763765 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
764766 $Tuple2(amountToPay, assetIdA)
765767 }
766- let amountToPay = $t02272323031._1
767- let assetToPay = $t02272323031._2
768+ let amountToPay = $t02276623074._1
769+ let assetToPay = $t02276623074._2
768770 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
769771 $Tuple2(assetToPay, amountToPayWithFee)
770772 }
771773 }
772774
773775
774776 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
775777 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
776778 if (if ((pType == SF_POOL))
777779 then true
778780 else (poolFB != ""))
779781 then {
780- let $t02347223684 = if ((poolFB == ""))
782+ let $t02351523727 = if ((poolFB == ""))
781783 then $Tuple3(balA, balB, pool)
782784 else {
783- let $t02357823651 = getSFPoolBalances(addressFromStringValue(poolFB))
784- let sfBalA = $t02357823651._1
785- let sfBalB = $t02357823651._2
785+ let $t02362123694 = getSFPoolBalances(addressFromStringValue(poolFB))
786+ let sfBalA = $t02362123694._1
787+ let sfBalB = $t02362123694._2
786788 $Tuple3(sfBalA, sfBalB, poolFB)
787789 }
788- let pBalA = $t02347223684._1
789- let pBalB = $t02347223684._2
790- let exPool = $t02347223684._3
791- let $t02368923815 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
792- let assetToPay = $t02368923815._1
793- let amountToPay = $t02368923815._2
790+ let pBalA = $t02351523727._1
791+ let pBalB = $t02351523727._2
792+ let exPool = $t02351523727._3
793+ let $t02373223858 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
794+ let assetToPay = $t02373223858._1
795+ let amountToPay = $t02373223858._2
794796 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
795797 }
796798 else if ((pType == WX_POOL))
797799 then {
798- let $t02401724139 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
799- let assetToPay = $t02401724139._1
800- let amountToPay = $t02401724139._2
800+ let $t02406024182 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
801+ let assetToPay = $t02406024182._1
802+ let amountToPay = $t02406024182._2
801803 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
802804 }
803805 else unknownPoolType()
804806 }
805807
806808
807809 func exchangeDirectlyNoLim (pType,pool,amountTokenEx,assetTokenToEx,assetTokenToGet) = {
808810 let balBefore = accountBalance(assetIdFromStr(assetTokenToGet))
809811 if ((balBefore == balBefore))
810812 then {
811813 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
812814 let inv = if (if ((pType == SF_POOL))
813815 then true
814816 else (poolFB != ""))
815817 then {
816818 let exPool = if ((poolFB == ""))
817819 then pool
818820 else poolFB
819821 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", ["1"]], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
820822 }
821823 else if ((pType == WX_POOL))
822824 then invoke(wxSwapContract, "swap", [1, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
823825 else unknownPoolType()
824826 if ((inv == inv))
825827 then {
826828 let balAfter = accountBalance(assetIdFromStr(assetTokenToGet))
827829 if ((balAfter == balAfter))
828830 then (balAfter - balBefore)
829831 else throw("Strict value is not equal to itself.")
830832 }
831833 else throw("Strict value is not equal to itself.")
832834 }
833835 else throw("Strict value is not equal to itself.")
834836 }
835837
836838
837839 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
838- let $t02526825739 = if ((pType == SF_POOL))
840+ let $t02531125782 = if ((pType == SF_POOL))
839841 then {
840842 let inv = {
841843 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
842844 if ($isInstanceOf(@, "List[Any]"))
843845 then @
844846 else throw(($getType(@) + " couldn't be cast to List[Any]"))
845847 }
846848 if ((inv == inv))
847849 then $Tuple2({
848850 let @ = inv[0]
849851 if ($isInstanceOf(@, "Int"))
850852 then @
851853 else throw(($getType(@) + " couldn't be cast to Int"))
852854 }, {
853855 let @ = inv[1]
854856 if ($isInstanceOf(@, "Int"))
855857 then @
856858 else throw(($getType(@) + " couldn't be cast to Int"))
857859 })
858860 else throw("Strict value is not equal to itself.")
859861 }
860862 else if ((pType == WX_POOL))
861863 then {
862864 let inv = split({
863865 let @ = invoke(wxRest, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
864866 if ($isInstanceOf(@, "String"))
865867 then @
866868 else throw(($getType(@) + " couldn't be cast to String"))
867869 }, "__")
868870 if ((inv == inv))
869871 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
870872 else throw("Strict value is not equal to itself.")
871873 }
872874 else unknownPoolType()
873- let amountA = $t02526825739._1
874- let amountB = $t02526825739._2
875+ let amountA = $t02531125782._1
876+ let amountB = $t02531125782._2
875877 $Tuple2(amountA, amountB)
876878 }
877879
878880
879881 func claimFarmed (pType,pool) = {
880882 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
881883 if ((pType == SF_POOL))
882884 then {
883885 let balBefore = accountBalance(SWOPID)
884886 if ((balBefore == balBefore))
885887 then {
886888 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
887889 if ((inv == inv))
888890 then {
889891 let balAfter = accountBalance(SWOPID)
890892 $Tuple2((balAfter - balBefore), SWOPID)
891893 }
892894 else throw("Strict value is not equal to itself.")
893895 }
894896 else throw("Strict value is not equal to itself.")
895897 }
896898 else if ((pType == WX_POOL))
897899 then {
898- let $t02617926258 = getWXPoolData(addressFromStringValue(pool))
899- let aId = $t02617926258._1
900- let bId = $t02617926258._2
901- let aBal = $t02617926258._3
902- let bBal = $t02617926258._4
903- let lpId = $t02617926258._5
900+ let $t02622226301 = getWXPoolData(addressFromStringValue(pool))
901+ let aId = $t02622226301._1
902+ let bId = $t02622226301._2
903+ let aBal = $t02622226301._3
904+ let bBal = $t02622226301._4
905+ let lpId = $t02622226301._5
904906 let balBefore = accountBalance(WXID)
905907 if ((balBefore == balBefore))
906908 then {
907909 let farmAddr = getWXFarmingAddr(addressFromStringValue(pool))
908910 let inv = if ((proxyAddr == ""))
909911 then invoke(farmAddr, "claimWx", [lpId], nil)
910912 else invoke(addressFromStringValue(proxyAddr), "wxClaimFarmed", [toString(farmAddr), lpId], nil)
911913 if ((inv == inv))
912914 then {
913915 let balAfter = accountBalance(WXID)
914916 $Tuple2((balAfter - balBefore), WXID)
915917 }
916918 else throw("Strict value is not equal to itself.")
917919 }
918920 else throw("Strict value is not equal to itself.")
919921 }
920922 else unknownPoolType()
921923 }
922924
923925
924926 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId,stakeMarket) = {
925927 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
926928 if ((lpBalanceBefore == lpBalanceBefore))
927929 then {
928930 let poolAddr = addressFromStringValue(pool)
929- let $t02706327491 = if (if ((pmtA > 0))
931+ let $t02710627534 = if (if ((pmtA > 0))
930932 then (pmtB > 0)
931933 else false)
932934 then {
933- let $t02712927251 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
934- let pmtInA = $t02712927251._1
935- let pmtInB = $t02712927251._2
936- let change = $t02712927251._3
937- let changeId = $t02712927251._4
935+ let $t02717227294 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
936+ let pmtInA = $t02717227294._1
937+ let pmtInB = $t02717227294._2
938+ let change = $t02717227294._3
939+ let changeId = $t02717227294._4
938940 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId, LPId)
939941 if ((inv == inv))
940942 then $Tuple2(change, changeId)
941943 else throw("Strict value is not equal to itself.")
942944 }
943945 else if ((pmtA > 0))
944946 then $Tuple2(pmtA, aId)
945947 else if ((pmtB > 0))
946948 then $Tuple2(pmtB, bId)
947949 else throw("pmts must be > 0")
948- let change = $t02706327491._1
949- let changeId = $t02706327491._2
950+ let change = $t02710627534._1
951+ let changeId = $t02710627534._2
950952 let inv = if ((change > 0))
951953 then replenishOneTokenByType(poolAddr, pType, change, changeId, LPId)
952954 else nil
953955 if ((inv == inv))
954956 then {
955957 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
956958 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
957959 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
958960 let userShareForStake = (totalStaked - axlyFeeAmount)
959961 if ((0 >= userShareForStake))
960962 then throw("amount of staked sharetokens must be > 0")
961963 else {
962964 let invLP = stakeLP(pool, pType, LPId, userShareForStake, stakeMarket)
963965 if ((invLP == invLP))
964966 then $Tuple2(userShareForStake, axlyFeeAmount)
965967 else throw("Strict value is not equal to itself.")
966968 }
967969 }
968970 else throw("Strict value is not equal to itself.")
969971 }
970972 else throw("Strict value is not equal to itself.")
971973 }
972974
973975
974976 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan,stakeToMarket) = {
975977 let totalAmount = getPoolTotalShare(pool)
976978 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
977979 let totalAmountMarket = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
978980 let totalAmountMarketLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
979981 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
980982 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
981983 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
982984 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
983- let $t02895229777 = if (withLoan)
985+ let $t02899529820 = if (withLoan)
984986 then if (stakeToMarket)
985987 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
986988 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
987989 else if (stakeToMarket)
988990 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
989991 else $Tuple2(poolInterestNoLoan, nil)
990- let curPoolInterest = $t02895229777._1
991- let adEntry = $t02895229777._2
992+ let curPoolInterest = $t02899529820._1
993+ let adEntry = $t02899529820._2
992994 ([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)
993995 }
994996
995997
996998 func listToInt (a,item) = (a :+ parseIntValue(item))
997999
9981000
9991001 func directSwopfiCPMM (rArgs,tokenTo) = {
10001002 let dApp = addressFromStringValue(rArgs[1])
10011003 let pmtP = split(rArgs[2], "|")
10021004 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
10031005 if ((tokenBalanceBefore == tokenBalanceBefore))
10041006 then {
10051007 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
10061008 let minToRecive = rArgs[3]
10071009 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
10081010 if ((inv == inv))
10091011 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
10101012 else throw("Strict value is not equal to itself.")
10111013 }
10121014 else throw("Strict value is not equal to itself.")
10131015 }
10141016
10151017
10161018 func directRoutingSwopfi (rArgs,tokenTo) = {
10171019 let dApp = addressFromStringValue(rArgs[1])
10181020 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
10191021 if ((tokenBalanceBefore == tokenBalanceBefore))
10201022 then {
10211023 let pmt = {
10221024 let pmtP = split(rArgs[2], "|")
10231025 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
10241026 }
10251027 let args = {
10261028 let eArgs = split(rArgs[3], "|")
10271029 let exchangers = split(eArgs[0], ",")
10281030 let exchangersType = split(eArgs[1], ",")
10291031 let args1 = {
10301032 let $l = split(eArgs[2], ",")
10311033 let $s = size($l)
10321034 let $acc0 = nil
10331035 func $f0_1 ($a,$i) = if (($i >= $s))
10341036 then $a
10351037 else listToInt($a, $l[$i])
10361038
10371039 func $f0_2 ($a,$i) = if (($i >= $s))
10381040 then $a
10391041 else throw("List size exceeds 3")
10401042
10411043 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
10421044 }
10431045 let args2 = {
10441046 let $l = split(eArgs[3], ",")
10451047 let $s = size($l)
10461048 let $acc0 = nil
10471049 func $f1_1 ($a,$i) = if (($i >= $s))
10481050 then $a
10491051 else listToInt($a, $l[$i])
10501052
10511053 func $f1_2 ($a,$i) = if (($i >= $s))
10521054 then $a
10531055 else throw("List size exceeds 3")
10541056
10551057 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
10561058 }
10571059 let routingAssetsKeys = split(eArgs[4], ",")
10581060 let minToRecive = parseIntValue(eArgs[5])
10591061 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
10601062 }
10611063 let inv = invoke(dApp, "routingTrade", args, pmt)
10621064 if ((inv == inv))
10631065 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
10641066 else throw("Strict value is not equal to itself.")
10651067 }
10661068 else throw("Strict value is not equal to itself.")
10671069 }
10681070
10691071
10701072 func capitalize (pool,pType,tokenId,tokenAmount,AId,BId,balA,balB,shareId) = if (if ((tokenId != AId))
10711073 then (tokenId != BId)
10721074 else false)
10731075 then throw("Wrong asset")
10741076 else {
10751077 let totalShareAmount = getPoolTotalShare(pool)
10761078 if ((totalShareAmount == 0))
10771079 then $Tuple2([ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))], 0)
10781080 else {
10791081 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
10801082 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
10811083 if ((0 > ((totalShareAmount - totalMarketAmount) - totalShareAmountWithLoan)))
10821084 then throw("Error with share amount totalShareAmount < totalShareAmountWithLoan")
10831085 else {
10841086 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, (totalShareAmount - totalMarketAmount))
10851087 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
10861088 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
10871089 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
10881090 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
10891091 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
1090- let $t03285532955 = if ((tokenId == AId))
1092+ let $t03289832998 = if ((tokenId == AId))
10911093 then $Tuple2((tokenAmount - axlyFee), 0)
10921094 else $Tuple2(0, (tokenAmount - axlyFee))
1093- let pmtA = $t03285532955._1
1094- let pmtB = $t03285532955._2
1095- let $t03295833069 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1096- let stakedAmount = $t03295833069._1
1097- let nf = $t03295833069._2
1095+ let pmtA = $t03289832998._1
1096+ let pmtB = $t03289832998._2
1097+ let $t03300133112 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1098+ let stakedAmount = $t03300133112._1
1099+ let nf = $t03300133112._2
10981100 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
10991101 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
11001102 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
11011103 let stakedNoLoan = (stakedAmount - stakedLoan)
11021104 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
11031105 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
11041106 else 0
11051107 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
11061108 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
11071109 else 0
11081110 $Tuple2([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))], stakedAmount)
11091111 }
11101112 }
11111113 }
11121114
11131115
11141116 func capitalizePuzzleMarket (pool,pType,shareId) = {
11151117 let totalShareAmount = getPoolTotalShare(pool)
11161118 let marketBalance = assetBalance(pMarketAddr, fromBase58String(shareId))
11171119 if ((marketBalance == marketBalance))
11181120 then {
11191121 let marketAvailable = {
11201122 let @ = invoke(pMarketRestAddr, "assetSupplyByAddressREADONLY", [toString(pMarketAddr), shareId, toString(this)], nil)
11211123 if ($isInstanceOf(@, "Int"))
11221124 then @
11231125 else throw(($getType(@) + " couldn't be cast to Int"))
11241126 }
11251127 if ((marketAvailable == marketAvailable))
11261128 then {
11271129 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
11281130 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
11291131 if (if ((totalMarketAmount == 0))
11301132 then (marketAvailable > 0)
11311133 else false)
11321134 then {
11331135 let unstakedAmount = unstakeLP(pool, pType, shareId, marketAvailable, true)
11341136 if ((unstakedAmount == unstakedAmount))
11351137 then if ((marketBalance > unstakedAmount))
11361138 then $Tuple2([ScriptTransfer(moneyBox, unstakedAmount, fromBase58String(shareId))], 0)
11371139 else $Tuple2(nil, 0)
11381140 else throw("Strict value is not equal to itself.")
11391141 }
11401142 else {
11411143 let capAmount = (marketAvailable - totalMarketAmount)
11421144 if ((0 >= capAmount))
11431145 then $Tuple2(nil, 0)
11441146 else {
11451147 let marketLoanPercent = fraction(totalMarketAmountWithLoan, SCALE8, totalMarketAmount)
11461148 let tokensMarketForFeeLoan = fraction(capAmount, marketLoanPercent, SCALE8)
11471149 let tokensMarketForForFeeNoLoan = (capAmount - tokensMarketForFeeLoan)
11481150 let axlyMarketFeeLoan = fraction(tokensMarketForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
11491151 let axlyMarketFeeNoLoan = fraction(tokensMarketForForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
11501152 let axlyMarketFee = (axlyMarketFeeLoan + axlyMarketFeeNoLoan)
11511153 if ((axlyMarketFee > marketBalance))
11521154 then $Tuple2(nil, 0)
11531155 else {
11541156 let stakedMarketAmount = (capAmount - axlyMarketFee)
11551157 let stakedMarketLoan = fraction(stakedMarketAmount, marketLoanPercent, SCALE8)
11561158 let stakedMarketNoLoan = (stakedMarketAmount - stakedMarketLoan)
11571159 let curPoolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
11581160 let curPoolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
11591161 let newInterestMarketLoan = if ((totalMarketAmountWithLoan > 0))
11601162 then (curPoolInterestMarketLoan + fraction(stakedMarketLoan, SCALE10, totalMarketAmountWithLoan))
11611163 else 0
11621164 let newInterestMarketNoLoan = if (((totalMarketAmount - totalMarketAmountWithLoan) > 0))
11631165 then (curPoolInterestMarketNoLoan + fraction(stakedMarketNoLoan, SCALE10, (totalMarketAmount - totalMarketAmountWithLoan)))
11641166 else 0
11651167 let unstakedAmount = unstakeLP(pool, pType, shareId, axlyMarketFee, true)
11661168 if ((unstakedAmount == unstakedAmount))
11671169 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)
11681170 else throw("Strict value is not equal to itself.")
11691171 }
11701172 }
11711173 }
11721174 }
11731175 else throw("Strict value is not equal to itself.")
11741176 }
11751177 else throw("Strict value is not equal to itself.")
11761178 }
11771179
11781180
11791181 func userCanWithdrawShareCalc (user,pool,posId,borrowed,isMarketPos) = {
11801182 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
11811183 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
11821184 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
11831185 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
11841186 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
11851187 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
11861188 let poolInterest = if (borrowed)
11871189 then if (isMarketPos)
11881190 then poolInterestMarketLoan
11891191 else poolInterestLoan
11901192 else if (isMarketPos)
11911193 then poolInterestMarketNoLoan
11921194 else poolInterestNoLoan
11931195 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
11941196 }
11951197
11961198
11971199 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
11981200 let feeType = if (isBorrowed)
11991201 then STOPLOSS_LOAN
12001202 else STOPLOSS_FEE_NO_LOAN
12011203 if (stopLoss)
12021204 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
12031205 else 0
12041206 }
12051207
12061208
12071209 func withdrawToUser (user,pool,posId,stopLoss,withdrawToken) = {
12081210 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
12091211 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
12101212 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
12111213 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed, fromMarket)
12121214 let poolTotalShare = getPoolTotalShare(pool)
12131215 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
12141216 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
12151217 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
12161218 let userAddr = Address(fromBase58String(user))
12171219 let poolAddr = Address(fromBase58String(pool))
12181220 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1219- let $t03912339195 = getPoolData(poolAddr, pType)
1220- let idAStr = $t03912339195._1
1221- let idBStr = $t03912339195._2
1222- let balA = $t03912339195._3
1223- let balB = $t03912339195._4
1224- let shareId = $t03912339195._5
1225- let $t03919839265 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1226- let idA = $t03919839265._1
1227- let idB = $t03919839265._2
1221+ let $t03916639238 = getPoolData(poolAddr, pType)
1222+ let idAStr = $t03916639238._1
1223+ let idBStr = $t03916639238._2
1224+ let balA = $t03916639238._3
1225+ let balB = $t03916639238._4
1226+ let shareId = $t03916639238._5
1227+ let $t03924139308 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1228+ let idA = $t03924139308._1
1229+ let idB = $t03924139308._2
12281230 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
12291231 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
12301232 let cBalABefore = accountBalance(idA)
12311233 if ((cBalABefore == cBalABefore))
12321234 then {
12331235 let cBalBBefore = accountBalance(idB)
12341236 if ((cBalBBefore == cBalBBefore))
12351237 then {
12361238 let inv = if ((pType == SF_POOL))
12371239 then {
12381240 let inv = unstakeLP(pool, pType, shareId, stopLossFee, fromMarket)
12391241 if ((inv == inv))
12401242 then invoke(poolAddr, "callFunction", ["withdraw", [toString((userCanWithdraw - stopLossFee))]], nil)
12411243 else throw("Strict value is not equal to itself.")
12421244 }
12431245 else if ((pType == WX_POOL))
12441246 then {
12451247 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee), fromMarket)
12461248 if ((inv == inv))
12471249 then if ((proxyAddr == ""))
12481250 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
12491251 else invoke(addressFromStringValue(proxyAddr), "wxWithdrawTwoTokens", [pool, idAStr, idBStr], [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
12501252 else throw("Strict value is not equal to itself.")
12511253 }
12521254 else unknownPoolType()
12531255 if ((inv == inv))
12541256 then {
12551257 let cBalAAfter = accountBalance(idA)
12561258 if ((cBalAAfter == cBalAAfter))
12571259 then {
12581260 let cBalBAfter = accountBalance(idB)
12591261 if ((cBalBAfter == cBalBAfter))
12601262 then {
1261- let $t04027340362 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1262- let tokensAmountA = $t04027340362._1
1263- let tokensAmountB = $t04027340362._2
1264- let $t04036541610 = if (isBorrowed)
1263+ let $t04031640405 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1264+ let tokensAmountA = $t04031640405._1
1265+ let tokensAmountB = $t04031640405._2
1266+ let $t04040841653 = if (isBorrowed)
12651267 then {
12661268 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
12671269 let debt = {
12681270 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
12691271 if ($isInstanceOf(@, "Int"))
12701272 then @
12711273 else throw(($getType(@) + " couldn't be cast to Int"))
12721274 }
12731275 if ((debt == debt))
12741276 then {
12751277 let amountToGetEx = if (if ((borrowAsset == idAStr))
12761278 then (debt > tokensAmountA)
12771279 else false)
12781280 then (debt - tokensAmountA)
12791281 else if (if ((borrowAsset == idBStr))
12801282 then (debt > tokensAmountB)
12811283 else false)
12821284 then (debt - tokensAmountB)
12831285 else 0
12841286 let exInv = if ((amountToGetEx > 0))
12851287 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
12861288 else nil
12871289 if ((exInv == exInv))
12881290 then {
12891291 let cBalAAfterRepay = accountBalance(idA)
12901292 if ((cBalAAfterRepay == cBalAAfterRepay))
12911293 then {
12921294 let cBalBAfterRepay = accountBalance(idB)
12931295 if ((cBalBAfterRepay == cBalBAfterRepay))
12941296 then {
12951297 let closeDbtInv = if ((debt > 0))
12961298 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId), shareId], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
12971299 else 0
12981300 if ((closeDbtInv == closeDbtInv))
12991301 then if ((borrowAsset == idAStr))
13001302 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
13011303 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
13021304 else throw("Strict value is not equal to itself.")
13031305 }
13041306 else throw("Strict value is not equal to itself.")
13051307 }
13061308 else throw("Strict value is not equal to itself.")
13071309 }
13081310 else throw("Strict value is not equal to itself.")
13091311 }
13101312 else throw("Strict value is not equal to itself.")
13111313 }
13121314 else $Tuple2(tokensAmountA, tokensAmountB)
1313- let toUserA = $t04036541610._1
1314- let toUserB = $t04036541610._2
1315+ let toUserA = $t04040841653._1
1316+ let toUserB = $t04040841653._2
13151317 let poolTotalLoanEntries = if (isBorrowed)
13161318 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
13171319 else nil
13181320 let poolTotalMarketEntries = if (fromMarket)
13191321 then ([IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userCanWithdraw))] ++ (if (isBorrowed)
13201322 then [IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userCanWithdraw))]
13211323 else nil))
13221324 else nil
1323- let $t04202342418 = if (if ((withdrawToken == idAStr))
1325+ let $t04206642461 = if (if ((withdrawToken == idAStr))
13241326 then (toUserB > 0)
13251327 else false)
13261328 then {
13271329 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserB, idBStr, idAStr)
13281330 if ((amtGet == amtGet))
13291331 then $Tuple2((toUserA + amtGet), 0)
13301332 else throw("Strict value is not equal to itself.")
13311333 }
13321334 else if (if ((withdrawToken == idBStr))
13331335 then (toUserA > 0)
13341336 else false)
13351337 then {
13361338 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserA, idAStr, idBStr)
13371339 if ((amtGet == amtGet))
13381340 then $Tuple2(0, (toUserB + amtGet))
13391341 else throw("Strict value is not equal to itself.")
13401342 }
13411343 else $Tuple2(toUserA, toUserB)
1342- let toUserACalc = $t04202342418._1
1343- let toUserBCalc = $t04202342418._2
1344+ let toUserACalc = $t04206642461._1
1345+ let toUserBCalc = $t04206642461._2
13441346 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))
13451347 $Tuple2(entries, [toUserACalc, toUserBCalc])
13461348 }
13471349 else throw("Strict value is not equal to itself.")
13481350 }
13491351 else throw("Strict value is not equal to itself.")
13501352 }
13511353 else throw("Strict value is not equal to itself.")
13521354 }
13531355 else throw("Strict value is not equal to itself.")
13541356 }
13551357 else throw("Strict value is not equal to itself.")
13561358 }
13571359
13581360
13591361 func liquidatePos (caller,user,posId,lAmount) = {
13601362 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
13611363 let borrowAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), "There are no borrow position")
13621364 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
13631365 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
13641366 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, true, fromMarket)
13651367 let poolTotalShare = getPoolTotalShare(pool)
13661368 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
13671369 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
13681370 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
13691371 let userAddr = Address(fromBase58String(user))
13701372 let poolAddr = Address(fromBase58String(pool))
13711373 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1372- let $t04434344415 = getPoolData(poolAddr, pType)
1373- let idAStr = $t04434344415._1
1374- let idBStr = $t04434344415._2
1375- let balA = $t04434344415._3
1376- let balB = $t04434344415._4
1377- let shareId = $t04434344415._5
1378- let $t04441844485 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1379- let idA = $t04441844485._1
1380- let idB = $t04441844485._2
1374+ let $t04438644458 = getPoolData(poolAddr, pType)
1375+ let idAStr = $t04438644458._1
1376+ let idBStr = $t04438644458._2
1377+ let balA = $t04438644458._3
1378+ let balB = $t04438644458._4
1379+ let shareId = $t04438644458._5
1380+ let $t04446144528 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1381+ let idA = $t04446144528._1
1382+ let idB = $t04446144528._2
13811383 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
13821384 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
13831385 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
13841386 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
13851387 if ((borrowAmount == 0))
13861388 then throw("You can't liquidate position without borrow")
13871389 else {
13881390 let cBalABefore = accountBalance(idA)
13891391 if ((cBalABefore == cBalABefore))
13901392 then {
13911393 let cBalBBefore = accountBalance(idB)
13921394 if ((cBalBBefore == cBalBBefore))
13931395 then {
13941396 let inv = if ((pType == SF_POOL))
13951397 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
13961398 else if ((pType == WX_POOL))
13971399 then {
13981400 let inv = unstakeLP(pool, pType, shareId, userCanWithdraw, fromMarket)
13991401 if ((inv == inv))
14001402 then if ((proxyAddr == ""))
14011403 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
14021404 else invoke(addressFromStringValue(proxyAddr), "wxWithdrawTwoTokens", [pool, idAStr, idBStr], [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
14031405 else throw("Strict value is not equal to itself.")
14041406 }
14051407 else unknownPoolType()
14061408 if ((inv == inv))
14071409 then {
14081410 let cBalAAfter = accountBalance(idA)
14091411 if ((cBalAAfter == cBalAAfter))
14101412 then {
14111413 let cBalBAfter = accountBalance(idB)
14121414 if ((cBalBAfter == cBalBAfter))
14131415 then {
1414- let $t04566945758 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1415- let tokensAmountA = $t04566945758._1
1416- let tokensAmountB = $t04566945758._2
1416+ let $t04571245801 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1417+ let tokensAmountA = $t04571245801._1
1418+ let tokensAmountB = $t04571245801._2
14171419 let amountToGetEx = if (if ((borrowAsset == idAStr))
14181420 then (lAmount > tokensAmountA)
14191421 else false)
14201422 then (lAmount - tokensAmountA)
14211423 else if (if ((borrowAsset == idBStr))
14221424 then (lAmount > tokensAmountB)
14231425 else false)
14241426 then (lAmount - tokensAmountB)
14251427 else 0
14261428 let exInv = if ((amountToGetEx > 0))
14271429 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
14281430 else nil
14291431 if ((exInv == exInv))
14301432 then {
14311433 let cBalAAfterRepay = accountBalance(idA)
14321434 if ((cBalAAfterRepay == cBalAAfterRepay))
14331435 then {
14341436 let cBalBAfterRepay = accountBalance(idB)
14351437 if ((cBalBAfterRepay == cBalBAfterRepay))
14361438 then {
1437- let $t04626446491 = if ((borrowAsset == idAStr))
1439+ let $t04630746534 = if ((borrowAsset == idAStr))
14381440 then $Tuple2(((cBalAAfterRepay - cBalABefore) - lAmount), (cBalBAfterRepay - cBalBBefore))
14391441 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - lAmount))
1440- let toUserA = $t04626446491._1
1441- let toUserB = $t04626446491._2
1442- let $t04649446571 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1443- let balAAfter = $t04649446571._1
1444- let balBAfter = $t04649446571._2
1445- let $t04657446705 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1446- let userStaked = $t04657446705._1
1447- let axlyFee = $t04657446705._2
1442+ let toUserA = $t04630746534._1
1443+ let toUserB = $t04630746534._2
1444+ let $t04653746614 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1445+ let balAAfter = $t04653746614._1
1446+ let balBAfter = $t04653746614._2
1447+ let $t04661746748 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1448+ let userStaked = $t04661746748._1
1449+ let axlyFee = $t04661746748._2
14481450 let userLpLiqudated = (userCanWithdraw - userStaked)
1449- let $t04676447109 = if (fromMarket)
1451+ let $t04680747152 = if (fromMarket)
14501452 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userLpLiqudated)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userLpLiqudated))])
14511453 else $Tuple2(poolInterestLoan, nil)
1452- let curPoolInterest = $t04676447109._1
1453- let poolTotalMarketEntries = $t04676447109._2
1454+ let curPoolInterest = $t04680747152._1
1455+ let poolTotalMarketEntries = $t04680747152._2
14541456 $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)
14551457 }
14561458 else throw("Strict value is not equal to itself.")
14571459 }
14581460 else throw("Strict value is not equal to itself.")
14591461 }
14601462 else throw("Strict value is not equal to itself.")
14611463 }
14621464 else throw("Strict value is not equal to itself.")
14631465 }
14641466 else throw("Strict value is not equal to itself.")
14651467 }
14661468 else throw("Strict value is not equal to itself.")
14671469 }
14681470 else throw("Strict value is not equal to itself.")
14691471 }
14701472 else throw("Strict value is not equal to itself.")
14711473 }
14721474 }
14731475
14741476
14751477 func parseRequest (requestId) = {
14761478 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
14771479 let user = request[0]
14781480 let pool = request[1]
14791481 let pmtA = parseIntValue(request[2])
14801482 let AId = request[3]
14811483 let pmtB = parseIntValue(request[4])
14821484 let BId = request[5]
14831485 let balA = parseIntValue(request[6])
14841486 let balB = parseIntValue(request[7])
14851487 let shareId = request[8]
14861488 let bwAsset = request[9]
14871489 let bwAmount = parseIntValue(request[10])
14881490 let stakeToMarket = (request[11] == "true")
14891491 $Tuple12(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount, stakeToMarket)
14901492 }
14911493
14921494
14931495 func calcBorrowAmount (pmtA,pmtB,balA,balB,aId,bId,leverage,borrowId) = {
14941496 let priceOracleA = valueOrElse(getInteger(priceOracleAddr, (aId + kPriceInOracle)), -1)
14951497 let priceOracleB = valueOrElse(getInteger(priceOracleAddr, (bId + kPriceInOracle)), -1)
14961498 if (if ((borrowId != aId))
14971499 then (borrowId != bId)
14981500 else false)
14991501 then throw("Wrong borrow asset")
15001502 else if (if ((priceOracleA == -1))
15011503 then (priceOracleB == -1)
15021504 else false)
15031505 then throw("Can't calc deposit price, no token prices in oracle")
15041506 else {
15051507 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
15061508 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
15071509 let dPriceA = if ((priceOracleA != -1))
15081510 then priceOracleA
15091511 else fraction(fraction(balB, decPrA, balA), priceOracleB, decPrB)
15101512 let dPriceB = if ((priceOracleB != -1))
15111513 then priceOracleB
15121514 else fraction(fraction(balA, decPrB, balB), priceOracleA, decPrA)
15131515 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1514- let $t04925349350 = if ((borrowId == aId))
1516+ let $t04929649393 = if ((borrowId == aId))
15151517 then $Tuple2(dPriceA, decPrA)
15161518 else $Tuple2(dPriceB, decPrB)
1517- let borrowPrice = $t04925349350._1
1518- let borrowDecPr = $t04925349350._2
1519+ let borrowPrice = $t04929649393._1
1520+ let borrowDecPr = $t04929649393._2
15191521 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
15201522 }
15211523 }
15221524
15231525
15241526 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
15251527 then if ((assetIdToStr(pmts[0].assetId) != AId))
15261528 then throw("Wrong payment asset A")
15271529 else if ((assetIdToStr(pmts[1].assetId) != BId))
15281530 then throw("Wrong payment asset B")
15291531 else $Tuple2(pmts[0].amount, pmts[1].amount)
15301532 else if ((size(pmts) == 1))
15311533 then if ((assetIdToStr(pmts[0].assetId) == AId))
15321534 then $Tuple2(pmts[0].amount, 0)
15331535 else if ((assetIdToStr(pmts[0].assetId) == BId))
15341536 then $Tuple2(0, pmts[0].amount)
15351537 else throw("Wrong payment")
15361538 else throw("One or two payments expected")
15371539
15381540
15391541 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
15401542 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
15411543 if ((0 > pri))
15421544 then (pri * -1)
15431545 else pri
15441546 }
15451547
15461548
15471549 func claimAndCheckAmnt (pool,pType,claim,amountToExchange,amountFromBalance) = {
1548- let $t05037151222 = if (claim)
1550+ let $t05041451265 = if (claim)
15491551 then {
15501552 let claimed = claimFarmed(pType, pool)
15511553 if ((amountToExchange > 0))
15521554 then $Tuple2(amountToExchange, claimed._2)
15531555 else $Tuple2((claimed._1 + amountFromBalance), claimed._2)
15541556 }
15551557 else {
15561558 let claimedAsset = if ((pType == SF_POOL))
15571559 then SWOPID
15581560 else if ((pType == WX_POOL))
15591561 then {
15601562 let proxyAddrStr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
15611563 let inv = if ((proxyAddrStr != ""))
15621564 then {
15631565 let proxyAddr = addressFromStringValue(proxyAddrStr)
15641566 let proxyBalance = assetBalance(proxyAddr, WXID)
15651567 if ((proxyBalance > 0))
15661568 then invoke(proxyAddr, "wxClaimFinalized", [proxyBalance], nil)
15671569 else unit
15681570 }
15691571 else unit
15701572 if ((inv == inv))
15711573 then WXID
15721574 else throw("Strict value is not equal to itself.")
15731575 }
15741576 else unknownPoolType()
15751577 $Tuple2((amountToExchange + amountFromBalance), claimedAsset)
15761578 }
1577- if (($t05037151222 == $t05037151222))
1579+ if (($t05041451265 == $t05041451265))
15781580 then {
1579- let asset = $t05037151222._2
1580- let amount = $t05037151222._1
1581+ let asset = $t05041451265._2
1582+ let amount = $t05041451265._1
15811583 let bal = accountBalance(asset)
15821584 if ((bal == bal))
15831585 then if ((amount > bal))
15841586 then throw("To big amount to exchange")
15851587 else $Tuple2(amount, asset)
15861588 else throw("Strict value is not equal to itself.")
15871589 }
15881590 else throw("Strict value is not equal to itself.")
15891591 }
15901592
15911593
15921594 @Callable(i)
15931595 func getPoolInfoREADONLY (pool) = {
15941596 let poolAddr = addressFromStringValue(pool)
15951597 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1596- let $t05157451664 = getPoolData(Address(fromBase58String(pool)), pType)
1597- let AId = $t05157451664._1
1598- let BId = $t05157451664._2
1599- let balA = $t05157451664._3
1600- let balB = $t05157451664._4
1601- let shareId = $t05157451664._5
1598+ let $t05161751707 = getPoolData(Address(fromBase58String(pool)), pType)
1599+ let AId = $t05161751707._1
1600+ let BId = $t05161751707._2
1601+ let balA = $t05161751707._3
1602+ let balB = $t05161751707._4
1603+ let shareId = $t05161751707._5
16021604 let shareSupply = getShareSupply(poolAddr, pType, shareId)
16031605 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
16041606 }
16051607
16061608
16071609
16081610 @Callable(i)
16091611 func getShareAssetPriceREADONLY (shareId) = {
16101612 let sharePrices = getSharePrice(shareId)
16111613 $Tuple2(nil, sharePrices)
16121614 }
16131615
16141616
16151617
16161618 @Callable(i)
16171619 func getUserPositionShareAmountREADONLY (user,posNum) = {
16181620 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
16191621 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
16201622 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum) + kUserPositionInPMarket)), false)
16211623 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0), fromMarket)
16221624 $Tuple2(nil, userCanWithdraw)
16231625 }
16241626
16251627
16261628
16271629 @Callable(i)
16281630 func getUserPositionREADONLY (user,pools,posNum) = {
16291631 func userPos (a,pool) = {
1630- let $t05266252732 = a
1631- let wAmountsA = $t05266252732._1
1632- let wAmountsB = $t05266252732._2
1633- let debts = $t05266252732._3
1634- let eqWAmountsA = $t05266252732._4
1635- let eqWAmountsB = $t05266252732._5
1636- let index = $t05266252732._6
1632+ let $t05270552775 = a
1633+ let wAmountsA = $t05270552775._1
1634+ let wAmountsB = $t05270552775._2
1635+ let debts = $t05270552775._3
1636+ let eqWAmountsA = $t05270552775._4
1637+ let eqWAmountsB = $t05270552775._5
1638+ let index = $t05270552775._6
16371639 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
16381640 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
16391641 else {
16401642 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1641- let $t05301153101 = getPoolData(Address(fromBase58String(pool)), pType)
1642- let AId = $t05301153101._1
1643- let BId = $t05301153101._2
1644- let balA = $t05301153101._3
1645- let balB = $t05301153101._4
1646- let shareId = $t05301153101._5
1643+ let $t05305453144 = getPoolData(Address(fromBase58String(pool)), pType)
1644+ let AId = $t05305453144._1
1645+ let BId = $t05305453144._2
1646+ let balA = $t05305453144._3
1647+ let balB = $t05305453144._4
1648+ let shareId = $t05305453144._5
16471649 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
16481650 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPositionInPMarket)), false)
16491651 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0), fromMarket)
1650- let $t05345153571 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1651- let wAmountA = $t05345153571._1
1652- let wAmountB = $t05345153571._2
1652+ let $t05349453614 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1653+ let wAmountA = $t05349453614._1
1654+ let wAmountB = $t05349453614._2
16531655 if ((borrowAmount > 0))
16541656 then {
16551657 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
16561658 let debt = {
16571659 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
16581660 if ($isInstanceOf(@, "Int"))
16591661 then @
16601662 else throw(($getType(@) + " couldn't be cast to Int"))
16611663 }
16621664 if ((debt == debt))
16631665 then {
16641666 let amountToGetEx = if (if ((borrowAsset == AId))
16651667 then (debt > wAmountA)
16661668 else false)
16671669 then (debt - wAmountA)
16681670 else if (if ((borrowAsset == BId))
16691671 then (debt > wAmountB)
16701672 else false)
16711673 then (debt - wAmountB)
16721674 else 0
16731675 let amountToPay = if ((amountToGetEx > 0))
16741676 then if ((pType == SF_POOL))
16751677 then {
16761678 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
16771679 ex._2
16781680 }
16791681 else if ((pType == WX_POOL))
16801682 then {
16811683 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
16821684 ex._2
16831685 }
16841686 else unknownPoolType()
16851687 else 0
1686- let $t05448354702 = if ((borrowAsset == AId))
1688+ let $t05452654745 = if ((borrowAsset == AId))
16871689 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
16881690 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1689- let eqWAmountA = $t05448354702._1
1690- let eqWAmountB = $t05448354702._2
1691+ let eqWAmountA = $t05452654745._1
1692+ let eqWAmountB = $t05452654745._2
16911693 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
16921694 }
16931695 else throw("Strict value is not equal to itself.")
16941696 }
16951697 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
16961698 }
16971699 }
16981700
1699- let $t05495755068 = {
1701+ let $t05500055111 = {
17001702 let $l = pools
17011703 let $s = size($l)
17021704 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
17031705 func $f0_1 ($a,$i) = if (($i >= $s))
17041706 then $a
17051707 else userPos($a, $l[$i])
17061708
17071709 func $f0_2 ($a,$i) = if (($i >= $s))
17081710 then $a
17091711 else throw("List size exceeds 20")
17101712
17111713 $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)
17121714 }
1713- let wAmountsA = $t05495755068._1
1714- let wAmountsB = $t05495755068._2
1715- let debts = $t05495755068._3
1716- let eqWAmountsA = $t05495755068._4
1717- let eqWAmountsB = $t05495755068._5
1715+ let wAmountsA = $t05500055111._1
1716+ let wAmountsB = $t05500055111._2
1717+ let debts = $t05500055111._3
1718+ let eqWAmountsA = $t05500055111._4
1719+ let eqWAmountsB = $t05500055111._5
17181720 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
17191721 }
17201722
17211723
17221724
17231725 @Callable(i)
17241726 func replenish (pool,leverage,borrowId,stakeToMarket) = valueOrElse(isActiveForUsers(), {
17251727 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
17261728 let allowedBAssets = valueOrElse(getString(this, (pool + kPoolAllowedBorrowAssets)), "")
17271729 if (!(isPoolActive(pool, pType)))
17281730 then throw("Pool not active at this moment")
17291731 else if (if ((100 > leverage))
17301732 then true
17311733 else (leverage > 300))
17321734 then throw("Leverage can't be <100 and >300")
17331735 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
17341736 then (leverage > 100)
17351737 else false)
17361738 then throw("You can't borrow in this pool")
17371739 else if (if (if ((leverage > 100))
17381740 then (allowedBAssets != "")
17391741 else false)
17401742 then !(containsElement(split(allowedBAssets, ","), borrowId))
17411743 else false)
17421744 then throw("You can't borrow this asset")
17431745 else if (if (stakeToMarket)
17441746 then !(valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false))
17451747 else false)
17461748 then throw("This pool can't stake to puzzle market")
17471749 else {
1748- let $t05606156151 = getPoolData(Address(fromBase58String(pool)), pType)
1749- let AId = $t05606156151._1
1750- let BId = $t05606156151._2
1751- let balA = $t05606156151._3
1752- let balB = $t05606156151._4
1753- let shareId = $t05606156151._5
1750+ let $t05610456194 = getPoolData(Address(fromBase58String(pool)), pType)
1751+ let AId = $t05610456194._1
1752+ let BId = $t05610456194._2
1753+ let balA = $t05610456194._3
1754+ let balB = $t05610456194._4
1755+ let shareId = $t05610456194._5
17541756 if (if ((borrowId != AId))
17551757 then (borrowId != BId)
17561758 else false)
17571759 then throw("Wrong borrow asset")
17581760 else {
1759- let $t05623256291 = parseReplenishPmts(i.payments, AId, BId)
1760- let pmtA = $t05623256291._1
1761- let pmtB = $t05623256291._2
1761+ let $t05627556334 = parseReplenishPmts(i.payments, AId, BId)
1762+ let pmtA = $t05627556334._1
1763+ let pmtB = $t05627556334._2
17621764 let user = toString(i.caller)
17631765 let newPosNum = getNewUserPositionNumber(user)
17641766 if ((leverage > 100))
17651767 then {
17661768 let borrowAmount = calcBorrowAmount(pmtA, pmtB, balA, balB, AId, BId, leverage, borrowId)
17671769 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount), toString(stakeToMarket)], ",")
17681770 let newRequestId = {
17691771 let @ = invoke(this, "createNewRequest", [request], nil)
17701772 if ($isInstanceOf(@, "Int"))
17711773 then @
17721774 else throw(($getType(@) + " couldn't be cast to Int"))
17731775 }
17741776 if ((newRequestId == newRequestId))
17751777 then {
17761778 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
17771779 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
17781780 if ((inv == inv))
17791781 then {
17801782 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1781- let $t05732657420 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1782- if (($t05732657420 == $t05732657420))
1783+ let $t05736957463 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1784+ if (($t05736957463 == $t05736957463))
17831785 then {
1784- let newBalB = $t05732657420._2
1785- let newBalA = $t05732657420._1
1786+ let newBalB = $t05736957463._2
1787+ let newBalA = $t05736957463._1
17861788 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1787- let $t05749057605 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1788- let wAmountA = $t05749057605._1
1789- let wAmountB = $t05749057605._2
1789+ let $t05753357648 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1790+ let wAmountA = $t05753357648._1
1791+ let wAmountB = $t05753357648._2
17901792 let futureBorrowApy = invoke(getLendSrvAddr(), "calculateTokenInterest", [borrowId, false], nil)
17911793 if ((futureBorrowApy == futureBorrowApy))
17921794 then $Tuple2(nil, [prImpact, wAmountA, wAmountB, futureBorrowApy])
17931795 else throw("Strict value is not equal to itself.")
17941796 }
17951797 else throw("Strict value is not equal to itself.")
17961798 }
17971799 else throw("Strict value is not equal to itself.")
17981800 }
17991801 else throw("Strict value is not equal to itself.")
18001802 }
18011803 else {
1802- let $t05777757907 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1803- if (($t05777757907 == $t05777757907))
1804+ let $t05782057950 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1805+ if (($t05782057950 == $t05782057950))
18041806 then {
1805- let axlyFee = $t05777757907._2
1806- let userStaked = $t05777757907._1
1807- let $t05791358007 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1808- if (($t05791358007 == $t05791358007))
1807+ let axlyFee = $t05782057950._2
1808+ let userStaked = $t05782057950._1
1809+ let $t05795658050 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1810+ if (($t05795658050 == $t05795658050))
18091811 then {
1810- let newBalB = $t05791358007._2
1811- let newBalA = $t05791358007._1
1812+ let newBalB = $t05795658050._2
1813+ let newBalA = $t05795658050._1
18121814 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1813- let $t05807758192 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1814- let wAmountA = $t05807758192._1
1815- let wAmountB = $t05807758192._2
1815+ let $t05812058235 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1816+ let wAmountA = $t05812058235._1
1817+ let wAmountB = $t05812058235._2
18161818 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB, 0])
18171819 }
18181820 else throw("Strict value is not equal to itself.")
18191821 }
18201822 else throw("Strict value is not equal to itself.")
18211823 }
18221824 }
18231825 }
18241826 })
18251827
18261828
18271829
18281830 @Callable(i)
18291831 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
18301832 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
18311833 if (!(isPoolActive(pool, pType)))
18321834 then throw("Pool not active at this moment")
18331835 else withdrawToUser(toString(i.caller), pool, toString(posId), false, "")
18341836 })
18351837
18361838
18371839
18381840 @Callable(i)
18391841 func withdrawOneToken (pool,posId,tokenId) = valueOrElse(isActiveForUsers(), {
18401842 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
18411843 if (!(isPoolActive(pool, pType)))
18421844 then throw("Pool not active at this moment")
18431845 else withdrawToUser(toString(i.caller), pool, toString(posId), false, tokenId)
18441846 })
18451847
18461848
18471849
18481850 @Callable(i)
18491851 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
18501852 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
18511853 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
18521854 if (!(isPoolActive(poolId, pType)))
18531855 then throw("Pool not active at this moment")
18541856 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
18551857 then throw("There are no user position")
18561858 else if ((0 >= price))
18571859 then throw("Price must be greater than 0")
18581860 else if ((price > tokenOraclePrice))
18591861 then throw("Price must be less than current token price")
18601862 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
18611863 })
18621864
18631865
18641866
18651867 @Callable(i)
18661868 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
18671869 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
18681870 if (!(isPoolActive(poolId, pType)))
18691871 then throw("Pool not active at this moment")
18701872 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
18711873 then throw("No entry")
18721874 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
18731875 })
18741876
18751877
18761878
18771879 @Callable(i)
18781880 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
18791881 then throw("Already inited")
18801882 else if (!(isDefined(addressFromString(moneyBoxAddr))))
18811883 then throw("moneyBoxAddr is not correct address")
18821884 else if (!(isDefined(addressFromString(sfFarmingAddr))))
18831885 then throw("sfFarmingAddr is not correct address")
18841886 else if (!(isDefined(addressFromString(lendAddr))))
18851887 then throw("lendAddr is not correct address")
18861888 else if (!(isDefined(addressFromString(priceOracleAddr))))
18871889 then throw("priceOracleAddr is not correct address")
18881890 else if (!(isDefined(addressFromString(keeperExContract))))
18891891 then throw("keeperExContract is not correct address")
18901892 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
18911893 then throw("swopAssetId is not correct asset id")
18921894 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
18931895 then throw("swopAssetId is not correct asset id")
18941896 else if ((size(fromBase58String(operatorPubKey)) != 32))
18951897 then throw("operatorPubKey is not correct")
18961898 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
18971899 then throw("group1Admin1PubKey is not correct")
18981900 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
18991901 then throw("group1Admin2PubKey is not correct")
19001902 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
19011903 then throw("group2Admin1PubKey is not correct")
19021904 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
19031905 then throw("group2Admin2PubKey is not correct")
19041906 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)])
19051907
19061908
19071909
19081910 @Callable(i)
19091911 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
19101912 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
19111913 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
19121914 })
19131915
19141916
19151917
19161918 @Callable(i)
19171919 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1918- let $t06341563534 = parseRequest(requestId)
1919- let user = $t06341563534._1
1920- let pool = $t06341563534._2
1921- let pmtA = $t06341563534._3
1922- let AId = $t06341563534._4
1923- let pmtB = $t06341563534._5
1924- let BId = $t06341563534._6
1925- let balA = $t06341563534._7
1926- let balB = $t06341563534._8
1927- let shareId = $t06341563534._9
1928- let bwAsset = $t06341563534._10
1929- let bwAmount = $t06341563534._11
1930- let stakeToMarket = $t06341563534._12
1920+ let $t06345863577 = parseRequest(requestId)
1921+ let user = $t06345863577._1
1922+ let pool = $t06345863577._2
1923+ let pmtA = $t06345863577._3
1924+ let AId = $t06345863577._4
1925+ let pmtB = $t06345863577._5
1926+ let BId = $t06345863577._6
1927+ let balA = $t06345863577._7
1928+ let balB = $t06345863577._8
1929+ let shareId = $t06345863577._9
1930+ let bwAsset = $t06345863577._10
1931+ let bwAmount = $t06345863577._11
1932+ let stakeToMarket = $t06345863577._12
19311933 if ((size(i.payments) != 1))
19321934 then throw("Wrong payment size")
19331935 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
19341936 then true
19351937 else (i.payments[0].amount != bwAmount))
19361938 then throw("Wrong payment")
19371939 else {
1938- let $t06372463824 = if ((AId == bwAsset))
1940+ let $t06376763867 = if ((AId == bwAsset))
19391941 then $Tuple2((pmtA + bwAmount), pmtB)
19401942 else $Tuple2(pmtA, (pmtB + bwAmount))
1941- let pmtAllA = $t06372463824._1
1942- let pmtAllB = $t06372463824._2
1943+ let pmtAllA = $t06376763867._1
1944+ let pmtAllB = $t06376763867._2
19431945 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1944- let $t06390664036 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1945- let userStaked = $t06390664036._1
1946- let axlyFee = $t06390664036._2
1946+ let $t06394964079 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1947+ let userStaked = $t06394964079._1
1948+ let axlyFee = $t06394964079._2
19471949 let posNum = getNewUserPositionNumber(user)
19481950 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
19491951 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1950- let $t06441164526 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1951- let wAmountA = $t06441164526._1
1952- let wAmountB = $t06441164526._2
1952+ let $t06445464569 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1953+ let wAmountA = $t06445464569._1
1954+ let wAmountB = $t06445464569._2
19531955 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
19541956 }
19551957 }))
19561958
19571959
19581960
19591961 @Callable(i)
19601962 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), liquidatePos(i.caller, user, posId, liquidateAmount)))
19611963
19621964
19631965
19641966 @Callable(i)
19651967 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
19661968 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
19671969 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
19681970 if ((tokenOraclePrice > stopLossPrice))
19691971 then throw("Token price greater stop loss price")
19701972 else {
19711973 let res = withdrawToUser(user, pool, toString(posId), true, "")
19721974 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
19731975 }
19741976 }))
19751977
19761978
19771979
19781980 @Callable(i)
19791981 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
19801982 let pType = getStringValue(this, (kPool + pool))
19811983 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
19821984 let poolAddr = Address(fromBase58String(pool))
1983- let $t06594266008 = getPoolData(poolAddr, pType)
1984- let AId = $t06594266008._1
1985- let BId = $t06594266008._2
1986- let balA = $t06594266008._3
1987- let balB = $t06594266008._4
1988- let shareId = $t06594266008._5
1985+ let $t06598566051 = getPoolData(poolAddr, pType)
1986+ let AId = $t06598566051._1
1987+ let BId = $t06598566051._2
1988+ let balA = $t06598566051._3
1989+ let balB = $t06598566051._4
1990+ let shareId = $t06598566051._5
19891991 let totalShareAmount = getPoolTotalShare(pool)
19901992 let isMarketPool = valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false)
1991- let $t06613766963 = if ((amountToExchange > 0))
1993+ let $t06618067006 = if ((amountToExchange > 0))
19921994 then {
1993- let $t06619966296 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1994- if (($t06619966296 == $t06619966296))
1995+ let $t06624266339 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1996+ if (($t06624266339 == $t06624266339))
19951997 then {
1996- let claimedAsset = $t06619966296._2
1997- let claimedAmount = $t06619966296._1
1998+ let claimedAsset = $t06624266339._2
1999+ let claimedAmount = $t06624266339._1
19982000 let rArgs = split(route, "__")
19992001 let exchangedAmount = if ((amountToExchange > 0))
20002002 then if ((rArgs[0] == "directSwopfiCPMM"))
20012003 then directSwopfiCPMM(rArgs, tokenToId)
20022004 else if ((rArgs[0] == "routingSwopfi"))
20032005 then directRoutingSwopfi(rArgs, tokenToId)
20042006 else throw("Wrong route")
20052007 else 0
20062008 if ((exchangedAmount == exchangedAmount))
20072009 then {
20082010 let newChange = ((claimedAmount + change) - amountToExchange)
20092011 let changeEntry = if ((newChange >= 0))
20102012 then [IntegerEntry((pool + kPoolCapChange), newChange)]
20112013 else nil
2012- let $t06679366903 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
2013- let capEnterise = $t06679366903._1
2014- let staked = $t06679366903._2
2014+ let $t06683666946 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
2015+ let capEnterise = $t06683666946._1
2016+ let staked = $t06683666946._2
20152017 $Tuple2((capEnterise ++ changeEntry), staked)
20162018 }
20172019 else throw("Strict value is not equal to itself.")
20182020 }
20192021 else throw("Strict value is not equal to itself.")
20202022 }
20212023 else $Tuple2(nil, 0)
2022- let capEnterise = $t06613766963._1
2023- let staked = $t06613766963._2
2024- let $t06696667083 = if (isMarketPool)
2024+ let capEnterise = $t06618067006._1
2025+ let staked = $t06618067006._2
2026+ let $t06700967126 = if (isMarketPool)
20252027 then capitalizePuzzleMarket(pool, pType, shareId)
20262028 else $Tuple2(nil, 0)
2027- let marketCapEnteris = $t06696667083._1
2028- let stakedMarket = $t06696667083._2
2029+ let marketCapEnteris = $t06700967126._1
2030+ let stakedMarket = $t06700967126._2
20292031 ((([IntegerEntry((pool + kPoolTotal), ((totalShareAmount + staked) + stakedMarket))] ++ capEnterise) ++ marketCapEnteris) ++ getCursEntries(AId, BId, shareId, nil))
20302032 }))
20312033
20322034
20332035
20342036 @Callable(i)
20352037 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
20362038 let pType = getStringValue(this, (kPool + pool))
20372039 let poolAddr = Address(fromBase58String(pool))
2038- let $t06751867584 = getPoolData(poolAddr, pType)
2039- let AId = $t06751867584._1
2040- let BId = $t06751867584._2
2041- let balA = $t06751867584._3
2042- let balB = $t06751867584._4
2043- let shareId = $t06751867584._5
2040+ let $t06756167627 = getPoolData(poolAddr, pType)
2041+ let AId = $t06756167627._1
2042+ let BId = $t06756167627._2
2043+ let balA = $t06756167627._3
2044+ let balB = $t06756167627._4
2045+ let shareId = $t06756167627._5
20442046 let totalShareAmount = getPoolTotalShare(pool)
2045- let $t06763667734 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2046- if (($t06763667734 == $t06763667734))
2047+ let $t06767967777 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2048+ if (($t06767967777 == $t06767967777))
20472049 then {
2048- let claimedAsset = $t06763667734._2
2049- let claimedAmount = $t06763667734._1
2050- let $t06773767863 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2051- let capEnterise = $t06773767863._1
2052- let staked = $t06773767863._2
2050+ let claimedAsset = $t06767967777._2
2051+ let claimedAmount = $t06767967777._1
2052+ let $t06778067906 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2053+ let capEnterise = $t06778067906._1
2054+ let staked = $t06778067906._2
20532055 (([IntegerEntry((pool + kPoolTotal), (totalShareAmount + staked))] ++ capEnterise) ++ getCursEntries(AId, BId, shareId, nil))
20542056 }
20552057 else throw("Strict value is not equal to itself.")
20562058 }))
20572059
20582060
20592061
20602062 @Callable(i)
20612063 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow,canPMarket,allowedBorrowAssets) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
20622064 then (type != WX_POOL)
20632065 else false)
20642066 then throw("Wrong type")
20652067 else if (if ((poolType != CPMM))
20662068 then (poolType != FLAT)
20672069 else false)
20682070 then throw("Wrong pool type")
20692071 else {
2070- let $t06851768611 = getPoolData(Address(fromBase58String(poolAddr)), type)
2071- let aId = $t06851768611._1
2072- let bId = $t06851768611._2
2073- let aBal = $t06851768611._3
2074- let bBal = $t06851768611._4
2075- let shareId = $t06851768611._5
2072+ let $t06856068654 = getPoolData(Address(fromBase58String(poolAddr)), type)
2073+ let aId = $t06856068654._1
2074+ let bId = $t06856068654._2
2075+ let aBal = $t06856068654._3
2076+ let bBal = $t06856068654._4
2077+ let shareId = $t06856068654._5
20762078 if ((0 > inFeeNoLoan))
20772079 then throw("inFeeNoLoan must be greater than 0")
20782080 else if ((0 > inFeeLoan))
20792081 then throw("inFeeLoan must be greater than 0")
20802082 else if ((0 > capFeeNoLoan))
20812083 then throw("capFeeNoLoan must be greater than 0")
20822084 else if ((0 > capFeeWithLoan))
20832085 then throw("capFeeWithLoan must be greater than 0")
20842086 else if ((0 > stoplossFeeNoLoan))
20852087 then throw("stoplossFeeNoLoan must be greater than 0")
20862088 else if ((0 > stoplossFeeWithLoan))
20872089 then throw("stoplossFeeWithLoan must be greater than 0")
20882090 else {
20892091 let allowedBorrowAssetsEntry = if ((allowedBorrowAssets != ""))
20902092 then [StringEntry((poolAddr + kPoolAllowedBorrowAssets), allowedBorrowAssets)]
20912093 else nil
20922094 ([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)] ++ allowedBorrowAssetsEntry)
20932095 }
20942096 }))
20952097
20962098
20972099
20982100 @Callable(i)
20992101 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
21002102 then throw(("Can't find pool with addr " + poolAddr))
21012103 else if ((0 > inFeeNoLoan))
21022104 then throw("inFeeNoLoan must be greater than 0")
21032105 else if ((0 > inFeeLoan))
21042106 then throw("inFeeLoan must be greater than 0")
21052107 else if ((0 > capFeeNoLoan))
21062108 then throw("capFeeNoLoan must be greater than 0")
21072109 else if ((0 > capFeeWithLoan))
21082110 then throw("capFeeWithLoan must be greater than 0")
21092111 else if ((0 > stoplossFeeNoLoan))
21102112 then throw("stoplossFeeNoLoan must be greater than 0")
21112113 else if ((0 > stoplossFeeWithLoan))
21122114 then throw("stoplossFeeWithLoan must be greater than 0")
21132115 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)]))
21142116
21152117
21162118
21172119 @Callable(i)
21182120 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
21192121 then throw("dApp already active")
21202122 else [BooleanEntry(kActive, true)])
21212123
21222124
21232125
21242126 @Callable(i)
21252127 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
21262128 then throw("dApp already shutdown")
21272129 else [BooleanEntry(kActive, false)])
21282130
21292131
21302132
21312133 @Callable(i)
21322134 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
21332135 then throw("dApp already active for users")
21342136 else [BooleanEntry(kActiveUsers, true)])
21352137
21362138
21372139
21382140 @Callable(i)
21392141 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
21402142 then throw("dApp already shutdown for users")
21412143 else [BooleanEntry(kActiveUsers, false)])
21422144
21432145
21442146
21452147 @Callable(i)
21462148 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
21472149 then throw("SWOPFI already active")
21482150 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
21492151
21502152
21512153
21522154 @Callable(i)
21532155 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
21542156 then throw("SWOPFI already shutdown")
21552157 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
21562158
21572159
21582160
21592161 @Callable(i)
21602162 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
21612163 then throw("WX already active")
21622164 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
21632165
21642166
21652167
21662168 @Callable(i)
21672169 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
21682170 then throw("WX already shutdown")
21692171 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
21702172
21712173
21722174
21732175 @Callable(i)
21742176 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
21752177 then throw("Unknown pool")
21762178 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
21772179 then throw("Pool already active")
21782180 else [BooleanEntry((pool + kPoolActive), true)])
21792181
21802182
21812183
21822184 @Callable(i)
21832185 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
21842186 then throw("Unknown pool")
21852187 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
21862188 then throw("Pool already shutdown")
21872189 else [BooleanEntry((pool + kPoolActive), false)])
21882190
21892191
21902192 @Verifier(tx)
21912193 func verify () = {
21922194 let multiSignedByAdmins = {
21932195 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
21942196 then 1
21952197 else 0
21962198 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group1Admin2PK))
21972199 then 1
21982200 else 0
21992201 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], group1Admin3PK))
22002202 then 1
22012203 else 0
22022204 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
22032205 }
22042206 multiSignedByAdmins
22052207 }
22062208

github/deemru/w8io/6500d08 
402.60 ms