tx · 4M2PVDWnzvVtmNfFftF8nMZfRvKBHCoeedabQqmhBELP

3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS:  -0.54000000 Waves

2023.10.19 10:59 [2805182] smart account 3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS > SELF 0.00000000 Waves

{ "type": 13, "id": "4M2PVDWnzvVtmNfFftF8nMZfRvKBHCoeedabQqmhBELP", "fee": 54000000, "feeAssetId": null, "timestamp": 1697702371602, "version": 2, "chainId": 84, "sender": "3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS", "senderPublicKey": "HP8sssVq1866F7CaPQJwgFrt6fsqhQjKwM84cL1wjD2a", "proofs": [ "4ZmW4dMPR1qrGcKmQ4wyyDpGKMoC1Jd3zKsUJ4ny1tuV17xWGbsFRX1TRNjsYMjS8QztMtXHoj9Cn5oD3YjLjmco" ], "script": "base64:BgKiAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBQoDCAEIEgQKAggBEgYKBAEICAESBQoDAQgIEg8KDQgICAgICAgICAgICAgSAwoBCBIDCgEIEgUKAwgIARIGCgQIAQgIEgcKBQgICAEEEgUKAwgEARIMCgoICAgBAQEBAQEEEgkKBwgBAQEBAQESABIAEgASABIAEgASABIAEgMKAQgSAwoBCIUBAAdTRl9QT09MAgJTRgAHV1hfUE9PTAICV1gABENQTU0CBGNwbW0ABEZMQVQCBGZsYXQAD0NBUF9GRUVfTk9fTE9BTgIJY2FwTm9Mb2FuAAxDQVBfRkVFX0xPQU4CB2NhcExvYW4AFFNUT1BMT1NTX0ZFRV9OT19MT0FOAg5zdG9wTG9zc05vTG9hbgANU1RPUExPU1NfTE9BTgIMc3RvcExvc3NMb2FuAAhMT0FOX0ZFRQIEbG9hbgALTk9fTE9BTl9GRUUCBm5vTG9hbgAGTk9fRkVFAgVub0ZlZQAGU0NBTEU4AIDC1y8AB1NDQUxFMTAAgMivoCUAB1NDQUxFMTYJALYCAQCAgIT+pt7hEQAKRkVFX1NDQUxFNgDAhD0AFGtTRlBvb2xBQXNzZXRCYWxhbmNlAg9BX2Fzc2V0X2JhbGFuY2UAFGtTRlBvb2xCQXNzZXRCYWxhbmNlAg9CX2Fzc2V0X2JhbGFuY2UAD2tTRlBvb2xBQXNzZXRJZAIKQV9hc3NldF9pZAAPa1NGUG9vbEJBc3NldElkAgpCX2Fzc2V0X2lkAA5rU0ZQb29sU2hhcmVJZAIOc2hhcmVfYXNzZXRfaWQAEmtTRlBvb2xTaGFyZVN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AAprU0ZQb29sRmVlAgpjb21taXNzaW9uAA1rVXNlclBvc2l0aW9uAg1fdXNlclBvc2l0aW9uABFrVXNlclBvc2l0aW9uUG9vbAIRX3VzZXJQb3NpdGlvblBvb2wAEWtVc2VyQm9ycm93QW1vdW50AhlfdXNlclBvc2l0aW9uQm9ycm93QW1vdW50ABJrVXNlckJvcnJvd0Fzc2V0SWQCGl91c2VyUG9zaXRpb25Cb3Jyb3dBc3NldElkABBrVXNlclBvc2l0aW9uTnVtAhNfdXNlclBvc2l0aW9uTnVtYmVyABVrVXNlclBvc2l0aW9uSW50ZXJlc3QCFV91c2VyUG9zaXRpb25JbnRlcmVzdAAKa1Bvb2xUb3RhbAIKX3Bvb2xUb3RhbAAOa1Bvb2xUb3RhbExvYW4CDl9wb29sVG90YWxMb2FuABFrUG9vbEludGVyZXN0TG9hbgIRX3Bvb2xJbnRlcmVzdExvYW4AE2tQb29sSW50ZXJlc3ROb0xvYW4CE19wb29sSW50ZXJlc3ROb0xvYW4ADmtQb29sQ2FuQm9ycm93Ag5fcG9vbENhbkJvcnJvdwAVa0F4bHlJbkZlZVdpdGhvdXRMb2FuAg5fYXhseUZlZU5vTG9hbgASa0F4bHlJbkZlZVdpdGhMb2FuAhBfYXhseUZlZVdpdGhMb2FuABFrQXhseU5vTG9hbkNhcEZlZQIRX2F4bHlGZWVDYXBOb0xvYW4AE2tBeGx5V2l0aExvYW5DYXBGZWUCE19heGx5RmVlQ2FwV2l0aExvYW4AFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUCGF9heGx5RmVlU3RvcGxvc3NXaXRoTG9hbgAUa0F4bHlTdG9wTG9zc0xvYW5GZWUCFl9heGx5RmVlU3RvcGxvc3NOb0xvYW4ACmtSZXF1ZXN0SWQCC19yZXF1ZXN0X2lkAAxrUmVxdWVzdEl0ZXICDXJlcXVlc3RzX2l0ZXIABWtQb29sAgVwb29sXwAJa1Bvb2xUeXBlAglfcG9vbFR5cGUACmtTaGFyZVBvb2wCDF9wb29sU2hhcmVJZAAOa1Bvb2xDYXBDaGFuZ2UCDl9wb29sQ2FwQ2hhbmdlAA9rVG9rZW5MYXN0UHJpY2UCCmxhc3RfcHJpY2UADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCAAdrQWN0aXZlAgZhY3RpdmUADGtBY3RpdmVVc2VycwILYWN0aXZlVXNlcnMAC2tBY3RpdmVTRldYAgdfYWN0aXZlAAtrUG9vbEFjdGl2ZQILX2FjdGl2ZVBvb2wADWtVc2VyU3RvcExvc3MCCV9zdG9wTG9zcwAXa0ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkCF19mYWxsYmFja0V4Y2hhbmdlU3dvcGZpAAlrTW9uZXlCb3gCDmF4bHlfbW9uZXlfYm94AA5rU0ZGYXJtaW5nQWRkcgITc3dvcGZpX2Zhcm1pbmdfYWRkcgAMa0xlbmRTZXJ2aWNlAhFsZW5kX3NlcnZpY2VfYWRkcgAPa09wZXJhdG9yQ2FsbFBLAhJhZG1pbl9jYWxsX3B1Yl9rZXkADGtQcmljZU9yYWNsZQIMcHJpY2Vfb3JhY2xlAAtrRXhDb250cmFjdAIRZXhjaGFuZ2VfY29udHJhY3QAD2tXeFN3YXBDb250cmFjdAIQd3hfc3dhcF9jb250cmFjdAAHa1N3b3BJZAIHc3dvcF9pZAAFa1d4SWQCBXd4X2lkAA9rR3JvdXAxQWRtaW4xUEsCFWdyb3VwMV9hZG1pbjFfcHViX2tleQAPa0dyb3VwMUFkbWluMlBLAhVncm91cDFfYWRtaW4yX3B1Yl9rZXkAD2tHcm91cDJBZG1pbjFQSwIVZ3JvdXAyX2FkbWluMV9wdWJfa2V5AA9rR3JvdXAyQWRtaW4yUEsCFWdyb3VwMl9hZG1pbjJfcHViX2tleQAIbW9uZXlCb3gJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwULa0V4Q29udHJhY3QCHE5vIGV4Y2hhbmdlIGNvbnRyYWN0IGFkZHJlc3MAD3ByaWNlT3JhY2xlQWRkcgkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrUHJpY2VPcmFjbGUCF05vIHByaWNlIG9yYWNsZSBhZGRyZXNzAA53eFN3YXBDb250cmFjdAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGU1dPUElECQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQdrU3dvcElkAgpObyBzd29wIGlkAARXWElECQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQVrV3hJZAIITm8gd3ggaWQADmdyb3VwMUFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAxQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4xUEsADmdyb3VwMUFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAxQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4yUEsADmdyb3VwMkFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsADmdyb3VwMkFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsACm9wZXJhdG9yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsBD3Vua25vd25Qb29sVHlwZQAJAAIBAg9Xcm9uZyBwb29sIHR5cGUBDmdldExlbmRTcnZBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrTGVuZFNlcnZpY2UCG0Nhbid0IGdldCBsZW5kIHNlcnZpY2UgYWRkcgEOaXNPcGVyYXRvckNhbGwBAWkDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQpvcGVyYXRvclBLBQR1bml0CQACAQIkT25seSBvcGVyYXRvciBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQtpc0FkbWluQ2FsbAEBaQMDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQ5ncm91cDFBZG1pbjFQSwYJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFDmdyb3VwMUFkbWluMlBLBQR1bml0CQACAQIoT25seSBhZG1pbiBncm91cDEgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFBHRoaXMFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc0xhbmRDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgkBDmdldExlbmRTcnZBZGRyAAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQhpc0FjdGl2ZQADCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgYFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50ARBpc0FjdGl2ZUZvclVzZXJzAAMDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGBgcFBHVuaXQJAAIBAilEQXBwIGlzIGluYWN0aXZlIGZvciB1c2VycyBhdCB0aGlzIG1vbWVudAEMaXNQb29sQWN0aXZlAgRwb29sBHR5cGUECldYU0ZBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQR0eXBlBQtrQWN0aXZlU0ZXWAYECnBvb2xBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYDAwUKV1hTRkFjdGl2ZQUKcG9vbEFjdGl2ZQcGBwEOYWNjb3VudEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQACAQILTWF0Y2ggZXJyb3IBEWdldFNGUG9vbEJhbGFuY2VzAQhwb29sQWRkcgkAlAoCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xBQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGJhbGFuY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUUa1NGUG9vbEJBc3NldEJhbGFuY2UCHkNhbid0IGdldCBwb29sIEIgYXNzZXQgYmFsYW5jZQERZ2V0V1hQb29sQmFsYW5jZXMDCHBvb2xBZGRyA2FJZANiSWQJAJQKAgoAAUAJAPwHBAUIcG9vbEFkZHICHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUDYUlkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFA2JJZAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQ9nZXRQb29sQmFsYW5jZXMECHBvb2xBZGRyBHR5cGUDYUlkA2JJZAMJAAACBQR0eXBlBQdTRl9QT09MCQERZ2V0U0ZQb29sQmFsYW5jZXMBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQJAQ91bmtub3duUG9vbFR5cGUAAQ1nZXRTRlBvb2xEYXRhAQhwb29sQWRkcgQLJHQwODA4OTgxMzgJARFnZXRTRlBvb2xCYWxhbmNlcwEFCHBvb2xBZGRyAwkAAAIFCyR0MDgwODk4MTM4BQskdDA4MDg5ODEzOAQEYmFsQggFCyR0MDgwODk4MTM4Al8yBARiYWxBCAULJHQwODA4OTgxMzgCXzEJAJcKBQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ9rU0ZQb29sQUFzc2V0SWQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEJBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGlkBQRiYWxBBQRiYWxCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFDmtTRlBvb2xTaGFyZUlkAhhDYW4ndCBnZXQgc2hhcmUgYXNzZXQgaWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDWdldFdYUG9vbERhdGEBCHBvb2xBZGRyBANjZmcKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUDY2ZnBQNjZmcEA2FJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQEA2JJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABQMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEIgYXNzZXQgaWQEB3NoYXJlSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAMDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhpDYW4ndCBnZXQgcG9vbCBMUCBhc3NldCBpZAQLJHQwODgzNTg4OTQJARFnZXRXWFBvb2xCYWxhbmNlcwMFCHBvb2xBZGRyBQNhSWQFA2JJZAMJAAACBQskdDA4ODM1ODg5NAULJHQwODgzNTg4OTQEBGJhbEIIBQskdDA4ODM1ODg5NAJfMgQEYmFsQQgFCyR0MDg4MzU4ODk0Al8xCQCXCgUFA2FJZAUDYklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRQb29sRGF0YQIIcG9vbEFkZHIEdHlwZQMJAAACBQR0eXBlBQdTRl9QT09MCQENZ2V0U0ZQb29sRGF0YQEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJAQ1nZXRXWFBvb2xEYXRhAQUIcG9vbEFkZHIJAQ91bmtub3duUG9vbFR5cGUAAQ5nZXRTaGFyZVN1cHBseQMIcG9vbEFkZHIEdHlwZQdzaGFyZUlkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUSa1NGUG9vbFNoYXJlU3VwcGx5AhxDYW4ndCBnZXQgc2hhcmUgYXNzZXQgc3VwcGx5AwkAAAIFBHR5cGUFB1dYX1BPT0wICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQdzaGFyZUlkAg1Xcm9uZyBTaGFyZUlkCHF1YW50aXR5CQEPdW5rbm93blBvb2xUeXBlAAERZ2V0UG9vbFRvdGFsU2hhcmUBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQprUG9vbFRvdGFsAAABGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgAAARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBHVzZXIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQAAAAEBCmdldEF4bHlGZWUCBHBvb2wHZmVlVHlwZQMJAAACBQdmZWVUeXBlBQxDQVBfRkVFX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa0F4bHlXaXRoTG9hbkNhcEZlZQMJAAACBQdmZWVUeXBlBQ9DQVBfRkVFX05PX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa0F4bHlOb0xvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUITE9BTl9GRUUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUSa0F4bHlJbkZlZVdpdGhMb2FuAwkAAAIFB2ZlZVR5cGUFC05PX0xPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgMJAAACBQdmZWVUeXBlBQZOT19GRUUAAAkAAgECDldyb25nIGZlZSB0eXBlARBnZXRTRkZhcm1pbmdBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ5rU0ZGYXJtaW5nQWRkcgIdQ2FuJ3QgZ2V0IHN3b3BmaSBmYXJtaW5nIGFkZHIBEGdldFdYRmFybWluZ0FkZHIBCHBvb2xBZGRyBAlmQ29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIECmZhY3Ryb3lDZmcJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCWZDb250cmFjdAIRJXNfX2ZhY3RvcnlDb25maWcCGENhbid0IGdldCBXWCBmYWN0b3J5IGNmZwICX18JAQdBZGRyZXNzAQkA2QQBCQCRAwIFCmZhY3Ryb3lDZmcAAQEMYXNzZXRJZFRvU3RyAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECDE5vdCBBc3NldCBpZAEOYXNzZXRJZEZyb21TdHIBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2l0aW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BDmdldEFzc2V0c1ByaWNlAQhhc3NldElkcwoBCWdldFByaWNlcwIBYQdhc3NldElkBAphc3NldFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BCQDNCAIFAWEFCmFzc2V0UHJpY2UKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyAQ1nZXRTaGFyZVByaWNlAQdzaGFyZUlkBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sAiBDYW4ndCBmaW5kIHBvb2wgYWRkciBieSBzaGFyZSBpZAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMTE4ODMxMTk0OAkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANhSWQIBQ0kdDAxMTg4MzExOTQ4Al8xBANiSWQIBQ0kdDAxMTg4MzExOTQ4Al8yBAhhQmFsYW5jZQgFDSR0MDExODgzMTE5NDgCXzMECGJCYWxhbmNlCAUNJHQwMTE4ODMxMTk0OAJfNAQGcHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQHZFByaWNlQQkAkQMCBQZwcmljZXMAAAQHZFByaWNlQgkAkQMCBQZwcmljZXMAAQMDCQBmAgAABQdkUHJpY2VBBgkAZgIAAAUHZFByaWNlQgD///////////8BBAtzaGFyZVN1cHBseQkBDmdldFNoYXJlU3VwcGx5AwUIcG9vbEFkZHIFBXBUeXBlBQdzaGFyZUlkBApBUHJlY2lzaW9uCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYUlkAAAAAAUERE9XTgQKQlByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2JJZAAAAAAFBERPV04EDnNoYXJlUHJlY2lzaW9uCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHc2hhcmVJZAAAAAAFBERPV04EA3N1bQkAZAIJAGsDBQhhQmFsYW5jZQUHZFByaWNlQQUKQVByZWNpc2lvbgkAawMFCGJCYWxhbmNlBQdkUHJpY2VCBQpCUHJlY2lzaW9uCQBrAwUDc3VtBQ5zaGFyZVByZWNpc2lvbgULc2hhcmVTdXBwbHkBDmdldFNoYXJlUHJpY2VzAQhzaGFyZUlkcwoBCWdldFByaWNlcwIBYQdzaGFyZUlkCQDNCAIFAWEJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAoAAiRsBQhzaGFyZUlkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZ2V0UHJpY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQBDmdldEN1cnNFbnRyaWVzBANhSWQDYklkB3NoYXJlSWQId0Ftb3VudHMEDGFzc2V0c1ByaWNlcwkBDmdldEFzc2V0c1ByaWNlAQkAzAgCBQNhSWQJAMwIAgUDYklkBQNuaWwECnNoYXJlUHJpY2UJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAQGcHJpY2VzCQDOCAIJAMwIAgkApAMBCQCRAwIFDGFzc2V0c1ByaWNlcwAACQDMCAIJAKQDAQkAkQMCBQxhc3NldHNQcmljZXMAAQkAzAgCCQCkAwEFCnNoYXJlUHJpY2UFA25pbAUId0Ftb3VudHMJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa1Rva2VuTGFzdFByaWNlCQC5CQIFBnByaWNlcwIBLAUDbmlsARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMIBXBUeXBlCHBvb2xBZGRyBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgMJAAACBQVwVHlwZQUHU0ZfUE9PTAQEcmVwbAoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAiBjYWxjTFBSZXBsZW5pc2hUd29Ub2tlbnNSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUEcG10QQkAzAgCCQCkAwEFBHBtdEIFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFBHJlcGwFBHJlcGwJAJcKBQoAAUAJAJEDAgUEcmVwbAADAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAAEAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkBDGFzc2V0SWRUb1N0cgEJAJEDAgUEcmVwbAACCgABQAkAkQMCBQRyZXBsAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAxMzQ5MjEzNzQyCQCUCgIJALUJAgoAAUAJAPwHBAUIcG9vbEFkZHICIGV2YWx1YXRlUHV0QnlBbW91bnRBc3NldFJFQURPTkxZCQDMCAIFBHBtdEEFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18JALUJAgoAAUAJAPwHBAUIcG9vbEFkZHICH2V2YWx1YXRlUHV0QnlQcmljZUFzc2V0UkVBRE9OTFkJAMwIAgUEcG10QgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQ0kdDAxMzQ5MjEzNzQyBQ0kdDAxMzQ5MjEzNzQyBApldmFsUHV0SW5CCAUNJHQwMTM0OTIxMzc0MgJfMgQKZXZhbFB1dEluQQgFDSR0MDEzNDkyMTM3NDICXzEEBWxwSW5BCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQABBAVscEluQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIAAQMJAGYCBQVscEluQgUFbHBJbkEEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEACAkAlwoFBQRwbXRBBQNwbXQJAGUCBQRwbXRCBQNwbXQFA2JJZAUFbHBJbkIEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIABwkAlwoFBQNwbXQFBHBtdEIJAGUCBQRwbXRBBQNwbXQFA2FJZAUFbHBJbkEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUGCHBvb2xBZGRyBXBUeXBlBHBtdEEDYUlkBHBtdEIDYklkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUDYUlkBQRwbXRBCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNiSWQFBHBtdEIFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMJAMwIAgkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAUIcG9vbEFkZHICA3B1dAkAzAgCAMCEPQkAzAgCBwUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABF3JlcGxlbmlzaE9uZVRva2VuQnlUeXBlBAhwb29sQWRkcgVwVHlwZQNwbXQFcG10SWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQVwbXRJZAUDcG10BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhVyZXBsZW5pc2hXaXRoT25lVG9rZW4JAMwIAgkAzAgCAgEwCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAQCZmMDCQAAAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKUIAQUIcG9vbEFkZHIFCWtQb29sVHlwZQIEY3BtbQUERkxBVAILcHV0T25lVGtuVjICCXB1dE9uZVRrbgkA/AcEBQhwb29sQWRkcgUCZmMJAMwIAgAACQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEHc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCAAAFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgVzdGFrZQUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABCXVuc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQNJHQwMTU1MjAxNTg3MAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkAlQoDCQEQZ2V0U0ZGYXJtaW5nQWRkcgACE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkAlQoDCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAQ91bmtub3duUG9vbFR5cGUABAhmYXJtQWRkcggFDSR0MDE1NTIwMTU4NzACXzEEBWZOYW1lCAUNJHQwMTU1MjAxNTg3MAJfMgQGcGFyYW1zCAUNJHQwMTU1MjAxNTg3MAJfMwQDaW52CQD8BwQFCGZhcm1BZGRyBQVmTmFtZQUGcGFyYW1zBQNuaWwDCQAAAgUDaW52BQNpbnYFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAbgQFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBQdDRUlMSU5HBA0kdDAxNjI5MjE2NTk4AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxCCQBlAgUEYmFsQQUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEEJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE2MjkyMTY1OTgCXzEECmFzc2V0VG9QYXkIBQ0kdDAxNjI5MjE2NTk4Al8yCQCUCgIFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5AQ1nZXRXWFN3YXBGZWVzAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDnBvb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQScHJvdG9jb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEByRtYXRjaDAJAPwHBAUJZkNvbnRyYWN0AhJnZXRTd2FwRmVlUkVBRE9OTFkJAMwIAgkApQgBBQhwb29sQWRkcgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQEZmVlcwUHJG1hdGNoMAkAlAoCCAUEZmVlcwJfMQgFBGZlZXMCXzIJAJQKAgUOcG9vbEZlZURlZmF1bHQFEnByb3RvY29sRmVlRGVmYXVsdAERY2FsY0Ftb3VudFRvUGF5V1gHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BA0kdDAxNzMzODE3Mzc3CQENZ2V0V1hTd2FwRmVlcwEFBHBvb2wEBHBGZWUIBQ0kdDAxNzMzODE3Mzc3Al8xBAVwckZlZQgFDSR0MDE3MzM4MTczNzcCXzIECGZlZVNjYWxlCQC2AgEAgMLXLwQNJHQwMTc0MTcxNzcyNQMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEIJAGUCBQRiYWxBBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAGsDBRBhbW91bnRUb2tlblRvR2V0BQRiYWxBCQBlAgUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTc0MTcxNzcyNQJfMQQKYXNzZXRUb1BheQgFDSR0MDE3NDE3MTc3MjUCXzIEEmFtb3VudFRvUGF5V2l0aEZlZQkAoAMBCQC9AgQJALYCAQULYW1vdW50VG9QYXkFCGZlZVNjYWxlCQC4AgIFCGZlZVNjYWxlCQC2AgEJAGQCBQVwckZlZQUEcEZlZQUHQ0VJTElORwkAlAoCBQphc3NldFRvUGF5BRJhbW91bnRUb1BheVdpdGhGZWUBEGV4Y2hhbmdlRGlyZWN0bHkIBXBUeXBlBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAZwb29sRkIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBRdrRmFsbGJhY2tFeGNoYW5nZVN3b3BmaQIAAwMJAAACBQVwVHlwZQUHU0ZfUE9PTAYJAQIhPQIFBnBvb2xGQgIABA0kdDAxODE2NjE4Mzc4AwkAAAIFBnBvb2xGQgIACQCVCgMFBGJhbEEFBGJhbEIFBHBvb2wEDSR0MDE4MjcyMTgzNDUJARFnZXRTRlBvb2xCYWxhbmNlcwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBnBvb2xGQgQGc2ZCYWxBCAUNJHQwMTgyNzIxODM0NQJfMQQGc2ZCYWxCCAUNJHQwMTgyNzIxODM0NQJfMgkAlQoDBQZzZkJhbEEFBnNmQmFsQgUGcG9vbEZCBAVwQmFsQQgFDSR0MDE4MTY2MTgzNzgCXzEEBXBCYWxCCAUNJHQwMTgxNjYxODM3OAJfMgQGZXhQb29sCAUNJHQwMTgxNjYxODM3OAJfMwQNJHQwMTgzODMxODUwOQkBEWNhbGNBbW91bnRUb1BheVNGBwUGZXhQb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBXBCYWxBBQVwQmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BAphc3NldFRvUGF5CAUNJHQwMTgzODMxODUwOQJfMQQLYW1vdW50VG9QYXkIBQ0kdDAxODM4MzE4NTA5Al8yCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBmV4UG9vbAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgkApAMBBRBhbW91bnRUb2tlblRvR2V0BQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTg3MTExODgzMwkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQRiYWxBBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAxODcxMTE4ODMzAl8xBAthbW91bnRUb1BheQgFDSR0MDE4NzExMTg4MzMCXzIJAPwHBAUOd3hTd2FwQ29udHJhY3QCBHN3YXAJAMwIAgUQYW1vdW50VG9rZW5Ub0dldAkAzAgCBQ9hc3NldFRva2VuVG9HZXQJAMwIAgkApQgBBQR0aGlzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5BQNuaWwJAQ91bmtub3duUG9vbFR5cGUAARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQIcG9vbEFkZHIFcFR5cGUHc2hhcmVJZA91c2VyQ2FuV2l0aGRyYXcEDSR0MDE5MTIwMjAzMjIDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhB3aXRoZHJhd1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2ludgUDaW52CQCUCgIKAAFACQCRAwIFA2ludgAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUDaW52AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQlrUG9vbFR5cGUCBGNwbW0FBEZMQVQEA2ludgkA/AcEBQhwb29sQWRkcgIXcG9vbEV2YWx1YXRlR2V0UkVBRE9OTFkJAMwIAgUHc2hhcmVJZAkAzAgCBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BA0kdDAxOTU4MDIwMDc3BAckbWF0Y2gwBQNpbnYDAwMJAAECCAUHJG1hdGNoMAJfMQIDSW50AwkAAQIIBQckbWF0Y2gwAl8yAgNJbnQDCQABAggFByRtYXRjaDACXzUCA0ludAMJAAECCAUHJG1hdGNoMAJfNgIDSW50AwkAAQIIBQckbWF0Y2gwAl83AgNJbnQDCQABAggFByRtYXRjaDACXzgCBlN0cmluZwkAAQIIBQckbWF0Y2gwAl85AgZTdHJpbmcHBwcHBwcJAAACCQDGCgEFByRtYXRjaDAACgcECG91dEFtQW10CAUHJG1hdGNoMAJfMQQIb3V0UHJBbXQIBQckbWF0Y2gwAl8yBAlhbUJhbGFuY2UIBQckbWF0Y2gwAl81BAlwckJhbGFuY2UIBQckbWF0Y2gwAl82BApscEVtaXNzaW9uCAUHJG1hdGNoMAJfNwQIY3VyUHJpY2UIBQckbWF0Y2gwAl84BApwb29sU3RhdHVzCAUHJG1hdGNoMAJfOQkAmQoHBQhvdXRBbUFtdAUIb3V0UHJBbXQFCWFtQmFsYW5jZQUJcHJCYWxhbmNlBQpscEVtaXNzaW9uBQhjdXJQcmljZQUKcG9vbFN0YXR1cwkAAgECE0NvdWxkbid0IGNhc3QgdHlwZXMECG91dEFtQW10CAUNJHQwMTk1ODAyMDA3NwJfMQQIb3V0UHJBbXQIBQ0kdDAxOTU4MDIwMDc3Al8yBAlhbUJhbGFuY2UIBQ0kdDAxOTU4MDIwMDc3Al8zBAlwckJhbGFuY2UIBQ0kdDAxOTU4MDIwMDc3Al80BApscEVtaXNzaW9uCAUNJHQwMTk1ODAyMDA3NwJfNQQIY3VyUHJpY2UIBQ0kdDAxOTU4MDIwMDc3Al82BApwb29sU3RhdHVzCAUNJHQwMTk1ODAyMDA3NwJfNwkAlAoCBQhvdXRBbUFtdAUIb3V0UHJBbXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EA2ludgkAtQkCCgABQAkA/AcEBQhwb29sQWRkcgITZXZhbHVhdGVHZXRSRUFET05MWQkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNpbnYFA2ludgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAEB2Ftb3VudEEIBQ0kdDAxOTEyMDIwMzIyAl8xBAdhbW91bnRCCAUNJHQwMTkxMjAyMDMyMgJfMgkAlAoCBQdhbW91bnRBBQdhbW91bnRCAQtjbGFpbUZhcm1lZAIFcFR5cGUEcG9vbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQZTV09QSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDIwNjkwMjA3NjkJAQ1nZXRXWFBvb2xEYXRhAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQDYUlkCAUNJHQwMjA2OTAyMDc2OQJfMQQDYklkCAUNJHQwMjA2OTAyMDc2OQJfMgQEYUJhbAgFDSR0MDIwNjkwMjA3NjkCXzMEBGJCYWwIBQ0kdDAyMDY5MDIwNzY5Al80BARscElkCAUNJHQwMjA2OTAyMDc2OQJfNQQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQRXWElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBANpbnYJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgdjbGFpbVd4CQDMCAIFBGxwSWQFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUEV1hJRAkAlAoCCQBlAgUIYmFsQWZ0ZXIFCWJhbEJlZm9yZQUEV1hJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABD3JlcGxlbmlzaEJ5VHlwZQoFcFR5cGUEcG9vbAdmZWVUeXBlBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgRMUElkBA9scEJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAMJAAACBQ9scEJhbGFuY2VCZWZvcmUFD2xwQmFsYW5jZUJlZm9yZQQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEDSR0MDIxMzY3MjE3ODMDAwkAZgIFBHBtdEEAAAkAZgIFBHBtdEIAAAcEDSR0MDIxNDMzMjE1NDkJARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMIBQVwVHlwZQUIcG9vbEFkZHIFBHBtdEEFA2FJZAUEcG10QgUDYklkBQRiYWxBBQRiYWxCBAZwbXRJbkEIBQ0kdDAyMTQzMzIxNTQ5Al8xBAZwbXRJbkIIBQ0kdDAyMTQzMzIxNTQ5Al8yBAZjaGFuZ2UIBQ0kdDAyMTQzMzIxNTQ5Al8zBAhjaGFuZ2VJZAgFDSR0MDIxNDMzMjE1NDkCXzQEA2ludgkBGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQYFCHBvb2xBZGRyBQVwVHlwZQUGcG10SW5BBQNhSWQFBnBtdEluQgUDYklkAwkAAAIFA2ludgUDaW52CQCUCgIFBmNoYW5nZQUIY2hhbmdlSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQBmAgUEcG10QQAACQCUCgIFBHBtdEEFA2FJZAMJAGYCBQRwbXRCAAAJAJQKAgUEcG10QgUDYklkCQACAQIQcG10cyBtdXN0IGJlID4gMAQGY2hhbmdlCAUNJHQwMjEzNjcyMTc4MwJfMQQIY2hhbmdlSWQIBQ0kdDAyMTM2NzIxNzgzAl8yBANpbnYDCQBmAgUGY2hhbmdlAAAJARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQFCHBvb2xBZGRyBQVwVHlwZQUGY2hhbmdlBQhjaGFuZ2VJZAUDbmlsAwkAAAIFA2ludgUDaW52BA5scEJhbGFuY2VBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkBAt0b3RhbFN0YWtlZAkAZQIFDmxwQmFsYW5jZUFmdGVyBQ9scEJhbGFuY2VCZWZvcmUEDWF4bHlGZWVBbW91bnQJAGsDBQt0b3RhbFN0YWtlZAkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2BBF1c2VyU2hhcmVGb3JTdGFrZQkAZQIFC3RvdGFsU3Rha2VkBQ1heGx5RmVlQW1vdW50AwkAZwIAAAURdXNlclNoYXJlRm9yU3Rha2UJAAIBAihhbW91bnQgb2Ygc3Rha2VkIHNoYXJldG9rZW5zIG11c3QgYmUgPiAwBAVpbnZMUAkBB3N0YWtlTFAEBQRwb29sBQVwVHlwZQUETFBJZAURdXNlclNoYXJlRm9yU3Rha2UDCQAAAgUFaW52TFAFBWludkxQCQCUCgIFEXVzZXJTaGFyZUZvclN0YWtlBQ1heGx5RmVlQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARByZXBsZW5pc2hFbnRyaWVzCARwb29sBHVzZXIMc3Rha2VkQW1vdW50DWF4bHlGZWVBbW91bnQGcG9zTnVtB3NoYXJlSWQEdHlwZQh3aXRoTG9hbgQLdG90YWxBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wED3RvdGFsQW1vdW50TG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBA0kdDAyMjY0MDIyODc4AwUId2l0aExvYW4JAJQKAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkAZAIFD3RvdGFsQW1vdW50TG9hbgUMc3Rha2VkQW1vdW50CQCUCgIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgUPdG90YWxBbW91bnRMb2FuBA9jdXJQb29sSW50ZXJlc3QIBQ0kdDAyMjY0MDIyODc4Al8xBBN0b3RhbFN0YWtlZFdpdGhMb2FuCAUNJHQwMjI2NDAyMjg3OAJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgULdG90YWxBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgUTdG90YWxTdGFrZWRXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBQ1rVXNlclBvc2l0aW9uBQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUVa1VzZXJQb3NpdGlvbkludGVyZXN0BQ9jdXJQb29sSW50ZXJlc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sBQRwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0FBnBvc051bQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUNYXhseUZlZUFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwBCWxpc3RUb0ludAIBYQRpdGVtCQDNCAIFAWEJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQEQZGlyZWN0U3dvcGZpQ1BNTQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBARwbXRQCQC1CQIJAJEDAgUFckFyZ3MAAgIBfAQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANwbXQJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEJAJEDAgUEcG10UAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcG10UAABBQNuaWwEC21pblRvUmVjaXZlCQCRAwIFBXJBcmdzAAMEA2ludgkA/AcEBQRkQXBwAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCBQttaW5Ub1JlY2l2ZQUDbmlsBQNuaWwFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZGlyZWN0Um91dGluZ1N3b3BmaQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA3BtdAQEcG10UAkAtQkCCQCRAwIFBXJBcmdzAAICAXwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQkAkQMCBQRwbXRQAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRwbXRQAAEFA25pbAQEYXJncwQFZUFyZ3MJALUJAgkAkQMCBQVyQXJncwADAgF8BApleGNoYW5nZXJzCQC1CQIJAJEDAgUFZUFyZ3MAAAIBLAQOZXhjaGFuZ2Vyc1R5cGUJALUJAgkAkQMCBQVlQXJncwABAgEsBAVhcmdzMQoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAgIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADBAVhcmdzMgoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADBBFyb3V0aW5nQXNzZXRzS2V5cwkAtQkCCQCRAwIFBWVBcmdzAAQCASwEC21pblRvUmVjaXZlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFZUFyZ3MABQkAzAgCBQpleGNoYW5nZXJzCQDMCAIFDmV4Y2hhbmdlcnNUeXBlCQDMCAIFBWFyZ3MxCQDMCAIFBWFyZ3MyCQDMCAIFEXJvdXRpbmdBc3NldHNLZXlzCQDMCAIFC21pblRvUmVjaXZlBQNuaWwEA2ludgkA/AcEBQRkQXBwAgxyb3V0aW5nVHJhZGUFBGFyZ3MFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEKY2FwaXRhbGl6ZQQEcG9vbAVwVHlwZQd0b2tlbklkC3Rva2VuQW1vdW50BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEDSR0MDI0OTg1MjUwNTEJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDQUlkCAUNJHQwMjQ5ODUyNTA1MQJfMQQDQklkCAUNJHQwMjQ5ODUyNTA1MQJfMgQEYmFsQQgFDSR0MDI0OTg1MjUwNTECXzMEBGJhbEIIBQ0kdDAyNDk4NTI1MDUxAl80BAdzaGFyZUlkCAUNJHQwMjQ5ODUyNTA1MQJfNQMDCQECIT0CBQd0b2tlbklkBQNBSWQJAQIhPQIFB3Rva2VuSWQFA0JJZAcJAAIBAgtXcm9uZyBhc3NldAQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAMJAAACBRB0b3RhbFNoYXJlQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3Rva2VuQW1vdW50CQDZBAEFB3Rva2VuSWQFA25pbAQYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEC2xvYW5QZXJjZW50CQBrAwUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQZTQ0FMRTgFEHRvdGFsU2hhcmVBbW91bnQEEHRva2Vuc0ZvckZlZUxvYW4JAGsDBQt0b2tlbkFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQSdG9rZW5zRm9yRmVlTm9Mb2FuCQBlAgULdG9rZW5BbW91bnQFEHRva2Vuc0ZvckZlZUxvYW4EC2F4bHlGZWVMb2FuCQBrAwUQdG9rZW5zRm9yRmVlTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQxDQVBfRkVFX0xPQU4FCkZFRV9TQ0FMRTYEDWF4bHlGZWVOb0xvYW4JAGsDBRJ0b2tlbnNGb3JGZWVOb0xvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUPQ0FQX0ZFRV9OT19MT0FOBQpGRUVfU0NBTEU2BAdheGx5RmVlCQBkAgULYXhseUZlZUxvYW4FDWF4bHlGZWVOb0xvYW4EDSR0MDI1Nzk2MjU4OTYDCQAAAgUHdG9rZW5JZAUDQUlkCQCUCgIJAGUCBQt0b2tlbkFtb3VudAUHYXhseUZlZQAACQCUCgIAAAkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlBARwbXRBCAUNJHQwMjU3OTYyNTg5NgJfMQQEcG10QggFDSR0MDI1Nzk2MjU4OTYCXzIEDSR0MDI1ODk5MjYwMDMJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAUGTk9fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQMc3Rha2VkQW1vdW50CAUNJHQwMjU4OTkyNjAwMwJfMQQCbmYIBQ0kdDAyNTg5OTI2MDAzAl8yBBNjdXJQb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABApzdGFrZWRMb2FuCQBrAwUMc3Rha2VkQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BAxzdGFrZWROb0xvYW4JAGUCBQxzdGFrZWRBbW91bnQFCnN0YWtlZExvYW4ED25ld0ludGVyZXN0TG9hbgMJAGYCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFE2N1clBvb2xJbnRlcmVzdExvYW4JAGsDBQpzdGFrZWRMb2FuBQdTQ0FMRTEwBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAQRbmV3SW50ZXJlc3ROb0xvYW4DCQBmAgkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQBkAgUVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQBrAwUMc3Rha2VkTm9Mb2FuBQdTQ0FMRTEwCQBlAgUQdG90YWxTaGFyZUFtb3VudAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgUPbmV3SW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4FEW5ld0ludGVyZXN0Tm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGQCBRB0b3RhbFNoYXJlQW1vdW50BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGQCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4FCnN0YWtlZExvYW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFB2F4bHlGZWUJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuSWQFA25pbAkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQFA25pbAEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAR1c2VyBHBvb2wFcG9zSWQIYm9ycm93ZWQEB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24EDHVzZXJJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QEDHBvb2xJbnRlcmVzdAMFCGJvcnJvd2VkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4JAGQCBQdwQW1vdW50CQBrAwUHcEFtb3VudAkAZQIFDHBvb2xJbnRlcmVzdAUMdXNlckludGVyZXN0BQdTQ0FMRTEwAQ9jYWxjU3RvcExvc3NGZWUEBHBvb2wKaXNCb3Jyb3dlZAhzdG9wTG9zcwpscFdpdGhkcmF3BAdmZWVUeXBlAwUKaXNCb3Jyb3dlZAUNU1RPUExPU1NfTE9BTgUUU1RPUExPU1NfRkVFX05PX0xPQU4DBQhzdG9wTG9zcwkAawMFCmxwV2l0aGRyYXcJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgAAAQ53aXRoZHJhd1RvVXNlcgQEdXNlcgRwb29sBXBvc0lkCHN0b3BMb3NzBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBAppc0JvcnJvd2VkCQBmAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AAAAAAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUFcG9zSWQFCmlzQm9ycm93ZWQEDnBvb2xUb3RhbFNoYXJlCQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBBJwb29sVG90YWxTaGFyZUxvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQIdXNlckFkZHIJAQdBZGRyZXNzAQkA2QQBBQR1c2VyBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDAyODUzMjI4NjA0CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEBmlkQVN0cggFDSR0MDI4NTMyMjg2MDQCXzEEBmlkQlN0cggFDSR0MDI4NTMyMjg2MDQCXzIEBGJhbEEIBQ0kdDAyODUzMjI4NjA0Al8zBARiYWxCCAUNJHQwMjg1MzIyODYwNAJfNAQHc2hhcmVJZAgFDSR0MDI4NTMyMjg2MDQCXzUEDSR0MDI4NjA3Mjg2NzQJAJQKAgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRBU3RyCQEOYXNzZXRJZEZyb21TdHIBBQZpZEJTdHIEA2lkQQgFDSR0MDI4NjA3Mjg2NzQCXzEEA2lkQggFDSR0MDI4NjA3Mjg2NzQCXzIEC3N0b3BMb3NzRmVlCQEPY2FsY1N0b3BMb3NzRmVlBAUEcG9vbAUKaXNCb3Jyb3dlZAUIc3RvcExvc3MFD3VzZXJDYW5XaXRoZHJhdwQLY0JhbEFCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQtjQmFsQUJlZm9yZQULY0JhbEFCZWZvcmUEC2NCYWxCQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgULY0JhbEJCZWZvcmUFC2NCYWxCQmVmb3JlBANpbnYDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQtzdG9wTG9zc0ZlZQMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICCHdpdGhkcmF3CQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEA2ludgkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkCQBkAgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIDZ2V0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQKY0JhbEFBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFCmNCYWxBQWZ0ZXIFCmNCYWxBQWZ0ZXIECmNCYWxCQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQpjQmFsQkFmdGVyBQpjQmFsQkFmdGVyBA0kdDAyOTM2OTI5NDU4CQCUCgIJAGUCBQpjQmFsQUFmdGVyBQtjQmFsQUJlZm9yZQkAZQIFCmNCYWxCQWZ0ZXIFC2NCYWxCQmVmb3JlBA10b2tlbnNBbW91bnRBCAUNJHQwMjkzNjkyOTQ1OAJfMQQNdG9rZW5zQW1vdW50QggFDSR0MDI5MzY5Mjk0NTgCXzIEDSR0MDI5NDYxMzA2OTcDBQppc0JvcnJvd2VkBAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QQcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUGaWRCU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QgcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUGaWRBU3RyBQZpZEJTdHIJAGUCBQRiYWxBBQ10b2tlbnNBbW91bnRBCQBlAgUEYmFsQgUNdG9rZW5zQW1vdW50QgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQFA25pbAMJAAACBQVleEludgUFZXhJbnYED2NCYWxBQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFD2NCYWxBQWZ0ZXJSZXBheQUPY0JhbEFBZnRlclJlcGF5BA9jQmFsQkFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQ9jQmFsQkFmdGVyUmVwYXkFD2NCYWxCQWZ0ZXJSZXBheQQLY2xvc2VEYnRJbnYDCQBmAgUEZGVidAAACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACCHJlcGF5Rm9yCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQtib3Jyb3dBc3NldAUEZGVidAUDbmlsAAADCQAAAgULY2xvc2VEYnRJbnYFC2Nsb3NlRGJ0SW52AwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEFTdHIJAJQKAgkAZQIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlBQRkZWJ0CQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQkAlAoCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQkAZQIJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlBQRkZWJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFDXRva2Vuc0Ftb3VudEEFDXRva2Vuc0Ftb3VudEIEB3RvVXNlckEIBQ0kdDAyOTQ2MTMwNjk3Al8xBAd0b1VzZXJCCAUNJHQwMjk0NjEzMDY5NwJfMgQUcG9vbFRvdGFsTG9hbkVudHJpZXMDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgkAZQIFEnBvb2xUb3RhbFNoYXJlTG9hbgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQUDbmlsBQNuaWwEB2VudHJpZXMJAM4IAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBlAgkAZQIFDnBvb2xUb3RhbFNoYXJlBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCHVzZXJBZGRyBQd0b1VzZXJBBQNpZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFB3RvVXNlckIFA2lkQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAULc3RvcExvc3NGZWUJANkEAQUHc2hhcmVJZAUDbmlsBRRwb29sVG90YWxMb2FuRW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUGaWRBU3RyBQZpZEJTdHIFB3NoYXJlSWQFA25pbAkAlAoCBQdlbnRyaWVzCQDMCAIFB3RvVXNlckEJAMwIAgUHdG9Vc2VyQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxwYXJzZVJlcXVlc3QBCXJlcXVlc3RJZAQHcmVxdWVzdAkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQJAKwCAgITTm8gcmVxdWVzdCB3aXRoIGlkIAUJcmVxdWVzdElkAgEsBAR1c2VyCQCRAwIFB3JlcXVlc3QAAAQEcG9vbAkAkQMCBQdyZXF1ZXN0AAEEBHBtdEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAIEA0FJZAkAkQMCBQdyZXF1ZXN0AAMEBHBtdEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAQEA0JJZAkAkQMCBQdyZXF1ZXN0AAUEBGJhbEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAYEBGJhbEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAcEB3NoYXJlSWQJAJEDAgUHcmVxdWVzdAAIBAdid0Fzc2V0CQCRAwIFB3JlcXVlc3QACQQIYndBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAoJAJ0KCwUEdXNlcgUEcG9vbAUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFB2J3QXNzZXQFCGJ3QW1vdW50ARBjYWxjQm9ycm93QW1vdW50BgRwbXRBBHBtdEIDYUlkA2JJZAhsZXZlcmFnZQhib3Jyb3dJZAMDCQECIT0CBQhib3Jyb3dJZAUDYUlkCQECIT0CBQhib3Jyb3dJZAUDYklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQHZFByaWNlQQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2FJZAUOa1ByaWNlSW5PcmFjbGUEB2RQcmljZUIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNiSWQFDmtQcmljZUluT3JhY2xlBAZkZWNQckEJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBAZkZWNQckIJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBAxwYXlkSW5Eb2xsYXIJAGQCCQBrAwUHZFByaWNlQQUEcG10QQUGZGVjUHJBCQBrAwUHZFByaWNlQgUEcG10QgUGZGVjUHJCBA0kdDAzMjY3OTMyNzc2AwkAAAIFCGJvcnJvd0lkBQNhSWQJAJQKAgUHZFByaWNlQQUGZGVjUHJBCQCUCgIFB2RQcmljZUIFBmRlY1ByQgQLYm9ycm93UHJpY2UIBQ0kdDAzMjY3OTMyNzc2Al8xBAtib3Jyb3dEZWNQcggFDSR0MDMyNjc5MzI3NzYCXzIJAGsDCQBrAwUMcGF5ZEluRG9sbGFyCQBlAgUIbGV2ZXJhZ2UAZABkBQtib3Jyb3dEZWNQcgULYm9ycm93UHJpY2UBEnBhcnNlUmVwbGVuaXNoUG10cwMEcG10cwNBSWQDQklkAwkAAAIJAJADAQUEcG10cwACAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNBSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEEDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwABB2Fzc2V0SWQFA0JJZAkAAgECFVdyb25nIHBheW1lbnQgYXNzZXQgQgkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50CAkAkQMCBQRwbXRzAAEGYW1vdW50AwkAAAIJAJADAQUEcG10cwABAwkAAAIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQCUCgIICQCRAwIFBHBtdHMAAAZhbW91bnQAAAMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0JJZAkAlAoCAAAICQCRAwIFBHBtdHMAAAZhbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50CQACAQIcT25lIG9yIHR3byBwYXltZW50cyBleHBlY3RlZAEPY2FsY1ByaWNlSW1wYWN0BARiYWxBBGJhbEIHbmV3QmFsQQduZXdCYWxCBANwcmkJAGgCCQBlAgUGU0NBTEU4CQBrAwkAawMFBGJhbEIFBlNDQUxFOAUEYmFsQQUGU0NBTEU4CQBrAwUHbmV3QmFsQgUGU0NBTEU4BQduZXdCYWxBAGQDCQBmAgAABQNwcmkJAGgCBQNwcmkA////////////AQUDcHJpARFjbGFpbUFuZENoZWNrQW1udAUEcG9vbAVwVHlwZQVjbGFpbQZhbW91bnQGY2hhbmdlBA0kdDAzMzc3NjM0MDM4AwUFY2xhaW0JAQtjbGFpbUZhcm1lZAIFBXBUeXBlBQRwb29sBAxjbGFpbWVkQXNzZXQDCQAAAgUFcFR5cGUFB1NGX1BPT0wFBlNXT1BJRAMJAAACBQVwVHlwZQUHV1hfUE9PTAUEV1hJRAkBD3Vua25vd25Qb29sVHlwZQAJAJQKAgUGYW1vdW50BQxjbGFpbWVkQXNzZXQDCQAAAgUNJHQwMzM3NzYzNDAzOAUNJHQwMzM3NzYzNDAzOAQKY2xhaW1Bc3NldAgFDSR0MDMzNzc2MzQwMzgCXzIEC2NsYWltQW1vdW50CAUNJHQwMzM3NzYzNDAzOAJfMQQDYmFsCQEOYWNjb3VudEJhbGFuY2UBBQpjbGFpbUFzc2V0AwkAAAIFA2JhbAUDYmFsAwkAZgIFBmFtb3VudAUDYmFsCQACAQIZVG8gYmlnIGFtb3VudCB0byBleGNoYW5nZQkAlAoCBQtjbGFpbUFtb3VudAUKY2xhaW1Bc3NldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhsBaQETZ2V0UG9vbEluZm9SRUFET05MWQEEcG9vbAQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAzNDQwNTM0NDk1CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDM0NDA1MzQ0OTUCXzEEA0JJZAgFDSR0MDM0NDA1MzQ0OTUCXzIEBGJhbEEIBQ0kdDAzNDQwNTM0NDk1Al8zBARiYWxCCAUNJHQwMzQ0MDUzNDQ5NQJfNAQHc2hhcmVJZAgFDSR0MDM0NDA1MzQ0OTUCXzUEC3NoYXJlU3VwcGx5CQEOZ2V0U2hhcmVTdXBwbHkDBQhwb29sQWRkcgUFcFR5cGUFB3NoYXJlSWQJAJQKAgUDbmlsCQCYCgYFA0FJZAUDQklkBQdzaGFyZUlkBQRiYWxBBQRiYWxCBQtzaGFyZVN1cHBseQFpARpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQEHc2hhcmVJZAQLc2hhcmVQcmljZXMJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAkAlAoCBQNuaWwFC3NoYXJlUHJpY2VzAWkBImdldFVzZXJQb3NpdGlvblNoYXJlQW1vdW50UkVBRE9OTFkCBHVzZXIGcG9zTnVtBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAIQVW5rbm93biBwb3NpdGlvbgQMYm9ycm93QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUGcG9zTnVtCQBmAgUMYm9ycm93QW1vdW50AAAJAJQKAgUDbmlsBQ91c2VyQ2FuV2l0aGRyYXcBaQEXZ2V0VXNlclBvc2l0aW9uUkVBRE9OTFkDBHVzZXIFcG9vbHMGcG9zTnVtCgEHdXNlclBvcwIBYQRwb29sBA0kdDAzNTM2ODM1NDM4BQFhBAl3QW1vdW50c0EIBQ0kdDAzNTM2ODM1NDM4Al8xBAl3QW1vdW50c0IIBQ0kdDAzNTM2ODM1NDM4Al8yBAVkZWJ0cwgFDSR0MDM1MzY4MzU0MzgCXzMEC2VxV0Ftb3VudHNBCAUNJHQwMzUzNjgzNTQzOAJfNAQLZXFXQW1vdW50c0IIBQ0kdDAzNTM2ODM1NDM4Al81BAVpbmRleAgFDSR0MDM1MzY4MzU0MzgCXzYDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFDWtVc2VyUG9zaXRpb24JAJgKBgkAzQgCBQl3QW1vdW50c0EAAAkAzQgCBQl3QW1vdW50c0IAAAkAzQgCBQVkZWJ0cwAACQDNCAIFC2VxV0Ftb3VudHNBAAAJAM0IAgULZXFXQW1vdW50c0IAAAkAZAIFBWluZGV4AAEEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAzNTcxNzM1ODA3CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDM1NzE3MzU4MDcCXzEEA0JJZAgFDSR0MDM1NzE3MzU4MDcCXzIEBGJhbEEIBQ0kdDAzNTcxNzM1ODA3Al8zBARiYWxCCAUNJHQwMzU3MTczNTgwNwJfNAQHc2hhcmVJZAgFDSR0MDM1NzE3MzU4MDcCXzUEDGJvcnJvd0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRFrVXNlckJvcnJvd0Ftb3VudAAABA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sCQCRAwIFBnBvc051bQUFaW5kZXgJAGYCBQxib3Jyb3dBbW91bnQAAAQNJHQwMzYwMjMzNjE0MwkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcECHdBbW91bnRBCAUNJHQwMzYwMjMzNjE0MwJfMQQId0Ftb3VudEIIBQ0kdDAzNjAyMzM2MTQzAl8yAwkAZgIFDGJvcnJvd0Ftb3VudAAABAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAkAzAgCBQtib3Jyb3dBc3NldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFBGRlYnQFBGRlYnQEDWFtb3VudFRvR2V0RXgDAwkAAAIFC2JvcnJvd0Fzc2V0BQNBSWQJAGYCBQRkZWJ0BQh3QW1vdW50QQcJAGUCBQRkZWJ0BQh3QW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFA0JJZAkAZgIFBGRlYnQFCHdBbW91bnRCBwkAZQIFBGRlYnQFCHdBbW91bnRCAAAEC2Ftb3VudFRvUGF5AwkAZgIFDWFtb3VudFRvR2V0RXgAAAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQCZXgJARFjYWxjQW1vdW50VG9QYXlTRgcFBHBvb2wFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAgFAmV4Al8yAwkAAAIFBXBUeXBlBQdXWF9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIJAQ91bmtub3duUG9vbFR5cGUAAAAEDSR0MDM3MDU1MzcyNzQDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAlAoCCQBlAgkAZAIFCHdBbW91bnRBBQ1hbW91bnRUb0dldEV4BQRkZWJ0CQBlAgUId0Ftb3VudEIFC2Ftb3VudFRvUGF5CQCUCgIJAGUCBQh3QW1vdW50QQULYW1vdW50VG9QYXkJAGUCCQBkAgUId0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFBGRlYnQECmVxV0Ftb3VudEEIBQ0kdDAzNzA1NTM3Mjc0Al8xBAplcVdBbW91bnRCCAUNJHQwMzcwNTUzNzI3NAJfMgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAzQgCBQVkZWJ0cwUEZGVidAkAzQgCBQtlcVdBbW91bnRzQQUKZXFXQW1vdW50QQkAzQgCBQtlcVdBbW91bnRzQgUKZXFXQW1vdW50QgkAZAIFBWluZGV4AAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJgKBgkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIFBWRlYnRzCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAZAIFBWluZGV4AAEEDSR0MDM3NTI5Mzc2NDAKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCYCgYFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB3VzZXJQb3MCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQJd0Ftb3VudHNBCAUNJHQwMzc1MjkzNzY0MAJfMQQJd0Ftb3VudHNCCAUNJHQwMzc1MjkzNzY0MAJfMgQFZGVidHMIBQ0kdDAzNzUyOTM3NjQwAl8zBAtlcVdBbW91bnRzQQgFDSR0MDM3NTI5Mzc2NDACXzQEC2VxV0Ftb3VudHNCCAUNJHQwMzc1MjkzNzY0MAJfNQkAlAoCBQNuaWwJAJcKBQUJd0Ftb3VudHNBBQl3QW1vdW50c0IFBWRlYnRzBQtlcVdBbW91bnRzQQULZXFXQW1vdW50c0IBaQEJcmVwbGVuaXNoAwRwb29sCGxldmVyYWdlCGJvcnJvd0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDAwkAZgIAZAUIbGV2ZXJhZ2UGCQBmAgUIbGV2ZXJhZ2UArAIJAAIBAh9MZXZlcmFnZSBjYW4ndCBiZSA8MTAwIGFuZCA+MzAwAwMJAQEhAQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhbkJvcnJvdwkAZgIFCGxldmVyYWdlAGQHCQACAQIdWW91IGNhbid0IGJvcnJvdyBpbiB0aGlzIHBvb2wEDSR0MDM4MjM4MzgzMjgJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwMzgyMzgzODMyOAJfMQQDQklkCAUNJHQwMzgyMzgzODMyOAJfMgQEYmFsQQgFDSR0MDM4MjM4MzgzMjgCXzMEBGJhbEIIBQ0kdDAzODIzODM4MzI4Al80BAdzaGFyZUlkCAUNJHQwMzgyMzgzODMyOAJfNQMDCQECIT0CBQhib3Jyb3dJZAUDQUlkCQECIT0CBQhib3Jyb3dJZAUDQklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQNJHQwMzg0MDkzODQ2OAkBEnBhcnNlUmVwbGVuaXNoUG10cwMIBQFpCHBheW1lbnRzBQNBSWQFA0JJZAQEcG10QQgFDSR0MDM4NDA5Mzg0NjgCXzEEBHBtdEIIBQ0kdDAzODQwOTM4NDY4Al8yBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQJbmV3UG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgMJAGYCBQhsZXZlcmFnZQBkBAxib3Jyb3dBbW91bnQJARBjYWxjQm9ycm93QW1vdW50BgUEcG10QQUEcG10QgUDQUlkBQNCSWQFCGxldmVyYWdlBQhib3Jyb3dJZAQHcmVxdWVzdAkAuQkCCQDMCAIFBHVzZXIJAMwIAgUEcG9vbAkAzAgCCQCkAwEFBHBtdEEJAMwIAgUDQUlkCQDMCAIJAKQDAQUEcG10QgkAzAgCBQNCSWQJAMwIAgkApAMBBQRiYWxBCQDMCAIJAKQDAQUEYmFsQgkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIJAKQDAQUMYm9ycm93QW1vdW50BQNuaWwCASwEDG5ld1JlcXVlc3RJZAoAAUAJAPwHBAUEdGhpcwIQY3JlYXRlTmV3UmVxdWVzdAkAzAgCBQdyZXF1ZXN0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUMbmV3UmVxdWVzdElkBQxuZXdSZXF1ZXN0SWQEBGFyZ3MJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgUMYm9ycm93QW1vdW50CQDMCAIJAKUIAQUEdGhpcwkAzAgCAhFyZXBsZW5pc2hGcm9tTGFuZAkAzAgCCQCkAwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUMbmV3UmVxdWVzdElkAhhDYW4ndCBjcmVhdGUgbmV3IHJlcXVlc3QFA25pbAQDaW52CQD9BwQJAQ5nZXRMZW5kU3J2QWRkcgACDWZsYXNoUG9zaXRpb24FBGFyZ3MFA25pbAMJAAACBQNpbnYFA2ludgQKdXNlclN0YWtlZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtBQ1rVXNlclBvc2l0aW9uBA0kdDAzOTQ1NzM5NTUxCQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDAzOTQ1NzM5NTUxBQ0kdDAzOTQ1NzM5NTUxBAduZXdCYWxCCAUNJHQwMzk0NTczOTU1MQJfMgQHbmV3QmFsQQgFDSR0MDM5NDU3Mzk1NTECXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwMzk2MjEzOTczNgkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDM5NjIxMzk3MzYCXzEECHdBbW91bnRCCAUNJHQwMzk2MjEzOTczNgJfMgkAlAoCBQNuaWwJAMwIAgUIcHJJbXBhY3QJAMwIAgUId0Ftb3VudEEJAMwIAgUId0Ftb3VudEIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMzk3ODkzOTkwNAkBD3JlcGxlbmlzaEJ5VHlwZQoFBXBUeXBlBQRwb29sBQtOT19MT0FOX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQDCQAAAgUNJHQwMzk3ODkzOTkwNAUNJHQwMzk3ODkzOTkwNAQHYXhseUZlZQgFDSR0MDM5Nzg5Mzk5MDQCXzIECnVzZXJTdGFrZWQIBQ0kdDAzOTc4OTM5OTA0Al8xBA0kdDAzOTkxMDQwMDA0CQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDAzOTkxMDQwMDA0BQ0kdDAzOTkxMDQwMDA0BAduZXdCYWxCCAUNJHQwMzk5MTA0MDAwNAJfMgQHbmV3QmFsQQgFDSR0MDM5OTEwNDAwMDQCXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwNDAwNzQ0MDE4OQkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDQwMDc0NDAxODkCXzEECHdBbW91bnRCCAUNJHQwNDAwNzQ0MDE4OQJfMgkAlAoCCQDOCAIJARByZXBsZW5pc2hFbnRyaWVzCAUEcG9vbAUEdXNlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUJbmV3UG9zTnVtBQdzaGFyZUlkBQVwVHlwZQcJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcCBHBvb2wFcG9zSWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQRwb29sBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAkBDndpdGhkcmF3VG9Vc2VyBAkApQgBCAUBaQZjYWxsZXIFBHBvb2wJAKQDAQUFcG9zSWQHAWkBFGNyZWF0ZVVwZGF0ZVN0b3BMb3NzBAVwb3NJZAZwb29sSWQHYXNzZXRJZAVwcmljZQkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABBB0b2tlbk9yYWNsZVByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUGcG9vbElkAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQZwb29sSWQFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGcG9vbElkAgFfCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAAgECGlRoZXJlIGFyZSBubyB1c2VyIHBvc2l0aW9uAwkAZwIAAAUFcHJpY2UJAAIBAhxQcmljZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIFBXByaWNlBRB0b2tlbk9yYWNsZVByaWNlCQACAQIrUHJpY2UgbXVzdCBiZSBsZXNzIHRoYW4gY3VycmVudCB0b2tlbiBwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQVwcmljZQUDbmlsAWkBDmRlbGV0ZVN0b3BMb3NzAwVwb3NJZAZwb29sSWQHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBnBvb2xJZAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUGcG9vbElkBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzCQACAQIITm8gZW50cnkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQNuaWwBaQEEaW5pdA0MbW9uZXlCb3hBZGRyDXNmRmFybWluZ0FkZHIIbGVuZEFkZHIPcHJpY2VPcmFjbGVBZGRyEGtlZXBlckV4Q29udHJhY3QOd3hTd2FwQ29udHJhY3QLc3dvcEFzc2V0SWQJd3hBc3NldElkDm9wZXJhdG9yUHViS2V5Emdyb3VwMUFkbWluMVB1YktleRJncm91cDFBZG1pbjJQdWJLZXkSZ3JvdXAyQWRtaW4xUHViS2V5Emdyb3VwMkFkbWluMlB1YktleQkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpAwkBCWlzRGVmaW5lZAEJAKIIAQUPa09wZXJhdG9yQ2FsbFBLCQACAQIOQWxyZWFkeSBpbml0ZWQDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFDG1vbmV5Qm94QWRkcgkAAgECI21vbmV5Qm94QWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQ1zZkZhcm1pbmdBZGRyCQACAQIkc2ZGYXJtaW5nQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQhsZW5kQWRkcgkAAgECH2xlbmRBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFD3ByaWNlT3JhY2xlQWRkcgkAAgECJnByaWNlT3JhY2xlQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBRBrZWVwZXJFeENvbnRyYWN0CQACAQIna2VlcGVyRXhDb250cmFjdCBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFC3N3b3BBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQEBIQEJAQlpc0RlZmluZWQBCQDsBwEJANkEAQUJd3hBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQECIT0CCQDIAQEJANkEAQUOb3BlcmF0b3JQdWJLZXkAIAkAAgECHW9wZXJhdG9yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtNb25leUJveAUMbW9uZXlCb3hBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDmtTRkZhcm1pbmdBZGRyBQ1zZkZhcm1pbmdBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtMZW5kU2VydmljZQUIbGVuZEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa1ByaWNlT3JhY2xlBQ9wcmljZU9yYWNsZUFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa0V4Q29udHJhY3QFEGtlZXBlckV4Q29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa1d4U3dhcENvbnRyYWN0BQ53eFN3YXBDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBQdrU3dvcElkBQtzd29wQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQVrV3hJZAUJd3hBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tPcGVyYXRvckNhbGxQSwUOb3BlcmF0b3JQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMVBLBRJncm91cDFBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMlBLBRJncm91cDFBZG1pbjJQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMVBLBRJncm91cDJBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMlBLBRJncm91cDJBZG1pbjJQdWJLZXkFA25pbAFpARBjcmVhdGVOZXdSZXF1ZXN0AQZwYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQMbmV3UmVxdWVzdElkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQxrUmVxdWVzdEl0ZXIAAAABCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCkAwEFDG5ld1JlcXVlc3RJZAUKa1JlcXVlc3RJZAUGcGFyYW1zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrUmVxdWVzdEl0ZXIFDG5ld1JlcXVlc3RJZAUDbmlsBQxuZXdSZXF1ZXN0SWQBaQERcmVwbGVuaXNoRnJvbUxhbmQBCXJlcXVlc3RJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBA0kdDA0NTAyODQ1MTMyCQEMcGFyc2VSZXF1ZXN0AQUJcmVxdWVzdElkBAR1c2VyCAUNJHQwNDUwMjg0NTEzMgJfMQQEcG9vbAgFDSR0MDQ1MDI4NDUxMzICXzIEBHBtdEEIBQ0kdDA0NTAyODQ1MTMyAl8zBANBSWQIBQ0kdDA0NTAyODQ1MTMyAl80BARwbXRCCAUNJHQwNDUwMjg0NTEzMgJfNQQDQklkCAUNJHQwNDUwMjg0NTEzMgJfNgQEYmFsQQgFDSR0MDQ1MDI4NDUxMzICXzcEBGJhbEIIBQ0kdDA0NTAyODQ1MTMyAl84BAdzaGFyZUlkCAUNJHQwNDUwMjg0NTEzMgJfOQQHYndBc3NldAgFDSR0MDQ1MDI4NDUxMzIDXzEwBAhid0Ftb3VudAgFDSR0MDQ1MDI4NDUxMzIDXzExAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQISV3JvbmcgcGF5bWVudCBzaXplAwMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFB2J3QXNzZXQGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUIYndBbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50BA0kdDA0NTMyMjQ1NDIyAwkAAAIFA0FJZAUHYndBc3NldAkAlAoCCQBkAgUEcG10QQUIYndBbW91bnQFBHBtdEIJAJQKAgUEcG10QQkAZAIFBHBtdEIFCGJ3QW1vdW50BAdwbXRBbGxBCAUNJHQwNDUzMjI0NTQyMgJfMQQHcG10QWxsQggFDSR0MDQ1MzIyNDU0MjICXzIEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDA0NTUwNDQ1NjE5CQEPcmVwbGVuaXNoQnlUeXBlCgUFcFR5cGUFBHBvb2wFCExPQU5fRkVFBQdwbXRBbGxBBQNBSWQFB3BtdEFsbEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQKdXNlclN0YWtlZAgFDSR0MDQ1NTA0NDU2MTkCXzEEB2F4bHlGZWUIBQ0kdDA0NTUwNDQ1NjE5Al8yBAZwb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyBA1ib3Jyb3dFbnRyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BQhid0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEmtVc2VyQm9ycm93QXNzZXRJZAUHYndBc3NldAUDbmlsBAdlbnRyaWVzCQEQcmVwbGVuaXNoRW50cmllcwgFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFBnBvc051bQUHc2hhcmVJZAUFcFR5cGUGBA0kdDA0NTk3OTQ2MDk0CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwNDU5Nzk0NjA5NAJfMQQId0Ftb3VudEIIBQ0kdDA0NTk3OTQ2MDk0Al8yCQCUCgIJAM0IAgkAzggCCQDOCAIFB2VudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsBQ1ib3Jyb3dFbnRyaWVzCQELRGVsZXRlRW50cnkBCQCsAgIFCXJlcXVlc3RJZAUKa1JlcXVlc3RJZAUKdXNlclN0YWtlZAFpAQlsaXF1aWRhdGUDBHVzZXIFcG9zSWQPbGlxdWlkYXRlQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wCC25vIHBvc2l0aW9uBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwNDY2MTU0NjcwNQkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDA0NjYxNTQ2NzA1Al8xBANCSWQIBQ0kdDA0NjYxNTQ2NzA1Al8yBARiYWxBCAUNJHQwNDY2MTU0NjcwNQJfMwQEYmFsQggFDSR0MDQ2NjE1NDY3MDUCXzQEB3NoYXJlSWQIBQ0kdDA0NjYxNTQ2NzA1Al81BAZhbW91bnQJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPbGlxdWlkYXRlQW1vdW50BAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUFcG9zSWQJAGYCBQxib3Jyb3dBbW91bnQAAAMJAGYCBQ9saXF1aWRhdGVBbW91bnQFD3VzZXJDYW5XaXRoZHJhdwkAAgECJ1lvdSBjYW4ndCBsaXF1aWRhdGUgbW9yZSB0aGFuIHVzZXIgaGF2ZQMJAAACBQxib3Jyb3dBbW91bnQAAAkAAgECK1lvdSBjYW4ndCBsaXF1aWRhdGUgcG9zaXRpb24gd2l0aG91dCBib3Jyb3cJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQBlAgUPdXNlckNhbldpdGhkcmF3BQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQJANkEAQUHc2hhcmVJZAUDbmlsAWkBCHN0b3BMb3NzBAR1c2VyBXBvc0lkBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBA1zdG9wTG9zc1ByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzAghObyBlbnRyeQMJAGYCBRB0b2tlbk9yYWNsZVByaWNlBQ1zdG9wTG9zc1ByaWNlCQACAQIjVG9rZW4gcHJpY2UgZ3JlYXRlciBzdG9wIGxvc3MgcHJpY2UEA3JlcwkBDndpdGhkcmF3VG9Vc2VyBAUEdXNlcgUEcG9vbAkApAMBBQVwb3NJZAYJAJQKAgkAzQgCCAUDcmVzAl8xCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQCAV8FBHBvb2wCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MIBQNyZXMCXzIBaQEMY2FwaXRhbGl6ZUV4BQRwb29sBXJvdXRlCXRva2VuVG9JZBBhbW91bnRUb0V4Y2hhbmdlBWNsYWltCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQGY2hhbmdlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UAAAQNJHQwNDg2NzU0ODc3NwkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRBhbW91bnRUb0V4Y2hhbmdlBQZjaGFuZ2UDCQAAAgUNJHQwNDg2NzU0ODc3NwUNJHQwNDg2NzU0ODc3NwQMY2xhaW1lZEFzc2V0CAUNJHQwNDg2NzU0ODc3NwJfMgQNY2xhaW1lZEFtb3VudAgFDSR0MDQ4Njc1NDg3NzcCXzEEBXJBcmdzCQC1CQIFBXJvdXRlAgJfXwQPZXhjaGFuZ2VkQW1vdW50AwkAAAIJAJEDAgUFckFyZ3MAAAIQZGlyZWN0U3dvcGZpQ1BNTQkBEGRpcmVjdFN3b3BmaUNQTU0CBQVyQXJncwUJdG9rZW5Ub0lkAwkAAAIJAJEDAgUFckFyZ3MAAAINcm91dGluZ1N3b3BmaQkBE2RpcmVjdFJvdXRpbmdTd29wZmkCBQVyQXJncwUJdG9rZW5Ub0lkCQACAQILV3Jvbmcgcm91dGUDCQAAAgUPZXhjaGFuZ2VkQW1vdW50BQ9leGNoYW5nZWRBbW91bnQECW5ld0NoYW5nZQkAZQIJAGQCBQ1jbGFpbWVkQW1vdW50BQZjaGFuZ2UFEGFtb3VudFRvRXhjaGFuZ2UEC2NoYW5nZUVudHJ5AwkAZwIFCW5ld0NoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlBQluZXdDaGFuZ2UFA25pbAUDbmlsCQDOCAIJAQpjYXBpdGFsaXplBAUEcG9vbAUFcFR5cGUFCXRva2VuVG9JZAUPZXhjaGFuZ2VkQW1vdW50BQtjaGFuZ2VFbnRyeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jYXBpdGFsaXplTm9FeAMEcG9vbAVjbGFpbRFhbW91bnRGcm9tQmFsYW5jZQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wEDSR0MDQ5NDYxNDk1NTkJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQURYW1vdW50RnJvbUJhbGFuY2UAAAMJAAACBQ0kdDA0OTQ2MTQ5NTU5BQ0kdDA0OTQ2MTQ5NTU5BAxjbGFpbWVkQXNzZXQIBQ0kdDA0OTQ2MTQ5NTU5Al8yBA1jbGFpbWVkQW1vdW50CAUNJHQwNDk0NjE0OTU1OQJfMQkBCmNhcGl0YWxpemUEBQRwb29sBQVwVHlwZQkBDGFzc2V0SWRUb1N0cgEFDGNsYWltZWRBc3NldAkAZAIFDWNsYWltZWRBbW91bnQFEWFtb3VudEZyb21CYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2luaXROZXdQb29sCgR0eXBlCHBvb2xUeXBlCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgljYW5Cb3Jyb3cJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDAwkBAiE9AgUEdHlwZQUHU0ZfUE9PTAkBAiE9AgUEdHlwZQUHV1hfUE9PTAcJAAIBAgpXcm9uZyB0eXBlAwMJAQIhPQIFCHBvb2xUeXBlBQRDUE1NCQECIT0CBQhwb29sVHlwZQUERkxBVAcJAAIBAg9Xcm9uZyBwb29sIHR5cGUEDSR0MDUwMDgwNTAxNzQJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQhwb29sQWRkcgUEdHlwZQQDYUlkCAUNJHQwNTAwODA1MDE3NAJfMQQDYklkCAUNJHQwNTAwODA1MDE3NAJfMgQEYUJhbAgFDSR0MDUwMDgwNTAxNzQCXzMEBGJCYWwIBQ0kdDA1MDA4MDUwMTc0Al80BAdzaGFyZUlkCAUNJHQwNTAwODA1MDE3NAJfNQMJAGYCAAAFC2luRmVlTm9Mb2FuCQACAQIiaW5GZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCWluRmVlTG9hbgkAAgECIGluRmVlTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUMY2FwRmVlTm9Mb2FuCQACAQIjY2FwRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQ5jYXBGZWVXaXRoTG9hbgkAAgECJWNhcEZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRFzdG9wbG9zc0ZlZU5vTG9hbgkAAgECKHN0b3Bsb3NzRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQACAQIqc3RvcGxvc3NGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRVrQXhseUluRmVlV2l0aG91dExvYW4FC2luRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRJrQXhseUluRmVlV2l0aExvYW4FCWluRmVlTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa0F4bHlOb0xvYW5DYXBGZWUFDGNhcEZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa0F4bHlXaXRoTG9hbkNhcEZlZQUOY2FwRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUFEXN0b3Bsb3NzRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRRrQXhseVN0b3BMb3NzTG9hbkZlZQUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa1Bvb2xJbnRlcmVzdExvYW4AAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIcG9vbEFkZHIFCWtQb29sVHlwZQUIcG9vbFR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sBQhwb29sQWRkcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQhwb29sQWRkcgUOa1Bvb2xDYW5Cb3Jyb3cFCWNhbkJvcnJvdwUDbmlsAWkBDnVwZGF0ZVBvb2xGZWVzBwhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyCQACAQkArAICAhpDYW4ndCBmaW5kIHBvb2wgd2l0aCBhZGRyIAUIcG9vbEFkZHIDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4FA25pbAFpAQhhY3RpdmF0ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQITZEFwcCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYFA25pbAFpAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhVkQXBwIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHBQNuaWwBaQEQYWN0aXZhdGVGb3JVc2VycwAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh1kQXBwIGFscmVhZHkgYWN0aXZlIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBgUDbmlsAWkBEHNodXRkb3duRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh9kQXBwIGFscmVhZHkgc2h1dGRvd24gZm9yIHVzZXJzCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrQWN0aXZlVXNlcnMHBQNuaWwBaQEKYWN0aXZhdGVTRgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIVU1dPUEZJIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIXU1dPUEZJIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gHBQNuaWwBaQEKYWN0aXZhdGVXWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIRV1ggYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGBQNuaWwBaQEKc2h1dGRvd25XWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhNXWCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBDGFjdGl2YXRlUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhNQb29sIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgUDbmlsAWkBDHNodXRkb3duUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgkAAgECFVBvb2wgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQcFA25pbAB0cJYS", "height": 2805182, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DSF66GStJe5vyjV8emZZXmJMmJsMeG52mGBqK5ABjmrd Next: 4UTFAedCYskK15BEPCtDcX6UhYyJtqYyvd5fe3NAzfPH Diff:
OldNewDifferences
645645
646646
647647 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
648- let $t01912019584 = if ((pType == SF_POOL))
648+ let $t01912020322 = if ((pType == SF_POOL))
649649 then {
650650 let inv = {
651651 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
668668 else throw("Strict value is not equal to itself.")
669669 }
670670 else if ((pType == WX_POOL))
671- then {
672- let inv = split({
673- let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
674- if ($isInstanceOf(@, "String"))
675- then @
676- else throw(($getType(@) + " couldn't be cast to String"))
677- }, "__")
678- if ((inv == inv))
679- then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
680- else throw("Strict value is not equal to itself.")
681- }
671+ then if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
672+ then {
673+ let inv = invoke(poolAddr, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
674+ if ((inv == inv))
675+ then {
676+ let $t01958020077 = match inv {
677+ case _ =>
678+ if (if (if ($isInstanceOf($match0._1, "Int"))
679+ then if ($isInstanceOf($match0._2, "Int"))
680+ then if ($isInstanceOf($match0._5, "Int"))
681+ then if ($isInstanceOf($match0._6, "Int"))
682+ then if ($isInstanceOf($match0._7, "Int"))
683+ then if ($isInstanceOf($match0._8, "String"))
684+ then $isInstanceOf($match0._9, "String")
685+ else false
686+ else false
687+ else false
688+ else false
689+ else false
690+ else false)
691+ then (size($match0) == 10)
692+ else false)
693+ then {
694+ let outAmAmt = $match0._1
695+ let outPrAmt = $match0._2
696+ let amBalance = $match0._5
697+ let prBalance = $match0._6
698+ let lpEmission = $match0._7
699+ let curPrice = $match0._8
700+ let poolStatus = $match0._9
701+ $Tuple7(outAmAmt, outPrAmt, amBalance, prBalance, lpEmission, curPrice, poolStatus)
702+ }
703+ else throw("Couldn't cast types")
704+ }
705+ let outAmAmt = $t01958020077._1
706+ let outPrAmt = $t01958020077._2
707+ let amBalance = $t01958020077._3
708+ let prBalance = $t01958020077._4
709+ let lpEmission = $t01958020077._5
710+ let curPrice = $t01958020077._6
711+ let poolStatus = $t01958020077._7
712+ $Tuple2(outAmAmt, outPrAmt)
713+ }
714+ else throw("Strict value is not equal to itself.")
715+ }
716+ else {
717+ let inv = split({
718+ let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
719+ if ($isInstanceOf(@, "String"))
720+ then @
721+ else throw(($getType(@) + " couldn't be cast to String"))
722+ }, "__")
723+ if ((inv == inv))
724+ then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
725+ else throw("Strict value is not equal to itself.")
726+ }
682727 else unknownPoolType()
683- let amountA = $t01912019584._1
684- let amountB = $t01912019584._2
728+ let amountA = $t01912020322._1
729+ let amountB = $t01912020322._2
685730 $Tuple2(amountA, amountB)
686731 }
687732
703748 }
704749 else if ((pType == WX_POOL))
705750 then {
706- let $t01995220031 = getWXPoolData(addressFromStringValue(pool))
707- let aId = $t01995220031._1
708- let bId = $t01995220031._2
709- let aBal = $t01995220031._3
710- let bBal = $t01995220031._4
711- let lpId = $t01995220031._5
751+ let $t02069020769 = getWXPoolData(addressFromStringValue(pool))
752+ let aId = $t02069020769._1
753+ let bId = $t02069020769._2
754+ let aBal = $t02069020769._3
755+ let bBal = $t02069020769._4
756+ let lpId = $t02069020769._5
712757 let balBefore = accountBalance(WXID)
713758 if ((balBefore == balBefore))
714759 then {
730775 if ((lpBalanceBefore == lpBalanceBefore))
731776 then {
732777 let poolAddr = addressFromStringValue(pool)
733- let $t02062921045 = if (if ((pmtA > 0))
778+ let $t02136721783 = if (if ((pmtA > 0))
734779 then (pmtB > 0)
735780 else false)
736781 then {
737- let $t02069520811 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
738- let pmtInA = $t02069520811._1
739- let pmtInB = $t02069520811._2
740- let change = $t02069520811._3
741- let changeId = $t02069520811._4
782+ let $t02143321549 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
783+ let pmtInA = $t02143321549._1
784+ let pmtInB = $t02143321549._2
785+ let change = $t02143321549._3
786+ let changeId = $t02143321549._4
742787 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
743788 if ((inv == inv))
744789 then $Tuple2(change, changeId)
749794 else if ((pmtB > 0))
750795 then $Tuple2(pmtB, bId)
751796 else throw("pmts must be > 0")
752- let change = $t02062921045._1
753- let changeId = $t02062921045._2
797+ let change = $t02136721783._1
798+ let changeId = $t02136721783._2
754799 let inv = if ((change > 0))
755800 then replenishOneTokenByType(poolAddr, pType, change, changeId)
756801 else nil
778823 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
779824 let totalAmount = getPoolTotalShare(pool)
780825 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
781- let $t02190222140 = if (withLoan)
826+ let $t02264022878 = if (withLoan)
782827 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
783828 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
784- let curPoolInterest = $t02190222140._1
785- let totalStakedWithLoan = $t02190222140._2
829+ let curPoolInterest = $t02264022878._1
830+ let totalStakedWithLoan = $t02264022878._2
786831 [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))]
787832 }
788833
863908
864909 func capitalize (pool,pType,tokenId,tokenAmount) = {
865910 let poolAddr = Address(fromBase58String(pool))
866- let $t02424724313 = getPoolData(poolAddr, pType)
867- let AId = $t02424724313._1
868- let BId = $t02424724313._2
869- let balA = $t02424724313._3
870- let balB = $t02424724313._4
871- let shareId = $t02424724313._5
911+ let $t02498525051 = getPoolData(poolAddr, pType)
912+ let AId = $t02498525051._1
913+ let BId = $t02498525051._2
914+ let balA = $t02498525051._3
915+ let balB = $t02498525051._4
916+ let shareId = $t02498525051._5
872917 if (if ((tokenId != AId))
873918 then (tokenId != BId)
874919 else false)
885930 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
886931 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
887932 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
888- let $t02505825158 = if ((tokenId == AId))
933+ let $t02579625896 = if ((tokenId == AId))
889934 then $Tuple2((tokenAmount - axlyFee), 0)
890935 else $Tuple2(0, (tokenAmount - axlyFee))
891- let pmtA = $t02505825158._1
892- let pmtB = $t02505825158._2
893- let $t02516125265 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
894- let stakedAmount = $t02516125265._1
895- let nf = $t02516125265._2
936+ let pmtA = $t02579625896._1
937+ let pmtB = $t02579625896._2
938+ let $t02589926003 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
939+ let stakedAmount = $t02589926003._1
940+ let nf = $t02589926003._2
896941 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
897942 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
898943 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
938983 let userAddr = Address(fromBase58String(user))
939984 let poolAddr = Address(fromBase58String(pool))
940985 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
941- let $t02779427866 = getPoolData(poolAddr, pType)
942- let idAStr = $t02779427866._1
943- let idBStr = $t02779427866._2
944- let balA = $t02779427866._3
945- let balB = $t02779427866._4
946- let shareId = $t02779427866._5
947- let $t02786927936 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
948- let idA = $t02786927936._1
949- let idB = $t02786927936._2
986+ let $t02853228604 = getPoolData(poolAddr, pType)
987+ let idAStr = $t02853228604._1
988+ let idBStr = $t02853228604._2
989+ let balA = $t02853228604._3
990+ let balB = $t02853228604._4
991+ let shareId = $t02853228604._5
992+ let $t02860728674 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
993+ let idA = $t02860728674._1
994+ let idB = $t02860728674._2
950995 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
951996 let cBalABefore = accountBalance(idA)
952997 if ((cBalABefore == cBalABefore))
9771022 let cBalBAfter = accountBalance(idB)
9781023 if ((cBalBAfter == cBalBAfter))
9791024 then {
980- let $t02863128720 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
981- let tokensAmountA = $t02863128720._1
982- let tokensAmountB = $t02863128720._2
983- let $t02872329959 = if (isBorrowed)
1025+ let $t02936929458 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1026+ let tokensAmountA = $t02936929458._1
1027+ let tokensAmountB = $t02936929458._2
1028+ let $t02946130697 = if (isBorrowed)
9841029 then {
9851030 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
9861031 let debt = {
10291074 else throw("Strict value is not equal to itself.")
10301075 }
10311076 else $Tuple2(tokensAmountA, tokensAmountB)
1032- let toUserA = $t02872329959._1
1033- let toUserB = $t02872329959._2
1077+ let toUserA = $t02946130697._1
1078+ let toUserB = $t02946130697._2
10341079 let poolTotalLoanEntries = if (isBorrowed)
10351080 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
10361081 else nil
10761121 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10771122 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10781123 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1079- let $t03194132038 = if ((borrowId == aId))
1124+ let $t03267932776 = if ((borrowId == aId))
10801125 then $Tuple2(dPriceA, decPrA)
10811126 else $Tuple2(dPriceB, decPrB)
1082- let borrowPrice = $t03194132038._1
1083- let borrowDecPr = $t03194132038._2
1127+ let borrowPrice = $t03267932776._1
1128+ let borrowDecPr = $t03267932776._2
10841129 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10851130 }
10861131
11091154
11101155
11111156 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1112- let $t03303833300 = if (claim)
1157+ let $t03377634038 = if (claim)
11131158 then claimFarmed(pType, pool)
11141159 else {
11151160 let claimedAsset = if ((pType == SF_POOL))
11191164 else unknownPoolType()
11201165 $Tuple2(amount, claimedAsset)
11211166 }
1122- if (($t03303833300 == $t03303833300))
1167+ if (($t03377634038 == $t03377634038))
11231168 then {
1124- let claimAsset = $t03303833300._2
1125- let claimAmount = $t03303833300._1
1169+ let claimAsset = $t03377634038._2
1170+ let claimAmount = $t03377634038._1
11261171 let bal = accountBalance(claimAsset)
11271172 if ((bal == bal))
11281173 then if ((amount > bal))
11381183 func getPoolInfoREADONLY (pool) = {
11391184 let poolAddr = addressFromStringValue(pool)
11401185 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1141- let $t03366733757 = getPoolData(Address(fromBase58String(pool)), pType)
1142- let AId = $t03366733757._1
1143- let BId = $t03366733757._2
1144- let balA = $t03366733757._3
1145- let balB = $t03366733757._4
1146- let shareId = $t03366733757._5
1186+ let $t03440534495 = getPoolData(Address(fromBase58String(pool)), pType)
1187+ let AId = $t03440534495._1
1188+ let BId = $t03440534495._2
1189+ let balA = $t03440534495._3
1190+ let balB = $t03440534495._4
1191+ let shareId = $t03440534495._5
11471192 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11481193 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
11491194 }
11711216 @Callable(i)
11721217 func getUserPositionREADONLY (user,pools,posNum) = {
11731218 func userPos (a,pool) = {
1174- let $t03463034700 = a
1175- let wAmountsA = $t03463034700._1
1176- let wAmountsB = $t03463034700._2
1177- let debts = $t03463034700._3
1178- let eqWAmountsA = $t03463034700._4
1179- let eqWAmountsB = $t03463034700._5
1180- let index = $t03463034700._6
1219+ let $t03536835438 = a
1220+ let wAmountsA = $t03536835438._1
1221+ let wAmountsB = $t03536835438._2
1222+ let debts = $t03536835438._3
1223+ let eqWAmountsA = $t03536835438._4
1224+ let eqWAmountsB = $t03536835438._5
1225+ let index = $t03536835438._6
11811226 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
11821227 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
11831228 else {
11841229 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1185- let $t03497935069 = getPoolData(Address(fromBase58String(pool)), pType)
1186- let AId = $t03497935069._1
1187- let BId = $t03497935069._2
1188- let balA = $t03497935069._3
1189- let balB = $t03497935069._4
1190- let shareId = $t03497935069._5
1230+ let $t03571735807 = getPoolData(Address(fromBase58String(pool)), pType)
1231+ let AId = $t03571735807._1
1232+ let BId = $t03571735807._2
1233+ let balA = $t03571735807._3
1234+ let balB = $t03571735807._4
1235+ let shareId = $t03571735807._5
11911236 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
11921237 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1193- let $t03528535405 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1194- let wAmountA = $t03528535405._1
1195- let wAmountB = $t03528535405._2
1238+ let $t03602336143 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1239+ let wAmountA = $t03602336143._1
1240+ let wAmountB = $t03602336143._2
11961241 if ((borrowAmount > 0))
11971242 then {
11981243 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
12261271 }
12271272 else unknownPoolType()
12281273 else 0
1229- let $t03631736536 = if ((borrowAsset == AId))
1274+ let $t03705537274 = if ((borrowAsset == AId))
12301275 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12311276 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1232- let eqWAmountA = $t03631736536._1
1233- let eqWAmountB = $t03631736536._2
1277+ let eqWAmountA = $t03705537274._1
1278+ let eqWAmountB = $t03705537274._2
12341279 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12351280 }
12361281 else throw("Strict value is not equal to itself.")
12391284 }
12401285 }
12411286
1242- let $t03679136902 = {
1287+ let $t03752937640 = {
12431288 let $l = pools
12441289 let $s = size($l)
12451290 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12531298
12541299 $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)
12551300 }
1256- let wAmountsA = $t03679136902._1
1257- let wAmountsB = $t03679136902._2
1258- let debts = $t03679136902._3
1259- let eqWAmountsA = $t03679136902._4
1260- let eqWAmountsB = $t03679136902._5
1301+ let wAmountsA = $t03752937640._1
1302+ let wAmountsB = $t03752937640._2
1303+ let debts = $t03752937640._3
1304+ let eqWAmountsA = $t03752937640._4
1305+ let eqWAmountsB = $t03752937640._5
12611306 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
12621307 }
12631308
12771322 else false)
12781323 then throw("You can't borrow in this pool")
12791324 else {
1280- let $t03750037590 = getPoolData(Address(fromBase58String(pool)), pType)
1281- let AId = $t03750037590._1
1282- let BId = $t03750037590._2
1283- let balA = $t03750037590._3
1284- let balB = $t03750037590._4
1285- let shareId = $t03750037590._5
1325+ let $t03823838328 = getPoolData(Address(fromBase58String(pool)), pType)
1326+ let AId = $t03823838328._1
1327+ let BId = $t03823838328._2
1328+ let balA = $t03823838328._3
1329+ let balB = $t03823838328._4
1330+ let shareId = $t03823838328._5
12861331 if (if ((borrowId != AId))
12871332 then (borrowId != BId)
12881333 else false)
12891334 then throw("Wrong borrow asset")
12901335 else {
1291- let $t03767137730 = parseReplenishPmts(i.payments, AId, BId)
1292- let pmtA = $t03767137730._1
1293- let pmtB = $t03767137730._2
1336+ let $t03840938468 = parseReplenishPmts(i.payments, AId, BId)
1337+ let pmtA = $t03840938468._1
1338+ let pmtB = $t03840938468._2
12941339 let user = toString(i.caller)
12951340 let newPosNum = getNewUserPositionNumber(user)
12961341 if ((leverage > 100))
13101355 if ((inv == inv))
13111356 then {
13121357 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1313- let $t03871938813 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1314- if (($t03871938813 == $t03871938813))
1358+ let $t03945739551 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1359+ if (($t03945739551 == $t03945739551))
13151360 then {
1316- let newBalB = $t03871938813._2
1317- let newBalA = $t03871938813._1
1361+ let newBalB = $t03945739551._2
1362+ let newBalA = $t03945739551._1
13181363 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1319- let $t03888338998 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1320- let wAmountA = $t03888338998._1
1321- let wAmountB = $t03888338998._2
1364+ let $t03962139736 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1365+ let wAmountA = $t03962139736._1
1366+ let wAmountB = $t03962139736._2
13221367 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13231368 }
13241369 else throw("Strict value is not equal to itself.")
13281373 else throw("Strict value is not equal to itself.")
13291374 }
13301375 else {
1331- let $t03905139166 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1332- if (($t03905139166 == $t03905139166))
1376+ let $t03978939904 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1377+ if (($t03978939904 == $t03978939904))
13331378 then {
1334- let axlyFee = $t03905139166._2
1335- let userStaked = $t03905139166._1
1336- let $t03917239266 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1337- if (($t03917239266 == $t03917239266))
1379+ let axlyFee = $t03978939904._2
1380+ let userStaked = $t03978939904._1
1381+ let $t03991040004 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1382+ if (($t03991040004 == $t03991040004))
13381383 then {
1339- let newBalB = $t03917239266._2
1340- let newBalA = $t03917239266._1
1384+ let newBalB = $t03991040004._2
1385+ let newBalA = $t03991040004._1
13411386 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1342- let $t03933639451 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1343- let wAmountA = $t03933639451._1
1344- let wAmountB = $t03933639451._2
1387+ let $t04007440189 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1388+ let wAmountA = $t04007440189._1
1389+ let wAmountB = $t04007440189._2
13451390 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13461391 }
13471392 else throw("Strict value is not equal to itself.")
14341479
14351480 @Callable(i)
14361481 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1437- let $t04429044394 = parseRequest(requestId)
1438- let user = $t04429044394._1
1439- let pool = $t04429044394._2
1440- let pmtA = $t04429044394._3
1441- let AId = $t04429044394._4
1442- let pmtB = $t04429044394._5
1443- let BId = $t04429044394._6
1444- let balA = $t04429044394._7
1445- let balB = $t04429044394._8
1446- let shareId = $t04429044394._9
1447- let bwAsset = $t04429044394._10
1448- let bwAmount = $t04429044394._11
1482+ let $t04502845132 = parseRequest(requestId)
1483+ let user = $t04502845132._1
1484+ let pool = $t04502845132._2
1485+ let pmtA = $t04502845132._3
1486+ let AId = $t04502845132._4
1487+ let pmtB = $t04502845132._5
1488+ let BId = $t04502845132._6
1489+ let balA = $t04502845132._7
1490+ let balB = $t04502845132._8
1491+ let shareId = $t04502845132._9
1492+ let bwAsset = $t04502845132._10
1493+ let bwAmount = $t04502845132._11
14491494 if ((size(i.payments) != 1))
14501495 then throw("Wrong payment size")
14511496 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
14531498 else (i.payments[0].amount != bwAmount))
14541499 then throw("Wrong payment")
14551500 else {
1456- let $t04458444684 = if ((AId == bwAsset))
1501+ let $t04532245422 = if ((AId == bwAsset))
14571502 then $Tuple2((pmtA + bwAmount), pmtB)
14581503 else $Tuple2(pmtA, (pmtB + bwAmount))
1459- let pmtAllA = $t04458444684._1
1460- let pmtAllB = $t04458444684._2
1504+ let pmtAllA = $t04532245422._1
1505+ let pmtAllB = $t04532245422._2
14611506 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1462- let $t04476644881 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1463- let userStaked = $t04476644881._1
1464- let axlyFee = $t04476644881._2
1507+ let $t04550445619 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1508+ let userStaked = $t04550445619._1
1509+ let axlyFee = $t04550445619._2
14651510 let posNum = getNewUserPositionNumber(user)
14661511 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
14671512 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1468- let $t04524145356 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1469- let wAmountA = $t04524145356._1
1470- let wAmountB = $t04524145356._2
1513+ let $t04597946094 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1514+ let wAmountA = $t04597946094._1
1515+ let wAmountB = $t04597946094._2
14711516 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
14721517 }
14731518 }))
14781523 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
14791524 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
14801525 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1481- let $t04587745967 = getPoolData(Address(fromBase58String(pool)), pType)
1482- let AId = $t04587745967._1
1483- let BId = $t04587745967._2
1484- let balA = $t04587745967._3
1485- let balB = $t04587745967._4
1486- let shareId = $t04587745967._5
1526+ let $t04661546705 = getPoolData(Address(fromBase58String(pool)), pType)
1527+ let AId = $t04661546705._1
1528+ let BId = $t04661546705._2
1529+ let balA = $t04661546705._3
1530+ let balB = $t04661546705._4
1531+ let shareId = $t04661546705._5
14871532 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
14881533 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
14891534 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
15151560 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15161561 let pType = getStringValue(this, (kPool + pool))
15171562 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1518- let $t04793748039 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1519- if (($t04793748039 == $t04793748039))
1563+ let $t04867548777 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1564+ if (($t04867548777 == $t04867548777))
15201565 then {
1521- let claimedAsset = $t04793748039._2
1522- let claimedAmount = $t04793748039._1
1566+ let claimedAsset = $t04867548777._2
1567+ let claimedAmount = $t04867548777._1
15231568 let rArgs = split(route, "__")
15241569 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15251570 then directSwopfiCPMM(rArgs, tokenToId)
15441589 @Callable(i)
15451590 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15461591 let pType = getStringValue(this, (kPool + pool))
1547- let $t04872348821 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1548- if (($t04872348821 == $t04872348821))
1592+ let $t04946149559 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1593+ if (($t04946149559 == $t04946149559))
15491594 then {
1550- let claimedAsset = $t04872348821._2
1551- let claimedAmount = $t04872348821._1
1595+ let claimedAsset = $t04946149559._2
1596+ let claimedAmount = $t04946149559._1
15521597 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
15531598 }
15541599 else throw("Strict value is not equal to itself.")
15661611 else false)
15671612 then throw("Wrong pool type")
15681613 else {
1569- let $t04934249436 = getPoolData(Address(fromBase58String(poolAddr)), type)
1570- let aId = $t04934249436._1
1571- let bId = $t04934249436._2
1572- let aBal = $t04934249436._3
1573- let bBal = $t04934249436._4
1574- let shareId = $t04934249436._5
1614+ let $t05008050174 = getPoolData(Address(fromBase58String(poolAddr)), type)
1615+ let aId = $t05008050174._1
1616+ let bId = $t05008050174._2
1617+ let aBal = $t05008050174._3
1618+ let bBal = $t05008050174._4
1619+ let shareId = $t05008050174._5
15751620 if ((0 > inFeeNoLoan))
15761621 then throw("inFeeNoLoan must be greater than 0")
15771622 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 CPMM = "cpmm"
99
1010 let FLAT = "flat"
1111
1212 let CAP_FEE_NO_LOAN = "capNoLoan"
1313
1414 let CAP_FEE_LOAN = "capLoan"
1515
1616 let STOPLOSS_FEE_NO_LOAN = "stopLossNoLoan"
1717
1818 let STOPLOSS_LOAN = "stopLossLoan"
1919
2020 let LOAN_FEE = "loan"
2121
2222 let NO_LOAN_FEE = "noLoan"
2323
2424 let NO_FEE = "noFee"
2525
2626 let SCALE8 = 100000000
2727
2828 let SCALE10 = 10000000000
2929
3030 let SCALE16 = toBigInt(10000000000000000)
3131
3232 let FEE_SCALE6 = 1000000
3333
3434 let kSFPoolAAssetBalance = "A_asset_balance"
3535
3636 let kSFPoolBAssetBalance = "B_asset_balance"
3737
3838 let kSFPoolAAssetId = "A_asset_id"
3939
4040 let kSFPoolBAssetId = "B_asset_id"
4141
4242 let kSFPoolShareId = "share_asset_id"
4343
4444 let kSFPoolShareSupply = "share_asset_supply"
4545
4646 let kSFPoolFee = "commission"
4747
4848 let kUserPosition = "_userPosition"
4949
5050 let kUserPositionPool = "_userPositionPool"
5151
5252 let kUserBorrowAmount = "_userPositionBorrowAmount"
5353
5454 let kUserBorrowAssetId = "_userPositionBorrowAssetId"
5555
5656 let kUserPositionNum = "_userPositionNumber"
5757
5858 let kUserPositionInterest = "_userPositionInterest"
5959
6060 let kPoolTotal = "_poolTotal"
6161
6262 let kPoolTotalLoan = "_poolTotalLoan"
6363
6464 let kPoolInterestLoan = "_poolInterestLoan"
6565
6666 let kPoolInterestNoLoan = "_poolInterestNoLoan"
6767
6868 let kPoolCanBorrow = "_poolCanBorrow"
6969
7070 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
7171
7272 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
7373
7474 let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
7575
7676 let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
7777
7878 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
7979
8080 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
8181
8282 let kRequestId = "_request_id"
8383
8484 let kRequestIter = "requests_iter"
8585
8686 let kPool = "pool_"
8787
8888 let kPoolType = "_poolType"
8989
9090 let kSharePool = "_poolShareId"
9191
9292 let kPoolCapChange = "_poolCapChange"
9393
9494 let kTokenLastPrice = "last_price"
9595
9696 let kPriceInOracle = "_twap5B"
9797
9898 let kActive = "active"
9999
100100 let kActiveUsers = "activeUsers"
101101
102102 let kActiveSFWX = "_active"
103103
104104 let kPoolActive = "_activePool"
105105
106106 let kUserStopLoss = "_stopLoss"
107107
108108 let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
109109
110110 let kMoneyBox = "axly_money_box"
111111
112112 let kSFFarmingAddr = "swopfi_farming_addr"
113113
114114 let kLendService = "lend_service_addr"
115115
116116 let kOperatorCallPK = "admin_call_pub_key"
117117
118118 let kPriceOracle = "price_oracle"
119119
120120 let kExContract = "exchange_contract"
121121
122122 let kWxSwapContract = "wx_swap_contract"
123123
124124 let kSwopId = "swop_id"
125125
126126 let kWxId = "wx_id"
127127
128128 let kGroup1Admin1PK = "group1_admin1_pub_key"
129129
130130 let kGroup1Admin2PK = "group1_admin2_pub_key"
131131
132132 let kGroup2Admin1PK = "group2_admin1_pub_key"
133133
134134 let kGroup2Admin2PK = "group2_admin2_pub_key"
135135
136136 let moneyBox = Address(fromBase58String(valueOrErrorMessage(getString(this, kMoneyBox), "No axly moneyBox address")))
137137
138138 let exContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kExContract), "No exchange contract address")))
139139
140140 let priceOracleAddr = Address(fromBase58String(valueOrErrorMessage(getString(this, kPriceOracle), "No price oracle address")))
141141
142142 let wxSwapContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kWxSwapContract), "No wx swap address")))
143143
144144 let SWOPID = fromBase58String(valueOrErrorMessage(getString(this, kSwopId), "No swop id"))
145145
146146 let WXID = fromBase58String(valueOrErrorMessage(getString(this, kWxId), "No wx id"))
147147
148148 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
149149
150150 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
151151
152152 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
153153
154154 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
155155
156156 let operatorPK = fromBase58String(valueOrErrorMessage(getString(this, kOperatorCallPK), "Can't get operatorPK"))
157157
158158 func unknownPoolType () = throw("Wrong pool type")
159159
160160
161161 func getLendSrvAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kLendService), "Can't get lend service addr")))
162162
163163
164164 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
165165 then unit
166166 else throw("Only operator can call this function")
167167
168168
169169 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
170170 then true
171171 else (i.callerPublicKey == group1Admin2PK))
172172 then unit
173173 else throw("Only admin group1 can call this function")
174174
175175
176176 func isSelfCall (i) = if ((i.caller == this))
177177 then unit
178178 else throw("Only contract itself can call this function")
179179
180180
181181 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
182182 then unit
183183 else throw("Only land contract can call this function")
184184
185185
186186 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
187187 then unit
188188 else throw("DApp is inactive at this moment")
189189
190190
191191 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
192192 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
193193 else false)
194194 then unit
195195 else throw("DApp is inactive for users at this moment")
196196
197197
198198 func isPoolActive (pool,type) = {
199199 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
200200 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
201201 if (if (WXSFActive)
202202 then poolActive
203203 else false)
204204 then true
205205 else false
206206 }
207207
208208
209209 func accountBalance (assetId) = match assetId {
210210 case id: ByteVector =>
211211 assetBalance(this, id)
212212 case waves: Unit =>
213213 wavesBalance(this).available
214214 case _ =>
215215 throw("Match error")
216216 }
217217
218218
219219 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"))
220220
221221
222222 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
223223 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
224224 if ($isInstanceOf(@, "Int"))
225225 then @
226226 else throw(($getType(@) + " couldn't be cast to Int"))
227227 }, {
228228 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
229229 if ($isInstanceOf(@, "Int"))
230230 then @
231231 else throw(($getType(@) + " couldn't be cast to Int"))
232232 })
233233
234234
235235 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
236236 then getSFPoolBalances(poolAddr)
237237 else if ((type == WX_POOL))
238238 then getWXPoolBalances(poolAddr, aId, bId)
239239 else unknownPoolType()
240240
241241
242242 func getSFPoolData (poolAddr) = {
243243 let $t080898138 = getSFPoolBalances(poolAddr)
244244 if (($t080898138 == $t080898138))
245245 then {
246246 let balB = $t080898138._2
247247 let balA = $t080898138._1
248248 $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"))
249249 }
250250 else throw("Strict value is not equal to itself.")
251251 }
252252
253253
254254 func getWXPoolData (poolAddr) = {
255255 let cfg = {
256256 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
257257 if ($isInstanceOf(@, "List[Any]"))
258258 then @
259259 else throw(($getType(@) + " couldn't be cast to List[Any]"))
260260 }
261261 if ((cfg == cfg))
262262 then {
263263 let aId = valueOrErrorMessage({
264264 let @ = cfg[4]
265265 if ($isInstanceOf(@, "String"))
266266 then @
267267 else unit
268268 }, "Can't get pool A asset id")
269269 let bId = valueOrErrorMessage({
270270 let @ = cfg[5]
271271 if ($isInstanceOf(@, "String"))
272272 then @
273273 else unit
274274 }, "Can't get pool B asset id")
275275 let shareId = valueOrErrorMessage({
276276 let @ = cfg[3]
277277 if ($isInstanceOf(@, "String"))
278278 then @
279279 else unit
280280 }, "Can't get pool LP asset id")
281281 let $t088358894 = getWXPoolBalances(poolAddr, aId, bId)
282282 if (($t088358894 == $t088358894))
283283 then {
284284 let balB = $t088358894._2
285285 let balA = $t088358894._1
286286 $Tuple5(aId, bId, balA, balB, shareId)
287287 }
288288 else throw("Strict value is not equal to itself.")
289289 }
290290 else throw("Strict value is not equal to itself.")
291291 }
292292
293293
294294 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
295295 then getSFPoolData(poolAddr)
296296 else if ((type == WX_POOL))
297297 then getWXPoolData(poolAddr)
298298 else unknownPoolType()
299299
300300
301301 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
302302 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
303303 else if ((type == WX_POOL))
304304 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
305305 else unknownPoolType()
306306
307307
308308 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
309309
310310
311311 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
312312
313313
314314 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
315315
316316
317317 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
318318 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
319319 else if ((feeType == CAP_FEE_NO_LOAN))
320320 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
321321 else if ((feeType == LOAN_FEE))
322322 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
323323 else if ((feeType == NO_LOAN_FEE))
324324 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
325325 else if ((feeType == NO_FEE))
326326 then 0
327327 else throw("Wrong fee type")
328328
329329
330330 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kSFFarmingAddr), "Can't get swopfi farming addr")))
331331
332332
333333 func getWXFarmingAddr (poolAddr) = {
334334 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
335335 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
336336 Address(fromBase58String(factroyCfg[1]))
337337 }
338338
339339
340340 func assetIdToStr (assetId) = match assetId {
341341 case id: ByteVector =>
342342 toBase58String(id)
343343 case waves: Unit =>
344344 "WAVES"
345345 case _ =>
346346 throw("Not Asset id")
347347 }
348348
349349
350350 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
351351 then unit
352352 else fromBase58String(assetId)
353353
354354
355355 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
356356 then 8
357357 else match assetInfo(fromBase58String(assetId)) {
358358 case asset: Asset =>
359359 asset.decimals
360360 case _ =>
361361 throw("Can't find asset")
362362 }
363363
364364
365365 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
366366
367367
368368 func getAssetsPrice (assetIds) = {
369369 func getPrices (a,assetId) = {
370370 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
371371 (a :+ assetPrice)
372372 }
373373
374374 let $l = assetIds
375375 let $s = size($l)
376376 let $acc0 = nil
377377 func $f0_1 ($a,$i) = if (($i >= $s))
378378 then $a
379379 else getPrices($a, $l[$i])
380380
381381 func $f0_2 ($a,$i) = if (($i >= $s))
382382 then $a
383383 else throw("List size exceeds 50")
384384
385385 $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)
386386 }
387387
388388
389389 func getSharePrice (shareId) = {
390390 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
391391 let poolAddr = Address(fromBase58String(pool))
392392 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
393393 let $t01188311948 = getPoolData(poolAddr, pType)
394394 let aId = $t01188311948._1
395395 let bId = $t01188311948._2
396396 let aBalance = $t01188311948._3
397397 let bBalance = $t01188311948._4
398398 let prices = getAssetsPrice([aId, bId])
399399 let dPriceA = prices[0]
400400 let dPriceB = prices[1]
401401 if (if ((0 > dPriceA))
402402 then true
403403 else (0 > dPriceB))
404404 then -1
405405 else {
406406 let shareSupply = getShareSupply(poolAddr, pType, shareId)
407407 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
408408 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
409409 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
410410 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
411411 fraction(sum, sharePrecision, shareSupply)
412412 }
413413 }
414414
415415
416416 func getSharePrices (shareIds) = {
417417 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
418418
419419 let $l = shareIds
420420 let $s = size($l)
421421 let $acc0 = nil
422422 func $f0_1 ($a,$i) = if (($i >= $s))
423423 then $a
424424 else getPrices($a, $l[$i])
425425
426426 func $f0_2 ($a,$i) = if (($i >= $s))
427427 then $a
428428 else throw("List size exceeds 20")
429429
430430 $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)
431431 }
432432
433433
434434 func getCursEntries (aId,bId,shareId,wAmounts) = {
435435 let assetsPrices = getAssetsPrice([aId, bId])
436436 let sharePrice = getSharePrice(shareId)
437437 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
438438 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
439439 }
440440
441441
442442 func calcReplenishByTwoTokens (pType,poolAddr,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
443443 then {
444444 let repl = {
445445 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
446446 if ($isInstanceOf(@, "List[Any]"))
447447 then @
448448 else throw(($getType(@) + " couldn't be cast to List[Any]"))
449449 }
450450 if ((repl == repl))
451451 then $Tuple5({
452452 let @ = repl[3]
453453 if ($isInstanceOf(@, "Int"))
454454 then @
455455 else throw(($getType(@) + " couldn't be cast to Int"))
456456 }, {
457457 let @ = repl[4]
458458 if ($isInstanceOf(@, "Int"))
459459 then @
460460 else throw(($getType(@) + " couldn't be cast to Int"))
461461 }, {
462462 let @ = repl[1]
463463 if ($isInstanceOf(@, "Int"))
464464 then @
465465 else throw(($getType(@) + " couldn't be cast to Int"))
466466 }, assetIdToStr(repl[2]), {
467467 let @ = repl[0]
468468 if ($isInstanceOf(@, "Int"))
469469 then @
470470 else throw(($getType(@) + " couldn't be cast to Int"))
471471 })
472472 else throw("Strict value is not equal to itself.")
473473 }
474474 else if ((pType == WX_POOL))
475475 then {
476476 let $t01349213742 = $Tuple2(split({
477477 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
478478 if ($isInstanceOf(@, "String"))
479479 then @
480480 else throw(($getType(@) + " couldn't be cast to String"))
481481 }, "__"), split({
482482 let @ = invoke(poolAddr, "evaluatePutByPriceAssetREADONLY", [pmtB], nil)
483483 if ($isInstanceOf(@, "String"))
484484 then @
485485 else throw(($getType(@) + " couldn't be cast to String"))
486486 }, "__"))
487487 if (($t01349213742 == $t01349213742))
488488 then {
489489 let evalPutInB = $t01349213742._2
490490 let evalPutInA = $t01349213742._1
491491 let lpInA = parseIntValue(evalPutInA[1])
492492 let lpInB = parseIntValue(evalPutInB[1])
493493 if ((lpInB > lpInA))
494494 then {
495495 let pmt = parseIntValue(evalPutInA[8])
496496 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
497497 }
498498 else {
499499 let pmt = parseIntValue(evalPutInB[7])
500500 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
501501 }
502502 }
503503 else throw("Strict value is not equal to itself.")
504504 }
505505 else unknownPoolType()
506506
507507
508508 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId) = {
509509 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
510510 if ((pType == SF_POOL))
511511 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
512512 else if ((pType == WX_POOL))
513513 then invoke(poolAddr, "put", [1000000, false], payments)
514514 else unknownPoolType()
515515 }
516516
517517
518518 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId) = {
519519 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
520520 if ((pType == SF_POOL))
521521 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
522522 else if ((pType == WX_POOL))
523523 then {
524524 let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
525525 then "putOneTknV2"
526526 else "putOneTkn"
527527 invoke(poolAddr, fc, [0, false], payments)
528528 }
529529 else unknownPoolType()
530530 }
531531
532532
533533 func stakeLP (pool,pType,shareId,amount) = {
534534 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
535535 if ((pType == SF_POOL))
536536 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
537537 else if ((pType == WX_POOL))
538538 then invoke(getWXFarmingAddr(addressFromStringValue(pool)), "stake", nil, payments)
539539 else unknownPoolType()
540540 }
541541
542542
543543 func unstakeLP (pool,pType,shareId,amount) = {
544544 let $t01552015870 = if ((pType == SF_POOL))
545545 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
546546 else if ((pType == WX_POOL))
547547 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
548548 else unknownPoolType()
549549 let farmAddr = $t01552015870._1
550550 let fName = $t01552015870._2
551551 let params = $t01552015870._3
552552 let inv = invoke(farmAddr, fName, params, nil)
553553 if ((inv == inv))
554554 then amount
555555 else throw("Strict value is not equal to itself.")
556556 }
557557
558558
559559 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
560560 let poolAddr = Address(fromBase58String(pool))
561561 let feeScale6 = 1000000
562562 let fee = getIntegerValue(poolAddr, kSFPoolFee)
563563 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
564564 let $t01629216598 = if ((assetTokenToGet == assetIdA))
565565 then {
566566 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
567567 $Tuple2(amountToPay, assetIdB)
568568 }
569569 else {
570570 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
571571 $Tuple2(amountToPay, assetIdA)
572572 }
573573 let amountToPay = $t01629216598._1
574574 let assetToPay = $t01629216598._2
575575 $Tuple2(assetToPay, amountToPay)
576576 }
577577
578578
579579 func getWXSwapFees (pool) = {
580580 let poolAddr = addressFromStringValue(pool)
581581 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
582582 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
583583 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
584584 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
585585 case fees: (Int, Int) =>
586586 $Tuple2(fees._1, fees._2)
587587 case _ =>
588588 $Tuple2(poolFeeDefault, protocolFeeDefault)
589589 }
590590 }
591591
592592
593593 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
594594 let $t01733817377 = getWXSwapFees(pool)
595595 let pFee = $t01733817377._1
596596 let prFee = $t01733817377._2
597597 let feeScale = toBigInt(100000000)
598598 let $t01741717725 = if ((assetTokenToGet == assetIdA))
599599 then {
600600 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
601601 $Tuple2(amountToPay, assetIdB)
602602 }
603603 else {
604604 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
605605 $Tuple2(amountToPay, assetIdA)
606606 }
607607 let amountToPay = $t01741717725._1
608608 let assetToPay = $t01741717725._2
609609 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
610610 $Tuple2(assetToPay, amountToPayWithFee)
611611 }
612612
613613
614614 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
615615 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
616616 if (if ((pType == SF_POOL))
617617 then true
618618 else (poolFB != ""))
619619 then {
620620 let $t01816618378 = if ((poolFB == ""))
621621 then $Tuple3(balA, balB, pool)
622622 else {
623623 let $t01827218345 = getSFPoolBalances(addressFromStringValue(poolFB))
624624 let sfBalA = $t01827218345._1
625625 let sfBalB = $t01827218345._2
626626 $Tuple3(sfBalA, sfBalB, poolFB)
627627 }
628628 let pBalA = $t01816618378._1
629629 let pBalB = $t01816618378._2
630630 let exPool = $t01816618378._3
631631 let $t01838318509 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
632632 let assetToPay = $t01838318509._1
633633 let amountToPay = $t01838318509._2
634634 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
635635 }
636636 else if ((pType == WX_POOL))
637637 then {
638638 let $t01871118833 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
639639 let assetToPay = $t01871118833._1
640640 let amountToPay = $t01871118833._2
641641 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
642642 }
643643 else unknownPoolType()
644644 }
645645
646646
647647 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
648- let $t01912019584 = if ((pType == SF_POOL))
648+ let $t01912020322 = if ((pType == SF_POOL))
649649 then {
650650 let inv = {
651651 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
652652 if ($isInstanceOf(@, "List[Any]"))
653653 then @
654654 else throw(($getType(@) + " couldn't be cast to List[Any]"))
655655 }
656656 if ((inv == inv))
657657 then $Tuple2({
658658 let @ = inv[0]
659659 if ($isInstanceOf(@, "Int"))
660660 then @
661661 else throw(($getType(@) + " couldn't be cast to Int"))
662662 }, {
663663 let @ = inv[1]
664664 if ($isInstanceOf(@, "Int"))
665665 then @
666666 else throw(($getType(@) + " couldn't be cast to Int"))
667667 })
668668 else throw("Strict value is not equal to itself.")
669669 }
670670 else if ((pType == WX_POOL))
671- then {
672- let inv = split({
673- let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
674- if ($isInstanceOf(@, "String"))
675- then @
676- else throw(($getType(@) + " couldn't be cast to String"))
677- }, "__")
678- if ((inv == inv))
679- then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
680- else throw("Strict value is not equal to itself.")
681- }
671+ then if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
672+ then {
673+ let inv = invoke(poolAddr, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
674+ if ((inv == inv))
675+ then {
676+ let $t01958020077 = match inv {
677+ case _ =>
678+ if (if (if ($isInstanceOf($match0._1, "Int"))
679+ then if ($isInstanceOf($match0._2, "Int"))
680+ then if ($isInstanceOf($match0._5, "Int"))
681+ then if ($isInstanceOf($match0._6, "Int"))
682+ then if ($isInstanceOf($match0._7, "Int"))
683+ then if ($isInstanceOf($match0._8, "String"))
684+ then $isInstanceOf($match0._9, "String")
685+ else false
686+ else false
687+ else false
688+ else false
689+ else false
690+ else false)
691+ then (size($match0) == 10)
692+ else false)
693+ then {
694+ let outAmAmt = $match0._1
695+ let outPrAmt = $match0._2
696+ let amBalance = $match0._5
697+ let prBalance = $match0._6
698+ let lpEmission = $match0._7
699+ let curPrice = $match0._8
700+ let poolStatus = $match0._9
701+ $Tuple7(outAmAmt, outPrAmt, amBalance, prBalance, lpEmission, curPrice, poolStatus)
702+ }
703+ else throw("Couldn't cast types")
704+ }
705+ let outAmAmt = $t01958020077._1
706+ let outPrAmt = $t01958020077._2
707+ let amBalance = $t01958020077._3
708+ let prBalance = $t01958020077._4
709+ let lpEmission = $t01958020077._5
710+ let curPrice = $t01958020077._6
711+ let poolStatus = $t01958020077._7
712+ $Tuple2(outAmAmt, outPrAmt)
713+ }
714+ else throw("Strict value is not equal to itself.")
715+ }
716+ else {
717+ let inv = split({
718+ let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
719+ if ($isInstanceOf(@, "String"))
720+ then @
721+ else throw(($getType(@) + " couldn't be cast to String"))
722+ }, "__")
723+ if ((inv == inv))
724+ then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
725+ else throw("Strict value is not equal to itself.")
726+ }
682727 else unknownPoolType()
683- let amountA = $t01912019584._1
684- let amountB = $t01912019584._2
728+ let amountA = $t01912020322._1
729+ let amountB = $t01912020322._2
685730 $Tuple2(amountA, amountB)
686731 }
687732
688733
689734 func claimFarmed (pType,pool) = if ((pType == SF_POOL))
690735 then {
691736 let balBefore = accountBalance(SWOPID)
692737 if ((balBefore == balBefore))
693738 then {
694739 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
695740 if ((inv == inv))
696741 then {
697742 let balAfter = accountBalance(SWOPID)
698743 $Tuple2((balAfter - balBefore), SWOPID)
699744 }
700745 else throw("Strict value is not equal to itself.")
701746 }
702747 else throw("Strict value is not equal to itself.")
703748 }
704749 else if ((pType == WX_POOL))
705750 then {
706- let $t01995220031 = getWXPoolData(addressFromStringValue(pool))
707- let aId = $t01995220031._1
708- let bId = $t01995220031._2
709- let aBal = $t01995220031._3
710- let bBal = $t01995220031._4
711- let lpId = $t01995220031._5
751+ let $t02069020769 = getWXPoolData(addressFromStringValue(pool))
752+ let aId = $t02069020769._1
753+ let bId = $t02069020769._2
754+ let aBal = $t02069020769._3
755+ let bBal = $t02069020769._4
756+ let lpId = $t02069020769._5
712757 let balBefore = accountBalance(WXID)
713758 if ((balBefore == balBefore))
714759 then {
715760 let inv = invoke(getWXFarmingAddr(addressFromStringValue(pool)), "claimWx", [lpId], nil)
716761 if ((inv == inv))
717762 then {
718763 let balAfter = accountBalance(WXID)
719764 $Tuple2((balAfter - balBefore), WXID)
720765 }
721766 else throw("Strict value is not equal to itself.")
722767 }
723768 else throw("Strict value is not equal to itself.")
724769 }
725770 else unknownPoolType()
726771
727772
728773 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId) = {
729774 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
730775 if ((lpBalanceBefore == lpBalanceBefore))
731776 then {
732777 let poolAddr = addressFromStringValue(pool)
733- let $t02062921045 = if (if ((pmtA > 0))
778+ let $t02136721783 = if (if ((pmtA > 0))
734779 then (pmtB > 0)
735780 else false)
736781 then {
737- let $t02069520811 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
738- let pmtInA = $t02069520811._1
739- let pmtInB = $t02069520811._2
740- let change = $t02069520811._3
741- let changeId = $t02069520811._4
782+ let $t02143321549 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
783+ let pmtInA = $t02143321549._1
784+ let pmtInB = $t02143321549._2
785+ let change = $t02143321549._3
786+ let changeId = $t02143321549._4
742787 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
743788 if ((inv == inv))
744789 then $Tuple2(change, changeId)
745790 else throw("Strict value is not equal to itself.")
746791 }
747792 else if ((pmtA > 0))
748793 then $Tuple2(pmtA, aId)
749794 else if ((pmtB > 0))
750795 then $Tuple2(pmtB, bId)
751796 else throw("pmts must be > 0")
752- let change = $t02062921045._1
753- let changeId = $t02062921045._2
797+ let change = $t02136721783._1
798+ let changeId = $t02136721783._2
754799 let inv = if ((change > 0))
755800 then replenishOneTokenByType(poolAddr, pType, change, changeId)
756801 else nil
757802 if ((inv == inv))
758803 then {
759804 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
760805 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
761806 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
762807 let userShareForStake = (totalStaked - axlyFeeAmount)
763808 if ((0 >= userShareForStake))
764809 then throw("amount of staked sharetokens must be > 0")
765810 else {
766811 let invLP = stakeLP(pool, pType, LPId, userShareForStake)
767812 if ((invLP == invLP))
768813 then $Tuple2(userShareForStake, axlyFeeAmount)
769814 else throw("Strict value is not equal to itself.")
770815 }
771816 }
772817 else throw("Strict value is not equal to itself.")
773818 }
774819 else throw("Strict value is not equal to itself.")
775820 }
776821
777822
778823 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
779824 let totalAmount = getPoolTotalShare(pool)
780825 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
781- let $t02190222140 = if (withLoan)
826+ let $t02264022878 = if (withLoan)
782827 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
783828 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
784- let curPoolInterest = $t02190222140._1
785- let totalStakedWithLoan = $t02190222140._2
829+ let curPoolInterest = $t02264022878._1
830+ let totalStakedWithLoan = $t02264022878._2
786831 [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))]
787832 }
788833
789834
790835 func listToInt (a,item) = (a :+ parseIntValue(item))
791836
792837
793838 func directSwopfiCPMM (rArgs,tokenTo) = {
794839 let dApp = addressFromStringValue(rArgs[1])
795840 let pmtP = split(rArgs[2], "|")
796841 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
797842 if ((tokenBalanceBefore == tokenBalanceBefore))
798843 then {
799844 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
800845 let minToRecive = rArgs[3]
801846 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
802847 if ((inv == inv))
803848 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
804849 else throw("Strict value is not equal to itself.")
805850 }
806851 else throw("Strict value is not equal to itself.")
807852 }
808853
809854
810855 func directRoutingSwopfi (rArgs,tokenTo) = {
811856 let dApp = addressFromStringValue(rArgs[1])
812857 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
813858 if ((tokenBalanceBefore == tokenBalanceBefore))
814859 then {
815860 let pmt = {
816861 let pmtP = split(rArgs[2], "|")
817862 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
818863 }
819864 let args = {
820865 let eArgs = split(rArgs[3], "|")
821866 let exchangers = split(eArgs[0], ",")
822867 let exchangersType = split(eArgs[1], ",")
823868 let args1 = {
824869 let $l = split(eArgs[2], ",")
825870 let $s = size($l)
826871 let $acc0 = nil
827872 func $f0_1 ($a,$i) = if (($i >= $s))
828873 then $a
829874 else listToInt($a, $l[$i])
830875
831876 func $f0_2 ($a,$i) = if (($i >= $s))
832877 then $a
833878 else throw("List size exceeds 3")
834879
835880 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
836881 }
837882 let args2 = {
838883 let $l = split(eArgs[3], ",")
839884 let $s = size($l)
840885 let $acc0 = nil
841886 func $f1_1 ($a,$i) = if (($i >= $s))
842887 then $a
843888 else listToInt($a, $l[$i])
844889
845890 func $f1_2 ($a,$i) = if (($i >= $s))
846891 then $a
847892 else throw("List size exceeds 3")
848893
849894 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
850895 }
851896 let routingAssetsKeys = split(eArgs[4], ",")
852897 let minToRecive = parseIntValue(eArgs[5])
853898 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
854899 }
855900 let inv = invoke(dApp, "routingTrade", args, pmt)
856901 if ((inv == inv))
857902 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
858903 else throw("Strict value is not equal to itself.")
859904 }
860905 else throw("Strict value is not equal to itself.")
861906 }
862907
863908
864909 func capitalize (pool,pType,tokenId,tokenAmount) = {
865910 let poolAddr = Address(fromBase58String(pool))
866- let $t02424724313 = getPoolData(poolAddr, pType)
867- let AId = $t02424724313._1
868- let BId = $t02424724313._2
869- let balA = $t02424724313._3
870- let balB = $t02424724313._4
871- let shareId = $t02424724313._5
911+ let $t02498525051 = getPoolData(poolAddr, pType)
912+ let AId = $t02498525051._1
913+ let BId = $t02498525051._2
914+ let balA = $t02498525051._3
915+ let balB = $t02498525051._4
916+ let shareId = $t02498525051._5
872917 if (if ((tokenId != AId))
873918 then (tokenId != BId)
874919 else false)
875920 then throw("Wrong asset")
876921 else {
877922 let totalShareAmount = getPoolTotalShare(pool)
878923 if ((totalShareAmount == 0))
879924 then [ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))]
880925 else {
881926 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
882927 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
883928 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
884929 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
885930 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
886931 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
887932 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
888- let $t02505825158 = if ((tokenId == AId))
933+ let $t02579625896 = if ((tokenId == AId))
889934 then $Tuple2((tokenAmount - axlyFee), 0)
890935 else $Tuple2(0, (tokenAmount - axlyFee))
891- let pmtA = $t02505825158._1
892- let pmtB = $t02505825158._2
893- let $t02516125265 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
894- let stakedAmount = $t02516125265._1
895- let nf = $t02516125265._2
936+ let pmtA = $t02579625896._1
937+ let pmtB = $t02579625896._2
938+ let $t02589926003 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
939+ let stakedAmount = $t02589926003._1
940+ let nf = $t02589926003._2
896941 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
897942 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
898943 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
899944 let stakedNoLoan = (stakedAmount - stakedLoan)
900945 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
901946 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
902947 else 0
903948 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
904949 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
905950 else 0
906951 ([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))
907952 }
908953 }
909954 }
910955
911956
912957 func userCanWithdrawShareCalc (user,pool,posId,borrowed) = {
913958 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
914959 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
915960 let poolInterest = if (borrowed)
916961 then getIntegerValue(this, (pool + kPoolInterestLoan))
917962 else getIntegerValue(this, (pool + kPoolInterestNoLoan))
918963 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
919964 }
920965
921966
922967 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
923968 let feeType = if (isBorrowed)
924969 then STOPLOSS_LOAN
925970 else STOPLOSS_FEE_NO_LOAN
926971 if (stopLoss)
927972 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
928973 else 0
929974 }
930975
931976
932977 func withdrawToUser (user,pool,posId,stopLoss) = {
933978 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
934979 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
935980 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed)
936981 let poolTotalShare = getPoolTotalShare(pool)
937982 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
938983 let userAddr = Address(fromBase58String(user))
939984 let poolAddr = Address(fromBase58String(pool))
940985 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
941- let $t02779427866 = getPoolData(poolAddr, pType)
942- let idAStr = $t02779427866._1
943- let idBStr = $t02779427866._2
944- let balA = $t02779427866._3
945- let balB = $t02779427866._4
946- let shareId = $t02779427866._5
947- let $t02786927936 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
948- let idA = $t02786927936._1
949- let idB = $t02786927936._2
986+ let $t02853228604 = getPoolData(poolAddr, pType)
987+ let idAStr = $t02853228604._1
988+ let idBStr = $t02853228604._2
989+ let balA = $t02853228604._3
990+ let balB = $t02853228604._4
991+ let shareId = $t02853228604._5
992+ let $t02860728674 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
993+ let idA = $t02860728674._1
994+ let idB = $t02860728674._2
950995 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
951996 let cBalABefore = accountBalance(idA)
952997 if ((cBalABefore == cBalABefore))
953998 then {
954999 let cBalBBefore = accountBalance(idB)
9551000 if ((cBalBBefore == cBalBBefore))
9561001 then {
9571002 let inv = if ((pType == SF_POOL))
9581003 then {
9591004 let inv = unstakeLP(pool, pType, shareId, stopLossFee)
9601005 if ((inv == inv))
9611006 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
9621007 else throw("Strict value is not equal to itself.")
9631008 }
9641009 else if ((pType == WX_POOL))
9651010 then {
9661011 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee))
9671012 if ((inv == inv))
9681013 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
9691014 else throw("Strict value is not equal to itself.")
9701015 }
9711016 else unknownPoolType()
9721017 if ((inv == inv))
9731018 then {
9741019 let cBalAAfter = accountBalance(idA)
9751020 if ((cBalAAfter == cBalAAfter))
9761021 then {
9771022 let cBalBAfter = accountBalance(idB)
9781023 if ((cBalBAfter == cBalBAfter))
9791024 then {
980- let $t02863128720 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
981- let tokensAmountA = $t02863128720._1
982- let tokensAmountB = $t02863128720._2
983- let $t02872329959 = if (isBorrowed)
1025+ let $t02936929458 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1026+ let tokensAmountA = $t02936929458._1
1027+ let tokensAmountB = $t02936929458._2
1028+ let $t02946130697 = if (isBorrowed)
9841029 then {
9851030 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
9861031 let debt = {
9871032 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
9881033 if ($isInstanceOf(@, "Int"))
9891034 then @
9901035 else throw(($getType(@) + " couldn't be cast to Int"))
9911036 }
9921037 if ((debt == debt))
9931038 then {
9941039 let amountToGetEx = if (if ((borrowAsset == idAStr))
9951040 then (debt > tokensAmountA)
9961041 else false)
9971042 then (debt - tokensAmountA)
9981043 else if (if ((borrowAsset == idBStr))
9991044 then (debt > tokensAmountB)
10001045 else false)
10011046 then (debt - tokensAmountB)
10021047 else 0
10031048 let exInv = if ((amountToGetEx > 0))
10041049 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
10051050 else nil
10061051 if ((exInv == exInv))
10071052 then {
10081053 let cBalAAfterRepay = accountBalance(idA)
10091054 if ((cBalAAfterRepay == cBalAAfterRepay))
10101055 then {
10111056 let cBalBAfterRepay = accountBalance(idB)
10121057 if ((cBalBAfterRepay == cBalBAfterRepay))
10131058 then {
10141059 let closeDbtInv = if ((debt > 0))
10151060 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
10161061 else 0
10171062 if ((closeDbtInv == closeDbtInv))
10181063 then if ((borrowAsset == idAStr))
10191064 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
10201065 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
10211066 else throw("Strict value is not equal to itself.")
10221067 }
10231068 else throw("Strict value is not equal to itself.")
10241069 }
10251070 else throw("Strict value is not equal to itself.")
10261071 }
10271072 else throw("Strict value is not equal to itself.")
10281073 }
10291074 else throw("Strict value is not equal to itself.")
10301075 }
10311076 else $Tuple2(tokensAmountA, tokensAmountB)
1032- let toUserA = $t02872329959._1
1033- let toUserB = $t02872329959._2
1077+ let toUserA = $t02946130697._1
1078+ let toUserB = $t02946130697._2
10341079 let poolTotalLoanEntries = if (isBorrowed)
10351080 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
10361081 else nil
10371082 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))
10381083 $Tuple2(entries, [toUserA, toUserB])
10391084 }
10401085 else throw("Strict value is not equal to itself.")
10411086 }
10421087 else throw("Strict value is not equal to itself.")
10431088 }
10441089 else throw("Strict value is not equal to itself.")
10451090 }
10461091 else throw("Strict value is not equal to itself.")
10471092 }
10481093 else throw("Strict value is not equal to itself.")
10491094 }
10501095
10511096
10521097 func parseRequest (requestId) = {
10531098 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
10541099 let user = request[0]
10551100 let pool = request[1]
10561101 let pmtA = parseIntValue(request[2])
10571102 let AId = request[3]
10581103 let pmtB = parseIntValue(request[4])
10591104 let BId = request[5]
10601105 let balA = parseIntValue(request[6])
10611106 let balB = parseIntValue(request[7])
10621107 let shareId = request[8]
10631108 let bwAsset = request[9]
10641109 let bwAmount = parseIntValue(request[10])
10651110 $Tuple11(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount)
10661111 }
10671112
10681113
10691114 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
10701115 then (borrowId != bId)
10711116 else false)
10721117 then throw("Wrong borrow asset")
10731118 else {
10741119 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
10751120 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
10761121 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10771122 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10781123 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1079- let $t03194132038 = if ((borrowId == aId))
1124+ let $t03267932776 = if ((borrowId == aId))
10801125 then $Tuple2(dPriceA, decPrA)
10811126 else $Tuple2(dPriceB, decPrB)
1082- let borrowPrice = $t03194132038._1
1083- let borrowDecPr = $t03194132038._2
1127+ let borrowPrice = $t03267932776._1
1128+ let borrowDecPr = $t03267932776._2
10841129 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10851130 }
10861131
10871132
10881133 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
10891134 then if ((assetIdToStr(pmts[0].assetId) != AId))
10901135 then throw("Wrong payment asset A")
10911136 else if ((assetIdToStr(pmts[1].assetId) != BId))
10921137 then throw("Wrong payment asset B")
10931138 else $Tuple2(pmts[0].amount, pmts[1].amount)
10941139 else if ((size(pmts) == 1))
10951140 then if ((assetIdToStr(pmts[0].assetId) == AId))
10961141 then $Tuple2(pmts[0].amount, 0)
10971142 else if ((assetIdToStr(pmts[0].assetId) == BId))
10981143 then $Tuple2(0, pmts[0].amount)
10991144 else throw("Wrong payment")
11001145 else throw("One or two payments expected")
11011146
11021147
11031148 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
11041149 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
11051150 if ((0 > pri))
11061151 then (pri * -1)
11071152 else pri
11081153 }
11091154
11101155
11111156 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1112- let $t03303833300 = if (claim)
1157+ let $t03377634038 = if (claim)
11131158 then claimFarmed(pType, pool)
11141159 else {
11151160 let claimedAsset = if ((pType == SF_POOL))
11161161 then SWOPID
11171162 else if ((pType == WX_POOL))
11181163 then WXID
11191164 else unknownPoolType()
11201165 $Tuple2(amount, claimedAsset)
11211166 }
1122- if (($t03303833300 == $t03303833300))
1167+ if (($t03377634038 == $t03377634038))
11231168 then {
1124- let claimAsset = $t03303833300._2
1125- let claimAmount = $t03303833300._1
1169+ let claimAsset = $t03377634038._2
1170+ let claimAmount = $t03377634038._1
11261171 let bal = accountBalance(claimAsset)
11271172 if ((bal == bal))
11281173 then if ((amount > bal))
11291174 then throw("To big amount to exchange")
11301175 else $Tuple2(claimAmount, claimAsset)
11311176 else throw("Strict value is not equal to itself.")
11321177 }
11331178 else throw("Strict value is not equal to itself.")
11341179 }
11351180
11361181
11371182 @Callable(i)
11381183 func getPoolInfoREADONLY (pool) = {
11391184 let poolAddr = addressFromStringValue(pool)
11401185 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1141- let $t03366733757 = getPoolData(Address(fromBase58String(pool)), pType)
1142- let AId = $t03366733757._1
1143- let BId = $t03366733757._2
1144- let balA = $t03366733757._3
1145- let balB = $t03366733757._4
1146- let shareId = $t03366733757._5
1186+ let $t03440534495 = getPoolData(Address(fromBase58String(pool)), pType)
1187+ let AId = $t03440534495._1
1188+ let BId = $t03440534495._2
1189+ let balA = $t03440534495._3
1190+ let balB = $t03440534495._4
1191+ let shareId = $t03440534495._5
11471192 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11481193 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
11491194 }
11501195
11511196
11521197
11531198 @Callable(i)
11541199 func getShareAssetPriceREADONLY (shareId) = {
11551200 let sharePrices = getSharePrice(shareId)
11561201 $Tuple2(nil, sharePrices)
11571202 }
11581203
11591204
11601205
11611206 @Callable(i)
11621207 func getUserPositionShareAmountREADONLY (user,posNum) = {
11631208 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
11641209 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
11651210 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0))
11661211 $Tuple2(nil, userCanWithdraw)
11671212 }
11681213
11691214
11701215
11711216 @Callable(i)
11721217 func getUserPositionREADONLY (user,pools,posNum) = {
11731218 func userPos (a,pool) = {
1174- let $t03463034700 = a
1175- let wAmountsA = $t03463034700._1
1176- let wAmountsB = $t03463034700._2
1177- let debts = $t03463034700._3
1178- let eqWAmountsA = $t03463034700._4
1179- let eqWAmountsB = $t03463034700._5
1180- let index = $t03463034700._6
1219+ let $t03536835438 = a
1220+ let wAmountsA = $t03536835438._1
1221+ let wAmountsB = $t03536835438._2
1222+ let debts = $t03536835438._3
1223+ let eqWAmountsA = $t03536835438._4
1224+ let eqWAmountsB = $t03536835438._5
1225+ let index = $t03536835438._6
11811226 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
11821227 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
11831228 else {
11841229 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1185- let $t03497935069 = getPoolData(Address(fromBase58String(pool)), pType)
1186- let AId = $t03497935069._1
1187- let BId = $t03497935069._2
1188- let balA = $t03497935069._3
1189- let balB = $t03497935069._4
1190- let shareId = $t03497935069._5
1230+ let $t03571735807 = getPoolData(Address(fromBase58String(pool)), pType)
1231+ let AId = $t03571735807._1
1232+ let BId = $t03571735807._2
1233+ let balA = $t03571735807._3
1234+ let balB = $t03571735807._4
1235+ let shareId = $t03571735807._5
11911236 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
11921237 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1193- let $t03528535405 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1194- let wAmountA = $t03528535405._1
1195- let wAmountB = $t03528535405._2
1238+ let $t03602336143 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1239+ let wAmountA = $t03602336143._1
1240+ let wAmountB = $t03602336143._2
11961241 if ((borrowAmount > 0))
11971242 then {
11981243 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
11991244 let debt = {
12001245 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
12011246 if ($isInstanceOf(@, "Int"))
12021247 then @
12031248 else throw(($getType(@) + " couldn't be cast to Int"))
12041249 }
12051250 if ((debt == debt))
12061251 then {
12071252 let amountToGetEx = if (if ((borrowAsset == AId))
12081253 then (debt > wAmountA)
12091254 else false)
12101255 then (debt - wAmountA)
12111256 else if (if ((borrowAsset == BId))
12121257 then (debt > wAmountB)
12131258 else false)
12141259 then (debt - wAmountB)
12151260 else 0
12161261 let amountToPay = if ((amountToGetEx > 0))
12171262 then if ((pType == SF_POOL))
12181263 then {
12191264 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12201265 ex._2
12211266 }
12221267 else if ((pType == WX_POOL))
12231268 then {
12241269 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12251270 ex._2
12261271 }
12271272 else unknownPoolType()
12281273 else 0
1229- let $t03631736536 = if ((borrowAsset == AId))
1274+ let $t03705537274 = if ((borrowAsset == AId))
12301275 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12311276 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1232- let eqWAmountA = $t03631736536._1
1233- let eqWAmountB = $t03631736536._2
1277+ let eqWAmountA = $t03705537274._1
1278+ let eqWAmountB = $t03705537274._2
12341279 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12351280 }
12361281 else throw("Strict value is not equal to itself.")
12371282 }
12381283 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
12391284 }
12401285 }
12411286
1242- let $t03679136902 = {
1287+ let $t03752937640 = {
12431288 let $l = pools
12441289 let $s = size($l)
12451290 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12461291 func $f0_1 ($a,$i) = if (($i >= $s))
12471292 then $a
12481293 else userPos($a, $l[$i])
12491294
12501295 func $f0_2 ($a,$i) = if (($i >= $s))
12511296 then $a
12521297 else throw("List size exceeds 20")
12531298
12541299 $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)
12551300 }
1256- let wAmountsA = $t03679136902._1
1257- let wAmountsB = $t03679136902._2
1258- let debts = $t03679136902._3
1259- let eqWAmountsA = $t03679136902._4
1260- let eqWAmountsB = $t03679136902._5
1301+ let wAmountsA = $t03752937640._1
1302+ let wAmountsB = $t03752937640._2
1303+ let debts = $t03752937640._3
1304+ let eqWAmountsA = $t03752937640._4
1305+ let eqWAmountsB = $t03752937640._5
12611306 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
12621307 }
12631308
12641309
12651310
12661311 @Callable(i)
12671312 func replenish (pool,leverage,borrowId) = valueOrElse(isActiveForUsers(), {
12681313 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
12691314 if (!(isPoolActive(pool, pType)))
12701315 then throw("Pool not active at this moment")
12711316 else if (if ((100 > leverage))
12721317 then true
12731318 else (leverage > 300))
12741319 then throw("Leverage can't be <100 and >300")
12751320 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
12761321 then (leverage > 100)
12771322 else false)
12781323 then throw("You can't borrow in this pool")
12791324 else {
1280- let $t03750037590 = getPoolData(Address(fromBase58String(pool)), pType)
1281- let AId = $t03750037590._1
1282- let BId = $t03750037590._2
1283- let balA = $t03750037590._3
1284- let balB = $t03750037590._4
1285- let shareId = $t03750037590._5
1325+ let $t03823838328 = getPoolData(Address(fromBase58String(pool)), pType)
1326+ let AId = $t03823838328._1
1327+ let BId = $t03823838328._2
1328+ let balA = $t03823838328._3
1329+ let balB = $t03823838328._4
1330+ let shareId = $t03823838328._5
12861331 if (if ((borrowId != AId))
12871332 then (borrowId != BId)
12881333 else false)
12891334 then throw("Wrong borrow asset")
12901335 else {
1291- let $t03767137730 = parseReplenishPmts(i.payments, AId, BId)
1292- let pmtA = $t03767137730._1
1293- let pmtB = $t03767137730._2
1336+ let $t03840938468 = parseReplenishPmts(i.payments, AId, BId)
1337+ let pmtA = $t03840938468._1
1338+ let pmtB = $t03840938468._2
12941339 let user = toString(i.caller)
12951340 let newPosNum = getNewUserPositionNumber(user)
12961341 if ((leverage > 100))
12971342 then {
12981343 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
12991344 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount)], ",")
13001345 let newRequestId = {
13011346 let @ = invoke(this, "createNewRequest", [request], nil)
13021347 if ($isInstanceOf(@, "Int"))
13031348 then @
13041349 else throw(($getType(@) + " couldn't be cast to Int"))
13051350 }
13061351 if ((newRequestId == newRequestId))
13071352 then {
13081353 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
13091354 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
13101355 if ((inv == inv))
13111356 then {
13121357 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1313- let $t03871938813 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1314- if (($t03871938813 == $t03871938813))
1358+ let $t03945739551 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1359+ if (($t03945739551 == $t03945739551))
13151360 then {
1316- let newBalB = $t03871938813._2
1317- let newBalA = $t03871938813._1
1361+ let newBalB = $t03945739551._2
1362+ let newBalA = $t03945739551._1
13181363 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1319- let $t03888338998 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1320- let wAmountA = $t03888338998._1
1321- let wAmountB = $t03888338998._2
1364+ let $t03962139736 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1365+ let wAmountA = $t03962139736._1
1366+ let wAmountB = $t03962139736._2
13221367 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13231368 }
13241369 else throw("Strict value is not equal to itself.")
13251370 }
13261371 else throw("Strict value is not equal to itself.")
13271372 }
13281373 else throw("Strict value is not equal to itself.")
13291374 }
13301375 else {
1331- let $t03905139166 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1332- if (($t03905139166 == $t03905139166))
1376+ let $t03978939904 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1377+ if (($t03978939904 == $t03978939904))
13331378 then {
1334- let axlyFee = $t03905139166._2
1335- let userStaked = $t03905139166._1
1336- let $t03917239266 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1337- if (($t03917239266 == $t03917239266))
1379+ let axlyFee = $t03978939904._2
1380+ let userStaked = $t03978939904._1
1381+ let $t03991040004 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1382+ if (($t03991040004 == $t03991040004))
13381383 then {
1339- let newBalB = $t03917239266._2
1340- let newBalA = $t03917239266._1
1384+ let newBalB = $t03991040004._2
1385+ let newBalA = $t03991040004._1
13411386 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1342- let $t03933639451 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1343- let wAmountA = $t03933639451._1
1344- let wAmountB = $t03933639451._2
1387+ let $t04007440189 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1388+ let wAmountA = $t04007440189._1
1389+ let wAmountB = $t04007440189._2
13451390 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13461391 }
13471392 else throw("Strict value is not equal to itself.")
13481393 }
13491394 else throw("Strict value is not equal to itself.")
13501395 }
13511396 }
13521397 }
13531398 })
13541399
13551400
13561401
13571402 @Callable(i)
13581403 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
13591404 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
13601405 if (!(isPoolActive(pool, pType)))
13611406 then throw("Pool not active at this moment")
13621407 else withdrawToUser(toString(i.caller), pool, toString(posId), false)
13631408 })
13641409
13651410
13661411
13671412 @Callable(i)
13681413 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
13691414 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
13701415 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
13711416 if (!(isPoolActive(poolId, pType)))
13721417 then throw("Pool not active at this moment")
13731418 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
13741419 then throw("There are no user position")
13751420 else if ((0 >= price))
13761421 then throw("Price must be greater than 0")
13771422 else if ((price > tokenOraclePrice))
13781423 then throw("Price must be less than current token price")
13791424 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
13801425 })
13811426
13821427
13831428
13841429 @Callable(i)
13851430 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
13861431 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
13871432 if (!(isPoolActive(poolId, pType)))
13881433 then throw("Pool not active at this moment")
13891434 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
13901435 then throw("No entry")
13911436 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
13921437 })
13931438
13941439
13951440
13961441 @Callable(i)
13971442 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
13981443 then throw("Already inited")
13991444 else if (!(isDefined(addressFromString(moneyBoxAddr))))
14001445 then throw("moneyBoxAddr is not correct address")
14011446 else if (!(isDefined(addressFromString(sfFarmingAddr))))
14021447 then throw("sfFarmingAddr is not correct address")
14031448 else if (!(isDefined(addressFromString(lendAddr))))
14041449 then throw("lendAddr is not correct address")
14051450 else if (!(isDefined(addressFromString(priceOracleAddr))))
14061451 then throw("priceOracleAddr is not correct address")
14071452 else if (!(isDefined(addressFromString(keeperExContract))))
14081453 then throw("keeperExContract is not correct address")
14091454 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
14101455 then throw("swopAssetId is not correct asset id")
14111456 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
14121457 then throw("swopAssetId is not correct asset id")
14131458 else if ((size(fromBase58String(operatorPubKey)) != 32))
14141459 then throw("operatorPubKey is not correct")
14151460 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
14161461 then throw("group1Admin1PubKey is not correct")
14171462 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
14181463 then throw("group1Admin2PubKey is not correct")
14191464 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
14201465 then throw("group2Admin1PubKey is not correct")
14211466 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
14221467 then throw("group2Admin2PubKey is not correct")
14231468 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)])
14241469
14251470
14261471
14271472 @Callable(i)
14281473 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
14291474 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
14301475 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
14311476 })
14321477
14331478
14341479
14351480 @Callable(i)
14361481 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1437- let $t04429044394 = parseRequest(requestId)
1438- let user = $t04429044394._1
1439- let pool = $t04429044394._2
1440- let pmtA = $t04429044394._3
1441- let AId = $t04429044394._4
1442- let pmtB = $t04429044394._5
1443- let BId = $t04429044394._6
1444- let balA = $t04429044394._7
1445- let balB = $t04429044394._8
1446- let shareId = $t04429044394._9
1447- let bwAsset = $t04429044394._10
1448- let bwAmount = $t04429044394._11
1482+ let $t04502845132 = parseRequest(requestId)
1483+ let user = $t04502845132._1
1484+ let pool = $t04502845132._2
1485+ let pmtA = $t04502845132._3
1486+ let AId = $t04502845132._4
1487+ let pmtB = $t04502845132._5
1488+ let BId = $t04502845132._6
1489+ let balA = $t04502845132._7
1490+ let balB = $t04502845132._8
1491+ let shareId = $t04502845132._9
1492+ let bwAsset = $t04502845132._10
1493+ let bwAmount = $t04502845132._11
14491494 if ((size(i.payments) != 1))
14501495 then throw("Wrong payment size")
14511496 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
14521497 then true
14531498 else (i.payments[0].amount != bwAmount))
14541499 then throw("Wrong payment")
14551500 else {
1456- let $t04458444684 = if ((AId == bwAsset))
1501+ let $t04532245422 = if ((AId == bwAsset))
14571502 then $Tuple2((pmtA + bwAmount), pmtB)
14581503 else $Tuple2(pmtA, (pmtB + bwAmount))
1459- let pmtAllA = $t04458444684._1
1460- let pmtAllB = $t04458444684._2
1504+ let pmtAllA = $t04532245422._1
1505+ let pmtAllB = $t04532245422._2
14611506 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1462- let $t04476644881 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1463- let userStaked = $t04476644881._1
1464- let axlyFee = $t04476644881._2
1507+ let $t04550445619 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1508+ let userStaked = $t04550445619._1
1509+ let axlyFee = $t04550445619._2
14651510 let posNum = getNewUserPositionNumber(user)
14661511 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
14671512 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1468- let $t04524145356 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1469- let wAmountA = $t04524145356._1
1470- let wAmountB = $t04524145356._2
1513+ let $t04597946094 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1514+ let wAmountA = $t04597946094._1
1515+ let wAmountB = $t04597946094._2
14711516 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
14721517 }
14731518 }))
14741519
14751520
14761521
14771522 @Callable(i)
14781523 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
14791524 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
14801525 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1481- let $t04587745967 = getPoolData(Address(fromBase58String(pool)), pType)
1482- let AId = $t04587745967._1
1483- let BId = $t04587745967._2
1484- let balA = $t04587745967._3
1485- let balB = $t04587745967._4
1486- let shareId = $t04587745967._5
1526+ let $t04661546705 = getPoolData(Address(fromBase58String(pool)), pType)
1527+ let AId = $t04661546705._1
1528+ let BId = $t04661546705._2
1529+ let balA = $t04661546705._3
1530+ let balB = $t04661546705._4
1531+ let shareId = $t04661546705._5
14871532 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
14881533 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
14891534 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
14901535 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
14911536 if ((liquidateAmount > userCanWithdraw))
14921537 then throw("You can't liquidate more than user have")
14931538 else if ((borrowAmount == 0))
14941539 then throw("You can't liquidate position without borrow")
14951540 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))]
14961541 }))
14971542
14981543
14991544
15001545 @Callable(i)
15011546 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15021547 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
15031548 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
15041549 if ((tokenOraclePrice > stopLossPrice))
15051550 then throw("Token price greater stop loss price")
15061551 else {
15071552 let res = withdrawToUser(user, pool, toString(posId), true)
15081553 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
15091554 }
15101555 }))
15111556
15121557
15131558
15141559 @Callable(i)
15151560 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15161561 let pType = getStringValue(this, (kPool + pool))
15171562 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1518- let $t04793748039 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1519- if (($t04793748039 == $t04793748039))
1563+ let $t04867548777 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1564+ if (($t04867548777 == $t04867548777))
15201565 then {
1521- let claimedAsset = $t04793748039._2
1522- let claimedAmount = $t04793748039._1
1566+ let claimedAsset = $t04867548777._2
1567+ let claimedAmount = $t04867548777._1
15231568 let rArgs = split(route, "__")
15241569 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15251570 then directSwopfiCPMM(rArgs, tokenToId)
15261571 else if ((rArgs[0] == "routingSwopfi"))
15271572 then directRoutingSwopfi(rArgs, tokenToId)
15281573 else throw("Wrong route")
15291574 if ((exchangedAmount == exchangedAmount))
15301575 then {
15311576 let newChange = ((claimedAmount + change) - amountToExchange)
15321577 let changeEntry = if ((newChange >= 0))
15331578 then [IntegerEntry((pool + kPoolCapChange), newChange)]
15341579 else nil
15351580 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
15361581 }
15371582 else throw("Strict value is not equal to itself.")
15381583 }
15391584 else throw("Strict value is not equal to itself.")
15401585 }))
15411586
15421587
15431588
15441589 @Callable(i)
15451590 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15461591 let pType = getStringValue(this, (kPool + pool))
1547- let $t04872348821 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1548- if (($t04872348821 == $t04872348821))
1592+ let $t04946149559 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1593+ if (($t04946149559 == $t04946149559))
15491594 then {
1550- let claimedAsset = $t04872348821._2
1551- let claimedAmount = $t04872348821._1
1595+ let claimedAsset = $t04946149559._2
1596+ let claimedAmount = $t04946149559._1
15521597 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
15531598 }
15541599 else throw("Strict value is not equal to itself.")
15551600 }))
15561601
15571602
15581603
15591604 @Callable(i)
15601605 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
15611606 then (type != WX_POOL)
15621607 else false)
15631608 then throw("Wrong type")
15641609 else if (if ((poolType != CPMM))
15651610 then (poolType != FLAT)
15661611 else false)
15671612 then throw("Wrong pool type")
15681613 else {
1569- let $t04934249436 = getPoolData(Address(fromBase58String(poolAddr)), type)
1570- let aId = $t04934249436._1
1571- let bId = $t04934249436._2
1572- let aBal = $t04934249436._3
1573- let bBal = $t04934249436._4
1574- let shareId = $t04934249436._5
1614+ let $t05008050174 = getPoolData(Address(fromBase58String(poolAddr)), type)
1615+ let aId = $t05008050174._1
1616+ let bId = $t05008050174._2
1617+ let aBal = $t05008050174._3
1618+ let bBal = $t05008050174._4
1619+ let shareId = $t05008050174._5
15751620 if ((0 > inFeeNoLoan))
15761621 then throw("inFeeNoLoan must be greater than 0")
15771622 else if ((0 > inFeeLoan))
15781623 then throw("inFeeLoan must be greater than 0")
15791624 else if ((0 > capFeeNoLoan))
15801625 then throw("capFeeNoLoan must be greater than 0")
15811626 else if ((0 > capFeeWithLoan))
15821627 then throw("capFeeWithLoan must be greater than 0")
15831628 else if ((0 > stoplossFeeNoLoan))
15841629 then throw("stoplossFeeNoLoan must be greater than 0")
15851630 else if ((0 > stoplossFeeWithLoan))
15861631 then throw("stoplossFeeWithLoan must be greater than 0")
15871632 else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan), IntegerEntry((poolAddr + kPoolInterestLoan), 0), IntegerEntry((poolAddr + kPoolInterestNoLoan), 0), StringEntry((kPool + poolAddr), type), StringEntry((poolAddr + kPoolType), poolType), StringEntry((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow)]
15881633 }))
15891634
15901635
15911636
15921637 @Callable(i)
15931638 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
15941639 then throw(("Can't find pool with addr " + poolAddr))
15951640 else if ((0 > inFeeNoLoan))
15961641 then throw("inFeeNoLoan must be greater than 0")
15971642 else if ((0 > inFeeLoan))
15981643 then throw("inFeeLoan must be greater than 0")
15991644 else if ((0 > capFeeNoLoan))
16001645 then throw("capFeeNoLoan must be greater than 0")
16011646 else if ((0 > capFeeWithLoan))
16021647 then throw("capFeeWithLoan must be greater than 0")
16031648 else if ((0 > stoplossFeeNoLoan))
16041649 then throw("stoplossFeeNoLoan must be greater than 0")
16051650 else if ((0 > stoplossFeeWithLoan))
16061651 then throw("stoplossFeeWithLoan must be greater than 0")
16071652 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)]))
16081653
16091654
16101655
16111656 @Callable(i)
16121657 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
16131658 then throw("dApp already active")
16141659 else [BooleanEntry(kActive, true)])
16151660
16161661
16171662
16181663 @Callable(i)
16191664 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
16201665 then throw("dApp already shutdown")
16211666 else [BooleanEntry(kActive, false)])
16221667
16231668
16241669
16251670 @Callable(i)
16261671 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
16271672 then throw("dApp already active for users")
16281673 else [BooleanEntry(kActiveUsers, true)])
16291674
16301675
16311676
16321677 @Callable(i)
16331678 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
16341679 then throw("dApp already shutdown for users")
16351680 else [BooleanEntry(kActiveUsers, false)])
16361681
16371682
16381683
16391684 @Callable(i)
16401685 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
16411686 then throw("SWOPFI already active")
16421687 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
16431688
16441689
16451690
16461691 @Callable(i)
16471692 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
16481693 then throw("SWOPFI already shutdown")
16491694 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
16501695
16511696
16521697
16531698 @Callable(i)
16541699 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
16551700 then throw("WX already active")
16561701 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
16571702
16581703
16591704
16601705 @Callable(i)
16611706 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
16621707 then throw("WX already shutdown")
16631708 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
16641709
16651710
16661711
16671712 @Callable(i)
16681713 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
16691714 then throw("Unknown pool")
16701715 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
16711716 then throw("Pool already active")
16721717 else [BooleanEntry((pool + kPoolActive), true)])
16731718
16741719
16751720
16761721 @Callable(i)
16771722 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
16781723 then throw("Unknown pool")
16791724 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
16801725 then throw("Pool already shutdown")
16811726 else [BooleanEntry((pool + kPoolActive), false)])
16821727
16831728

github/deemru/w8io/3ef1775 
355.11 ms