tx · 98aDwqZ1HchCAccKDav7rgPxPUH8txnBAVZ3we7nbe9f

3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA:  -0.02900000 Waves

2022.08.29 17:15 [2205845] smart account 3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA > SELF 0.00000000 Waves

{ "type": 13, "id": "98aDwqZ1HchCAccKDav7rgPxPUH8txnBAVZ3we7nbe9f", "fee": 2900000, "feeAssetId": null, "timestamp": 1661782502740, "version": 2, "chainId": 84, "sender": "3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA", "senderPublicKey": "35yd3qw1gxKDxKwGAykHN9fANbXNWwseaUwbWDj24o3x", "proofs": [ "5rce7JBieKJdBRRyNKEgG2LNcW7LZE8zTEGjiq7xLRfz4ja4JtvDkdnA3kvm786xGeTHByeybibp9PBtSVv7VG3X" ], "script": "base64:BgJ/CAISAwoBCBIDCgEIEgASBAoCAQQSBwoFAQEBAQQSAwoBARIAEgcKBQEBAQgBEgQKAgEBEgMKAQESBAoCCAgSBAoCCAgSBAoCCAESABIDCgEIEgUKAwEBARIECgIIARIECgIBARIECgIICBILCgkIAQECAQIIBAQSBgoECAgBCFEABnNjYWxlOACAwtcvAAxzY2FsZThCaWdJbnQJALYCAQCAwtcvAAdzY2FsZTE4CQC2AgEAgICQu7rWrfANAAh0aG91c2FuZADoBwAKemVyb0JpZ0ludAkAtgIBAAAACW9uZUJpZ0ludAkAtgIBAAEACnNsaXBwYWdlNEQJALYCAQkAZQIFBnNjYWxlOAkAaQIJAGgCBQZzY2FsZTgAAQUGc2NhbGU4AAVBbXVsdAIDMTAwAAVEY29udgIBMQADU0VQAgJfXwAFRU1QVFkCAAAKUG9vbEFjdGl2ZQABAApQb29sUHV0RGlzAAIADlBvb2xNYXRjaGVyRGlzAAMADFBvb2xTaHV0ZG93bgAEAA5pZHhQb29sQWRkcmVzcwABAAlpZHhQb29sU3QAAgAJaWR4TFBBc0lkAAMACWlkeEFtQXNJZAAEAAlpZHhQckFzSWQABQALaWR4QW10QXNEY20ABgANaWR4UHJpY2VBc0RjbQAHAAtpZHhJQW10QXNJZAAIAA1pZHhJUHJpY2VBc0lkAAkAD2lkeEZhY3RTdGFrQ250cgABABBpZHhGYWN0U2xpcHBDbnRyAAcAEWlkeEZhY3RHd3hSZXdDbnRyAAoAEmZlZVBlcm1pbGxlRGVmYXVsdAAAAQJ0MQIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQC8AgMJALYCAQUHb3JpZ1ZhbAUHc2NhbGUxOAkAtgIBBQ1vcmlnU2NhbGVNdWx0AQJmMQIDdmFsD3Jlc3VsdFNjYWxlTXVsdAkAoAMBCQC8AgMFA3ZhbAkAtgIBBQ9yZXN1bHRTY2FsZU11bHQFB3NjYWxlMTgBAnRzAwNhbXQIcmVzU2NhbGUIY3VyU2NhbGUJAGsDBQNhbXQFCHJlc1NjYWxlBQhjdXJTY2FsZQEDYWJzAQN2YWwDCQC/AgIFCnplcm9CaWdJbnQFA3ZhbAkAvgIBBQN2YWwFA3ZhbAECZmMAAhMlc19fZmFjdG9yeUNvbnRyYWN0AQNtcGsAAhQlc19fbWFuYWdlclB1YmxpY0tleQEEcG1wawACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQECcGwAAhElcyVzX19wcmljZV9fbGFzdAECcGgCAWgBdAkAuQkCCQDMCAICGCVzJXMlZCVkX19wcmljZV9faGlzdG9yeQkAzAgCCQCkAwEFAWgJAMwIAgkApAMBBQF0BQNuaWwFA1NFUAEDcGF1AgJ1YQR0eElkCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwUCdWECAl9fBQR0eElkAQNnYXUCAnVhBHR4SWQJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQJ1YQICX18FBHR4SWQBAmFhAAIPJXNfX2Ftb3VudEFzc2V0AQJwYQACDiVzX19wcmljZUFzc2V0AQNhbXAAAgclc19fYW1wAQNhZGEAAg0lc19fYWRkb25BZGRyAA5rZXlGZWVQZXJtaWxsZQIPJXNfX2ZlZVBlcm1pbGxlAAtmZWVQZXJtaWxsZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ5rZXlGZWVQZXJtaWxsZQUSZmVlUGVybWlsbGVEZWZhdWx0AQRmY2ZnAAIRJXNfX2ZhY3RvcnlDb25maWcBBG10cGsAAhglcyVzX19tYXRjaGVyX19wdWJsaWNLZXkBAnBjAgZpQW10QXMFaVByQXMJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FBmlBbXRBcwICX18FBWlQckFzAghfX2NvbmZpZwEDbWJhAQViQVN0cgkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQViQVN0cgEDYXBzAAIMJXNfX3NodXRkb3duARxrZXlBbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAAIdJXNfX2FsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2gBA3RvZQMDb3JWBnNlbmRyVgZtYXRjaFYJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIRRmFpbGVkOiBvcmRWYWxpZD0JAKUDAQUDb3JWAgsgc25kclZhbGlkPQkApQMBBQZzZW5kclYCDCBtdGNoclZhbGlkPQkApQMBBQZtYXRjaFYBA3N0cgEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZ2YWxTdHIFByRtYXRjaDAFBnZhbFN0cgkAAgECE2ZhaWwgY2FzdCB0byBTdHJpbmcBBHN0cmYCBGFkZHIDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEYWRkcgUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFBGFkZHIJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAEEaW50ZgIEYWRkcgNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQRhZGRyBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUEYWRkcgkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAgwgbm90IGRlZmluZWQFA25pbAIAAANmY2EJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQRzdHJmAgUEdGhpcwkBAmZjAAABQQkBBHN0cmYCBQR0aGlzCQEDYW1wAAEDaWdzAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQNmY2EJAQNhcHMABwECbXAACQDZBAEJAQRzdHJmAgUDZmNhCQEEbXRwawAADm1hdGNoZXJBZGRyZXNzCQCnCAEJAQJtcAABA2dwYwAEBWFtdEFzCQEEc3RyZgIFBHRoaXMJAQJhYQAEB3ByaWNlQXMJAQRzdHJmAgUEdGhpcwkBAnBhAAQIaVByaWNlQXMJAQRpbnRmAgUDZmNhCQEDbWJhAQUHcHJpY2VBcwQGaUFtdEFzCQEEaW50ZgIFA2ZjYQkBA21iYQEFBWFtdEFzCQC1CQIJAQRzdHJmAgUDZmNhCQECcGMCCQCkAwEFBmlBbXRBcwkApAMBBQhpUHJpY2VBcwUDU0VQAQNnZmMACQC1CQIJAQRzdHJmAgUDZmNhCQEEZmNmZwAFA1NFUAERZGF0YVB1dEFjdGlvbkluZm8KDWluQW10QXNzZXRBbXQPaW5QcmljZUFzc2V0QW10CG91dExwQW10BXByaWNlCnNsaXBCeVVzZXIMc2xpcHBhZ2VSZWFsCHR4SGVpZ2h0C3R4VGltZXN0YW1wDHNsaXBhZ2VBbUFtdAxzbGlwYWdlUHJBbXQJALkJAgkAzAgCAhQlZCVkJWQlZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFDWluQW10QXNzZXRBbXQJAMwIAgkApAMBBQ9pblByaWNlQXNzZXRBbXQJAMwIAgkApAMBBQhvdXRMcEFtdAkAzAgCCQCkAwEFBXByaWNlCQDMCAIJAKQDAQUKc2xpcEJ5VXNlcgkAzAgCCQCkAwEFDHNsaXBwYWdlUmVhbAkAzAgCCQCkAwEFCHR4SGVpZ2h0CQDMCAIJAKQDAQULdHhUaW1lc3RhbXAJAMwIAgkApAMBBQxzbGlwYWdlQW1BbXQJAMwIAgkApAMBBQxzbGlwYWdlUHJBbXQFA25pbAUDU0VQARFkYXRhR2V0QWN0aW9uSW5mbwYOb3V0QW10QXNzZXRBbXQQb3V0UHJpY2VBc3NldEFtdAdpbkxwQW10BXByaWNlCHR4SGVpZ2h0C3R4VGltZXN0YW1wCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUOb3V0QW10QXNzZXRBbXQJAMwIAgkApAMBBRBvdXRQcmljZUFzc2V0QW10CQDMCAIJAKQDAQUHaW5McEFtdAkAzAgCCQCkAwEFBXByaWNlCQDMCAIJAKQDAQUIdHhIZWlnaHQJAMwIAgkApAMBBQt0eFRpbWVzdGFtcAUDbmlsBQNTRVABDWdldEFjY0JhbGFuY2UBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUHYXNzZXRJZAEEY3BiaQIIcHJBbXRYMTgIYW1BbXRYMTgJALwCAwUIcHJBbXRYMTgFB3NjYWxlMTgFCGFtQW10WDE4AQN2YWQDAkExAkEyCHNsaXBwYWdlBARkaWZmCQC8AgMJALgCAgUCQTEFAkEyBQxzY2FsZThCaWdJbnQFAkEyBARwYXNzCQC/AgIJALgCAgUIc2xpcHBhZ2UJAQNhYnMBBQRkaWZmBQp6ZXJvQmlnSW50AwkBASEBBQRwYXNzCQACAQkArAICAgpCaWcgc2xwZzogCQCmAwEFBGRpZmYJAJQKAgUEcGFzcwkAmQMBCQDMCAIFAkExCQDMCAIFAkEyBQNuaWwBAnZkAwJEMQJEMARzbHBnBARkaWZmCQC8AgMFAkQwBQxzY2FsZThCaWdJbnQFAkQxBARmYWlsCQC/AgIFBHNscGcFBGRpZmYDAwUEZmFpbAYJAL8CAgUCRDAFAkQxCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApgMBBQJEMAIBIAkApgMBBQJEMQIBIAkApgMBBQRkaWZmAgEgCQCmAwEFBHNscGcFBGZhaWwBA3BjcAQKYW1Bc3NldERjbQpwckFzc2V0RGNtBWFtQW10BXByQW10BAthbXRBc0FtdFgxOAkBAnQxAgUFYW1BbXQFCmFtQXNzZXREY20ECnByQXNBbXRYMTgJAQJ0MQIFBXByQW10BQpwckFzc2V0RGNtCQEEY3BiaQIFCnByQXNBbXRYMTgFC2FtdEFzQW10WDE4AQpjYWxjUHJpY2VzAwVhbUFtdAVwckFtdAVscEFtdAQDY2ZnCQEDZ3BjAAQIYW10QXNEY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFC2lkeEFtdEFzRGNtBAdwckFzRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ1pZHhQcmljZUFzRGNtBAhwcmljZVgxOAkBA3BjcAQFCGFtdEFzRGNtBQdwckFzRGNtBQVhbUFtdAUFcHJBbXQECGFtQW10WDE4CQECdDECBQVhbUFtdAUIYW10QXNEY20ECHByQW10WDE4CQECdDECBQVwckFtdAUHcHJBc0RjbQQIbHBBbXRYMTgJAQJ0MQIFBWxwQW10BQZzY2FsZTgEDWxwUHJJbkFtQXNYMTgJAQRjcGJpAgUIYW1BbXRYMTgFCGxwQW10WDE4BA1scFBySW5QckFzWDE4CQEEY3BiaQIFCHByQW10WDE4BQhscEFtdFgxOAkAzAgCBQhwcmljZVgxOAkAzAgCBQ1scFBySW5BbUFzWDE4CQDMCAIFDWxwUHJJblByQXNYMTgFA25pbAEPY2FsY3VsYXRlUHJpY2VzAwVhbUFtdAVwckFtdAVscEFtdAQBcAkBCmNhbGNQcmljZXMDBQVhbUFtdAUFcHJBbXQFBWxwQW10CQDMCAIJAQJmMQIJAJEDAgUBcAAABQZzY2FsZTgJAMwIAgkBAmYxAgkAkQMCBQFwAAEFBnNjYWxlOAkAzAgCCQECZjECCQCRAwIFAXAAAgUGc2NhbGU4BQNuaWwBA2VnbwQGdHhJZDU4CnBtdEFzc2V0SWQIcG10THBBbXQLdXNlckFkZHJlc3MEA2NmZwkBA2dwYwAEBGxwSWQJAJEDAgUDY2ZnBQlpZHhMUEFzSWQEBGFtSWQJAJEDAgUDY2ZnBQlpZHhBbUFzSWQEBHBySWQJAJEDAgUDY2ZnBQlpZHhQckFzSWQEBWFtRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQtpZHhBbXRBc0RjbQQFcHJEY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDWlkeFByaWNlQXNEY20EA3N0cwkAkQMCBQNjZmcFCWlkeFBvb2xTdAQHbHBFbWlzcwgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFBGxwSWQCC1dyb25nIExQIGlkCHF1YW50aXR5AwkBAiE9AgUEbHBJZAUKcG10QXNzZXRJZAkAAgECD1dyb25nIHBtdCBhc3NldAQJYW1CYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFBGFtSWQEDGFtQmFsYW5jZVgxOAkBAnQxAgUJYW1CYWxhbmNlBQVhbURjbQQJcHJCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFBHBySWQEDHByQmFsYW5jZVgxOAkBAnQxAgUJcHJCYWxhbmNlBQVwckRjbQQLY3VyUHJpY2VYMTgJAQRjcGJpAgUMcHJCYWxhbmNlWDE4BQxhbUJhbGFuY2VYMTgECGN1clByaWNlCQECZjECBQtjdXJQcmljZVgxOAUGc2NhbGU4BAtwbXRMcEFtdFgxOAkBAnQxAgUIcG10THBBbXQFBnNjYWxlOAQKbHBFbWlzc1gxOAkBAnQxAgUHbHBFbWlzcwUGc2NhbGU4BAtvdXRBbUFtdFgxOAkAvAIDBQxhbUJhbGFuY2VYMTgFC3BtdExwQW10WDE4BQpscEVtaXNzWDE4BAtvdXRQckFtdFgxOAkAvAIDBQxwckJhbGFuY2VYMTgFC3BtdExwQW10WDE4BQpscEVtaXNzWDE4BAhvdXRBbUFtdAkBAmYxAgULb3V0QW1BbXRYMTgFBWFtRGNtBAhvdXRQckFtdAkBAmYxAgULb3V0UHJBbXRYMTgFBXByRGNtBAVzdGF0ZQMJAAACBQZ0eElkNTgCAAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQhvdXRBbUFtdAMJAAACBQRhbUlkAgVXQVZFUwUEdW5pdAkA2QQBBQRhbUlkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQhvdXRQckFtdAMJAAACBQRwcklkAgVXQVZFUwUEdW5pdAkA2QQBBQRwcklkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNnYXUCCQClCAEFC3VzZXJBZGRyZXNzBQZ0eElkNTgJARFkYXRhR2V0QWN0aW9uSW5mbwYFCG91dEFtQW10BQhvdXRQckFtdAUIcG10THBBbXQFCGN1clByaWNlBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGwABQhjdXJQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBoAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUIY3VyUHJpY2UFA25pbAkAnAoKBQhvdXRBbUFtdAUIb3V0UHJBbXQFBGFtSWQFBHBySWQFCWFtQmFsYW5jZQUJcHJCYWxhbmNlBQdscEVtaXNzBQtjdXJQcmljZVgxOAUDc3RzBQVzdGF0ZQEDZXBvDAZ0eElkNTgIc2xpcHBhZ2UHaW5BbUFtdAZpbkFtSWQHaW5QckFtdAZpblBySWQLdXNlckFkZHJlc3MGaXNFdmFsBmVtaXRMcAppc09uZUFzc2V0BnBtdEFtdAVwbXRJZAQDY2ZnCQEDZ3BjAAQEbHBJZAkA2QQBCQCRAwIFA2NmZwUJaWR4TFBBc0lkBAdhbUlkU3RyCQCRAwIFA2NmZwUJaWR4QW1Bc0lkBAdwcklkU3RyCQCRAwIFA2NmZwUJaWR4UHJBc0lkBAlpbkFtSWRTdHIJAJEDAgUDY2ZnBQtpZHhJQW10QXNJZAQJaW5QcklkU3RyCQCRAwIFA2NmZwUNaWR4SVByaWNlQXNJZAQGYW10RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQtpZHhBbXRBc0RjbQQIcHJpY2VEY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDWlkeFByaWNlQXNEY20EA3N0cwkAkQMCBQNjZmcFCWlkeFBvb2xTdAQEbHBFbQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQRscElkAghXciBscCBhcwhxdWFudGl0eQQJYW1CYWxhbmNlAwUGaXNFdmFsCQENZ2V0QWNjQmFsYW5jZQEFB2FtSWRTdHIDAwUKaXNPbmVBc3NldAkAAAIFBXBtdElkBQdhbUlkU3RyBwkAZQIJAQ1nZXRBY2NCYWxhbmNlAQUHYW1JZFN0cgUGcG10QW10AwUKaXNPbmVBc3NldAkBDWdldEFjY0JhbGFuY2UBBQdhbUlkU3RyCQBlAgkBDWdldEFjY0JhbGFuY2UBBQdhbUlkU3RyBQdpbkFtQW10BAlwckJhbGFuY2UDBQZpc0V2YWwJAQ1nZXRBY2NCYWxhbmNlAQUHcHJJZFN0cgMDBQppc09uZUFzc2V0CQAAAgUFcG10SWQFB3BySWRTdHIHCQBlAgkBDWdldEFjY0JhbGFuY2UBBQdwcklkU3RyBQZwbXRBbXQDBQppc09uZUFzc2V0CQENZ2V0QWNjQmFsYW5jZQEFB3BySWRTdHIJAGUCCQENZ2V0QWNjQmFsYW5jZQEFB3BySWRTdHIFB2luUHJBbXQED2luQW1Bc3NldEFtdFgxOAkBAnQxAgUHaW5BbUFtdAUGYW10RGNtBA9pblByQXNzZXRBbXRYMTgJAQJ0MQIFB2luUHJBbXQFCHByaWNlRGNtBAx1c2VyUHJpY2VYMTgJAQRjcGJpAgUPaW5QckFzc2V0QW10WDE4BQ9pbkFtQXNzZXRBbXRYMTgEDGFtQmFsYW5jZVgxOAkBAnQxAgUJYW1CYWxhbmNlBQZhbXREY20EDHByQmFsYW5jZVgxOAkBAnQxAgUJcHJCYWxhbmNlBQhwcmljZURjbQQBcgMJAAACBQRscEVtAAAEC2N1clByaWNlWDE4BQp6ZXJvQmlnSW50BAtzbGlwcGFnZVgxOAUKemVyb0JpZ0ludAQIbHBBbXRYMTgJAHYGCQC5AgIFD2luQW1Bc3NldEFtdFgxOAUPaW5QckFzc2V0QW10WDE4AAAJALYCAQAFAAEAAAUERE9XTgkAlwoFCQECZjECBQhscEFtdFgxOAUGc2NhbGU4CQECZjECBQ9pbkFtQXNzZXRBbXRYMTgFBmFtdERjbQkBAmYxAgUPaW5QckFzc2V0QW10WDE4BQhwcmljZURjbQkBBGNwYmkCCQC3AgIFDHByQmFsYW5jZVgxOAUPaW5QckFzc2V0QW10WDE4CQC3AgIFDGFtQmFsYW5jZVgxOAUPaW5BbUFzc2V0QW10WDE4BQtzbGlwcGFnZVgxOAQLY3VyUHJpY2VYMTgJAQRjcGJpAgUMcHJCYWxhbmNlWDE4BQxhbUJhbGFuY2VYMTgED3NsaXBwYWdlUmVhbFgxOAkAvAIDCQEDYWJzAQkAuAICBQtjdXJQcmljZVgxOAUMdXNlclByaWNlWDE4BQdzY2FsZTE4BQtjdXJQcmljZVgxOAQLc2xpcHBhZ2VYMTgJAQJ0MQIFCHNsaXBwYWdlBQZzY2FsZTgDAwkBAiE9AgULY3VyUHJpY2VYMTgFCnplcm9CaWdJbnQJAL8CAgUPc2xpcHBhZ2VSZWFsWDE4BQtzbGlwcGFnZVgxOAcJAAIBCQCsAgIJAKwCAgkArAICAg9QcmljZSBzbGlwcGFnZSAJAKYDAQUPc2xpcHBhZ2VSZWFsWDE4AgMgPiAJAKYDAQULc2xpcHBhZ2VYMTgEDWxwRW1pc3Npb25YMTgJAQJ0MQIFBGxwRW0FBnNjYWxlOAQKcHJWaWFBbVgxOAkAvAIDBQ9pbkFtQXNzZXRBbXRYMTgFC2N1clByaWNlWDE4BQdzY2FsZTE4BAphbVZpYVByWDE4CQC8AgMFD2luUHJBc3NldEFtdFgxOAUHc2NhbGUxOAULY3VyUHJpY2VYMTgEDGV4cGVjdGVkQW10cwMJAL8CAgUKcHJWaWFBbVgxOAUPaW5QckFzc2V0QW10WDE4CQCUCgIFCmFtVmlhUHJYMTgFD2luUHJBc3NldEFtdFgxOAkAlAoCBQ9pbkFtQXNzZXRBbXRYMTgFCnByVmlhQW1YMTgEEWV4cEFtdEFzc2V0QW10WDE4CAUMZXhwZWN0ZWRBbXRzAl8xBBNleHBQcmljZUFzc2V0QW10WDE4CAUMZXhwZWN0ZWRBbXRzAl8yBAhscEFtdFgxOAkAvAIDBQ1scEVtaXNzaW9uWDE4BRNleHBQcmljZUFzc2V0QW10WDE4BQxwckJhbGFuY2VYMTgJAJcKBQkBAmYxAgUIbHBBbXRYMTgFBnNjYWxlOAkBAmYxAgURZXhwQW10QXNzZXRBbXRYMTgFBmFtdERjbQkBAmYxAgUTZXhwUHJpY2VBc3NldEFtdFgxOAUIcHJpY2VEY20FC2N1clByaWNlWDE4BQtzbGlwcGFnZVgxOAQJY2FsY0xwQW10CAUBcgJfMQQOY2FsY0FtQXNzZXRQbXQIBQFyAl8yBA5jYWxjUHJBc3NldFBtdAgFAXICXzMECGN1clByaWNlCQECZjECCAUBcgJfNAUGc2NhbGU4BAxzbGlwcGFnZUNhbGMJAQJmMQIIBQFyAl81BQZzY2FsZTgDCQBnAgAABQljYWxjTHBBbXQJAAIBAgdMUCA8PSAwBAllbWl0THBBbXQDCQEBIQEFBmVtaXRMcAAABQljYWxjTHBBbXQEBmFtRGlmZgkAZQIFB2luQW1BbXQFDmNhbGNBbUFzc2V0UG10BAZwckRpZmYJAGUCBQdpblByQW10BQ5jYWxjUHJBc3NldFBtdAQNJHQwMTU1ODcxNTkzMgMDBQppc09uZUFzc2V0CQAAAgUFcG10SWQFB2FtSWRTdHIHCQCUCgIFBnBtdEFtdAAAAwMFCmlzT25lQXNzZXQJAAACBQVwbXRJZAUHcHJJZFN0cgcJAJQKAgAABQZwbXRBbXQJAJQKAgUOY2FsY0FtQXNzZXRQbXQFDmNhbGNQckFzc2V0UG10BAp3cml0ZUFtQW10CAUNJHQwMTU1ODcxNTkzMgJfMQQKd3JpdGVQckFtdAgFDSR0MDE1NTg3MTU5MzICXzIEC2NvbW1vblN0YXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGwABQhjdXJQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBoAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUIY3VyUHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBA3BhdQIFC3VzZXJBZGRyZXNzBQZ0eElkNTgJARFkYXRhUHV0QWN0aW9uSW5mbwoFCndyaXRlQW1BbXQFCndyaXRlUHJBbXQFCWVtaXRMcEFtdAUIY3VyUHJpY2UFCHNsaXBwYWdlBQxzbGlwcGFnZUNhbGMFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFBmFtRGlmZgUGcHJEaWZmBQNuaWwJAJ8KDQUJY2FsY0xwQW10BQllbWl0THBBbXQFCGN1clByaWNlBQlhbUJhbGFuY2UFCXByQmFsYW5jZQUEbHBFbQUEbHBJZAUDc3RzBQtjb21tb25TdGF0ZQUGYW1EaWZmBQZwckRpZmYFBmluQW1JZAUGaW5QcklkAQNtb2EBBW9yZGVyBANjZmcJAQNncGMABAdhbXRBc0lkCQCRAwIFA2NmZwUJaWR4QW1Bc0lkBAZwckFzSWQJAJEDAgUDY2ZnBQlpZHhQckFzSWQEA3N0cwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUJaWR4UG9vbFN0BAhhbXRBc0RjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwULaWR4QW10QXNEY20EB3ByQXNEY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDWlkeFByaWNlQXNEY20ED2FjY0FtdEFzQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQdhbXRBc0lkBA5hY2NQckFzQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQZwckFzSWQEC2N1clByaWNlWDE4AwkAAAIIBQVvcmRlcglvcmRlclR5cGUFA0J1eQkBA3BjcAQFCGFtdEFzRGNtBQdwckFzRGNtCQBkAgUPYWNjQW10QXNCYWxhbmNlCAUFb3JkZXIGYW1vdW50BQ5hY2NQckFzQmFsYW5jZQkBA3BjcAQFCGFtdEFzRGNtBQdwckFzRGNtCQBlAgUPYWNjQW10QXNCYWxhbmNlCAUFb3JkZXIGYW1vdW50BQ5hY2NQckFzQmFsYW5jZQQIY3VyUHJpY2UJAQJmMQIFC2N1clByaWNlWDE4BQZzY2FsZTgDAwMJAQNpZ3MABgkAAAIFA3N0cwUOUG9vbE1hdGNoZXJEaXMGCQAAAgUDc3RzBQxQb29sU2h1dGRvd24JAAIBAg1BZG1pbiBibG9ja2VkBApvckFtdEFzc2V0CAgFBW9yZGVyCWFzc2V0UGFpcgthbW91bnRBc3NldAQKb3JBbXRBc1N0cgMJAAACBQpvckFtdEFzc2V0BQR1bml0AgVXQVZFUwkA2AQBCQEFdmFsdWUBBQpvckFtdEFzc2V0BAlvclByQXNzZXQICAUFb3JkZXIJYXNzZXRQYWlyCnByaWNlQXNzZXQECW9yUHJBc1N0cgMJAAACBQlvclByQXNzZXQFBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFCW9yUHJBc3NldAMDCQECIT0CBQpvckFtdEFzU3RyBQdhbXRBc0lkBgkBAiE9AgUJb3JQckFzU3RyBQZwckFzSWQJAAIBAglXciBhc3NldHMECm9yZGVyUHJpY2UIBQVvcmRlcgVwcmljZQQIcHJpY2VEY20JAGsDBQZzY2FsZTgFB3ByQXNEY20FCGFtdEFzRGNtBA5jYXN0T3JkZXJQcmljZQkBAnRzAwUKb3JkZXJQcmljZQUGc2NhbGU4BQhwcmljZURjbQQRaXNPcmRlclByaWNlVmFsaWQDCQAAAggFBW9yZGVyCW9yZGVyVHlwZQUDQnV5CQBnAgUIY3VyUHJpY2UFDmNhc3RPcmRlclByaWNlCQBnAgUOY2FzdE9yZGVyUHJpY2UFCGN1clByaWNlBgECY2cBAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAgoxIHBtbnQgZXhwBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQKcG10QXNzZXRJZAkBBXZhbHVlAQgFA3BtdAdhc3NldElkBAZwbXRBbXQIBQNwbXQGYW1vdW50BAFyCQEDZWdvBAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEFCnBtdEFzc2V0SWQFBnBtdEFtdAgFAWkGY2FsbGVyBAhvdXRBbUFtdAgFAXICXzEECG91dFByQW10CAUBcgJfMgQDc3RzCQENcGFyc2VJbnRWYWx1ZQEIBQFyAl85BAVzdGF0ZQgFAXIDXzEwAwMJAQNpZ3MABgkAAAIFA3N0cwUMUG9vbFNodXRkb3duCQACAQkArAICAg9BZG1pbiBibG9ja2VkOiAJAKQDAQUDc3RzCQCXCgUFCG91dEFtQW10BQhvdXRQckFtdAUGcG10QW10BQpwbXRBc3NldElkBQVzdGF0ZQECY3AJBmNhbGxlcgR0eElkB2FtQXNQbXQHcHJBc1BtdAhzbGlwcGFnZQZlbWl0THAKaXNPbmVBc3NldAZwbXRBbXQFcG10SWQEAXIJAQNlcG8MBQR0eElkBQhzbGlwcGFnZQgJAQV2YWx1ZQEFB2FtQXNQbXQGYW1vdW50CAkBBXZhbHVlAQUHYW1Bc1BtdAdhc3NldElkCAkBBXZhbHVlAQUHcHJBc1BtdAZhbW91bnQICQEFdmFsdWUBBQdwckFzUG10B2Fzc2V0SWQFBmNhbGxlcgcFBmVtaXRMcAUKaXNPbmVBc3NldAUGcG10QW10BQVwbXRJZAQDc3RzCQENcGFyc2VJbnRWYWx1ZQEIBQFyAl84AwMDCQEDaWdzAAYJAAACBQNzdHMFClBvb2xQdXREaXMGCQAAAgUDc3RzBQxQb29sU2h1dGRvd24JAAIBCQCsAgICCEJsb2NrZWQ6CQCkAwEFA3N0cwUBcgEHdGFrZUZlZQEGYW1vdW50BANmZWUJAGsDBQZhbW91bnQFC2ZlZVBlcm1pbGxlBQh0aG91c2FuZAkAlAoCCQBlAgUGYW1vdW50BQNmZWUFA2ZlZQEBbQAEByRtYXRjaDAJAKIIAQkBA21wawADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJwbQAEByRtYXRjaDAJAKIIAQkBBHBtcGsAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACcGQJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAECbW0BAWkEByRtYXRjaDAJAQFtAAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrBgUCcGQDCQABAgUHJG1hdGNoMAIEVW5pdAMJAAACCAUBaQZjYWxsZXIFBHRoaXMGBQJwZAkAAgECC01hdGNoIGVycm9yFQFpAQtjb25zdHJ1Y3RvcgECZmMEAWMJAQJtbQEFAWkDCQAAAgUBYwUBYwkAzAgCCQELU3RyaW5nRW50cnkCCQECZmMABQJmYwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCnNldE1hbmFnZXIBF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BAFjCQECbW0BBQFpAwkAAAIFAWMFAWMEAmNtCQDZBAEFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAIFAmNtBQJjbQkAzAgCCQELU3RyaW5nRW50cnkCCQEEcG1wawAFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY29uZmlybU1hbmFnZXIABAFwCQECcG0ABANocG0DCQEJaXNEZWZpbmVkAQUBcAYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUDaHBtBQNocG0EA2NwbQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAXAGCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFA2NwbQUDY3BtCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNtcGsACQDYBAEJAQV2YWx1ZQEFAXAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBBHBtcGsABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEDcHV0AgRzbGlwCWF1dG9TdGFrZQQHZmFjdENmZwkBA2dmYwAEC3N0YWtpbmdDbnRyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdmYWN0Q2ZnBQ9pZHhGYWN0U3Rha0NudHICCldyIHN0IGFkZHIECHNsaXBDbnRyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdmYWN0Q2ZnBRBpZHhGYWN0U2xpcHBDbnRyAgpXciBzbCBhZGRyAwkAZgIAAAUEc2xpcAkAAgECDldyb25nIHNsaXBwYWdlAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAFlCQECY3AJCQClCAEIBQFpBmNhbGxlcgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAkQMCCAUBaQhwYXltZW50cwABBQRzbGlwBgcAAAIABAllbWl0THBBbXQIBQFlAl8yBAlscEFzc2V0SWQIBQFlAl83BAVzdGF0ZQgFAWUCXzkEBmFtRGlmZggFAWUDXzEwBAZwckRpZmYIBQFlA18xMQQEYW1JZAgFAWUDXzEyBARwcklkCAUBZQNfMTMEAXIJAPwHBAUDZmNhAgRlbWl0CQDMCAIFCWVtaXRMcEFtdAUDbmlsBQNuaWwDCQAAAgUBcgUBcgQCZWwEByRtYXRjaDAFAXIDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQGbGVnYWN5BQckbWF0Y2gwCQD8BwQFBmxlZ2FjeQIEZW1pdAkAzAgCBQllbWl0THBBbXQFA25pbAUDbmlsBQR1bml0AwkAAAIFAmVsBQJlbAQCc2EDCQBmAgUGYW1EaWZmAAAJAPwHBAUIc2xpcENudHICA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQRhbUlkBQZhbURpZmYFA25pbAUDbmlsAwkAAAIFAnNhBQJzYQQCc3ADCQBmAgUGcHJEaWZmAAAJAPwHBAUIc2xpcENudHICA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQRwcklkBQZwckRpZmYFA25pbAUDbmlsAwkAAAIFAnNwBQJzcAQIbHBUcm5zZnIDBQlhdXRvU3Rha2UEAnNzCQD8BwQFC3N0YWtpbmdDbnRyAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQlscEFzc2V0SWQFCWVtaXRMcEFtdAUDbmlsAwkAAAIFAnNzBQJzcwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUJZW1pdExwQW10BQlscEFzc2V0SWQFA25pbAkAzggCBQVzdGF0ZQUIbHBUcm5zZnIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJcHV0T25lVGtuBQthbUFzc2V0UGFydAtwckFzc2V0UGFydAVvdXRMcAhzbGlwcGFnZQlhdXRvU3Rha2UEA2NmZwkBA2dmYwAEC3N0YWtpbmdDbnRyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQNjZmcFD2lkeEZhY3RTdGFrQ250cgIKV3Igc3QgYWRkcgQIc2xpcENudHIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFA2NmZwUQaWR4RmFjdFNsaXBwQ250cgIKV3Igc2wgYWRkcgQHZ3d4Q250cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUDY2ZnBRFpZHhGYWN0R3d4UmV3Q250cgILV3IgZ3d4IGFkZHIEB3Bvb2xDZmcJAQNncGMABARhbUlkCQCRAwIFB3Bvb2xDZmcFCWlkeEFtQXNJZAQEcHJJZAkAkQMCBQdwb29sQ2ZnBQlpZHhQckFzSWQEBWFtRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcG9vbENmZwULaWR4QW10QXNEY20EBXByRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcG9vbENmZwUNaWR4UHJpY2VBc0RjbQQFYWRkb24JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBA2FkYQACAAQLdXNlckFkZHJlc3MDCQAAAgUFYWRkb24JAKUIAQgFAWkGY2FsbGVyCAUBaQxvcmlnaW5DYWxsZXIIBQFpBmNhbGxlcgMDAwMJAGcCAAAFCHNsaXBwYWdlBgkAZwIAAAULYW1Bc3NldFBhcnQGCQBnAgAABQtwckFzc2V0UGFydAYJAGcCAAAFBW91dExwCQACAQIMV3JvbmcgcGFyYW1zAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQILMSBwbW50IGV4cGQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABApwbXRBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQQcGF5bWVudEFtb3VudFJhdwgFA3BtdAZhbW91bnQEDSR0MDI0NTQ5MjQ2MDEJAQd0YWtlRmVlAQUQcGF5bWVudEFtb3VudFJhdwQGcG10QW10CAUNJHQwMjQ1NDkyNDYwMQJfMQQJZmVlQW1vdW50CAUNJHQwMjQ1NDkyNDYwMQJfMgMJAGYCAICt4gQFEHBheW1lbnRBbW91bnRSYXcJAAIBAg1Xcm9uZyBwbXQgYW10BAlhbUJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUEYW1JZAQJcHJCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFBHBySWQEDSR0MDI0NzYxMjUzMzcDCQAAAgUKcG10QXNzZXRJZAUEYW1JZAMDCQBmAgUGcG10QW10BQlhbUJhbGFuY2UGCQBmAgULYW1Bc3NldFBhcnQFBnBtdEFtdAkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJgKBgkAZQIFCWFtQmFsYW5jZQUGcG10QW10BQlwckJhbGFuY2UJAGUCBQZwbXRBbXQFC2FtQXNzZXRQYXJ0BQtwckFzc2V0UGFydAAAAAADCQAAAgUKcG10QXNzZXRJZAUEcHJJZAMDCQBmAgUGcG10QW10BQlwckJhbGFuY2UGCQBmAgULcHJBc3NldFBhcnQFBnBtdEFtdAkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJgKBgUJYW1CYWxhbmNlCQBlAgUJcHJCYWxhbmNlBQZwbXRBbXQAAAAACQBlAgUGcG10QW10BQtwckFzc2V0UGFydAULYW1Bc3NldFBhcnQJAAIBAhB3cm9uZyBwbXRBc3NldElkBAxhbUJhbGFuY2VOb3cIBQ0kdDAyNDc2MTI1MzM3Al8xBAxwckJhbGFuY2VOb3cIBQ0kdDAyNDc2MTI1MzM3Al8yBAx2aXJ0U3dhcEluQW0IBQ0kdDAyNDc2MTI1MzM3Al8zBA12aXJ0U3dhcE91dFByCAUNJHQwMjQ3NjEyNTMzNwJfNAQMdmlydFN3YXBJblByCAUNJHQwMjQ3NjEyNTMzNwJfNQQNdmlydFN3YXBPdXRBbQgFDSR0MDI0NzYxMjUzMzcCXzYEAkQwCQD8BwQFB2d3eENudHICBWNhbGNECQDMCAIJAKQDAQUMYW1CYWxhbmNlTm93CQDMCAIJAKQDAQUMcHJCYWxhbmNlTm93CQDMCAIFAUEJAMwIAgUFQW11bHQJAMwIAgUFRGNvbnYFA25pbAUDbmlsBAJEMQkA/AcEBQdnd3hDbnRyAgVjYWxjRAkAzAgCCQCmAwEJALYCAQkAZQIJAGQCBQxhbUJhbGFuY2VOb3cFDHZpcnRTd2FwSW5BbQUNdmlydFN3YXBPdXRBbQkAzAgCCQCmAwEJALYCAQkAZQIJAGQCBQxwckJhbGFuY2VOb3cFDHZpcnRTd2FwSW5QcgUNdmlydFN3YXBPdXRQcgkAzAgCBQFBCQDMCAIFBUFtdWx0CQDMCAIFBURjb252BQNuaWwFA25pbAQGRDB2c0QxCQECdmQDCQCnAwEJAQNzdHIBBQJEMQkApwMBCQEDc3RyAQUCRDAFCnNsaXBwYWdlNEQDCQAAAgUGRDB2c0QxBQZEMHZzRDEEBmVzdFB1dAkBAmNwCQkApQgBCAUBaQZjYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUEYW1JZAULYW1Bc3NldFBhcnQJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFBHBySWQFC3ByQXNzZXRQYXJ0BQhzbGlwcGFnZQYGBQZwbXRBbXQFCnBtdEFzc2V0SWQEB2VzdGltTFAIBQZlc3RQdXQCXzIECWxwQXNzZXRJZAgFBmVzdFB1dAJfNwQFc3RhdGUIBQZlc3RQdXQCXzkEBmFtRGlmZggFBmVzdFB1dANfMTAEBnByRGlmZggFBmVzdFB1dANfMTEECWxwQ2FsY1JlcwkBA3ZhZAMJALYCAQUHZXN0aW1MUAkAtgIBBQVvdXRMcAkAtgIBBQhzbGlwcGFnZQQJZW1pdExwQW10CQCgAwEIBQlscENhbGNSZXMCXzIEAWUJAPwHBAUDZmNhAgRlbWl0CQDMCAIFCWVtaXRMcEFtdAUDbmlsBQNuaWwDCQAAAgUBZQUBZQQCZWwEByRtYXRjaDAFAWUDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQGbGVnYWN5BQckbWF0Y2gwCQD8BwQFBmxlZ2FjeQIEZW1pdAkAzAgCBQllbWl0THBBbXQFA25pbAUDbmlsBQR1bml0AwkAAAIFAmVsBQJlbAQCc2EDCQBmAgUGYW1EaWZmAAAJAPwHBAUIc2xpcENudHICA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFBGFtSWQFBmFtRGlmZgUDbmlsBQNuaWwDCQAAAgUCc2EFAnNhBAJzcAMJAGYCBQZwckRpZmYAAAkA/AcEBQhzbGlwQ250cgIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUEcHJJZAUGcHJEaWZmBQNuaWwFA25pbAMJAAACBQJzcAUCc3AECGxwVHJuc2ZyAwUJYXV0b1N0YWtlBAJzcwkA/AcEBQtzdGFraW5nQ250cgIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUJbHBBc3NldElkBQllbWl0THBBbXQFA25pbAMJAAACBQJzcwUCc3MFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCWVtaXRMcEFtdAUJbHBBc3NldElkBQNuaWwEEHNlbmRGZWVUb01hdGNoZXIDCQBmAgUJZmVlQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUObWF0Y2hlckFkZHJlc3MFCWZlZUFtb3VudAkA2QQBBQpwbXRBc3NldElkBQNuaWwFA25pbAkAzggCCQDOCAIFBXN0YXRlBQhscFRybnNmcgUQc2VuZEZlZVRvTWF0Y2hlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpwdXRGb3JGcmVlAQdtYXhTbHBnAwkAZgIAAAUHbWF4U2xwZwkAAgECCldyb25nIHNscGcDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEBmVzdFB1dAkBAmNwCQkApQgBCAUBaQZjYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAWkIcGF5bWVudHMAAQUHbWF4U2xwZwcHAAACAAgFBmVzdFB1dAJfOQFpAQNnZXQABAFyCQECY2cBBQFpBAlvdXRBbXRBbXQIBQFyAl8xBAhvdXRQckFtdAgFAXICXzIEBnBtdEFtdAgFAXICXzMECnBtdEFzc2V0SWQIBQFyAl80BAVzdGF0ZQgFAXICXzUEAWIJAPwHBAUDZmNhAgRidXJuCQDMCAIFBnBtdEFtdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpwbXRBc3NldElkBQZwbXRBbXQFA25pbAMJAAACBQFiBQFiBQVzdGF0ZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlnZXRPbmVUa24FCmV4Y2hSZXN1bHQHbm90VXNlZAlvdXRBbW91bnQKb3V0QXNzZXRJZAhzbGlwcGFnZQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECCzEgcG1udCBleHBkBANjZmcJAQNncGMABARscElkCQCRAwIFA2NmZwUJaWR4TFBBc0lkBARhbUlkCQCRAwIFA2NmZwUJaWR4QW1Bc0lkBARwcklkCQCRAwIFA2NmZwUJaWR4UHJBc0lkBAVhbURjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwULaWR4QW10QXNEY20EBXByRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ1pZHhQcmljZUFzRGNtBANzdHMJAJEDAgUDY2ZnBQlpZHhQb29sU3QEB2ZhY3RDZmcJAQNnZmMABAdnd3hDbnRyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdmYWN0Q2ZnBRFpZHhGYWN0R3d4UmV3Q250cgIKV3Igc2wgYWRkcgQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBWFkZG9uCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQNhZGEAAgAEC3VzZXJBZGRyZXNzAwkAAAIFBWFkZG9uCQClCAEIBQFpBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyCAUBaQZjYWxsZXIEBnR4SWQ1OAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBApwbXRBc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEBnBtdEFtdAgFA3BtdAZhbW91bnQDCQBmAgCAlOvcAwUGcG10QW10CQACAQINTWluIHBtdCAxMCBMUAMDAwkAZgIAAAUIc2xpcHBhZ2UGCQBmAgAABQpleGNoUmVzdWx0BgkAZgIAAAUJb3V0QW1vdW50CQACAQIMV3JvbmcgcGFyYW1zAwkBAiE9AgUEbHBJZAkA2AQBBQpwbXRBc3NldElkCQACAQIIV3JvbmcgTFAEAXIJAQNlZ28ECQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQUKcG10QXNzZXRJZAUGcG10QW10CAUBaQZjYWxsZXIECmVzdGltQW1BbXQIBQFyAl8xBAplc3RpbVByQW10CAUBcgJfMgQJYW1CYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFBGFtSWQECXByQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQRwcklkBA0kdDAzMDI3NTMwNzM1AwkAAAIFCm91dEFzc2V0SWQFBGFtSWQJAJkKBwkAZQIFCWFtQmFsYW5jZQUKZXN0aW1BbUFtdAkAZQIFCXByQmFsYW5jZQUKZXN0aW1QckFtdAUKZXhjaFJlc3VsdAUKZXN0aW1QckFtdAAAAAAJAGQCBQplc3RpbUFtQW10BQpleGNoUmVzdWx0AwkAAAIFCm91dEFzc2V0SWQFBHBySWQJAJkKBwkAZQIFCWFtQmFsYW5jZQUKZXN0aW1BbUFtdAkAZQIFCXByQmFsYW5jZQUKZXN0aW1QckFtdAAAAAAFCmV4Y2hSZXN1bHQFCmVzdGltQW1BbXQJAGQCBQplc3RpbVByQW10BQpleGNoUmVzdWx0CQACAQIQd3Jvbmcgb3V0QXNzZXRJZAQMYW1CYWxhbmNlTm93CAUNJHQwMzAyNzUzMDczNQJfMQQMcHJCYWxhbmNlTm93CAUNJHQwMzAyNzUzMDczNQJfMgQMdmlydFN3YXBJbkFtCAUNJHQwMzAyNzUzMDczNQJfMwQNdmlydFN3YXBPdXRQcggFDSR0MDMwMjc1MzA3MzUCXzQEDHZpcnRTd2FwSW5QcggFDSR0MDMwMjc1MzA3MzUCXzUEDXZpcnRTd2FwT3V0QW0IBQ0kdDAzMDI3NTMwNzM1Al82BAt0b3RhbEdldFJhdwgFDSR0MDMwMjc1MzA3MzUCXzcDAwkAZgIAAAUMdmlydFN3YXBJbkFtBgkAZgIAAAUMdmlydFN3YXBJblByCQACAQIKV3JvbmcgY2FsYwQCRDAJAPwHBAUHZ3d4Q250cgIFY2FsY0QJAMwIAgkApAMBBQxhbUJhbGFuY2VOb3cJAMwIAgkApAMBBQxwckJhbGFuY2VOb3cJAMwIAgUBQQkAzAgCBQVBbXVsdAkAzAgCBQVEY29udgUDbmlsBQNuaWwEAkQxCQD8BwQFB2d3eENudHICBWNhbGNECQDMCAIJAKQDAQkAZAIJAGUCBQxhbUJhbGFuY2VOb3cFDHZpcnRTd2FwSW5BbQUNdmlydFN3YXBPdXRBbQkAzAgCCQCkAwEJAGUCCQBkAgUMcHJCYWxhbmNlTm93BQ12aXJ0U3dhcE91dFByBQx2aXJ0U3dhcEluUHIJAMwIAgUBQQkAzAgCBQVBbXVsdAkAzAgCBQVEY29udgUDbmlsBQNuaWwEBkQwdnNEMQkBAnZkAwkApwMBCQEDc3RyAQUCRDEJAKcDAQkBA3N0cgEFAkQwBQpzbGlwcGFnZTREAwkAAAIFBkQwdnNEMQUGRDB2c0QxBAh0b3RhbEdldAgJAQd0YWtlRmVlAQULdG90YWxHZXRSYXcCXzEECGZpbmFsUmVzCQEDdmFkAwkAtgIBBQh0b3RhbEdldAkAtgIBBQlvdXRBbW91bnQJALYCAQUIc2xpcHBhZ2UDCQAAAgUIZmluYWxSZXMFCGZpbmFsUmVzBA0kdDAzMTQ4MjMxNTg2AwkAAAIFCm91dEFzc2V0SWQFBGFtSWQJAJQKAgkAoAMBCAUIZmluYWxSZXMCXzIAAAkAlAoCAAAJAKADAQgFCGZpbmFsUmVzAl8yBAVvdXRBbQgFDSR0MDMxNDgyMzE1ODYCXzEEBW91dFByCAUNJHQwMzE0ODIzMTU4NgJfMgQLdG90YWxBbW91bnQJAGQCBQVvdXRBbQUFb3V0UHIECWZlZUFtb3VudAkAZQIFC3RvdGFsR2V0UmF3BQh0b3RhbEdldAQRb3V0QXNzZXRJZE9yV2F2ZXMDCQAAAgUKb3V0QXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUKb3V0QXNzZXRJZAQQc2VuZEZlZVRvTWF0Y2hlcgMJAGYCBQlmZWVBbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5tYXRjaGVyQWRkcmVzcwUJZmVlQW1vdW50BRFvdXRBc3NldElkT3JXYXZlcwUDbmlsBQNuaWwECGN1clByWDE4CQEEY3BiaQIJAQJ0MQIFCXByQmFsYW5jZQUFcHJEY20JAQJ0MQIFCWFtQmFsYW5jZQUFYW1EY20EBWN1clByCQECZjECBQhjdXJQclgxOAUGc2NhbGU4BAVzdGF0ZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwULdG90YWxBbW91bnQFEW91dEFzc2V0SWRPcldhdmVzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNnYXUCCQClCAEFC3VzZXJBZGRyZXNzBQZ0eElkNTgJARFkYXRhR2V0QWN0aW9uSW5mbwYFBW91dEFtBQVvdXRQcgUGcG10QW10BQVjdXJQcgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBsAAUFY3VyUHIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwaAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFBWN1clByBQNuaWwDCQAAAgUFc3RhdGUFBXN0YXRlBARidXJuCQD8BwQFA2ZjYQIEYnVybgkAzAgCBQZwbXRBbXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUGcG10QW10BQNuaWwDCQAAAgUEYnVybgUEYnVybgkAzggCBQVzdGF0ZQUQc2VuZEZlZVRvTWF0Y2hlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlnZXROb0xlc3MCEm5vTGVzc1RoZW5BbXRBc3NldBRub0xlc3NUaGVuUHJpY2VBc3NldAQBcgkBAmNnAQUBaQQIb3V0QW1BbXQIBQFyAl8xBAhvdXRQckFtdAgFAXICXzIEBnBtdEFtdAgFAXICXzMECnBtdEFzc2V0SWQIBQFyAl80BAVzdGF0ZQgFAXICXzUDCQBmAgUSbm9MZXNzVGhlbkFtdEFzc2V0BQhvdXRBbUFtdAkAAgEJAKwCAgkArAICCQCsAgICCUZhaWxlZDogIAkApAMBBQhvdXRBbUFtdAIDIDwgCQCkAwEFEm5vTGVzc1RoZW5BbXRBc3NldAMJAGYCBRRub0xlc3NUaGVuUHJpY2VBc3NldAUIb3V0UHJBbXQJAAIBCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQhvdXRQckFtdAIDIDwgCQCkAwEFFG5vTGVzc1RoZW5QcmljZUFzc2V0BBRidXJuTFBBc3NldE9uRmFjdG9yeQkA/AcEBQNmY2ECBGJ1cm4JAMwIAgUGcG10QW10BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFBnBtdEFtdAUDbmlsAwkAAAIFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BRRidXJuTFBBc3NldE9uRmFjdG9yeQUFc3RhdGUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENdW5zdGFrZUFuZEdldAEGYW1vdW50BA1jaGVja1BheW1lbnRzAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUNY2hlY2tQYXltZW50cwUNY2hlY2tQYXltZW50cwQDY2ZnCQEDZ3BjAAQKZmFjdG9yeUNmZwkBA2dmYwAECWxwQXNzZXRJZAkA2QQBCQCRAwIFA2NmZwUJaWR4TFBBc0lkBAdzdGFraW5nCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQpmYWN0b3J5Q2ZnBQ9pZHhGYWN0U3Rha0NudHICCldyIHN0IGFkZHIECnVuc3Rha2VJbnYJAPwHBAUHc3Rha2luZwIHdW5zdGFrZQkAzAgCCQDYBAEFCWxwQXNzZXRJZAkAzAgCBQZhbW91bnQFA25pbAUDbmlsAwkAAAIFCnVuc3Rha2VJbnYFCnVuc3Rha2VJbnYEAXIJAQNlZ28ECQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQUJbHBBc3NldElkBQZhbW91bnQIBQFpBmNhbGxlcgQDc3RzCQENcGFyc2VJbnRWYWx1ZQEIBQFyAl85BAVzdGF0ZQgFAXIDXzEwBAF2AwMJAQNpZ3MABgkAAAIFA3N0cwUMUG9vbFNodXRkb3duCQACAQkArAICAglCbG9ja2VkOiAJAKQDAQUDc3RzBgMJAAACBQF2BQF2BAVidXJuQQkA/AcEBQNmY2ECBGJ1cm4JAMwIAgUGYW1vdW50BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCWxwQXNzZXRJZAUGYW1vdW50BQNuaWwDCQAAAgUFYnVybkEFBWJ1cm5BBQVzdGF0ZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhhY3RpdmF0ZQIIYW10QXNTdHIHcHJBc1N0cgMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyCQClCAEFA2ZjYQkAAgECBmRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQAFCGFtdEFzU3RyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJwYQAFB3ByQXNTdHIFA25pbAIHc3VjY2VzcwFpAQRzZXRTAgFrAXYDCQECIT0CCQClCAEIBQFpBmNhbGxlcgkBBHN0cmYCBQR0aGlzCQEDYWRhAAUCcGQJAMwIAgkBC1N0cmluZ0VudHJ5AgUBawUBdgUDbmlsAWkBBHNldEkCAWsBdgMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyCQEEc3RyZgIFBHRoaXMJAQNhZGEABQJwZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBawUBdgUDbmlsAWkBHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkACQCUCgIFA25pbAkBA2dwYwABaQEcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQEHYXNzZXRJZAkAlAoCBQNuaWwJAQ1nZXRBY2NCYWxhbmNlAQUHYXNzZXRJZAFpARljYWxjUHJpY2VzV3JhcHBlclJFQURPTkxZAwVhbUFtdAVwckFtdAVscEFtdAQCcHIJAQpjYWxjUHJpY2VzAwUFYW1BbXQFBXByQW10BQVscEFtdAkAlAoCBQNuaWwJAMwIAgkApgMBCQCRAwIFAnByAAAJAMwIAgkApgMBCQCRAwIFAnByAAEJAMwIAgkApgMBCQCRAwIFAnByAAIFA25pbAFpARZmcm9tWDE4V3JhcHBlclJFQURPTkxZAgN2YWwMcmVzU2NhbGVNdWx0CQCUCgIFA25pbAkBAmYxAgkApwMBBQN2YWwFDHJlc1NjYWxlTXVsdAFpARR0b1gxOFdyYXBwZXJSRUFET05MWQIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQCUCgIFA25pbAkApgMBCQECdDECBQdvcmlnVmFsBQ1vcmlnU2NhbGVNdWx0AWkBHmNhbGNQcmljZUJpZ0ludFdyYXBwZXJSRUFET05MWQIIcHJBbXRYMTgIYW1BbXRYMTgJAJQKAgUDbmlsCQCmAwEJAQRjcGJpAgkApwMBBQhwckFtdFgxOAkApwMBBQhhbUFtdFgxOAFpASNlc3RpbWF0ZVB1dE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQkGdHhJZDU4CHNsaXBwYWdlB2luQW1BbXQGaW5BbUlkB2luUHJBbXQGaW5QcklkB3VzckFkZHIGaXNFdmFsBmVtaXRMcAkAlAoCBQNuaWwJAQNlcG8MBQZ0eElkNTgFCHNsaXBwYWdlBQdpbkFtQW10BQZpbkFtSWQFB2luUHJBbXQFBmluUHJJZAUHdXNyQWRkcgUGaXNFdmFsBQZlbWl0THAHAAACAAFpASNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQQGdHhJZDU4B3BtdEFzSWQIcG10THBBbXQHdXNyQWRkcgQBcgkBA2VnbwQFBnR4SWQ1OAUHcG10QXNJZAUIcG10THBBbXQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3VzckFkZHIJAJQKAgUDbmlsCQCcCgoIBQFyAl8xCAUBcgJfMggFAXICXzMIBQFyAl80CAUBcgJfNQgFAXICXzYIBQFyAl83CQCmAwEIBQFyAl84CAUBcgJfOQgFAXIDXzEwAQJ0eAEGdmVyaWZ5AAQPdGFyZ2V0UHVibGljS2V5BAckbWF0Y2gwCQEBbQADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIFT3JkZXIEBW9yZGVyBQckbWF0Y2gwBAptYXRjaGVyUHViCQECbXAABApvcmRlclZhbGlkCQEDbW9hAQUFb3JkZXIEC3NlbmRlclZhbGlkCQD0AwMIBQVvcmRlcglib2R5Qnl0ZXMJAJEDAggFBW9yZGVyBnByb29mcwAACAUFb3JkZXIPc2VuZGVyUHVibGljS2V5BAxtYXRjaGVyVmFsaWQJAPQDAwgFBW9yZGVyCWJvZHlCeXRlcwkAkQMCCAUFb3JkZXIGcHJvb2ZzAAEFCm1hdGNoZXJQdWIDAwMFCm9yZGVyVmFsaWQFC3NlbmRlclZhbGlkBwUMbWF0Y2hlclZhbGlkBwYJAQN0b2UDBQpvcmRlclZhbGlkBQtzZW5kZXJWYWxpZAUMbWF0Y2hlclZhbGlkAwkAAQIFByRtYXRjaDACFFNldFNjcmlwdFRyYW5zYWN0aW9uBAFzBQckbWF0Y2gwBAduZXdIYXNoCQD2AwEJAQV2YWx1ZQEIBQFzBnNjcmlwdAQLYWxsb3dlZEhhc2gJANsEAQkBBXZhbHVlAQkAnQgCBQNmY2EJARxrZXlBbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAAQLY3VycmVudEhhc2gJAPEHAQUEdGhpcwMDCQAAAgULYWxsb3dlZEhhc2gFB25ld0hhc2gJAQIhPQIFC2N1cnJlbnRIYXNoBQduZXdIYXNoBwYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUPdGFyZ2V0UHVibGljS2V5Ex09sw==", "height": 2205845, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DNJeRDrtfw4VNKw6gQ22etswyhAQroAaZVgeCxQRHHNV Next: tPf4ksgoCwRFPeNbEni32JhpqRVWJhpTG8KG5W8MtJu Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
121121
122122
123123 func aps () = "%s__shutdown"
124+
125+
126+func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
124127
125128
126129 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
336339 else calcLpAmt
337340 let amDiff = (inAmAmt - calcAmAssetPmt)
338341 let prDiff = (inPrAmt - calcPrAssetPmt)
339- let $t01551715862 = if (if (isOneAsset)
342+ let $t01558715932 = if (if (isOneAsset)
340343 then (pmtId == amIdStr)
341344 else false)
342345 then $Tuple2(pmtAmt, 0)
345348 else false)
346349 then $Tuple2(0, pmtAmt)
347350 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
348- let writeAmAmt = $t01551715862._1
349- let writePrAmt = $t01551715862._2
351+ let writeAmAmt = $t01558715932._1
352+ let writePrAmt = $t01558715932._2
350353 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
351354 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
352355 }
607610 let pmt = value(i.payments[0])
608611 let pmtAssetId = toBase58String(value(pmt.assetId))
609612 let paymentAmountRaw = pmt.amount
610- let $t02447924531 = takeFee(paymentAmountRaw)
611- let pmtAmt = $t02447924531._1
612- let feeAmount = $t02447924531._2
613- if (if (if ((amAssetPart > pmtAmt))
614- then true
615- else (prAssetPart > pmtAmt))
616- then true
617- else (10000000 > paymentAmountRaw))
613+ let $t02454924601 = takeFee(paymentAmountRaw)
614+ let pmtAmt = $t02454924601._1
615+ let feeAmount = $t02454924601._2
616+ if ((10000000 > paymentAmountRaw))
618617 then throw("Wrong pmt amt")
619618 else {
620619 let amBalance = getAccBalance(amId)
621620 let prBalance = getAccBalance(prId)
622- let $t02473825118 = if ((pmtAssetId == amId))
623- then $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
621+ let $t02476125337 = if ((pmtAssetId == amId))
622+ then if (if ((pmtAmt > amBalance))
623+ then true
624+ else (amAssetPart > pmtAmt))
625+ then throw("invalid payment amount")
626+ else $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
624627 else if ((pmtAssetId == prId))
625- then $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
628+ then if (if ((pmtAmt > prBalance))
629+ then true
630+ else (prAssetPart > pmtAmt))
631+ then throw("invalid payment amount")
632+ else $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
626633 else throw("wrong pmtAssetId")
627- let amBalanceNow = $t02473825118._1
628- let prBalanceNow = $t02473825118._2
629- let virtSwapInAm = $t02473825118._3
630- let virtSwapOutPr = $t02473825118._4
631- let virtSwapInPr = $t02473825118._5
632- let virtSwapOutAm = $t02473825118._6
634+ let amBalanceNow = $t02476125337._1
635+ let prBalanceNow = $t02476125337._2
636+ let virtSwapInAm = $t02476125337._3
637+ let virtSwapOutPr = $t02476125337._4
638+ let virtSwapInPr = $t02476125337._5
639+ let virtSwapOutAm = $t02476125337._6
633640 let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
634641 let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
635642 let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
757764 let estimPrAmt = r._2
758765 let amBalance = getAccBalance(amId)
759766 let prBalance = getAccBalance(prId)
760- let $t03005630513 = if ((outAssetId == amId))
767+ let $t03027530735 = if ((outAssetId == amId))
761768 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
762769 else if ((outAssetId == prId))
763770 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
764771 else throw("wrong outAssetId")
765- let amBalanceNow = $t03005630513._1
766- let prBalanceNow = $t03005630513._2
767- let virtSwapInAm = $t03005630513._3
768- let virtSwapOutPr = $t03005630513._4
769- let virtSwapInPr = $t03005630513._5
770- let virtSwapOutAm = $t03005630513._6
771- let totalGet = $t03005630513._7
772+ let amBalanceNow = $t03027530735._1
773+ let prBalanceNow = $t03027530735._2
774+ let virtSwapInAm = $t03027530735._3
775+ let virtSwapOutPr = $t03027530735._4
776+ let virtSwapInPr = $t03027530735._5
777+ let virtSwapOutAm = $t03027530735._6
778+ let totalGetRaw = $t03027530735._7
772779 if (if ((0 > virtSwapInAm))
773780 then true
774781 else (0 > virtSwapInPr))
779786 let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
780787 if ((D0vsD1 == D0vsD1))
781788 then {
789+ let totalGet = takeFee(totalGetRaw)._1
782790 let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
783791 if ((finalRes == finalRes))
784792 then {
785- let $t03121831322 = if ((outAssetId == amId))
793+ let $t03148231586 = if ((outAssetId == amId))
786794 then $Tuple2(toInt(finalRes._2), 0)
787795 else $Tuple2(0, toInt(finalRes._2))
788- let outAm = $t03121831322._1
789- let outPr = $t03121831322._2
790- let totalAmountRaw = (outAm + outPr)
791- let $t03136231417 = takeFee(totalAmountRaw)
792- let totalAmount = $t03136231417._1
793- let feeAmount = $t03136231417._2
796+ let outAm = $t03148231586._1
797+ let outPr = $t03148231586._2
798+ let totalAmount = (outAm + outPr)
799+ let feeAmount = (totalGetRaw - totalGet)
794800 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
795801 then unit
796802 else fromBase58String(outAssetId)
945951
946952
947953 @Verifier(tx)
948-func verify () = match tx {
949- case order: Order =>
950- let mtchPub = mp()
951- let orV = moa(order)
952- let sndrV = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
953- let mtchV = sigVerify(order.bodyBytes, order.proofs[1], mtchPub)
954- if (if (if (orV)
955- then sndrV
956- else false)
957- then mtchV
958- else false)
959- then true
960- else toe(orV, sndrV, mtchV)
961- case _ =>
962- let targetPublicKey = match m() {
963- case pk: ByteVector =>
964- pk
965- case _: Unit =>
966- tx.senderPublicKey
967- case _ =>
968- throw("Match error")
969- }
970- sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
971-}
954+func verify () = {
955+ let targetPublicKey = match m() {
956+ case pk: ByteVector =>
957+ pk
958+ case _: Unit =>
959+ tx.senderPublicKey
960+ case _ =>
961+ throw("Match error")
962+ }
963+ match tx {
964+ case order: Order =>
965+ let matcherPub = mp()
966+ let orderValid = moa(order)
967+ let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
968+ let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
969+ if (if (if (orderValid)
970+ then senderValid
971+ else false)
972+ then matcherValid
973+ else false)
974+ then true
975+ else toe(orderValid, senderValid, matcherValid)
976+ case s: SetScriptTransaction =>
977+ let newHash = blake2b256(value(s.script))
978+ let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
979+ let currentHash = scriptHash(this)
980+ if (if ((allowedHash == newHash))
981+ then (currentHash != newHash)
982+ else false)
983+ then true
984+ else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
985+ case _ =>
986+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
987+ }
988+ }
972989
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
99
1010 let thousand = 1000
1111
1212 let zeroBigInt = toBigInt(0)
1313
1414 let oneBigInt = toBigInt(1)
1515
1616 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1717
1818 let Amult = "100"
1919
2020 let Dconv = "1"
2121
2222 let SEP = "__"
2323
2424 let EMPTY = ""
2525
2626 let PoolActive = 1
2727
2828 let PoolPutDis = 2
2929
3030 let PoolMatcherDis = 3
3131
3232 let PoolShutdown = 4
3333
3434 let idxPoolAddress = 1
3535
3636 let idxPoolSt = 2
3737
3838 let idxLPAsId = 3
3939
4040 let idxAmAsId = 4
4141
4242 let idxPrAsId = 5
4343
4444 let idxAmtAsDcm = 6
4545
4646 let idxPriceAsDcm = 7
4747
4848 let idxIAmtAsId = 8
4949
5050 let idxIPriceAsId = 9
5151
5252 let idxFactStakCntr = 1
5353
5454 let idxFactSlippCntr = 7
5555
5656 let idxFactGwxRewCntr = 10
5757
5858 let feePermilleDefault = 0
5959
6060 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6161
6262
6363 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6464
6565
6666 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6767
6868
6969 func abs (val) = if ((zeroBigInt > val))
7070 then -(val)
7171 else val
7272
7373
7474 func fc () = "%s__factoryContract"
7575
7676
7777 func mpk () = "%s__managerPublicKey"
7878
7979
8080 func pmpk () = "%s__pendingManagerPublicKey"
8181
8282
8383 func pl () = "%s%s__price__last"
8484
8585
8686 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
8787
8888
8989 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
9090
9191
9292 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
9393
9494
9595 func aa () = "%s__amountAsset"
9696
9797
9898 func pa () = "%s__priceAsset"
9999
100100
101101 func amp () = "%s__amp"
102102
103103
104104 func ada () = "%s__addonAddr"
105105
106106
107107 let keyFeePermille = "%s__feePermille"
108108
109109 let feePermille = valueOrElse(getInteger(this, keyFeePermille), feePermilleDefault)
110110
111111 func fcfg () = "%s__factoryConfig"
112112
113113
114114 func mtpk () = "%s%s__matcher__publicKey"
115115
116116
117117 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
118118
119119
120120 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
121121
122122
123123 func aps () = "%s__shutdown"
124+
125+
126+func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
124127
125128
126129 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
127130
128131
129132 func str (val) = match val {
130133 case valStr: String =>
131134 valStr
132135 case _ =>
133136 throw("fail cast to String")
134137 }
135138
136139
137140 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
138141
139142
140143 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
141144
142145
143146 let fca = addressFromStringValue(strf(this, fc()))
144147
145148 let A = strf(this, amp())
146149
147150 func igs () = valueOrElse(getBoolean(fca, aps()), false)
148151
149152
150153 func mp () = fromBase58String(strf(fca, mtpk()))
151154
152155
153156 let matcherAddress = addressFromPublicKey(mp())
154157
155158 func gpc () = {
156159 let amtAs = strf(this, aa())
157160 let priceAs = strf(this, pa())
158161 let iPriceAs = intf(fca, mba(priceAs))
159162 let iAmtAs = intf(fca, mba(amtAs))
160163 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
161164 }
162165
163166
164167 func gfc () = split(strf(fca, fcfg()), SEP)
165168
166169
167170 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
168171
169172
170173 func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
171174
172175
173176 func getAccBalance (assetId) = if ((assetId == "WAVES"))
174177 then wavesBalance(this).available
175178 else assetBalance(this, fromBase58String(assetId))
176179
177180
178181 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
179182
180183
181184 func vad (A1,A2,slippage) = {
182185 let diff = fraction((A1 - A2), scale8BigInt, A2)
183186 let pass = ((slippage - abs(diff)) > zeroBigInt)
184187 if (!(pass))
185188 then throw(("Big slpg: " + toString(diff)))
186189 else $Tuple2(pass, min([A1, A2]))
187190 }
188191
189192
190193 func vd (D1,D0,slpg) = {
191194 let diff = fraction(D0, scale8BigInt, D1)
192195 let fail = (slpg > diff)
193196 if (if (fail)
194197 then true
195198 else (D0 > D1))
196199 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
197200 else fail
198201 }
199202
200203
201204 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
202205 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
203206 let prAsAmtX18 = t1(prAmt, prAssetDcm)
204207 cpbi(prAsAmtX18, amtAsAmtX18)
205208 }
206209
207210
208211 func calcPrices (amAmt,prAmt,lpAmt) = {
209212 let cfg = gpc()
210213 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
211214 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
212215 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
213216 let amAmtX18 = t1(amAmt, amtAsDcm)
214217 let prAmtX18 = t1(prAmt, prAsDcm)
215218 let lpAmtX18 = t1(lpAmt, scale8)
216219 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
217220 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
218221 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
219222 }
220223
221224
222225 func calculatePrices (amAmt,prAmt,lpAmt) = {
223226 let p = calcPrices(amAmt, prAmt, lpAmt)
224227 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
225228 }
226229
227230
228231 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
229232 let cfg = gpc()
230233 let lpId = cfg[idxLPAsId]
231234 let amId = cfg[idxAmAsId]
232235 let prId = cfg[idxPrAsId]
233236 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
234237 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
235238 let sts = cfg[idxPoolSt]
236239 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
237240 if ((lpId != pmtAssetId))
238241 then throw("Wrong pmt asset")
239242 else {
240243 let amBalance = getAccBalance(amId)
241244 let amBalanceX18 = t1(amBalance, amDcm)
242245 let prBalance = getAccBalance(prId)
243246 let prBalanceX18 = t1(prBalance, prDcm)
244247 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
245248 let curPrice = f1(curPriceX18, scale8)
246249 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
247250 let lpEmissX18 = t1(lpEmiss, scale8)
248251 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
249252 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
250253 let outAmAmt = f1(outAmAmtX18, amDcm)
251254 let outPrAmt = f1(outPrAmtX18, prDcm)
252255 let state = if ((txId58 == ""))
253256 then nil
254257 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
255258 then unit
256259 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
257260 then unit
258261 else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
259262 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
260263 }
261264 }
262265
263266
264267 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,pmtAmt,pmtId) = {
265268 let cfg = gpc()
266269 let lpId = fromBase58String(cfg[idxLPAsId])
267270 let amIdStr = cfg[idxAmAsId]
268271 let prIdStr = cfg[idxPrAsId]
269272 let inAmIdStr = cfg[idxIAmtAsId]
270273 let inPrIdStr = cfg[idxIPriceAsId]
271274 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
272275 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
273276 let sts = cfg[idxPoolSt]
274277 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
275278 let amBalance = if (isEval)
276279 then getAccBalance(amIdStr)
277280 else if (if (isOneAsset)
278281 then (pmtId == amIdStr)
279282 else false)
280283 then (getAccBalance(amIdStr) - pmtAmt)
281284 else if (isOneAsset)
282285 then getAccBalance(amIdStr)
283286 else (getAccBalance(amIdStr) - inAmAmt)
284287 let prBalance = if (isEval)
285288 then getAccBalance(prIdStr)
286289 else if (if (isOneAsset)
287290 then (pmtId == prIdStr)
288291 else false)
289292 then (getAccBalance(prIdStr) - pmtAmt)
290293 else if (isOneAsset)
291294 then getAccBalance(prIdStr)
292295 else (getAccBalance(prIdStr) - inPrAmt)
293296 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
294297 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
295298 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
296299 let amBalanceX18 = t1(amBalance, amtDcm)
297300 let prBalanceX18 = t1(prBalance, priceDcm)
298301 let r = if ((lpEm == 0))
299302 then {
300303 let curPriceX18 = zeroBigInt
301304 let slippageX18 = zeroBigInt
302305 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
303306 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
304307 }
305308 else {
306309 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
307310 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
308311 let slippageX18 = t1(slippage, scale8)
309312 if (if ((curPriceX18 != zeroBigInt))
310313 then (slippageRealX18 > slippageX18)
311314 else false)
312315 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
313316 else {
314317 let lpEmissionX18 = t1(lpEm, scale8)
315318 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
316319 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
317320 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
318321 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
319322 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
320323 let expAmtAssetAmtX18 = expectedAmts._1
321324 let expPriceAssetAmtX18 = expectedAmts._2
322325 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
323326 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
324327 }
325328 }
326329 let calcLpAmt = r._1
327330 let calcAmAssetPmt = r._2
328331 let calcPrAssetPmt = r._3
329332 let curPrice = f1(r._4, scale8)
330333 let slippageCalc = f1(r._5, scale8)
331334 if ((0 >= calcLpAmt))
332335 then throw("LP <= 0")
333336 else {
334337 let emitLpAmt = if (!(emitLp))
335338 then 0
336339 else calcLpAmt
337340 let amDiff = (inAmAmt - calcAmAssetPmt)
338341 let prDiff = (inPrAmt - calcPrAssetPmt)
339- let $t01551715862 = if (if (isOneAsset)
342+ let $t01558715932 = if (if (isOneAsset)
340343 then (pmtId == amIdStr)
341344 else false)
342345 then $Tuple2(pmtAmt, 0)
343346 else if (if (isOneAsset)
344347 then (pmtId == prIdStr)
345348 else false)
346349 then $Tuple2(0, pmtAmt)
347350 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
348- let writeAmAmt = $t01551715862._1
349- let writePrAmt = $t01551715862._2
351+ let writeAmAmt = $t01558715932._1
352+ let writePrAmt = $t01558715932._2
350353 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
351354 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
352355 }
353356 }
354357
355358
356359 func moa (order) = {
357360 let cfg = gpc()
358361 let amtAsId = cfg[idxAmAsId]
359362 let prAsId = cfg[idxPrAsId]
360363 let sts = parseIntValue(cfg[idxPoolSt])
361364 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
362365 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
363366 let accAmtAsBalance = getAccBalance(amtAsId)
364367 let accPrAsBalance = getAccBalance(prAsId)
365368 let curPriceX18 = if ((order.orderType == Buy))
366369 then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
367370 else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
368371 let curPrice = f1(curPriceX18, scale8)
369372 if (if (if (igs())
370373 then true
371374 else (sts == PoolMatcherDis))
372375 then true
373376 else (sts == PoolShutdown))
374377 then throw("Admin blocked")
375378 else {
376379 let orAmtAsset = order.assetPair.amountAsset
377380 let orAmtAsStr = if ((orAmtAsset == unit))
378381 then "WAVES"
379382 else toBase58String(value(orAmtAsset))
380383 let orPrAsset = order.assetPair.priceAsset
381384 let orPrAsStr = if ((orPrAsset == unit))
382385 then "WAVES"
383386 else toBase58String(value(orPrAsset))
384387 if (if ((orAmtAsStr != amtAsId))
385388 then true
386389 else (orPrAsStr != prAsId))
387390 then throw("Wr assets")
388391 else {
389392 let orderPrice = order.price
390393 let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
391394 let castOrderPrice = ts(orderPrice, scale8, priceDcm)
392395 let isOrderPriceValid = if ((order.orderType == Buy))
393396 then (curPrice >= castOrderPrice)
394397 else (castOrderPrice >= curPrice)
395398 true
396399 }
397400 }
398401 }
399402
400403
401404 func cg (i) = if ((size(i.payments) != 1))
402405 then throw("1 pmnt exp")
403406 else {
404407 let pmt = value(i.payments[0])
405408 let pmtAssetId = value(pmt.assetId)
406409 let pmtAmt = pmt.amount
407410 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
408411 let outAmAmt = r._1
409412 let outPrAmt = r._2
410413 let sts = parseIntValue(r._9)
411414 let state = r._10
412415 if (if (igs())
413416 then true
414417 else (sts == PoolShutdown))
415418 then throw(("Admin blocked: " + toString(sts)))
416419 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
417420 }
418421
419422
420423 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,pmtAmt,pmtId) = {
421424 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, pmtAmt, pmtId)
422425 let sts = parseIntValue(r._8)
423426 if (if (if (igs())
424427 then true
425428 else (sts == PoolPutDis))
426429 then true
427430 else (sts == PoolShutdown))
428431 then throw(("Blocked:" + toString(sts)))
429432 else r
430433 }
431434
432435
433436 func takeFee (amount) = {
434437 let fee = fraction(amount, feePermille, thousand)
435438 $Tuple2((amount - fee), fee)
436439 }
437440
438441
439442 func m () = match getString(mpk()) {
440443 case s: String =>
441444 fromBase58String(s)
442445 case _: Unit =>
443446 unit
444447 case _ =>
445448 throw("Match error")
446449 }
447450
448451
449452 func pm () = match getString(pmpk()) {
450453 case s: String =>
451454 fromBase58String(s)
452455 case _: Unit =>
453456 unit
454457 case _ =>
455458 throw("Match error")
456459 }
457460
458461
459462 let pd = throw("Permission denied")
460463
461464 func mm (i) = match m() {
462465 case pk: ByteVector =>
463466 if ((i.callerPublicKey == pk))
464467 then true
465468 else pd
466469 case _: Unit =>
467470 if ((i.caller == this))
468471 then true
469472 else pd
470473 case _ =>
471474 throw("Match error")
472475 }
473476
474477
475478 @Callable(i)
476479 func constructor (fc) = {
477480 let c = mm(i)
478481 if ((c == c))
479482 then [StringEntry(fc(), fc)]
480483 else throw("Strict value is not equal to itself.")
481484 }
482485
483486
484487
485488 @Callable(i)
486489 func setManager (pendingManagerPublicKey) = {
487490 let c = mm(i)
488491 if ((c == c))
489492 then {
490493 let cm = fromBase58String(pendingManagerPublicKey)
491494 if ((cm == cm))
492495 then [StringEntry(pmpk(), pendingManagerPublicKey)]
493496 else throw("Strict value is not equal to itself.")
494497 }
495498 else throw("Strict value is not equal to itself.")
496499 }
497500
498501
499502
500503 @Callable(i)
501504 func confirmManager () = {
502505 let p = pm()
503506 let hpm = if (isDefined(p))
504507 then true
505508 else throw("No pending manager")
506509 if ((hpm == hpm))
507510 then {
508511 let cpm = if ((i.callerPublicKey == value(p)))
509512 then true
510513 else throw("You are not pending manager")
511514 if ((cpm == cpm))
512515 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
513516 else throw("Strict value is not equal to itself.")
514517 }
515518 else throw("Strict value is not equal to itself.")
516519 }
517520
518521
519522
520523 @Callable(i)
521524 func put (slip,autoStake) = {
522525 let factCfg = gfc()
523526 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
524527 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
525528 if ((0 > slip))
526529 then throw("Wrong slippage")
527530 else if ((size(i.payments) != 2))
528531 then throw("2 pmnts expd")
529532 else {
530533 let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, 0, "")
531534 let emitLpAmt = e._2
532535 let lpAssetId = e._7
533536 let state = e._9
534537 let amDiff = e._10
535538 let prDiff = e._11
536539 let amId = e._12
537540 let prId = e._13
538541 let r = invoke(fca, "emit", [emitLpAmt], nil)
539542 if ((r == r))
540543 then {
541544 let el = match r {
542545 case legacy: Address =>
543546 invoke(legacy, "emit", [emitLpAmt], nil)
544547 case _ =>
545548 unit
546549 }
547550 if ((el == el))
548551 then {
549552 let sa = if ((amDiff > 0))
550553 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
551554 else nil
552555 if ((sa == sa))
553556 then {
554557 let sp = if ((prDiff > 0))
555558 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
556559 else nil
557560 if ((sp == sp))
558561 then {
559562 let lpTrnsfr = if (autoStake)
560563 then {
561564 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
562565 if ((ss == ss))
563566 then nil
564567 else throw("Strict value is not equal to itself.")
565568 }
566569 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
567570 (state ++ lpTrnsfr)
568571 }
569572 else throw("Strict value is not equal to itself.")
570573 }
571574 else throw("Strict value is not equal to itself.")
572575 }
573576 else throw("Strict value is not equal to itself.")
574577 }
575578 else throw("Strict value is not equal to itself.")
576579 }
577580 }
578581
579582
580583
581584 @Callable(i)
582585 func putOneTkn (amAssetPart,prAssetPart,outLp,slippage,autoStake) = {
583586 let cfg = gfc()
584587 let stakingCntr = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wr st addr")
585588 let slipCntr = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wr sl addr")
586589 let gwxCntr = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wr gwx addr")
587590 let poolCfg = gpc()
588591 let amId = poolCfg[idxAmAsId]
589592 let prId = poolCfg[idxPrAsId]
590593 let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
591594 let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
592595 let addon = valueOrElse(getString(this, ada()), "")
593596 let userAddress = if ((addon == toString(i.caller)))
594597 then i.originCaller
595598 else i.caller
596599 if (if (if (if ((0 >= slippage))
597600 then true
598601 else (0 >= amAssetPart))
599602 then true
600603 else (0 >= prAssetPart))
601604 then true
602605 else (0 >= outLp))
603606 then throw("Wrong params")
604607 else if ((size(i.payments) != 1))
605608 then throw("1 pmnt expd")
606609 else {
607610 let pmt = value(i.payments[0])
608611 let pmtAssetId = toBase58String(value(pmt.assetId))
609612 let paymentAmountRaw = pmt.amount
610- let $t02447924531 = takeFee(paymentAmountRaw)
611- let pmtAmt = $t02447924531._1
612- let feeAmount = $t02447924531._2
613- if (if (if ((amAssetPart > pmtAmt))
614- then true
615- else (prAssetPart > pmtAmt))
616- then true
617- else (10000000 > paymentAmountRaw))
613+ let $t02454924601 = takeFee(paymentAmountRaw)
614+ let pmtAmt = $t02454924601._1
615+ let feeAmount = $t02454924601._2
616+ if ((10000000 > paymentAmountRaw))
618617 then throw("Wrong pmt amt")
619618 else {
620619 let amBalance = getAccBalance(amId)
621620 let prBalance = getAccBalance(prId)
622- let $t02473825118 = if ((pmtAssetId == amId))
623- then $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
621+ let $t02476125337 = if ((pmtAssetId == amId))
622+ then if (if ((pmtAmt > amBalance))
623+ then true
624+ else (amAssetPart > pmtAmt))
625+ then throw("invalid payment amount")
626+ else $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
624627 else if ((pmtAssetId == prId))
625- then $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
628+ then if (if ((pmtAmt > prBalance))
629+ then true
630+ else (prAssetPart > pmtAmt))
631+ then throw("invalid payment amount")
632+ else $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
626633 else throw("wrong pmtAssetId")
627- let amBalanceNow = $t02473825118._1
628- let prBalanceNow = $t02473825118._2
629- let virtSwapInAm = $t02473825118._3
630- let virtSwapOutPr = $t02473825118._4
631- let virtSwapInPr = $t02473825118._5
632- let virtSwapOutAm = $t02473825118._6
634+ let amBalanceNow = $t02476125337._1
635+ let prBalanceNow = $t02476125337._2
636+ let virtSwapInAm = $t02476125337._3
637+ let virtSwapOutPr = $t02476125337._4
638+ let virtSwapInPr = $t02476125337._5
639+ let virtSwapOutAm = $t02476125337._6
633640 let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
634641 let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
635642 let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
636643 if ((D0vsD1 == D0vsD1))
637644 then {
638645 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
639646 let estimLP = estPut._2
640647 let lpAssetId = estPut._7
641648 let state = estPut._9
642649 let amDiff = estPut._10
643650 let prDiff = estPut._11
644651 let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
645652 let emitLpAmt = toInt(lpCalcRes._2)
646653 let e = invoke(fca, "emit", [emitLpAmt], nil)
647654 if ((e == e))
648655 then {
649656 let el = match e {
650657 case legacy: Address =>
651658 invoke(legacy, "emit", [emitLpAmt], nil)
652659 case _ =>
653660 unit
654661 }
655662 if ((el == el))
656663 then {
657664 let sa = if ((amDiff > 0))
658665 then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
659666 else nil
660667 if ((sa == sa))
661668 then {
662669 let sp = if ((prDiff > 0))
663670 then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
664671 else nil
665672 if ((sp == sp))
666673 then {
667674 let lpTrnsfr = if (autoStake)
668675 then {
669676 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
670677 if ((ss == ss))
671678 then nil
672679 else throw("Strict value is not equal to itself.")
673680 }
674681 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
675682 let sendFeeToMatcher = if ((feeAmount > 0))
676683 then [ScriptTransfer(matcherAddress, feeAmount, fromBase58String(pmtAssetId))]
677684 else nil
678685 ((state ++ lpTrnsfr) ++ sendFeeToMatcher)
679686 }
680687 else throw("Strict value is not equal to itself.")
681688 }
682689 else throw("Strict value is not equal to itself.")
683690 }
684691 else throw("Strict value is not equal to itself.")
685692 }
686693 else throw("Strict value is not equal to itself.")
687694 }
688695 else throw("Strict value is not equal to itself.")
689696 }
690697 }
691698 }
692699
693700
694701
695702 @Callable(i)
696703 func putForFree (maxSlpg) = if ((0 > maxSlpg))
697704 then throw("Wrong slpg")
698705 else if ((size(i.payments) != 2))
699706 then throw("2 pmnts expd")
700707 else {
701708 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, 0, "")
702709 estPut._9
703710 }
704711
705712
706713
707714 @Callable(i)
708715 func get () = {
709716 let r = cg(i)
710717 let outAmtAmt = r._1
711718 let outPrAmt = r._2
712719 let pmtAmt = r._3
713720 let pmtAssetId = r._4
714721 let state = r._5
715722 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
716723 if ((b == b))
717724 then state
718725 else throw("Strict value is not equal to itself.")
719726 }
720727
721728
722729
723730 @Callable(i)
724731 func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
725732 then throw("1 pmnt expd")
726733 else {
727734 let cfg = gpc()
728735 let lpId = cfg[idxLPAsId]
729736 let amId = cfg[idxAmAsId]
730737 let prId = cfg[idxPrAsId]
731738 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
732739 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
733740 let sts = cfg[idxPoolSt]
734741 let factCfg = gfc()
735742 let gwxCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wr sl addr")
736743 let pmt = value(i.payments[0])
737744 let addon = valueOrElse(getString(this, ada()), "")
738745 let userAddress = if ((addon == toString(i.caller)))
739746 then i.originCaller
740747 else i.caller
741748 let txId58 = toBase58String(i.transactionId)
742749 let pmtAssetId = value(pmt.assetId)
743750 let pmtAmt = pmt.amount
744751 if ((1000000000 > pmtAmt))
745752 then throw("Min pmt 10 LP")
746753 else if (if (if ((0 > slippage))
747754 then true
748755 else (0 > exchResult))
749756 then true
750757 else (0 > outAmount))
751758 then throw("Wrong params")
752759 else if ((lpId != toBase58String(pmtAssetId)))
753760 then throw("Wrong LP")
754761 else {
755762 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
756763 let estimAmAmt = r._1
757764 let estimPrAmt = r._2
758765 let amBalance = getAccBalance(amId)
759766 let prBalance = getAccBalance(prId)
760- let $t03005630513 = if ((outAssetId == amId))
767+ let $t03027530735 = if ((outAssetId == amId))
761768 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
762769 else if ((outAssetId == prId))
763770 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
764771 else throw("wrong outAssetId")
765- let amBalanceNow = $t03005630513._1
766- let prBalanceNow = $t03005630513._2
767- let virtSwapInAm = $t03005630513._3
768- let virtSwapOutPr = $t03005630513._4
769- let virtSwapInPr = $t03005630513._5
770- let virtSwapOutAm = $t03005630513._6
771- let totalGet = $t03005630513._7
772+ let amBalanceNow = $t03027530735._1
773+ let prBalanceNow = $t03027530735._2
774+ let virtSwapInAm = $t03027530735._3
775+ let virtSwapOutPr = $t03027530735._4
776+ let virtSwapInPr = $t03027530735._5
777+ let virtSwapOutAm = $t03027530735._6
778+ let totalGetRaw = $t03027530735._7
772779 if (if ((0 > virtSwapInAm))
773780 then true
774781 else (0 > virtSwapInPr))
775782 then throw("Wrong calc")
776783 else {
777784 let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
778785 let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
779786 let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
780787 if ((D0vsD1 == D0vsD1))
781788 then {
789+ let totalGet = takeFee(totalGetRaw)._1
782790 let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
783791 if ((finalRes == finalRes))
784792 then {
785- let $t03121831322 = if ((outAssetId == amId))
793+ let $t03148231586 = if ((outAssetId == amId))
786794 then $Tuple2(toInt(finalRes._2), 0)
787795 else $Tuple2(0, toInt(finalRes._2))
788- let outAm = $t03121831322._1
789- let outPr = $t03121831322._2
790- let totalAmountRaw = (outAm + outPr)
791- let $t03136231417 = takeFee(totalAmountRaw)
792- let totalAmount = $t03136231417._1
793- let feeAmount = $t03136231417._2
796+ let outAm = $t03148231586._1
797+ let outPr = $t03148231586._2
798+ let totalAmount = (outAm + outPr)
799+ let feeAmount = (totalGetRaw - totalGet)
794800 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
795801 then unit
796802 else fromBase58String(outAssetId)
797803 let sendFeeToMatcher = if ((feeAmount > 0))
798804 then [ScriptTransfer(matcherAddress, feeAmount, outAssetIdOrWaves)]
799805 else nil
800806 let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
801807 let curPr = f1(curPrX18, scale8)
802808 let state = [ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)]
803809 if ((state == state))
804810 then {
805811 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
806812 if ((burn == burn))
807813 then (state ++ sendFeeToMatcher)
808814 else throw("Strict value is not equal to itself.")
809815 }
810816 else throw("Strict value is not equal to itself.")
811817 }
812818 else throw("Strict value is not equal to itself.")
813819 }
814820 else throw("Strict value is not equal to itself.")
815821 }
816822 }
817823 }
818824
819825
820826
821827 @Callable(i)
822828 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
823829 let r = cg(i)
824830 let outAmAmt = r._1
825831 let outPrAmt = r._2
826832 let pmtAmt = r._3
827833 let pmtAssetId = r._4
828834 let state = r._5
829835 if ((noLessThenAmtAsset > outAmAmt))
830836 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
831837 else if ((noLessThenPriceAsset > outPrAmt))
832838 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
833839 else {
834840 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
835841 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
836842 then state
837843 else throw("Strict value is not equal to itself.")
838844 }
839845 }
840846
841847
842848
843849 @Callable(i)
844850 func unstakeAndGet (amount) = {
845851 let checkPayments = if ((size(i.payments) != 0))
846852 then throw("No pmnts expd")
847853 else true
848854 if ((checkPayments == checkPayments))
849855 then {
850856 let cfg = gpc()
851857 let factoryCfg = gfc()
852858 let lpAssetId = fromBase58String(cfg[idxLPAsId])
853859 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
854860 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
855861 if ((unstakeInv == unstakeInv))
856862 then {
857863 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
858864 let sts = parseIntValue(r._9)
859865 let state = r._10
860866 let v = if (if (igs())
861867 then true
862868 else (sts == PoolShutdown))
863869 then throw(("Blocked: " + toString(sts)))
864870 else true
865871 if ((v == v))
866872 then {
867873 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
868874 if ((burnA == burnA))
869875 then state
870876 else throw("Strict value is not equal to itself.")
871877 }
872878 else throw("Strict value is not equal to itself.")
873879 }
874880 else throw("Strict value is not equal to itself.")
875881 }
876882 else throw("Strict value is not equal to itself.")
877883 }
878884
879885
880886
881887 @Callable(i)
882888 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
883889 then throw("denied")
884890 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
885891
886892
887893
888894 @Callable(i)
889895 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
890896 then pd
891897 else [StringEntry(k, v)]
892898
893899
894900
895901 @Callable(i)
896902 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
897903 then pd
898904 else [IntegerEntry(k, v)]
899905
900906
901907
902908 @Callable(i)
903909 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
904910
905911
906912
907913 @Callable(i)
908914 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
909915
910916
911917
912918 @Callable(i)
913919 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
914920 let pr = calcPrices(amAmt, prAmt, lpAmt)
915921 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
916922 }
917923
918924
919925
920926 @Callable(i)
921927 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
922928
923929
924930
925931 @Callable(i)
926932 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
927933
928934
929935
930936 @Callable(i)
931937 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
932938
933939
934940
935941 @Callable(i)
936942 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, false, 0, ""))
937943
938944
939945
940946 @Callable(i)
941947 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
942948 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
943949 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
944950 }
945951
946952
947953 @Verifier(tx)
948-func verify () = match tx {
949- case order: Order =>
950- let mtchPub = mp()
951- let orV = moa(order)
952- let sndrV = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
953- let mtchV = sigVerify(order.bodyBytes, order.proofs[1], mtchPub)
954- if (if (if (orV)
955- then sndrV
956- else false)
957- then mtchV
958- else false)
959- then true
960- else toe(orV, sndrV, mtchV)
961- case _ =>
962- let targetPublicKey = match m() {
963- case pk: ByteVector =>
964- pk
965- case _: Unit =>
966- tx.senderPublicKey
967- case _ =>
968- throw("Match error")
969- }
970- sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
971-}
954+func verify () = {
955+ let targetPublicKey = match m() {
956+ case pk: ByteVector =>
957+ pk
958+ case _: Unit =>
959+ tx.senderPublicKey
960+ case _ =>
961+ throw("Match error")
962+ }
963+ match tx {
964+ case order: Order =>
965+ let matcherPub = mp()
966+ let orderValid = moa(order)
967+ let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
968+ let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
969+ if (if (if (orderValid)
970+ then senderValid
971+ else false)
972+ then matcherValid
973+ else false)
974+ then true
975+ else toe(orderValid, senderValid, matcherValid)
976+ case s: SetScriptTransaction =>
977+ let newHash = blake2b256(value(s.script))
978+ let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
979+ let currentHash = scriptHash(this)
980+ if (if ((allowedHash == newHash))
981+ then (currentHash != newHash)
982+ else false)
983+ then true
984+ else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
985+ case _ =>
986+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
987+ }
988+ }
972989

github/deemru/w8io/c3f4982 
99.21 ms