tx · EW8u1o6mo4z4g5J4wBktfJ4wDEk4BocG1P8AmHvV3DS3

3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW:  -0.05700000 Waves

2023.10.13 15:25 [3862685] smart account 3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW > SELF 0.00000000 Waves

{ "type": 13, "id": "EW8u1o6mo4z4g5J4wBktfJ4wDEk4BocG1P8AmHvV3DS3", "fee": 5700000, "feeAssetId": null, "timestamp": 1697199902074, "version": 2, "chainId": 87, "sender": "3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW", "senderPublicKey": "9D3NMf2PEttfNTb8Hk2nbXukn2b2xmoTsZSqQrhvyeN", "proofs": [ "5Emk8SiSHB257FpamsW5qbc5zVU8qNYjzwiPzVYxgb5rKCSv9DSkSyNkCWNYpu79Qur9yac7VjWiLt2u5iZMDE4Y", "2jQREa489G9k1cLTGPnHfxFhkKRccgCbz6mDFBUMcq24jrDp6zh6GjaSh3HdcLmnRZKrsPPQoLRoXgnFtSvdRiH" ], "script": "base64:BgKhAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBQoDCAEIEgQKAggBEgYKBAEICAESBQoDAQgIEg8KDQgICAgICAgICAgICAgSAwoBCBIDCgEIEgUKAwgIARIGCgQIAQgIEgcKBQgICAEEEgUKAwgEARILCgkICAEBAQEBAQQSCQoHCAEBAQEBARIAEgASABIAEgASABIAEgASAwoBCBIDCgEIggEAB1NGX1BPT0wCAlNGAAdXWF9QT09MAgJXWAAPQ0FQX0ZFRV9OT19MT0FOAgljYXBOb0xvYW4ADENBUF9GRUVfTE9BTgIHY2FwTG9hbgAUU1RPUExPU1NfRkVFX05PX0xPQU4CDnN0b3BMb3NzTm9Mb2FuAA1TVE9QTE9TU19MT0FOAgxzdG9wTG9zc0xvYW4ACExPQU5fRkVFAgRsb2FuAAtOT19MT0FOX0ZFRQIGbm9Mb2FuAAZOT19GRUUCBW5vRmVlAAZTQ0FMRTgAgMLXLwAHU0NBTEUxMACAyK+gJQAHU0NBTEUxNgkAtgIBAICAhP6m3uERAApGRUVfU0NBTEU2AMCEPQAUa1NGUG9vbEFBc3NldEJhbGFuY2UCD0FfYXNzZXRfYmFsYW5jZQAUa1NGUG9vbEJBc3NldEJhbGFuY2UCD0JfYXNzZXRfYmFsYW5jZQAPa1NGUG9vbEFBc3NldElkAgpBX2Fzc2V0X2lkAA9rU0ZQb29sQkFzc2V0SWQCCkJfYXNzZXRfaWQADmtTRlBvb2xTaGFyZUlkAg5zaGFyZV9hc3NldF9pZAASa1NGUG9vbFNoYXJlU3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkACmtTRlBvb2xGZWUCCmNvbW1pc3Npb24ADWtVc2VyUG9zaXRpb24CDV91c2VyUG9zaXRpb24AEWtVc2VyUG9zaXRpb25Qb29sAhFfdXNlclBvc2l0aW9uUG9vbAARa1VzZXJCb3Jyb3dBbW91bnQCGV91c2VyUG9zaXRpb25Cb3Jyb3dBbW91bnQAEmtVc2VyQm9ycm93QXNzZXRJZAIaX3VzZXJQb3NpdGlvbkJvcnJvd0Fzc2V0SWQAEGtVc2VyUG9zaXRpb25OdW0CE191c2VyUG9zaXRpb25OdW1iZXIAFWtVc2VyUG9zaXRpb25JbnRlcmVzdAIVX3VzZXJQb3NpdGlvbkludGVyZXN0AAprUG9vbFRvdGFsAgpfcG9vbFRvdGFsAA5rUG9vbFRvdGFsTG9hbgIOX3Bvb2xUb3RhbExvYW4AEWtQb29sSW50ZXJlc3RMb2FuAhFfcG9vbEludGVyZXN0TG9hbgATa1Bvb2xJbnRlcmVzdE5vTG9hbgITX3Bvb2xJbnRlcmVzdE5vTG9hbgAOa1Bvb2xDYW5Cb3Jyb3cCDl9wb29sQ2FuQm9ycm93ABVrQXhseUluRmVlV2l0aG91dExvYW4CDl9heGx5RmVlTm9Mb2FuABJrQXhseUluRmVlV2l0aExvYW4CEF9heGx5RmVlV2l0aExvYW4AEWtBeGx5Tm9Mb2FuQ2FwRmVlAhFfYXhseUZlZUNhcE5vTG9hbgATa0F4bHlXaXRoTG9hbkNhcEZlZQITX2F4bHlGZWVDYXBXaXRoTG9hbgAWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQIYX2F4bHlGZWVTdG9wbG9zc1dpdGhMb2FuABRrQXhseVN0b3BMb3NzTG9hbkZlZQIWX2F4bHlGZWVTdG9wbG9zc05vTG9hbgAKa1JlcXVlc3RJZAILX3JlcXVlc3RfaWQADGtSZXF1ZXN0SXRlcgINcmVxdWVzdHNfaXRlcgAFa1Bvb2wCBXBvb2xfAAprU2hhcmVQb29sAgxfcG9vbFNoYXJlSWQADmtQb29sQ2FwQ2hhbmdlAg5fcG9vbENhcENoYW5nZQAPa1Rva2VuTGFzdFByaWNlAgpsYXN0X3ByaWNlAA5rUHJpY2VJbk9yYWNsZQIHX3R3YXA1QgAHa0FjdGl2ZQIGYWN0aXZlAAxrQWN0aXZlVXNlcnMCC2FjdGl2ZVVzZXJzAAtrQWN0aXZlU0ZXWAIHX2FjdGl2ZQALa1Bvb2xBY3RpdmUCC19hY3RpdmVQb29sAA1rVXNlclN0b3BMb3NzAglfc3RvcExvc3MAF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAhdfZmFsbGJhY2tFeGNoYW5nZVN3b3BmaQAJa01vbmV5Qm94Ag5heGx5X21vbmV5X2JveAAOa1NGRmFybWluZ0FkZHICE3N3b3BmaV9mYXJtaW5nX2FkZHIADGtMZW5kU2VydmljZQIRbGVuZF9zZXJ2aWNlX2FkZHIAD2tPcGVyYXRvckNhbGxQSwISYWRtaW5fY2FsbF9wdWJfa2V5AAxrUHJpY2VPcmFjbGUCDHByaWNlX29yYWNsZQALa0V4Q29udHJhY3QCEWV4Y2hhbmdlX2NvbnRyYWN0AA9rV3hTd2FwQ29udHJhY3QCEHd4X3N3YXBfY29udHJhY3QAB2tTd29wSWQCB3N3b3BfaWQABWtXeElkAgV3eF9pZAAPa0dyb3VwMUFkbWluMVBLAhVncm91cDFfYWRtaW4xX3B1Yl9rZXkAD2tHcm91cDFBZG1pbjJQSwIVZ3JvdXAxX2FkbWluMl9wdWJfa2V5AA9rR3JvdXAyQWRtaW4xUEsCFWdyb3VwMl9hZG1pbjFfcHViX2tleQAPa0dyb3VwMkFkbWluMlBLAhVncm91cDJfYWRtaW4yX3B1Yl9rZXkACG1vbmV5Qm94CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFCWtNb25leUJveAIYTm8gYXhseSBtb25leUJveCBhZGRyZXNzAApleENvbnRyYWN0CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFC2tFeENvbnRyYWN0AhxObyBleGNoYW5nZSBjb250cmFjdCBhZGRyZXNzAA9wcmljZU9yYWNsZUFkZHIJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUMa1ByaWNlT3JhY2xlAhdObyBwcmljZSBvcmFjbGUgYWRkcmVzcwAOd3hTd2FwQ29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa1d4U3dhcENvbnRyYWN0AhJObyB3eCBzd2FwIGFkZHJlc3MABlNXT1BJRAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUHa1N3b3BJZAIKTm8gc3dvcCBpZAAEV1hJRAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUFa1d4SWQCCE5vIHd4IGlkAA5ncm91cDFBZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMUFkbWluMVBLAhlDYW4ndCBnZXQga0dyb3VwMUFkbWluMVBLAA5ncm91cDFBZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMUFkbWluMlBLAhlDYW4ndCBnZXQga0dyb3VwMUFkbWluMlBLAA5ncm91cDJBZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMkFkbWluMVBLAhlDYW4ndCBnZXQga0dyb3VwMkFkbWluMVBLAA5ncm91cDJBZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMkFkbWluMlBLAhlDYW4ndCBnZXQga0dyb3VwMkFkbWluMVBLAApvcGVyYXRvclBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rT3BlcmF0b3JDYWxsUEsCFENhbid0IGdldCBvcGVyYXRvclBLAQ91bmtub3duUG9vbFR5cGUACQACAQIPV3JvbmcgcG9vbCB0eXBlAQ5nZXRMZW5kU3J2QWRkcgAJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUMa0xlbmRTZXJ2aWNlAhtDYW4ndCBnZXQgbGVuZCBzZXJ2aWNlIGFkZHIBDmlzT3BlcmF0b3JDYWxsAQFpAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwUEdW5pdAkAAgECJE9ubHkgb3BlcmF0b3IgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgELaXNBZG1pbkNhbGwBAWkDAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUOZ3JvdXAxQWRtaW4xUEsGCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQ5ncm91cDFBZG1pbjJQSwUEdW5pdAkAAgECKE9ubHkgYWRtaW4gZ3JvdXAxIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNMYW5kQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIJAQ5nZXRMZW5kU3J2QWRkcgAFBHVuaXQJAAIBAilPbmx5IGxhbmQgY29udHJhY3QgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEIaXNBY3RpdmUAAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYGBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEQaXNBY3RpdmVGb3JVc2VycwADAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAAIJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgYHBQR1bml0CQACAQIpREFwcCBpcyBpbmFjdGl2ZSBmb3IgdXNlcnMgYXQgdGhpcyBtb21lbnQBDGlzUG9vbEFjdGl2ZQIEcG9vbAR0eXBlBApXWFNGQWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEdHlwZQULa0FjdGl2ZVNGV1gGBApwb29sQWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGAwMFCldYU0ZBY3RpdmUFCnBvb2xBY3RpdmUHBgcBDmFjY291bnRCYWxhbmNlAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDwBwIFBHRoaXMFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yARFnZXRTRlBvb2xCYWxhbmNlcwEIcG9vbEFkZHIJAJQKAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQUFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBiYWxhbmNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xCQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGJhbGFuY2UBEWdldFdYUG9vbEJhbGFuY2VzAwhwb29sQWRkcgNhSWQDYklkCQCUCgIKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFA2FJZAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNiSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAEPZ2V0UG9vbEJhbGFuY2VzBAhwb29sQWRkcgR0eXBlA2FJZANiSWQDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBEWdldFNGUG9vbEJhbGFuY2VzAQUIcG9vbEFkZHIDCQAAAgUEdHlwZQUHV1hfUE9PTAkBEWdldFdYUG9vbEJhbGFuY2VzAwUIcG9vbEFkZHIFA2FJZAUDYklkCQEPdW5rbm93blBvb2xUeXBlAAENZ2V0U0ZQb29sRGF0YQEIcG9vbEFkZHIECyR0MDc5ODc4MDM2CQERZ2V0U0ZQb29sQmFsYW5jZXMBBQhwb29sQWRkcgMJAAACBQskdDA3OTg3ODAzNgULJHQwNzk4NzgwMzYEBGJhbEIIBQskdDA3OTg3ODAzNgJfMgQEYmFsQQgFCyR0MDc5ODc4MDM2Al8xCQCXCgUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEFBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xCQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAUEYmFsQQUEYmFsQgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ5rU0ZQb29sU2hhcmVJZAIYQ2FuJ3QgZ2V0IHNoYXJlIGFzc2V0IGlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ1nZXRXWFBvb2xEYXRhAQhwb29sQWRkcgQDY2ZnCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2NmZwUDY2ZnBANhSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAQDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkBANiSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAUDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhlDYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGlkBAdzaGFyZUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwADAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIaQ2FuJ3QgZ2V0IHBvb2wgTFAgYXNzZXQgaWQECyR0MDg3MzM4NzkyCQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQDCQAAAgULJHQwODczMzg3OTIFCyR0MDg3MzM4NzkyBARiYWxCCAULJHQwODczMzg3OTICXzIEBGJhbEEIBQskdDA4NzMzODc5MgJfMQkAlwoFBQNhSWQFA2JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELZ2V0UG9vbERhdGECCHBvb2xBZGRyBHR5cGUDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBDWdldFNGUG9vbERhdGEBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQENZ2V0V1hQb29sRGF0YQEFCHBvb2xBZGRyCQEPdW5rbm93blBvb2xUeXBlAAEOZ2V0U2hhcmVTdXBwbHkDCHBvb2xBZGRyBHR5cGUHc2hhcmVJZAMJAAACBQR0eXBlBQdTRl9QT09MCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFEmtTRlBvb2xTaGFyZVN1cHBseQIcQ2FuJ3QgZ2V0IHNoYXJlIGFzc2V0IHN1cHBseQMJAAACBQR0eXBlBQdXWF9QT09MCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUHc2hhcmVJZAINV3JvbmcgU2hhcmVJZAhxdWFudGl0eQkBD3Vua25vd25Qb29sVHlwZQABEWdldFBvb2xUb3RhbFNoYXJlAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAAAARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4AAAEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQR1c2VyCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0AAAABAQpnZXRBeGx5RmVlAgRwb29sB2ZlZVR5cGUDCQAAAgUHZmVlVHlwZQUMQ0FQX0ZFRV9MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tBeGx5V2l0aExvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUPQ0FQX0ZFRV9OT19MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtBeGx5Tm9Mb2FuQ2FwRmVlAwkAAAIFB2ZlZVR5cGUFCExPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEmtBeGx5SW5GZWVXaXRoTG9hbgMJAAACBQdmZWVUeXBlBQtOT19MT0FOX0ZFRQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRVrQXhseUluRmVlV2l0aG91dExvYW4DCQAAAgUHZmVlVHlwZQUGTk9fRkVFAAAJAAIBAg5Xcm9uZyBmZWUgdHlwZQEQZ2V0U0ZGYXJtaW5nQWRkcgAJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUOa1NGRmFybWluZ0FkZHICHUNhbid0IGdldCBzd29wZmkgZmFybWluZyBhZGRyARBnZXRXWEZhcm1pbmdBZGRyAQhwb29sQWRkcgQJZkNvbnRyYWN0CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyAhMlc19fZmFjdG9yeUNvbnRyYWN0AiJDYW4ndCBnZXQgV1ggZmFjdG9yeSBjb250cmFjdCBhZGRyBApmYWN0cm95Q2ZnCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQlmQ29udHJhY3QCESVzX19mYWN0b3J5Q29uZmlnAhhDYW4ndCBnZXQgV1ggZmFjdG9yeSBjZmcCAl9fCQEHQWRkcmVzcwEJANkEAQkAkQMCBQpmYWN0cm95Q2ZnAAEBDGFzc2V0SWRUb1N0cgEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA2AQBBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAIFV0FWRVMJAAIBAgxOb3QgQXNzZXQgaWQBDmFzc2V0SWRGcm9tU3RyAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFB2Fzc2V0SWQBEGdldEFzc2V0RGVjaW1hbHMBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMACAQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIZGVjaW1hbHMJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARFnZXRBc3NldFByZWNpdGlvbgEHYXNzZXRJZAkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB2Fzc2V0SWQAAAAABQRET1dOAQ5nZXRBc3NldHNQcmljZQEIYXNzZXRJZHMKAQlnZXRQcmljZXMCAWEHYXNzZXRJZAQKYXNzZXRQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUA////////////AQkAzQgCBQFhBQphc3NldFByaWNlCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgENZ2V0U2hhcmVQcmljZQEHc2hhcmVJZAQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUHc2hhcmVJZAUKa1NoYXJlUG9vbAIgQ2FuJ3QgZmluZCBwb29sIGFkZHIgYnkgc2hhcmUgaWQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDExNzgxMTE4NDYJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDYUlkCAUNJHQwMTE3ODExMTg0NgJfMQQDYklkCAUNJHQwMTE3ODExMTg0NgJfMgQIYUJhbGFuY2UIBQ0kdDAxMTc4MTExODQ2Al8zBAhiQmFsYW5jZQgFDSR0MDExNzgxMTE4NDYCXzQEBnByaWNlcwkBDmdldEFzc2V0c1ByaWNlAQkAzAgCBQNhSWQJAMwIAgUDYklkBQNuaWwEB2RQcmljZUEJAJEDAgUGcHJpY2VzAAAEB2RQcmljZUIJAJEDAgUGcHJpY2VzAAEDAwkAZgIAAAUHZFByaWNlQQYJAGYCAAAFB2RQcmljZUIA////////////AQQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAQKQVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB3NoYXJlSWQAAAAABQRET1dOBANzdW0JAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgkAawMFA3N1bQUOc2hhcmVQcmVjaXNpb24FC3NoYXJlU3VwcGx5AQ5nZXRTaGFyZVByaWNlcwEIc2hhcmVJZHMKAQlnZXRQcmljZXMCAWEHc2hhcmVJZAkAzQgCBQFhCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQKAAIkbAUIc2hhcmVJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAQ5nZXRDdXJzRW50cmllcwQDYUlkA2JJZAdzaGFyZUlkCHdBbW91bnRzBAxhc3NldHNQcmljZXMJAQ5nZXRBc3NldHNQcmljZQEJAMwIAgUDYUlkCQDMCAIFA2JJZAUDbmlsBApzaGFyZVByaWNlCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQEBnByaWNlcwkAzggCCQDMCAIJAKQDAQkAkQMCBQxhc3NldHNQcmljZXMAAAkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAEJAMwIAgkApAMBBQpzaGFyZVByaWNlBQNuaWwFCHdBbW91bnRzCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tUb2tlbkxhc3RQcmljZQkAuQkCBQZwcmljZXMCASwFA25pbAEYY2FsY1JlcGxlbmlzaEJ5VHdvVG9rZW5zCAVwVHlwZQhwb29sQWRkcgRwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIDCQAAAgUFcFR5cGUFB1NGX1BPT0wEBHJlcGwKAAFACQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIgY2FsY0xQUmVwbGVuaXNoVHdvVG9rZW5zUkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFBHBtdEEJAMwIAgkApAMBBQRwbXRCBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQRyZXBsBQRyZXBsCQCXCgUKAAFACQCRAwIFBHJlcGwAAwMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwABAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAQxhc3NldElkVG9TdHIBCQCRAwIFBHJlcGwAAgoAAUAJAJEDAgUEcmVwbAAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTMzOTAxMzY0MAkAlAoCCQC1CQIKAAFACQD8BwQFCHBvb2xBZGRyAiBldmFsdWF0ZVB1dEJ5QW1vdW50QXNzZXRSRUFET05MWQkAzAgCBQRwbXRBBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fCQC1CQIKAAFACQD8BwQFCHBvb2xBZGRyAh9ldmFsdWF0ZVB1dEJ5UHJpY2VBc3NldFJFQURPTkxZCQDMCAIFBHBtdEIFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18DCQAAAgUNJHQwMTMzOTAxMzY0MAUNJHQwMTMzOTAxMzY0MAQKZXZhbFB1dEluQggFDSR0MDEzMzkwMTM2NDACXzIECmV2YWxQdXRJbkEIBQ0kdDAxMzM5MDEzNjQwAl8xBAVscEluQQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEAAQQFbHBJbkIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5CAAEDCQBmAgUFbHBJbkIFBWxwSW5BBANwbXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5BAAgJAJcKBQUEcG10QQUDcG10CQBlAgUEcG10QgUDcG10BQNiSWQFBWxwSW5CBANwbXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5CAAcJAJcKBQUDcG10BQRwbXRCCQBlAgUEcG10QQUDcG10BQNhSWQFBWxwSW5BCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAEYcmVwbGVuaXNoVHdvVG9rZW5zQnlUeXBlBghwb29sQWRkcgVwVHlwZQRwbXRBA2FJZARwbXRCA2JJZAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2FJZAUEcG10QQkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUDYklkBQRwbXRCBQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zCQDMCAIJAMwIAgIFZmFsc2UJAMwIAgIBMAUDbmlsBQNuaWwFCHBheW1lbnRzAwkAAAIFBXBUeXBlBQdXWF9QT09MCQD8BwQFCHBvb2xBZGRyAgNwdXQJAMwIAgDAhD0JAMwIAgcFA25pbAUIcGF5bWVudHMJAQ91bmtub3duUG9vbFR5cGUAARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQIcG9vbEFkZHIFcFR5cGUDcG10BXBtdElkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUFcG10SWQFA3BtdAUDbmlsAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIVcmVwbGVuaXNoV2l0aE9uZVRva2VuCQDMCAIJAMwIAgIBMAkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAUIcG9vbEFkZHICCXB1dE9uZVRrbgkAzAgCAAAJAMwIAgcFA25pbAUIcGF5bWVudHMJAQ91bmtub3duUG9vbFR5cGUAAQdzdGFrZUxQBARwb29sBXBUeXBlB3NoYXJlSWQGYW1vdW50BAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQdzaGFyZUlkBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACD2xvY2tTaGFyZVRva2VucwkAzAgCBQRwb29sCQDMCAIAAAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAkA/AcECQEQZ2V0V1hGYXJtaW5nQWRkcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wCBXN0YWtlBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEJdW5zdGFrZUxQBARwb29sBXBUeXBlB3NoYXJlSWQGYW1vdW50BA0kdDAxNTI5OTE1NjQ5AwkAAAIFBXBUeXBlBQdTRl9QT09MCQCVCgMJARBnZXRTRkZhcm1pbmdBZGRyAAITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCBQRwb29sCQDMCAIFBmFtb3VudAUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MCQCVCgMJARBnZXRXWEZhcm1pbmdBZGRyAQkBB0FkZHJlc3MBCQDZBAEFBHBvb2wCB3Vuc3Rha2UJAMwIAgUHc2hhcmVJZAkAzAgCBQZhbW91bnQFA25pbAkBD3Vua25vd25Qb29sVHlwZQAECGZhcm1BZGRyCAUNJHQwMTUyOTkxNTY0OQJfMQQFZk5hbWUIBQ0kdDAxNTI5OTE1NjQ5Al8yBAZwYXJhbXMIBQ0kdDAxNTI5OTE1NjQ5Al8zBANpbnYJAPwHBAUIZmFybUFkZHIFBWZOYW1lBQZwYXJhbXMFA25pbAMJAAACBQNpbnYFA2ludgUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARFjYWxjQW1vdW50VG9QYXlTRgcEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQJZmVlU2NhbGU2AMCEPQQDZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQhwb29sQWRkcgUKa1NGUG9vbEZlZQQMYW1udEdldE5vRmVlCQBuBAUQYW1vdW50VG9rZW5Ub0dldAUJZmVlU2NhbGU2CQBlAgUJZmVlU2NhbGU2BQNmZWUFB0NFSUxJTkcEDSR0MDE2MDcxMTYzNzcDCQAAAgUPYXNzZXRUb2tlblRvR2V0BQhhc3NldElkQQQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEIJAGUCBQRiYWxBBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAbgQFDGFtbnRHZXROb0ZlZQUEYmFsQQkAZQIFBGJhbEIFDGFtbnRHZXROb0ZlZQUHQ0VJTElORwkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTYwNzExNjM3NwJfMQQKYXNzZXRUb1BheQgFDSR0MDE2MDcxMTYzNzcCXzIJAJQKAgUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkBDWdldFdYU3dhcEZlZXMBBHBvb2wECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBAlmQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgITJXNfX2ZhY3RvcnlDb250cmFjdAIiQ2FuJ3QgZ2V0IFdYIGZhY3RvcnkgY29udHJhY3QgYWRkcgQOcG9vbEZlZURlZmF1bHQJAQV2YWx1ZQEJAJoIAgUOd3hTd2FwQ29udHJhY3QCCyVzX19wb29sRmVlBBJwcm90b2NvbEZlZURlZmF1bHQJAQV2YWx1ZQEJAJoIAgUOd3hTd2FwQ29udHJhY3QCDyVzX19wcm90b2NvbEZlZQQHJG1hdGNoMAkA/AcEBQlmQ29udHJhY3QCEmdldFN3YXBGZWVSRUFET05MWQkAzAgCCQClCAEFCHBvb2xBZGRyBQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBARmZWVzBQckbWF0Y2gwCQCUCgIIBQRmZWVzAl8xCAUEZmVlcwJfMgkAlAoCBQ5wb29sRmVlRGVmYXVsdAUScHJvdG9jb2xGZWVEZWZhdWx0ARFjYWxjQW1vdW50VG9QYXlXWAcEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQEDSR0MDE3MTE3MTcxNTYJAQ1nZXRXWFN3YXBGZWVzAQUEcG9vbAQEcEZlZQgFDSR0MDE3MTE3MTcxNTYCXzEEBXByRmVlCAUNJHQwMTcxMTcxNzE1NgJfMgQIZmVlU2NhbGUJALYCAQCAwtcvBA0kdDAxNzE5NjE3NTA0AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBrAwUQYW1vdW50VG9rZW5Ub0dldAUEYmFsQgkAZQIFBGJhbEEFEGFtb3VudFRva2VuVG9HZXQJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEEJAGUCBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQQQLYW1vdW50VG9QYXkIBQ0kdDAxNzE5NjE3NTA0Al8xBAphc3NldFRvUGF5CAUNJHQwMTcxOTYxNzUwNAJfMgQSYW1vdW50VG9QYXlXaXRoRmVlCQCgAwEJAL0CBAkAtgIBBQthbW91bnRUb1BheQUIZmVlU2NhbGUJALgCAgUIZmVlU2NhbGUJALYCAQkAZAIFBXByRmVlBQRwRmVlBQdDRUlMSU5HCQCUCgIFCmFzc2V0VG9QYXkFEmFtb3VudFRvUGF5V2l0aEZlZQEQZXhjaGFuZ2VEaXJlY3RseQgFcFR5cGUEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQEBnBvb2xGQgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAgADAwkAAAIFBXBUeXBlBQdTRl9QT09MBgkBAiE9AgUGcG9vbEZCAgAEDSR0MDE3OTQ1MTgxNTcDCQAAAgUGcG9vbEZCAgAJAJUKAwUEYmFsQQUEYmFsQgUEcG9vbAQNJHQwMTgwNTExODEyNAkBEWdldFNGUG9vbEJhbGFuY2VzAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUGcG9vbEZCBAZzZkJhbEEIBQ0kdDAxODA1MTE4MTI0Al8xBAZzZkJhbEIIBQ0kdDAxODA1MTE4MTI0Al8yCQCVCgMFBnNmQmFsQQUGc2ZCYWxCBQZwb29sRkIEBXBCYWxBCAUNJHQwMTc5NDUxODE1NwJfMQQFcEJhbEIIBQ0kdDAxNzk0NTE4MTU3Al8yBAZleFBvb2wIBQ0kdDAxNzk0NTE4MTU3Al8zBA0kdDAxODE2MjE4Mjg4CQERY2FsY0Ftb3VudFRvUGF5U0YHBQZleFBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUFcEJhbEEFBXBCYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAxODE2MjE4Mjg4Al8xBAthbW91bnRUb1BheQgFDSR0MDE4MTYyMTgyODgCXzIJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUGZXhQb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCCQCkAwEFEGFtb3VudFRva2VuVG9HZXQFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQphc3NldFRvUGF5BQthbW91bnRUb1BheQUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAxODQ5MDE4NjEyCQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBGJhbEEFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDE4NDkwMTg2MTICXzEEC2Ftb3VudFRvUGF5CAUNJHQwMTg0OTAxODYxMgJfMgkA/AcEBQ53eFN3YXBDb250cmFjdAIEc3dhcAkAzAgCBRBhbW91bnRUb2tlblRvR2V0CQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAkBD3Vua25vd25Qb29sVHlwZQABGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAhwb29sQWRkcgVwVHlwZQdzaGFyZUlkD3VzZXJDYW5XaXRoZHJhdwQNJHQwMTg4OTkxOTM2MwMJAAACBQVwVHlwZQUHU0ZfUE9PTAQDaW52CgABQAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICEHdpdGhkcmF3UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUDaW52BQNpbnYJAJQKAgoAAUAJAJEDAgUDaW52AAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQNpbnYAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEA2ludgkAtQkCCgABQAkA/AcEBQhwb29sQWRkcgITZXZhbHVhdGVHZXRSRUFET05MWQkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNpbnYFA2ludgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAEB2Ftb3VudEEIBQ0kdDAxODg5OTE5MzYzAl8xBAdhbW91bnRCCAUNJHQwMTg4OTkxOTM2MwJfMgkAlAoCBQdhbW91bnRBBQdhbW91bnRCAQtjbGFpbUZhcm1lZAIFcFR5cGUEcG9vbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQZTV09QSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDE5NzMxMTk4MTAJAQ1nZXRXWFBvb2xEYXRhAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQDYUlkCAUNJHQwMTk3MzExOTgxMAJfMQQDYklkCAUNJHQwMTk3MzExOTgxMAJfMgQEYUJhbAgFDSR0MDE5NzMxMTk4MTACXzMEBGJCYWwIBQ0kdDAxOTczMTE5ODEwAl80BARscElkCAUNJHQwMTk3MzExOTgxMAJfNQQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQRXWElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBANpbnYJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgdjbGFpbVd4CQDMCAIFBGxwSWQFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUEV1hJRAkAlAoCCQBlAgUIYmFsQWZ0ZXIFCWJhbEJlZm9yZQUEV1hJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABD3JlcGxlbmlzaEJ5VHlwZQoFcFR5cGUEcG9vbAdmZWVUeXBlBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgRMUElkBA9scEJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAMJAAACBQ9scEJhbGFuY2VCZWZvcmUFD2xwQmFsYW5jZUJlZm9yZQQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEDSR0MDIwNDA4MjA4MjQDAwkAZgIFBHBtdEEAAAkAZgIFBHBtdEIAAAcEDSR0MDIwNDc0MjA1OTAJARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMIBQVwVHlwZQUIcG9vbEFkZHIFBHBtdEEFA2FJZAUEcG10QgUDYklkBQRiYWxBBQRiYWxCBAZwbXRJbkEIBQ0kdDAyMDQ3NDIwNTkwAl8xBAZwbXRJbkIIBQ0kdDAyMDQ3NDIwNTkwAl8yBAZjaGFuZ2UIBQ0kdDAyMDQ3NDIwNTkwAl8zBAhjaGFuZ2VJZAgFDSR0MDIwNDc0MjA1OTACXzQEA2ludgkBGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQYFCHBvb2xBZGRyBQVwVHlwZQUGcG10SW5BBQNhSWQFBnBtdEluQgUDYklkAwkAAAIFA2ludgUDaW52CQCUCgIFBmNoYW5nZQUIY2hhbmdlSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQBmAgUEcG10QQAACQCUCgIFBHBtdEEFA2FJZAMJAGYCBQRwbXRCAAAJAJQKAgUEcG10QgUDYklkCQACAQIQcG10cyBtdXN0IGJlID4gMAQGY2hhbmdlCAUNJHQwMjA0MDgyMDgyNAJfMQQIY2hhbmdlSWQIBQ0kdDAyMDQwODIwODI0Al8yBANpbnYDCQBmAgUGY2hhbmdlAAAJARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQFCHBvb2xBZGRyBQVwVHlwZQUGY2hhbmdlBQhjaGFuZ2VJZAUDbmlsAwkAAAIFA2ludgUDaW52BA5scEJhbGFuY2VBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkBAt0b3RhbFN0YWtlZAkAZQIFDmxwQmFsYW5jZUFmdGVyBQ9scEJhbGFuY2VCZWZvcmUEDWF4bHlGZWVBbW91bnQJAGsDBQt0b3RhbFN0YWtlZAkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2BBF1c2VyU2hhcmVGb3JTdGFrZQkAZQIFC3RvdGFsU3Rha2VkBQ1heGx5RmVlQW1vdW50AwkAZwIAAAURdXNlclNoYXJlRm9yU3Rha2UJAAIBAihhbW91bnQgb2Ygc3Rha2VkIHNoYXJldG9rZW5zIG11c3QgYmUgPiAwBAVpbnZMUAkBB3N0YWtlTFAEBQRwb29sBQVwVHlwZQUETFBJZAURdXNlclNoYXJlRm9yU3Rha2UDCQAAAgUFaW52TFAFBWludkxQCQCUCgIFEXVzZXJTaGFyZUZvclN0YWtlBQ1heGx5RmVlQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARByZXBsZW5pc2hFbnRyaWVzCARwb29sBHVzZXIMc3Rha2VkQW1vdW50DWF4bHlGZWVBbW91bnQGcG9zTnVtB3NoYXJlSWQEdHlwZQh3aXRoTG9hbgQLdG90YWxBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wED3RvdGFsQW1vdW50TG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBA0kdDAyMTY4MTIxOTE5AwUId2l0aExvYW4JAJQKAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkAZAIFD3RvdGFsQW1vdW50TG9hbgUMc3Rha2VkQW1vdW50CQCUCgIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgUPdG90YWxBbW91bnRMb2FuBA9jdXJQb29sSW50ZXJlc3QIBQ0kdDAyMTY4MTIxOTE5Al8xBBN0b3RhbFN0YWtlZFdpdGhMb2FuCAUNJHQwMjE2ODEyMTkxOQJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgULdG90YWxBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgUTdG90YWxTdGFrZWRXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBQ1rVXNlclBvc2l0aW9uBQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUVa1VzZXJQb3NpdGlvbkludGVyZXN0BQ9jdXJQb29sSW50ZXJlc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sBQRwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0FBnBvc051bQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUNYXhseUZlZUFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwBCWxpc3RUb0ludAIBYQRpdGVtCQDNCAIFAWEJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQEQZGlyZWN0U3dvcGZpQ1BNTQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBARwbXRQCQC1CQIJAJEDAgUFckFyZ3MAAgIBfAQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANwbXQJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEJAJEDAgUEcG10UAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcG10UAABBQNuaWwEC21pblRvUmVjaXZlCQCRAwIFBXJBcmdzAAMEA2ludgkA/AcEBQRkQXBwAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCBQttaW5Ub1JlY2l2ZQUDbmlsBQNuaWwFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZGlyZWN0Um91dGluZ1N3b3BmaQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA3BtdAQEcG10UAkAtQkCCQCRAwIFBXJBcmdzAAICAXwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQkAkQMCBQRwbXRQAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRwbXRQAAEFA25pbAQEYXJncwQFZUFyZ3MJALUJAgkAkQMCBQVyQXJncwADAgF8BApleGNoYW5nZXJzCQC1CQIJAJEDAgUFZUFyZ3MAAAIBLAQOZXhjaGFuZ2Vyc1R5cGUJALUJAgkAkQMCBQVlQXJncwABAgEsBAVhcmdzMQoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAgIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADBAVhcmdzMgoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADBBFyb3V0aW5nQXNzZXRzS2V5cwkAtQkCCQCRAwIFBWVBcmdzAAQCASwEC21pblRvUmVjaXZlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFZUFyZ3MABQkAzAgCBQpleGNoYW5nZXJzCQDMCAIFDmV4Y2hhbmdlcnNUeXBlCQDMCAIFBWFyZ3MxCQDMCAIFBWFyZ3MyCQDMCAIFEXJvdXRpbmdBc3NldHNLZXlzCQDMCAIFC21pblRvUmVjaXZlBQNuaWwEA2ludgkA/AcEBQRkQXBwAgxyb3V0aW5nVHJhZGUFBGFyZ3MFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEKY2FwaXRhbGl6ZQQEcG9vbAVwVHlwZQd0b2tlbklkC3Rva2VuQW1vdW50BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEDSR0MDI0MDI2MjQwOTIJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDQUlkCAUNJHQwMjQwMjYyNDA5MgJfMQQDQklkCAUNJHQwMjQwMjYyNDA5MgJfMgQEYmFsQQgFDSR0MDI0MDI2MjQwOTICXzMEBGJhbEIIBQ0kdDAyNDAyNjI0MDkyAl80BAdzaGFyZUlkCAUNJHQwMjQwMjYyNDA5MgJfNQMDCQECIT0CBQd0b2tlbklkBQNBSWQJAQIhPQIFB3Rva2VuSWQFA0JJZAcJAAIBAgtXcm9uZyBhc3NldAQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAMJAAACBRB0b3RhbFNoYXJlQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3Rva2VuQW1vdW50CQDZBAEFB3Rva2VuSWQFA25pbAQYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEC2xvYW5QZXJjZW50CQBrAwUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQZTQ0FMRTgFEHRvdGFsU2hhcmVBbW91bnQEEHRva2Vuc0ZvckZlZUxvYW4JAGsDBQt0b2tlbkFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQSdG9rZW5zRm9yRmVlTm9Mb2FuCQBlAgULdG9rZW5BbW91bnQFEHRva2Vuc0ZvckZlZUxvYW4EC2F4bHlGZWVMb2FuCQBrAwUQdG9rZW5zRm9yRmVlTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQxDQVBfRkVFX0xPQU4FCkZFRV9TQ0FMRTYEDWF4bHlGZWVOb0xvYW4JAGsDBRJ0b2tlbnNGb3JGZWVOb0xvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUPQ0FQX0ZFRV9OT19MT0FOBQpGRUVfU0NBTEU2BAdheGx5RmVlCQBkAgULYXhseUZlZUxvYW4FDWF4bHlGZWVOb0xvYW4EDSR0MDI0ODM3MjQ5MzcDCQAAAgUHdG9rZW5JZAUDQUlkCQCUCgIJAGUCBQt0b2tlbkFtb3VudAUHYXhseUZlZQAACQCUCgIAAAkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlBARwbXRBCAUNJHQwMjQ4MzcyNDkzNwJfMQQEcG10QggFDSR0MDI0ODM3MjQ5MzcCXzIEDSR0MDI0OTQwMjUwNDQJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAUGTk9fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQMc3Rha2VkQW1vdW50CAUNJHQwMjQ5NDAyNTA0NAJfMQQCbmYIBQ0kdDAyNDk0MDI1MDQ0Al8yBBNjdXJQb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABApzdGFrZWRMb2FuCQBrAwUMc3Rha2VkQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BAxzdGFrZWROb0xvYW4JAGUCBQxzdGFrZWRBbW91bnQFCnN0YWtlZExvYW4ED25ld0ludGVyZXN0TG9hbgMJAGYCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFE2N1clBvb2xJbnRlcmVzdExvYW4JAGsDBQpzdGFrZWRMb2FuBQdTQ0FMRTEwBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAQRbmV3SW50ZXJlc3ROb0xvYW4DCQBmAgkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQBkAgUVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQBrAwUMc3Rha2VkTm9Mb2FuBQdTQ0FMRTEwCQBlAgUQdG90YWxTaGFyZUFtb3VudAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgUPbmV3SW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4FEW5ld0ludGVyZXN0Tm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGQCBRB0b3RhbFNoYXJlQW1vdW50BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGQCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4FCnN0YWtlZExvYW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFB2F4bHlGZWUJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuSWQFA25pbAkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQFA25pbAEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAR1c2VyBHBvb2wFcG9zSWQIYm9ycm93ZWQEB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24EDHVzZXJJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QEDHBvb2xJbnRlcmVzdAMFCGJvcnJvd2VkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4JAGQCBQdwQW1vdW50CQBrAwUHcEFtb3VudAkAZQIFDHBvb2xJbnRlcmVzdAUMdXNlckludGVyZXN0BQdTQ0FMRTEwAQ9jYWxjU3RvcExvc3NGZWUEBHBvb2wKaXNCb3Jyb3dlZAhzdG9wTG9zcwpscFdpdGhkcmF3BAdmZWVUeXBlAwUKaXNCb3Jyb3dlZAUNU1RPUExPU1NfTE9BTgUUU1RPUExPU1NfRkVFX05PX0xPQU4DBQhzdG9wTG9zcwkAawMFCmxwV2l0aGRyYXcJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgAAAQ53aXRoZHJhd1RvVXNlcgQEdXNlcgRwb29sBXBvc0lkCHN0b3BMb3NzBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBAppc0JvcnJvd2VkCQBmAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AAAAAAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUFcG9zSWQFCmlzQm9ycm93ZWQEDnBvb2xUb3RhbFNoYXJlCQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBBJwb29sVG90YWxTaGFyZUxvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQIdXNlckFkZHIJAQdBZGRyZXNzAQkA2QQBBQR1c2VyBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDAyNzU3MzI3NjQ1CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEBmlkQVN0cggFDSR0MDI3NTczMjc2NDUCXzEEBmlkQlN0cggFDSR0MDI3NTczMjc2NDUCXzIEBGJhbEEIBQ0kdDAyNzU3MzI3NjQ1Al8zBARiYWxCCAUNJHQwMjc1NzMyNzY0NQJfNAQHc2hhcmVJZAgFDSR0MDI3NTczMjc2NDUCXzUEDSR0MDI3NjQ4Mjc3MTUJAJQKAgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRBU3RyCQEOYXNzZXRJZEZyb21TdHIBBQZpZEJTdHIEA2lkQQgFDSR0MDI3NjQ4Mjc3MTUCXzEEA2lkQggFDSR0MDI3NjQ4Mjc3MTUCXzIEC3N0b3BMb3NzRmVlCQEPY2FsY1N0b3BMb3NzRmVlBAUEcG9vbAUKaXNCb3Jyb3dlZAUIc3RvcExvc3MFD3VzZXJDYW5XaXRoZHJhdwQLY0JhbEFCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQtjQmFsQUJlZm9yZQULY0JhbEFCZWZvcmUEC2NCYWxCQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgULY0JhbEJCZWZvcmUFC2NCYWxCQmVmb3JlBANpbnYDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQtzdG9wTG9zc0ZlZQMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICCHdpdGhkcmF3CQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEA2ludgkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkCQBkAgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIDZ2V0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQKY0JhbEFBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFCmNCYWxBQWZ0ZXIFCmNCYWxBQWZ0ZXIECmNCYWxCQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQpjQmFsQkFmdGVyBQpjQmFsQkFmdGVyBA0kdDAyODQxMDI4NDk5CQCUCgIJAGUCBQpjQmFsQUFmdGVyBQtjQmFsQUJlZm9yZQkAZQIFCmNCYWxCQWZ0ZXIFC2NCYWxCQmVmb3JlBA10b2tlbnNBbW91bnRBCAUNJHQwMjg0MTAyODQ5OQJfMQQNdG9rZW5zQW1vdW50QggFDSR0MDI4NDEwMjg0OTkCXzIEDSR0MDI4NTAyMjk3MzgDBQppc0JvcnJvd2VkBAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QQcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUGaWRCU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QgcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUGaWRBU3RyBQZpZEJTdHIJAGUCBQRiYWxBBQ10b2tlbnNBbW91bnRBCQBlAgUEYmFsQgUNdG9rZW5zQW1vdW50QgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQFA25pbAMJAAACBQVleEludgUFZXhJbnYED2NCYWxBQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFD2NCYWxBQWZ0ZXJSZXBheQUPY0JhbEFBZnRlclJlcGF5BA9jQmFsQkFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQ9jQmFsQkFmdGVyUmVwYXkFD2NCYWxCQWZ0ZXJSZXBheQQLY2xvc2VEYnRJbnYDCQBmAgUEZGVidAAACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACCHJlcGF5Rm9yCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQtib3Jyb3dBc3NldAUEZGVidAUDbmlsAAADCQAAAgULY2xvc2VEYnRJbnYFC2Nsb3NlRGJ0SW52AwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEFTdHIJAJQKAgkAZQIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlBQRkZWJ0CQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQkAlAoCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQkAZQIJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlBQRkZWJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFDXRva2Vuc0Ftb3VudEEFDXRva2Vuc0Ftb3VudEIEB3RvVXNlckEIBQ0kdDAyODUwMjI5NzM4Al8xBAd0b1VzZXJCCAUNJHQwMjg1MDIyOTczOAJfMgQUcG9vbFRvdGFsTG9hbkVudHJpZXMDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgkAZQIFEnBvb2xUb3RhbFNoYXJlTG9hbgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQUDbmlsBQNuaWwEB2VudHJpZXMJAM4IAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBlAgkAZQIFDnBvb2xUb3RhbFNoYXJlBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCHVzZXJBZGRyBQd0b1VzZXJBBQNpZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFB3RvVXNlckIFA2lkQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAULc3RvcExvc3NGZWUJANkEAQUHc2hhcmVJZAUDbmlsBRRwb29sVG90YWxMb2FuRW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUGaWRBU3RyBQZpZEJTdHIFB3NoYXJlSWQFA25pbAkAlAoCBQdlbnRyaWVzCQDMCAIFB3RvVXNlckEJAMwIAgUHdG9Vc2VyQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxwYXJzZVJlcXVlc3QBCXJlcXVlc3RJZAQHcmVxdWVzdAkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQJAKwCAgITTm8gcmVxdWVzdCB3aXRoIGlkIAUJcmVxdWVzdElkAgEsBAR1c2VyCQCRAwIFB3JlcXVlc3QAAAQEcG9vbAkAkQMCBQdyZXF1ZXN0AAEEBHBtdEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAIEA0FJZAkAkQMCBQdyZXF1ZXN0AAMEBHBtdEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAQEA0JJZAkAkQMCBQdyZXF1ZXN0AAUEBGJhbEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAYEBGJhbEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAcEB3NoYXJlSWQJAJEDAgUHcmVxdWVzdAAIBAdid0Fzc2V0CQCRAwIFB3JlcXVlc3QACQQIYndBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAoJAJ0KCwUEdXNlcgUEcG9vbAUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFB2J3QXNzZXQFCGJ3QW1vdW50ARBjYWxjQm9ycm93QW1vdW50BgRwbXRBBHBtdEIDYUlkA2JJZAhsZXZlcmFnZQhib3Jyb3dJZAMDCQECIT0CBQhib3Jyb3dJZAUDYUlkCQECIT0CBQhib3Jyb3dJZAUDYklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQHZFByaWNlQQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2FJZAUOa1ByaWNlSW5PcmFjbGUEB2RQcmljZUIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNiSWQFDmtQcmljZUluT3JhY2xlBAZkZWNQckEJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBAZkZWNQckIJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBAxwYXlkSW5Eb2xsYXIJAGQCCQBrAwUHZFByaWNlQQUEcG10QQUGZGVjUHJBCQBrAwUHZFByaWNlQgUEcG10QgUGZGVjUHJCBA0kdDAzMTcyMDMxODE3AwkAAAIFCGJvcnJvd0lkBQNhSWQJAJQKAgUHZFByaWNlQQUGZGVjUHJBCQCUCgIFB2RQcmljZUIFBmRlY1ByQgQLYm9ycm93UHJpY2UIBQ0kdDAzMTcyMDMxODE3Al8xBAtib3Jyb3dEZWNQcggFDSR0MDMxNzIwMzE4MTcCXzIJAGsDCQBrAwUMcGF5ZEluRG9sbGFyCQBlAgUIbGV2ZXJhZ2UAZABkBQtib3Jyb3dEZWNQcgULYm9ycm93UHJpY2UBEnBhcnNlUmVwbGVuaXNoUG10cwMEcG10cwNBSWQDQklkAwkAAAIJAJADAQUEcG10cwACAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNBSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEEDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwABB2Fzc2V0SWQFA0JJZAkAAgECFVdyb25nIHBheW1lbnQgYXNzZXQgQgkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50CAkAkQMCBQRwbXRzAAEGYW1vdW50AwkAAAIJAJADAQUEcG10cwABAwkAAAIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQCUCgIICQCRAwIFBHBtdHMAAAZhbW91bnQAAAMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0JJZAkAlAoCAAAICQCRAwIFBHBtdHMAAAZhbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50CQACAQIcT25lIG9yIHR3byBwYXltZW50cyBleHBlY3RlZAEPY2FsY1ByaWNlSW1wYWN0BARiYWxBBGJhbEIHbmV3QmFsQQduZXdCYWxCBANwcmkJAGgCCQBlAgUGU0NBTEU4CQBrAwkAawMFBGJhbEIFBlNDQUxFOAUEYmFsQQUGU0NBTEU4CQBrAwUHbmV3QmFsQgUGU0NBTEU4BQduZXdCYWxBAGQDCQBmAgAABQNwcmkJAGgCBQNwcmkA////////////AQUDcHJpARFjbGFpbUFuZENoZWNrQW1udAUEcG9vbAVwVHlwZQVjbGFpbQZhbW91bnQGY2hhbmdlBA0kdDAzMjgxNzMzMDc5AwUFY2xhaW0JAQtjbGFpbUZhcm1lZAIFBXBUeXBlBQRwb29sBAxjbGFpbWVkQXNzZXQDCQAAAgUFcFR5cGUFB1NGX1BPT0wFBlNXT1BJRAMJAAACBQVwVHlwZQUHV1hfUE9PTAUEV1hJRAkBD3Vua25vd25Qb29sVHlwZQAJAJQKAgUGYW1vdW50BQxjbGFpbWVkQXNzZXQDCQAAAgUNJHQwMzI4MTczMzA3OQUNJHQwMzI4MTczMzA3OQQKY2xhaW1Bc3NldAgFDSR0MDMyODE3MzMwNzkCXzIEC2NsYWltQW1vdW50CAUNJHQwMzI4MTczMzA3OQJfMQQDYmFsCQEOYWNjb3VudEJhbGFuY2UBBQpjbGFpbUFzc2V0AwkAAAIFA2JhbAUDYmFsAwkAZgIFBmFtb3VudAUDYmFsCQACAQIZVG8gYmlnIGFtb3VudCB0byBleGNoYW5nZQkAlAoCBQtjbGFpbUFtb3VudAUKY2xhaW1Bc3NldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhsBaQETZ2V0UG9vbEluZm9SRUFET05MWQEEcG9vbAQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAzMzQ0NjMzNTM2CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDMzNDQ2MzM1MzYCXzEEA0JJZAgFDSR0MDMzNDQ2MzM1MzYCXzIEBGJhbEEIBQ0kdDAzMzQ0NjMzNTM2Al8zBARiYWxCCAUNJHQwMzM0NDYzMzUzNgJfNAQHc2hhcmVJZAgFDSR0MDMzNDQ2MzM1MzYCXzUEC3NoYXJlU3VwcGx5CQEOZ2V0U2hhcmVTdXBwbHkDBQhwb29sQWRkcgUFcFR5cGUFB3NoYXJlSWQJAJQKAgUDbmlsCQCYCgYFA0FJZAUDQklkBQdzaGFyZUlkBQRiYWxBBQRiYWxCBQtzaGFyZVN1cHBseQFpARpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQEHc2hhcmVJZAQLc2hhcmVQcmljZXMJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAkAlAoCBQNuaWwFC3NoYXJlUHJpY2VzAWkBImdldFVzZXJQb3NpdGlvblNoYXJlQW1vdW50UkVBRE9OTFkCBHVzZXIGcG9zTnVtBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAIQVW5rbm93biBwb3NpdGlvbgQMYm9ycm93QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUGcG9zTnVtCQBmAgUMYm9ycm93QW1vdW50AAAJAJQKAgUDbmlsBQ91c2VyQ2FuV2l0aGRyYXcBaQEXZ2V0VXNlclBvc2l0aW9uUkVBRE9OTFkDBHVzZXIFcG9vbHMGcG9zTnVtCgEHdXNlclBvcwIBYQRwb29sBA0kdDAzNDQwOTM0NDc5BQFhBAl3QW1vdW50c0EIBQ0kdDAzNDQwOTM0NDc5Al8xBAl3QW1vdW50c0IIBQ0kdDAzNDQwOTM0NDc5Al8yBAVkZWJ0cwgFDSR0MDM0NDA5MzQ0NzkCXzMEC2VxV0Ftb3VudHNBCAUNJHQwMzQ0MDkzNDQ3OQJfNAQLZXFXQW1vdW50c0IIBQ0kdDAzNDQwOTM0NDc5Al81BAVpbmRleAgFDSR0MDM0NDA5MzQ0NzkCXzYDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFDWtVc2VyUG9zaXRpb24JAJgKBgkAzQgCBQl3QW1vdW50c0EAAAkAzQgCBQl3QW1vdW50c0IAAAkAzQgCBQVkZWJ0cwAACQDNCAIFC2VxV0Ftb3VudHNBAAAJAM0IAgULZXFXQW1vdW50c0IAAAkAZAIFBWluZGV4AAEEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAzNDc1ODM0ODQ4CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDM0NzU4MzQ4NDgCXzEEA0JJZAgFDSR0MDM0NzU4MzQ4NDgCXzIEBGJhbEEIBQ0kdDAzNDc1ODM0ODQ4Al8zBARiYWxCCAUNJHQwMzQ3NTgzNDg0OAJfNAQHc2hhcmVJZAgFDSR0MDM0NzU4MzQ4NDgCXzUEDGJvcnJvd0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRFrVXNlckJvcnJvd0Ftb3VudAAABA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sCQCRAwIFBnBvc051bQUFaW5kZXgJAGYCBQxib3Jyb3dBbW91bnQAAAQNJHQwMzUwNjQzNTE4NAkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcECHdBbW91bnRBCAUNJHQwMzUwNjQzNTE4NAJfMQQId0Ftb3VudEIIBQ0kdDAzNTA2NDM1MTg0Al8yAwkAZgIFDGJvcnJvd0Ftb3VudAAABAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAkAzAgCBQtib3Jyb3dBc3NldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFBGRlYnQFBGRlYnQEDWFtb3VudFRvR2V0RXgDAwkAAAIFC2JvcnJvd0Fzc2V0BQNBSWQJAGYCBQRkZWJ0BQh3QW1vdW50QQcJAGUCBQRkZWJ0BQh3QW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFA0JJZAkAZgIFBGRlYnQFCHdBbW91bnRCBwkAZQIFBGRlYnQFCHdBbW91bnRCAAAEC2Ftb3VudFRvUGF5AwkAZgIFDWFtb3VudFRvR2V0RXgAAAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQCZXgJARFjYWxjQW1vdW50VG9QYXlTRgcFBHBvb2wFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAgFAmV4Al8yAwkAAAIFBXBUeXBlBQdXWF9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIJAQ91bmtub3duUG9vbFR5cGUAAAAEDSR0MDM2MDk2MzYzMTUDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAlAoCCQBlAgkAZAIFCHdBbW91bnRBBQ1hbW91bnRUb0dldEV4BQRkZWJ0CQBlAgUId0Ftb3VudEIFC2Ftb3VudFRvUGF5CQCUCgIJAGUCBQh3QW1vdW50QQULYW1vdW50VG9QYXkJAGUCCQBkAgUId0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFBGRlYnQECmVxV0Ftb3VudEEIBQ0kdDAzNjA5NjM2MzE1Al8xBAplcVdBbW91bnRCCAUNJHQwMzYwOTYzNjMxNQJfMgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAzQgCBQVkZWJ0cwUEZGVidAkAzQgCBQtlcVdBbW91bnRzQQUKZXFXQW1vdW50QQkAzQgCBQtlcVdBbW91bnRzQgUKZXFXQW1vdW50QgkAZAIFBWluZGV4AAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJgKBgkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIFBWRlYnRzCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAZAIFBWluZGV4AAEEDSR0MDM2NTcwMzY2ODEKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCYCgYFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB3VzZXJQb3MCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQJd0Ftb3VudHNBCAUNJHQwMzY1NzAzNjY4MQJfMQQJd0Ftb3VudHNCCAUNJHQwMzY1NzAzNjY4MQJfMgQFZGVidHMIBQ0kdDAzNjU3MDM2NjgxAl8zBAtlcVdBbW91bnRzQQgFDSR0MDM2NTcwMzY2ODECXzQEC2VxV0Ftb3VudHNCCAUNJHQwMzY1NzAzNjY4MQJfNQkAlAoCBQNuaWwJAJcKBQUJd0Ftb3VudHNBBQl3QW1vdW50c0IFBWRlYnRzBQtlcVdBbW91bnRzQQULZXFXQW1vdW50c0IBaQEJcmVwbGVuaXNoAwRwb29sCGxldmVyYWdlCGJvcnJvd0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDAwkAZgIAZAUIbGV2ZXJhZ2UGCQBmAgUIbGV2ZXJhZ2UArAIJAAIBAh9MZXZlcmFnZSBjYW4ndCBiZSA8MTAwIGFuZCA+MzAwAwMJAQEhAQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhbkJvcnJvdwkAZgIFCGxldmVyYWdlAGQHCQACAQIdWW91IGNhbid0IGJvcnJvdyBpbiB0aGlzIHBvb2wEDSR0MDM3Mjc5MzczNjkJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwMzcyNzkzNzM2OQJfMQQDQklkCAUNJHQwMzcyNzkzNzM2OQJfMgQEYmFsQQgFDSR0MDM3Mjc5MzczNjkCXzMEBGJhbEIIBQ0kdDAzNzI3OTM3MzY5Al80BAdzaGFyZUlkCAUNJHQwMzcyNzkzNzM2OQJfNQMDCQECIT0CBQhib3Jyb3dJZAUDQUlkCQECIT0CBQhib3Jyb3dJZAUDQklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQNJHQwMzc0NTAzNzUwOQkBEnBhcnNlUmVwbGVuaXNoUG10cwMIBQFpCHBheW1lbnRzBQNBSWQFA0JJZAQEcG10QQgFDSR0MDM3NDUwMzc1MDkCXzEEBHBtdEIIBQ0kdDAzNzQ1MDM3NTA5Al8yBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQJbmV3UG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgMJAGYCBQhsZXZlcmFnZQBkBAxib3Jyb3dBbW91bnQJARBjYWxjQm9ycm93QW1vdW50BgUEcG10QQUEcG10QgUDQUlkBQNCSWQFCGxldmVyYWdlBQhib3Jyb3dJZAQHcmVxdWVzdAkAuQkCCQDMCAIFBHVzZXIJAMwIAgUEcG9vbAkAzAgCCQCkAwEFBHBtdEEJAMwIAgUDQUlkCQDMCAIJAKQDAQUEcG10QgkAzAgCBQNCSWQJAMwIAgkApAMBBQRiYWxBCQDMCAIJAKQDAQUEYmFsQgkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIJAKQDAQUMYm9ycm93QW1vdW50BQNuaWwCASwEDG5ld1JlcXVlc3RJZAoAAUAJAPwHBAUEdGhpcwIQY3JlYXRlTmV3UmVxdWVzdAkAzAgCBQdyZXF1ZXN0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUMbmV3UmVxdWVzdElkBQxuZXdSZXF1ZXN0SWQEBGFyZ3MJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgUMYm9ycm93QW1vdW50CQDMCAIJAKUIAQUEdGhpcwkAzAgCAhFyZXBsZW5pc2hGcm9tTGFuZAkAzAgCCQCkAwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUMbmV3UmVxdWVzdElkAhhDYW4ndCBjcmVhdGUgbmV3IHJlcXVlc3QFA25pbAQDaW52CQD9BwQJAQ5nZXRMZW5kU3J2QWRkcgACDWZsYXNoUG9zaXRpb24FBGFyZ3MFA25pbAMJAAACBQNpbnYFA2ludgQKdXNlclN0YWtlZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtBQ1rVXNlclBvc2l0aW9uBA0kdDAzODQ5ODM4NTkyCQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDAzODQ5ODM4NTkyBQ0kdDAzODQ5ODM4NTkyBAduZXdCYWxCCAUNJHQwMzg0OTgzODU5MgJfMgQHbmV3QmFsQQgFDSR0MDM4NDk4Mzg1OTICXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwMzg2NjIzODc3NwkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDM4NjYyMzg3NzcCXzEECHdBbW91bnRCCAUNJHQwMzg2NjIzODc3NwJfMgkAlAoCBQNuaWwJAMwIAgUIcHJJbXBhY3QJAMwIAgUId0Ftb3VudEEJAMwIAgUId0Ftb3VudEIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMzg4MzAzODk0NQkBD3JlcGxlbmlzaEJ5VHlwZQoFBXBUeXBlBQRwb29sBQtOT19MT0FOX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQDCQAAAgUNJHQwMzg4MzAzODk0NQUNJHQwMzg4MzAzODk0NQQHYXhseUZlZQgFDSR0MDM4ODMwMzg5NDUCXzIECnVzZXJTdGFrZWQIBQ0kdDAzODgzMDM4OTQ1Al8xBA0kdDAzODk1MTM5MDQ1CQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDAzODk1MTM5MDQ1BQ0kdDAzODk1MTM5MDQ1BAduZXdCYWxCCAUNJHQwMzg5NTEzOTA0NQJfMgQHbmV3QmFsQQgFDSR0MDM4OTUxMzkwNDUCXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwMzkxMTUzOTIzMAkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDM5MTE1MzkyMzACXzEECHdBbW91bnRCCAUNJHQwMzkxMTUzOTIzMAJfMgkAlAoCCQDOCAIJARByZXBsZW5pc2hFbnRyaWVzCAUEcG9vbAUEdXNlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUJbmV3UG9zTnVtBQdzaGFyZUlkBQVwVHlwZQcJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcCBHBvb2wFcG9zSWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQRwb29sBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAkBDndpdGhkcmF3VG9Vc2VyBAkApQgBCAUBaQZjYWxsZXIFBHBvb2wJAKQDAQUFcG9zSWQHAWkBFGNyZWF0ZVVwZGF0ZVN0b3BMb3NzBAVwb3NJZAZwb29sSWQHYXNzZXRJZAVwcmljZQkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABBB0b2tlbk9yYWNsZVByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUGcG9vbElkAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQZwb29sSWQFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGcG9vbElkAgFfCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAAgECGlRoZXJlIGFyZSBubyB1c2VyIHBvc2l0aW9uAwkAZwIAAAUFcHJpY2UJAAIBAhxQcmljZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIFBXByaWNlBRB0b2tlbk9yYWNsZVByaWNlCQACAQIrUHJpY2UgbXVzdCBiZSBsZXNzIHRoYW4gY3VycmVudCB0b2tlbiBwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQVwcmljZQUDbmlsAWkBDmRlbGV0ZVN0b3BMb3NzAwVwb3NJZAZwb29sSWQHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBnBvb2xJZAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUGcG9vbElkBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzCQACAQIITm8gZW50cnkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQNuaWwBaQEEaW5pdA0MbW9uZXlCb3hBZGRyDXNmRmFybWluZ0FkZHIIbGVuZEFkZHIPcHJpY2VPcmFjbGVBZGRyEGtlZXBlckV4Q29udHJhY3QOd3hTd2FwQ29udHJhY3QLc3dvcEFzc2V0SWQJd3hBc3NldElkDm9wZXJhdG9yUHViS2V5Emdyb3VwMUFkbWluMVB1YktleRJncm91cDFBZG1pbjJQdWJLZXkSZ3JvdXAyQWRtaW4xUHViS2V5Emdyb3VwMkFkbWluMlB1YktleQkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpAwkBCWlzRGVmaW5lZAEJAKIIAQUPa09wZXJhdG9yQ2FsbFBLCQACAQIOQWxyZWFkeSBpbml0ZWQDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFDG1vbmV5Qm94QWRkcgkAAgECI21vbmV5Qm94QWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQ1zZkZhcm1pbmdBZGRyCQACAQIkc2ZGYXJtaW5nQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQhsZW5kQWRkcgkAAgECH2xlbmRBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFD3ByaWNlT3JhY2xlQWRkcgkAAgECJnByaWNlT3JhY2xlQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBRBrZWVwZXJFeENvbnRyYWN0CQACAQIna2VlcGVyRXhDb250cmFjdCBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFC3N3b3BBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQEBIQEJAQlpc0RlZmluZWQBCQDsBwEJANkEAQUJd3hBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQECIT0CCQDIAQEJANkEAQUOb3BlcmF0b3JQdWJLZXkAIAkAAgECHW9wZXJhdG9yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtNb25leUJveAUMbW9uZXlCb3hBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDmtTRkZhcm1pbmdBZGRyBQ1zZkZhcm1pbmdBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtMZW5kU2VydmljZQUIbGVuZEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa1ByaWNlT3JhY2xlBQ9wcmljZU9yYWNsZUFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa0V4Q29udHJhY3QFEGtlZXBlckV4Q29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa1d4U3dhcENvbnRyYWN0BQ53eFN3YXBDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBQdrU3dvcElkBQtzd29wQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQVrV3hJZAUJd3hBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tPcGVyYXRvckNhbGxQSwUOb3BlcmF0b3JQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMVBLBRJncm91cDFBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMlBLBRJncm91cDFBZG1pbjJQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMVBLBRJncm91cDJBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMlBLBRJncm91cDJBZG1pbjJQdWJLZXkFA25pbAFpARBjcmVhdGVOZXdSZXF1ZXN0AQZwYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQMbmV3UmVxdWVzdElkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQxrUmVxdWVzdEl0ZXIAAAABCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCkAwEFDG5ld1JlcXVlc3RJZAUKa1JlcXVlc3RJZAUGcGFyYW1zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrUmVxdWVzdEl0ZXIFDG5ld1JlcXVlc3RJZAUDbmlsBQxuZXdSZXF1ZXN0SWQBaQERcmVwbGVuaXNoRnJvbUxhbmQBCXJlcXVlc3RJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBA0kdDA0NDA2OTQ0MTczCQEMcGFyc2VSZXF1ZXN0AQUJcmVxdWVzdElkBAR1c2VyCAUNJHQwNDQwNjk0NDE3MwJfMQQEcG9vbAgFDSR0MDQ0MDY5NDQxNzMCXzIEBHBtdEEIBQ0kdDA0NDA2OTQ0MTczAl8zBANBSWQIBQ0kdDA0NDA2OTQ0MTczAl80BARwbXRCCAUNJHQwNDQwNjk0NDE3MwJfNQQDQklkCAUNJHQwNDQwNjk0NDE3MwJfNgQEYmFsQQgFDSR0MDQ0MDY5NDQxNzMCXzcEBGJhbEIIBQ0kdDA0NDA2OTQ0MTczAl84BAdzaGFyZUlkCAUNJHQwNDQwNjk0NDE3MwJfOQQHYndBc3NldAgFDSR0MDQ0MDY5NDQxNzMDXzEwBAhid0Ftb3VudAgFDSR0MDQ0MDY5NDQxNzMDXzExAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQISV3JvbmcgcGF5bWVudCBzaXplAwMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFB2J3QXNzZXQGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUIYndBbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50BA0kdDA0NDM2MzQ0NDYzAwkAAAIFA0FJZAUHYndBc3NldAkAlAoCCQBkAgUEcG10QQUIYndBbW91bnQFBHBtdEIJAJQKAgUEcG10QQkAZAIFBHBtdEIFCGJ3QW1vdW50BAdwbXRBbGxBCAUNJHQwNDQzNjM0NDQ2MwJfMQQHcG10QWxsQggFDSR0MDQ0MzYzNDQ0NjMCXzIEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDA0NDU0NTQ0NjYwCQEPcmVwbGVuaXNoQnlUeXBlCgUFcFR5cGUFBHBvb2wFCExPQU5fRkVFBQdwbXRBbGxBBQNBSWQFB3BtdEFsbEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQKdXNlclN0YWtlZAgFDSR0MDQ0NTQ1NDQ2NjACXzEEB2F4bHlGZWUIBQ0kdDA0NDU0NTQ0NjYwAl8yBAZwb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyBA1ib3Jyb3dFbnRyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BQhid0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEmtVc2VyQm9ycm93QXNzZXRJZAUHYndBc3NldAUDbmlsBAdlbnRyaWVzCQEQcmVwbGVuaXNoRW50cmllcwgFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFBnBvc051bQUHc2hhcmVJZAUFcFR5cGUGBA0kdDA0NTAyMDQ1MTM1CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwNDUwMjA0NTEzNQJfMQQId0Ftb3VudEIIBQ0kdDA0NTAyMDQ1MTM1Al8yCQCUCgIJAM0IAgkAzggCCQDOCAIFB2VudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsBQ1ib3Jyb3dFbnRyaWVzCQELRGVsZXRlRW50cnkBCQCsAgIFCXJlcXVlc3RJZAUKa1JlcXVlc3RJZAUKdXNlclN0YWtlZAFpAQlsaXF1aWRhdGUDBHVzZXIFcG9zSWQPbGlxdWlkYXRlQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wCC25vIHBvc2l0aW9uBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwNDU2NTY0NTc0NgkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDA0NTY1NjQ1NzQ2Al8xBANCSWQIBQ0kdDA0NTY1NjQ1NzQ2Al8yBARiYWxBCAUNJHQwNDU2NTY0NTc0NgJfMwQEYmFsQggFDSR0MDQ1NjU2NDU3NDYCXzQEB3NoYXJlSWQIBQ0kdDA0NTY1NjQ1NzQ2Al81BAZhbW91bnQJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPbGlxdWlkYXRlQW1vdW50BAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUFcG9zSWQJAGYCBQxib3Jyb3dBbW91bnQAAAMJAGYCBQ9saXF1aWRhdGVBbW91bnQFD3VzZXJDYW5XaXRoZHJhdwkAAgECJ1lvdSBjYW4ndCBsaXF1aWRhdGUgbW9yZSB0aGFuIHVzZXIgaGF2ZQMJAAACBQxib3Jyb3dBbW91bnQAAAkAAgECK1lvdSBjYW4ndCBsaXF1aWRhdGUgcG9zaXRpb24gd2l0aG91dCBib3Jyb3cJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQBlAgUPdXNlckNhbldpdGhkcmF3BQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQJANkEAQUHc2hhcmVJZAUDbmlsAWkBCHN0b3BMb3NzBAR1c2VyBXBvc0lkBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBA1zdG9wTG9zc1ByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzAghObyBlbnRyeQMJAGYCBRB0b2tlbk9yYWNsZVByaWNlBQ1zdG9wTG9zc1ByaWNlCQACAQIjVG9rZW4gcHJpY2UgZ3JlYXRlciBzdG9wIGxvc3MgcHJpY2UEA3JlcwkBDndpdGhkcmF3VG9Vc2VyBAUEdXNlcgUEcG9vbAkApAMBBQVwb3NJZAYJAJQKAgkAzQgCCAUDcmVzAl8xCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQCAV8FBHBvb2wCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MIBQNyZXMCXzIBaQEMY2FwaXRhbGl6ZUV4BQRwb29sBXJvdXRlCXRva2VuVG9JZBBhbW91bnRUb0V4Y2hhbmdlBWNsYWltCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQGY2hhbmdlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UAAAQNJHQwNDc3MTY0NzgxOAkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRBhbW91bnRUb0V4Y2hhbmdlBQZjaGFuZ2UDCQAAAgUNJHQwNDc3MTY0NzgxOAUNJHQwNDc3MTY0NzgxOAQMY2xhaW1lZEFzc2V0CAUNJHQwNDc3MTY0NzgxOAJfMgQNY2xhaW1lZEFtb3VudAgFDSR0MDQ3NzE2NDc4MTgCXzEEBXJBcmdzCQC1CQIFBXJvdXRlAgJfXwQPZXhjaGFuZ2VkQW1vdW50AwkAAAIJAJEDAgUFckFyZ3MAAAIQZGlyZWN0U3dvcGZpQ1BNTQkBEGRpcmVjdFN3b3BmaUNQTU0CBQVyQXJncwUJdG9rZW5Ub0lkAwkAAAIJAJEDAgUFckFyZ3MAAAINcm91dGluZ1N3b3BmaQkBE2RpcmVjdFJvdXRpbmdTd29wZmkCBQVyQXJncwUJdG9rZW5Ub0lkCQACAQILV3Jvbmcgcm91dGUDCQAAAgUPZXhjaGFuZ2VkQW1vdW50BQ9leGNoYW5nZWRBbW91bnQECW5ld0NoYW5nZQkAZQIJAGQCBQ1jbGFpbWVkQW1vdW50BQZjaGFuZ2UFEGFtb3VudFRvRXhjaGFuZ2UEC2NoYW5nZUVudHJ5AwkAZwIFCW5ld0NoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlBQluZXdDaGFuZ2UFA25pbAUDbmlsCQDOCAIJAQpjYXBpdGFsaXplBAUEcG9vbAUFcFR5cGUFCXRva2VuVG9JZAUPZXhjaGFuZ2VkQW1vdW50BQtjaGFuZ2VFbnRyeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jYXBpdGFsaXplTm9FeAMEcG9vbAVjbGFpbRFhbW91bnRGcm9tQmFsYW5jZQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wEDSR0MDQ4NTAyNDg2MDAJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQURYW1vdW50RnJvbUJhbGFuY2UAAAMJAAACBQ0kdDA0ODUwMjQ4NjAwBQ0kdDA0ODUwMjQ4NjAwBAxjbGFpbWVkQXNzZXQIBQ0kdDA0ODUwMjQ4NjAwAl8yBA1jbGFpbWVkQW1vdW50CAUNJHQwNDg1MDI0ODYwMAJfMQkBCmNhcGl0YWxpemUEBQRwb29sBQVwVHlwZQkBDGFzc2V0SWRUb1N0cgEFDGNsYWltZWRBc3NldAkAZAIFDWNsYWltZWRBbW91bnQFEWFtb3VudEZyb21CYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2luaXROZXdQb29sCQR0eXBlCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgljYW5Cb3Jyb3cJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDAwkBAiE9AgUEdHlwZQUHU0ZfUE9PTAkBAiE9AgUEdHlwZQUHV1hfUE9PTAcJAAIBAgpXcm9uZyB0eXBlBA0kdDA0OTAyNjQ5MTIwCQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUIcG9vbEFkZHIFBHR5cGUEA2FJZAgFDSR0MDQ5MDI2NDkxMjACXzEEA2JJZAgFDSR0MDQ5MDI2NDkxMjACXzIEBGFCYWwIBQ0kdDA0OTAyNjQ5MTIwAl8zBARiQmFsCAUNJHQwNDkwMjY0OTEyMAJfNAQHc2hhcmVJZAgFDSR0MDQ5MDI2NDkxMjACXzUDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtQb29sSW50ZXJlc3RMb2FuAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBWtQb29sBQhwb29sQWRkcgUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFB3NoYXJlSWQFCmtTaGFyZVBvb2wFCHBvb2xBZGRyCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFCHBvb2xBZGRyBQ5rUG9vbENhbkJvcnJvdwUJY2FuQm9ycm93BQNuaWwBaQEOdXBkYXRlUG9vbEZlZXMHCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUIcG9vbEFkZHIJAAIBCQCsAgICGkNhbid0IGZpbmQgcG9vbCB3aXRoIGFkZHIgBQhwb29sQWRkcgMJAGYCAAAFC2luRmVlTm9Mb2FuCQACAQIiaW5GZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCWluRmVlTG9hbgkAAgECIGluRmVlTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUMY2FwRmVlTm9Mb2FuCQACAQIjY2FwRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQ5jYXBGZWVXaXRoTG9hbgkAAgECJWNhcEZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRFzdG9wbG9zc0ZlZU5vTG9hbgkAAgECKHN0b3Bsb3NzRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQACAQIqc3RvcGxvc3NGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRVrQXhseUluRmVlV2l0aG91dExvYW4FC2luRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRJrQXhseUluRmVlV2l0aExvYW4FCWluRmVlTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa0F4bHlOb0xvYW5DYXBGZWUFDGNhcEZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa0F4bHlXaXRoTG9hbkNhcEZlZQUOY2FwRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUFEXN0b3Bsb3NzRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRRrQXhseVN0b3BMb3NzTG9hbkZlZQUTc3RvcGxvc3NGZWVXaXRoTG9hbgUDbmlsAWkBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhNkQXBwIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgUDbmlsAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAgECFWRBcHAgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcFA25pbAFpARBhY3RpdmF0ZUZvclVzZXJzAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgkAAgECHWRBcHAgYWxyZWFkeSBhY3RpdmUgZm9yIHVzZXJzCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrQWN0aXZlVXNlcnMGBQNuaWwBaQEQc2h1dGRvd25Gb3JVc2VycwAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgkAAgECH2RBcHAgYWxyZWFkeSBzaHV0ZG93biBmb3IgdXNlcnMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtBY3RpdmVVc2VycwcFA25pbAFpAQphY3RpdmF0ZVNGAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhVTV09QRkkgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGBQNuaWwBaQEKc2h1dGRvd25TRgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhdTV09QRkkgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAcFA25pbAFpAQphY3RpdmF0ZVdYAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhFXWCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYFA25pbAFpAQpzaHV0ZG93bldYAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECE1dYIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gHBQNuaWwBaQEMYWN0aXZhdGVQb29sAQRwb29sCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sCQACAQIMVW5rbm93biBwb29sAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgkAAgECE1Bvb2wgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGBQNuaWwBaQEMc2h1dGRvd25Qb29sAQRwb29sCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sCQACAQIMVW5rbm93biBwb29sAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGCQACAQIVUG9vbCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBwUDbmlsAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAQGaXNTZWxmCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAppc1JpZ2h0RmVlAwkAAAIIBQNpbnYDZmVlAKD3NgkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcECmlzSW5pdENhbGwJAAACCAUDaW52CGZ1bmN0aW9uAgRpbml0BAxpc25vUGF5bWVudHMJAAACCQCQAwEIBQNpbnYIcGF5bWVudHMAAAMDAwUKaXNSaWdodEZlZQUKaXNJbml0Q2FsbAcFBmlzU2VsZgcFDGlzbm9QYXltZW50cwcEDGdyb3VwMVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDmdyb3VwMUFkbWluMVBLAAEJAGQCAAADCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ5ncm91cDFBZG1pbjJQSwABAAAEDGdyb3VwMlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDmdyb3VwMkFkbWluMVBLAAEJAGQCAAADCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQ5ncm91cDJBZG1pbjJQSwABAAAJAAACCQBkAgUMZ3JvdXAxU2lnbmVkBQxncm91cDJTaWduZWQAAik5H3o=", "height": 3862685, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Di1b4k1uopaXah7HsG18BcFTppS6jR5u4s3M5BsoQPMx Next: Dyzn3VTNHYRGZQQiGLAtQURzZ8LoSc8n5j6JTZGvNuhf Diff:
OldNewDifferences
892892 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
893893 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
894894 else 0
895- ([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotal), (totalShareAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, fromBase58String(tokenId))] ++ getCursEntries(AId, BId, shareId, nil))
895+ ([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotal), (totalShareAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))] ++ getCursEntries(AId, BId, shareId, nil))
896896 }
897897 }
898898 }
927927 let userAddr = Address(fromBase58String(user))
928928 let poolAddr = Address(fromBase58String(pool))
929929 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
930- let $t02757527647 = getPoolData(poolAddr, pType)
931- let idAStr = $t02757527647._1
932- let idBStr = $t02757527647._2
933- let balA = $t02757527647._3
934- let balB = $t02757527647._4
935- let shareId = $t02757527647._5
936- let $t02765027717 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
937- let idA = $t02765027717._1
938- let idB = $t02765027717._2
930+ let $t02757327645 = getPoolData(poolAddr, pType)
931+ let idAStr = $t02757327645._1
932+ let idBStr = $t02757327645._2
933+ let balA = $t02757327645._3
934+ let balB = $t02757327645._4
935+ let shareId = $t02757327645._5
936+ let $t02764827715 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
937+ let idA = $t02764827715._1
938+ let idB = $t02764827715._2
939939 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
940940 let cBalABefore = accountBalance(idA)
941941 if ((cBalABefore == cBalABefore))
966966 let cBalBAfter = accountBalance(idB)
967967 if ((cBalBAfter == cBalBAfter))
968968 then {
969- let $t02841228501 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
970- let tokensAmountA = $t02841228501._1
971- let tokensAmountB = $t02841228501._2
972- let $t02850429740 = if (isBorrowed)
969+ let $t02841028499 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
970+ let tokensAmountA = $t02841028499._1
971+ let tokensAmountB = $t02841028499._2
972+ let $t02850229738 = if (isBorrowed)
973973 then {
974974 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
975975 let debt = {
10181018 else throw("Strict value is not equal to itself.")
10191019 }
10201020 else $Tuple2(tokensAmountA, tokensAmountB)
1021- let toUserA = $t02850429740._1
1022- let toUserB = $t02850429740._2
1021+ let toUserA = $t02850229738._1
1022+ let toUserB = $t02850229738._2
10231023 let poolTotalLoanEntries = if (isBorrowed)
10241024 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
10251025 else nil
10651065 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10661066 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10671067 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1068- let $t03172231819 = if ((borrowId == aId))
1068+ let $t03172031817 = if ((borrowId == aId))
10691069 then $Tuple2(dPriceA, decPrA)
10701070 else $Tuple2(dPriceB, decPrB)
1071- let borrowPrice = $t03172231819._1
1072- let borrowDecPr = $t03172231819._2
1071+ let borrowPrice = $t03172031817._1
1072+ let borrowDecPr = $t03172031817._2
10731073 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10741074 }
10751075
10981098
10991099
11001100 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1101- let $t03281933081 = if (claim)
1101+ let $t03281733079 = if (claim)
11021102 then claimFarmed(pType, pool)
11031103 else {
11041104 let claimedAsset = if ((pType == SF_POOL))
11081108 else unknownPoolType()
11091109 $Tuple2(amount, claimedAsset)
11101110 }
1111- if (($t03281933081 == $t03281933081))
1111+ if (($t03281733079 == $t03281733079))
11121112 then {
1113- let claimAsset = $t03281933081._2
1114- let claimAmount = $t03281933081._1
1113+ let claimAsset = $t03281733079._2
1114+ let claimAmount = $t03281733079._1
11151115 let bal = accountBalance(claimAsset)
11161116 if ((bal == bal))
11171117 then if ((amount > bal))
11271127 func getPoolInfoREADONLY (pool) = {
11281128 let poolAddr = addressFromStringValue(pool)
11291129 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1130- let $t03344833538 = getPoolData(Address(fromBase58String(pool)), pType)
1131- let AId = $t03344833538._1
1132- let BId = $t03344833538._2
1133- let balA = $t03344833538._3
1134- let balB = $t03344833538._4
1135- let shareId = $t03344833538._5
1130+ let $t03344633536 = getPoolData(Address(fromBase58String(pool)), pType)
1131+ let AId = $t03344633536._1
1132+ let BId = $t03344633536._2
1133+ let balA = $t03344633536._3
1134+ let balB = $t03344633536._4
1135+ let shareId = $t03344633536._5
11361136 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11371137 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
11381138 }
11601160 @Callable(i)
11611161 func getUserPositionREADONLY (user,pools,posNum) = {
11621162 func userPos (a,pool) = {
1163- let $t03441134481 = a
1164- let wAmountsA = $t03441134481._1
1165- let wAmountsB = $t03441134481._2
1166- let debts = $t03441134481._3
1167- let eqWAmountsA = $t03441134481._4
1168- let eqWAmountsB = $t03441134481._5
1169- let index = $t03441134481._6
1163+ let $t03440934479 = a
1164+ let wAmountsA = $t03440934479._1
1165+ let wAmountsB = $t03440934479._2
1166+ let debts = $t03440934479._3
1167+ let eqWAmountsA = $t03440934479._4
1168+ let eqWAmountsB = $t03440934479._5
1169+ let index = $t03440934479._6
11701170 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
11711171 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
11721172 else {
11731173 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1174- let $t03476034850 = getPoolData(Address(fromBase58String(pool)), pType)
1175- let AId = $t03476034850._1
1176- let BId = $t03476034850._2
1177- let balA = $t03476034850._3
1178- let balB = $t03476034850._4
1179- let shareId = $t03476034850._5
1174+ let $t03475834848 = getPoolData(Address(fromBase58String(pool)), pType)
1175+ let AId = $t03475834848._1
1176+ let BId = $t03475834848._2
1177+ let balA = $t03475834848._3
1178+ let balB = $t03475834848._4
1179+ let shareId = $t03475834848._5
11801180 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
11811181 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1182- let $t03506635186 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1183- let wAmountA = $t03506635186._1
1184- let wAmountB = $t03506635186._2
1182+ let $t03506435184 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1183+ let wAmountA = $t03506435184._1
1184+ let wAmountB = $t03506435184._2
11851185 if ((borrowAmount > 0))
11861186 then {
11871187 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
12151215 }
12161216 else unknownPoolType()
12171217 else 0
1218- let $t03609836317 = if ((borrowAsset == AId))
1218+ let $t03609636315 = if ((borrowAsset == AId))
12191219 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12201220 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1221- let eqWAmountA = $t03609836317._1
1222- let eqWAmountB = $t03609836317._2
1221+ let eqWAmountA = $t03609636315._1
1222+ let eqWAmountB = $t03609636315._2
12231223 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12241224 }
12251225 else throw("Strict value is not equal to itself.")
12281228 }
12291229 }
12301230
1231- let $t03657236683 = {
1231+ let $t03657036681 = {
12321232 let $l = pools
12331233 let $s = size($l)
12341234 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12421242
12431243 $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)
12441244 }
1245- let wAmountsA = $t03657236683._1
1246- let wAmountsB = $t03657236683._2
1247- let debts = $t03657236683._3
1248- let eqWAmountsA = $t03657236683._4
1249- let eqWAmountsB = $t03657236683._5
1245+ let wAmountsA = $t03657036681._1
1246+ let wAmountsB = $t03657036681._2
1247+ let debts = $t03657036681._3
1248+ let eqWAmountsA = $t03657036681._4
1249+ let eqWAmountsB = $t03657036681._5
12501250 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
12511251 }
12521252
12661266 else false)
12671267 then throw("You can't borrow in this pool")
12681268 else {
1269- let $t03728137371 = getPoolData(Address(fromBase58String(pool)), pType)
1270- let AId = $t03728137371._1
1271- let BId = $t03728137371._2
1272- let balA = $t03728137371._3
1273- let balB = $t03728137371._4
1274- let shareId = $t03728137371._5
1269+ let $t03727937369 = getPoolData(Address(fromBase58String(pool)), pType)
1270+ let AId = $t03727937369._1
1271+ let BId = $t03727937369._2
1272+ let balA = $t03727937369._3
1273+ let balB = $t03727937369._4
1274+ let shareId = $t03727937369._5
12751275 if (if ((borrowId != AId))
12761276 then (borrowId != BId)
12771277 else false)
12781278 then throw("Wrong borrow asset")
12791279 else {
1280- let $t03745237511 = parseReplenishPmts(i.payments, AId, BId)
1281- let pmtA = $t03745237511._1
1282- let pmtB = $t03745237511._2
1280+ let $t03745037509 = parseReplenishPmts(i.payments, AId, BId)
1281+ let pmtA = $t03745037509._1
1282+ let pmtB = $t03745037509._2
12831283 let user = toString(i.caller)
12841284 let newPosNum = getNewUserPositionNumber(user)
12851285 if ((leverage > 100))
12991299 if ((inv == inv))
13001300 then {
13011301 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1302- let $t03850038594 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1303- if (($t03850038594 == $t03850038594))
1302+ let $t03849838592 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1303+ if (($t03849838592 == $t03849838592))
13041304 then {
1305- let newBalB = $t03850038594._2
1306- let newBalA = $t03850038594._1
1305+ let newBalB = $t03849838592._2
1306+ let newBalA = $t03849838592._1
13071307 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1308- let $t03866438779 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1309- let wAmountA = $t03866438779._1
1310- let wAmountB = $t03866438779._2
1308+ let $t03866238777 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1309+ let wAmountA = $t03866238777._1
1310+ let wAmountB = $t03866238777._2
13111311 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13121312 }
13131313 else throw("Strict value is not equal to itself.")
13171317 else throw("Strict value is not equal to itself.")
13181318 }
13191319 else {
1320- let $t03883238947 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1321- if (($t03883238947 == $t03883238947))
1320+ let $t03883038945 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1321+ if (($t03883038945 == $t03883038945))
13221322 then {
1323- let axlyFee = $t03883238947._2
1324- let userStaked = $t03883238947._1
1325- let $t03895339047 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1326- if (($t03895339047 == $t03895339047))
1323+ let axlyFee = $t03883038945._2
1324+ let userStaked = $t03883038945._1
1325+ let $t03895139045 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1326+ if (($t03895139045 == $t03895139045))
13271327 then {
1328- let newBalB = $t03895339047._2
1329- let newBalA = $t03895339047._1
1328+ let newBalB = $t03895139045._2
1329+ let newBalA = $t03895139045._1
13301330 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1331- let $t03911739232 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1332- let wAmountA = $t03911739232._1
1333- let wAmountB = $t03911739232._2
1331+ let $t03911539230 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1332+ let wAmountA = $t03911539230._1
1333+ let wAmountB = $t03911539230._2
13341334 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13351335 }
13361336 else throw("Strict value is not equal to itself.")
14231423
14241424 @Callable(i)
14251425 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1426- let $t04407144175 = parseRequest(requestId)
1427- let user = $t04407144175._1
1428- let pool = $t04407144175._2
1429- let pmtA = $t04407144175._3
1430- let AId = $t04407144175._4
1431- let pmtB = $t04407144175._5
1432- let BId = $t04407144175._6
1433- let balA = $t04407144175._7
1434- let balB = $t04407144175._8
1435- let shareId = $t04407144175._9
1436- let bwAsset = $t04407144175._10
1437- let bwAmount = $t04407144175._11
1426+ let $t04406944173 = parseRequest(requestId)
1427+ let user = $t04406944173._1
1428+ let pool = $t04406944173._2
1429+ let pmtA = $t04406944173._3
1430+ let AId = $t04406944173._4
1431+ let pmtB = $t04406944173._5
1432+ let BId = $t04406944173._6
1433+ let balA = $t04406944173._7
1434+ let balB = $t04406944173._8
1435+ let shareId = $t04406944173._9
1436+ let bwAsset = $t04406944173._10
1437+ let bwAmount = $t04406944173._11
14381438 if ((size(i.payments) != 1))
14391439 then throw("Wrong payment size")
14401440 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
14421442 else (i.payments[0].amount != bwAmount))
14431443 then throw("Wrong payment")
14441444 else {
1445- let $t04436544465 = if ((AId == bwAsset))
1445+ let $t04436344463 = if ((AId == bwAsset))
14461446 then $Tuple2((pmtA + bwAmount), pmtB)
14471447 else $Tuple2(pmtA, (pmtB + bwAmount))
1448- let pmtAllA = $t04436544465._1
1449- let pmtAllB = $t04436544465._2
1448+ let pmtAllA = $t04436344463._1
1449+ let pmtAllB = $t04436344463._2
14501450 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1451- let $t04454744662 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1452- let userStaked = $t04454744662._1
1453- let axlyFee = $t04454744662._2
1451+ let $t04454544660 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1452+ let userStaked = $t04454544660._1
1453+ let axlyFee = $t04454544660._2
14541454 let posNum = getNewUserPositionNumber(user)
14551455 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
14561456 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1457- let $t04502245137 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1458- let wAmountA = $t04502245137._1
1459- let wAmountB = $t04502245137._2
1457+ let $t04502045135 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1458+ let wAmountA = $t04502045135._1
1459+ let wAmountB = $t04502045135._2
14601460 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
14611461 }
14621462 }))
14671467 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
14681468 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
14691469 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1470- let $t04565845748 = getPoolData(Address(fromBase58String(pool)), pType)
1471- let AId = $t04565845748._1
1472- let BId = $t04565845748._2
1473- let balA = $t04565845748._3
1474- let balB = $t04565845748._4
1475- let shareId = $t04565845748._5
1470+ let $t04565645746 = getPoolData(Address(fromBase58String(pool)), pType)
1471+ let AId = $t04565645746._1
1472+ let BId = $t04565645746._2
1473+ let balA = $t04565645746._3
1474+ let balB = $t04565645746._4
1475+ let shareId = $t04565645746._5
14761476 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
14771477 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
14781478 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
15041504 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15051505 let pType = getStringValue(this, (kPool + pool))
15061506 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1507- let $t04771847820 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1508- if (($t04771847820 == $t04771847820))
1507+ let $t04771647818 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1508+ if (($t04771647818 == $t04771647818))
15091509 then {
1510- let claimedAsset = $t04771847820._2
1511- let claimedAmount = $t04771847820._1
1510+ let claimedAsset = $t04771647818._2
1511+ let claimedAmount = $t04771647818._1
15121512 let rArgs = split(route, "__")
15131513 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15141514 then directSwopfiCPMM(rArgs, tokenToId)
15331533 @Callable(i)
15341534 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15351535 let pType = getStringValue(this, (kPool + pool))
1536- let $t04850448602 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1537- if (($t04850448602 == $t04850448602))
1536+ let $t04850248600 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1537+ if (($t04850248600 == $t04850248600))
15381538 then {
1539- let claimedAsset = $t04850448602._2
1540- let claimedAmount = $t04850448602._1
1539+ let claimedAsset = $t04850248600._2
1540+ let claimedAmount = $t04850248600._1
15411541 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
15421542 }
15431543 else throw("Strict value is not equal to itself.")
15511551 else false)
15521552 then throw("Wrong type")
15531553 else {
1554- let $t04902849122 = getPoolData(Address(fromBase58String(poolAddr)), type)
1555- let aId = $t04902849122._1
1556- let bId = $t04902849122._2
1557- let aBal = $t04902849122._3
1558- let bBal = $t04902849122._4
1559- let shareId = $t04902849122._5
1554+ let $t04902649120 = getPoolData(Address(fromBase58String(poolAddr)), type)
1555+ let aId = $t04902649120._1
1556+ let bId = $t04902649120._2
1557+ let aBal = $t04902649120._3
1558+ let bBal = $t04902649120._4
1559+ let shareId = $t04902649120._5
15601560 if ((0 > inFeeNoLoan))
15611561 then throw("inFeeNoLoan must be greater than 0")
15621562 else if ((0 > inFeeLoan))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SF_POOL = "SF"
55
66 let WX_POOL = "WX"
77
88 let CAP_FEE_NO_LOAN = "capNoLoan"
99
1010 let CAP_FEE_LOAN = "capLoan"
1111
1212 let STOPLOSS_FEE_NO_LOAN = "stopLossNoLoan"
1313
1414 let STOPLOSS_LOAN = "stopLossLoan"
1515
1616 let LOAN_FEE = "loan"
1717
1818 let NO_LOAN_FEE = "noLoan"
1919
2020 let NO_FEE = "noFee"
2121
2222 let SCALE8 = 100000000
2323
2424 let SCALE10 = 10000000000
2525
2626 let SCALE16 = toBigInt(10000000000000000)
2727
2828 let FEE_SCALE6 = 1000000
2929
3030 let kSFPoolAAssetBalance = "A_asset_balance"
3131
3232 let kSFPoolBAssetBalance = "B_asset_balance"
3333
3434 let kSFPoolAAssetId = "A_asset_id"
3535
3636 let kSFPoolBAssetId = "B_asset_id"
3737
3838 let kSFPoolShareId = "share_asset_id"
3939
4040 let kSFPoolShareSupply = "share_asset_supply"
4141
4242 let kSFPoolFee = "commission"
4343
4444 let kUserPosition = "_userPosition"
4545
4646 let kUserPositionPool = "_userPositionPool"
4747
4848 let kUserBorrowAmount = "_userPositionBorrowAmount"
4949
5050 let kUserBorrowAssetId = "_userPositionBorrowAssetId"
5151
5252 let kUserPositionNum = "_userPositionNumber"
5353
5454 let kUserPositionInterest = "_userPositionInterest"
5555
5656 let kPoolTotal = "_poolTotal"
5757
5858 let kPoolTotalLoan = "_poolTotalLoan"
5959
6060 let kPoolInterestLoan = "_poolInterestLoan"
6161
6262 let kPoolInterestNoLoan = "_poolInterestNoLoan"
6363
6464 let kPoolCanBorrow = "_poolCanBorrow"
6565
6666 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
6767
6868 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
6969
7070 let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
7171
7272 let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
7373
7474 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
7575
7676 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
7777
7878 let kRequestId = "_request_id"
7979
8080 let kRequestIter = "requests_iter"
8181
8282 let kPool = "pool_"
8383
8484 let kSharePool = "_poolShareId"
8585
8686 let kPoolCapChange = "_poolCapChange"
8787
8888 let kTokenLastPrice = "last_price"
8989
9090 let kPriceInOracle = "_twap5B"
9191
9292 let kActive = "active"
9393
9494 let kActiveUsers = "activeUsers"
9595
9696 let kActiveSFWX = "_active"
9797
9898 let kPoolActive = "_activePool"
9999
100100 let kUserStopLoss = "_stopLoss"
101101
102102 let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
103103
104104 let kMoneyBox = "axly_money_box"
105105
106106 let kSFFarmingAddr = "swopfi_farming_addr"
107107
108108 let kLendService = "lend_service_addr"
109109
110110 let kOperatorCallPK = "admin_call_pub_key"
111111
112112 let kPriceOracle = "price_oracle"
113113
114114 let kExContract = "exchange_contract"
115115
116116 let kWxSwapContract = "wx_swap_contract"
117117
118118 let kSwopId = "swop_id"
119119
120120 let kWxId = "wx_id"
121121
122122 let kGroup1Admin1PK = "group1_admin1_pub_key"
123123
124124 let kGroup1Admin2PK = "group1_admin2_pub_key"
125125
126126 let kGroup2Admin1PK = "group2_admin1_pub_key"
127127
128128 let kGroup2Admin2PK = "group2_admin2_pub_key"
129129
130130 let moneyBox = Address(fromBase58String(valueOrErrorMessage(getString(this, kMoneyBox), "No axly moneyBox address")))
131131
132132 let exContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kExContract), "No exchange contract address")))
133133
134134 let priceOracleAddr = Address(fromBase58String(valueOrErrorMessage(getString(this, kPriceOracle), "No price oracle address")))
135135
136136 let wxSwapContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kWxSwapContract), "No wx swap address")))
137137
138138 let SWOPID = fromBase58String(valueOrErrorMessage(getString(this, kSwopId), "No swop id"))
139139
140140 let WXID = fromBase58String(valueOrErrorMessage(getString(this, kWxId), "No wx id"))
141141
142142 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
143143
144144 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
145145
146146 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
147147
148148 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
149149
150150 let operatorPK = fromBase58String(valueOrErrorMessage(getString(this, kOperatorCallPK), "Can't get operatorPK"))
151151
152152 func unknownPoolType () = throw("Wrong pool type")
153153
154154
155155 func getLendSrvAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kLendService), "Can't get lend service addr")))
156156
157157
158158 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
159159 then unit
160160 else throw("Only operator can call this function")
161161
162162
163163 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
164164 then true
165165 else (i.callerPublicKey == group1Admin2PK))
166166 then unit
167167 else throw("Only admin group1 can call this function")
168168
169169
170170 func isSelfCall (i) = if ((i.caller == this))
171171 then unit
172172 else throw("Only contract itself can call this function")
173173
174174
175175 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
176176 then unit
177177 else throw("Only land contract can call this function")
178178
179179
180180 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
181181 then unit
182182 else throw("DApp is inactive at this moment")
183183
184184
185185 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
186186 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
187187 else false)
188188 then unit
189189 else throw("DApp is inactive for users at this moment")
190190
191191
192192 func isPoolActive (pool,type) = {
193193 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
194194 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
195195 if (if (WXSFActive)
196196 then poolActive
197197 else false)
198198 then true
199199 else false
200200 }
201201
202202
203203 func accountBalance (assetId) = match assetId {
204204 case id: ByteVector =>
205205 assetBalance(this, id)
206206 case waves: Unit =>
207207 wavesBalance(this).available
208208 case _ =>
209209 throw("Match error")
210210 }
211211
212212
213213 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"))
214214
215215
216216 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
217217 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
218218 if ($isInstanceOf(@, "Int"))
219219 then @
220220 else throw(($getType(@) + " couldn't be cast to Int"))
221221 }, {
222222 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
223223 if ($isInstanceOf(@, "Int"))
224224 then @
225225 else throw(($getType(@) + " couldn't be cast to Int"))
226226 })
227227
228228
229229 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
230230 then getSFPoolBalances(poolAddr)
231231 else if ((type == WX_POOL))
232232 then getWXPoolBalances(poolAddr, aId, bId)
233233 else unknownPoolType()
234234
235235
236236 func getSFPoolData (poolAddr) = {
237237 let $t079878036 = getSFPoolBalances(poolAddr)
238238 if (($t079878036 == $t079878036))
239239 then {
240240 let balB = $t079878036._2
241241 let balA = $t079878036._1
242242 $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"))
243243 }
244244 else throw("Strict value is not equal to itself.")
245245 }
246246
247247
248248 func getWXPoolData (poolAddr) = {
249249 let cfg = {
250250 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
251251 if ($isInstanceOf(@, "List[Any]"))
252252 then @
253253 else throw(($getType(@) + " couldn't be cast to List[Any]"))
254254 }
255255 if ((cfg == cfg))
256256 then {
257257 let aId = valueOrErrorMessage({
258258 let @ = cfg[4]
259259 if ($isInstanceOf(@, "String"))
260260 then @
261261 else unit
262262 }, "Can't get pool A asset id")
263263 let bId = valueOrErrorMessage({
264264 let @ = cfg[5]
265265 if ($isInstanceOf(@, "String"))
266266 then @
267267 else unit
268268 }, "Can't get pool B asset id")
269269 let shareId = valueOrErrorMessage({
270270 let @ = cfg[3]
271271 if ($isInstanceOf(@, "String"))
272272 then @
273273 else unit
274274 }, "Can't get pool LP asset id")
275275 let $t087338792 = getWXPoolBalances(poolAddr, aId, bId)
276276 if (($t087338792 == $t087338792))
277277 then {
278278 let balB = $t087338792._2
279279 let balA = $t087338792._1
280280 $Tuple5(aId, bId, balA, balB, shareId)
281281 }
282282 else throw("Strict value is not equal to itself.")
283283 }
284284 else throw("Strict value is not equal to itself.")
285285 }
286286
287287
288288 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
289289 then getSFPoolData(poolAddr)
290290 else if ((type == WX_POOL))
291291 then getWXPoolData(poolAddr)
292292 else unknownPoolType()
293293
294294
295295 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
296296 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
297297 else if ((type == WX_POOL))
298298 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
299299 else unknownPoolType()
300300
301301
302302 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
303303
304304
305305 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
306306
307307
308308 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
309309
310310
311311 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
312312 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
313313 else if ((feeType == CAP_FEE_NO_LOAN))
314314 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
315315 else if ((feeType == LOAN_FEE))
316316 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
317317 else if ((feeType == NO_LOAN_FEE))
318318 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
319319 else if ((feeType == NO_FEE))
320320 then 0
321321 else throw("Wrong fee type")
322322
323323
324324 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kSFFarmingAddr), "Can't get swopfi farming addr")))
325325
326326
327327 func getWXFarmingAddr (poolAddr) = {
328328 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
329329 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
330330 Address(fromBase58String(factroyCfg[1]))
331331 }
332332
333333
334334 func assetIdToStr (assetId) = match assetId {
335335 case id: ByteVector =>
336336 toBase58String(id)
337337 case waves: Unit =>
338338 "WAVES"
339339 case _ =>
340340 throw("Not Asset id")
341341 }
342342
343343
344344 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
345345 then unit
346346 else fromBase58String(assetId)
347347
348348
349349 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
350350 then 8
351351 else match assetInfo(fromBase58String(assetId)) {
352352 case asset: Asset =>
353353 asset.decimals
354354 case _ =>
355355 throw("Can't find asset")
356356 }
357357
358358
359359 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
360360
361361
362362 func getAssetsPrice (assetIds) = {
363363 func getPrices (a,assetId) = {
364364 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
365365 (a :+ assetPrice)
366366 }
367367
368368 let $l = assetIds
369369 let $s = size($l)
370370 let $acc0 = nil
371371 func $f0_1 ($a,$i) = if (($i >= $s))
372372 then $a
373373 else getPrices($a, $l[$i])
374374
375375 func $f0_2 ($a,$i) = if (($i >= $s))
376376 then $a
377377 else throw("List size exceeds 50")
378378
379379 $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)
380380 }
381381
382382
383383 func getSharePrice (shareId) = {
384384 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
385385 let poolAddr = Address(fromBase58String(pool))
386386 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
387387 let $t01178111846 = getPoolData(poolAddr, pType)
388388 let aId = $t01178111846._1
389389 let bId = $t01178111846._2
390390 let aBalance = $t01178111846._3
391391 let bBalance = $t01178111846._4
392392 let prices = getAssetsPrice([aId, bId])
393393 let dPriceA = prices[0]
394394 let dPriceB = prices[1]
395395 if (if ((0 > dPriceA))
396396 then true
397397 else (0 > dPriceB))
398398 then -1
399399 else {
400400 let shareSupply = getShareSupply(poolAddr, pType, shareId)
401401 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
402402 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
403403 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
404404 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
405405 fraction(sum, sharePrecision, shareSupply)
406406 }
407407 }
408408
409409
410410 func getSharePrices (shareIds) = {
411411 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
412412
413413 let $l = shareIds
414414 let $s = size($l)
415415 let $acc0 = nil
416416 func $f0_1 ($a,$i) = if (($i >= $s))
417417 then $a
418418 else getPrices($a, $l[$i])
419419
420420 func $f0_2 ($a,$i) = if (($i >= $s))
421421 then $a
422422 else throw("List size exceeds 20")
423423
424424 $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)
425425 }
426426
427427
428428 func getCursEntries (aId,bId,shareId,wAmounts) = {
429429 let assetsPrices = getAssetsPrice([aId, bId])
430430 let sharePrice = getSharePrice(shareId)
431431 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
432432 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
433433 }
434434
435435
436436 func calcReplenishByTwoTokens (pType,poolAddr,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
437437 then {
438438 let repl = {
439439 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
440440 if ($isInstanceOf(@, "List[Any]"))
441441 then @
442442 else throw(($getType(@) + " couldn't be cast to List[Any]"))
443443 }
444444 if ((repl == repl))
445445 then $Tuple5({
446446 let @ = repl[3]
447447 if ($isInstanceOf(@, "Int"))
448448 then @
449449 else throw(($getType(@) + " couldn't be cast to Int"))
450450 }, {
451451 let @ = repl[4]
452452 if ($isInstanceOf(@, "Int"))
453453 then @
454454 else throw(($getType(@) + " couldn't be cast to Int"))
455455 }, {
456456 let @ = repl[1]
457457 if ($isInstanceOf(@, "Int"))
458458 then @
459459 else throw(($getType(@) + " couldn't be cast to Int"))
460460 }, assetIdToStr(repl[2]), {
461461 let @ = repl[0]
462462 if ($isInstanceOf(@, "Int"))
463463 then @
464464 else throw(($getType(@) + " couldn't be cast to Int"))
465465 })
466466 else throw("Strict value is not equal to itself.")
467467 }
468468 else if ((pType == WX_POOL))
469469 then {
470470 let $t01339013640 = $Tuple2(split({
471471 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
472472 if ($isInstanceOf(@, "String"))
473473 then @
474474 else throw(($getType(@) + " couldn't be cast to String"))
475475 }, "__"), split({
476476 let @ = invoke(poolAddr, "evaluatePutByPriceAssetREADONLY", [pmtB], nil)
477477 if ($isInstanceOf(@, "String"))
478478 then @
479479 else throw(($getType(@) + " couldn't be cast to String"))
480480 }, "__"))
481481 if (($t01339013640 == $t01339013640))
482482 then {
483483 let evalPutInB = $t01339013640._2
484484 let evalPutInA = $t01339013640._1
485485 let lpInA = parseIntValue(evalPutInA[1])
486486 let lpInB = parseIntValue(evalPutInB[1])
487487 if ((lpInB > lpInA))
488488 then {
489489 let pmt = parseIntValue(evalPutInA[8])
490490 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
491491 }
492492 else {
493493 let pmt = parseIntValue(evalPutInB[7])
494494 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
495495 }
496496 }
497497 else throw("Strict value is not equal to itself.")
498498 }
499499 else unknownPoolType()
500500
501501
502502 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId) = {
503503 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
504504 if ((pType == SF_POOL))
505505 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
506506 else if ((pType == WX_POOL))
507507 then invoke(poolAddr, "put", [1000000, false], payments)
508508 else unknownPoolType()
509509 }
510510
511511
512512 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId) = {
513513 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
514514 if ((pType == SF_POOL))
515515 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
516516 else if ((pType == WX_POOL))
517517 then invoke(poolAddr, "putOneTkn", [0, false], payments)
518518 else unknownPoolType()
519519 }
520520
521521
522522 func stakeLP (pool,pType,shareId,amount) = {
523523 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
524524 if ((pType == SF_POOL))
525525 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
526526 else if ((pType == WX_POOL))
527527 then invoke(getWXFarmingAddr(addressFromStringValue(pool)), "stake", nil, payments)
528528 else unknownPoolType()
529529 }
530530
531531
532532 func unstakeLP (pool,pType,shareId,amount) = {
533533 let $t01529915649 = if ((pType == SF_POOL))
534534 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
535535 else if ((pType == WX_POOL))
536536 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
537537 else unknownPoolType()
538538 let farmAddr = $t01529915649._1
539539 let fName = $t01529915649._2
540540 let params = $t01529915649._3
541541 let inv = invoke(farmAddr, fName, params, nil)
542542 if ((inv == inv))
543543 then amount
544544 else throw("Strict value is not equal to itself.")
545545 }
546546
547547
548548 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
549549 let poolAddr = Address(fromBase58String(pool))
550550 let feeScale6 = 1000000
551551 let fee = getIntegerValue(poolAddr, kSFPoolFee)
552552 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
553553 let $t01607116377 = if ((assetTokenToGet == assetIdA))
554554 then {
555555 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
556556 $Tuple2(amountToPay, assetIdB)
557557 }
558558 else {
559559 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
560560 $Tuple2(amountToPay, assetIdA)
561561 }
562562 let amountToPay = $t01607116377._1
563563 let assetToPay = $t01607116377._2
564564 $Tuple2(assetToPay, amountToPay)
565565 }
566566
567567
568568 func getWXSwapFees (pool) = {
569569 let poolAddr = addressFromStringValue(pool)
570570 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
571571 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
572572 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
573573 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
574574 case fees: (Int, Int) =>
575575 $Tuple2(fees._1, fees._2)
576576 case _ =>
577577 $Tuple2(poolFeeDefault, protocolFeeDefault)
578578 }
579579 }
580580
581581
582582 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
583583 let $t01711717156 = getWXSwapFees(pool)
584584 let pFee = $t01711717156._1
585585 let prFee = $t01711717156._2
586586 let feeScale = toBigInt(100000000)
587587 let $t01719617504 = if ((assetTokenToGet == assetIdA))
588588 then {
589589 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
590590 $Tuple2(amountToPay, assetIdB)
591591 }
592592 else {
593593 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
594594 $Tuple2(amountToPay, assetIdA)
595595 }
596596 let amountToPay = $t01719617504._1
597597 let assetToPay = $t01719617504._2
598598 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
599599 $Tuple2(assetToPay, amountToPayWithFee)
600600 }
601601
602602
603603 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
604604 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
605605 if (if ((pType == SF_POOL))
606606 then true
607607 else (poolFB != ""))
608608 then {
609609 let $t01794518157 = if ((poolFB == ""))
610610 then $Tuple3(balA, balB, pool)
611611 else {
612612 let $t01805118124 = getSFPoolBalances(addressFromStringValue(poolFB))
613613 let sfBalA = $t01805118124._1
614614 let sfBalB = $t01805118124._2
615615 $Tuple3(sfBalA, sfBalB, poolFB)
616616 }
617617 let pBalA = $t01794518157._1
618618 let pBalB = $t01794518157._2
619619 let exPool = $t01794518157._3
620620 let $t01816218288 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
621621 let assetToPay = $t01816218288._1
622622 let amountToPay = $t01816218288._2
623623 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
624624 }
625625 else if ((pType == WX_POOL))
626626 then {
627627 let $t01849018612 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
628628 let assetToPay = $t01849018612._1
629629 let amountToPay = $t01849018612._2
630630 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
631631 }
632632 else unknownPoolType()
633633 }
634634
635635
636636 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
637637 let $t01889919363 = if ((pType == SF_POOL))
638638 then {
639639 let inv = {
640640 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
641641 if ($isInstanceOf(@, "List[Any]"))
642642 then @
643643 else throw(($getType(@) + " couldn't be cast to List[Any]"))
644644 }
645645 if ((inv == inv))
646646 then $Tuple2({
647647 let @ = inv[0]
648648 if ($isInstanceOf(@, "Int"))
649649 then @
650650 else throw(($getType(@) + " couldn't be cast to Int"))
651651 }, {
652652 let @ = inv[1]
653653 if ($isInstanceOf(@, "Int"))
654654 then @
655655 else throw(($getType(@) + " couldn't be cast to Int"))
656656 })
657657 else throw("Strict value is not equal to itself.")
658658 }
659659 else if ((pType == WX_POOL))
660660 then {
661661 let inv = split({
662662 let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
663663 if ($isInstanceOf(@, "String"))
664664 then @
665665 else throw(($getType(@) + " couldn't be cast to String"))
666666 }, "__")
667667 if ((inv == inv))
668668 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
669669 else throw("Strict value is not equal to itself.")
670670 }
671671 else unknownPoolType()
672672 let amountA = $t01889919363._1
673673 let amountB = $t01889919363._2
674674 $Tuple2(amountA, amountB)
675675 }
676676
677677
678678 func claimFarmed (pType,pool) = if ((pType == SF_POOL))
679679 then {
680680 let balBefore = accountBalance(SWOPID)
681681 if ((balBefore == balBefore))
682682 then {
683683 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
684684 if ((inv == inv))
685685 then {
686686 let balAfter = accountBalance(SWOPID)
687687 $Tuple2((balAfter - balBefore), SWOPID)
688688 }
689689 else throw("Strict value is not equal to itself.")
690690 }
691691 else throw("Strict value is not equal to itself.")
692692 }
693693 else if ((pType == WX_POOL))
694694 then {
695695 let $t01973119810 = getWXPoolData(addressFromStringValue(pool))
696696 let aId = $t01973119810._1
697697 let bId = $t01973119810._2
698698 let aBal = $t01973119810._3
699699 let bBal = $t01973119810._4
700700 let lpId = $t01973119810._5
701701 let balBefore = accountBalance(WXID)
702702 if ((balBefore == balBefore))
703703 then {
704704 let inv = invoke(getWXFarmingAddr(addressFromStringValue(pool)), "claimWx", [lpId], nil)
705705 if ((inv == inv))
706706 then {
707707 let balAfter = accountBalance(WXID)
708708 $Tuple2((balAfter - balBefore), WXID)
709709 }
710710 else throw("Strict value is not equal to itself.")
711711 }
712712 else throw("Strict value is not equal to itself.")
713713 }
714714 else unknownPoolType()
715715
716716
717717 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId) = {
718718 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
719719 if ((lpBalanceBefore == lpBalanceBefore))
720720 then {
721721 let poolAddr = addressFromStringValue(pool)
722722 let $t02040820824 = if (if ((pmtA > 0))
723723 then (pmtB > 0)
724724 else false)
725725 then {
726726 let $t02047420590 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
727727 let pmtInA = $t02047420590._1
728728 let pmtInB = $t02047420590._2
729729 let change = $t02047420590._3
730730 let changeId = $t02047420590._4
731731 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
732732 if ((inv == inv))
733733 then $Tuple2(change, changeId)
734734 else throw("Strict value is not equal to itself.")
735735 }
736736 else if ((pmtA > 0))
737737 then $Tuple2(pmtA, aId)
738738 else if ((pmtB > 0))
739739 then $Tuple2(pmtB, bId)
740740 else throw("pmts must be > 0")
741741 let change = $t02040820824._1
742742 let changeId = $t02040820824._2
743743 let inv = if ((change > 0))
744744 then replenishOneTokenByType(poolAddr, pType, change, changeId)
745745 else nil
746746 if ((inv == inv))
747747 then {
748748 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
749749 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
750750 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
751751 let userShareForStake = (totalStaked - axlyFeeAmount)
752752 if ((0 >= userShareForStake))
753753 then throw("amount of staked sharetokens must be > 0")
754754 else {
755755 let invLP = stakeLP(pool, pType, LPId, userShareForStake)
756756 if ((invLP == invLP))
757757 then $Tuple2(userShareForStake, axlyFeeAmount)
758758 else throw("Strict value is not equal to itself.")
759759 }
760760 }
761761 else throw("Strict value is not equal to itself.")
762762 }
763763 else throw("Strict value is not equal to itself.")
764764 }
765765
766766
767767 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
768768 let totalAmount = getPoolTotalShare(pool)
769769 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
770770 let $t02168121919 = if (withLoan)
771771 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
772772 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
773773 let curPoolInterest = $t02168121919._1
774774 let totalStakedWithLoan = $t02168121919._2
775775 [IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), totalStakedWithLoan), 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))]
776776 }
777777
778778
779779 func listToInt (a,item) = (a :+ parseIntValue(item))
780780
781781
782782 func directSwopfiCPMM (rArgs,tokenTo) = {
783783 let dApp = addressFromStringValue(rArgs[1])
784784 let pmtP = split(rArgs[2], "|")
785785 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
786786 if ((tokenBalanceBefore == tokenBalanceBefore))
787787 then {
788788 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
789789 let minToRecive = rArgs[3]
790790 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
791791 if ((inv == inv))
792792 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
793793 else throw("Strict value is not equal to itself.")
794794 }
795795 else throw("Strict value is not equal to itself.")
796796 }
797797
798798
799799 func directRoutingSwopfi (rArgs,tokenTo) = {
800800 let dApp = addressFromStringValue(rArgs[1])
801801 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
802802 if ((tokenBalanceBefore == tokenBalanceBefore))
803803 then {
804804 let pmt = {
805805 let pmtP = split(rArgs[2], "|")
806806 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
807807 }
808808 let args = {
809809 let eArgs = split(rArgs[3], "|")
810810 let exchangers = split(eArgs[0], ",")
811811 let exchangersType = split(eArgs[1], ",")
812812 let args1 = {
813813 let $l = split(eArgs[2], ",")
814814 let $s = size($l)
815815 let $acc0 = nil
816816 func $f0_1 ($a,$i) = if (($i >= $s))
817817 then $a
818818 else listToInt($a, $l[$i])
819819
820820 func $f0_2 ($a,$i) = if (($i >= $s))
821821 then $a
822822 else throw("List size exceeds 3")
823823
824824 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
825825 }
826826 let args2 = {
827827 let $l = split(eArgs[3], ",")
828828 let $s = size($l)
829829 let $acc0 = nil
830830 func $f1_1 ($a,$i) = if (($i >= $s))
831831 then $a
832832 else listToInt($a, $l[$i])
833833
834834 func $f1_2 ($a,$i) = if (($i >= $s))
835835 then $a
836836 else throw("List size exceeds 3")
837837
838838 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
839839 }
840840 let routingAssetsKeys = split(eArgs[4], ",")
841841 let minToRecive = parseIntValue(eArgs[5])
842842 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
843843 }
844844 let inv = invoke(dApp, "routingTrade", args, pmt)
845845 if ((inv == inv))
846846 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
847847 else throw("Strict value is not equal to itself.")
848848 }
849849 else throw("Strict value is not equal to itself.")
850850 }
851851
852852
853853 func capitalize (pool,pType,tokenId,tokenAmount) = {
854854 let poolAddr = Address(fromBase58String(pool))
855855 let $t02402624092 = getPoolData(poolAddr, pType)
856856 let AId = $t02402624092._1
857857 let BId = $t02402624092._2
858858 let balA = $t02402624092._3
859859 let balB = $t02402624092._4
860860 let shareId = $t02402624092._5
861861 if (if ((tokenId != AId))
862862 then (tokenId != BId)
863863 else false)
864864 then throw("Wrong asset")
865865 else {
866866 let totalShareAmount = getPoolTotalShare(pool)
867867 if ((totalShareAmount == 0))
868868 then [ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))]
869869 else {
870870 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
871871 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
872872 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
873873 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
874874 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
875875 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
876876 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
877877 let $t02483724937 = if ((tokenId == AId))
878878 then $Tuple2((tokenAmount - axlyFee), 0)
879879 else $Tuple2(0, (tokenAmount - axlyFee))
880880 let pmtA = $t02483724937._1
881881 let pmtB = $t02483724937._2
882882 let $t02494025044 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
883883 let stakedAmount = $t02494025044._1
884884 let nf = $t02494025044._2
885885 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
886886 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
887887 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
888888 let stakedNoLoan = (stakedAmount - stakedLoan)
889889 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
890890 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
891891 else 0
892892 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
893893 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
894894 else 0
895- ([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotal), (totalShareAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, fromBase58String(tokenId))] ++ getCursEntries(AId, BId, shareId, nil))
895+ ([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotal), (totalShareAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))] ++ getCursEntries(AId, BId, shareId, nil))
896896 }
897897 }
898898 }
899899
900900
901901 func userCanWithdrawShareCalc (user,pool,posId,borrowed) = {
902902 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
903903 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
904904 let poolInterest = if (borrowed)
905905 then getIntegerValue(this, (pool + kPoolInterestLoan))
906906 else getIntegerValue(this, (pool + kPoolInterestNoLoan))
907907 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
908908 }
909909
910910
911911 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
912912 let feeType = if (isBorrowed)
913913 then STOPLOSS_LOAN
914914 else STOPLOSS_FEE_NO_LOAN
915915 if (stopLoss)
916916 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
917917 else 0
918918 }
919919
920920
921921 func withdrawToUser (user,pool,posId,stopLoss) = {
922922 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
923923 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
924924 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed)
925925 let poolTotalShare = getPoolTotalShare(pool)
926926 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
927927 let userAddr = Address(fromBase58String(user))
928928 let poolAddr = Address(fromBase58String(pool))
929929 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
930- let $t02757527647 = getPoolData(poolAddr, pType)
931- let idAStr = $t02757527647._1
932- let idBStr = $t02757527647._2
933- let balA = $t02757527647._3
934- let balB = $t02757527647._4
935- let shareId = $t02757527647._5
936- let $t02765027717 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
937- let idA = $t02765027717._1
938- let idB = $t02765027717._2
930+ let $t02757327645 = getPoolData(poolAddr, pType)
931+ let idAStr = $t02757327645._1
932+ let idBStr = $t02757327645._2
933+ let balA = $t02757327645._3
934+ let balB = $t02757327645._4
935+ let shareId = $t02757327645._5
936+ let $t02764827715 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
937+ let idA = $t02764827715._1
938+ let idB = $t02764827715._2
939939 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
940940 let cBalABefore = accountBalance(idA)
941941 if ((cBalABefore == cBalABefore))
942942 then {
943943 let cBalBBefore = accountBalance(idB)
944944 if ((cBalBBefore == cBalBBefore))
945945 then {
946946 let inv = if ((pType == SF_POOL))
947947 then {
948948 let inv = unstakeLP(pool, pType, shareId, stopLossFee)
949949 if ((inv == inv))
950950 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
951951 else throw("Strict value is not equal to itself.")
952952 }
953953 else if ((pType == WX_POOL))
954954 then {
955955 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee))
956956 if ((inv == inv))
957957 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
958958 else throw("Strict value is not equal to itself.")
959959 }
960960 else unknownPoolType()
961961 if ((inv == inv))
962962 then {
963963 let cBalAAfter = accountBalance(idA)
964964 if ((cBalAAfter == cBalAAfter))
965965 then {
966966 let cBalBAfter = accountBalance(idB)
967967 if ((cBalBAfter == cBalBAfter))
968968 then {
969- let $t02841228501 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
970- let tokensAmountA = $t02841228501._1
971- let tokensAmountB = $t02841228501._2
972- let $t02850429740 = if (isBorrowed)
969+ let $t02841028499 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
970+ let tokensAmountA = $t02841028499._1
971+ let tokensAmountB = $t02841028499._2
972+ let $t02850229738 = if (isBorrowed)
973973 then {
974974 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
975975 let debt = {
976976 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
977977 if ($isInstanceOf(@, "Int"))
978978 then @
979979 else throw(($getType(@) + " couldn't be cast to Int"))
980980 }
981981 if ((debt == debt))
982982 then {
983983 let amountToGetEx = if (if ((borrowAsset == idAStr))
984984 then (debt > tokensAmountA)
985985 else false)
986986 then (debt - tokensAmountA)
987987 else if (if ((borrowAsset == idBStr))
988988 then (debt > tokensAmountB)
989989 else false)
990990 then (debt - tokensAmountB)
991991 else 0
992992 let exInv = if ((amountToGetEx > 0))
993993 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
994994 else nil
995995 if ((exInv == exInv))
996996 then {
997997 let cBalAAfterRepay = accountBalance(idA)
998998 if ((cBalAAfterRepay == cBalAAfterRepay))
999999 then {
10001000 let cBalBAfterRepay = accountBalance(idB)
10011001 if ((cBalBAfterRepay == cBalBAfterRepay))
10021002 then {
10031003 let closeDbtInv = if ((debt > 0))
10041004 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
10051005 else 0
10061006 if ((closeDbtInv == closeDbtInv))
10071007 then if ((borrowAsset == idAStr))
10081008 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
10091009 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
10101010 else throw("Strict value is not equal to itself.")
10111011 }
10121012 else throw("Strict value is not equal to itself.")
10131013 }
10141014 else throw("Strict value is not equal to itself.")
10151015 }
10161016 else throw("Strict value is not equal to itself.")
10171017 }
10181018 else throw("Strict value is not equal to itself.")
10191019 }
10201020 else $Tuple2(tokensAmountA, tokensAmountB)
1021- let toUserA = $t02850429740._1
1022- let toUserB = $t02850429740._2
1021+ let toUserA = $t02850229738._1
1022+ let toUserB = $t02850229738._2
10231023 let poolTotalLoanEntries = if (isBorrowed)
10241024 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
10251025 else nil
10261026 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)), IntegerEntry((pool + kPoolTotal), ((poolTotalShare - userCanWithdraw) - stopLossFee)), ScriptTransfer(userAddr, toUserA, idA), ScriptTransfer(userAddr, toUserB, idB), ScriptTransfer(moneyBox, stopLossFee, fromBase58String(shareId))] ++ poolTotalLoanEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil))
10271027 $Tuple2(entries, [toUserA, toUserB])
10281028 }
10291029 else throw("Strict value is not equal to itself.")
10301030 }
10311031 else throw("Strict value is not equal to itself.")
10321032 }
10331033 else throw("Strict value is not equal to itself.")
10341034 }
10351035 else throw("Strict value is not equal to itself.")
10361036 }
10371037 else throw("Strict value is not equal to itself.")
10381038 }
10391039
10401040
10411041 func parseRequest (requestId) = {
10421042 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
10431043 let user = request[0]
10441044 let pool = request[1]
10451045 let pmtA = parseIntValue(request[2])
10461046 let AId = request[3]
10471047 let pmtB = parseIntValue(request[4])
10481048 let BId = request[5]
10491049 let balA = parseIntValue(request[6])
10501050 let balB = parseIntValue(request[7])
10511051 let shareId = request[8]
10521052 let bwAsset = request[9]
10531053 let bwAmount = parseIntValue(request[10])
10541054 $Tuple11(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount)
10551055 }
10561056
10571057
10581058 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
10591059 then (borrowId != bId)
10601060 else false)
10611061 then throw("Wrong borrow asset")
10621062 else {
10631063 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
10641064 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
10651065 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10661066 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10671067 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1068- let $t03172231819 = if ((borrowId == aId))
1068+ let $t03172031817 = if ((borrowId == aId))
10691069 then $Tuple2(dPriceA, decPrA)
10701070 else $Tuple2(dPriceB, decPrB)
1071- let borrowPrice = $t03172231819._1
1072- let borrowDecPr = $t03172231819._2
1071+ let borrowPrice = $t03172031817._1
1072+ let borrowDecPr = $t03172031817._2
10731073 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10741074 }
10751075
10761076
10771077 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
10781078 then if ((assetIdToStr(pmts[0].assetId) != AId))
10791079 then throw("Wrong payment asset A")
10801080 else if ((assetIdToStr(pmts[1].assetId) != BId))
10811081 then throw("Wrong payment asset B")
10821082 else $Tuple2(pmts[0].amount, pmts[1].amount)
10831083 else if ((size(pmts) == 1))
10841084 then if ((assetIdToStr(pmts[0].assetId) == AId))
10851085 then $Tuple2(pmts[0].amount, 0)
10861086 else if ((assetIdToStr(pmts[0].assetId) == BId))
10871087 then $Tuple2(0, pmts[0].amount)
10881088 else throw("Wrong payment")
10891089 else throw("One or two payments expected")
10901090
10911091
10921092 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
10931093 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
10941094 if ((0 > pri))
10951095 then (pri * -1)
10961096 else pri
10971097 }
10981098
10991099
11001100 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1101- let $t03281933081 = if (claim)
1101+ let $t03281733079 = if (claim)
11021102 then claimFarmed(pType, pool)
11031103 else {
11041104 let claimedAsset = if ((pType == SF_POOL))
11051105 then SWOPID
11061106 else if ((pType == WX_POOL))
11071107 then WXID
11081108 else unknownPoolType()
11091109 $Tuple2(amount, claimedAsset)
11101110 }
1111- if (($t03281933081 == $t03281933081))
1111+ if (($t03281733079 == $t03281733079))
11121112 then {
1113- let claimAsset = $t03281933081._2
1114- let claimAmount = $t03281933081._1
1113+ let claimAsset = $t03281733079._2
1114+ let claimAmount = $t03281733079._1
11151115 let bal = accountBalance(claimAsset)
11161116 if ((bal == bal))
11171117 then if ((amount > bal))
11181118 then throw("To big amount to exchange")
11191119 else $Tuple2(claimAmount, claimAsset)
11201120 else throw("Strict value is not equal to itself.")
11211121 }
11221122 else throw("Strict value is not equal to itself.")
11231123 }
11241124
11251125
11261126 @Callable(i)
11271127 func getPoolInfoREADONLY (pool) = {
11281128 let poolAddr = addressFromStringValue(pool)
11291129 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1130- let $t03344833538 = getPoolData(Address(fromBase58String(pool)), pType)
1131- let AId = $t03344833538._1
1132- let BId = $t03344833538._2
1133- let balA = $t03344833538._3
1134- let balB = $t03344833538._4
1135- let shareId = $t03344833538._5
1130+ let $t03344633536 = getPoolData(Address(fromBase58String(pool)), pType)
1131+ let AId = $t03344633536._1
1132+ let BId = $t03344633536._2
1133+ let balA = $t03344633536._3
1134+ let balB = $t03344633536._4
1135+ let shareId = $t03344633536._5
11361136 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11371137 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
11381138 }
11391139
11401140
11411141
11421142 @Callable(i)
11431143 func getShareAssetPriceREADONLY (shareId) = {
11441144 let sharePrices = getSharePrice(shareId)
11451145 $Tuple2(nil, sharePrices)
11461146 }
11471147
11481148
11491149
11501150 @Callable(i)
11511151 func getUserPositionShareAmountREADONLY (user,posNum) = {
11521152 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
11531153 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
11541154 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0))
11551155 $Tuple2(nil, userCanWithdraw)
11561156 }
11571157
11581158
11591159
11601160 @Callable(i)
11611161 func getUserPositionREADONLY (user,pools,posNum) = {
11621162 func userPos (a,pool) = {
1163- let $t03441134481 = a
1164- let wAmountsA = $t03441134481._1
1165- let wAmountsB = $t03441134481._2
1166- let debts = $t03441134481._3
1167- let eqWAmountsA = $t03441134481._4
1168- let eqWAmountsB = $t03441134481._5
1169- let index = $t03441134481._6
1163+ let $t03440934479 = a
1164+ let wAmountsA = $t03440934479._1
1165+ let wAmountsB = $t03440934479._2
1166+ let debts = $t03440934479._3
1167+ let eqWAmountsA = $t03440934479._4
1168+ let eqWAmountsB = $t03440934479._5
1169+ let index = $t03440934479._6
11701170 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
11711171 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
11721172 else {
11731173 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1174- let $t03476034850 = getPoolData(Address(fromBase58String(pool)), pType)
1175- let AId = $t03476034850._1
1176- let BId = $t03476034850._2
1177- let balA = $t03476034850._3
1178- let balB = $t03476034850._4
1179- let shareId = $t03476034850._5
1174+ let $t03475834848 = getPoolData(Address(fromBase58String(pool)), pType)
1175+ let AId = $t03475834848._1
1176+ let BId = $t03475834848._2
1177+ let balA = $t03475834848._3
1178+ let balB = $t03475834848._4
1179+ let shareId = $t03475834848._5
11801180 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
11811181 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1182- let $t03506635186 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1183- let wAmountA = $t03506635186._1
1184- let wAmountB = $t03506635186._2
1182+ let $t03506435184 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1183+ let wAmountA = $t03506435184._1
1184+ let wAmountB = $t03506435184._2
11851185 if ((borrowAmount > 0))
11861186 then {
11871187 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
11881188 let debt = {
11891189 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
11901190 if ($isInstanceOf(@, "Int"))
11911191 then @
11921192 else throw(($getType(@) + " couldn't be cast to Int"))
11931193 }
11941194 if ((debt == debt))
11951195 then {
11961196 let amountToGetEx = if (if ((borrowAsset == AId))
11971197 then (debt > wAmountA)
11981198 else false)
11991199 then (debt - wAmountA)
12001200 else if (if ((borrowAsset == BId))
12011201 then (debt > wAmountB)
12021202 else false)
12031203 then (debt - wAmountB)
12041204 else 0
12051205 let amountToPay = if ((amountToGetEx > 0))
12061206 then if ((pType == SF_POOL))
12071207 then {
12081208 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12091209 ex._2
12101210 }
12111211 else if ((pType == WX_POOL))
12121212 then {
12131213 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12141214 ex._2
12151215 }
12161216 else unknownPoolType()
12171217 else 0
1218- let $t03609836317 = if ((borrowAsset == AId))
1218+ let $t03609636315 = if ((borrowAsset == AId))
12191219 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12201220 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1221- let eqWAmountA = $t03609836317._1
1222- let eqWAmountB = $t03609836317._2
1221+ let eqWAmountA = $t03609636315._1
1222+ let eqWAmountB = $t03609636315._2
12231223 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12241224 }
12251225 else throw("Strict value is not equal to itself.")
12261226 }
12271227 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
12281228 }
12291229 }
12301230
1231- let $t03657236683 = {
1231+ let $t03657036681 = {
12321232 let $l = pools
12331233 let $s = size($l)
12341234 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12351235 func $f0_1 ($a,$i) = if (($i >= $s))
12361236 then $a
12371237 else userPos($a, $l[$i])
12381238
12391239 func $f0_2 ($a,$i) = if (($i >= $s))
12401240 then $a
12411241 else throw("List size exceeds 20")
12421242
12431243 $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)
12441244 }
1245- let wAmountsA = $t03657236683._1
1246- let wAmountsB = $t03657236683._2
1247- let debts = $t03657236683._3
1248- let eqWAmountsA = $t03657236683._4
1249- let eqWAmountsB = $t03657236683._5
1245+ let wAmountsA = $t03657036681._1
1246+ let wAmountsB = $t03657036681._2
1247+ let debts = $t03657036681._3
1248+ let eqWAmountsA = $t03657036681._4
1249+ let eqWAmountsB = $t03657036681._5
12501250 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
12511251 }
12521252
12531253
12541254
12551255 @Callable(i)
12561256 func replenish (pool,leverage,borrowId) = valueOrElse(isActiveForUsers(), {
12571257 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
12581258 if (!(isPoolActive(pool, pType)))
12591259 then throw("Pool not active at this moment")
12601260 else if (if ((100 > leverage))
12611261 then true
12621262 else (leverage > 300))
12631263 then throw("Leverage can't be <100 and >300")
12641264 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
12651265 then (leverage > 100)
12661266 else false)
12671267 then throw("You can't borrow in this pool")
12681268 else {
1269- let $t03728137371 = getPoolData(Address(fromBase58String(pool)), pType)
1270- let AId = $t03728137371._1
1271- let BId = $t03728137371._2
1272- let balA = $t03728137371._3
1273- let balB = $t03728137371._4
1274- let shareId = $t03728137371._5
1269+ let $t03727937369 = getPoolData(Address(fromBase58String(pool)), pType)
1270+ let AId = $t03727937369._1
1271+ let BId = $t03727937369._2
1272+ let balA = $t03727937369._3
1273+ let balB = $t03727937369._4
1274+ let shareId = $t03727937369._5
12751275 if (if ((borrowId != AId))
12761276 then (borrowId != BId)
12771277 else false)
12781278 then throw("Wrong borrow asset")
12791279 else {
1280- let $t03745237511 = parseReplenishPmts(i.payments, AId, BId)
1281- let pmtA = $t03745237511._1
1282- let pmtB = $t03745237511._2
1280+ let $t03745037509 = parseReplenishPmts(i.payments, AId, BId)
1281+ let pmtA = $t03745037509._1
1282+ let pmtB = $t03745037509._2
12831283 let user = toString(i.caller)
12841284 let newPosNum = getNewUserPositionNumber(user)
12851285 if ((leverage > 100))
12861286 then {
12871287 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
12881288 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount)], ",")
12891289 let newRequestId = {
12901290 let @ = invoke(this, "createNewRequest", [request], nil)
12911291 if ($isInstanceOf(@, "Int"))
12921292 then @
12931293 else throw(($getType(@) + " couldn't be cast to Int"))
12941294 }
12951295 if ((newRequestId == newRequestId))
12961296 then {
12971297 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
12981298 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
12991299 if ((inv == inv))
13001300 then {
13011301 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1302- let $t03850038594 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1303- if (($t03850038594 == $t03850038594))
1302+ let $t03849838592 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1303+ if (($t03849838592 == $t03849838592))
13041304 then {
1305- let newBalB = $t03850038594._2
1306- let newBalA = $t03850038594._1
1305+ let newBalB = $t03849838592._2
1306+ let newBalA = $t03849838592._1
13071307 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1308- let $t03866438779 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1309- let wAmountA = $t03866438779._1
1310- let wAmountB = $t03866438779._2
1308+ let $t03866238777 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1309+ let wAmountA = $t03866238777._1
1310+ let wAmountB = $t03866238777._2
13111311 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13121312 }
13131313 else throw("Strict value is not equal to itself.")
13141314 }
13151315 else throw("Strict value is not equal to itself.")
13161316 }
13171317 else throw("Strict value is not equal to itself.")
13181318 }
13191319 else {
1320- let $t03883238947 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1321- if (($t03883238947 == $t03883238947))
1320+ let $t03883038945 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1321+ if (($t03883038945 == $t03883038945))
13221322 then {
1323- let axlyFee = $t03883238947._2
1324- let userStaked = $t03883238947._1
1325- let $t03895339047 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1326- if (($t03895339047 == $t03895339047))
1323+ let axlyFee = $t03883038945._2
1324+ let userStaked = $t03883038945._1
1325+ let $t03895139045 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1326+ if (($t03895139045 == $t03895139045))
13271327 then {
1328- let newBalB = $t03895339047._2
1329- let newBalA = $t03895339047._1
1328+ let newBalB = $t03895139045._2
1329+ let newBalA = $t03895139045._1
13301330 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1331- let $t03911739232 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1332- let wAmountA = $t03911739232._1
1333- let wAmountB = $t03911739232._2
1331+ let $t03911539230 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1332+ let wAmountA = $t03911539230._1
1333+ let wAmountB = $t03911539230._2
13341334 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13351335 }
13361336 else throw("Strict value is not equal to itself.")
13371337 }
13381338 else throw("Strict value is not equal to itself.")
13391339 }
13401340 }
13411341 }
13421342 })
13431343
13441344
13451345
13461346 @Callable(i)
13471347 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
13481348 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
13491349 if (!(isPoolActive(pool, pType)))
13501350 then throw("Pool not active at this moment")
13511351 else withdrawToUser(toString(i.caller), pool, toString(posId), false)
13521352 })
13531353
13541354
13551355
13561356 @Callable(i)
13571357 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
13581358 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
13591359 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
13601360 if (!(isPoolActive(poolId, pType)))
13611361 then throw("Pool not active at this moment")
13621362 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
13631363 then throw("There are no user position")
13641364 else if ((0 >= price))
13651365 then throw("Price must be greater than 0")
13661366 else if ((price > tokenOraclePrice))
13671367 then throw("Price must be less than current token price")
13681368 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
13691369 })
13701370
13711371
13721372
13731373 @Callable(i)
13741374 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
13751375 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
13761376 if (!(isPoolActive(poolId, pType)))
13771377 then throw("Pool not active at this moment")
13781378 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
13791379 then throw("No entry")
13801380 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
13811381 })
13821382
13831383
13841384
13851385 @Callable(i)
13861386 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
13871387 then throw("Already inited")
13881388 else if (!(isDefined(addressFromString(moneyBoxAddr))))
13891389 then throw("moneyBoxAddr is not correct address")
13901390 else if (!(isDefined(addressFromString(sfFarmingAddr))))
13911391 then throw("sfFarmingAddr is not correct address")
13921392 else if (!(isDefined(addressFromString(lendAddr))))
13931393 then throw("lendAddr is not correct address")
13941394 else if (!(isDefined(addressFromString(priceOracleAddr))))
13951395 then throw("priceOracleAddr is not correct address")
13961396 else if (!(isDefined(addressFromString(keeperExContract))))
13971397 then throw("keeperExContract is not correct address")
13981398 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
13991399 then throw("swopAssetId is not correct asset id")
14001400 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
14011401 then throw("swopAssetId is not correct asset id")
14021402 else if ((size(fromBase58String(operatorPubKey)) != 32))
14031403 then throw("operatorPubKey is not correct")
14041404 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
14051405 then throw("group1Admin1PubKey is not correct")
14061406 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
14071407 then throw("group1Admin2PubKey is not correct")
14081408 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
14091409 then throw("group2Admin1PubKey is not correct")
14101410 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
14111411 then throw("group2Admin2PubKey is not correct")
14121412 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)])
14131413
14141414
14151415
14161416 @Callable(i)
14171417 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
14181418 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
14191419 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
14201420 })
14211421
14221422
14231423
14241424 @Callable(i)
14251425 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1426- let $t04407144175 = parseRequest(requestId)
1427- let user = $t04407144175._1
1428- let pool = $t04407144175._2
1429- let pmtA = $t04407144175._3
1430- let AId = $t04407144175._4
1431- let pmtB = $t04407144175._5
1432- let BId = $t04407144175._6
1433- let balA = $t04407144175._7
1434- let balB = $t04407144175._8
1435- let shareId = $t04407144175._9
1436- let bwAsset = $t04407144175._10
1437- let bwAmount = $t04407144175._11
1426+ let $t04406944173 = parseRequest(requestId)
1427+ let user = $t04406944173._1
1428+ let pool = $t04406944173._2
1429+ let pmtA = $t04406944173._3
1430+ let AId = $t04406944173._4
1431+ let pmtB = $t04406944173._5
1432+ let BId = $t04406944173._6
1433+ let balA = $t04406944173._7
1434+ let balB = $t04406944173._8
1435+ let shareId = $t04406944173._9
1436+ let bwAsset = $t04406944173._10
1437+ let bwAmount = $t04406944173._11
14381438 if ((size(i.payments) != 1))
14391439 then throw("Wrong payment size")
14401440 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
14411441 then true
14421442 else (i.payments[0].amount != bwAmount))
14431443 then throw("Wrong payment")
14441444 else {
1445- let $t04436544465 = if ((AId == bwAsset))
1445+ let $t04436344463 = if ((AId == bwAsset))
14461446 then $Tuple2((pmtA + bwAmount), pmtB)
14471447 else $Tuple2(pmtA, (pmtB + bwAmount))
1448- let pmtAllA = $t04436544465._1
1449- let pmtAllB = $t04436544465._2
1448+ let pmtAllA = $t04436344463._1
1449+ let pmtAllB = $t04436344463._2
14501450 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1451- let $t04454744662 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1452- let userStaked = $t04454744662._1
1453- let axlyFee = $t04454744662._2
1451+ let $t04454544660 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1452+ let userStaked = $t04454544660._1
1453+ let axlyFee = $t04454544660._2
14541454 let posNum = getNewUserPositionNumber(user)
14551455 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
14561456 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1457- let $t04502245137 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1458- let wAmountA = $t04502245137._1
1459- let wAmountB = $t04502245137._2
1457+ let $t04502045135 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1458+ let wAmountA = $t04502045135._1
1459+ let wAmountB = $t04502045135._2
14601460 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
14611461 }
14621462 }))
14631463
14641464
14651465
14661466 @Callable(i)
14671467 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
14681468 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
14691469 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1470- let $t04565845748 = getPoolData(Address(fromBase58String(pool)), pType)
1471- let AId = $t04565845748._1
1472- let BId = $t04565845748._2
1473- let balA = $t04565845748._3
1474- let balB = $t04565845748._4
1475- let shareId = $t04565845748._5
1470+ let $t04565645746 = getPoolData(Address(fromBase58String(pool)), pType)
1471+ let AId = $t04565645746._1
1472+ let BId = $t04565645746._2
1473+ let balA = $t04565645746._3
1474+ let balB = $t04565645746._4
1475+ let shareId = $t04565645746._5
14761476 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
14771477 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
14781478 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
14791479 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
14801480 if ((liquidateAmount > userCanWithdraw))
14811481 then throw("You can't liquidate more than user have")
14821482 else if ((borrowAmount == 0))
14831483 then throw("You can't liquidate position without borrow")
14841484 else [IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest), getIntegerValue(this, (pool + kPoolInterestLoan))), IntegerEntry((pool + kPoolTotalLoan), (getPoolTotalShareWithLoan(pool) - liquidateAmount)), IntegerEntry((pool + kPoolTotal), (getPoolTotalShare(pool) - liquidateAmount)), IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition), (userCanWithdraw - liquidateAmount)), ScriptTransfer(i.caller, amount, fromBase58String(shareId))]
14851485 }))
14861486
14871487
14881488
14891489 @Callable(i)
14901490 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14911491 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
14921492 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
14931493 if ((tokenOraclePrice > stopLossPrice))
14941494 then throw("Token price greater stop loss price")
14951495 else {
14961496 let res = withdrawToUser(user, pool, toString(posId), true)
14971497 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
14981498 }
14991499 }))
15001500
15011501
15021502
15031503 @Callable(i)
15041504 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15051505 let pType = getStringValue(this, (kPool + pool))
15061506 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1507- let $t04771847820 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1508- if (($t04771847820 == $t04771847820))
1507+ let $t04771647818 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1508+ if (($t04771647818 == $t04771647818))
15091509 then {
1510- let claimedAsset = $t04771847820._2
1511- let claimedAmount = $t04771847820._1
1510+ let claimedAsset = $t04771647818._2
1511+ let claimedAmount = $t04771647818._1
15121512 let rArgs = split(route, "__")
15131513 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15141514 then directSwopfiCPMM(rArgs, tokenToId)
15151515 else if ((rArgs[0] == "routingSwopfi"))
15161516 then directRoutingSwopfi(rArgs, tokenToId)
15171517 else throw("Wrong route")
15181518 if ((exchangedAmount == exchangedAmount))
15191519 then {
15201520 let newChange = ((claimedAmount + change) - amountToExchange)
15211521 let changeEntry = if ((newChange >= 0))
15221522 then [IntegerEntry((pool + kPoolCapChange), newChange)]
15231523 else nil
15241524 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
15251525 }
15261526 else throw("Strict value is not equal to itself.")
15271527 }
15281528 else throw("Strict value is not equal to itself.")
15291529 }))
15301530
15311531
15321532
15331533 @Callable(i)
15341534 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15351535 let pType = getStringValue(this, (kPool + pool))
1536- let $t04850448602 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1537- if (($t04850448602 == $t04850448602))
1536+ let $t04850248600 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1537+ if (($t04850248600 == $t04850248600))
15381538 then {
1539- let claimedAsset = $t04850448602._2
1540- let claimedAmount = $t04850448602._1
1539+ let claimedAsset = $t04850248600._2
1540+ let claimedAmount = $t04850248600._1
15411541 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
15421542 }
15431543 else throw("Strict value is not equal to itself.")
15441544 }))
15451545
15461546
15471547
15481548 @Callable(i)
15491549 func initNewPool (type,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
15501550 then (type != WX_POOL)
15511551 else false)
15521552 then throw("Wrong type")
15531553 else {
1554- let $t04902849122 = getPoolData(Address(fromBase58String(poolAddr)), type)
1555- let aId = $t04902849122._1
1556- let bId = $t04902849122._2
1557- let aBal = $t04902849122._3
1558- let bBal = $t04902849122._4
1559- let shareId = $t04902849122._5
1554+ let $t04902649120 = getPoolData(Address(fromBase58String(poolAddr)), type)
1555+ let aId = $t04902649120._1
1556+ let bId = $t04902649120._2
1557+ let aBal = $t04902649120._3
1558+ let bBal = $t04902649120._4
1559+ let shareId = $t04902649120._5
15601560 if ((0 > inFeeNoLoan))
15611561 then throw("inFeeNoLoan must be greater than 0")
15621562 else if ((0 > inFeeLoan))
15631563 then throw("inFeeLoan must be greater than 0")
15641564 else if ((0 > capFeeNoLoan))
15651565 then throw("capFeeNoLoan must be greater than 0")
15661566 else if ((0 > capFeeWithLoan))
15671567 then throw("capFeeWithLoan must be greater than 0")
15681568 else if ((0 > stoplossFeeNoLoan))
15691569 then throw("stoplossFeeNoLoan must be greater than 0")
15701570 else if ((0 > stoplossFeeWithLoan))
15711571 then throw("stoplossFeeWithLoan must be greater than 0")
15721572 else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan), IntegerEntry((poolAddr + kPoolInterestLoan), 0), IntegerEntry((poolAddr + kPoolInterestNoLoan), 0), StringEntry((kPool + poolAddr), type), StringEntry((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow)]
15731573 }))
15741574
15751575
15761576
15771577 @Callable(i)
15781578 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
15791579 then throw(("Can't find pool with addr " + poolAddr))
15801580 else if ((0 > inFeeNoLoan))
15811581 then throw("inFeeNoLoan must be greater than 0")
15821582 else if ((0 > inFeeLoan))
15831583 then throw("inFeeLoan must be greater than 0")
15841584 else if ((0 > capFeeNoLoan))
15851585 then throw("capFeeNoLoan must be greater than 0")
15861586 else if ((0 > capFeeWithLoan))
15871587 then throw("capFeeWithLoan must be greater than 0")
15881588 else if ((0 > stoplossFeeNoLoan))
15891589 then throw("stoplossFeeNoLoan must be greater than 0")
15901590 else if ((0 > stoplossFeeWithLoan))
15911591 then throw("stoplossFeeWithLoan must be greater than 0")
15921592 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)]))
15931593
15941594
15951595
15961596 @Callable(i)
15971597 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
15981598 then throw("dApp already active")
15991599 else [BooleanEntry(kActive, true)])
16001600
16011601
16021602
16031603 @Callable(i)
16041604 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
16051605 then throw("dApp already shutdown")
16061606 else [BooleanEntry(kActive, false)])
16071607
16081608
16091609
16101610 @Callable(i)
16111611 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
16121612 then throw("dApp already active for users")
16131613 else [BooleanEntry(kActiveUsers, true)])
16141614
16151615
16161616
16171617 @Callable(i)
16181618 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
16191619 then throw("dApp already shutdown for users")
16201620 else [BooleanEntry(kActiveUsers, false)])
16211621
16221622
16231623
16241624 @Callable(i)
16251625 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
16261626 then throw("SWOPFI already active")
16271627 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
16281628
16291629
16301630
16311631 @Callable(i)
16321632 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
16331633 then throw("SWOPFI already shutdown")
16341634 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
16351635
16361636
16371637
16381638 @Callable(i)
16391639 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
16401640 then throw("WX already active")
16411641 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
16421642
16431643
16441644
16451645 @Callable(i)
16461646 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
16471647 then throw("WX already shutdown")
16481648 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
16491649
16501650
16511651
16521652 @Callable(i)
16531653 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
16541654 then throw("Unknown pool")
16551655 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
16561656 then throw("Pool already active")
16571657 else [BooleanEntry((pool + kPoolActive), true)])
16581658
16591659
16601660
16611661 @Callable(i)
16621662 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
16631663 then throw("Unknown pool")
16641664 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
16651665 then throw("Pool already shutdown")
16661666 else [BooleanEntry((pool + kPoolActive), false)])
16671667
16681668
16691669 @Verifier(tx)
16701670 func verify () = match tx {
16711671 case inv: InvokeScriptTransaction =>
16721672 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
16731673 let isRightFee = if ((inv.fee == 900000))
16741674 then (inv.feeAssetId == unit)
16751675 else false
16761676 let isInitCall = (inv.function == "init")
16771677 let isnoPayments = (size(inv.payments) == 0)
16781678 if (if (if (isRightFee)
16791679 then isInitCall
16801680 else false)
16811681 then isSelf
16821682 else false)
16831683 then isnoPayments
16841684 else false
16851685 case _ =>
16861686 let group1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
16871687 then 1
16881688 else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin2PK))
16891689 then 1
16901690 else 0))
16911691 let group2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin1PK))
16921692 then 1
16931693 else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin2PK))
16941694 then 1
16951695 else 0))
16961696 ((group1Signed + group2Signed) == 2)
16971697 }
16981698

github/deemru/w8io/3ef1775 
223.15 ms