tx · 3UQnLqrBchZC76HhS4SbtxPmnZ95bUevxUgaVLZdgM7r

3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk:  -0.04200000 Waves

2024.01.04 16:34 [3982638] smart account 3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk > SELF 0.00000000 Waves

{ "type": 13, "id": "3UQnLqrBchZC76HhS4SbtxPmnZ95bUevxUgaVLZdgM7r", "fee": 4200000, "feeAssetId": null, "timestamp": 1704375243095, "version": 2, "chainId": 87, "sender": "3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk", "senderPublicKey": "46pxd1r6gmScNqdp82uEJMs2AZ1F9q2z1VtXZPFAtHYy", "proofs": [ "2irKhta7oRdu1CQFBzVN4EZUfuWEw2DVnDVJspsdt1XbwVrSzSpemZaaRVU6KA8QNVW7okPdMA8ZUAsoAXVqksDG" ], "script": "base64:BgICCAI2AAVXYXZlcwIFV0FWRVMABlNjYWxlNgDAhD0ABlNjYWxlOACAwtcvAAlTY2FsZThCaWcJALYCAQCAwtcvAAdTY2FsZTEwAIDIr6AlAAdTY2FsZTE2AICAhP6m3uERAApTY2FsZTE2QmlnCQC2AgEAgICE/qbe4REACWRheUJsb2NrcwCgCwAKeWVhckJsb2NrcwCgiiAADXllYXJCbG9ja3NCaWcJALYCAQCgiiAAC3Jlc2VydmVGdW5kABQABWFycjEyCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALBQNuaWwACXVzZHRJZFN0cgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kACXVzZGNJZFN0cgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cACXJvbWVJZFN0cgIsQVA0Q2I1eExZR0g2WmlnSHJlQ1pIb1hwUVRXRGtQc0cyQkhxZkRVeDZ0YUoAEG9yYWNsZUFkZHJlc3NTdHICIzNQOGQxRTFCTEtvRDUyeTNiUUoxYkRUZDJURDFncGFMbjl0AAtheGx5QWRkcmVzcwkBB0FkZHJlc3MBARoBV8/Idd4LdvyJm/d7rwlIRGcJKlBHPw9CLQAHYXhseUxQcwkAzAgCAiw3S1piSnJWb3B3SmhrZHdiZTFlRkRCYmV4NGRrWTYzTXhqVE5qcVh0cnpqMQkAzAgCAixCdHczRzFqNHdRZ2RwNDlQVHhhRmtOdm43NWRRdHFHRE03ZWpRcHBIbldDMQkAzAgCAixCaVN6RmU4blNMNzhvWmFlYmZvaW41dkJaNVB6ZTZkN2thZWlqTHFyNXhaZQkAzAgCAixGMkFLa0E1MTNrNXlIRUprTHNVNnZXeENZWWs4MTFHcGpMaHdFdjJXR3daOQkAzAgCAiw0Q1E1Q1BHTFhMYldCVXMySkJqS1VhUnFGNDlDbUtIa3d6dlBnU3ZRcEFRVgkAzAgCAiw2aU1CNkxLU3Jndjl3YUV2RW5ONllkeXg3ZGZ4UG5HY1R3ODMxOFdWbTViUgUDbmlsAQxnZXRSYXRlQ3VydmUCCmFzc2V0SWRTdHIJbWFya2V0U3RyBA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQltYXJrZXRTdHIEDnNldHVwUmF0ZUN1cnZlCQCdCAIFDW1hcmtldEFkZHJlc3MJAKwCAgIQc2V0dXBfcmF0ZUN1cnZlXwUKYXNzZXRJZFN0cgMJAQlpc0RlZmluZWQBBQ5zZXR1cFJhdGVDdXJ2ZQQIY3VydmVBcnIJALUJAgkBBXZhbHVlAQUOc2V0dXBSYXRlQ3VydmUCASwJAJYKBAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGN1cnZlQXJyAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhjdXJ2ZUFycgABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIY3VydmVBcnIAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGN1cnZlQXJyAAMEByRtYXRjaDAFCW1hcmtldFN0cgMJAAACAiMzUDR1QTVldG5aaTRBbUJhYktpbnEyYk1pV1U4S2NuSFpkSAUHJG1hdGNoMAQHJG1hdGNoMQUKYXNzZXRJZFN0cgMJAAACAiw5d2MzTFhOQTRURUJzWHlLdG9MRTltcmJERDdXTUhYdlhyQ2padmFiTEFzaQUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixIR2dhYlRxVVM4V3RWRlVKemZtclRETWdFY2NKdVpMQlBoRmdRRnh2bnNvVwUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiwzNE45WWNFRVRMV245M3FZUTY0RXNQMXg4OXRTcnVKVTQ0UnJFTVNYWEVQSgUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiw2WHRIanBYYnM5UlJKUDJTcjlHVXlWcXpBQ2NieTlUa1RoSFhualZDNUNESgUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cAUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixBanNvNm5UVGpwdHUyVUhMeDZoZlNYVnRIRnRSQkpDa0tZZDVTQXlqN3pmNQUHJG1hdGNoMQkAlgoEAICJegCAtIkTAIDokiYAgKPDRwMJAAACAixIRUI4UWF3OXhyV3BXczh0SHNpQVRZR0JXREJ0UDJTN2tjUEFMck11NDNBUwUHJG1hdGNoMQkAlgoEAAAAgMLXLwCA6JImAICI3r4BAwkAAAICBVdBVkVTBQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCAlfUqAwkAAAICLEF0cXY1OUVZempGR3VpdEtWbk1SazZIOEZ1a2pvVjNrdFBvcmJFeXMyNW9uBQckbWF0Y2gxCQCWCgQAAACA2sQJAIDokiYAgLSJEwMJAAACAixEU2JiaExzU1RlRGc1THNpdWZrMkFuZWgzRGpWcUp1UHIyTTl1VTFnd3k1cAUHJG1hdGNoMQkAlgoEAAAAgNrECQCA6JImAIDC1y8DCQAAAgIsOHQ0RFBXVHdQenBhdEhBOUFrVHhXQUI0N1RIbll6QnNEbm9ZN2ZRcWJHOTEFByRtYXRjaDEJAJYKBAAAAICHpw4AgOiSJgCAtIkTAwkAAAICLEF0OEQ2TkZGcGhlQ2J2S1ZualZvZUxMODRFbzhOWm42b3ZNYW54ZkxhRldMBQckbWF0Y2gxCQCWCgQAAADA8PULAIDokiYAgLSJEwMJAAACAiw4TFFXOGY3UDVkNVBaTTdHdFpFQmdhcVJQR1N6UzNEZlB1aVhyVVJKNEFKUwUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw0NzRqVGVZeDJyMlZhMzU3OTR0Q1NjQVhXSkc5aFUySGNneHpNb3dhWlVudQUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw1VVlCUHBxNFdvVTVuNE13cEZrZ0puVzNGcTRCMXUzdWtwSzMzaWs0UWVyUgUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiwydGhzQUN1SG16RE11TmV6UE0zMndnOWEzQndVekJXRGVTS2FrZ3ozY3cyMQUHJG1hdGNoMQkAlgoEAICJegCAtIkTAIDokiYAgMLXLwMJAAACAitZaU5ib2ZGekMxN2pFSEhDTXdyUmNweTlNcnJqYWJNTUxaeGc4ZzV4bWY3BQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA6JImAwkAAAICLDl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpBQckbWF0Y2gxCQCWCgQAAACA4esXAIDokiYAgISvXwMJAAACAiwzVnVWNVdUbUR6NDdEbWRuM1FwY1lqemJTZGlwalFFNEpNZE5lMXhacFgxMwUHJG1hdGNoMQkAlgoEAAAAgMLXLwCA6JImAICI3r4BCQCWCgQAAACA2sQJAIDokiYAgOiSJgMJAAACAiMzUDhEZjJiN3l3SHRMQkhCZThQQlZRWWQzQTVNZEVFSkFvdQUHJG1hdGNoMAkAlgoEAIDaxAkAgMLXLwCAjs4cAICI3r4BAwkAAAICIzNQNERLNVZ6RHdMM3ZmYzVhaFVFaHRvZTVCeVpOeWFjSjNYBQckbWF0Y2gwBAckbWF0Y2gxBQphc3NldElkU3RyAwkAAAICLDl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLEhHZ2FiVHFVUzhXdFZGVUp6Zm1yVERNZ0VjY0p1WkxCUGhGZ1FGeHZuc29XBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLDM0TjlZY0VFVExXbjkzcVlRNjRFc1AxeDg5dFNydUpVNDRSckVNU1hYRVBKBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLDZYdEhqcFhiczlSUkpQMlNyOUdVeVZxekFDY2J5OVRrVGhIWG5qVkM1Q0RKBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLERHMnhGa1BkRHdLVW9Ca3pHQWhRdExwU0d6ZlhMaUNZUEV6ZUtIMkFkMjRwBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLEFqc282blRUanB0dTJVSEx4NmhmU1hWdEhGdFJCSkNrS1lkNVNBeWo3emY1BQckbWF0Y2gxCQCWCgQAgIl6AIC0iRMAgOiSJgCAo8NHAwkAAAICLEhFQjhRYXc5eHJXcFdzOHRIc2lBVFlHQldEQnRQMlM3a2NQQUxyTXU0M0FTBQckbWF0Y2gxCQCWCgQAAACA4esXAIDokiYAgIjevgEDCQAAAgIFV0FWRVMFByRtYXRjaDEJAJYKBACAiXoAgIenDgCA6JImAIDokiYDCQAAAgIsQXRxdjU5RVl6akZHdWl0S1ZuTVJrNkg4RnVram9WM2t0UG9yYkV5czI1b24FByRtYXRjaDEJAJYKBAAAAIDaxAkAgOiSJgCAtIkTAwkAAAICLERTYmJoTHNTVGVEZzVMc2l1ZmsyQW5laDNEalZxSnVQcjJNOXVVMWd3eTVwBQckbWF0Y2gxCQCWCgQAAACA2sQJAIDokiYAgMLXLwMJAAACAiw4dDREUFdUd1B6cGF0SEE5QWtUeFdBQjQ3VEhuWXpCc0Rub1k3ZlFxYkc5MQUHJG1hdGNoMQkAlgoEAAAAgIenDgCA6JImAIC0iRMDCQAAAgIsQXQ4RDZORkZwaGVDYnZLVm5qVm9lTEw4NEVvOE5abjZvdk1hbnhmTGFGV0wFByRtYXRjaDEJAJYKBAAAAMDw9QsAgOiSJgCAtIkTAwkAAAICLDhMUVc4ZjdQNWQ1UFpNN0d0WkVCZ2FxUlBHU3pTM0RmUHVpWHJVUko0QUpTBQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLDQ3NGpUZVl4MnIyVmEzNTc5NHRDU2NBWFdKRzloVTJIY2d4ek1vd2FaVW51BQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLDVVWUJQcHE0V29VNW40TXdwRmtnSm5XM0ZxNEIxdTN1a3BLMzNpazRRZXJSBQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLDJ0aHNBQ3VIbXpETXVOZXpQTTMyd2c5YTNCd1V6QldEZVNLYWtnejNjdzIxBQckbWF0Y2gxCQCWCgQAgIl6AIC0iRMAgOiSJgCAwtcvAwkAAAICK1lpTmJvZkZ6QzE3akVISENNd3JSY3B5OU1ycmphYk1NTFp4ZzhnNXhtZjcFByRtYXRjaDEJAJYKBACAiXoAgIenDgCA6JImAIDokiYDCQAAAgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kFByRtYXRjaDEJAJYKBAAAAIDh6xcAgOiSJgCAhK9fAwkAAAICLDNWdVY1V1RtRHo0N0RtZG4zUXBjWWp6YlNkaXBqUUU0Sk1kTmUxeFpwWDEzBQckbWF0Y2gxCQCWCgQAAACAwtcvAIDokiYAgIjevgEJAJYKBAAAAIDaxAkAgOiSJgCA6JImAwkAAAICIzNQSHB1UVVQVlVvUjNBWXpGZUp6ZVdKZllMc0xUbVdzc1ZIBQckbWF0Y2gwCQCWCgQAgNrECQCAwtcvAICOzhwAgIjevgEDCQAAAgIjM1BBZDlBcWczY1FTenUyNk1GWVdRWWNqU1hQVkNKdHVmNVYFByRtYXRjaDAEByRtYXRjaDEFCmFzc2V0SWRTdHIDCQAAAgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsMzROOVljRUVUTFduOTNxWVE2NEVzUDF4ODl0U3J1SlU0NFJyRU1TWFhFUEoFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsNlh0SGpwWGJzOVJSSlAyU3I5R1V5VnF6QUNjYnk5VGtUaEhYbmpWQzVDREoFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsQWpzbzZuVFRqcHR1MlVITHg2aGZTWFZ0SEZ0UkJKQ2tLWWQ1U0F5ajd6ZjUFByRtYXRjaDEJAJYKBACAiXoAgLSJEwCA6JImAICjw0cDCQAAAgIsSEVCOFFhdzl4cldwV3M4dEhzaUFUWUdCV0RCdFAyUzdrY1BBTHJNdTQzQVMFByRtYXRjaDEJAJYKBAAAAIDaxAkAgOiSJgCAtIkTAwkAAAICBVdBVkVTBQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLEF0cXY1OUVZempGR3VpdEtWbk1SazZIOEZ1a2pvVjNrdFBvcmJFeXMyNW9uBQckbWF0Y2gxCQCWCgQAAACA2sQJAIDokiYAgLSJEwMJAAACAixEU2JiaExzU1RlRGc1THNpdWZrMkFuZWgzRGpWcUp1UHIyTTl1VTFnd3k1cAUHJG1hdGNoMQkAlgoEAAAAgNrECQCA6JImAIDC1y8DCQAAAgIsOHQ0RFBXVHdQenBhdEhBOUFrVHhXQUI0N1RIbll6QnNEbm9ZN2ZRcWJHOTEFByRtYXRjaDEJAJYKBAAAAICHpw4AgOiSJgCAtIkTAwkAAAICLEF0OEQ2TkZGcGhlQ2J2S1ZualZvZUxMODRFbzhOWm42b3ZNYW54ZkxhRldMBQckbWF0Y2gxCQCWCgQAAADA8PULAIDokiYAgLSJEwMJAAACAiw4TFFXOGY3UDVkNVBaTTdHdFpFQmdhcVJQR1N6UzNEZlB1aVhyVVJKNEFKUwUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw0NzRqVGVZeDJyMlZhMzU3OTR0Q1NjQVhXSkc5aFUySGNneHpNb3dhWlVudQUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw1VVlCUHBxNFdvVTVuNE13cEZrZ0puVzNGcTRCMXUzdWtwSzMzaWs0UWVyUgUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiwydGhzQUN1SG16RE11TmV6UE0zMndnOWEzQndVekJXRGVTS2FrZ3ozY3cyMQUHJG1hdGNoMQkAlgoEAICJegCAtIkTAIDokiYAgMLXLwMJAAACAitZaU5ib2ZGekMxN2pFSEhDTXdyUmNweTlNcnJqYWJNTUxaeGc4ZzV4bWY3BQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA6JImCQCWCgQAAACA2sQJAIDokiYAgOiSJgkAAgECDlVua25vd24gbWFya2V0AQNzdW0CBHNpemUEZGF0YQoBBGZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAUEc2l6ZQUFYWNjdW0JAGQCBQVhY2N1bQkAkQMCBQRkYXRhBQRuZXh0CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAEOZ2V0U2V0dXBUb2tlbnMBDW1hcmtldEFkZHJlc3MJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIMc2V0dXBfdG9rZW5zAgEsAQ1nZXRUb2tlblByaWNlAg1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIECW9yYWNsZVN0cgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1tYXJrZXRBZGRyZXNzAgZvcmFjbGUFEG9yYWNsZUFkZHJlc3NTdHIEDW9yYWNsZUFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW9yYWNsZVN0cgQHc3RhYmxlcwkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFDW1hcmtldEFkZHJlc3MCEHNldHVwX3N0YWJsZXNJZHMCWTl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpLEhHZ2FiVHFVUzhXdFZGVUp6Zm1yVERNZ0VjY0p1WkxCUGhGZ1FGeHZuc29XAgEsAwkBAiE9AgkAzwgCBQdzdGFibGVzBQphc3NldElkU3RyBQR1bml0AMCEPQMDAwkAAAIFCmFzc2V0SWRTdHIFCXVzZHRJZFN0cgYJAAACBQphc3NldElkU3RyBQl1c2RjSWRTdHIGCQAAAgUKYXNzZXRJZFN0cgUJcm9tZUlkU3RyAMCEPQMJAQ9jb250YWluc0VsZW1lbnQCBQdheGx5TFBzBQphc3NldElkU3RyCgABQAkA/AcEBQtheGx5QWRkcmVzcwIaZ2V0U2hhcmVBc3NldFByaWNlUkVBRE9OTFkJAMwIAgUKYXNzZXRJZFN0cgUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAVwcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUNb3JhY2xlQWRkcmVzcwkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBQVwcmljZQENZ2V0QXNzZXRTY2FsZQEKYXNzZXRJZFN0cgQIZGVjaW1hbHMDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMACAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQphc3NldElkU3RyCGRlY2ltYWxzCQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgERZ2V0TGFzdFJhdGVIZWlnaHQBDW1hcmtldEFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwIObGFzdFJhdGVIZWlnaHQAAAEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQINbWFya2V0QWRkcmVzcwphc3NldElkU3RyCQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyAAABFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1tYXJrZXRBZGRyZXNzCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgAAARBnZXRPdXRkYXRlZFNSYXRlAg1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwkArAICBQphc3NldElkU3RyAgZfc1JhdGUAAAEQZ2V0T3V0ZGF0ZWRCUmF0ZQINbWFya2V0QWRkcmVzcwphc3NldElkU3RyCQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIGX2JSYXRlAAABDWdldE91dGRhdGVkVXIEE291dGRhdGVkVG90YWxTdXBwbHkTb3V0ZGF0ZWRUb3RhbEJvcnJvdw1vdXRkYXRlZFNSYXRlDW91dGRhdGVkQlJhdGUEBGRvd24JAGsDBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQ1vdXRkYXRlZFNSYXRlBQdTY2FsZTE2AwkAAAIFBGRvd24AAAAACQBrAwUGU2NhbGU4CQBrAwUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRCUmF0ZQUHU2NhbGUxNgUEZG93bgEHZ2V0UmF0ZQMKb3V0ZGF0ZWRVcgphc3NldElkU3RyCW1hcmtldFN0cgQFY3VydmUJAQxnZXRSYXRlQ3VydmUCBQphc3NldElkU3RyBQltYXJrZXRTdHIJAGQCCAUFY3VydmUCXzEDCQBnAggFBWN1cnZlAl8zBQpvdXRkYXRlZFVyCQBrAwUKb3V0ZGF0ZWRVcggFBWN1cnZlAl8yCAUFY3VydmUCXzMJAGQCCAUFY3VydmUCXzIJAGsDCQBlAgUKb3V0ZGF0ZWRVcggFBWN1cnZlAl8zCAUFY3VydmUCXzQJAGUCAIDC1y8IBQVjdXJ2ZQJfMwELZ2V0SW50ZXJlc3QBBHJhdGUJAJYDAQkAzAgCCQBrAwUEcmF0ZQUGU2NhbGU4BQp5ZWFyQmxvY2tzCQDMCAIAAQUDbmlsAQ1nZXRBc3NldEluZGV4AgtzZXR1cFRva2Vucwphc3NldElkU3RyCQEFdmFsdWUBCQDPCAIFC3NldHVwVG9rZW5zBQphc3NldElkU3RyARFnZXRBc3NldFBhcmFtdGVycwIQbWFya2V0UGFyYW1ldGVycwphc3NldEluZGV4CQCVCgMJAJEDAggFEG1hcmtldFBhcmFtZXRlcnMCXzEFCmFzc2V0SW5kZXgJAJEDAggFEG1hcmtldFBhcmFtZXRlcnMCXzIFCmFzc2V0SW5kZXgJAJEDAggFEG1hcmtldFBhcmFtZXRlcnMCXzMFCmFzc2V0SW5kZXgBE2dldE1hcmtldFBhcmFtZXRlcnMCDW1hcmtldEFkZHJlc3MLc2V0dXBUb2tlbnMEB3NldHVwQ2YJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIKc2V0dXBfbHR2cwIBLAQHc2V0dXBMdAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAglzZXR1cF9sdHMCASwEDHNldHVwUGVuYWx0eQkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAg9zZXR1cF9wZW5hbHRpZXMCASwECnRva2Vuc1NpemUJAJADAQULc2V0dXBUb2tlbnMKAQRmb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFCnRva2Vuc1NpemUFBWFjY3VtCQCVCgMJAM0IAggFBWFjY3VtAl8xCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBDZgUEbmV4dAkAzQgCCAUFYWNjdW0CXzIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cEx0BQRuZXh0CQDNCAIIBQVhY2N1bQJfMwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHNldHVwUGVuYWx0eQUEbmV4dAoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwBDGdldE1heFN1cHBseQINbWFya2V0QWRkcmVzcwphc3NldElkU3RyCQENcGFyc2VJbnRWYWx1ZQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNbWFya2V0QWRkcmVzcwkArAICAhBzZXR1cF9tYXhTdXBwbHlfBQphc3NldElkU3RyAgEwAQ5nZXRBY3R1YWxTUmF0ZQQObGFzdFJhdGVIZWlnaHQIaW50ZXJlc3QKb3V0ZGF0ZWRVcg1vdXRkYXRlZFNSYXRlBAlsYXN0U1JhdGUJAJYDAQkAzAgCBQ1vdXRkYXRlZFNSYXRlCQDMCAIFB1NjYWxlMTYFA25pbAQIbmV3U1JhdGUJAGQCBQlsYXN0U1JhdGUJAGkCCQBoAgkAaAIJAGUCBQZoZWlnaHQFDmxhc3RSYXRlSGVpZ2h0CQBrAwUIaW50ZXJlc3QFCm91dGRhdGVkVXIFBlNjYWxlOAkAZQIAZAULcmVzZXJ2ZUZ1bmQAZAUIbmV3U1JhdGUBDmdldEFjdHVhbEJSYXRlAw5sYXN0UmF0ZUhlaWdodAhpbnRlcmVzdA1vdXRkYXRlZEJSYXRlBAlsYXN0QlJhdGUJAJYDAQkAzAgCBQ1vdXRkYXRlZEJSYXRlCQDMCAIFB1NjYWxlMTYFA25pbAQIbmV3QlJhdGUJAGQCBQlsYXN0QlJhdGUJAGgCCQBlAgUGaGVpZ2h0BQ5sYXN0UmF0ZUhlaWdodAUIaW50ZXJlc3QFCG5ld0JSYXRlAQtnZXRBY3R1YWxVcgIMYWN0dWFsU3VwcGx5DGFjdHVhbEJvcnJvdwkAawMFDGFjdHVhbEJvcnJvdwUGU2NhbGU4BQxhY3R1YWxTdXBwbHkBD2dldEFjdHVhbEFtb3VudAIOb3V0ZGF0ZWRBbW91bnQKYWN0dWFsUmF0ZQkAawMFDm91dGRhdGVkQW1vdW50BQphY3R1YWxSYXRlBQdTY2FsZTE2AQhnZXRJblVzZAMMYWN0dWFsQW1vdW50CmFzc2V0U2NhbGUFcHJpY2UJAGsDBQxhY3R1YWxBbW91bnQFBXByaWNlBQphc3NldFNjYWxlAQxnZXRTdXBwbHlBcHkCBHJhdGUIYWN0dWFsVXIECnN1cHBseVJhdGUJAGsDCQBrAwUEcmF0ZQBQAGQFCGFjdHVhbFVyBQZTY2FsZTgJAGUCCQCgAwEJAHYGCQC3AgIFClNjYWxlMTZCaWcJALwCAwkAtgIBBQpzdXBwbHlSYXRlBQlTY2FsZThCaWcFDXllYXJCbG9ja3NCaWcAEAUNeWVhckJsb2Nrc0JpZwAAAAgFBERPV04FBlNjYWxlOAEMZ2V0Qm9ycm93QXB5AQRyYXRlCQBlAgkAoAMBCQB2BgkAtwICBQpTY2FsZTE2QmlnCQC8AgMJALYCAQUEcmF0ZQUJU2NhbGU4QmlnBQ15ZWFyQmxvY2tzQmlnABAFDXllYXJCbG9ja3NCaWcAAAAIBQRET1dOBQZTY2FsZTgBD2dldFdhbGxldFN1cHBseQQNbWFya2V0QWRkcmVzcwphc3NldElkU3RyBndhbGxldAthY3R1YWxTUmF0ZQQUb3V0ZGF0ZWRXYWxsZXRTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwkArAICCQCsAgIFBndhbGxldAIKX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgAACQEPZ2V0QWN0dWFsQW1vdW50AgUUb3V0ZGF0ZWRXYWxsZXRTdXBwbHkFC2FjdHVhbFNSYXRlAQ9nZXRXYWxsZXRCb3Jyb3cEDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgZ3YWxsZXQLYWN0dWFsQlJhdGUEFG91dGRhdGVkV2FsbGV0Qm9ycm93CQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgkArAICBQZ3YWxsZXQCCl9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIAAAkBD2dldEFjdHVhbEFtb3VudAIFFG91dGRhdGVkV2FsbGV0Qm9ycm93BQthY3R1YWxCUmF0ZQEQZ2V0RGFpbHlQZXJjZW50cwIDYXB5CHF1YW50aXR5CQBrAwkAawMJAGUCCQCgAwEJAHYGCQC3AgIFCVNjYWxlOEJpZwkAtgIBBQNhcHkACAkAugICBQpTY2FsZTE2QmlnBQ15ZWFyQmxvY2tzQmlnABAAEAUERE9XTgUHU2NhbGUxNgUJZGF5QmxvY2tzBQZTY2FsZTgFCHF1YW50aXR5BQZTY2FsZTgBEGdldEFjY291bnRIZWFsdGgCG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZBt0b3RhbFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QDCQAAAgUbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkAAAFBlNjYWxlOAkAZQIFBlNjYWxlOAkAawMFG3RvdGFsV2FsbGV0Qm9ycm93VXNhZ2VJblVzZAUGU2NhbGU4BRt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QBCWdldE5ldEFweQMWdG90YWxXYWxsZXRTdXBwbHlJblVzZBZ0b3RhbFdhbGxldEJvcnJvd0luVXNkFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QDCQAAAgUWdG90YWxXYWxsZXRNYXJnaW5JblVzZAAAAAADCQBmAgUWdG90YWxXYWxsZXRNYXJnaW5JblVzZAAACQBrAwUWdG90YWxXYWxsZXRNYXJnaW5JblVzZAUGU2NhbGU4BRZ0b3RhbFdhbGxldFN1cHBseUluVXNkCQBrAwUWdG90YWxXYWxsZXRNYXJnaW5JblVzZAUGU2NhbGU4BRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkAQthc3NldFRvSnNvbgIKYXNzZXRJZFN0cghxdWFudGl0eQQNJHQwMTUyOTAxNTQ4NQMJAAACBQphc3NldElkU3RyBQVXYXZlcwkAlAoCAAgCBVdBVkVTBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFCmFzc2V0SWRTdHIJAJQKAggFBWFzc2V0CGRlY2ltYWxzCAUFYXNzZXQEbmFtZQQIZGVjaW1hbHMIBQ0kdDAxNTI5MDE1NDg1Al8xBARuYW1lCAUNJHQwMTUyOTAxNTQ4NQJfMgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDHsicXVhbnRpdHkiOgkApAMBBQhxdWFudGl0eQIMLCJkZWNpbWFscyI6CQCkAwEFCGRlY2ltYWxzAgksIm5hbWUiOiIFBG5hbWUCCCIsImlkIjoiBQphc3NldElkU3RyAgIifQEPYW1vdW50VG9EZWNpbWFsAgZhbW91bnQIZGVjaW1hbHMJAKwCAgkArAICCQCsAgIJAKwCAgIMeyJxdWFudGl0eSI6CQCkAwEFBmFtb3VudAIMLCJkZWNpbWFscyI6CQCkAwEFCGRlY2ltYWxzAhMsIm5hbWUiOiIiLCJpZCI6IiJ9AQ1nZXRNYXJrZXRKc29uAwttYXJrZXRJbmRleAZ3YWxsZXQFZGVidWcECW1hcmtldFN0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgdtYXJrZXRfCQCkAwEFC21hcmtldEluZGV4BA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQltYXJrZXRTdHIECm1hcmtldE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIMbWFya2V0X25hbWVfBQltYXJrZXRTdHIEBmFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ1tYXJrZXRBZGRyZXNzAgxzZXR1cF9hY3RpdmUGBAtzZXR1cFRva2VucwkBDmdldFNldHVwVG9rZW5zAQUNbWFya2V0QWRkcmVzcwQLYXNzZXRzQ291bnQJAJADAQULc2V0dXBUb2tlbnMEDmxhc3RSYXRlSGVpZ2h0CQERZ2V0TGFzdFJhdGVIZWlnaHQBBQ1tYXJrZXRBZGRyZXNzCgEKYXNzZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQthc3NldHNDb3VudAUFYWNjdW0ECmFzc2V0SWRTdHIJAJEDAgULc2V0dXBUb2tlbnMFBG5leHQEBXByaWNlCQENZ2V0VG9rZW5QcmljZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECmFzc2V0U2NhbGUJAQ1nZXRBc3NldFNjYWxlAQUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbFN1cHBseQkBFmdldE91dGRhdGVkVG90YWxTdXBwbHkCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsQm9ycm93CQEWZ2V0T3V0ZGF0ZWRUb3RhbEJvcnJvdwIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkU1JhdGUJARBnZXRPdXRkYXRlZFNSYXRlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRCUmF0ZQkBEGdldE91dGRhdGVkQlJhdGUCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBApvdXRkYXRlZFVyCQENZ2V0T3V0ZGF0ZWRVcgQFE291dGRhdGVkVG90YWxTdXBwbHkFE291dGRhdGVkVG90YWxCb3Jyb3cFDW91dGRhdGVkU1JhdGUFDW91dGRhdGVkQlJhdGUEBHJhdGUJAQdnZXRSYXRlAwUKb3V0ZGF0ZWRVcgUKYXNzZXRJZFN0cgUJbWFya2V0U3RyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUKb3V0ZGF0ZWRVcgUNb3V0ZGF0ZWRTUmF0ZQQFYlJhdGUJAQ5nZXRBY3R1YWxCUmF0ZQMFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUNb3V0ZGF0ZWRCUmF0ZQQGc3VwcGx5CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUFc1JhdGUEBmJvcnJvdwkBD2dldEFjdHVhbEFtb3VudAIFE291dGRhdGVkVG90YWxCb3Jyb3cFBWJSYXRlBAtzdXBwbHlJblVzZAkBCGdldEluVXNkAwUGc3VwcGx5BQphc3NldFNjYWxlBQVwcmljZQQLYm9ycm93SW5Vc2QJAQhnZXRJblVzZAMFBmJvcnJvdwUKYXNzZXRTY2FsZQUFcHJpY2UECHJlc2VydmVzCQBlAgUGc3VwcGx5BQZib3Jyb3cEDXJlc2VydmVzSW5Vc2QJAQhnZXRJblVzZAMFCHJlc2VydmVzBQphc3NldFNjYWxlBQVwcmljZQQCdXIJAQtnZXRBY3R1YWxVcgIFBnN1cHBseQUGYm9ycm93BAlzdXBwbHlBcHkJAQxnZXRTdXBwbHlBcHkCBQRyYXRlBQJ1cgQJYm9ycm93QXB5CQEMZ2V0Qm9ycm93QXB5AQUEcmF0ZQQPbWFya2V0QXNzZXRKc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCSJzdXBwbHkiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUGc3VwcGx5Ag8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgULc3VwcGx5SW5Vc2QCCiwiYm9ycm93IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFBmJvcnJvdwIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFC2JvcnJvd0luVXNkAgwsInJlc2VydmVzIjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFCHJlc2VydmVzAhEsInJlc2VydmVzSW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQ1yZXNlcnZlc0luVXNkAgksInByaWNlIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUFcHJpY2UCDSwic3VwcGx5QXB5IjoJAQ9hbW91bnRUb0RlY2ltYWwCBQlzdXBwbHlBcHkACAINLCJib3Jyb3dBcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFCWJvcnJvd0FweQAIAhQsInV0aWxpemF0aW9uUmF0aW8iOgkBD2Ftb3VudFRvRGVjaW1hbAIFAnVyAAgCCSwic1JhdGUiOgkBD2Ftb3VudFRvRGVjaW1hbAIFBXNSYXRlABACCSwiYlJhdGUiOgkBD2Ftb3VudFRvRGVjaW1hbAIFBWJSYXRlABACAX0JAJYKBAkAZAIIBQVhY2N1bQJfMQULc3VwcGx5SW5Vc2QJAGQCCAUFYWNjdW0CXzIFC2JvcnJvd0luVXNkCQBkAggFBWFjY3VtAl8zBQ1yZXNlcnZlc0luVXNkCQDNCAIIBQVhY2N1bQJfNAUPbWFya2V0QXNzZXRKc29uBA0kdDAxODg5ODE5MDA2CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAAAAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCmFzc2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBAtzdXBwbHlJblVzZAgFDSR0MDE4ODk4MTkwMDYCXzEEC2JvcnJvd0luVXNkCAUNJHQwMTg4OTgxOTAwNgJfMgQNcmVzZXJ2ZXNJblVzZAgFDSR0MDE4ODk4MTkwMDYCXzMEEG1hcmtldEFzc2V0c0pzb24IBQ0kdDAxODg5ODE5MDA2Al80BAxtYXJrZXRzQ291bnQJARFAZXh0ck5hdGl2ZSgxMDU1KQECB21hcmtldHMKAQttYXJrZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQxtYXJrZXRzQ291bnQFBWFjY3VtBBdjdXJyZW50TWFya2V0QWRkcmVzc1N0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgdtYXJrZXRfCQCkAwEFBG5leHQEEWN1cnJlbnRNYXJrZXROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICDG1hcmtldF9uYW1lXwUXY3VycmVudE1hcmtldEFkZHJlc3NTdHIECnNpbXBsZUpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIIImluZGV4IjoJAKQDAQUEbmV4dAIJLCJuYW1lIjoiBRFjdXJyZW50TWFya2V0TmFtZQIBIgIPLCJzdXBwbHlJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIAAAIRLCJhY2NvdW50SGVhbHRoIjoJAQ9hbW91bnRUb0RlY2ltYWwCAAAACAIBfQMJAAACBQZ3YWxsZXQCAAkAzQgCBQVhY2N1bQUKc2ltcGxlSnNvbgQUY3VycmVudE1hcmtldEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFF2N1cnJlbnRNYXJrZXRBZGRyZXNzU3RyBBJjdXJyZW50U2V0dXBUb2tlbnMJAQ5nZXRTZXR1cFRva2VucwEFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBBJjdXJyZW50QXNzZXRzQ291bnQJAJADAQUSY3VycmVudFNldHVwVG9rZW5zBBZjdXJyZW50TWFya2V0U2hvcnROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICEW1hcmtldF9zaG9ydG5hbWVfBRdjdXJyZW50TWFya2V0QWRkcmVzc1N0cgQHc2V0dXBDZgkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBRRjdXJyZW50TWFya2V0QWRkcmVzcwIKc2V0dXBfbHR2cwIBLAQHc2V0dXBMdAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBRRjdXJyZW50TWFya2V0QWRkcmVzcwIJc2V0dXBfbHRzAgEsBBVjdXJyZW50TGFzdFJhdGVIZWlnaHQJARFnZXRMYXN0UmF0ZUhlaWdodAEFFGN1cnJlbnRNYXJrZXRBZGRyZXNzCgEQbWFya2V0QXNzZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BRJjdXJyZW50QXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFEmN1cnJlbnRTZXR1cFRva2VucwUEbmV4dAQCY2YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cENmBQRuZXh0BAJsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwTHQFBG5leHQEBXByaWNlCQENZ2V0VG9rZW5QcmljZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECmFzc2V0U2NhbGUJAQ1nZXRBc3NldFNjYWxlAQUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbFN1cHBseQkBFmdldE91dGRhdGVkVG90YWxTdXBwbHkCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbEJvcnJvdwkBFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRTUmF0ZQkBEGdldE91dGRhdGVkU1JhdGUCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRCUmF0ZQkBEGdldE91dGRhdGVkQlJhdGUCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKb3V0ZGF0ZWRVcgkBDWdldE91dGRhdGVkVXIEBRNvdXRkYXRlZFRvdGFsU3VwcGx5BRNvdXRkYXRlZFRvdGFsQm9ycm93BQ1vdXRkYXRlZFNSYXRlBQ1vdXRkYXRlZEJSYXRlBARyYXRlCQEHZ2V0UmF0ZQMFCm91dGRhdGVkVXIFCmFzc2V0SWRTdHIFCW1hcmtldFN0cgQIaW50ZXJlc3QJAQtnZXRJbnRlcmVzdAEFBHJhdGUEBXNSYXRlCQEOZ2V0QWN0dWFsU1JhdGUEBRVjdXJyZW50TGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQpvdXRkYXRlZFVyBQ1vdXRkYXRlZFNSYXRlBAViUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUVY3VycmVudExhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUNb3V0ZGF0ZWRCUmF0ZQQMd2FsbGV0U3VwcGx5CQEPZ2V0V2FsbGV0U3VwcGx5BAUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFc1JhdGUEEXdhbGxldFN1cHBseUluVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRTdXBwbHkFCmFzc2V0U2NhbGUFBXByaWNlBAx3YWxsZXRCb3Jyb3cJAQ9nZXRXYWxsZXRCb3Jyb3cEBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQViUmF0ZQQRd2FsbGV0Qm9ycm93SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldEJvcnJvdwUKYXNzZXRTY2FsZQUFcHJpY2UEFndhbGxldEJvcnJvd0xpbWl0SW5Vc2QJAGsDBRF3YWxsZXRTdXBwbHlJblVzZAUCY2YFBlNjYWxlOAQWd2FsbGV0Qm9ycm93VXNhZ2VJblVzZAkAawMFEXdhbGxldEJvcnJvd0luVXNkBQZTY2FsZTgFAmx0CQCWCgQJAGQCCAUFYWNjdW0CXzEFEXdhbGxldFN1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBRF3YWxsZXRCb3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUWd2FsbGV0Qm9ycm93TGltaXRJblVzZAkAZAIIBQVhY2N1bQJfNAUWd2FsbGV0Qm9ycm93VXNhZ2VJblVzZAQNJHQwMjI1NzcyMjczNwoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAAAAAAAAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBtYXJrZXRBc3NldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQWdG90YWxXYWxsZXRTdXBwbHlJblVzZAgFDSR0MDIyNTc3MjI3MzcCXzEEFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QIBQ0kdDAyMjU3NzIyNzM3Al8yBBt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QIBQ0kdDAyMjU3NzIyNzM3Al8zBBt0b3RhbFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QIBQ0kdDAyMjU3NzIyNzM3Al80BA1hY2NvdW50SGVhbHRoCQEQZ2V0QWNjb3VudEhlYWx0aAIFG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAUbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkBAhmdWxsSnNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIIImluZGV4IjoJAKQDAQUEbmV4dAIJLCJuYW1lIjoiBRZjdXJyZW50TWFya2V0U2hvcnROYW1lAgEiAg8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QCESwiYWNjb3VudEhlYWx0aCI6CQEPYW1vdW50VG9EZWNpbWFsAgUNYWNjb3VudEhlYWx0aAAIAgF9CQDNCAIFBWFjY3VtBQhmdWxsSnNvbgQLbWFya2V0c0pzb24KAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBC21hcmtldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQEanNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCCJpbmRleCI6CQCkAwEFC21hcmtldEluZGV4AgksIm5hbWUiOiIFCm1hcmtldE5hbWUCASICDCwiYWRkcmVzcyI6IgUJbWFya2V0U3RyAgEiAgosImFjdGl2ZSI6CQClAwEFBmFjdGl2ZQIPLCJzdXBwbHlJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFC3N1cHBseUluVXNkAg8sImJvcnJvd0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgULYm9ycm93SW5Vc2QCESwicmVzZXJ2ZXNJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFDXJlc2VydmVzSW5Vc2QCCywiYXNzZXRzIjpbCQC7CQIFEG1hcmtldEFzc2V0c0pzb24CASwCAV0CDCwibWFya2V0cyI6WwkAuwkCBQttYXJrZXRzSnNvbgIBLAIBXQIBfQMFBWRlYnVnCQACAQUEanNvbgUEanNvbgELZ2V0TWVudUpzb24BBWRlYnVnBAxtYXJrZXRzQ291bnQJARFAZXh0ck5hdGl2ZSgxMDU1KQECB21hcmtldHMKAQttYXJrZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQxtYXJrZXRzQ291bnQFBWFjY3VtBAltYXJrZXRTdHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIHbWFya2V0XwkApAMBBQRuZXh0BA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQltYXJrZXRTdHIEC3NldHVwVG9rZW5zCQEOZ2V0U2V0dXBUb2tlbnMBBQ1tYXJrZXRBZGRyZXNzBAthc3NldHNDb3VudAkAkAMBBQtzZXR1cFRva2VucwQObGFzdFJhdGVIZWlnaHQJARFnZXRMYXN0UmF0ZUhlaWdodAEFDW1hcmtldEFkZHJlc3MKAQphc3NldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFC2Fzc2V0c0NvdW50BQVhY2N1bQQKYXNzZXRJZFN0cgkAkQMCBQtzZXR1cFRva2VucwUEbmV4dAQFcHJpY2UJAQ1nZXRUb2tlblByaWNlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDWdldEFzc2V0U2NhbGUBBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsU3VwcGx5CQEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRTUmF0ZQkBEGdldE91dGRhdGVkU1JhdGUCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZEJSYXRlCQEQZ2V0T3V0ZGF0ZWRCUmF0ZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECm91dGRhdGVkVXIJAQ1nZXRPdXRkYXRlZFVyBAUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRTUmF0ZQUNb3V0ZGF0ZWRCUmF0ZQQEcmF0ZQkBB2dldFJhdGUDBQpvdXRkYXRlZFVyBQphc3NldElkU3RyBQltYXJrZXRTdHIECGludGVyZXN0CQELZ2V0SW50ZXJlc3QBBQRyYXRlBAVzUmF0ZQkBDmdldEFjdHVhbFNSYXRlBAUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQpvdXRkYXRlZFVyBQ1vdXRkYXRlZFNSYXRlBAViUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAZzdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQGYm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUEC3N1cHBseUluVXNkCQEIZ2V0SW5Vc2QDBQZzdXBwbHkFCmFzc2V0U2NhbGUFBXByaWNlBAtib3Jyb3dJblVzZAkBCGdldEluVXNkAwUGYm9ycm93BQphc3NldFNjYWxlBQVwcmljZQQIcmVzZXJ2ZXMJAGUCBQZzdXBwbHkFBmJvcnJvdwQNcmVzZXJ2ZXNJblVzZAkBCGdldEluVXNkAwUIcmVzZXJ2ZXMFCmFzc2V0U2NhbGUFBXByaWNlBA9tYXJrZXRBc3NldEpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCCJhc3NldCI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyAAACCSwicHJpY2UiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQVwcmljZQIJLCJzUmF0ZSI6CQEPYW1vdW50VG9EZWNpbWFsAgUFc1JhdGUAEAIJLCJiUmF0ZSI6CQEPYW1vdW50VG9EZWNpbWFsAgUFYlJhdGUAEAIBfQkAlgoECQBkAggFBWFjY3VtAl8xBQtzdXBwbHlJblVzZAkAZAIIBQVhY2N1bQJfMgULYm9ycm93SW5Vc2QJAGQCCAUFYWNjdW0CXzMFDXJlc2VydmVzSW5Vc2QJAM0IAggFBWFjY3VtAl80BQ9tYXJrZXRBc3NldEpzb24EDSR0MDI2NjcxMjY3NzkKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAAAAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKYXNzZXRzRm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwEC3N1cHBseUluVXNkCAUNJHQwMjY2NzEyNjc3OQJfMQQLYm9ycm93SW5Vc2QIBQ0kdDAyNjY3MTI2Nzc5Al8yBA1yZXNlcnZlc0luVXNkCAUNJHQwMjY2NzEyNjc3OQJfMwQQbWFya2V0QXNzZXRzSnNvbggFDSR0MDI2NjcxMjY3NzkCXzQECm1hcmtldEpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewILImFkZHJlc3MiOiIFCW1hcmtldFN0cgIBIgILLCJhc3NldHMiOlsJALsJAgUQbWFya2V0QXNzZXRzSnNvbgIBLAIBXQIBfQkAlgoECQBkAggFBWFjY3VtAl8xBQtzdXBwbHlJblVzZAkAZAIIBQVhY2N1bQJfMgULYm9ycm93SW5Vc2QJAGQCCAUFYWNjdW0CXzMFDXJlc2VydmVzSW5Vc2QJAM0IAggFBWFjY3VtAl80BQptYXJrZXRKc29uBA0kdDAyNzE3MDI3Mjg5CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAAAAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBC21hcmtldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQQdG90YWxTdXBwbHlJblVzZAgFDSR0MDI3MTcwMjcyODkCXzEEEHRvdGFsQm9ycm93SW5Vc2QIBQ0kdDAyNzE3MDI3Mjg5Al8yBBJ0b3RhbFJlc2VydmVzSW5Vc2QIBQ0kdDAyNzE3MDI3Mjg5Al8zBAttYXJrZXRzSnNvbggFDSR0MDI3MTcwMjcyODkCXzQEBGpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIOInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUQdG90YWxTdXBwbHlJblVzZAIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFEHRvdGFsQm9ycm93SW5Vc2QCESwicmVzZXJ2ZXNJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFEnRvdGFsUmVzZXJ2ZXNJblVzZAIMLCJtYXJrZXRzIjpbCQC7CQIFC21hcmtldHNKc29uAgEsAgFdAgF9AwUFZGVidWcJAAIBBQRqc29uBQRqc29uAQ1nZXRXYWxsZXRKc29uAwttYXJrZXRJbmRleAZ3YWxsZXQFZGVidWcECW1hcmtldFN0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgdtYXJrZXRfCQCkAwEFC21hcmtldEluZGV4BA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQltYXJrZXRTdHIECm1hcmtldE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIMbWFya2V0X25hbWVfBQltYXJrZXRTdHIEDG1hcmtldHNDb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQIHbWFya2V0cwoBC21hcmtldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFDG1hcmtldHNDb3VudAUFYWNjdW0EF2N1cnJlbnRNYXJrZXRBZGRyZXNzU3RyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICB21hcmtldF8JAKQDAQUEbmV4dAQRY3VycmVudE1hcmtldE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIMbWFya2V0X25hbWVfBRdjdXJyZW50TWFya2V0QWRkcmVzc1N0cgQUY3VycmVudE1hcmtldEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFF2N1cnJlbnRNYXJrZXRBZGRyZXNzU3RyBBJjdXJyZW50U2V0dXBUb2tlbnMJAQ5nZXRTZXR1cFRva2VucwEFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBBJjdXJyZW50QXNzZXRzQ291bnQJAJADAQUSY3VycmVudFNldHVwVG9rZW5zBBZjdXJyZW50TWFya2V0U2hvcnROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICEW1hcmtldF9zaG9ydG5hbWVfBRdjdXJyZW50TWFya2V0QWRkcmVzc1N0cgQHc2V0dXBDZgkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBRRjdXJyZW50TWFya2V0QWRkcmVzcwIKc2V0dXBfbHR2cwIBLAQHc2V0dXBMdAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBRRjdXJyZW50TWFya2V0QWRkcmVzcwIJc2V0dXBfbHRzAgEsBBVjdXJyZW50TGFzdFJhdGVIZWlnaHQJARFnZXRMYXN0UmF0ZUhlaWdodAEFFGN1cnJlbnRNYXJrZXRBZGRyZXNzCgEQbWFya2V0QXNzZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BRJjdXJyZW50QXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFEmN1cnJlbnRTZXR1cFRva2VucwUEbmV4dAQCY2YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cENmBQRuZXh0BAJsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwTHQFBG5leHQEBXByaWNlCQENZ2V0VG9rZW5QcmljZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECmFzc2V0U2NhbGUJAQ1nZXRBc3NldFNjYWxlAQUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbFN1cHBseQkBFmdldE91dGRhdGVkVG90YWxTdXBwbHkCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbEJvcnJvdwkBFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRTUmF0ZQkBEGdldE91dGRhdGVkU1JhdGUCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRCUmF0ZQkBEGdldE91dGRhdGVkQlJhdGUCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKb3V0ZGF0ZWRVcgkBDWdldE91dGRhdGVkVXIEBRNvdXRkYXRlZFRvdGFsU3VwcGx5BRNvdXRkYXRlZFRvdGFsQm9ycm93BQ1vdXRkYXRlZFNSYXRlBQ1vdXRkYXRlZEJSYXRlBARyYXRlCQEHZ2V0UmF0ZQMFCm91dGRhdGVkVXIFCmFzc2V0SWRTdHIFCW1hcmtldFN0cgQIaW50ZXJlc3QJAQtnZXRJbnRlcmVzdAEFBHJhdGUEBXNSYXRlCQEOZ2V0QWN0dWFsU1JhdGUEBRVjdXJyZW50TGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQpvdXRkYXRlZFVyBQ1vdXRkYXRlZFNSYXRlBAViUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUVY3VycmVudExhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUNb3V0ZGF0ZWRCUmF0ZQQGc3VwcGx5CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUFc1JhdGUEBmJvcnJvdwkBD2dldEFjdHVhbEFtb3VudAIFE291dGRhdGVkVG90YWxCb3Jyb3cFBWJSYXRlBAJ1cgkBC2dldEFjdHVhbFVyAgUGc3VwcGx5BQZib3Jyb3cECXN1cHBseUFweQkBDGdldFN1cHBseUFweQIFBHJhdGUFAnVyBAlib3Jyb3dBcHkJAQxnZXRCb3Jyb3dBcHkBBQRyYXRlBAx3YWxsZXRTdXBwbHkJAQ9nZXRXYWxsZXRTdXBwbHkEBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQVzUmF0ZQQRd2FsbGV0U3VwcGx5SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldFN1cHBseQUKYXNzZXRTY2FsZQUFcHJpY2UEDHdhbGxldEJvcnJvdwkBD2dldFdhbGxldEJvcnJvdwQFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBQZ3YWxsZXQFBWJSYXRlBBF3YWxsZXRCb3Jyb3dJblVzZAkBCGdldEluVXNkAwUMd2FsbGV0Qm9ycm93BQphc3NldFNjYWxlBQVwcmljZQQWd2FsbGV0Qm9ycm93TGltaXRJblVzZAkAawMFEXdhbGxldFN1cHBseUluVXNkBQJjZgUGU2NhbGU4BBZ3YWxsZXRCb3Jyb3dVc2FnZUluVXNkCQBrAwURd2FsbGV0Qm9ycm93SW5Vc2QFBlNjYWxlOAUCbHQEEXdhbGxldERhaWx5SW5jb21lCQEQZ2V0RGFpbHlQZXJjZW50cwIFCXN1cHBseUFweQUMd2FsbGV0U3VwcGx5BBZ3YWxsZXREYWlseUluY29tZUluVXNkCQEIZ2V0SW5Vc2QDBRF3YWxsZXREYWlseUluY29tZQUKYXNzZXRTY2FsZQUFcHJpY2UEF3dhbGxldERhaWx5TG9hbkludGVyZXN0CQEQZ2V0RGFpbHlQZXJjZW50cwIFCWJvcnJvd0FweQUMd2FsbGV0Qm9ycm93BBx3YWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkCQEIZ2V0SW5Vc2QDBRd3YWxsZXREYWlseUxvYW5JbnRlcmVzdAUKYXNzZXRTY2FsZQUFcHJpY2UEEXdhbGxldE1hcmdpbkluVXNkCQBlAgkAawMFEXdhbGxldFN1cHBseUluVXNkBQlzdXBwbHlBcHkFBlNjYWxlOAkAawMFEXdhbGxldEJvcnJvd0luVXNkBQlib3Jyb3dBcHkFBlNjYWxlOAkAmQoHCQBkAggFBWFjY3VtAl8xBRF3YWxsZXRTdXBwbHlJblVzZAkAZAIIBQVhY2N1bQJfMgURd2FsbGV0Qm9ycm93SW5Vc2QJAGQCCAUFYWNjdW0CXzMFFndhbGxldEJvcnJvd0xpbWl0SW5Vc2QJAGQCCAUFYWNjdW0CXzQFFndhbGxldEJvcnJvd1VzYWdlSW5Vc2QJAGQCCAUFYWNjdW0CXzUFFndhbGxldERhaWx5SW5jb21lSW5Vc2QJAGQCCAUFYWNjdW0CXzYFHHdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QJAGQCCAUFYWNjdW0CXzcFEXdhbGxldE1hcmdpbkluVXNkBA0kdDAzMjExMzMyNDY4CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAmQoHAAAAAAAAAAAAAAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEG1hcmtldEFzc2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBBZ0b3RhbFdhbGxldFN1cHBseUluVXNkCAUNJHQwMzIxMTMzMjQ2OAJfMQQWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAgFDSR0MDMyMTEzMzI0NjgCXzIEG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAgFDSR0MDMyMTEzMzI0NjgCXzMEG3RvdGFsV2FsbGV0Qm9ycm93VXNhZ2VJblVzZAgFDSR0MDMyMTEzMzI0NjgCXzQEG3RvdGFsV2FsbGV0RGFpbHlJbmNvbWVJblVzZAgFDSR0MDMyMTEzMzI0NjgCXzUEIXRvdGFsV2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAgFDSR0MDMyMTEzMzI0NjgCXzYEFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QIBQ0kdDAzMjExMzMyNDY4Al83BBd0b3RhbFdhbGxldEJhZERlYnRJblVzZAMJAGYCBRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkCQBlAgUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAAABA1hY2NvdW50SGVhbHRoCQEQZ2V0QWNjb3VudEhlYWx0aAIFG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAUbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkBAZuZXRBcHkJAQlnZXROZXRBcHkDBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkBRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkBRZ0b3RhbFdhbGxldE1hcmdpbkluVXNkBAttYXJrZXRzSnNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIIImluZGV4IjoJAKQDAQUEbmV4dAIJLCJuYW1lIjoiBRZjdXJyZW50TWFya2V0U2hvcnROYW1lAgEiAg8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QCESwiYWNjb3VudEhlYWx0aCI6CQEPYW1vdW50VG9EZWNpbWFsAgUNYWNjb3VudEhlYWx0aAAIAgF9CgEQd2FsbGV0QXNzZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BRJjdXJyZW50QXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFEmN1cnJlbnRTZXR1cFRva2VucwUEbmV4dAQFcHJpY2UJAQ1nZXRUb2tlblByaWNlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDWdldEFzc2V0U2NhbGUBBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsU3VwcGx5CQEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsQm9ycm93CQEWZ2V0T3V0ZGF0ZWRUb3RhbEJvcnJvdwIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZFNSYXRlCQEQZ2V0T3V0ZGF0ZWRTUmF0ZQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZEJSYXRlCQEQZ2V0T3V0ZGF0ZWRCUmF0ZQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBApvdXRkYXRlZFVyCQENZ2V0T3V0ZGF0ZWRVcgQFE291dGRhdGVkVG90YWxTdXBwbHkFE291dGRhdGVkVG90YWxCb3Jyb3cFDW91dGRhdGVkU1JhdGUFDW91dGRhdGVkQlJhdGUEBHJhdGUJAQdnZXRSYXRlAwUKb3V0ZGF0ZWRVcgUKYXNzZXRJZFN0cgUJbWFya2V0U3RyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFFWN1cnJlbnRMYXN0UmF0ZUhlaWdodAUIaW50ZXJlc3QFCm91dGRhdGVkVXIFDW91dGRhdGVkU1JhdGUEBWJSYXRlCQEOZ2V0QWN0dWFsQlJhdGUDBRVjdXJyZW50TGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAZzdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQGYm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUEAnVyCQELZ2V0QWN0dWFsVXICBQZzdXBwbHkFBmJvcnJvdwQJc3VwcGx5QXB5CQEMZ2V0U3VwcGx5QXB5AgUEcmF0ZQUCdXIECWJvcnJvd0FweQkBDGdldEJvcnJvd0FweQEFBHJhdGUEDHdhbGxldFN1cHBseQkBD2dldFdhbGxldFN1cHBseQQFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBQZ3YWxsZXQFBXNSYXRlBBF3YWxsZXRTdXBwbHlJblVzZAkBCGdldEluVXNkAwUMd2FsbGV0U3VwcGx5BQphc3NldFNjYWxlBQVwcmljZQQMd2FsbGV0Qm9ycm93CQEPZ2V0V2FsbGV0Qm9ycm93BAUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFYlJhdGUEEXdhbGxldEJvcnJvd0luVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRCb3Jyb3cFCmFzc2V0U2NhbGUFBXByaWNlBBF3YWxsZXREYWlseUluY29tZQkBEGdldERhaWx5UGVyY2VudHMCBQlzdXBwbHlBcHkFDHdhbGxldFN1cHBseQQWd2FsbGV0RGFpbHlJbmNvbWVJblVzZAkBCGdldEluVXNkAwURd2FsbGV0RGFpbHlJbmNvbWUFCmFzc2V0U2NhbGUFBXByaWNlBBd3YWxsZXREYWlseUxvYW5JbnRlcmVzdAkBEGdldERhaWx5UGVyY2VudHMCBQlib3Jyb3dBcHkFDHdhbGxldEJvcnJvdwQcd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAkBCGdldEluVXNkAwUXd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3QFCmFzc2V0U2NhbGUFBXByaWNlBBBzdXBwbHlBc3NldHNKc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCSJhbW91bnQiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUMd2FsbGV0U3VwcGx5Ag8sImFtb3VudEluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgURd2FsbGV0U3VwcGx5SW5Vc2QCCSwicHJpY2UiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQVwcmljZQIHLCJhcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFCXN1cHBseUFweQAIAhEsImRhaWx5UGVyY2VudHMiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgURd2FsbGV0RGFpbHlJbmNvbWUCFiwiZGFpbHlQZXJjZW50c0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWd2FsbGV0RGFpbHlJbmNvbWVJblVzZAIBfQQQYm9ycm93QXNzZXRzSnNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AgkiYW1vdW50IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFDHdhbGxldEJvcnJvdwIPLCJhbW91bnRJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFEXdhbGxldEJvcnJvd0luVXNkAgksInByaWNlIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUFcHJpY2UCBywiYXB5IjoJAQ9hbW91bnRUb0RlY2ltYWwCBQlib3Jyb3dBcHkACAIRLCJkYWlseVBlcmNlbnRzIjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFF3dhbGxldERhaWx5TG9hbkludGVyZXN0AhYsImRhaWx5UGVyY2VudHNJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFHHdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QCAX0JAJQKAgkAzQgCCAUFYWNjdW0CXzEFEHN1cHBseUFzc2V0c0pzb24JAM0IAggFBWFjY3VtAl8yBRBib3Jyb3dBc3NldHNKc29uBA0kdDAzNjg3MDM2OTU2CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQd2FsbGV0QXNzZXRzRm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwEEHN1cHBseUFzc2V0c0pzb24IBQ0kdDAzNjg3MDM2OTU2Al8xBBBib3Jyb3dBc3NldHNKc29uCAUNJHQwMzY4NzAzNjk1NgJfMgMJAAACBQttYXJrZXRJbmRleAUEbmV4dAkAoQoPCQBkAggFBWFjY3VtAl8xBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkCQBkAggFBWFjY3VtAl8zBRd0b3RhbFdhbGxldEJhZERlYnRJblVzZAkAZAIIBQVhY2N1bQJfNAUbdG90YWxXYWxsZXREYWlseUluY29tZUluVXNkCQBkAggFBWFjY3VtAl81BSF0b3RhbFdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QFF3RvdGFsV2FsbGV0QmFkRGVidEluVXNkBRt0b3RhbFdhbGxldERhaWx5SW5jb21lSW5Vc2QFIXRvdGFsV2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAUNYWNjb3VudEhlYWx0aAUGbmV0QXB5CQDNCAIIBQVhY2N1bQNfMTMFC21hcmtldHNKc29uBRBzdXBwbHlBc3NldHNKc29uBRBib3Jyb3dBc3NldHNKc29uCQChCg8JAGQCCAUFYWNjdW0CXzEFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QJAGQCCAUFYWNjdW0CXzIFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QJAGQCCAUFYWNjdW0CXzMFF3RvdGFsV2FsbGV0QmFkRGVidEluVXNkCQBkAggFBWFjY3VtAl80BRt0b3RhbFdhbGxldERhaWx5SW5jb21lSW5Vc2QJAGQCCAUFYWNjdW0CXzUFIXRvdGFsV2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAgFBWFjY3VtAl82CAUFYWNjdW0CXzcIBQVhY2N1bQJfOAgFBWFjY3VtAl85CAUFYWNjdW0DXzEwCAUFYWNjdW0DXzExCAUFYWNjdW0DXzEyCQDNCAIIBQVhY2N1bQNfMTMFC21hcmtldHNKc29uCAUFYWNjdW0DXzE0CAUFYWNjdW0DXzE1BA0kdDAzODQxMzM4ODk3CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAoQoPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQNuaWwFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQttYXJrZXRzRm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwEFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QIBQ0kdDAzODQxMzM4ODk3Al8xBBZ0b3RhbFdhbGxldEJvcnJvd0luVXNkCAUNJHQwMzg0MTMzODg5NwJfMgQXdG90YWxXYWxsZXRCYWREZWJ0SW5Vc2QIBQ0kdDAzODQxMzM4ODk3Al8zBBt0b3RhbFdhbGxldERhaWx5SW5jb21lSW5Vc2QIBQ0kdDAzODQxMzM4ODk3Al80BCF0b3RhbFdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QIBQ0kdDAzODQxMzM4ODk3Al81BBF3YWxsZXRTdXBwbHlJblVzZAgFDSR0MDM4NDEzMzg4OTcCXzYEEXdhbGxldEJvcnJvd0luVXNkCAUNJHQwMzg0MTMzODg5NwJfNwQSd2FsbGV0QmFkRGVidEluVXNkCAUNJHQwMzg0MTMzODg5NwJfOAQWd2FsbGV0RGFpbHlJbmNvbWVJblVzZAgFDSR0MDM4NDEzMzg4OTcCXzkEHHdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QIBQ0kdDAzODQxMzM4ODk3A18xMAQTd2FsbGV0QWNjb3VudEhlYWx0aAgFDSR0MDM4NDEzMzg4OTcDXzExBAx3YWxsZXROZXRBcHkIBQ0kdDAzODQxMzM4ODk3A18xMgQLbWFya2V0c0pzb24IBQ0kdDAzODQxMzM4ODk3A18xMwQQc3VwcGx5QXNzZXRzSnNvbggFDSR0MDM4NDEzMzg4OTcDXzE0BBBib3Jyb3dBc3NldHNKc29uCAUNJHQwMzg0MTMzODg5NwNfMTUEBGpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCDiJtYXJrZXRJbmRleCI6CQCkAwEFC21hcmtldEluZGV4AgksIm5hbWUiOiIFCm1hcmtldE5hbWUCASICFCwidG90YWxTdXBwbHlJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QCFCwidG90YWxCb3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QCFSwidG90YWxCYWREZWJ0SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRd0b3RhbFdhbGxldEJhZERlYnRJblVzZAIZLCJ0b3RhbERhaWx5SW5jb21lSW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRt0b3RhbFdhbGxldERhaWx5SW5jb21lSW5Vc2QCHywidG90YWxEYWlseUxvYW5JbnRlcmVzdEluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUhdG90YWxXYWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkAg8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgURd2FsbGV0U3VwcGx5SW5Vc2QCDywiYm9ycm93SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRF3YWxsZXRCb3Jyb3dJblVzZAIQLCJiYWREZWJ0SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRJ3YWxsZXRCYWREZWJ0SW5Vc2QCFCwiZGFpbHlJbmNvbWVJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFndhbGxldERhaWx5SW5jb21lSW5Vc2QCGiwiZGFpbHlMb2FuSW50ZXJlc3RJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFHHdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QCESwiYWNjb3VudEhlYWx0aCI6CQEPYW1vdW50VG9EZWNpbWFsAgUTd2FsbGV0QWNjb3VudEhlYWx0aAAIAgosIm5ldEFweSI6CQEPYW1vdW50VG9EZWNpbWFsAgUMd2FsbGV0TmV0QXB5AAgCESwic3VwcGx5QXNzZXRzIjpbCQC7CQIFEHN1cHBseUFzc2V0c0pzb24CASwCAV0CESwiYm9ycm93QXNzZXRzIjpbCQC7CQIFEGJvcnJvd0Fzc2V0c0pzb24CASwCAV0CDCwibWFya2V0cyI6WwkAuwkCBQttYXJrZXRzSnNvbgIBLAIBXQIBfQMFBWRlYnVnCQACAQUEanNvbgUEanNvbgEXZ2V0V2FsbGV0T3BlcmF0aW9uc0pzb24EC21hcmtldEluZGV4CmFzc2V0SWRTdHIGd2FsbGV0BWRlYnVnBAltYXJrZXRTdHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIHbWFya2V0XwkApAMBBQttYXJrZXRJbmRleAQNbWFya2V0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbWFya2V0U3RyBAptYXJrZXROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICDG1hcmtldF9uYW1lXwUJbWFya2V0U3RyBAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUNbWFya2V0QWRkcmVzcwIMc2V0dXBfYWN0aXZlBgQLc2V0dXBUb2tlbnMJAQ5nZXRTZXR1cFRva2VucwEFDW1hcmtldEFkZHJlc3MEB3NldHVwQ2YJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIKc2V0dXBfbHR2cwIBLAQHc2V0dXBMdAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAglzZXR1cF9sdHMCASwEDHNldHVwUGVuYWx0eQkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAg9zZXR1cF9wZW5hbHRpZXMCASwECmFzc2V0SW5kZXgJAQ1nZXRBc3NldEluZGV4AgULc2V0dXBUb2tlbnMFCmFzc2V0SWRTdHIEAmNmCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBDZgUKYXNzZXRJbmRleAQCbHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cEx0BQphc3NldEluZGV4BAdwZW5hbHR5CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMc2V0dXBQZW5hbHR5BQphc3NldEluZGV4BAthc3NldHNDb3VudAkAkAMBBQtzZXR1cFRva2VucwQObGFzdFJhdGVIZWlnaHQJARFnZXRMYXN0UmF0ZUhlaWdodAEFDW1hcmtldEFkZHJlc3MEBXByaWNlCQENZ2V0VG9rZW5QcmljZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECmFzc2V0U2NhbGUJAQ1nZXRBc3NldFNjYWxlAQUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbFN1cHBseQkBFmdldE91dGRhdGVkVG90YWxTdXBwbHkCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsQm9ycm93CQEWZ2V0T3V0ZGF0ZWRUb3RhbEJvcnJvdwIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkU1JhdGUJARBnZXRPdXRkYXRlZFNSYXRlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRCUmF0ZQkBEGdldE91dGRhdGVkQlJhdGUCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBApvdXRkYXRlZFVyCQENZ2V0T3V0ZGF0ZWRVcgQFE291dGRhdGVkVG90YWxTdXBwbHkFE291dGRhdGVkVG90YWxCb3Jyb3cFDW91dGRhdGVkU1JhdGUFDW91dGRhdGVkQlJhdGUEBHJhdGUJAQdnZXRSYXRlAwUKb3V0ZGF0ZWRVcgUKYXNzZXRJZFN0cgUJbWFya2V0U3RyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUKb3V0ZGF0ZWRVcgUNb3V0ZGF0ZWRTUmF0ZQQFYlJhdGUJAQ5nZXRBY3R1YWxCUmF0ZQMFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUNb3V0ZGF0ZWRCUmF0ZQQGc3VwcGx5CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUFc1JhdGUEBmJvcnJvdwkBD2dldEFjdHVhbEFtb3VudAIFE291dGRhdGVkVG90YWxCb3Jyb3cFBWJSYXRlBAtzdXBwbHlJblVzZAkBCGdldEluVXNkAwUGc3VwcGx5BQphc3NldFNjYWxlBQVwcmljZQQLYm9ycm93SW5Vc2QJAQhnZXRJblVzZAMFBmJvcnJvdwUKYXNzZXRTY2FsZQUFcHJpY2UECHJlc2VydmVzCQBlAgUGc3VwcGx5BQZib3Jyb3cEDXJlc2VydmVzSW5Vc2QJAQhnZXRJblVzZAMFCHJlc2VydmVzBQphc3NldFNjYWxlBQVwcmljZQQCdXIJAQtnZXRBY3R1YWxVcgIFBnN1cHBseQUGYm9ycm93BAlzdXBwbHlBcHkJAQxnZXRTdXBwbHlBcHkCBQRyYXRlBQJ1cgQJYm9ycm93QXB5CQEMZ2V0Qm9ycm93QXB5AQUEcmF0ZQQJbWF4U3VwcGx5CQEMZ2V0TWF4U3VwcGx5AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQMd2FsbGV0U3VwcGx5CQEPZ2V0V2FsbGV0U3VwcGx5BAUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQVzUmF0ZQQRd2FsbGV0U3VwcGx5SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldFN1cHBseQUKYXNzZXRTY2FsZQUFcHJpY2UEEXdhbGxldERhaWx5SW5jb21lCQEQZ2V0RGFpbHlQZXJjZW50cwIFCXN1cHBseUFweQUMd2FsbGV0U3VwcGx5BBZ3YWxsZXREYWlseUluY29tZUluVXNkCQEIZ2V0SW5Vc2QDBRF3YWxsZXREYWlseUluY29tZQUKYXNzZXRTY2FsZQUFcHJpY2UEDHdhbGxldEJvcnJvdwkBD2dldFdhbGxldEJvcnJvdwQFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFYlJhdGUEEXdhbGxldEJvcnJvd0luVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRCb3Jyb3cFCmFzc2V0U2NhbGUFBXByaWNlBBd3YWxsZXREYWlseUxvYW5QZXJjZW50cwkBEGdldERhaWx5UGVyY2VudHMCBQlib3Jyb3dBcHkFDHdhbGxldEJvcnJvdwQcd2FsbGV0RGFpbHlMb2FuUGVyY2VudHNJblVzZAkBCGdldEluVXNkAwUXd2FsbGV0RGFpbHlMb2FuUGVyY2VudHMFCmFzc2V0U2NhbGUFBXByaWNlCgEKYXNzZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQthc3NldHNDb3VudAUFYWNjdW0EEWN1cnJlbnRBc3NldElkU3RyCQCRAwIFC3NldHVwVG9rZW5zBQRuZXh0BAljdXJyZW50Q2YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cENmBQRuZXh0BAljdXJyZW50THQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cEx0BQRuZXh0BAxjdXJyZW50UHJpY2UJAQ1nZXRUb2tlblByaWNlAgUNbWFya2V0QWRkcmVzcwURY3VycmVudEFzc2V0SWRTdHIEEWN1cnJlbnRBc3NldFNjYWxlCQENZ2V0QXNzZXRTY2FsZQEFEWN1cnJlbnRBc3NldElkU3RyBBpjdXJyZW50T3V0ZGF0ZWRUb3RhbFN1cHBseQkBFmdldE91dGRhdGVkVG90YWxTdXBwbHkCBQ1tYXJrZXRBZGRyZXNzBRFjdXJyZW50QXNzZXRJZFN0cgQaY3VycmVudE91dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUNbWFya2V0QWRkcmVzcwURY3VycmVudEFzc2V0SWRTdHIEFGN1cnJlbnRPdXRkYXRlZFNSYXRlCQEQZ2V0T3V0ZGF0ZWRTUmF0ZQIFDW1hcmtldEFkZHJlc3MFEWN1cnJlbnRBc3NldElkU3RyBBRjdXJyZW50T3V0ZGF0ZWRCUmF0ZQkBEGdldE91dGRhdGVkQlJhdGUCBQ1tYXJrZXRBZGRyZXNzBRFjdXJyZW50QXNzZXRJZFN0cgQRY3VycmVudE91dGRhdGVkVXIJAQ1nZXRPdXRkYXRlZFVyBAUaY3VycmVudE91dGRhdGVkVG90YWxTdXBwbHkFGmN1cnJlbnRPdXRkYXRlZFRvdGFsQm9ycm93BRRjdXJyZW50T3V0ZGF0ZWRTUmF0ZQUUY3VycmVudE91dGRhdGVkQlJhdGUEC2N1cnJlbnRSYXRlCQEHZ2V0UmF0ZQMFEWN1cnJlbnRPdXRkYXRlZFVyBRFjdXJyZW50QXNzZXRJZFN0cgUJbWFya2V0U3RyBA9jdXJyZW50SW50ZXJlc3QJAQtnZXRJbnRlcmVzdAEFC2N1cnJlbnRSYXRlBAxjdXJyZW50U1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFDmxhc3RSYXRlSGVpZ2h0BQ9jdXJyZW50SW50ZXJlc3QFEWN1cnJlbnRPdXRkYXRlZFVyBRRjdXJyZW50T3V0ZGF0ZWRTUmF0ZQQMY3VycmVudEJSYXRlCQEOZ2V0QWN0dWFsQlJhdGUDBQ5sYXN0UmF0ZUhlaWdodAUPY3VycmVudEludGVyZXN0BRRjdXJyZW50T3V0ZGF0ZWRCUmF0ZQQNY3VycmVudFN1cHBseQkBD2dldEFjdHVhbEFtb3VudAIFGmN1cnJlbnRPdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQNY3VycmVudEJvcnJvdwkBD2dldEFjdHVhbEFtb3VudAIFGmN1cnJlbnRPdXRkYXRlZFRvdGFsQm9ycm93BQViUmF0ZQQJY3VycmVudFVyCQELZ2V0QWN0dWFsVXICBQ1jdXJyZW50U3VwcGx5BQ1jdXJyZW50Qm9ycm93BBBjdXJyZW50U3VwcGx5QXB5CQEMZ2V0U3VwcGx5QXB5AgULY3VycmVudFJhdGUFCWN1cnJlbnRVcgQQY3VycmVudEJvcnJvd0FweQkBDGdldEJvcnJvd0FweQEFC2N1cnJlbnRSYXRlBBNjdXJyZW50V2FsbGV0U3VwcGx5CQEPZ2V0V2FsbGV0U3VwcGx5BAUNbWFya2V0QWRkcmVzcwURY3VycmVudEFzc2V0SWRTdHIFBndhbGxldAUMY3VycmVudFNSYXRlBBhjdXJyZW50V2FsbGV0U3VwcGx5SW5Vc2QJAQhnZXRJblVzZAMFE2N1cnJlbnRXYWxsZXRTdXBwbHkFEWN1cnJlbnRBc3NldFNjYWxlBQxjdXJyZW50UHJpY2UEE2N1cnJlbnRXYWxsZXRCb3Jyb3cJAQ9nZXRXYWxsZXRCb3Jyb3cEBQ1tYXJrZXRBZGRyZXNzBRFjdXJyZW50QXNzZXRJZFN0cgUGd2FsbGV0BQxjdXJyZW50QlJhdGUEGGN1cnJlbnRXYWxsZXRCb3Jyb3dJblVzZAkBCGdldEluVXNkAwUTY3VycmVudFdhbGxldEJvcnJvdwURY3VycmVudEFzc2V0U2NhbGUFDGN1cnJlbnRQcmljZQQdY3VycmVudFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QJAGsDBRhjdXJyZW50V2FsbGV0U3VwcGx5SW5Vc2QFCWN1cnJlbnRDZgUGU2NhbGU4BB1jdXJyZW50V2FsbGV0Qm9ycm93VXNhZ2VJblVzZAkAawMFGGN1cnJlbnRXYWxsZXRCb3Jyb3dJblVzZAUGU2NhbGU4BQljdXJyZW50THQEEXdhbGxldE1hcmdpbkluVXNkCQBlAgkAawMFGGN1cnJlbnRXYWxsZXRTdXBwbHlJblVzZAUQY3VycmVudFN1cHBseUFweQUGU2NhbGU4CQBrAwUYY3VycmVudFdhbGxldEJvcnJvd0luVXNkBRBjdXJyZW50Qm9ycm93QXB5BQZTY2FsZTgJAJcKBQkAZAIIBQVhY2N1bQJfMQUYY3VycmVudFdhbGxldFN1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBRhjdXJyZW50V2FsbGV0Qm9ycm93SW5Vc2QJAGQCCAUFYWNjdW0CXzMFHWN1cnJlbnRXYWxsZXRCb3Jyb3dMaW1pdEluVXNkCQBkAggFBWFjY3VtAl80BR1jdXJyZW50V2FsbGV0Qm9ycm93VXNhZ2VJblVzZAkAZAIIBQVhY2N1bQJfNQURd2FsbGV0TWFyZ2luSW5Vc2QEDSR0MDQ1ODk5NDYwODAKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUAAAAAAAAAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQphc3NldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQWdG90YWxXYWxsZXRTdXBwbHlJblVzZAgFDSR0MDQ1ODk5NDYwODACXzEEFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QIBQ0kdDA0NTg5OTQ2MDgwAl8yBBt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QIBQ0kdDA0NTg5OTQ2MDgwAl8zBBt0b3RhbFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QIBQ0kdDA0NTg5OTQ2MDgwAl80BBZ0b3RhbFdhbGxldE1hcmdpbkluVXNkCAUNJHQwNDU4OTk0NjA4MAJfNQQNYWNjb3VudEhlYWx0aAkBEGdldEFjY291bnRIZWFsdGgCBRt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QFG3RvdGFsV2FsbGV0Qm9ycm93VXNhZ2VJblVzZAQGbmV0QXB5CQEJZ2V0TmV0QXB5AwUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAUWdG90YWxXYWxsZXRNYXJnaW5JblVzZAQEanNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIOIm1hcmtldEluZGV4IjoJAKQDAQULbWFya2V0SW5kZXgCDywibWFya2V0TmFtZSI6IgUKbWFya2V0TmFtZQIBIgIMLCJhZGRyZXNzIjoiBQltYXJrZXRTdHICASICDiwiYXNzZXRQcmljZSI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFBXByaWNlAgosInN1cHBseSI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyBQZzdXBwbHkCDywic3VwcGx5SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQtzdXBwbHlJblVzZAINLCJzdXBwbHlBcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFCXN1cHBseUFweQAIAgosImJvcnJvdyI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyBQZib3Jyb3cCDywiYm9ycm93SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQtib3Jyb3dJblVzZAINLCJib3Jyb3dBcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFCWJvcnJvd0FweQAIAgwsInJlc2VydmVzIjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFCHJlc2VydmVzAhEsInJlc2VydmVzSW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQ1yZXNlcnZlc0luVXNkAhQsInV0aWxpemF0aW9uUmF0aW8iOgkBD2Ftb3VudFRvRGVjaW1hbAIFAnVyAAgCFCwiY29sbGF0ZXJhbEZhY3RvciI6CQEPYW1vdW50VG9EZWNpbWFsAgUCY2YACAIYLCJsaXF1aWRhdGlvblRocmVzaG9sZCI6CQEPYW1vdW50VG9EZWNpbWFsAgUCbHQACAIWLCJsaXF1aWRhdGlvblBlbmFsdHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFB3BlbmFsdHkACAINLCJtYXhTdXBwbHkiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQltYXhTdXBwbHkCECwid2FsbGV0U3VwcGx5IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFDHdhbGxldFN1cHBseQIVLCJ3YWxsZXRTdXBwbHlJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFEXdhbGxldFN1cHBseUluVXNkAhUsIndhbGxldERhaWx5SW5jb21lIjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFEXdhbGxldERhaWx5SW5jb21lAhosIndhbGxldERhaWx5SW5jb21lSW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRZ3YWxsZXREYWlseUluY29tZUluVXNkAhAsIndhbGxldEJvcnJvdyI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyBQx3YWxsZXRCb3Jyb3cCFSwid2FsbGV0Qm9ycm93SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRF3YWxsZXRCb3Jyb3dJblVzZAIbLCJ3YWxsZXREYWlseUxvYW5JbnRlcmVzdCI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyBRd3YWxsZXREYWlseUxvYW5QZXJjZW50cwIgLCJ3YWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUcd2FsbGV0RGFpbHlMb2FuUGVyY2VudHNJblVzZAIRLCJhY2NvdW50SGVhbHRoIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQ1hY2NvdW50SGVhbHRoAAgCCiwibmV0QXB5IjoJAQ9hbW91bnRUb0RlY2ltYWwCBQZuZXRBcHkACAIBfQMFBWRlYnVnCQACAQUEanNvbgUEanNvbgEXZ2V0TWFya2V0UGFyYW1ldGVyc0pzb24CC21hcmtldEluZGV4BWRlYnVnBAltYXJrZXRTdHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIHbWFya2V0XwkApAMBBQttYXJrZXRJbmRleAQNbWFya2V0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbWFya2V0U3RyBAptYXJrZXROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICDG1hcmtldF9uYW1lXwUJbWFya2V0U3RyBAtzZXR1cFRva2VucwkBDmdldFNldHVwVG9rZW5zAQUNbWFya2V0QWRkcmVzcwQHc2V0dXBDZgkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAgpzZXR1cF9sdHZzAgEsBAdzZXR1cEx0CQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCCXNldHVwX2x0cwIBLAQMc2V0dXBQZW5hbHR5CQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCD3NldHVwX3BlbmFsdGllcwIBLAQLYXNzZXRzQ291bnQJAJADAQULc2V0dXBUb2tlbnMKAQphc3NldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFC2Fzc2V0c0NvdW50BQVhY2N1bQQKYXNzZXRJZFN0cgkAkQMCBQtzZXR1cFRva2VucwUEbmV4dAQJbWF4U3VwcGx5CQEMZ2V0TWF4U3VwcGx5AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQCY2YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cENmBQRuZXh0BAJsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwTHQFBG5leHQEB3BlbmFsdHkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQxzZXR1cFBlbmFsdHkFBG5leHQEBGpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AggiYXNzZXQiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgAAAg0sIm1heFN1cHBseSI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFCW1heFN1cHBseQIULCJjb2xsYXRlcmFsRmFjdG9yIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQJjZgAIAhgsImxpcXVpZGF0aW9uVGhyZXNob2xkIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQJsdAAIAhYsImxpcXVpZGF0aW9uUGVuYWx0eSI6CQEPYW1vdW50VG9EZWNpbWFsAgUHcGVuYWx0eQAIAgF9CQDNCAIFBWFjY3VtBQRqc29uBAphc3NldHNKc29uCgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQphc3NldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQEanNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AggibmFtZSI6IgUKbWFya2V0TmFtZQIBIgILLCJhc3NldHMiOlsJALsJAgUKYXNzZXRzSnNvbgIBLAIBXQIBfQMFBWRlYnVnCQACAQUEanNvbgUEanNvbgAArsFL6A==", "height": 3982638, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3W85SB1sbD9pkKjuknjtnj3ipsicGGo1psWd6DW8bZko Next: 46WCUsxY7VmzqMVhosH867sMxK7cj8PfsFcyrK9vVE3E Diff:
OldNewDifferences
2626 let arr12 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
2727
2828 let usdtIdStr = "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"
29+
30+let usdcIdStr = "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"
31+
32+let romeIdStr = "AP4Cb5xLYGH6ZigHreCZHoXpQTWDkPsG2BHqfDUx6taJ"
2933
3034 let oracleAddressStr = "3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t"
3135
203207 func getTokenPrice (marketAddress,assetIdStr) = {
204208 let oracleStr = valueOrElse(getString(marketAddress, "oracle"), oracleAddressStr)
205209 let oracleAddress = addressFromStringValue(oracleStr)
206- let stables = split(valueOrElse(getString(marketAddress, "setup_stablesIds"), "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi,HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW,AP4Cb5xLYGH6ZigHreCZHoXpQTWDkPsG2BHqfDUx6taJ"), ",")
210+ let stables = split(valueOrElse(getString(marketAddress, "setup_stablesIds"), "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi,HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"), ",")
207211 if ((indexOf(stables, assetIdStr) != unit))
208212 then 1000000
209- else if (containsElement(axlyLPs, assetIdStr))
210- then {
211- let @ = invoke(axlyAddress, "getShareAssetPriceREADONLY", [assetIdStr], nil)
212- if ($isInstanceOf(@, "Int"))
213- then @
214- else throw(($getType(@) + " couldn't be cast to Int"))
215- }
216- else {
217- let price = getIntegerValue(oracleAddress, (assetIdStr + "_twap5B"))
218- price
219- }
213+ else if (if (if ((assetIdStr == usdtIdStr))
214+ then true
215+ else (assetIdStr == usdcIdStr))
216+ then true
217+ else (assetIdStr == romeIdStr))
218+ then 1000000
219+ else if (containsElement(axlyLPs, assetIdStr))
220+ then {
221+ let @ = invoke(axlyAddress, "getShareAssetPriceREADONLY", [assetIdStr], nil)
222+ if ($isInstanceOf(@, "Int"))
223+ then @
224+ else throw(($getType(@) + " couldn't be cast to Int"))
225+ }
226+ else {
227+ let price = getIntegerValue(oracleAddress, (assetIdStr + "_twap5B"))
228+ price
229+ }
220230 }
221231
222232
355365
356366
357367 func assetToJson (assetIdStr,quantity) = {
358- let $t01510415299 = if ((assetIdStr == Waves))
368+ let $t01529015485 = if ((assetIdStr == Waves))
359369 then $Tuple2(8, "WAVES")
360370 else {
361371 let asset = value(assetInfo(fromBase58String(assetIdStr)))
362372 $Tuple2(asset.decimals, asset.name)
363373 }
364- let decimals = $t01510415299._1
365- let name = $t01510415299._2
374+ let decimals = $t01529015485._1
375+ let name = $t01529015485._2
366376 (((((((("{\"quantity\":" + toString(quantity)) + ",\"decimals\":") + toString(decimals)) + ",\"name\":\"") + name) + "\",\"id\":\"") + assetIdStr) + "\"}")
367377 }
368378
406416 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson))
407417 }
408418
409- let $t01871218820 = {
419+ let $t01889819006 = {
410420 let $l = arr12
411421 let $s = size($l)
412422 let $acc0 = $Tuple4(0, 0, 0, nil)
420430
421431 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
422432 }
423- let supplyInUsd = $t01871218820._1
424- let borrowInUsd = $t01871218820._2
425- let reservesInUsd = $t01871218820._3
426- let marketAssetsJson = $t01871218820._4
433+ let supplyInUsd = $t01889819006._1
434+ let borrowInUsd = $t01889819006._2
435+ let reservesInUsd = $t01889819006._3
436+ let marketAssetsJson = $t01889819006._4
427437 let marketsCount = getIntegerValue("markets")
428438 func marketsFold (accum,next) = if ((next >= marketsCount))
429439 then accum
467477 $Tuple4((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd))
468478 }
469479
470- let $t02239122551 = {
480+ let $t02257722737 = {
471481 let $l = arr12
472482 let $s = size($l)
473483 let $acc0 = $Tuple4(0, 0, 0, 0)
481491
482492 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
483493 }
484- let totalWalletSupplyInUsd = $t02239122551._1
485- let totalWalletBorrowInUsd = $t02239122551._2
486- let totalWalletBorrowLimitInUsd = $t02239122551._3
487- let totalWalletBorrowUsageInUsd = $t02239122551._4
494+ let totalWalletSupplyInUsd = $t02257722737._1
495+ let totalWalletBorrowInUsd = $t02257722737._2
496+ let totalWalletBorrowLimitInUsd = $t02257722737._3
497+ let totalWalletBorrowUsageInUsd = $t02257722737._4
488498 let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
489499 let fullJson = (((((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + "}")
490500 (accum :+ fullJson)
547557 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson))
548558 }
549559
550- let $t02648526593 = {
560+ let $t02667126779 = {
551561 let $l = arr12
552562 let $s = size($l)
553563 let $acc0 = $Tuple4(0, 0, 0, nil)
561571
562572 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
563573 }
564- let supplyInUsd = $t02648526593._1
565- let borrowInUsd = $t02648526593._2
566- let reservesInUsd = $t02648526593._3
567- let marketAssetsJson = $t02648526593._4
574+ let supplyInUsd = $t02667126779._1
575+ let borrowInUsd = $t02667126779._2
576+ let reservesInUsd = $t02667126779._3
577+ let marketAssetsJson = $t02667126779._4
568578 let marketJson = ((((((("{" + "\"address\":\"") + marketStr) + "\"") + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + "}")
569579 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketJson))
570580 }
571581
572- let $t02698427103 = {
582+ let $t02717027289 = {
573583 let $l = arr12
574584 let $s = size($l)
575585 let $acc0 = $Tuple4(0, 0, 0, nil)
583593
584594 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
585595 }
586- let totalSupplyInUsd = $t02698427103._1
587- let totalBorrowInUsd = $t02698427103._2
588- let totalReservesInUsd = $t02698427103._3
589- let marketsJson = $t02698427103._4
596+ let totalSupplyInUsd = $t02717027289._1
597+ let totalBorrowInUsd = $t02717027289._2
598+ let totalReservesInUsd = $t02717027289._3
599+ let marketsJson = $t02717027289._4
590600 let json = (((((((((("{" + "\"supplyInUsd\":") + assetToJson(usdtIdStr, totalSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalBorrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, totalReservesInUsd)) + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
591601 if (debug)
592602 then throw(json)
647657 $Tuple7((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd), (accum._5 + walletDailyIncomeInUsd), (accum._6 + walletDailyLoanInterestInUsd), (accum._7 + walletMarginInUsd))
648658 }
649659
650- let $t03192732282 = {
660+ let $t03211332468 = {
651661 let $l = arr12
652662 let $s = size($l)
653663 let $acc0 = $Tuple7(0, 0, 0, 0, 0, 0, 0)
661671
662672 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
663673 }
664- let totalWalletSupplyInUsd = $t03192732282._1
665- let totalWalletBorrowInUsd = $t03192732282._2
666- let totalWalletBorrowLimitInUsd = $t03192732282._3
667- let totalWalletBorrowUsageInUsd = $t03192732282._4
668- let totalWalletDailyIncomeInUsd = $t03192732282._5
669- let totalWalletDailyLoanInterestInUsd = $t03192732282._6
670- let totalWalletMarginInUsd = $t03192732282._7
674+ let totalWalletSupplyInUsd = $t03211332468._1
675+ let totalWalletBorrowInUsd = $t03211332468._2
676+ let totalWalletBorrowLimitInUsd = $t03211332468._3
677+ let totalWalletBorrowUsageInUsd = $t03211332468._4
678+ let totalWalletDailyIncomeInUsd = $t03211332468._5
679+ let totalWalletDailyLoanInterestInUsd = $t03211332468._6
680+ let totalWalletMarginInUsd = $t03211332468._7
671681 let totalWalletBadDebtInUsd = if ((totalWalletBorrowInUsd > totalWalletSupplyInUsd))
672682 then (totalWalletBorrowInUsd - totalWalletSupplyInUsd)
673683 else 0
707717 $Tuple2((accum._1 :+ supplyAssetsJson), (accum._2 :+ borrowAssetsJson))
708718 }
709719
710- let $t03668436770 = {
720+ let $t03687036956 = {
711721 let $l = arr12
712722 let $s = size($l)
713723 let $acc0 = $Tuple2(nil, nil)
721731
722732 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
723733 }
724- let supplyAssetsJson = $t03668436770._1
725- let borrowAssetsJson = $t03668436770._2
734+ let supplyAssetsJson = $t03687036956._1
735+ let borrowAssetsJson = $t03687036956._2
726736 if ((marketIndex == next))
727737 then $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletBadDebtInUsd, totalWalletDailyIncomeInUsd, totalWalletDailyLoanInterestInUsd, accountHealth, netApy, (accum._13 :+ marketsJson), supplyAssetsJson, borrowAssetsJson)
728738 else $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), accum._6, accum._7, accum._8, accum._9, accum._10, accum._11, accum._12, (accum._13 :+ marketsJson), accum._14, accum._15)
729739 }
730740
731- let $t03822738711 = {
741+ let $t03841338897 = {
732742 let $l = arr12
733743 let $s = size($l)
734744 let $acc0 = $Tuple15(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nil, nil, nil)
742752
743753 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
744754 }
745- let totalWalletSupplyInUsd = $t03822738711._1
746- let totalWalletBorrowInUsd = $t03822738711._2
747- let totalWalletBadDebtInUsd = $t03822738711._3
748- let totalWalletDailyIncomeInUsd = $t03822738711._4
749- let totalWalletDailyLoanInterestInUsd = $t03822738711._5
750- let walletSupplyInUsd = $t03822738711._6
751- let walletBorrowInUsd = $t03822738711._7
752- let walletBadDebtInUsd = $t03822738711._8
753- let walletDailyIncomeInUsd = $t03822738711._9
754- let walletDailyLoanInterestInUsd = $t03822738711._10
755- let walletAccountHealth = $t03822738711._11
756- let walletNetApy = $t03822738711._12
757- let marketsJson = $t03822738711._13
758- let supplyAssetsJson = $t03822738711._14
759- let borrowAssetsJson = $t03822738711._15
755+ let totalWalletSupplyInUsd = $t03841338897._1
756+ let totalWalletBorrowInUsd = $t03841338897._2
757+ let totalWalletBadDebtInUsd = $t03841338897._3
758+ let totalWalletDailyIncomeInUsd = $t03841338897._4
759+ let totalWalletDailyLoanInterestInUsd = $t03841338897._5
760+ let walletSupplyInUsd = $t03841338897._6
761+ let walletBorrowInUsd = $t03841338897._7
762+ let walletBadDebtInUsd = $t03841338897._8
763+ let walletDailyIncomeInUsd = $t03841338897._9
764+ let walletDailyLoanInterestInUsd = $t03841338897._10
765+ let walletAccountHealth = $t03841338897._11
766+ let walletNetApy = $t03841338897._12
767+ let marketsJson = $t03841338897._13
768+ let supplyAssetsJson = $t03841338897._14
769+ let borrowAssetsJson = $t03841338897._15
760770 let json = ((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"name\":\"") + marketName) + "\"") + ",\"totalSupplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"totalBorrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"totalBadDebtInUsd\":") + assetToJson(usdtIdStr, totalWalletBadDebtInUsd)) + ",\"totalDailyIncomeInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyIncomeInUsd)) + ",\"totalDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyLoanInterestInUsd)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"badDebtInUsd\":") + assetToJson(usdtIdStr, walletBadDebtInUsd)) + ",\"dailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"dailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanInterestInUsd)) + ",\"accountHealth\":") + amountToDecimal(walletAccountHealth, 8)) + ",\"netApy\":") + amountToDecimal(walletNetApy, 8)) + ",\"supplyAssets\":[") + makeString_11C(supplyAssetsJson, ",")) + "]") + ",\"borrowAssets\":[") + makeString_11C(borrowAssetsJson, ",")) + "]") + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
761771 if (debug)
762772 then throw(json)
840850 $Tuple5((accum._1 + currentWalletSupplyInUsd), (accum._2 + currentWalletBorrowInUsd), (accum._3 + currentWalletBorrowLimitInUsd), (accum._4 + currentWalletBorrowUsageInUsd), (accum._5 + walletMarginInUsd))
841851 }
842852
843- let $t04571345894 = {
853+ let $t04589946080 = {
844854 let $l = arr12
845855 let $s = size($l)
846856 let $acc0 = $Tuple5(0, 0, 0, 0, 0)
854864
855865 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
856866 }
857- let totalWalletSupplyInUsd = $t04571345894._1
858- let totalWalletBorrowInUsd = $t04571345894._2
859- let totalWalletBorrowLimitInUsd = $t04571345894._3
860- let totalWalletBorrowUsageInUsd = $t04571345894._4
861- let totalWalletMarginInUsd = $t04571345894._5
867+ let totalWalletSupplyInUsd = $t04589946080._1
868+ let totalWalletBorrowInUsd = $t04589946080._2
869+ let totalWalletBorrowLimitInUsd = $t04589946080._3
870+ let totalWalletBorrowUsageInUsd = $t04589946080._4
871+ let totalWalletMarginInUsd = $t04589946080._5
862872 let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
863873 let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd)
864874 let json = ((((((((((((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"marketName\":\"") + marketName) + "\"") + ",\"address\":\"") + marketStr) + "\"") + ",\"assetPrice\":") + assetToJson(usdtIdStr, price)) + ",\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, 8)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, 8)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"utilizationRatio\":") + amountToDecimal(ur, 8)) + ",\"collateralFactor\":") + amountToDecimal(cf, 8)) + ",\"liquidationThreshold\":") + amountToDecimal(lt, 8)) + ",\"liquidationPenalty\":") + amountToDecimal(penalty, 8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"walletSupply\":") + assetToJson(assetIdStr, walletSupply)) + ",\"walletSupplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"walletDailyIncome\":") + assetToJson(assetIdStr, walletDailyIncome)) + ",\"walletDailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"walletBorrow\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"walletBorrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"walletDailyLoanInterest\":") + assetToJson(assetIdStr, walletDailyLoanPercents)) + ",\"walletDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanPercentsInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + ",\"netApy\":") + amountToDecimal(netApy, 8)) + "}")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let Waves = "WAVES"
55
66 let Scale6 = 1000000
77
88 let Scale8 = 100000000
99
1010 let Scale8Big = toBigInt(100000000)
1111
1212 let Scale10 = 10000000000
1313
1414 let Scale16 = 10000000000000000
1515
1616 let Scale16Big = toBigInt(10000000000000000)
1717
1818 let dayBlocks = 1440
1919
2020 let yearBlocks = 525600
2121
2222 let yearBlocksBig = toBigInt(525600)
2323
2424 let reserveFund = 20
2525
2626 let arr12 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
2727
2828 let usdtIdStr = "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"
29+
30+let usdcIdStr = "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"
31+
32+let romeIdStr = "AP4Cb5xLYGH6ZigHreCZHoXpQTWDkPsG2BHqfDUx6taJ"
2933
3034 let oracleAddressStr = "3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t"
3135
3236 let axlyAddress = Address(base58'3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW')
3337
3438 let axlyLPs = ["7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1", "Btw3G1j4wQgdp49PTxaFkNvn75dQtqGDM7ejQppHnWC1", "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe", "F2AKkA513k5yHEJkLsU6vWxCYYk811GpjLhwEv2WGwZ9", "4CQ5CPGLXLbWBUs2JBjKUaRqF49CmKHkwzvPgSvQpAQV", "6iMB6LKSrgv9waEvEnN6Ydyx7dfxPnGcTw8318WVm5bR"]
3539
3640 func getRateCurve (assetIdStr,marketStr) = {
3741 let marketAddress = addressFromStringValue(marketStr)
3842 let setupRateCurve = getString(marketAddress, ("setup_rateCurve_" + assetIdStr))
3943 if (isDefined(setupRateCurve))
4044 then {
4145 let curveArr = split(value(setupRateCurve), ",")
4246 $Tuple4(parseIntValue(curveArr[0]), parseIntValue(curveArr[1]), parseIntValue(curveArr[2]), parseIntValue(curveArr[3]))
4347 }
4448 else match marketStr {
4549 case _ =>
4650 if (("3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH" == $match0))
4751 then match assetIdStr {
4852 case _ =>
4953 if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1))
5054 then $Tuple4(2000000, 25000000, 80000000, 100000000)
5155 else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == $match1))
5256 then $Tuple4(2000000, 25000000, 80000000, 100000000)
5357 else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match1))
5458 then $Tuple4(2000000, 25000000, 80000000, 100000000)
5559 else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match1))
5660 then $Tuple4(2000000, 25000000, 80000000, 100000000)
5761 else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match1))
5862 then $Tuple4(2000000, 25000000, 80000000, 100000000)
5963 else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match1))
6064 then $Tuple4(2000000, 40000000, 80000000, 150000000)
6165 else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match1))
6266 then $Tuple4(0, 100000000, 80000000, 400000000)
6367 else if (("WAVES" == $match1))
6468 then $Tuple4(2000000, 30000000, 80000000, 90000000)
6569 else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match1))
6670 then $Tuple4(0, 20000000, 80000000, 40000000)
6771 else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == $match1))
6872 then $Tuple4(0, 20000000, 80000000, 100000000)
6973 else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == $match1))
7074 then $Tuple4(0, 30000000, 80000000, 40000000)
7175 else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == $match1))
7276 then $Tuple4(0, 25000000, 80000000, 40000000)
7377 else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == $match1))
7478 then $Tuple4(2000000, 30000000, 80000000, 50000000)
7579 else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == $match1))
7680 then $Tuple4(2000000, 30000000, 80000000, 50000000)
7781 else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == $match1))
7882 then $Tuple4(2000000, 30000000, 80000000, 50000000)
7983 else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match1))
8084 then $Tuple4(2000000, 40000000, 80000000, 100000000)
8185 else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == $match1))
8286 then $Tuple4(2000000, 30000000, 80000000, 80000000)
8387 else if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1))
8488 then $Tuple4(0, 50000000, 80000000, 200000000)
8589 else if (("3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13" == $match1))
8690 then $Tuple4(0, 100000000, 80000000, 400000000)
8791 else $Tuple4(0, 20000000, 80000000, 80000000)
8892 }
8993 else if (("3P8Df2b7ywHtLBHBe8PBVQYd3A5MdEEJAou" == $match0))
9094 then $Tuple4(20000000, 100000000, 60000000, 400000000)
9195 else if (("3P4DK5VzDwL3vfc5ahUEhtoe5ByZNyacJ3X" == $match0))
9296 then match assetIdStr {
9397 case _ =>
9498 if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1))
9599 then $Tuple4(2000000, 25000000, 80000000, 100000000)
96100 else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == $match1))
97101 then $Tuple4(2000000, 25000000, 80000000, 100000000)
98102 else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match1))
99103 then $Tuple4(2000000, 25000000, 80000000, 100000000)
100104 else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match1))
101105 then $Tuple4(2000000, 25000000, 80000000, 100000000)
102106 else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match1))
103107 then $Tuple4(2000000, 25000000, 80000000, 100000000)
104108 else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match1))
105109 then $Tuple4(2000000, 40000000, 80000000, 150000000)
106110 else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match1))
107111 then $Tuple4(0, 50000000, 80000000, 400000000)
108112 else if (("WAVES" == $match1))
109113 then $Tuple4(2000000, 30000000, 80000000, 80000000)
110114 else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match1))
111115 then $Tuple4(0, 20000000, 80000000, 40000000)
112116 else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == $match1))
113117 then $Tuple4(0, 20000000, 80000000, 100000000)
114118 else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == $match1))
115119 then $Tuple4(0, 30000000, 80000000, 40000000)
116120 else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == $match1))
117121 then $Tuple4(0, 25000000, 80000000, 40000000)
118122 else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == $match1))
119123 then $Tuple4(2000000, 30000000, 80000000, 50000000)
120124 else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == $match1))
121125 then $Tuple4(2000000, 30000000, 80000000, 50000000)
122126 else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == $match1))
123127 then $Tuple4(2000000, 30000000, 80000000, 50000000)
124128 else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match1))
125129 then $Tuple4(2000000, 40000000, 80000000, 100000000)
126130 else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == $match1))
127131 then $Tuple4(2000000, 30000000, 80000000, 80000000)
128132 else if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1))
129133 then $Tuple4(0, 50000000, 80000000, 200000000)
130134 else if (("3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13" == $match1))
131135 then $Tuple4(0, 100000000, 80000000, 400000000)
132136 else $Tuple4(0, 20000000, 80000000, 80000000)
133137 }
134138 else if (("3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH" == $match0))
135139 then $Tuple4(20000000, 100000000, 60000000, 400000000)
136140 else if (("3PAd9Aqg3cQSzu26MFYWQYcjSXPVCJtuf5V" == $match0))
137141 then match assetIdStr {
138142 case _ =>
139143 if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1))
140144 then $Tuple4(2000000, 25000000, 80000000, 100000000)
141145 else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == $match1))
142146 then $Tuple4(2000000, 25000000, 80000000, 100000000)
143147 else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match1))
144148 then $Tuple4(2000000, 25000000, 80000000, 100000000)
145149 else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match1))
146150 then $Tuple4(2000000, 25000000, 80000000, 100000000)
147151 else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match1))
148152 then $Tuple4(2000000, 25000000, 80000000, 100000000)
149153 else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match1))
150154 then $Tuple4(2000000, 40000000, 80000000, 150000000)
151155 else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match1))
152156 then $Tuple4(0, 20000000, 80000000, 40000000)
153157 else if (("WAVES" == $match1))
154158 then $Tuple4(2000000, 30000000, 80000000, 50000000)
155159 else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match1))
156160 then $Tuple4(0, 20000000, 80000000, 40000000)
157161 else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == $match1))
158162 then $Tuple4(0, 20000000, 80000000, 100000000)
159163 else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == $match1))
160164 then $Tuple4(0, 30000000, 80000000, 40000000)
161165 else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == $match1))
162166 then $Tuple4(0, 25000000, 80000000, 40000000)
163167 else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == $match1))
164168 then $Tuple4(2000000, 30000000, 80000000, 50000000)
165169 else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == $match1))
166170 then $Tuple4(2000000, 30000000, 80000000, 50000000)
167171 else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == $match1))
168172 then $Tuple4(2000000, 30000000, 80000000, 50000000)
169173 else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match1))
170174 then $Tuple4(2000000, 40000000, 80000000, 100000000)
171175 else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == $match1))
172176 then $Tuple4(2000000, 30000000, 80000000, 80000000)
173177 else $Tuple4(0, 20000000, 80000000, 80000000)
174178 }
175179 else throw("Unknown market")
176180 }
177181 }
178182
179183
180184 func sum (size,data) = {
181185 func fold (accum,next) = if ((next >= size))
182186 then accum
183187 else (accum + data[next])
184188
185189 let $l = arr12
186190 let $s = size($l)
187191 let $acc0 = 0
188192 func $f0_1 ($a,$i) = if (($i >= $s))
189193 then $a
190194 else fold($a, $l[$i])
191195
192196 func $f0_2 ($a,$i) = if (($i >= $s))
193197 then $a
194198 else throw("List size exceeds 12")
195199
196200 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
197201 }
198202
199203
200204 func getSetupTokens (marketAddress) = split(getStringValue(marketAddress, "setup_tokens"), ",")
201205
202206
203207 func getTokenPrice (marketAddress,assetIdStr) = {
204208 let oracleStr = valueOrElse(getString(marketAddress, "oracle"), oracleAddressStr)
205209 let oracleAddress = addressFromStringValue(oracleStr)
206- let stables = split(valueOrElse(getString(marketAddress, "setup_stablesIds"), "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi,HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW,AP4Cb5xLYGH6ZigHreCZHoXpQTWDkPsG2BHqfDUx6taJ"), ",")
210+ let stables = split(valueOrElse(getString(marketAddress, "setup_stablesIds"), "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi,HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"), ",")
207211 if ((indexOf(stables, assetIdStr) != unit))
208212 then 1000000
209- else if (containsElement(axlyLPs, assetIdStr))
210- then {
211- let @ = invoke(axlyAddress, "getShareAssetPriceREADONLY", [assetIdStr], nil)
212- if ($isInstanceOf(@, "Int"))
213- then @
214- else throw(($getType(@) + " couldn't be cast to Int"))
215- }
216- else {
217- let price = getIntegerValue(oracleAddress, (assetIdStr + "_twap5B"))
218- price
219- }
213+ else if (if (if ((assetIdStr == usdtIdStr))
214+ then true
215+ else (assetIdStr == usdcIdStr))
216+ then true
217+ else (assetIdStr == romeIdStr))
218+ then 1000000
219+ else if (containsElement(axlyLPs, assetIdStr))
220+ then {
221+ let @ = invoke(axlyAddress, "getShareAssetPriceREADONLY", [assetIdStr], nil)
222+ if ($isInstanceOf(@, "Int"))
223+ then @
224+ else throw(($getType(@) + " couldn't be cast to Int"))
225+ }
226+ else {
227+ let price = getIntegerValue(oracleAddress, (assetIdStr + "_twap5B"))
228+ price
229+ }
220230 }
221231
222232
223233 func getAssetScale (assetIdStr) = {
224234 let decimals = if ((assetIdStr == "WAVES"))
225235 then 8
226236 else value(assetInfo(fromBase58String(assetIdStr))).decimals
227237 pow(10, 0, decimals, 0, 0, DOWN)
228238 }
229239
230240
231241 func getLastRateHeight (marketAddress) = valueOrElse(getInteger(marketAddress, "lastRateHeight"), 0)
232242
233243
234244 func getOutdatedTotalSupply (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, ("total_supplied_" + assetIdStr)), 0)
235245
236246
237247 func getOutdatedTotalBorrow (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, ("total_borrowed_" + assetIdStr)), 0)
238248
239249
240250 func getOutdatedSRate (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, (assetIdStr + "_sRate")), 0)
241251
242252
243253 func getOutdatedBRate (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, (assetIdStr + "_bRate")), 0)
244254
245255
246256 func getOutdatedUr (outdatedTotalSupply,outdatedTotalBorrow,outdatedSRate,outdatedBRate) = {
247257 let down = fraction(outdatedTotalSupply, outdatedSRate, Scale16)
248258 if ((down == 0))
249259 then 0
250260 else fraction(Scale8, fraction(outdatedTotalBorrow, outdatedBRate, Scale16), down)
251261 }
252262
253263
254264 func getRate (outdatedUr,assetIdStr,marketStr) = {
255265 let curve = getRateCurve(assetIdStr, marketStr)
256266 (curve._1 + (if ((curve._3 >= outdatedUr))
257267 then fraction(outdatedUr, curve._2, curve._3)
258268 else (curve._2 + fraction((outdatedUr - curve._3), curve._4, (100000000 - curve._3)))))
259269 }
260270
261271
262272 func getInterest (rate) = max([fraction(rate, Scale8, yearBlocks), 1])
263273
264274
265275 func getAssetIndex (setupTokens,assetIdStr) = value(indexOf(setupTokens, assetIdStr))
266276
267277
268278 func getAssetParamters (marketParameters,assetIndex) = $Tuple3(marketParameters._1[assetIndex], marketParameters._2[assetIndex], marketParameters._3[assetIndex])
269279
270280
271281 func getMarketParameters (marketAddress,setupTokens) = {
272282 let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
273283 let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
274284 let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
275285 let tokensSize = size(setupTokens)
276286 func fold (accum,next) = if ((next >= tokensSize))
277287 then accum
278288 else $Tuple3((accum._1 :+ parseIntValue(setupCf[next])), (accum._2 :+ parseIntValue(setupLt[next])), (accum._3 :+ parseIntValue(setupPenalty[next])))
279289
280290 let $l = arr12
281291 let $s = size($l)
282292 let $acc0 = $Tuple3(nil, nil, nil)
283293 func $f0_1 ($a,$i) = if (($i >= $s))
284294 then $a
285295 else fold($a, $l[$i])
286296
287297 func $f0_2 ($a,$i) = if (($i >= $s))
288298 then $a
289299 else throw("List size exceeds 12")
290300
291301 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
292302 }
293303
294304
295305 func getMaxSupply (marketAddress,assetIdStr) = parseIntValue(valueOrElse(getString(marketAddress, ("setup_maxSupply_" + assetIdStr)), "0"))
296306
297307
298308 func getActualSRate (lastRateHeight,interest,outdatedUr,outdatedSRate) = {
299309 let lastSRate = max([outdatedSRate, Scale16])
300310 let newSRate = (lastSRate + ((((height - lastRateHeight) * fraction(interest, outdatedUr, Scale8)) * (100 - reserveFund)) / 100))
301311 newSRate
302312 }
303313
304314
305315 func getActualBRate (lastRateHeight,interest,outdatedBRate) = {
306316 let lastBRate = max([outdatedBRate, Scale16])
307317 let newBRate = (lastBRate + ((height - lastRateHeight) * interest))
308318 newBRate
309319 }
310320
311321
312322 func getActualUr (actualSupply,actualBorrow) = fraction(actualBorrow, Scale8, actualSupply)
313323
314324
315325 func getActualAmount (outdatedAmount,actualRate) = fraction(outdatedAmount, actualRate, Scale16)
316326
317327
318328 func getInUsd (actualAmount,assetScale,price) = fraction(actualAmount, price, assetScale)
319329
320330
321331 func getSupplyApy (rate,actualUr) = {
322332 let supplyRate = fraction(fraction(rate, 80, 100), actualUr, Scale8)
323333 (toInt(pow((Scale16Big + fraction(toBigInt(supplyRate), Scale8Big, yearBlocksBig)), 16, yearBlocksBig, 0, 8, DOWN)) - Scale8)
324334 }
325335
326336
327337 func getBorrowApy (rate) = (toInt(pow((Scale16Big + fraction(toBigInt(rate), Scale8Big, yearBlocksBig)), 16, yearBlocksBig, 0, 8, DOWN)) - Scale8)
328338
329339
330340 func getWalletSupply (marketAddress,assetIdStr,wallet,actualSRate) = {
331341 let outdatedWalletSupply = valueOrElse(getInteger(marketAddress, ((wallet + "_supplied_") + assetIdStr)), 0)
332342 getActualAmount(outdatedWalletSupply, actualSRate)
333343 }
334344
335345
336346 func getWalletBorrow (marketAddress,assetIdStr,wallet,actualBRate) = {
337347 let outdatedWalletBorrow = valueOrElse(getInteger(marketAddress, ((wallet + "_borrowed_") + assetIdStr)), 0)
338348 getActualAmount(outdatedWalletBorrow, actualBRate)
339349 }
340350
341351
342352 func getDailyPercents (apy,quantity) = fraction(fraction((toInt(pow((Scale8Big + toBigInt(apy)), 8, (Scale16Big / yearBlocksBig), 16, 16, DOWN)) - Scale16), dayBlocks, Scale8), quantity, Scale8)
343353
344354
345355 func getAccountHealth (totalWalletBorrowLimitInUsd,totalWalletBorrowUsageInUsd) = if ((totalWalletBorrowLimitInUsd == 0))
346356 then Scale8
347357 else (Scale8 - fraction(totalWalletBorrowUsageInUsd, Scale8, totalWalletBorrowLimitInUsd))
348358
349359
350360 func getNetApy (totalWalletSupplyInUsd,totalWalletBorrowInUsd,totalWalletMarginInUsd) = if ((totalWalletMarginInUsd == 0))
351361 then 0
352362 else if ((totalWalletMarginInUsd > 0))
353363 then fraction(totalWalletMarginInUsd, Scale8, totalWalletSupplyInUsd)
354364 else fraction(totalWalletMarginInUsd, Scale8, totalWalletBorrowInUsd)
355365
356366
357367 func assetToJson (assetIdStr,quantity) = {
358- let $t01510415299 = if ((assetIdStr == Waves))
368+ let $t01529015485 = if ((assetIdStr == Waves))
359369 then $Tuple2(8, "WAVES")
360370 else {
361371 let asset = value(assetInfo(fromBase58String(assetIdStr)))
362372 $Tuple2(asset.decimals, asset.name)
363373 }
364- let decimals = $t01510415299._1
365- let name = $t01510415299._2
374+ let decimals = $t01529015485._1
375+ let name = $t01529015485._2
366376 (((((((("{\"quantity\":" + toString(quantity)) + ",\"decimals\":") + toString(decimals)) + ",\"name\":\"") + name) + "\",\"id\":\"") + assetIdStr) + "\"}")
367377 }
368378
369379
370380 func amountToDecimal (amount,decimals) = (((("{\"quantity\":" + toString(amount)) + ",\"decimals\":") + toString(decimals)) + ",\"name\":\"\",\"id\":\"\"}")
371381
372382
373383 func getMarketJson (marketIndex,wallet,debug) = {
374384 let marketStr = getStringValue(("market_" + toString(marketIndex)))
375385 let marketAddress = addressFromStringValue(marketStr)
376386 let marketName = getStringValue(("market_name_" + marketStr))
377387 let active = valueOrElse(getBoolean(marketAddress, "setup_active"), true)
378388 let setupTokens = getSetupTokens(marketAddress)
379389 let assetsCount = size(setupTokens)
380390 let lastRateHeight = getLastRateHeight(marketAddress)
381391 func assetsFold (accum,next) = if ((next >= assetsCount))
382392 then accum
383393 else {
384394 let assetIdStr = setupTokens[next]
385395 let price = getTokenPrice(marketAddress, assetIdStr)
386396 let assetScale = getAssetScale(assetIdStr)
387397 let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr)
388398 let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr)
389399 let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr)
390400 let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr)
391401 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
392402 let rate = getRate(outdatedUr, assetIdStr, marketStr)
393403 let interest = getInterest(rate)
394404 let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
395405 let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
396406 let supply = getActualAmount(outdatedTotalSupply, sRate)
397407 let borrow = getActualAmount(outdatedTotalBorrow, bRate)
398408 let supplyInUsd = getInUsd(supply, assetScale, price)
399409 let borrowInUsd = getInUsd(borrow, assetScale, price)
400410 let reserves = (supply - borrow)
401411 let reservesInUsd = getInUsd(reserves, assetScale, price)
402412 let ur = getActualUr(supply, borrow)
403413 let supplyApy = getSupplyApy(rate, ur)
404414 let borrowApy = getBorrowApy(rate)
405415 let marketAssetJson = ((((((((((((((((((((((((("{" + "\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, 8)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, 8)) + ",\"utilizationRatio\":") + amountToDecimal(ur, 8)) + ",\"sRate\":") + amountToDecimal(sRate, 16)) + ",\"bRate\":") + amountToDecimal(bRate, 16)) + "}")
406416 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson))
407417 }
408418
409- let $t01871218820 = {
419+ let $t01889819006 = {
410420 let $l = arr12
411421 let $s = size($l)
412422 let $acc0 = $Tuple4(0, 0, 0, nil)
413423 func $f0_1 ($a,$i) = if (($i >= $s))
414424 then $a
415425 else assetsFold($a, $l[$i])
416426
417427 func $f0_2 ($a,$i) = if (($i >= $s))
418428 then $a
419429 else throw("List size exceeds 12")
420430
421431 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
422432 }
423- let supplyInUsd = $t01871218820._1
424- let borrowInUsd = $t01871218820._2
425- let reservesInUsd = $t01871218820._3
426- let marketAssetsJson = $t01871218820._4
433+ let supplyInUsd = $t01889819006._1
434+ let borrowInUsd = $t01889819006._2
435+ let reservesInUsd = $t01889819006._3
436+ let marketAssetsJson = $t01889819006._4
427437 let marketsCount = getIntegerValue("markets")
428438 func marketsFold (accum,next) = if ((next >= marketsCount))
429439 then accum
430440 else {
431441 let currentMarketAddressStr = getStringValue(("market_" + toString(next)))
432442 let currentMarketName = getStringValue(("market_name_" + currentMarketAddressStr))
433443 let simpleJson = (((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, 0)) + ",\"accountHealth\":") + amountToDecimal(0, 8)) + "}")
434444 if ((wallet == ""))
435445 then (accum :+ simpleJson)
436446 else {
437447 let currentMarketAddress = addressFromStringValue(currentMarketAddressStr)
438448 let currentSetupTokens = getSetupTokens(currentMarketAddress)
439449 let currentAssetsCount = size(currentSetupTokens)
440450 let currentMarketShortName = getStringValue(("market_shortname_" + currentMarketAddressStr))
441451 let setupCf = split(getStringValue(currentMarketAddress, "setup_ltvs"), ",")
442452 let setupLt = split(getStringValue(currentMarketAddress, "setup_lts"), ",")
443453 let currentLastRateHeight = getLastRateHeight(currentMarketAddress)
444454 func marketAssetsFold (accum,next) = if ((next >= currentAssetsCount))
445455 then accum
446456 else {
447457 let assetIdStr = currentSetupTokens[next]
448458 let cf = parseIntValue(setupCf[next])
449459 let lt = parseIntValue(setupLt[next])
450460 let price = getTokenPrice(marketAddress, assetIdStr)
451461 let assetScale = getAssetScale(assetIdStr)
452462 let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr)
453463 let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr)
454464 let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr)
455465 let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr)
456466 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
457467 let rate = getRate(outdatedUr, assetIdStr, marketStr)
458468 let interest = getInterest(rate)
459469 let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate)
460470 let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate)
461471 let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate)
462472 let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
463473 let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate)
464474 let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
465475 let walletBorrowLimitInUsd = fraction(walletSupplyInUsd, cf, Scale8)
466476 let walletBorrowUsageInUsd = fraction(walletBorrowInUsd, Scale8, lt)
467477 $Tuple4((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd))
468478 }
469479
470- let $t02239122551 = {
480+ let $t02257722737 = {
471481 let $l = arr12
472482 let $s = size($l)
473483 let $acc0 = $Tuple4(0, 0, 0, 0)
474484 func $f1_1 ($a,$i) = if (($i >= $s))
475485 then $a
476486 else marketAssetsFold($a, $l[$i])
477487
478488 func $f1_2 ($a,$i) = if (($i >= $s))
479489 then $a
480490 else throw("List size exceeds 12")
481491
482492 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
483493 }
484- let totalWalletSupplyInUsd = $t02239122551._1
485- let totalWalletBorrowInUsd = $t02239122551._2
486- let totalWalletBorrowLimitInUsd = $t02239122551._3
487- let totalWalletBorrowUsageInUsd = $t02239122551._4
494+ let totalWalletSupplyInUsd = $t02257722737._1
495+ let totalWalletBorrowInUsd = $t02257722737._2
496+ let totalWalletBorrowLimitInUsd = $t02257722737._3
497+ let totalWalletBorrowUsageInUsd = $t02257722737._4
488498 let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
489499 let fullJson = (((((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + "}")
490500 (accum :+ fullJson)
491501 }
492502 }
493503
494504 let marketsJson = {
495505 let $l = arr12
496506 let $s = size($l)
497507 let $acc0 = nil
498508 func $f1_1 ($a,$i) = if (($i >= $s))
499509 then $a
500510 else marketsFold($a, $l[$i])
501511
502512 func $f1_2 ($a,$i) = if (($i >= $s))
503513 then $a
504514 else throw("List size exceeds 12")
505515
506516 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
507517 }
508518 let json = ((((((((((((((((((((((("{" + "\"index\":") + toString(marketIndex)) + ",\"name\":\"") + marketName) + "\"") + ",\"address\":\"") + marketStr) + "\"") + ",\"active\":") + toString(active)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
509519 if (debug)
510520 then throw(json)
511521 else json
512522 }
513523
514524
515525 func getMenuJson (debug) = {
516526 let marketsCount = getIntegerValue("markets")
517527 func marketsFold (accum,next) = if ((next >= marketsCount))
518528 then accum
519529 else {
520530 let marketStr = getStringValue(("market_" + toString(next)))
521531 let marketAddress = addressFromStringValue(marketStr)
522532 let setupTokens = getSetupTokens(marketAddress)
523533 let assetsCount = size(setupTokens)
524534 let lastRateHeight = getLastRateHeight(marketAddress)
525535 func assetsFold (accum,next) = if ((next >= assetsCount))
526536 then accum
527537 else {
528538 let assetIdStr = setupTokens[next]
529539 let price = getTokenPrice(marketAddress, assetIdStr)
530540 let assetScale = getAssetScale(assetIdStr)
531541 let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr)
532542 let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr)
533543 let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr)
534544 let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr)
535545 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
536546 let rate = getRate(outdatedUr, assetIdStr, marketStr)
537547 let interest = getInterest(rate)
538548 let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
539549 let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
540550 let supply = getActualAmount(outdatedTotalSupply, sRate)
541551 let borrow = getActualAmount(outdatedTotalBorrow, bRate)
542552 let supplyInUsd = getInUsd(supply, assetScale, price)
543553 let borrowInUsd = getInUsd(borrow, assetScale, price)
544554 let reserves = (supply - borrow)
545555 let reservesInUsd = getInUsd(reserves, assetScale, price)
546556 let marketAssetJson = ((((((((("{" + "\"asset\":") + assetToJson(assetIdStr, 0)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"sRate\":") + amountToDecimal(sRate, 16)) + ",\"bRate\":") + amountToDecimal(bRate, 16)) + "}")
547557 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson))
548558 }
549559
550- let $t02648526593 = {
560+ let $t02667126779 = {
551561 let $l = arr12
552562 let $s = size($l)
553563 let $acc0 = $Tuple4(0, 0, 0, nil)
554564 func $f0_1 ($a,$i) = if (($i >= $s))
555565 then $a
556566 else assetsFold($a, $l[$i])
557567
558568 func $f0_2 ($a,$i) = if (($i >= $s))
559569 then $a
560570 else throw("List size exceeds 12")
561571
562572 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
563573 }
564- let supplyInUsd = $t02648526593._1
565- let borrowInUsd = $t02648526593._2
566- let reservesInUsd = $t02648526593._3
567- let marketAssetsJson = $t02648526593._4
574+ let supplyInUsd = $t02667126779._1
575+ let borrowInUsd = $t02667126779._2
576+ let reservesInUsd = $t02667126779._3
577+ let marketAssetsJson = $t02667126779._4
568578 let marketJson = ((((((("{" + "\"address\":\"") + marketStr) + "\"") + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + "}")
569579 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketJson))
570580 }
571581
572- let $t02698427103 = {
582+ let $t02717027289 = {
573583 let $l = arr12
574584 let $s = size($l)
575585 let $acc0 = $Tuple4(0, 0, 0, nil)
576586 func $f0_1 ($a,$i) = if (($i >= $s))
577587 then $a
578588 else marketsFold($a, $l[$i])
579589
580590 func $f0_2 ($a,$i) = if (($i >= $s))
581591 then $a
582592 else throw("List size exceeds 12")
583593
584594 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
585595 }
586- let totalSupplyInUsd = $t02698427103._1
587- let totalBorrowInUsd = $t02698427103._2
588- let totalReservesInUsd = $t02698427103._3
589- let marketsJson = $t02698427103._4
596+ let totalSupplyInUsd = $t02717027289._1
597+ let totalBorrowInUsd = $t02717027289._2
598+ let totalReservesInUsd = $t02717027289._3
599+ let marketsJson = $t02717027289._4
590600 let json = (((((((((("{" + "\"supplyInUsd\":") + assetToJson(usdtIdStr, totalSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalBorrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, totalReservesInUsd)) + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
591601 if (debug)
592602 then throw(json)
593603 else json
594604 }
595605
596606
597607 func getWalletJson (marketIndex,wallet,debug) = {
598608 let marketStr = getStringValue(("market_" + toString(marketIndex)))
599609 let marketAddress = addressFromStringValue(marketStr)
600610 let marketName = getStringValue(("market_name_" + marketStr))
601611 let marketsCount = getIntegerValue("markets")
602612 func marketsFold (accum,next) = if ((next >= marketsCount))
603613 then accum
604614 else {
605615 let currentMarketAddressStr = getStringValue(("market_" + toString(next)))
606616 let currentMarketName = getStringValue(("market_name_" + currentMarketAddressStr))
607617 let currentMarketAddress = addressFromStringValue(currentMarketAddressStr)
608618 let currentSetupTokens = getSetupTokens(currentMarketAddress)
609619 let currentAssetsCount = size(currentSetupTokens)
610620 let currentMarketShortName = getStringValue(("market_shortname_" + currentMarketAddressStr))
611621 let setupCf = split(getStringValue(currentMarketAddress, "setup_ltvs"), ",")
612622 let setupLt = split(getStringValue(currentMarketAddress, "setup_lts"), ",")
613623 let currentLastRateHeight = getLastRateHeight(currentMarketAddress)
614624 func marketAssetsFold (accum,next) = if ((next >= currentAssetsCount))
615625 then accum
616626 else {
617627 let assetIdStr = currentSetupTokens[next]
618628 let cf = parseIntValue(setupCf[next])
619629 let lt = parseIntValue(setupLt[next])
620630 let price = getTokenPrice(marketAddress, assetIdStr)
621631 let assetScale = getAssetScale(assetIdStr)
622632 let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr)
623633 let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr)
624634 let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr)
625635 let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr)
626636 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
627637 let rate = getRate(outdatedUr, assetIdStr, marketStr)
628638 let interest = getInterest(rate)
629639 let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate)
630640 let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate)
631641 let supply = getActualAmount(outdatedTotalSupply, sRate)
632642 let borrow = getActualAmount(outdatedTotalBorrow, bRate)
633643 let ur = getActualUr(supply, borrow)
634644 let supplyApy = getSupplyApy(rate, ur)
635645 let borrowApy = getBorrowApy(rate)
636646 let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate)
637647 let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
638648 let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate)
639649 let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
640650 let walletBorrowLimitInUsd = fraction(walletSupplyInUsd, cf, Scale8)
641651 let walletBorrowUsageInUsd = fraction(walletBorrowInUsd, Scale8, lt)
642652 let walletDailyIncome = getDailyPercents(supplyApy, walletSupply)
643653 let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price)
644654 let walletDailyLoanInterest = getDailyPercents(borrowApy, walletBorrow)
645655 let walletDailyLoanInterestInUsd = getInUsd(walletDailyLoanInterest, assetScale, price)
646656 let walletMarginInUsd = (fraction(walletSupplyInUsd, supplyApy, Scale8) - fraction(walletBorrowInUsd, borrowApy, Scale8))
647657 $Tuple7((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd), (accum._5 + walletDailyIncomeInUsd), (accum._6 + walletDailyLoanInterestInUsd), (accum._7 + walletMarginInUsd))
648658 }
649659
650- let $t03192732282 = {
660+ let $t03211332468 = {
651661 let $l = arr12
652662 let $s = size($l)
653663 let $acc0 = $Tuple7(0, 0, 0, 0, 0, 0, 0)
654664 func $f0_1 ($a,$i) = if (($i >= $s))
655665 then $a
656666 else marketAssetsFold($a, $l[$i])
657667
658668 func $f0_2 ($a,$i) = if (($i >= $s))
659669 then $a
660670 else throw("List size exceeds 12")
661671
662672 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
663673 }
664- let totalWalletSupplyInUsd = $t03192732282._1
665- let totalWalletBorrowInUsd = $t03192732282._2
666- let totalWalletBorrowLimitInUsd = $t03192732282._3
667- let totalWalletBorrowUsageInUsd = $t03192732282._4
668- let totalWalletDailyIncomeInUsd = $t03192732282._5
669- let totalWalletDailyLoanInterestInUsd = $t03192732282._6
670- let totalWalletMarginInUsd = $t03192732282._7
674+ let totalWalletSupplyInUsd = $t03211332468._1
675+ let totalWalletBorrowInUsd = $t03211332468._2
676+ let totalWalletBorrowLimitInUsd = $t03211332468._3
677+ let totalWalletBorrowUsageInUsd = $t03211332468._4
678+ let totalWalletDailyIncomeInUsd = $t03211332468._5
679+ let totalWalletDailyLoanInterestInUsd = $t03211332468._6
680+ let totalWalletMarginInUsd = $t03211332468._7
671681 let totalWalletBadDebtInUsd = if ((totalWalletBorrowInUsd > totalWalletSupplyInUsd))
672682 then (totalWalletBorrowInUsd - totalWalletSupplyInUsd)
673683 else 0
674684 let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
675685 let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd)
676686 let marketsJson = (((((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + "}")
677687 func walletAssetsFold (accum,next) = if ((next >= currentAssetsCount))
678688 then accum
679689 else {
680690 let assetIdStr = currentSetupTokens[next]
681691 let price = getTokenPrice(marketAddress, assetIdStr)
682692 let assetScale = getAssetScale(assetIdStr)
683693 let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr)
684694 let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr)
685695 let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr)
686696 let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr)
687697 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
688698 let rate = getRate(outdatedUr, assetIdStr, marketStr)
689699 let interest = getInterest(rate)
690700 let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate)
691701 let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate)
692702 let supply = getActualAmount(outdatedTotalSupply, sRate)
693703 let borrow = getActualAmount(outdatedTotalBorrow, bRate)
694704 let ur = getActualUr(supply, borrow)
695705 let supplyApy = getSupplyApy(rate, ur)
696706 let borrowApy = getBorrowApy(rate)
697707 let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate)
698708 let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
699709 let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate)
700710 let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
701711 let walletDailyIncome = getDailyPercents(supplyApy, walletSupply)
702712 let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price)
703713 let walletDailyLoanInterest = getDailyPercents(borrowApy, walletBorrow)
704714 let walletDailyLoanInterestInUsd = getInUsd(walletDailyLoanInterest, assetScale, price)
705715 let supplyAssetsJson = ((((((((((((("{" + "\"amount\":") + assetToJson(assetIdStr, walletSupply)) + ",\"amountInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"apy\":") + amountToDecimal(supplyApy, 8)) + ",\"dailyPercents\":") + assetToJson(assetIdStr, walletDailyIncome)) + ",\"dailyPercentsInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + "}")
706716 let borrowAssetsJson = ((((((((((((("{" + "\"amount\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"amountInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"apy\":") + amountToDecimal(borrowApy, 8)) + ",\"dailyPercents\":") + assetToJson(assetIdStr, walletDailyLoanInterest)) + ",\"dailyPercentsInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanInterestInUsd)) + "}")
707717 $Tuple2((accum._1 :+ supplyAssetsJson), (accum._2 :+ borrowAssetsJson))
708718 }
709719
710- let $t03668436770 = {
720+ let $t03687036956 = {
711721 let $l = arr12
712722 let $s = size($l)
713723 let $acc0 = $Tuple2(nil, nil)
714724 func $f1_1 ($a,$i) = if (($i >= $s))
715725 then $a
716726 else walletAssetsFold($a, $l[$i])
717727
718728 func $f1_2 ($a,$i) = if (($i >= $s))
719729 then $a
720730 else throw("List size exceeds 12")
721731
722732 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
723733 }
724- let supplyAssetsJson = $t03668436770._1
725- let borrowAssetsJson = $t03668436770._2
734+ let supplyAssetsJson = $t03687036956._1
735+ let borrowAssetsJson = $t03687036956._2
726736 if ((marketIndex == next))
727737 then $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletBadDebtInUsd, totalWalletDailyIncomeInUsd, totalWalletDailyLoanInterestInUsd, accountHealth, netApy, (accum._13 :+ marketsJson), supplyAssetsJson, borrowAssetsJson)
728738 else $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), accum._6, accum._7, accum._8, accum._9, accum._10, accum._11, accum._12, (accum._13 :+ marketsJson), accum._14, accum._15)
729739 }
730740
731- let $t03822738711 = {
741+ let $t03841338897 = {
732742 let $l = arr12
733743 let $s = size($l)
734744 let $acc0 = $Tuple15(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nil, nil, nil)
735745 func $f0_1 ($a,$i) = if (($i >= $s))
736746 then $a
737747 else marketsFold($a, $l[$i])
738748
739749 func $f0_2 ($a,$i) = if (($i >= $s))
740750 then $a
741751 else throw("List size exceeds 12")
742752
743753 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
744754 }
745- let totalWalletSupplyInUsd = $t03822738711._1
746- let totalWalletBorrowInUsd = $t03822738711._2
747- let totalWalletBadDebtInUsd = $t03822738711._3
748- let totalWalletDailyIncomeInUsd = $t03822738711._4
749- let totalWalletDailyLoanInterestInUsd = $t03822738711._5
750- let walletSupplyInUsd = $t03822738711._6
751- let walletBorrowInUsd = $t03822738711._7
752- let walletBadDebtInUsd = $t03822738711._8
753- let walletDailyIncomeInUsd = $t03822738711._9
754- let walletDailyLoanInterestInUsd = $t03822738711._10
755- let walletAccountHealth = $t03822738711._11
756- let walletNetApy = $t03822738711._12
757- let marketsJson = $t03822738711._13
758- let supplyAssetsJson = $t03822738711._14
759- let borrowAssetsJson = $t03822738711._15
755+ let totalWalletSupplyInUsd = $t03841338897._1
756+ let totalWalletBorrowInUsd = $t03841338897._2
757+ let totalWalletBadDebtInUsd = $t03841338897._3
758+ let totalWalletDailyIncomeInUsd = $t03841338897._4
759+ let totalWalletDailyLoanInterestInUsd = $t03841338897._5
760+ let walletSupplyInUsd = $t03841338897._6
761+ let walletBorrowInUsd = $t03841338897._7
762+ let walletBadDebtInUsd = $t03841338897._8
763+ let walletDailyIncomeInUsd = $t03841338897._9
764+ let walletDailyLoanInterestInUsd = $t03841338897._10
765+ let walletAccountHealth = $t03841338897._11
766+ let walletNetApy = $t03841338897._12
767+ let marketsJson = $t03841338897._13
768+ let supplyAssetsJson = $t03841338897._14
769+ let borrowAssetsJson = $t03841338897._15
760770 let json = ((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"name\":\"") + marketName) + "\"") + ",\"totalSupplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"totalBorrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"totalBadDebtInUsd\":") + assetToJson(usdtIdStr, totalWalletBadDebtInUsd)) + ",\"totalDailyIncomeInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyIncomeInUsd)) + ",\"totalDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyLoanInterestInUsd)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"badDebtInUsd\":") + assetToJson(usdtIdStr, walletBadDebtInUsd)) + ",\"dailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"dailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanInterestInUsd)) + ",\"accountHealth\":") + amountToDecimal(walletAccountHealth, 8)) + ",\"netApy\":") + amountToDecimal(walletNetApy, 8)) + ",\"supplyAssets\":[") + makeString_11C(supplyAssetsJson, ",")) + "]") + ",\"borrowAssets\":[") + makeString_11C(borrowAssetsJson, ",")) + "]") + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
761771 if (debug)
762772 then throw(json)
763773 else json
764774 }
765775
766776
767777 func getWalletOperationsJson (marketIndex,assetIdStr,wallet,debug) = {
768778 let marketStr = getStringValue(("market_" + toString(marketIndex)))
769779 let marketAddress = addressFromStringValue(marketStr)
770780 let marketName = getStringValue(("market_name_" + marketStr))
771781 let active = valueOrElse(getBoolean(marketAddress, "setup_active"), true)
772782 let setupTokens = getSetupTokens(marketAddress)
773783 let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
774784 let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
775785 let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
776786 let assetIndex = getAssetIndex(setupTokens, assetIdStr)
777787 let cf = parseIntValue(setupCf[assetIndex])
778788 let lt = parseIntValue(setupLt[assetIndex])
779789 let penalty = parseIntValue(setupPenalty[assetIndex])
780790 let assetsCount = size(setupTokens)
781791 let lastRateHeight = getLastRateHeight(marketAddress)
782792 let price = getTokenPrice(marketAddress, assetIdStr)
783793 let assetScale = getAssetScale(assetIdStr)
784794 let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr)
785795 let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr)
786796 let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr)
787797 let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr)
788798 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
789799 let rate = getRate(outdatedUr, assetIdStr, marketStr)
790800 let interest = getInterest(rate)
791801 let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
792802 let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
793803 let supply = getActualAmount(outdatedTotalSupply, sRate)
794804 let borrow = getActualAmount(outdatedTotalBorrow, bRate)
795805 let supplyInUsd = getInUsd(supply, assetScale, price)
796806 let borrowInUsd = getInUsd(borrow, assetScale, price)
797807 let reserves = (supply - borrow)
798808 let reservesInUsd = getInUsd(reserves, assetScale, price)
799809 let ur = getActualUr(supply, borrow)
800810 let supplyApy = getSupplyApy(rate, ur)
801811 let borrowApy = getBorrowApy(rate)
802812 let maxSupply = getMaxSupply(marketAddress, assetIdStr)
803813 let walletSupply = getWalletSupply(marketAddress, assetIdStr, wallet, sRate)
804814 let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
805815 let walletDailyIncome = getDailyPercents(supplyApy, walletSupply)
806816 let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price)
807817 let walletBorrow = getWalletBorrow(marketAddress, assetIdStr, wallet, bRate)
808818 let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
809819 let walletDailyLoanPercents = getDailyPercents(borrowApy, walletBorrow)
810820 let walletDailyLoanPercentsInUsd = getInUsd(walletDailyLoanPercents, assetScale, price)
811821 func assetsFold (accum,next) = if ((next >= assetsCount))
812822 then accum
813823 else {
814824 let currentAssetIdStr = setupTokens[next]
815825 let currentCf = parseIntValue(setupCf[next])
816826 let currentLt = parseIntValue(setupLt[next])
817827 let currentPrice = getTokenPrice(marketAddress, currentAssetIdStr)
818828 let currentAssetScale = getAssetScale(currentAssetIdStr)
819829 let currentOutdatedTotalSupply = getOutdatedTotalSupply(marketAddress, currentAssetIdStr)
820830 let currentOutdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, currentAssetIdStr)
821831 let currentOutdatedSRate = getOutdatedSRate(marketAddress, currentAssetIdStr)
822832 let currentOutdatedBRate = getOutdatedBRate(marketAddress, currentAssetIdStr)
823833 let currentOutdatedUr = getOutdatedUr(currentOutdatedTotalSupply, currentOutdatedTotalBorrow, currentOutdatedSRate, currentOutdatedBRate)
824834 let currentRate = getRate(currentOutdatedUr, currentAssetIdStr, marketStr)
825835 let currentInterest = getInterest(currentRate)
826836 let currentSRate = getActualSRate(lastRateHeight, currentInterest, currentOutdatedUr, currentOutdatedSRate)
827837 let currentBRate = getActualBRate(lastRateHeight, currentInterest, currentOutdatedBRate)
828838 let currentSupply = getActualAmount(currentOutdatedTotalSupply, sRate)
829839 let currentBorrow = getActualAmount(currentOutdatedTotalBorrow, bRate)
830840 let currentUr = getActualUr(currentSupply, currentBorrow)
831841 let currentSupplyApy = getSupplyApy(currentRate, currentUr)
832842 let currentBorrowApy = getBorrowApy(currentRate)
833843 let currentWalletSupply = getWalletSupply(marketAddress, currentAssetIdStr, wallet, currentSRate)
834844 let currentWalletSupplyInUsd = getInUsd(currentWalletSupply, currentAssetScale, currentPrice)
835845 let currentWalletBorrow = getWalletBorrow(marketAddress, currentAssetIdStr, wallet, currentBRate)
836846 let currentWalletBorrowInUsd = getInUsd(currentWalletBorrow, currentAssetScale, currentPrice)
837847 let currentWalletBorrowLimitInUsd = fraction(currentWalletSupplyInUsd, currentCf, Scale8)
838848 let currentWalletBorrowUsageInUsd = fraction(currentWalletBorrowInUsd, Scale8, currentLt)
839849 let walletMarginInUsd = (fraction(currentWalletSupplyInUsd, currentSupplyApy, Scale8) - fraction(currentWalletBorrowInUsd, currentBorrowApy, Scale8))
840850 $Tuple5((accum._1 + currentWalletSupplyInUsd), (accum._2 + currentWalletBorrowInUsd), (accum._3 + currentWalletBorrowLimitInUsd), (accum._4 + currentWalletBorrowUsageInUsd), (accum._5 + walletMarginInUsd))
841851 }
842852
843- let $t04571345894 = {
853+ let $t04589946080 = {
844854 let $l = arr12
845855 let $s = size($l)
846856 let $acc0 = $Tuple5(0, 0, 0, 0, 0)
847857 func $f0_1 ($a,$i) = if (($i >= $s))
848858 then $a
849859 else assetsFold($a, $l[$i])
850860
851861 func $f0_2 ($a,$i) = if (($i >= $s))
852862 then $a
853863 else throw("List size exceeds 12")
854864
855865 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
856866 }
857- let totalWalletSupplyInUsd = $t04571345894._1
858- let totalWalletBorrowInUsd = $t04571345894._2
859- let totalWalletBorrowLimitInUsd = $t04571345894._3
860- let totalWalletBorrowUsageInUsd = $t04571345894._4
861- let totalWalletMarginInUsd = $t04571345894._5
867+ let totalWalletSupplyInUsd = $t04589946080._1
868+ let totalWalletBorrowInUsd = $t04589946080._2
869+ let totalWalletBorrowLimitInUsd = $t04589946080._3
870+ let totalWalletBorrowUsageInUsd = $t04589946080._4
871+ let totalWalletMarginInUsd = $t04589946080._5
862872 let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
863873 let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd)
864874 let json = ((((((((((((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"marketName\":\"") + marketName) + "\"") + ",\"address\":\"") + marketStr) + "\"") + ",\"assetPrice\":") + assetToJson(usdtIdStr, price)) + ",\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, 8)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, 8)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"utilizationRatio\":") + amountToDecimal(ur, 8)) + ",\"collateralFactor\":") + amountToDecimal(cf, 8)) + ",\"liquidationThreshold\":") + amountToDecimal(lt, 8)) + ",\"liquidationPenalty\":") + amountToDecimal(penalty, 8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"walletSupply\":") + assetToJson(assetIdStr, walletSupply)) + ",\"walletSupplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"walletDailyIncome\":") + assetToJson(assetIdStr, walletDailyIncome)) + ",\"walletDailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"walletBorrow\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"walletBorrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"walletDailyLoanInterest\":") + assetToJson(assetIdStr, walletDailyLoanPercents)) + ",\"walletDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanPercentsInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + ",\"netApy\":") + amountToDecimal(netApy, 8)) + "}")
865875 if (debug)
866876 then throw(json)
867877 else json
868878 }
869879
870880
871881 func getMarketParametersJson (marketIndex,debug) = {
872882 let marketStr = getStringValue(("market_" + toString(marketIndex)))
873883 let marketAddress = addressFromStringValue(marketStr)
874884 let marketName = getStringValue(("market_name_" + marketStr))
875885 let setupTokens = getSetupTokens(marketAddress)
876886 let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
877887 let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
878888 let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
879889 let assetsCount = size(setupTokens)
880890 func assetsFold (accum,next) = if ((next >= assetsCount))
881891 then accum
882892 else {
883893 let assetIdStr = setupTokens[next]
884894 let maxSupply = getMaxSupply(marketAddress, assetIdStr)
885895 let cf = parseIntValue(setupCf[next])
886896 let lt = parseIntValue(setupLt[next])
887897 let penalty = parseIntValue(setupPenalty[next])
888898 let json = ((((((((((("{" + "\"asset\":") + assetToJson(assetIdStr, 0)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"collateralFactor\":") + amountToDecimal(cf, 8)) + ",\"liquidationThreshold\":") + amountToDecimal(lt, 8)) + ",\"liquidationPenalty\":") + amountToDecimal(penalty, 8)) + "}")
889899 (accum :+ json)
890900 }
891901
892902 let assetsJson = {
893903 let $l = arr12
894904 let $s = size($l)
895905 let $acc0 = nil
896906 func $f0_1 ($a,$i) = if (($i >= $s))
897907 then $a
898908 else assetsFold($a, $l[$i])
899909
900910 func $f0_2 ($a,$i) = if (($i >= $s))
901911 then $a
902912 else throw("List size exceeds 12")
903913
904914 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
905915 }
906916 let json = ((((((("{" + "\"name\":\"") + marketName) + "\"") + ",\"assets\":[") + makeString_11C(assetsJson, ",")) + "]") + "}")
907917 if (debug)
908918 then throw(json)
909919 else json
910920 }
911921
912922
913923

github/deemru/w8io/3ef1775 
128.77 ms