tx · 6orvAq5eLYtuVEJ5TZqEwGvGWcWmxEw5cJYcY64tgthf

3N1yLGKxTbjWG76Wfcu3g1mKFy1KwN797Us:  -0.03700000 Waves

2022.09.08 14:38 [2220077] smart account 3N1yLGKxTbjWG76Wfcu3g1mKFy1KwN797Us > SELF 0.00000000 Waves

{ "type": 13, "id": "6orvAq5eLYtuVEJ5TZqEwGvGWcWmxEw5cJYcY64tgthf", "fee": 3700000, "feeAssetId": null, "timestamp": 1662637118540, "version": 2, "chainId": 84, "sender": "3N1yLGKxTbjWG76Wfcu3g1mKFy1KwN797Us", "senderPublicKey": "Fde5uhpJbFyNR686oXgTi64Bk9LBabxZiNKCncCk6vKz", "proofs": [ "2gHnZYRJtEye11UekASPVhRaEpyRTJhCLpoSaYxuwoewiC4bi9SZk8kRYKUrTuHv8uv8S5XekXqVeTXYDohSzsaJ", "4Q7U4fudNgGD8bHeGCHGAfy6gmnihphvbQTLQtZgXg68cFGV6nHiCc8KQD9qsk84iUfRHbHqdZjFczApUaJ7n6xH" ], "script": "base64:BgJjCAISBAoCEQESBgoECAEBBBIECgIBBBIDCgEBEgYKBAgIAQgSBAoCCAESAwoBERIECgIRARIFCgMBCAgSBAoCCAESBQoDCAEBEgASABIECgIRBBIECgIBARIAEgASABIDCgEBXQAJUFJFQ0lTSU9OAMCEPQAFTUFYX0EAwIQ9AAxNQVhfQV9DSEFOR0UACgAIREVDSU1BTFMABgANTUlOX1JBTVBfVElNRQkAaQIAgKMFADwAB3ZlcnNpb24CBTMuMC4wAAhrVmVyc2lvbgIHdmVyc2lvbgAHa0Fzc2V0cwIJYXNzZXRfaWRzAA1rQXNzZXRCYWxhbmNlAghfYmFsYW5jZQAHa0FjdGl2ZQIGYWN0aXZlAAZrQ2F1c2UCDnNodXRkb3duX2NhdXNlAA1rU2hhcmVBc3NldElkAg5zaGFyZV9hc3NldF9pZAARa1NoYXJlQXNzZXRTdXBwbHkCEnNoYXJlX2Fzc2V0X3N1cHBseQAEa0ZlZQIKY29tbWlzc2lvbgASa0RBcHBUaHJlc2hvbGRDb2VmAhFkQXBwVGhyZXNob2xkQ29lZgAMa1VTRE5BZGRyZXNzAhhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MACmtEaXNjb3VudHMCCWRpc2NvdW50cwAPa0Rpc2NvdW50VmFsdWVzAg9kaXNjb3VudF92YWx1ZXMADmtVc2VyU3dvcEluR292AgxfU1dPUF9hbW91bnQADWtGaXJzdEhhcnZlc3QCDWZpcnN0X2hhcnZlc3QAE2tGaXJzdEhhcnZlc3RIZWlnaHQCFGZpcnN0X2hhcnZlc3RfaGVpZ2h0AAtrU2hhcmVMaW1pdAIcc2hhcmVfbGltaXRfb25fZmlyc3RfaGFydmVzdAALa0Jhc2VQZXJpb2QCC2Jhc2VfcGVyaW9kAA1rUGVyaW9kTGVuZ3RoAg1wZXJpb2RfbGVuZ3RoAAxrU3RhcnRIZWlnaHQCDHN0YXJ0X2hlaWdodAANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABBrTW9uZXlCb3hBZGRyZXNzAhFtb25leV9ib3hfYWRkcmVzcwALa0dvdkFkZHJlc3MCEmdvdmVybmFuY2VfYWRkcmVzcwAOa1ZvdGluZ0FkZHJlc3MCDnZvdGluZ19hZGRyZXNzAA9rRmFybWluZ0FkZHJlc3MCD2Zhcm1pbmdfYWRkcmVzcwAGb3JhY2xlCQEHQWRkcmVzcwEBGgFU6UWqHpAvOq7xug7mLpqSXxqYhOHzYrMIARNnZXRCYXNlNThGcm9tT3JhY2xlAQNrZXkEByRtYXRjaDAJAJ0IAgUGb3JhY2xlBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQkArAICBQNrZXkCCGlzIGVtcHR5AAxhZG1pblB1YktleTEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MQAMYWRtaW5QdWJLZXkyCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTIADGFkbWluUHViS2V5MwkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkzABFhZG1pblB1YktleUludm9rZQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRJrQWRtaW5JbnZva2VQdWJLZXkAD21vbmV5Qm94QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEGtNb25leUJveEFkZHJlc3MACmdvdkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQtrR292QWRkcmVzcwASc3Rha2luZ1VTRE5BZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUMa1VTRE5BZGRyZXNzAA12b3RpbmdBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUOa1ZvdGluZ0FkZHJlc3MADmZhcm1pbmdBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUPa0Zhcm1pbmdBZGRyZXNzABJjYXBNb25leUJveEFkZHJlc3MJAQdBZGRyZXNzAQEaAVTpRaoekC86rvG6DuYumpJfGpiE4fNiswgABFVTRE4BIG8ko8qrMNxSKZjoLGFa7lp/I03CLXW76Z2qVODS0AfBAA1zdGFraW5nQXNzZXRzCQDMCAIJANgEAQUEVVNETgUDbmlsAApiYXNlUGVyaW9kCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwULa0Jhc2VQZXJpb2QCEUVtcHR5IGtCYXNlUGVyaW9kAAtzdGFydEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFDGtTdGFydEhlaWdodAISRW1wdHkga1N0YXJ0SGVpZ2h0AAxwZXJpb2RMZW5ndGgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQ1rUGVyaW9kTGVuZ3RoAhNFbXB0eSBrUGVyaW9kTGVuZ3RoABVmaXJzdEhhcnZlc3RFbmRQZXJpb2QJAGQCCQBkAgUKYmFzZVBlcmlvZAkAaQIJAGUCBQZoZWlnaHQFC3N0YXJ0SGVpZ2h0BQxwZXJpb2RMZW5ndGgAAwAGYWN0aXZlCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzBQdrQWN0aXZlAAxzaGFyZUFzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUNa1NoYXJlQXNzZXRJZAALc2hhcmVTdXBwbHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFEWtTaGFyZUFzc2V0U3VwcGx5AAlmZWVTY2FsZTYAwIQ9AANmZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFBGtGZWUADWZlZUdvdmVybmFuY2UJAGsDACgFCWZlZVNjYWxlNgBkAAlpbml0aWFsX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCWluaXRpYWxfQQAIZnV0dXJlX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCGZ1dHVyZV9BAA5pbml0aWFsX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg5pbml0aWFsX0FfdGltZQAAAA1mdXR1cmVfQV90aW1lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCDWZ1dHVyZV9BX3RpbWUAAAAIYXNzZXRJZHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUHa0Fzc2V0cwIBLAAGbkNvaW5zCQCQAwEFCGFzc2V0SWRzAQdzdXNwZW5kAQVjYXVzZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcJAMwIAgkBC1N0cmluZ0VudHJ5AgUGa0NhdXNlBQVjYXVzZQUDbmlsAQ10aHJvd0lzQWN0aXZlAAkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUBCGlzQWN0aXZlAAMFBmFjdGl2ZQUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBC2lzQWRtaW5DYWxsAQFpAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUMYWRtaW5QdWJLZXkxCQDMCAIFDGFkbWluUHViS2V5MgkAzAgCBQxhZG1pblB1YktleTMFA25pbAgFAWkPY2FsbGVyUHVibGljS2V5BQR1bml0CQACAQIhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIFBHRoaXMIBQFpBmNhbGxlcgUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24ABGJpZzIJALYCAQACAA5ibG9ja1RpbWVzdGFtcAUGaGVpZ2h0AQZhc3NlcnQBAWEDBQFhBwYBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQh1c2VyQWRkcgQKc3dvcEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIJAKUIAQUIdXNlckFkZHIFDmtVc2VyU3dvcEluR292AAAEDmRpc2NvdW50VmFsdWVzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUPa0Rpc2NvdW50VmFsdWVzAgEsBAlkaXNjb3VudHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUGb3JhY2xlBQprRGlzY291bnRzAgEsAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAAkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwAAAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAQkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwACBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwABAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAgkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwADBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwACAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAEBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwADAwkAZwIFCnN3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAECQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAQFCWZlZVNjYWxlNgECX0EABAJ0MQUNZnV0dXJlX0FfdGltZQQCQTEFCGZ1dHVyZV9BAwkAZgIFAnQxBQ5ibG9ja1RpbWVzdGFtcAQCQTAFCWluaXRpYWxfQQQCdDAFDmluaXRpYWxfQV90aW1lAwkAZgIFAkExBQJBMAkAZAIFAkEwCQBpAgkAaAIJAGUCBQJBMQUCQTAJAGUCBQ5ibG9ja1RpbWVzdGFtcAUCdDAJAGUCBQJ0MQUCdDAJAGUCBQJBMAkA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DSR0MDEwNTM0MTA1OTgCXzEEBWluZGV4CAUNJHQwMTA1MzQxMDU5OAJfMgQMeHBfcmVkdWNlZF9pCQCRAwIFCnhwX3JlZHVjZWQFAWkEAmR5CQBlAgkAZQIFDHhwX3JlZHVjZWRfaQkBB2dldF95X0QEBQNhbXAFAWkFCnhwX3JlZHVjZWQFAkQxAAEJAJQKAgUCZHkJAGUCBQRkeV8wBQJkeQENZ2V0U3RyQXNzZXRJZAEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA2AQBBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAIFV0FWRVMJAAIBAgtNYXRjaCBlcnJvcgEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgVzdGFrZQdhc3NldElkAwUFc3Rha2UJAJQKAgIMbG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MJAJQKAgIOdW5sb2NrTmV1dHJpbm8FEnN0YWtpbmdVU0ROQWRkcmVzcwERY2FsY1N0YWtpbmdQYXJhbXMDBXN0YWtlBmFtb3VudAdhc3NldElkAwUFc3Rha2UEDSR0MDExMTYyMTEyMjgJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFDSR0MDExMTYyMTEyMjgCXzEEC3N0YWtpbmdBZGRyCAUNJHQwMTExNjIxMTIyOAJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBQZhbW91bnQFA25pbAQNJHQwMTEzMTQxMTM4MAkBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFBXN0YWtlBQdhc3NldElkBARjYWxsCAUNJHQwMTEzMTQxMTM4MAJfMQQLc3Rha2luZ0FkZHIIBQ0kdDAxMTMxNDExMzgwAl8yCQCWCgQFBGNhbGwFC3N0YWtpbmdBZGRyCQDMCAIFBmFtb3VudAkAzAgCCQDYBAEFB2Fzc2V0SWQFA25pbAUDbmlsAQVzdGFrZQIGYW1vdW50DWFzc2V0SWRTdHJpbmcDCQEPY29udGFpbnNFbGVtZW50AgUNc3Rha2luZ0Fzc2V0cwUNYXNzZXRJZFN0cmluZwQNJHQwMTE1NjcxMTY2OQkBEWNhbGNTdGFraW5nUGFyYW1zAwYFBmFtb3VudAkA2QQBBQ1hc3NldElkU3RyaW5nBARjYWxsCAUNJHQwMTE1NjcxMTY2OQJfMQQEYWRkcggFDSR0MDExNTY3MTE2NjkCXzIEBnBhcmFtcwgFDSR0MDExNTY3MTE2NjkCXzMECHBheW1lbnRzCAUNJHQwMTE1NjcxMTY2OQJfNAkA/AcEBQRhZGRyBQRjYWxsBQZwYXJhbXMFCHBheW1lbnRzAAABB3Vuc3Rha2UCBmFtb3VudA1hc3NldElkU3RyaW5nAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFDWFzc2V0SWRTdHJpbmcEDSR0MDExODU0MTE5NTcJARFjYWxjU3Rha2luZ1BhcmFtcwMHBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFDSR0MDExODU0MTE5NTcCXzEEBGFkZHIIBQ0kdDAxMTg1NDExOTU3Al8yBAZwYXJhbXMIBQ0kdDAxMTg1NDExOTU3Al8zBAhwYXltZW50cwgFDSR0MDExODU0MTE5NTcCXzQJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwAAAQxzdGFrZWRBbW91bnQBB2Fzc2V0SWQEFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQDYUlkBQckbWF0Y2gwAwkAAAIFA2FJZAUEVVNETgkAmggCBRJzdGFraW5nVVNETkFkZHJlc3MJAKwCAgkArAICCQCsAgICDHJwZF9iYWxhbmNlXwkA2AQBBQNhSWQCAV8JAKUIAQUEdGhpcwAAAwkAAQIFByRtYXRjaDACBFVuaXQAAAkAAgECC01hdGNoIGVycm9yBAckbWF0Y2gwBRZzdGFrZWRBbW91bnRDYWxjdWxhdGVkAwkAAQIFByRtYXRjaDACA0ludAQBaQUHJG1hdGNoMAUBaQAAAQ9jaGVja1N1c3BpY2lvdXMABBBjb250cmFjdEJhbGFuY2VzCQEDX3hwAAoBDGNoZWNrQmFsYW5jZQIDYWNjB2Fzc2V0SWQEDSR0MDEyNTY4MTI1OTMFA2FjYwQKc3VzcGljaW91cwgFDSR0MDEyNTY4MTI1OTMCXzEEAWkIBQ0kdDAxMjU2ODEyNTkzAl8yAwUKc3VzcGljaW91cwkAlAoCBQpzdXNwaWNpb3VzBQFpBAhhQmFsYW5jZQkAZAIJAPAHAgUEdGhpcwkA2QQBBQdhc3NldElkCQEMc3Rha2VkQW1vdW50AQkA2QQBBQdhc3NldElkAwkAZgIJAJEDAgUQY29udHJhY3RCYWxhbmNlcwUBaQUIYUJhbGFuY2UJAJQKAgYFAWkJAJQKAgcJAGQCBQFpAAEKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIHAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDGNoZWNrQmFsYW5jZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8BEXN1c3BlbmRTdXNwaWNpb3VzAQFpCQEHc3VzcGVuZAEJAKwCAgIdU3VzcGljaW91cyBzdGF0ZSB3aXRoIGFzc2V0OiAJAJEDAgUIYXNzZXRJZHMFAWkBDnJldHVyblBheW1lbnRzAgZjYWxsZXIIcGF5bWVudHMKAQ1wYXJzZVBheW1lbnRzAgNhY2MHcGF5bWVudAkAzQgCBQNhY2MJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcggFB3BheW1lbnQGYW1vdW50CAUHcGF5bWVudAdhc3NldElkCgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1wYXJzZVBheW1lbnRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwESY2hlY2tEQXBwVGhyZXNob2xkAQtuZXdCYWxhbmNlcwQRZEFwcFRocmVzaG9sZENvZWYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBRJrREFwcFRocmVzaG9sZENvZWYCGE5vIGRBcHBUaHJlc2hvbGRDb2VmIGtleQQOdGhyZXNob2xkU2NhbGUAkE4ECm1heEJhbGFuY2UJAJYDAQULbmV3QmFsYW5jZXMECm1pbkJhbGFuY2UJAJcDAQULbmV3QmFsYW5jZXMEBXJhdGlvCQBrAwUKbWF4QmFsYW5jZQUOdGhyZXNob2xkU2NhbGUFCm1pbkJhbGFuY2UDCQBmAgUFcmF0aW8JAGgCBRFkQXBwVGhyZXNob2xkQ29lZgUOdGhyZXNob2xkU2NhbGUJAAIBAjhOZXcgYmFsYW5jZSBpbiBhc3NldHMgb2YgdGhlIERBcHAgaXMgbGVzcyB0aGFuIHRocmVzaG9sZAcBCmNoZWNrQ29pbnMBCGFzc2V0SWRzBAVjb2lucwkAtQkCBQhhc3NldElkcwIBLAoBCWNoZWNrQ29pbgIFZXJyb3IHYXNzZXRJZAQFYXNzZXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA2QQBBQdhc3NldElkCQCsAgICEmZyb21CYXNlNThTdHJpbmc6IAUHYXNzZXRJZAQIZGVjaW1hbHMICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUFYXNzZXQJAKwCAgILYXNzZXRJbmZvOiAFB2Fzc2V0SWQIZGVjaW1hbHMDCQECIT0CBQhkZWNpbWFscwUIREVDSU1BTFMJAAIBAg53cm9uZyBkZWNpbWFscwcKAAIkbAUFY29pbnMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJY2hlY2tDb2luAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADxMDbXNnAQFEAgJ4cANhbXAEAUQJAQ5nZXRfRF9pbnRlcm5hbAIFAnhwBQNhbXAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgIBRAUBRAUDbmlsBQFEA21zZwEEaW5pdAQIYXNzZXRJZHMCX0ESX2RBcHBUaHJlc2hvbGRDb2VmDGZpcnN0SGFydmVzdAMJAQEhAQkAnggBBQR0aGlzCQACAQITQWxyZWFkeSBpbml0aWFsaXplZAMJAGcCAAAFAl9BCQACAQIUQW1wIG11c3QgYmUgbXVzdCA+IDADCQBnAgAABRJfZEFwcFRocmVzaG9sZENvZWYJAAIBAh9kQXBwIFRocmVzaG9sZCBDb2VmIG11c3QgYmUgPiAwBAlzaGFyZU5hbWUCC3NfTXVsdGlfVVNEBBBzaGFyZURlc2NyaXB0aW9uCQCsAgICQlNoYXJlVG9rZW4gb2YgU3dvcEZpIHByb3RvY29sIGZvciBNdWx0aVN0YWJsZSBVU0QgcG9vbCBhdCBhZGRyZXNzIAkApQgBBQR0aGlzBAppc3N1ZVRva2VuCQDCCAUFCXNoYXJlTmFtZQUQc2hhcmVEZXNjcmlwdGlvbgAAAAYGBAd0b2tlbklkCQC4CAEFCmlzc3VlVG9rZW4DCQEKY2hlY2tDb2lucwEFCGFzc2V0SWRzCQEFdGhyb3cABAliYXNlRW50cnkJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa1ZlcnNpb24FB3ZlcnNpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgUHa0Fzc2V0cwUIYXNzZXRJZHMJAMwIAgkBDEludGVnZXJFbnRyeQICCWluaXRpYWxfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQJfQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUEa0ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUGb3JhY2xlAg1iYXNlX2ZlZV9mbGF0CQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtTaGFyZUFzc2V0SWQJANgEAQUHdG9rZW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa0RBcHBUaHJlc2hvbGRDb2VmBRJfZEFwcFRocmVzaG9sZENvZWYJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIFCmlzc3VlVG9rZW4FA25pbAMFDGZpcnN0SGFydmVzdAkAzggCBQliYXNlRW50cnkJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtGaXJzdEhhcnZlc3QFDGZpcnN0SGFydmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa0ZpcnN0SGFydmVzdEhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0CQBoAgUVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kBQxwZXJpb2RMZW5ndGgFA25pbAUJYmFzZUVudHJ5A21zZwEMYWRkTGlxdWlkaXR5Ag1taW5NaW50QW1vdW50DHN0YWtlRmFybWluZwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQDYW1wCQECX0EABAJ4cAkBA194cAAEAkQwAwkAAAIFC3NoYXJlU3VwcGx5AAAAAAkBB2dldERNZW0CBQJ4cAUDYW1wBAhwYXltZW50cwgFA21zZwhwYXltZW50cwQMcGF5bWVudHNTaXplCQCQAwEFCHBheW1lbnRzCgENdmFsaWRQYXltZW50cwEBbgMJAGYCBQxwYXltZW50c1NpemUFBm5Db2lucwkAAgEJAKwCAgIQcGF5bWVudHMgc2l6ZSA+IAkApAMBBQZuQ29pbnMDCQBmAgABBQxwYXltZW50c1NpemUJAAIBAhFwYXltZW50cyBzaXplIDwgMQMDCQAAAgULc2hhcmVTdXBwbHkAAAkBAiE9AgUGbkNvaW5zBQxwYXltZW50c1NpemUHCQACAQIiaW5pdGlhbCBkZXBvc2l0IHJlcXVpcmVzIGFsbCBjb2lucwoBDHBheW1hbnRWYWxpZAIDYWNjB3BheW1lbnQDCQEPY29udGFpbnNFbGVtZW50AgUIYXNzZXRJZHMJAQ1nZXRTdHJBc3NldElkAQgFB3BheW1lbnQHYXNzZXRJZAYJAAIBAhhJbnZhbGlkIGFzc2V0IGluIHBheW1lbnQKAAIkbAUIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMcGF5bWFudFZhbGlkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwMJAQEhAQkBDXZhbGlkUGF5bWVudHMBBQxwYXltZW50c1NpemUJAQV0aHJvdwAECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyBQhwYXltZW50cwoBDXBhcnNlUGF5bWVudHMCA2FjYwdhc3NldElkBA0kdDAxNjkwMTE2OTMwBQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMTY5MDExNjkzMAJfMQQBaQgFDSR0MDE2OTAxMTY5MzACXzIEAWoIBQ0kdDAxNjkwMTE2OTMwAl8zAwMJAGYCBQxwYXltZW50c1NpemUFAWoJAAACCQENZ2V0U3RyQXNzZXRJZAEICQCRAwIFCHBheW1lbnRzBQFqB2Fzc2V0SWQFB2Fzc2V0SWQHCQCVCgMJAM0IAgULbmV3QmFsYW5jZXMJAGQCCQCRAwIFAnhwBQFpCAkAkQMCBQhwYXltZW50cwUBagZhbW91bnQJAGQCBQFpAAEJAGQCBQFqAAEJAJUKAwkAzQgCBQtuZXdCYWxhbmNlcwkAkQMCBQJ4cAUBaQkAZAIFAWkAAQUBagQNJHQwMTcxNTAxNzIzNgoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENcGFyc2VQYXltZW50cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC25ld0JhbGFuY2VzCAUNJHQwMTcxNTAxNzIzNgJfMQQBawgFDSR0MDE3MTUwMTcyMzYCXzIEDnBhcnNlZFBheW1lbnRzCAUNJHQwMTcxNTAxNzIzNgJfMwMJAGYCBQxwYXltZW50c1NpemUFDnBhcnNlZFBheW1lbnRzCQACAQIXSW5jb3JlY3QgcGF5bWVudHMgb3JkZXIDCQESY2hlY2tEQXBwVGhyZXNob2xkAQULbmV3QmFsYW5jZXMJAQV0aHJvdwAEAkQxCQEHZ2V0RE1lbQIFC25ld0JhbGFuY2VzBQNhbXADCQEGYXNzZXJ0AQkAZgIFAkQxBQJEMAkAAgECB0QxID4gRDAEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBCAUDbXNnBmNhbGxlcgoBEWNhbGNTY3JpcHRBY3Rpb25zAgNhY2MKbmV3QmFsYW5jZQQNJHQwMTc2MzcxNzY3OAUDYWNjBAtpbnZCYWxhbmNlcwgFDSR0MDE3NjM3MTc2NzgCXzEEDXNjcmlwdEFjdGlvbnMIBQ0kdDAxNzYzNzE3Njc4Al8yBAFpCAUNJHQwMTc2MzcxNzY3OAJfMwMJAGYCBQtzaGFyZVN1cHBseQAABARfZmVlCQBpAgkAaAIJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFBm5Db2lucwkAaAIABAkAZQIFBm5Db2lucwABBARmZWVzBAxpZGVhbEJhbGFuY2UJAGsDBQJEMQkAkQMCBQJ4cAUBaQUCRDAECmRpZmZlcmVuY2UDCQBmAgUMaWRlYWxCYWxhbmNlBQpuZXdCYWxhbmNlCQBlAgUMaWRlYWxCYWxhbmNlBQpuZXdCYWxhbmNlCQBlAgUKbmV3QmFsYW5jZQUMaWRlYWxCYWxhbmNlCQBrAwUEX2ZlZQUKZGlmZmVyZW5jZQUJZmVlU2NhbGU2BA5nb3Zlcm5hbmNlRmVlcwkAawMFBGZlZXMFDWZlZUdvdmVybmFuY2UFCWZlZVNjYWxlNgQMZmluYWxCYWxhbmNlCQBlAgUKbmV3QmFsYW5jZQUEZmVlcwQQaW52YXJpYW50QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFBGZlZXMEA3BtdAkAZQIFCm5ld0JhbGFuY2UJAJEDAgUCeHAFAWkEA2ludgMJAGYCBQNwbXQAAAkBBXN0YWtlAgkAZQIFA3BtdAUEZmVlcwkAkQMCBQhhc3NldElkcwUBaQkBB3Vuc3Rha2UCBQRmZWVzCQCRAwIFCGFzc2V0SWRzBQFpAwkAAAIFA2ludgUDaW52CQCVCgMJAM0IAgULaW52QmFsYW5jZXMFEGludmFyaWFudEJhbGFuY2UJAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRJjYXBNb25leUJveEFkZHJlc3MJAGUCBQRmZWVzBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMJANkEAQkAkQMCBQhhc3NldElkcwUBaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlBQxmaW5hbEJhbGFuY2UFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQDaW52CQEFc3Rha2UCBQpuZXdCYWxhbmNlCQCRAwIFCGFzc2V0SWRzBQFpAwkAAAIFA2ludgUDaW52CQCVCgMJAM0IAgULaW52QmFsYW5jZXMFCm5ld0JhbGFuY2UJAM0IAgUNc2NyaXB0QWN0aW9ucwkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUBaQUNa0Fzc2V0QmFsYW5jZQUKbmV3QmFsYW5jZQkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMTkyMjYxOTMxNAoAAiRsBQtuZXdCYWxhbmNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQERY2FsY1NjcmlwdEFjdGlvbnMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtpbnZCYWxhbmNlcwgFDSR0MDE5MjI2MTkzMTQCXzEEDXNjcmlwdEFjdGlvbnMIBQ0kdDAxOTIyNjE5MzE0Al8yBAJEMgkBB2dldERNZW0CBQtpbnZCYWxhbmNlcwUDYW1wBAttaW50X2Ftb3VudAMJAAACBQtzaGFyZVN1cHBseQAABQJEMQkAawMFC3NoYXJlU3VwcGx5CQBlAgUCRDIFAkQwBQJEMAMJAQZhc3NlcnQBCQBnAgULbWludF9hbW91bnQFDW1pbk1pbnRBbW91bnQJAAIBAhRTbGlwcGFnZSBzY3Jld2VkIHlvdQMFDHN0YWtlRmFybWluZwQCcmUJAPwHBAUEdGhpcwIMcmVpc3N1ZVNoYXJlCQDMCAIFC21pbnRfYW1vdW50BQNuaWwFA25pbAMJAAACBQJyZQUCcmUEAXMJAPwHBAUOZmFybWluZ0FkZHJlc3MCD2xvY2tTaGFyZVRva2VucwkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc2hhcmVBc3NldElkBQttaW50X2Ftb3VudAUDbmlsAwkAAAIFAXMFAXMJAM0IAgUNc2NyaXB0QWN0aW9ucwkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBkAgULc2hhcmVTdXBwbHkFC21pbnRfYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBB1JlaXNzdWUDBQxzaGFyZUFzc2V0SWQFC21pbnRfYW1vdW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgULbWludF9hbW91bnQFDHNoYXJlQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBQtzaGFyZVN1cHBseQULbWludF9hbW91bnQFA25pbANtc2cBDHJlaXNzdWVTaGFyZQEGYW1vdW50CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFA21zZwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUGYW1vdW50BgUDbmlsA21zZwEFZ2V0RHkECWFzc2V0RnJvbQdhc3NldFRvAmR4C3VzZXJBZGRyZXNzBAJ4cAkBA194cAAECWZyb21JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQlhc3NldEZyb20CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUHYXNzZXRUbwIRdW5rbm93biB0b2tlbiBvdXQEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEAmR5CQBlAgkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFAXkAAQQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEJAQdBZGRyZXNzAQkA2QQBBQt1c2VyQWRkcmVzcwQEX2ZlZQkAawMJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFAmR5BQlmZWVTY2FsZTYJAJQKAgUDbmlsCQCUCgIJAGUCBQJkeQUEX2ZlZQUEX2ZlZQNtc2cBCGV4Y2hhbmdlAgh0b2tlbk91dAZtaW5fZHkJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAQHdG9rZW5JbgkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBAt0b2tlbk91dEI1OAkA2QQBBQh0b2tlbk91dAQCZHgIBQdwYXltZW50BmFtb3VudAQJZnJvbUluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFB3Rva2VuSW4CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0BAJ4cAkBA194cAAEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEA19keQkAZQIJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQF5AAEEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBCAUDbXNnBmNhbGxlcgQEX2ZlZQkAawMFA19keQkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUJZmVlU2NhbGU2BAJkeQkAZQIFA19keQUEX2ZlZQQOZ292ZXJuYW5jZUZlZXMJAGsDBQRfZmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYDCQEGYXNzZXJ0AQkAZwIFAmR5BQZtaW5fZHkJAAIBAi5FeGNoYW5nZSByZXN1bHRlZCBpbiBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkCgEPbWFrZU5ld0JhbGFuY2VzAgNhY2MMdG9rZW5CYWxhbmNlBA0kdDAyMjAyNjIyMDUyBQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjIwMjYyMjA1MgJfMQQBaQgFDSR0MDIyMDI2MjIwNTICXzIDCQAAAgUBaQUJZnJvbUluZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGQCBQx0b2tlbkJhbGFuY2UFAmR4CQBkAgUBaQABAwkAAAIFAWkFB3RvSW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZQIFDHRva2VuQmFsYW5jZQUDX2R5CQBkAgUBaQABCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFDHRva2VuQmFsYW5jZQkAZAIFAWkAAQQNJHQwMjIzMDMyMjM2NAoAAiRsBQJ4cAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD21ha2VOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC25ld0JhbGFuY2VzCAUNJHQwMjIzMDMyMjM2NAJfMQQBaQgFDSR0MDIyMzAzMjIzNjQCXzIDCQESY2hlY2tEQXBwVGhyZXNob2xkAQULbmV3QmFsYW5jZXMJAQV0aHJvdwAEAXMJAQVzdGFrZQIIBQdwYXltZW50BmFtb3VudAkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkAwkAAAIFAXMFAXMEAnVzCQEHdW5zdGFrZQIFA19keQUIdG9rZW5PdXQDCQAAAgUCdXMFAnVzCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JbgUNa0Fzc2V0QmFsYW5jZQUBeAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQh0b2tlbk91dAUNa0Fzc2V0QmFsYW5jZQkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFA19keQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgUCZHkFC3Rva2VuT3V0QjU4CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMFC3Rva2VuT3V0QjU4CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFEmNhcE1vbmV5Qm94QWRkcmVzcwkAZQIFBF9mZWUFDmdvdmVybmFuY2VGZWVzBQt0b2tlbk91dEI1OAUDbmlsCQDMCAIFAmR5CQDMCAIFC3Rva2VuT3V0QjU4BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnAQh3aXRoZHJhdwEKbWluQW1vdW50cwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQQJcG10QW1vdW50CAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50BApwbXRBc3NldElkCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFDHNoYXJlQXNzZXRJZAUKcG10QXNzZXRJZAkAAgECFXVua25vd24gcGF5bWVudCB0b2tlbgQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwxvcmlnaW5DYWxsZXIIBQNtc2cIcGF5bWVudHMKARFjYWxjU2NyaXB0QWN0aW9ucwIDYWNjB2JhbGFuY2UEDSR0MDIzNTA1MjM1MzMFA2FjYwQNc2NyaXB0QWN0aW9ucwgFDSR0MDIzNTA1MjM1MzMCXzEEAWkIBQ0kdDAyMzUwNTIzNTMzAl8yBAd3QW1vdW50CQBrAwUHYmFsYW5jZQUJcG10QW1vdW50BQtzaGFyZVN1cHBseQMJAQZhc3NlcnQBCQBnAgUHd0Ftb3VudAkAkQMCBQptaW5BbW91bnRzBQFpCQACAQIwV2l0aGRyYXdhbCByZXN1bHRlZCBpbiBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkBAJ1cwkBB3Vuc3Rha2UCBQd3QW1vdW50CQCRAwIFCGFzc2V0SWRzBQFpAwkAAAIFAnVzBQJ1cwkAlAoCCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUBaQUNa0Fzc2V0QmFsYW5jZQkAZQIFB2JhbGFuY2UFB3dBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwxvcmlnaW5DYWxsZXIFB3dBbW91bnQJANkEAQkAkQMCBQhhc3NldElkcwUBaQUDbmlsCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAyNDAyMzI0MDkxCgACJGwJAQNfeHAACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQERY2FsY1NjcmlwdEFjdGlvbnMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBA1zY3JpcHRBY3Rpb25zCAUNJHQwMjQwMjMyNDA5MQJfMQQBaQgFDSR0MDI0MDIzMjQwOTECXzIJAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUJcG10QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFC3NoYXJlU3VwcGx5BQlwbXRBbW91bnQFA25pbANtc2cBEndpdGhkcmF3V2l0aFVubG9jawIKbWluQW1vdW50cwx1bmxvY2tBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQBnAgAABQx1bmxvY2tBbW91bnQJAAIBAh5VbmxvY2sgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAlwbXRBbW91bnQDCQBmAgkAkAMBCAUDbXNnCHBheW1lbnRzAAADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnBtdEFzc2V0SWQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUMc2hhcmVBc3NldElkBQpwbXRBc3NldElkCQACAQIVdW5rbm93biBwYXltZW50IHRva2VuCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50AAAEBnVubG9jawkA/AcEBQ5mYXJtaW5nQWRkcmVzcwITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCCQClCAEFBHRoaXMJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAMJAAACBQZ1bmxvY2sFBnVubG9jawQOd2l0aGRyYXdBbW91bnQJAGQCBQlwbXRBbW91bnQFDHVubG9ja0Ftb3VudAQDaW52CQD8BwQFBHRoaXMCCHdpdGhkcmF3CQDMCAIFCm1pbkFtb3VudHMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAUDbmlsAwkAAAIFA2ludgUDaW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnARNjYWxjV2l0aGRyYXdPbmVDb2luAwt0b2tlbkFtb3VudAh0b2tlbk91dAR1c2VyBAFpCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAkAlAoCBQNuaWwICQEUX2NhbGNXaXRoZHJhd09uZUNvaW4ECQEDX3hwAAULdG9rZW5BbW91bnQFAWkJAQdBZGRyZXNzAQkA2QQBBQR1c2VyAl8xA21zZwEPd2l0aGRyYXdPbmVDb2luAgh0b2tlbk91dAltaW5BbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cMb3JpZ2luQ2FsbGVyCAUDbXNnCHBheW1lbnRzBAlwbXRBbW91bnQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAZhbW91bnQECnBtdEFzc2V0SWQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUKcG10QXNzZXRJZAUMc2hhcmVBc3NldElkCQACAQINdW5rbm93biB0b2tlbgQIb3V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0BAJ4cAkBA194cAAEDSR0MDI2MDA1MjYwODcJARRfY2FsY1dpdGhkcmF3T25lQ29pbgQFAnhwBQlwbXRBbW91bnQFCG91dEluZGV4CAUDbXNnDG9yaWdpbkNhbGxlcgQCZHkIBQ0kdDAyNjAwNTI2MDg3Al8xBAZkeV9mZWUIBQ0kdDAyNjAwNTI2MDg3Al8yAwkBBmFzc2VydAEJAGcCBQJkeQUJbWluQW1vdW50CQACAQIYTm90IGVub3VnaCBjb2lucyByZW1vdmVkBA5nb3Zlcm5hbmNlRmVlcwkAawMFBmR5X2ZlZQUNZmVlR292ZXJuYW5jZQUJZmVlU2NhbGU2BApkeV9hbmRfZmVlCQBkAgUCZHkFBmR5X2ZlZQoBD21ha2VOZXdCYWxhbmNlcwIDYWNjDHRva2VuQmFsYW5jZQQNJHQwMjYzNDUyNjM3MQUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDI2MzQ1MjYzNzECXzEEAWkIBQ0kdDAyNjM0NTI2MzcxAl8yAwkAAAIFAWkFCG91dEluZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGUCBQx0b2tlbkJhbGFuY2UFCmR5X2FuZF9mZWUJAGQCBQFpAAEJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUMdG9rZW5CYWxhbmNlCQBkAgUBaQABBA0kdDAyNjUzODI2NTk5CgACJGwFAnhwCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPbWFrZU5ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQLbmV3QmFsYW5jZXMIBQ0kdDAyNjUzODI2NTk5Al8xBAF2CAUNJHQwMjY1MzgyNjU5OQJfMgMJARJjaGVja0RBcHBUaHJlc2hvbGQBBQtuZXdCYWxhbmNlcwkBBXRocm93AAQCdXMJAQd1bnN0YWtlAgUKZHlfYW5kX2ZlZQUIdG9rZW5PdXQDCQAAAgUCdXMFAnVzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cMb3JpZ2luQ2FsbGVyBQJkeQkA2QQBBQh0b2tlbk91dAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQhvdXRJbmRleAUNa0Fzc2V0QmFsYW5jZQkAZQIJAJEDAgUCeHAFCG91dEluZGV4BQpkeV9hbmRfZmVlCQDMCAIJAQRCdXJuAgUMc2hhcmVBc3NldElkBQlwbXRBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBBQh0b2tlbk91dAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRJjYXBNb25leUJveEFkZHJlc3MJAGUCBQZkeV9mZWUFDmdvdmVybmFuY2VGZWVzCQDZBAEFCHRva2VuT3V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFC3NoYXJlU3VwcGx5BQlwbXRBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBGXdpdGhkcmF3T25lQ29pbldpdGhVbmxvY2sDCHRva2VuT3V0CW1pbkFtb3VudAx1bmxvY2tBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQBnAgAABQx1bmxvY2tBbW91bnQJAAIBAh5VbmxvY2sgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAlwbXRBbW91bnQDCQBmAgkAkAMBCAUDbXNnCHBheW1lbnRzAAADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnBtdEFzc2V0SWQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUMc2hhcmVBc3NldElkBQpwbXRBc3NldElkCQACAQIVdW5rbm93biBwYXltZW50IHRva2VuCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50AAAEBnVubG9jawkA/AcEBQ5mYXJtaW5nQWRkcmVzcwITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCCQClCAEFBHRoaXMJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAMJAAACBQZ1bmxvY2sFBnVubG9jawQOd2l0aGRyYXdBbW91bnQJAGQCBQlwbXRBbW91bnQFDHVubG9ja0Ftb3VudAQDaW52CQD8BwQFBHRoaXMCD3dpdGhkcmF3T25lQ29pbgkAzAgCBQh0b2tlbk91dAkAzAgCBQltaW5BbW91bnQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAUDbmlsAwkAAAIFA2ludgUDaW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnAQFBAAkAlAoCBQNuaWwJAQJfQQADbXNnAQ9nZXRWaXJ0dWFsUHJpY2UABAFECQEFZ2V0X0QCCQEDX3hwAAkBAl9BAAkAlAoCBQNuaWwJAGsDBQFEBQlQUkVDSVNJT04FC3NoYXJlU3VwcGx5A21zZwEPY2FsY1Rva2VuQW1vdW50AgdhbW91bnRzB2RlcG9zaXQEA2FtcAkBAl9BAAQIYmFsYW5jZXMJAQNfeHAABAJEMAkBB2dldERNZW0CBQhiYWxhbmNlcwUDYW1wCgEPY2FsY05ld0JhbGFuY2VzAgNhY2MHYmFsYW5jZQQNJHQwMjg1MjMyODU0OQUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDI4NTIzMjg1NDkCXzEEAWkIBQ0kdDAyODUyMzI4NTQ5Al8yBApuZXdCYWxhbmNlCQBkAgUHYmFsYW5jZQMFB2RlcG9zaXQJAJEDAgUHYW1vdW50cwUBaQkBAS0BCQCRAwIFB2Ftb3VudHMFAWkJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUKbmV3QmFsYW5jZQkAZAIFAWkAAQQLbmV3QmFsYW5jZXMICgACJGwFCGJhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPY2FsY05ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwJfMQQCRDEJAQdnZXRETWVtAgULbmV3QmFsYW5jZXMFA2FtcAQEZGlmZgMFB2RlcG9zaXQJAGUCBQJEMQUCRDAJAGUCBQJEMAUCRDEJAJQKAgUDbmlsCQBrAwUEZGlmZgULc2hhcmVTdXBwbHkFAkQwA21zZwEFcmFtcEECCF9mdXR1cmVBC19mdXR1cmVUaW1lCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDCQEGYXNzZXJ0AQkAZwIFDmJsb2NrVGltZXN0YW1wCQBkAgUOaW5pdGlhbF9BX3RpbWUFDU1JTl9SQU1QX1RJTUUJAAIBAgl0b28gb2Z0ZW4DCQEGYXNzZXJ0AQkAZwIFC19mdXR1cmVUaW1lCQBkAgUOYmxvY2tUaW1lc3RhbXAFDU1JTl9SQU1QX1RJTUUJAAIBAhFpbnN1ZmZpY2llbnQgdGltZQQKX2luaXRpYWxfQQkBAl9BAAMJAQZhc3NlcnQBAwkAZgIFCF9mdXR1cmVBAAAJAGYCBQVNQVhfQQUIX2Z1dHVyZUEHCQACAQIRb3V0IG9mIGJhc2UgcmFuZ2UDCQEGYXNzZXJ0AQMDCQBnAgUIX2Z1dHVyZUEFCl9pbml0aWFsX0EJAGcCCQBoAgUKX2luaXRpYWxfQQUMTUFYX0FfQ0hBTkdFBQhfZnV0dXJlQQcGAwkAZgIFCl9pbml0aWFsX0EFCF9mdXR1cmVBCQBnAgkAaAIFCF9mdXR1cmVBBQxNQVhfQV9DSEFOR0UFCl9pbml0aWFsX0EHCQACAQIMb3V0IG9mIHJhbmdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFCl9pbml0aWFsX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQhfZnV0dXJlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFDmJsb2NrVGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1mdXR1cmVfQV90aW1lBQtfZnV0dXJlVGltZQUDbmlsA21zZwEJc3RvcFJhbXBBAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnBAhjdXJyZW50QQkBAl9BAAkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQhjdXJyZW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFCGN1cnJlbnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5pbml0aWFsX0FfdGltZQUOYmxvY2tUaW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQICDWZ1dHVyZV9BX3RpbWUFDmJsb2NrVGltZXN0YW1wBQNuaWwDbXNnAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwMJAQEhAQUGYWN0aXZlCQACAQkArAICAiJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQdzdXNwZW5kAQIPUGF1c2VkIGJ5IGFkbWluA21zZwEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDBQZhY3RpdmUJAQ10aHJvd0lzQWN0aXZlAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwDbXNnARhrZWVwTGltaXRGb3JGaXJzdEhhcnZlc3QBCnNoYXJlTGltaXQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1NoYXJlTGltaXQFCnNoYXJlTGltaXQFA25pbAECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDGFkbWluUHViS2V5MgABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDGFkbWluUHViS2V5MwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAQTY2FsbFRha2VJbnRvQWNjb3VudAMJAAACCAUDaW52BGRBcHAFBHRoaXMJAAACCAUDaW52CGZ1bmN0aW9uAhl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzBwQNc2lnbmVkQnlBZG1pbgMDAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkyBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkzBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAURYWRtaW5QdWJLZXlJbnZva2UDAwUTY2FsbFRha2VJbnRvQWNjb3VudAUNc2lnbmVkQnlBZG1pbgcGBRNtdWx0aVNpZ25lZEJ5QWRtaW5zBRNtdWx0aVNpZ25lZEJ5QWRtaW5z2XIpEg==", "height": 2220077, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2Em19eDMHEmTLhecUMcwgcc3sbPRTQbcWUCS7nNm949P Next: 2qx92co4SR1AudRP8jjYiG4t3DftPsgsLCwded8nqLzr Diff:
OldNewDifferences
9595
9696 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
9797
98-let capMoneyBoxAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
98+let capMoneyBoxAddress = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
9999
100100 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
101101
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let PRECISION = 1000000
55
66 let MAX_A = 1000000
77
88 let MAX_A_CHANGE = 10
99
1010 let DECIMALS = 6
1111
1212 let MIN_RAMP_TIME = (86400 / 60)
1313
1414 let version = "3.0.0"
1515
1616 let kVersion = "version"
1717
1818 let kAssets = "asset_ids"
1919
2020 let kAssetBalance = "_balance"
2121
2222 let kActive = "active"
2323
2424 let kCause = "shutdown_cause"
2525
2626 let kShareAssetId = "share_asset_id"
2727
2828 let kShareAssetSupply = "share_asset_supply"
2929
3030 let kFee = "commission"
3131
3232 let kDAppThresholdCoef = "dAppThresholdCoef"
3333
3434 let kUSDNAddress = "staking_usdnnsbt_address"
3535
3636 let kDiscounts = "discounts"
3737
3838 let kDiscountValues = "discount_values"
3939
4040 let kUserSwopInGov = "_SWOP_amount"
4141
4242 let kFirstHarvest = "first_harvest"
4343
4444 let kFirstHarvestHeight = "first_harvest_height"
4545
4646 let kShareLimit = "share_limit_on_first_harvest"
4747
4848 let kBasePeriod = "base_period"
4949
5050 let kPeriodLength = "period_length"
5151
5252 let kStartHeight = "start_height"
5353
5454 let kAdminPubKey1 = "admin_pub_1"
5555
5656 let kAdminPubKey2 = "admin_pub_2"
5757
5858 let kAdminPubKey3 = "admin_pub_3"
5959
6060 let kAdminInvokePubKey = "admin_invoke_pub"
6161
6262 let kMoneyBoxAddress = "money_box_address"
6363
6464 let kGovAddress = "governance_address"
6565
6666 let kVotingAddress = "voting_address"
6767
6868 let kFarmingAddress = "farming_address"
6969
7070 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
7171
7272 func getBase58FromOracle (key) = match getString(oracle, key) {
7373 case string: String =>
7474 fromBase58String(string)
7575 case nothing =>
7676 throw((key + "is empty"))
7777 }
7878
7979
8080 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
8181
8282 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
8383
8484 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
8585
8686 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
8787
8888 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
8989
9090 let govAddress = Address(getBase58FromOracle(kGovAddress))
9191
9292 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
9393
9494 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
9595
9696 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
9797
98-let capMoneyBoxAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
98+let capMoneyBoxAddress = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
9999
100100 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
101101
102102 let stakingAssets = [toBase58String(USDN)]
103103
104104 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
105105
106106 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
107107
108108 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
109109
110110 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
111111
112112 let active = getBooleanValue(this, kActive)
113113
114114 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
115115
116116 let shareSupply = getIntegerValue(this, kShareAssetSupply)
117117
118118 let feeScale6 = 1000000
119119
120120 let fee = getIntegerValue(this, kFee)
121121
122122 let feeGovernance = fraction(40, feeScale6, 100)
123123
124124 let initial_A = getIntegerValue(this, "initial_A")
125125
126126 let future_A = getIntegerValue(this, "future_A")
127127
128128 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
129129
130130 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
131131
132132 let assetIds = split(getStringValue(this, kAssets), ",")
133133
134134 let nCoins = size(assetIds)
135135
136136 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
137137
138138
139139 func throwIsActive () = throw("DApp is already active")
140140
141141
142142 func isActive () = if (active)
143143 then unit
144144 else throw("DApp is inactive at this moment")
145145
146146
147147 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
148148 then unit
149149 else throw("Only admin can call this function")
150150
151151
152152 func isSelfCall (i) = if ((this == i.caller))
153153 then unit
154154 else throw("Only contract itself can call this function")
155155
156156
157157 let big2 = toBigInt(2)
158158
159159 let blockTimestamp = height
160160
161161 func assert (a) = if (a)
162162 then false
163163 else true
164164
165165
166166 func calculateFeeDiscount (userAddr) = {
167167 let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
168168 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
169169 let discounts = split(getStringValue(oracle, kDiscounts), ",")
170170 if (if ((swopAmount >= parseIntValue(discountValues[0])))
171171 then (parseIntValue(discountValues[1]) > swopAmount)
172172 else false)
173173 then (feeScale6 - parseIntValue(discounts[0]))
174174 else if (if ((swopAmount >= parseIntValue(discountValues[1])))
175175 then (parseIntValue(discountValues[2]) > swopAmount)
176176 else false)
177177 then (feeScale6 - parseIntValue(discounts[1]))
178178 else if (if ((swopAmount >= parseIntValue(discountValues[2])))
179179 then (parseIntValue(discountValues[3]) > swopAmount)
180180 else false)
181181 then (feeScale6 - parseIntValue(discounts[2]))
182182 else if (if ((swopAmount >= parseIntValue(discountValues[3])))
183183 then (parseIntValue(discountValues[4]) > swopAmount)
184184 else false)
185185 then (feeScale6 - parseIntValue(discounts[3]))
186186 else if ((swopAmount >= parseIntValue(discountValues[4])))
187187 then (feeScale6 - parseIntValue(discounts[4]))
188188 else feeScale6
189189 }
190190
191191
192192 func _A () = {
193193 let t1 = future_A_time
194194 let A1 = future_A
195195 if ((t1 > blockTimestamp))
196196 then {
197197 let A0 = initial_A
198198 let t0 = initial_A_time
199199 if ((A1 > A0))
200200 then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
201201 else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
202202 }
203203 else A1
204204 }
205205
206206
207207 func _xp () = {
208208 func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
209209
210210 let $l = assetIds
211211 let $s = size($l)
212212 let $acc0 = nil
213213 func $f0_1 ($a,$i) = if (($i >= $s))
214214 then $a
215215 else assetBalances($a, $l[$i])
216216
217217 func $f0_2 ($a,$i) = if (($i >= $s))
218218 then $a
219219 else throw("List size exceeds 15")
220220
221221 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
222222 }
223223
224224
225225 func _xp_mem (xp) = xp
226226
227227
228228 func sumList (acc,element) = (acc + element)
229229
230230
231231 func get_D (xp,amp) = {
232232 let @ = invoke(this, "D", [xp, amp], nil)
233233 if ($isInstanceOf(@, "Int"))
234234 then @
235235 else throw(($getType(invoke(this, "D", [xp, amp], nil)) + " couldn't be cast to Int"))
236236 }
237237
238238
239239 func get_D_internal (xp,amp) = {
240240 let S = {
241241 let $l = xp
242242 let $s = size($l)
243243 let $acc0 = 0
244244 func $f0_1 ($a,$i) = if (($i >= $s))
245245 then $a
246246 else sumList($a, $l[$i])
247247
248248 func $f0_2 ($a,$i) = if (($i >= $s))
249249 then $a
250250 else throw("List size exceeds 15")
251251
252252 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
253253 }
254254 if ((S == 0))
255255 then 0
256256 else {
257257 let Ann = (amp * nCoins)
258258 let AnnS = (toBigInt(Ann) * toBigInt(S))
259259 let Ann1 = toBigInt((Ann - 1))
260260 func Dproc (acc,i) = if ((acc._2 == true))
261261 then acc
262262 else {
263263 let Dprev = acc._1
264264 func D_PProc (D_P,i) = if ((nCoins > i))
265265 then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
266266 else D_P
267267
268268 let D_P = {
269269 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
270270 let $s = size($l)
271271 let $acc0 = Dprev
272272 func $f1_1 ($a,$i) = if (($i >= $s))
273273 then $a
274274 else D_PProc($a, $l[$i])
275275
276276 func $f1_2 ($a,$i) = if (($i >= $s))
277277 then $a
278278 else throw("List size exceeds 15")
279279
280280 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
281281 }
282282 let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
283283 if ((D > Dprev))
284284 then if ((1 >= toInt((D - Dprev))))
285285 then $Tuple2(D, true)
286286 else $Tuple2(D, false)
287287 else if ((1 >= toInt((Dprev - D))))
288288 then $Tuple2(D, true)
289289 else $Tuple2(D, false)
290290 }
291291
292292 let $t066756787 = {
293293 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
294294 let $s = size($l)
295295 let $acc0 = $Tuple2(toBigInt(S), false)
296296 func $f1_1 ($a,$i) = if (($i >= $s))
297297 then $a
298298 else Dproc($a, $l[$i])
299299
300300 func $f1_2 ($a,$i) = if (($i >= $s))
301301 then $a
302302 else throw("List size exceeds 15")
303303
304304 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
305305 }
306306 let D = $t066756787._1
307307 let finished = $t066756787._2
308308 if ((finished == false))
309309 then throw(("get_D() not finished with " + toString(D)))
310310 else toInt(D)
311311 }
312312 }
313313
314314
315315 func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
316316
317317
318318 func getY (in,out,x,xp_) = if (assert((in != out)))
319319 then throw("same coin")
320320 else if (assert(if ((out >= 0))
321321 then (in >= 0)
322322 else false))
323323 then throw("below zero")
324324 else if (assert(if ((nCoins > out))
325325 then (nCoins > in)
326326 else false))
327327 then throw("above N_COINS")
328328 else {
329329 let amp = _A()
330330 let D = get_D(xp_, amp)
331331 let Ann = (amp * nCoins)
332332 func S_c (acc,i) = {
333333 let $t073587375 = acc
334334 let S_ = $t073587375._1
335335 let c = $t073587375._2
336336 let x_ = if ((in == i))
337337 then x
338338 else xp_[i]
339339 if (if ((i != out))
340340 then (nCoins > i)
341341 else false)
342342 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
343343 else $Tuple2(S_, c)
344344 }
345345
346346 let $t075837684 = {
347347 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
348348 let $s = size($l)
349349 let $acc0 = $Tuple2(0, toBigInt(D))
350350 func $f0_1 ($a,$i) = if (($i >= $s))
351351 then $a
352352 else S_c($a, $l[$i])
353353
354354 func $f0_2 ($a,$i) = if (($i >= $s))
355355 then $a
356356 else throw("List size exceeds 15")
357357
358358 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
359359 }
360360 let S_ = $t075837684._1
361361 let c_ = $t075837684._2
362362 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
363363 let bD = toBigInt(((S_ + (D / Ann)) - D))
364364 func y_proc (acc,_i) = if ((acc._2 == true))
365365 then acc
366366 else {
367367 let y_prev = acc._1
368368 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
369369 if ((y > y_prev))
370370 then if ((1 >= toInt((y - y_prev))))
371371 then $Tuple2(y, true)
372372 else $Tuple2(y, false)
373373 else if ((1 >= toInt((y_prev - y))))
374374 then $Tuple2(y, true)
375375 else $Tuple2(y, false)
376376 }
377377
378378 let $t081668283 = {
379379 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
380380 let $s = size($l)
381381 let $acc0 = $Tuple2(toBigInt(D), false)
382382 func $f1_1 ($a,$i) = if (($i >= $s))
383383 then $a
384384 else y_proc($a, $l[$i])
385385
386386 func $f1_2 ($a,$i) = if (($i >= $s))
387387 then $a
388388 else throw("List size exceeds 16")
389389
390390 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
391391 }
392392 let y = $t081668283._1
393393 let finished = $t081668283._2
394394 if ((finished == false))
395395 then throw(("getY() not finished with " + toString(y)))
396396 else toInt(y)
397397 }
398398
399399
400400 func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
401401 then throw("i below zero")
402402 else if (assert((nCoins > in)))
403403 then throw("i above N_COINS")
404404 else {
405405 let Ann = (A_ * nCoins)
406406 func S_c (acc,i) = {
407407 let $t086628679 = acc
408408 let S_ = $t086628679._1
409409 let c = $t086628679._2
410410 let x_ = if (if ((in != i))
411411 then (nCoins > i)
412412 else false)
413413 then xp[i]
414414 else 0
415415 if (if ((nCoins > i))
416416 then (in != i)
417417 else false)
418418 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
419419 else $Tuple2(S_, c)
420420 }
421421
422422 let $t088999000 = {
423423 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
424424 let $s = size($l)
425425 let $acc0 = $Tuple2(0, toBigInt(D))
426426 func $f0_1 ($a,$i) = if (($i >= $s))
427427 then $a
428428 else S_c($a, $l[$i])
429429
430430 func $f0_2 ($a,$i) = if (($i >= $s))
431431 then $a
432432 else throw("List size exceeds 15")
433433
434434 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
435435 }
436436 let S_ = $t088999000._1
437437 let c_ = $t088999000._2
438438 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
439439 let bD = toBigInt(((S_ + (D / Ann)) - D))
440440 func y_D_proc (acc,i) = if ((acc._2 == true))
441441 then acc
442442 else {
443443 let y_prev = acc._1
444444 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
445445 if ((y > y_prev))
446446 then if ((1 >= toInt((y - y_prev))))
447447 then $Tuple2(y, true)
448448 else $Tuple2(y, false)
449449 else if ((1 >= toInt((y_prev - y))))
450450 then $Tuple2(y, true)
451451 else $Tuple2(y, false)
452452 }
453453
454454 let $t094839602 = {
455455 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
456456 let $s = size($l)
457457 let $acc0 = $Tuple2(toBigInt(D), false)
458458 func $f1_1 ($a,$i) = if (($i >= $s))
459459 then $a
460460 else y_D_proc($a, $l[$i])
461461
462462 func $f1_2 ($a,$i) = if (($i >= $s))
463463 then $a
464464 else throw("List size exceeds 16")
465465
466466 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
467467 }
468468 let y = $t094839602._1
469469 let finished = $t094839602._2
470470 if ((finished == false))
471471 then throw(("get_y_D() not finished with " + toString(y)))
472472 else toInt(y)
473473 }
474474
475475
476476 func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
477477 let feeDiscount = calculateFeeDiscount(caller)
478478 let amp = _A()
479479 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
480480 let total_supply = shareSupply
481481 let D0 = get_D(xp, amp)
482482 let D1 = (D0 - fraction(_token_amount, D0, total_supply))
483483 let new_y = get_y_D(amp, i, xp, D1)
484484 let dy_0 = (xp[i] - new_y)
485485 func xp_reduced_proc (acc,xp_j) = {
486486 let $t01024310272 = acc
487487 let xp_reduced = $t01024310272._1
488488 let index = $t01024310272._2
489489 let dx_expected = if ((index == i))
490490 then (fraction(xp_j, D1, D0) - new_y)
491491 else (xp_j - fraction(xp_j, D1, D0))
492492 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
493493 }
494494
495495 let $t01053410598 = {
496496 let $l = xp
497497 let $s = size($l)
498498 let $acc0 = $Tuple2(nil, 0)
499499 func $f0_1 ($a,$i) = if (($i >= $s))
500500 then $a
501501 else xp_reduced_proc($a, $l[$i])
502502
503503 func $f0_2 ($a,$i) = if (($i >= $s))
504504 then $a
505505 else throw("List size exceeds 15")
506506
507507 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
508508 }
509509 let xp_reduced = $t01053410598._1
510510 let index = $t01053410598._2
511511 let xp_reduced_i = xp_reduced[i]
512512 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
513513 $Tuple2(dy, (dy_0 - dy))
514514 }
515515
516516
517517 func getStrAssetId (assetId) = match assetId {
518518 case id: ByteVector =>
519519 toBase58String(id)
520520 case waves: Unit =>
521521 "WAVES"
522522 case _ =>
523523 throw("Match error")
524524 }
525525
526526
527527 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
528528 then $Tuple2("lockNeutrino", stakingUSDNAddress)
529529 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
530530
531531
532532 func calcStakingParams (stake,amount,assetId) = if (stake)
533533 then {
534534 let $t01116211228 = calcStakingFuncAndAddres(stake, assetId)
535535 let call = $t01116211228._1
536536 let stakingAddr = $t01116211228._2
537537 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
538538 }
539539 else {
540540 let $t01131411380 = calcStakingFuncAndAddres(stake, assetId)
541541 let call = $t01131411380._1
542542 let stakingAddr = $t01131411380._2
543543 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
544544 }
545545
546546
547547 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
548548 then {
549549 let $t01156711669 = calcStakingParams(true, amount, fromBase58String(assetIdString))
550550 let call = $t01156711669._1
551551 let addr = $t01156711669._2
552552 let params = $t01156711669._3
553553 let payments = $t01156711669._4
554554 invoke(addr, call, params, payments)
555555 }
556556 else 0
557557
558558
559559 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
560560 then {
561561 let $t01185411957 = calcStakingParams(false, amount, fromBase58String(assetIdString))
562562 let call = $t01185411957._1
563563 let addr = $t01185411957._2
564564 let params = $t01185411957._3
565565 let payments = $t01185411957._4
566566 invoke(addr, call, params, payments)
567567 }
568568 else 0
569569
570570
571571 func stakedAmount (assetId) = {
572572 let stakedAmountCalculated = match assetId {
573573 case aId: ByteVector =>
574574 if ((aId == USDN))
575575 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
576576 else 0
577577 case _: Unit =>
578578 0
579579 case _ =>
580580 throw("Match error")
581581 }
582582 match stakedAmountCalculated {
583583 case i: Int =>
584584 i
585585 case _ =>
586586 0
587587 }
588588 }
589589
590590
591591 func checkSuspicious () = {
592592 let contractBalances = _xp()
593593 func checkBalance (acc,assetId) = {
594594 let $t01256812593 = acc
595595 let suspicious = $t01256812593._1
596596 let i = $t01256812593._2
597597 if (suspicious)
598598 then $Tuple2(suspicious, i)
599599 else {
600600 let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
601601 if ((contractBalances[i] > aBalance))
602602 then $Tuple2(true, i)
603603 else $Tuple2(false, (i + 1))
604604 }
605605 }
606606
607607 let $l = assetIds
608608 let $s = size($l)
609609 let $acc0 = $Tuple2(false, 0)
610610 func $f0_1 ($a,$i) = if (($i >= $s))
611611 then $a
612612 else checkBalance($a, $l[$i])
613613
614614 func $f0_2 ($a,$i) = if (($i >= $s))
615615 then $a
616616 else throw("List size exceeds 15")
617617
618618 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
619619 }
620620
621621
622622 func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
623623
624624
625625 func returnPayments (caller,payments) = {
626626 func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
627627
628628 let $l = payments
629629 let $s = size($l)
630630 let $acc0 = nil
631631 func $f0_1 ($a,$i) = if (($i >= $s))
632632 then $a
633633 else parsePayments($a, $l[$i])
634634
635635 func $f0_2 ($a,$i) = if (($i >= $s))
636636 then $a
637637 else throw("List size exceeds 15")
638638
639639 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
640640 }
641641
642642
643643 func checkDAppThreshold (newBalances) = {
644644 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
645645 let thresholdScale = 10000
646646 let maxBalance = max(newBalances)
647647 let minBalance = min(newBalances)
648648 let ratio = fraction(maxBalance, thresholdScale, minBalance)
649649 if ((ratio > (dAppThresholdCoef * thresholdScale)))
650650 then throw("New balance in assets of the DApp is less than threshold")
651651 else false
652652 }
653653
654654
655655 func checkCoins (assetIds) = {
656656 let coins = split(assetIds, ",")
657657 func checkCoin (error,assetId) = {
658658 let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
659659 let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
660660 if ((decimals != DECIMALS))
661661 then throw("wrong decimals")
662662 else false
663663 }
664664
665665 let $l = coins
666666 let $s = size($l)
667667 let $acc0 = false
668668 func $f0_1 ($a,$i) = if (($i >= $s))
669669 then $a
670670 else checkCoin($a, $l[$i])
671671
672672 func $f0_2 ($a,$i) = if (($i >= $s))
673673 then $a
674674 else throw("List size exceeds 15")
675675
676676 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
677677 }
678678
679679
680680 @Callable(msg)
681681 func D (xp,amp) = {
682682 let D = get_D_internal(xp, amp)
683683 $Tuple2([IntegerEntry("D", D)], D)
684684 }
685685
686686
687687
688688 @Callable(msg)
689689 func init (assetIds,_A,_dAppThresholdCoef,firstHarvest) = if (!(isDataStorageUntouched(this)))
690690 then throw("Already initialized")
691691 else if ((0 >= _A))
692692 then throw("Amp must be must > 0")
693693 else if ((0 >= _dAppThresholdCoef))
694694 then throw("dApp Threshold Coef must be > 0")
695695 else {
696696 let shareName = "s_Multi_USD"
697697 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
698698 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
699699 let tokenId = calculateAssetId(issueToken)
700700 if (checkCoins(assetIds))
701701 then throw()
702702 else {
703703 let baseEntry = [StringEntry(kVersion, version), StringEntry(kAssets, assetIds), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), StringEntry(kShareAssetId, toBase58String(tokenId)), IntegerEntry(kShareAssetSupply, 0), IntegerEntry(kDAppThresholdCoef, _dAppThresholdCoef), BooleanEntry(kActive, true), issueToken]
704704 if (firstHarvest)
705705 then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
706706 else baseEntry
707707 }
708708 }
709709
710710
711711
712712 @Callable(msg)
713713 func addLiquidity (minMintAmount,stakeFarming) = valueOrElse(isActive(), {
714714 let amp = _A()
715715 let xp = _xp()
716716 let D0 = if ((shareSupply == 0))
717717 then 0
718718 else getDMem(xp, amp)
719719 let payments = msg.payments
720720 let paymentsSize = size(payments)
721721 func validPayments (n) = if ((paymentsSize > nCoins))
722722 then throw(("payments size > " + toString(nCoins)))
723723 else if ((1 > paymentsSize))
724724 then throw("payments size < 1")
725725 else if (if ((shareSupply == 0))
726726 then (nCoins != paymentsSize)
727727 else false)
728728 then throw("initial deposit requires all coins")
729729 else {
730730 func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
731731 then true
732732 else throw("Invalid asset in payment")
733733
734734 let $l = payments
735735 let $s = size($l)
736736 let $acc0 = false
737737 func $f0_1 ($a,$i) = if (($i >= $s))
738738 then $a
739739 else paymantValid($a, $l[$i])
740740
741741 func $f0_2 ($a,$i) = if (($i >= $s))
742742 then $a
743743 else throw("List size exceeds 15")
744744
745745 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
746746 }
747747
748748 if (!(validPayments(paymentsSize)))
749749 then throw()
750750 else {
751751 let suspicious = checkSuspicious()
752752 if (suspicious._1)
753753 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
754754 else {
755755 func parsePayments (acc,assetId) = {
756756 let $t01690116930 = acc
757757 let newBalances = $t01690116930._1
758758 let i = $t01690116930._2
759759 let j = $t01690116930._3
760760 if (if ((paymentsSize > j))
761761 then (getStrAssetId(payments[j].assetId) == assetId)
762762 else false)
763763 then $Tuple3((newBalances :+ (xp[i] + payments[j].amount)), (i + 1), (j + 1))
764764 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
765765 }
766766
767767 let $t01715017236 = {
768768 let $l = assetIds
769769 let $s = size($l)
770770 let $acc0 = $Tuple3(nil, 0, 0)
771771 func $f0_1 ($a,$i) = if (($i >= $s))
772772 then $a
773773 else parsePayments($a, $l[$i])
774774
775775 func $f0_2 ($a,$i) = if (($i >= $s))
776776 then $a
777777 else throw("List size exceeds 15")
778778
779779 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
780780 }
781781 let newBalances = $t01715017236._1
782782 let k = $t01715017236._2
783783 let parsedPayments = $t01715017236._3
784784 if ((paymentsSize > parsedPayments))
785785 then throw("Incorect payments order")
786786 else if (checkDAppThreshold(newBalances))
787787 then throw()
788788 else {
789789 let D1 = getDMem(newBalances, amp)
790790 if (assert((D1 > D0)))
791791 then throw("D1 > D0")
792792 else {
793793 let feeDiscount = calculateFeeDiscount(msg.caller)
794794 func calcScriptActions (acc,newBalance) = {
795795 let $t01763717678 = acc
796796 let invBalances = $t01763717678._1
797797 let scriptActions = $t01763717678._2
798798 let i = $t01763717678._3
799799 if ((shareSupply > 0))
800800 then {
801801 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
802802 let fees = {
803803 let idealBalance = fraction(D1, xp[i], D0)
804804 let difference = if ((idealBalance > newBalance))
805805 then (idealBalance - newBalance)
806806 else (newBalance - idealBalance)
807807 fraction(_fee, difference, feeScale6)
808808 }
809809 let governanceFees = fraction(fees, feeGovernance, feeScale6)
810810 let finalBalance = (newBalance - fees)
811811 let invariantBalance = (newBalance - fees)
812812 let pmt = (newBalance - xp[i])
813813 let inv = if ((pmt > 0))
814814 then stake((pmt - fees), assetIds[i])
815815 else unstake(fees, assetIds[i])
816816 if ((inv == inv))
817817 then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(capMoneyBoxAddress, (fees - governanceFees), fromBase58String(assetIds[i])), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
818818 else throw("Strict value is not equal to itself.")
819819 }
820820 else {
821821 let inv = stake(newBalance, assetIds[i])
822822 if ((inv == inv))
823823 then $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
824824 else throw("Strict value is not equal to itself.")
825825 }
826826 }
827827
828828 let $t01922619314 = {
829829 let $l = newBalances
830830 let $s = size($l)
831831 let $acc0 = $Tuple3(nil, nil, 0)
832832 func $f1_1 ($a,$i) = if (($i >= $s))
833833 then $a
834834 else calcScriptActions($a, $l[$i])
835835
836836 func $f1_2 ($a,$i) = if (($i >= $s))
837837 then $a
838838 else throw("List size exceeds 15")
839839
840840 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
841841 }
842842 let invBalances = $t01922619314._1
843843 let scriptActions = $t01922619314._2
844844 let D2 = getDMem(invBalances, amp)
845845 let mint_amount = if ((shareSupply == 0))
846846 then D1
847847 else fraction(shareSupply, (D2 - D0), D0)
848848 if (assert((mint_amount >= minMintAmount)))
849849 then throw("Slippage screwed you")
850850 else if (stakeFarming)
851851 then {
852852 let re = invoke(this, "reissueShare", [mint_amount], nil)
853853 if ((re == re))
854854 then {
855855 let s = invoke(farmingAddress, "lockShareTokens", [toString(this)], [AttachedPayment(shareAssetId, mint_amount)])
856856 if ((s == s))
857857 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
858858 else throw("Strict value is not equal to itself.")
859859 }
860860 else throw("Strict value is not equal to itself.")
861861 }
862862 else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
863863 }
864864 }
865865 }
866866 }
867867 })
868868
869869
870870
871871 @Callable(msg)
872872 func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
873873
874874
875875
876876 @Callable(msg)
877877 func getDy (assetFrom,assetTo,dx,userAddress) = {
878878 let xp = _xp()
879879 let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
880880 let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
881881 let x = (xp[fromIndex] + dx)
882882 let y = getY(fromIndex, toIndex, x, xp)
883883 let dy = ((xp[toIndex] - y) - 1)
884884 let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
885885 let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
886886 $Tuple2(nil, $Tuple2((dy - _fee), _fee))
887887 }
888888
889889
890890
891891 @Callable(msg)
892892 func exchange (tokenOut,min_dy) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
893893 then throw("size(payments) != 1")
894894 else {
895895 let suspicious = checkSuspicious()
896896 if (suspicious._1)
897897 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
898898 else {
899899 let payment = msg.payments[0]
900900 let tokenIn = getStrAssetId(payment.assetId)
901901 let tokenOutB58 = fromBase58String(tokenOut)
902902 let dx = payment.amount
903903 let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
904904 let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
905905 let xp = _xp()
906906 let x = (xp[fromIndex] + dx)
907907 let y = getY(fromIndex, toIndex, x, xp)
908908 let _dy = ((xp[toIndex] - y) - 1)
909909 let feeDiscount = calculateFeeDiscount(msg.caller)
910910 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
911911 let dy = (_dy - _fee)
912912 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
913913 if (assert((dy >= min_dy)))
914914 then throw("Exchange resulted in fewer coins than expected")
915915 else {
916916 func makeNewBalances (acc,tokenBalance) = {
917917 let $t02202622052 = acc
918918 let newBalances = $t02202622052._1
919919 let i = $t02202622052._2
920920 if ((i == fromIndex))
921921 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
922922 else if ((i == toIndex))
923923 then $Tuple2((newBalances :+ (tokenBalance - _dy)), (i + 1))
924924 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
925925 }
926926
927927 let $t02230322364 = {
928928 let $l = xp
929929 let $s = size($l)
930930 let $acc0 = $Tuple2(nil, 0)
931931 func $f0_1 ($a,$i) = if (($i >= $s))
932932 then $a
933933 else makeNewBalances($a, $l[$i])
934934
935935 func $f0_2 ($a,$i) = if (($i >= $s))
936936 then $a
937937 else throw("List size exceeds 15")
938938
939939 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
940940 }
941941 let newBalances = $t02230322364._1
942942 let i = $t02230322364._2
943943 if (checkDAppThreshold(newBalances))
944944 then throw()
945945 else {
946946 let s = stake(payment.amount, getStrAssetId(payment.assetId))
947947 if ((s == s))
948948 then {
949949 let us = unstake(_dy, tokenOut)
950950 if ((us == us))
951951 then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), ScriptTransfer(capMoneyBoxAddress, (_fee - governanceFees), tokenOutB58)], [dy, tokenOutB58])
952952 else throw("Strict value is not equal to itself.")
953953 }
954954 else throw("Strict value is not equal to itself.")
955955 }
956956 }
957957 }
958958 })
959959
960960
961961
962962 @Callable(msg)
963963 func withdraw (minAmounts) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
964964 then throw("size(payments) != 1")
965965 else {
966966 let pmtAmount = msg.payments[0].amount
967967 let pmtAssetId = msg.payments[0].assetId
968968 if ((shareAssetId != pmtAssetId))
969969 then throw("unknown payment token")
970970 else {
971971 let suspicious = checkSuspicious()
972972 if (suspicious._1)
973973 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
974974 else {
975975 func calcScriptActions (acc,balance) = {
976976 let $t02350523533 = acc
977977 let scriptActions = $t02350523533._1
978978 let i = $t02350523533._2
979979 let wAmount = fraction(balance, pmtAmount, shareSupply)
980980 if (assert((wAmount >= minAmounts[i])))
981981 then throw("Withdrawal resulted in fewer coins than expected")
982982 else {
983983 let us = unstake(wAmount, assetIds[i])
984984 if ((us == us))
985985 then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.originCaller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
986986 else throw("Strict value is not equal to itself.")
987987 }
988988 }
989989
990990 let $t02402324091 = {
991991 let $l = _xp()
992992 let $s = size($l)
993993 let $acc0 = $Tuple2(nil, 0)
994994 func $f0_1 ($a,$i) = if (($i >= $s))
995995 then $a
996996 else calcScriptActions($a, $l[$i])
997997
998998 func $f0_2 ($a,$i) = if (($i >= $s))
999999 then $a
10001000 else throw("List size exceeds 15")
10011001
10021002 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10031003 }
10041004 let scriptActions = $t02402324091._1
10051005 let i = $t02402324091._2
10061006 (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
10071007 }
10081008 }
10091009 })
10101010
10111011
10121012
10131013 @Callable(msg)
10141014 func withdrawWithUnlock (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
10151015 then throw("Unlock amount must be positive")
10161016 else {
10171017 let suspicious = checkSuspicious()
10181018 if (suspicious._1)
10191019 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
10201020 else {
10211021 let pmtAmount = if ((size(msg.payments) > 0))
10221022 then if ((size(msg.payments) != 1))
10231023 then throw("size(payments) != 1")
10241024 else {
10251025 let pmtAssetId = msg.payments[0].assetId
10261026 if ((shareAssetId != pmtAssetId))
10271027 then throw("unknown payment token")
10281028 else msg.payments[0].amount
10291029 }
10301030 else 0
10311031 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
10321032 if ((unlock == unlock))
10331033 then {
10341034 let withdrawAmount = (pmtAmount + unlockAmount)
10351035 let inv = invoke(this, "withdraw", [minAmounts], [AttachedPayment(shareAssetId, withdrawAmount)])
10361036 if ((inv == inv))
10371037 then nil
10381038 else throw("Strict value is not equal to itself.")
10391039 }
10401040 else throw("Strict value is not equal to itself.")
10411041 }
10421042 })
10431043
10441044
10451045
10461046 @Callable(msg)
10471047 func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = {
10481048 let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
10491049 $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
10501050 }
10511051
10521052
10531053
10541054 @Callable(msg)
10551055 func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
10561056 then throw("size(payments) != 1")
10571057 else {
10581058 let suspicious = checkSuspicious()
10591059 if (suspicious._1)
10601060 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
10611061 else {
10621062 let pmtAmount = msg.payments[0].amount
10631063 let pmtAssetId = msg.payments[0].assetId
10641064 if ((pmtAssetId != shareAssetId))
10651065 then throw("unknown token")
10661066 else {
10671067 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
10681068 let xp = _xp()
10691069 let $t02600526087 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
10701070 let dy = $t02600526087._1
10711071 let dy_fee = $t02600526087._2
10721072 if (assert((dy >= minAmount)))
10731073 then throw("Not enough coins removed")
10741074 else {
10751075 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
10761076 let dy_and_fee = (dy + dy_fee)
10771077 func makeNewBalances (acc,tokenBalance) = {
10781078 let $t02634526371 = acc
10791079 let newBalances = $t02634526371._1
10801080 let i = $t02634526371._2
10811081 if ((i == outIndex))
10821082 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
10831083 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
10841084 }
10851085
10861086 let $t02653826599 = {
10871087 let $l = xp
10881088 let $s = size($l)
10891089 let $acc0 = $Tuple2(nil, 0)
10901090 func $f0_1 ($a,$i) = if (($i >= $s))
10911091 then $a
10921092 else makeNewBalances($a, $l[$i])
10931093
10941094 func $f0_2 ($a,$i) = if (($i >= $s))
10951095 then $a
10961096 else throw("List size exceeds 15")
10971097
10981098 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10991099 }
11001100 let newBalances = $t02653826599._1
11011101 let v = $t02653826599._2
11021102 if (checkDAppThreshold(newBalances))
11031103 then throw()
11041104 else {
11051105 let us = unstake(dy_and_fee, tokenOut)
11061106 if ((us == us))
11071107 then [ScriptTransfer(msg.originCaller, dy, fromBase58String(tokenOut)), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, pmtAmount), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(tokenOut)), ScriptTransfer(capMoneyBoxAddress, (dy_fee - governanceFees), fromBase58String(tokenOut)), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))]
11081108 else throw("Strict value is not equal to itself.")
11091109 }
11101110 }
11111111 }
11121112 }
11131113 })
11141114
11151115
11161116
11171117 @Callable(msg)
11181118 func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
11191119 then throw("Unlock amount must be positive")
11201120 else {
11211121 let suspicious = checkSuspicious()
11221122 if (suspicious._1)
11231123 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
11241124 else {
11251125 let pmtAmount = if ((size(msg.payments) > 0))
11261126 then if ((size(msg.payments) != 1))
11271127 then throw("size(payments) != 1")
11281128 else {
11291129 let pmtAssetId = msg.payments[0].assetId
11301130 if ((shareAssetId != pmtAssetId))
11311131 then throw("unknown payment token")
11321132 else msg.payments[0].amount
11331133 }
11341134 else 0
11351135 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
11361136 if ((unlock == unlock))
11371137 then {
11381138 let withdrawAmount = (pmtAmount + unlockAmount)
11391139 let inv = invoke(this, "withdrawOneCoin", [tokenOut, minAmount], [AttachedPayment(shareAssetId, withdrawAmount)])
11401140 if ((inv == inv))
11411141 then nil
11421142 else throw("Strict value is not equal to itself.")
11431143 }
11441144 else throw("Strict value is not equal to itself.")
11451145 }
11461146 })
11471147
11481148
11491149
11501150 @Callable(msg)
11511151 func A () = $Tuple2(nil, _A())
11521152
11531153
11541154
11551155 @Callable(msg)
11561156 func getVirtualPrice () = {
11571157 let D = get_D(_xp(), _A())
11581158 $Tuple2(nil, fraction(D, PRECISION, shareSupply))
11591159 }
11601160
11611161
11621162
11631163 @Callable(msg)
11641164 func calcTokenAmount (amounts,deposit) = {
11651165 let amp = _A()
11661166 let balances = _xp()
11671167 let D0 = getDMem(balances, amp)
11681168 func calcNewBalances (acc,balance) = {
11691169 let $t02852328549 = acc
11701170 let newBalances = $t02852328549._1
11711171 let i = $t02852328549._2
11721172 let newBalance = (balance + (if (deposit)
11731173 then amounts[i]
11741174 else -(amounts[i])))
11751175 $Tuple2((newBalances :+ newBalance), (i + 1))
11761176 }
11771177
11781178 let newBalances = ( let $l = balances
11791179 let $s = size($l)
11801180 let $acc0 = $Tuple2(nil, 0)
11811181 func $f0_1 ($a,$i) = if (($i >= $s))
11821182 then $a
11831183 else calcNewBalances($a, $l[$i])
11841184
11851185 func $f0_2 ($a,$i) = if (($i >= $s))
11861186 then $a
11871187 else throw("List size exceeds 15")
11881188
11891189 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15))._1
11901190 let D1 = getDMem(newBalances, amp)
11911191 let diff = if (deposit)
11921192 then (D1 - D0)
11931193 else (D0 - D1)
11941194 $Tuple2(nil, fraction(diff, shareSupply, D0))
11951195 }
11961196
11971197
11981198
11991199 @Callable(msg)
12001200 func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
12011201 then throw("too often")
12021202 else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
12031203 then throw("insufficient time")
12041204 else {
12051205 let _initial_A = _A()
12061206 if (assert(if ((_futureA > 0))
12071207 then (MAX_A > _futureA)
12081208 else false))
12091209 then throw("out of base range")
12101210 else if (assert(if (if ((_futureA >= _initial_A))
12111211 then ((_initial_A * MAX_A_CHANGE) >= _futureA)
12121212 else false)
12131213 then true
12141214 else if ((_initial_A > _futureA))
12151215 then ((_futureA * MAX_A_CHANGE) >= _initial_A)
12161216 else false))
12171217 then throw("out of range")
12181218 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
12191219 }))
12201220
12211221
12221222
12231223 @Callable(msg)
12241224 func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
12251225 let currentA = _A()
12261226 [IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
12271227 }))
12281228
12291229
12301230
12311231 @Callable(msg)
12321232 func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
12331233 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
12341234 else suspend("Paused by admin"))
12351235
12361236
12371237
12381238 @Callable(msg)
12391239 func activate () = valueOrElse(isAdminCall(msg), if (active)
12401240 then throwIsActive()
12411241 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
12421242
12431243
12441244
12451245 @Callable(msg)
12461246 func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), [IntegerEntry(kShareLimit, shareLimit)]))
12471247
12481248
12491249 @Verifier(tx)
12501250 func verify () = {
12511251 let multiSignedByAdmins = {
12521252 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
12531253 then 1
12541254 else 0
12551255 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
12561256 then 1
12571257 else 0
12581258 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
12591259 then 1
12601260 else 0
12611261 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
12621262 }
12631263 match tx {
12641264 case inv: InvokeScriptTransaction =>
12651265 let callTakeIntoAccount = if ((inv.dApp == this))
12661266 then (inv.function == "takeIntoAccountExtraFunds")
12671267 else false
12681268 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
12691269 then true
12701270 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
12711271 then true
12721272 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
12731273 then true
12741274 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
12751275 if (if (callTakeIntoAccount)
12761276 then signedByAdmin
12771277 else false)
12781278 then true
12791279 else multiSignedByAdmins
12801280 case _ =>
12811281 multiSignedByAdmins
12821282 }
12831283 }
12841284

github/deemru/w8io/873ac7e 
110.92 ms