tx · FgM3ezdhstFi285JGvisMw8fcvqvuyRF1ZASEHKsryiv

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.02800000 Waves

2022.10.24 14:12 [2286420] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "FgM3ezdhstFi285JGvisMw8fcvqvuyRF1ZASEHKsryiv", "fee": 2800000, "feeAssetId": null, "timestamp": 1666610007930, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "4evPWHnwnxThR8ybmrp1cRaXEv92WXr647MZWo2iCn5iyLx2DZ5nmgbCwzScfmd3sUmnWSStv6uLWgoCh7fC58aA" ], "script": "base64:BgL7HggCEgMKAQgSAwoBCBIAEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIECgIIARIECgIIARIECgIBARIDCgEBEgUKAwEIARIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgAiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igp6ZXJvQmlnSW50IgRiaWcwIgRiaWcxIgRiaWcyIgpzbGlwcGFnZTREIgVBbXVsdCIFRGNvbnYiA1NFUCIFRU1QVFkiClBvb2xBY3RpdmUiClBvb2xQdXREaXMiDlBvb2xNYXRjaGVyRGlzIgxQb29sU2h1dGRvd24iDmlkeFBvb2xBZGRyZXNzIglpZHhQb29sU3QiCWlkeExQQXNJZCIJaWR4QW1Bc0lkIglpZHhQckFzSWQiC2lkeEFtdEFzRGNtIg1pZHhQcmljZUFzRGNtIgtpZHhJQW10QXNJZCINaWR4SVByaWNlQXNJZCIPaWR4RmFjdFN0YWtDbnRyIhJpZHhGYWN0b3J5UmVzdENudHIiEGlkeEZhY3RTbGlwcENudHIiEWlkeEZhY3RHd3hSZXdDbnRyIgpmZWVEZWZhdWx0IgJ0MSIHb3JpZ1ZhbCINb3JpZ1NjYWxlTXVsdCICZjEiA3ZhbCIPcmVzdWx0U2NhbGVNdWx0IgJ0cyIDYW10IghyZXNTY2FsZSIIY3VyU2NhbGUiA2FicyIJYWJzQmlnSW50IgJmYyIDbXBrIgRwbXBrIgJwbCICcGgiAWgiAXQiA3BhdSICdWEiBHR4SWQiA2dhdSICYWEiAnBhIgNhbXAiA2FkYSIGa2V5RmVlIgNmZWUiBGZjZmciBG10cGsiAnBjIgZpQW10QXMiBWlQckFzIgNtYmEiBWJBU3RyIgNhcHMiHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiA3RvZSIDb3JWIgZzZW5kclYiBm1hdGNoViIDc3RyIgckbWF0Y2gwIgZ2YWxTdHIiBHN0cmYiBGFkZHIiA2tleSIEaW50ZiIDZmNhIgFBIgNpZ3MiAm1wIhNmZWVDb2xsZWN0b3JBZGRyZXNzIgNncGMiBWFtdEFzIgdwcmljZUFzIghpUHJpY2VBcyIDZ2ZjIg1mYWN0b3J5Q29uZmlnIg9zdGFraW5nQ29udHJhY3QiD3NsaXBhZ2VDb250cmFjdCILZ3d4Q29udHJhY3QiDHJlc3RDb250cmFjdCIRZGF0YVB1dEFjdGlvbkluZm8iDWluQW10QXNzZXRBbXQiD2luUHJpY2VBc3NldEFtdCIIb3V0THBBbXQiBXByaWNlIgpzbGlwQnlVc2VyIgxzbGlwcGFnZVJlYWwiCHR4SGVpZ2h0Igt0eFRpbWVzdGFtcCIMc2xpcGFnZUFtQW10IgxzbGlwYWdlUHJBbXQiEWRhdGFHZXRBY3Rpb25JbmZvIg5vdXRBbXRBc3NldEFtdCIQb3V0UHJpY2VBc3NldEFtdCIHaW5McEFtdCINZ2V0QWNjQmFsYW5jZSIHYXNzZXRJZCIEY3BiaSIIcHJBbXRYMTgiCGFtQW10WDE4IgN2YWQiAkExIgJBMiIIc2xpcHBhZ2UiBGRpZmYiBHBhc3MiAnZkIgJEMSICRDAiBHNscGciBGZhaWwiA3BjcCIKYW1Bc3NldERjbSIKcHJBc3NldERjbSIFYW1BbXQiBXByQW10IgthbXRBc0FtdFgxOCIKcHJBc0FtdFgxOCIKY2FsY1ByaWNlcyIFbHBBbXQiA2NmZyIIYW10QXNEY20iB3ByQXNEY20iCHByaWNlWDE4IghscEFtdFgxOCINbHBQckluQW1Bc1gxOCINbHBQckluUHJBc1gxOCIPY2FsY3VsYXRlUHJpY2VzIgFwIgd0YWtlRmVlIgZhbW91bnQiCWZlZUFtb3VudCIDZWdvIgZ0eElkNTgiCnBtdEFzc2V0SWQiCHBtdExwQW10Igt1c2VyQWRkcmVzcyIEbHBJZCIEYW1JZCIEcHJJZCIFYW1EY20iBXByRGNtIgNzdHMiB2xwRW1pc3MiCWFtQmFsYW5jZSIMYW1CYWxhbmNlWDE4IglwckJhbGFuY2UiDHByQmFsYW5jZVgxOCILY3VyUHJpY2VYMTgiCGN1clByaWNlIgtwbXRMcEFtdFgxOCIKbHBFbWlzc1gxOCILb3V0QW1BbXRYMTgiC291dFByQW10WDE4IghvdXRBbUFtdCIIb3V0UHJBbXQiBXN0YXRlIgNlcG8iB2luQW1BbXQiBmluQW1JZCIHaW5QckFtdCIGaW5QcklkIgZpc0V2YWwiBmVtaXRMcCIKaXNPbmVBc3NldCIQdmFsaWRhdGVTbGlwcGFnZSIGcG10QW10IgVwbXRJZCIHYW1JZFN0ciIHcHJJZFN0ciIJaW5BbUlkU3RyIglpblBySWRTdHIiBmFtdERjbSIIcHJpY2VEY20iBGxwRW0iD2luQW1Bc3NldEFtdFgxOCIPaW5QckFzc2V0QW10WDE4Igx1c2VyUHJpY2VYMTgiAXIiC3NsaXBwYWdlWDE4Ig9zbGlwcGFnZVJlYWxYMTgiDWxwRW1pc3Npb25YMTgiCnByVmlhQW1YMTgiCmFtVmlhUHJYMTgiDGV4cGVjdGVkQW10cyIRZXhwQW10QXNzZXRBbXRYMTgiE2V4cFByaWNlQXNzZXRBbXRYMTgiCWNhbGNMcEFtdCIOY2FsY0FtQXNzZXRQbXQiDmNhbGNQckFzc2V0UG10IgxzbGlwcGFnZUNhbGMiCWVtaXRMcEFtdCIGYW1EaWZmIgZwckRpZmYiDSR0MDE2NTA5MTY4NTQiCndyaXRlQW1BbXQiCndyaXRlUHJBbXQiC2NvbW1vblN0YXRlIgNtb2EiBW9yZGVyIgdhbXRBc0lkIgZwckFzSWQiD2FjY0FtdEFzQmFsYW5jZSIOYWNjUHJBc0JhbGFuY2UiCm9yQW10QXNzZXQiCm9yQW10QXNTdHIiCW9yUHJBc3NldCIJb3JQckFzU3RyIgpvcmRlclByaWNlIg5jYXN0T3JkZXJQcmljZSIRaXNPcmRlclByaWNlVmFsaWQiAmNnIgFpIgNwbXQiAmNwIgZjYWxsZXIiB2FtQXNQbXQiB3ByQXNQbXQiBGdldEQiAnhwIgFuIgN4cDAiA3hwMSIKYVByZWNpc2lvbiIBYSIBcyIDYW5uIgt4cDBfeHAxX25fbiIQYW5uX3NfYVByZWNpc2lvbiIOYW5uX2FQcmVjaXNpb24iAm4xIgRjYWxjIgNhY2MiA2N1ciINJHQwMjE0MDYyMTQyNiIBZCIFZm91bmQiAmRwIgVkTmV4dCIFZERpZmYiA2FyciINJHQwMjE4NDcyMTg5NCICJGwiAiRzIgUkYWNjMCIFJGYwXzEiAiRhIgIkaSIFJGYwXzIiBWdldFlEIgFEIgF4IgFjIgFiIg0kdDAyMjM5NDIyNDE0IgF5IgV5TmV4dCIFeURpZmYiDSR0MDIyNzIxMjI3NjgiDWNhbGNQdXRPbmVUa24iCXBtdEFtdFJhdyIKcG9vbENvbmZpZyIPbHBBc3NldEVtaXNzaW9uIg1jaGVjaEVtaXNzaW9uIg0kdDAyMzUyNzIzOTg5IgxhbUJhbGFuY2VPbGQiDHByQmFsYW5jZU9sZCINJHQwMjM5OTUyNDE3MSILYW1BbW91bnRSYXciC3ByQW1vdW50UmF3IghhbUFtb3VudCIIcHJBbW91bnQiDGFtQmFsYW5jZU5ldyIMcHJCYWxhbmNlTmV3IgZjaGVja0QiCGxwQW1vdW50Ig5wb29sUHJvcG9ydGlvbiIPYW1vdW50QXNzZXRQYXJ0Ig5wcmljZUFzc2V0UGFydCIJbHBBbXRCb3RoIgVib251cyITZ2V0T25lVGtuVjJJbnRlcm5hbCIKb3V0QXNzZXRJZCIMbWluT3V0QW1vdW50IghwYXltZW50cyIMb3JpZ2luQ2FsbGVyIg10cmFuc2FjdGlvbklkIgphbURlY2ltYWxzIgpwckRlY2ltYWxzIgpwb29sU3RhdHVzIg0kdDAyNjM1ODI2NDY2IgFAIgh0b3RhbEdldCILdG90YWxBbW91bnQiDSR0MDI2NjUzMjY5NjAiBW91dEFtIgVvdXRQciIIY3VyUHJYMTgiBWN1clByIhFvdXRBc3NldElkT3JXYXZlcyIQc2VuZEZlZVRvTWF0Y2hlciIEYnVybiIBbSICcG0iAnBkIgJtbSICcGsiF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5IgJjbSIDaHBtIgNjcG0iBHNsaXAiCWF1dG9TdGFrZSIHZmFjdENmZyILc3Rha2luZ0NudHIiCHNsaXBDbnRyIgFlIglscEFzc2V0SWQiAmVsIgZsZWdhY3kiAnNhIgJzcCIIbHBUcm5zZnIiAnNzIg0kdDAzMTc3NDMxODk5Igdlc3RpbUxQIgdtYXhTbHBnIgZlc3RQdXQiCW91dEFtdEFtdCINJHQwMzQwODIzNDIzNyINbHBBc3NldEFtb3VudCIKbHBFbWlzc2lvbiIFaW5kZXgiBG5ld1kiAmR5Igt0b3RhbEdldFJhdyINJHQwMzUwMjczNTA3NiINJHQwMzU0MjEzNTUzNiIOc3VtT2ZHZXRBc3NldHMiEm5vTGVzc1RoZW5BbXRBc3NldCIUbm9MZXNzVGhlblByaWNlQXNzZXQiFGJ1cm5MUEFzc2V0T25GYWN0b3J5Ig1jaGVja1BheW1lbnRzIgpmYWN0b3J5Q2ZnIgdzdGFraW5nIgp1bnN0YWtlSW52IgF2IgVidXJuQSINdW5zdGFrZUFtb3VudCINJHQwMzc5NjMzODE1MSIQcGF5bWVudEFtb3VudFJhdyIOcGF5bWVudEFzc2V0SWQiDSR0MDM4NDEwMzg1MDciCGFtdEFzU3RyIgdwckFzU3RyIgFrIgJwciIMcmVzU2NhbGVNdWx0Igd1c3JBZGRyIgdwbXRBc0lkIgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXkiCm1hdGNoZXJQdWIiCm9yZGVyVmFsaWQiC3NlbmRlclZhbGlkIgxtYXRjaGVyVmFsaWQiB25ld0hhc2giC2FsbG93ZWRIYXNoIgtjdXJyZW50SGFzaF4AAWEAgMLXLwABYgkAtgIBAIDC1y8AAWMJALYCAQCAgJC7utat8A0AAWQJALYCAQAAAAFlCQC2AgEAAAABZgkAtgIBAAEAAWcJALYCAQACAAFoCQC2AgEJAGUCBQFhCQBpAgkAaAIFAWEAAQUBYQABaQIDMTAwAAFqAgExAAFrAgJfXwABbAIAAAFtAAEAAW4AAgABbwADAAFwAAQAAXEAAQABcgACAAFzAAMAAXQABAABdQAFAAF2AAYAAXcABwABeAAIAAF5AAkAAXoAAQABQQAGAAFCAAcAAUMACgABRAkAawMABQUBYQCQTgEBRQIBRgFHCQC8AgMJALYCAQUBRgUBYwkAtgIBBQFHAQFIAgFJAUoJAKADAQkAvAIDBQFJCQC2AgEFAUoFAWMBAUsDAUwBTQFOCQBrAwUBTAUBTQUBTgEBTwEBSQMJAL8CAgUBZAUBSQkAvgIBBQFJBQFJAQFQAQFJAwkAvwICBQFkBQFJCQC+AgEFAUkFAUkBAVEAAhMlc19fZmFjdG9yeUNvbnRyYWN0AQFSAAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBAVMAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBAVQAAhElcyVzX19wcmljZV9fbGFzdAEBVQIBVgFXCQC5CQIJAMwIAgIYJXMlcyVkJWRfX3ByaWNlX19oaXN0b3J5CQDMCAIJAKQDAQUBVgkAzAgCCQCkAwEFAVcFA25pbAUBawEBWAIBWQFaCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwUBWQICX18FAVoBAmFhAgFZAVoJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQFZAgJfXwUBWgECYWIAAg8lc19fYW1vdW50QXNzZXQBAmFjAAIOJXNfX3ByaWNlQXNzZXQBAmFkAAIHJXNfX2FtcAECYWUAAg0lc19fYWRkb25BZGRyAAJhZgIHJXNfX2ZlZQACYWcJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWYFAUQBAmFoAAIRJXNfX2ZhY3RvcnlDb25maWcBAmFpAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJhagICYWsCYWwJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmFrAgJfXwUCYWwCCF9fY29uZmlnAQJhbQECYW4JAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYW4BAmFvAAIMJXNfX3NodXRkb3duAQJhcAACHSVzX19hbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAQJhcQACFyVzX19mZWVDb2xsZWN0b3JBZGRyZXNzAQJhcgMCYXMCYXQCYXUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIRRmFpbGVkOiBvcmRWYWxpZD0JAKUDAQUCYXMCCyBzbmRyVmFsaWQ9CQClAwEFAmF0AgwgbXRjaHJWYWxpZD0JAKUDAQUCYXUBAmF2AQFJBAJhdwUBSQMJAAECBQJhdwIGU3RyaW5nBAJheAUCYXcFAmF4CQACAQITZmFpbCBjYXN0IHRvIFN0cmluZwECYXkCAmF6AmFBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYXoFAmFBCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF6CQDMCAICAS4JAMwIAgUCYUEJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYUICAmF6AmFBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYXoFAmFBCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF6CQDMCAICAS4JAMwIAgUCYUEJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAACYUMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJheQIFBHRoaXMJAQFRAAACYUQJAQJheQIFBHRoaXMJAQJhZAABAmFFAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhQwkBAmFvAAcBAmFGAAkA2QQBCQECYXkCBQJhQwkBAmFpAAACYUcJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJheQIFAmFDCQECYXEAAQJhSAAEAmFJCQECYXkCBQR0aGlzCQECYWIABAJhSgkBAmF5AgUEdGhpcwkBAmFjAAQCYUsJAQJhQgIFAmFDCQECYW0BBQJhSgQCYWsJAQJhQgIFAmFDCQECYW0BBQJhSQkAtQkCCQECYXkCBQJhQwkBAmFqAgkApAMBBQJhawkApAMBBQJhSwUBawECYUwACQC1CQIJAQJheQIFAmFDCQECYWgABQFrAAJhTQkBAmFMAAACYU4JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmFNBQF6AiBJbnZhbGlkIHN0YWtpbmcgY29udHJhY3QgYWRkcmVzcwACYU8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmFNBQFCAiBJbnZhbGlkIHNsaXBhZ2UgY29udHJhY3QgYWRkcmVzcwACYVAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmFNBQFDAhxJbnZhbGlkIGd3eCBjb250cmFjdCBhZGRyZXNzAAJhUQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYU0FAUECHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MBAmFSCgJhUwJhVAJhVQJhVgJhVwJhWAJhWQJhWgJiYQJiYgkAuQkCCQDMCAICFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYVMJAMwIAgkApAMBBQJhVAkAzAgCCQCkAwEFAmFVCQDMCAIJAKQDAQUCYVYJAMwIAgkApAMBBQJhVwkAzAgCCQCkAwEFAmFYCQDMCAIJAKQDAQUCYVkJAMwIAgkApAMBBQJhWgkAzAgCCQCkAwEFAmJhCQDMCAIJAKQDAQUCYmIFA25pbAUBawECYmMGAmJkAmJlAmJmAmFWAmFZAmFaCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYmQJAMwIAgkApAMBBQJiZQkAzAgCCQCkAwEFAmJmCQDMCAIJAKQDAQUCYVYJAMwIAgkApAMBBQJhWQkAzAgCCQCkAwEFAmFaBQNuaWwFAWsBAmJnAQJiaAMJAAACBQJiaAIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUCYmgBAmJpAgJiagJiawkAvAIDBQJiagUBYwUCYmsBAmJsAwJibQJibgJibwQCYnAJALwCAwkAuAICBQJibQUCYm4FAWIFAmJuBAJicQkAvwICCQC4AgIFAmJvCQEBTwEFAmJwBQFkAwkBASEBBQJicQkAAgEJAKwCAgIKQmlnIHNscGc6IAkApgMBBQJicAkAlAoCBQJicQkAmQMBCQDMCAIFAmJtCQDMCAIFAmJuBQNuaWwBAmJyAwJicwJidAJidQQCYnAJALwCAwUCYnQFAWIFAmJzBAJidgkAvwICBQJidQUCYnADAwUCYnYGCQC/AgIFAmJ0BQJicwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKYDAQUCYnQCASAJAKYDAQUCYnMCASAJAKYDAQUCYnACASAJAKYDAQUCYnUFAmJ2AQJidwQCYngCYnkCYnoCYkEEAmJCCQEBRQIFAmJ6BQJieAQCYkMJAQFFAgUCYkEFAmJ5CQECYmkCBQJiQwUCYkIBAmJEAwJiegJiQQJiRQQCYkYJAQJhSAAEAmJHCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXYEAmJICQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXcEAmJJCQECYncEBQJiRwUCYkgFAmJ6BQJiQQQCYmsJAQFFAgUCYnoFAmJHBAJiagkBAUUCBQJiQQUCYkgEAmJKCQEBRQIFAmJFBQFhBAJiSwkBAmJpAgUCYmsFAmJKBAJiTAkBAmJpAgUCYmoFAmJKCQDMCAIFAmJJCQDMCAIFAmJLCQDMCAIFAmJMBQNuaWwBAmJNAwJiegJiQQJiRQQCYk4JAQJiRAMFAmJ6BQJiQQUCYkUJAMwIAgkBAUgCCQCRAwIFAmJOAAAFAWEJAMwIAgkBAUgCCQCRAwIFAmJOAAEFAWEJAMwIAgkBAUgCCQCRAwIFAmJOAAIFAWEFA25pbAECYk8BAmJQBAJiUQkAawMFAmJQBQJhZwUBYQkAlAoCCQBlAgUCYlAFAmJRBQJiUQECYlIEAmJTAmJUAmJVAmJWBAJiRgkBAmFIAAQCYlcJAJEDAgUCYkYFAXMEAmJYCQCRAwIFAmJGBQF0BAJiWQkAkQMCBQJiRgUBdQQCYloJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiRgUBdgQCY2EJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiRgUBdwQCY2IJAJEDAgUCYkYFAXIEAmNjCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCYlcCC1dyb25nIExQIGlkCHF1YW50aXR5AwkBAiE9AgUCYlcFAmJUCQACAQIPV3JvbmcgcG10IGFzc2V0BAJjZAkBAmJnAQUCYlgEAmNlCQEBRQIFAmNkBQJiWgQCY2YJAQJiZwEFAmJZBAJjZwkBAUUCBQJjZgUCY2EEAmNoCQECYmkCBQJjZwUCY2UEAmNpCQEBSAIFAmNoBQFhBAJjagkBAUUCBQJiVQUBYQQCY2sJAQFFAgUCY2MFAWEEAmNsCQC8AgMFAmNlBQJjagUCY2sEAmNtCQC8AgMFAmNnBQJjagUCY2sEAmNuCQEBSAIFAmNsBQJiWgQCY28JAQFIAgUCY20FAmNhBAJjcAMJAAACBQJiUwIABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYlYFAmNuAwkAAAIFAmJYAgVXQVZFUwUEdW5pdAkA2QQBBQJiWAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiVgUCY28DCQAAAgUCYlkCBVdBVkVTBQR1bml0CQDZBAEFAmJZCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQIJAKUIAQUCYlYFAmJTCQECYmMGBQJjbgUCY28FAmJVBQJjaQUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVQABQJjaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjaQUDbmlsCQCcCgoFAmNuBQJjbwUCYlgFAmJZBQJjZAUCY2YFAmNjBQJjaAUCY2IFAmNwAQJjcQ0CYlMCYm8CY3ICY3MCY3QCY3UCYlYCY3YCY3cCY3gCY3kCY3oCY0EEAmJGCQECYUgABAJiVwkA2QQBCQCRAwIFAmJGBQFzBAJjQgkAkQMCBQJiRgUBdAQCY0MJAJEDAgUCYkYFAXUEAmNECQCRAwIFAmJGBQF4BAJjRQkAkQMCBQJiRgUBeQQCY0YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiRgUBdgQCY0cJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiRgUBdwQCY2IJAJEDAgUCYkYFAXIEAmNICAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmJXAghXciBscCBhcwhxdWFudGl0eQQCY2QDBQJjdgkBAmJnAQUCY0IDAwUCY3gJAAACBQJjQQUCY0IHCQBlAgkBAmJnAQUCY0IFAmN6AwUCY3gJAQJiZwEFAmNCCQBlAgkBAmJnAQUCY0IFAmNyBAJjZgMFAmN2CQECYmcBBQJjQwMDBQJjeAkAAAIFAmNBBQJjQwcJAGUCCQECYmcBBQJjQwUCY3oDBQJjeAkBAmJnAQUCY0MJAGUCCQECYmcBBQJjQwUCY3QEAmNJCQEBRQIFAmNyBQJjRgQCY0oJAQFFAgUCY3QFAmNHBAJjSwkBAmJpAgUCY0oFAmNJBAJjZQkBAUUCBQJjZAUCY0YEAmNnCQEBRQIFAmNmBQJjRwQCY0wDCQAAAgUCY0gAAAQCY2gFAWQEAmNNBQFkBAJiSgkAdgYJALkCAgUCY0kFAmNKAAAJALYCAQAFAAEAAAUERE9XTgkAlwoFCQEBSAIFAmJKBQFhCQEBSAIFAmNJBQJjRgkBAUgCBQJjSgUCY0cJAQJiaQIJALcCAgUCY2cFAmNKCQC3AgIFAmNlBQJjSQUCY00EAmNoCQECYmkCBQJjZwUCY2UEAmNOCQC8AgMJAQFPAQkAuAICBQJjaAUCY0sFAWMFAmNoBAJjTQkBAUUCBQJibwUBYQMDAwUCY3kJAQIhPQIFAmNoBQFkBwkAvwICBQJjTgUCY00HCQACAQkArAICCQCsAgIJAKwCAgIPUHJpY2Ugc2xpcHBhZ2UgCQCmAwEFAmNOAgMgPiAJAKYDAQUCY00EAmNPCQEBRQIFAmNIBQFhBAJjUAkAvAIDBQJjSQUCY2gFAWMEAmNRCQC8AgMFAmNKBQFjBQJjaAQCY1IDCQC/AgIFAmNQBQJjSgkAlAoCBQJjUQUCY0oJAJQKAgUCY0kFAmNQBAJjUwgFAmNSAl8xBAJjVAgFAmNSAl8yBAJiSgkAvAIDBQJjTwUCY1QFAmNnCQCXCgUJAQFIAgUCYkoFAWEJAQFIAgUCY1MFAmNGCQEBSAIFAmNUBQJjRwUCY2gFAmNNBAJjVQgFAmNMAl8xBAJjVggFAmNMAl8yBAJjVwgFAmNMAl8zBAJjaQkBAUgCCAUCY0wCXzQFAWEEAmNYCQEBSAIIBQJjTAJfNQUBYQMJAGcCAAAFAmNVCQACAQIHTFAgPD0gMAQCY1kDCQEBIQEFAmN3AAAFAmNVBAJjWgkAZQIFAmNyBQJjVgQCZGEJAGUCBQJjdAUCY1cEAmRiAwMFAmN4CQAAAgUCY0EFAmNCBwkAlAoCBQJjegAAAwMFAmN4CQAAAgUCY0EFAmNDBwkAlAoCAAAFAmN6CQCUCgIFAmNWBQJjVwQCZGMIBQJkYgJfMQQCZGQIBQJkYgJfMgQCZGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFUAAUCY2kJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFVAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCY2kJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVgCBQJiVgUCYlMJAQJhUgoFAmRjBQJkZAUCY1kFAmNpBQJibwUCY1gFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNaBQJkYQUDbmlsCQCfCg0FAmNVBQJjWQUCY2kFAmNkBQJjZgUCY0gFAmJXBQJjYgUCZGUFAmNaBQJkYQUCY3MFAmN1AQJkZgECZGcEAmJGCQECYUgABAJkaAkAkQMCBQJiRgUBdAQCZGkJAJEDAgUCYkYFAXUEAmNiCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXIEAmJHCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXYEAmJICQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXcEAmRqCQECYmcBBQJkaAQCZGsJAQJiZwEFAmRpBAJjaAMJAAACCAUCZGcJb3JkZXJUeXBlBQNCdXkJAQJidwQFAmJHBQJiSAkAZAIFAmRqCAUCZGcGYW1vdW50BQJkawkBAmJ3BAUCYkcFAmJICQBlAgUCZGoIBQJkZwZhbW91bnQFAmRrBAJjaQkBAUgCBQJjaAUBYQMDAwkBAmFFAAYJAAACBQJjYgUBbwYJAAACBQJjYgUBcAkAAgECDUFkbWluIGJsb2NrZWQEAmRsCAgFAmRnCWFzc2V0UGFpcgthbW91bnRBc3NldAQCZG0DCQAAAgUCZGwFBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmRsBAJkbggIBQJkZwlhc3NldFBhaXIKcHJpY2VBc3NldAQCZG8DCQAAAgUCZG4FBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmRuAwMJAQIhPQIFAmRtBQJkaAYJAQIhPQIFAmRvBQJkaQkAAgECCVdyIGFzc2V0cwQCZHAIBQJkZwVwcmljZQQCY0cJAGsDBQFhBQJiSAUCYkcEAmRxCQEBSwMFAmRwBQFhBQJjRwQCZHIDCQAAAggFAmRnCW9yZGVyVHlwZQUDQnV5CQBnAgUCY2kFAmRxCQBnAgUCZHEFAmNpBgECZHMBAmR0AwkBAiE9AgkAkAMBCAUCZHQIcGF5bWVudHMAAQkAAgECCjEgcG1udCBleHAEAmR1CQEFdmFsdWUBCQCRAwIIBQJkdAhwYXltZW50cwAABAJiVAkBBXZhbHVlAQgFAmR1B2Fzc2V0SWQEAmN6CAUCZHUGYW1vdW50BAJjTAkBAmJSBAkA2AQBCAUCZHQNdHJhbnNhY3Rpb25JZAkA2AQBBQJiVAUCY3oIBQJkdAZjYWxsZXIEAmNuCAUCY0wCXzEEAmNvCAUCY0wCXzIEAmNiCQENcGFyc2VJbnRWYWx1ZQEIBQJjTAJfOQQCY3AIBQJjTANfMTADAwkBAmFFAAYJAAACBQJjYgUBcAkAAgEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFAmNiCQCXCgUFAmNuBQJjbwUCY3oFAmJUBQJjcAECZHYKAmR3AVoCZHgCZHkCYm8CY3cCY3gCY3kCY3oCY0EEAmNMCQECY3ENBQFaBQJibwgJAQV2YWx1ZQEFAmR4BmFtb3VudAgJAQV2YWx1ZQEFAmR4B2Fzc2V0SWQICQEFdmFsdWUBBQJkeQZhbW91bnQICQEFdmFsdWUBBQJkeQdhc3NldElkBQJkdwkAAAIFAVoCAAUCY3cFAmN4BQJjeQUCY3oFAmNBBAJjYgkBDXBhcnNlSW50VmFsdWUBCAUCY0wCXzgDAwMJAQJhRQAGCQAAAgUCY2IFAW4GCQAAAgUCY2IFAXAJAAIBCQCsAgICCEJsb2NrZWQ6CQCkAwEFAmNiBQJjTAECZHoBAmRBBAJkQgUBZwQCZEMJAJEDAgUCZEEAAAQCZEQJAJEDAgUCZEEAAQQCZEUJAKcDAQUBaQQCZEYJALkCAgkApwMBBQJhRAUCZEUEAmRHCQC3AgIFAmRDBQJkRAMJAAACBQJkRwUBZQUBZQQCZEgJALkCAgUCZEYFAmRCBAJkSQkAuQICCQC5AgIJALkCAgUCZEMFAmREBQJkQgUCZEIEAmRKCQC6AgIJALkCAgUCZEgFAmRHBQJkRQQCZEsJALgCAgUCZEgFAmRFBAJkTAkAtwICBQJkQgUBZgoBAmRNAgJkTgJkTwQCZFAFAmROBAJkUQgFAmRQAl8xBAJkUggFAmRQAl8yAwkBAiE9AgUCZFIFBHVuaXQFAmROBAJkUwkAugICCQC5AgIJALkCAgUCZFEFAmRRBQJkUQUCZEkEAmRUCQC6AgIJALkCAgkAtwICBQJkSgkAuQICBQJkUwUCZEIFAmRRCQC3AgIJALoCAgkAuQICBQJkSwUCZFEFAmRFCQC5AgIFAmRMBQJkUwQCZFUJAQFQAQkAuAICBQJkVAkBBXZhbHVlAQUCZFEDCQDAAgIFAWYFAmRVCQCUCgIFAmRUBQJkTwkAlAoCBQJkVAUEdW5pdAQCZFYJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQCZFcKAAJkWAUCZFYKAAJkWQkAkAMBBQJkWAoAAmRaCQCUCgIFAmRHBQR1bml0CgECZWECAmViAmVjAwkAZwIFAmVjBQJkWQUCZWIJAQJkTQIFAmViCQCRAwIFAmRYBQJlYwoBAmVkAgJlYgJlYwMJAGcCBQJlYwUCZFkFAmViCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQJlZAIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIFAmRaAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EAmRRCAUCZFcCXzEEAmRSCAUCZFcCXzIDCQECIT0CBQJkUgUEdW5pdAUCZFEJAAIBCQCsAgICGUQgY2FsY3VsYXRpb24gZXJyb3IsIEQgPSAJAKYDAQUCZFEBAmVlAwJkQQJkdAJlZgQCZEIFAWcEAmVnCQCRAwIFAmRBAwkAAAIFAmR0AAAAAQAABAJkRQkApwMBBQFpBAJkRgkAuQICCQCnAwEFAmFEBQJkRQQCZEcFAmVnBAJkSAkAuQICBQJkRgUCZEIEAmVoCQC6AgIJALkCAgkAuQICCQC6AgIJALkCAgUCZWYFAmVmCQC5AgIFAmVnBQJkQgUCZWYFAmRFCQC5AgIFAmRIBQJkQgQCZWkJALgCAgkAtwICBQJkRwkAugICCQC5AgIFAmVmBQJkRQUCZEgFAmVmCgECZE0CAmROAmRPBAJlagUCZE4EAmVrCAUCZWoCXzEEAmRSCAUCZWoCXzIDCQECIT0CBQJkUgUEdW5pdAUCZE4EAmVsCQC6AgIJALcCAgkAuQICBQJlawUCZWsFAmVoCQC3AgIJALkCAgUBZwUCZWsFAmVpBAJlbQkBAVABCQC4AgIFAmVsCQEFdmFsdWUBBQJlawMJAMACAgUBZgUCZW0JAJQKAgUCZWwFAmRPCQCUCgIFAmVsBQR1bml0BAJkVgkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJlbgoAAmRYBQJkVgoAAmRZCQCQAwEFAmRYCgACZFoJAJQKAgUCZWYFBHVuaXQKAQJlYQICZWICZWMDCQBnAgUCZWMFAmRZBQJlYgkBAmRNAgUCZWIJAJEDAgUCZFgFAmVjCgECZWQCAmViAmVjAwkAZwIFAmVjBQJkWQUCZWIJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmVkAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgUCZFoAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZWsIBQJlbgJfMQQCZFIIBQJlbgJfMgMJAQIhPQIFAmRSBQR1bml0BQJlawkAAgEJAKwCAgIZWSBjYWxjdWxhdGlvbiBlcnJvciwgWSA9IAkApgMBBQJlawECZW8EAmVwAmJUAmJWAVoEAmVxCQECYUgABAJiWAkAkQMCBQJlcQUBdAQCYlkJAJEDAgUCZXEFAXUEAmJXCQCRAwIFAmVxBQFzBAJjRgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVxBQF2BAJjRwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVxBQF3BAJlcgkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCYlcCEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmVzAwkAvwICBQJlcgUBZQYJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zAwkAAAIFAmVzBQJlcwQCY2QJAQJiZwEFAmJYBAJjZgkBAmJnAQUCYlkEAmV0AwkAAAIFAVoCAAkAlAoCBQJjZAUCY2YDCQAAAgUCYlQFAmJYAwkAZgIFAmVwBQJjZAkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJQKAgkAZQIFAmNkBQJlcAUCY2YDCQAAAgUCYlQFAmJZAwkAZgIFAmVwBQJjZgkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJQKAgUCY2QJAGUCBQJjZgUCZXAJAAIBAhB3cm9uZyBwbXRBc3NldElkBAJldQgFAmV0Al8xBAJldggFAmV0Al8yBAJldwMJAAACBQJiVAUCYlgJAJQKAgUCZXAAAAMJAAACBQJiVAUCYlkJAJQKAgAABQJlcAkAAgECD2ludmFsaWQgcGF5bWVudAQCZXgIBQJldwJfMQQCZXkIBQJldwJfMgQCZXoICQECYk8BBQJleAJfMQQCZUEICQECYk8BBQJleQJfMQQCYlEICQECYk8BBQJlcAJfMgQCZUIJAGQCBQJldQUCZXoEAmVDCQBkAgUCZXYFAmVBBAJidAkBAmR6AQkAzAgCCQC2AgEFAmV1CQDMCAIJALYCAQUCZXYFA25pbAQCYnMJAQJkegEJAMwIAgkAtgIBBQJlQgkAzAgCCQC2AgEFAmVDBQNuaWwEAmVEAwkAvwICBQJicwUCYnQGCQEFdGhyb3cAAwkAAAIFAmVEBQJlRAQCZUUJALwCAwUCZXIJALgCAgUCYnMFAmJ0BQJidAQCY2kJAQFIAgkBAmJpAgkBAUUCBQJlQwUCY0cJAQFFAgUCZUIFAmNGBQFhBAJkZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVQABQJjaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjaQkAzAgCCQELU3RyaW5nRW50cnkCCQEBWAIFAmJWBQFaCQECYVIKBQJleAUCZXkJAKADAQUCZUUFAmNpAAAAAAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAAAAAFA25pbAQCZUYJAGsDBQJldgUBYQUCZXUEAmVHCQBrAwUCZXAFAWEJAGQCBQJlRgUBYQQCZUgJAGUCBQJlcAUCZUcEAmVJCQC8AgMFAmVyCQC2AgEFAmVICQC2AgEFAmV2BAJlSgkAoAMBCQC8AgMJALgCAgUCZUUFAmVJBQFiBQJlSQkAlgoECQCgAwEFAmVFBQJkZQUCYlEFAmVKCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJlSwYCZUwCZU0CZU4CZHcCZU8CZVADCQECIT0CCQCQAwEFAmVOAAEJAAIBAgsxIHBtbnQgZXhwZAQCZXEJAQJhSAAEAmJXCQCRAwIFAmVxBQFzBAJiWAkAkQMCBQJlcQUBdAQCYlkJAJEDAgUCZXEFAXUEAmVRCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZXEFAXYEAmVSCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZXEFAXcEAmVTCQCRAwIFAmVxBQFyBAJiVgMJAAACBQJkdwUCYVEFAmVPBQJkdwQCZHUJAQV2YWx1ZQEJAJEDAgUCZU4AAAQCYlQJAQV2YWx1ZQEIBQJkdQdhc3NldElkBAJjeggFAmR1BmFtb3VudAQCYlMJANgEAQUCZVADCQECIT0CBQJiVwkA2AQBBQJiVAkAAgECCFdyb25nIExQBAJjZAkBAmJnAQUCYlgEAmNmCQECYmcBBQJiWQQCZVQKAAJlVQkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmVMCQDMCAIFAmN6BQNuaWwFA25pbAMJAAECBQJlVQIKKEludCwgSW50KQUCZVUJAAIBCQCsAgIJAAMBBQJlVQIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQQCZVYIBQJlVAJfMQQCYlEIBQJlVAJfMgQCZVcDAwkAZgIFAmVNAAAJAGYCBQJlTQUCZVYHCQACAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJlTQUDbmlsAgAFAmVWBAJlWAMJAAACBQJlTAUCYlgJAJYKBAUCZVcAAAkAZQIJAGUCBQJjZAUCZVcFAmJRBQJjZgMJAAACBQJlTAUCYlkJAJYKBAAABQJlVwUCY2QJAGUCCQBlAgUCY2YFAmVXBQJiUQkAAgECFGludmFsaWQgb3V0IGFzc2V0IGlkBAJlWQgFAmVYAl8xBAJlWggFAmVYAl8yBAJlQggFAmVYAl8zBAJlQwgFAmVYAl80BAJmYQkBAmJpAgkBAUUCBQJlQwUCZVIJAQFFAgUCZUIFAmVRBAJmYgkBAUgCBQJmYQUBYQQCZmMDCQAAAgUCZUwCBVdBVkVTBQR1bml0CQDZBAEFAmVMBAJmZAMJAGYCBQJiUQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFHBQJiUQUCZmMFA25pbAUDbmlsBAJjcAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJWBQJlVwUCZmMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFhAgkApQgBBQJiVgUCYlMJAQJiYwYFAmVZBQJlWgUCY3oFAmZiBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVAAFAmZiCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVQIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmZiBQNuaWwFAmZkAwkAAAIFAmNwBQJjcAQCZmUJAPwHBAUCYUMCBGJ1cm4JAMwIAgUCY3oFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYlQFAmN6BQNuaWwDCQAAAgUCZmUFAmZlCQCUCgIFAmNwBQJlVwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECZmYABAJhdwkAoggBCQEBUgADCQABAgUCYXcCBlN0cmluZwQCZEcFAmF3CQDZBAEFAmRHAwkAAQIFAmF3AgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmZnAAQCYXcJAKIIAQkBAVMAAwkAAQIFAmF3AgZTdHJpbmcEAmRHBQJhdwkA2QQBBQJkRwMJAAECBQJhdwIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAAJmaAkAAgECEVBlcm1pc3Npb24gZGVuaWVkAQJmaQECZHQEAmF3CQECZmYAAwkAAQIFAmF3AgpCeXRlVmVjdG9yBAJmagUCYXcDCQAAAggFAmR0D2NhbGxlclB1YmxpY0tleQUCZmoGBQJmaAMJAAECBQJhdwIEVW5pdAMJAAACCAUCZHQGY2FsbGVyBQR0aGlzBgUCZmgJAAIBAgtNYXRjaCBlcnJvchoCZHQBC2NvbnN0cnVjdG9yAQFRBAJlaAkBAmZpAQUCZHQDCQAAAgUCZWgFAmVoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFRAAUBUQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmR0AQpzZXRNYW5hZ2VyAQJmawQCZWgJAQJmaQEFAmR0AwkAAAIFAmVoBQJlaAQCZmwJANkEAQUCZmsDCQAAAgUCZmwFAmZsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFTAAUCZmsFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkdAEOY29uZmlybU1hbmFnZXIABAJiTgkBAmZnAAQCZm0DCQEJaXNEZWZpbmVkAQUCYk4GCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmZtBQJmbQQCZm4DCQAAAggFAmR0D2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCYk4GCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmZuBQJmbgkAzAgCCQELU3RyaW5nRW50cnkCCQEBUgAJANgEAQkBBXZhbHVlAQUCYk4JAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVMABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZHQBA3B1dAICZm8CZnAEAmZxCQECYUwABAJmcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZnEFAXoCCldyIHN0IGFkZHIEAmZzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJmcQUBQgIKV3Igc2wgYWRkcgMJAGYCAAAFAmZvCQACAQIOV3Jvbmcgc2xpcHBhZ2UDCQECIT0CCQCQAwEIBQJkdAhwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAJmdAkBAmR2CgkApQgBCAUCZHQGY2FsbGVyCQDYBAEIBQJkdA10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAmR0CHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAmR0CHBheW1lbnRzAAAGYW1vdW50CQCRAwIIBQJkdAhwYXltZW50cwABBQJmbwYHBgAAAgAEAmNZCAUCZnQCXzIEAmZ1CAUCZnQCXzcEAmNwCAUCZnQCXzkEAmNaCAUCZnQDXzEwBAJkYQgFAmZ0A18xMQQCYlgIBQJmdANfMTIEAmJZCAUCZnQDXzEzBAJjTAkA/AcEBQJhQwIEZW1pdAkAzAgCBQJjWQUDbmlsBQNuaWwDCQAAAgUCY0wFAmNMBAJmdgQCYXcFAmNMAwkAAQIFAmF3AgdBZGRyZXNzBAJmdwUCYXcJAPwHBAUCZncCBGVtaXQJAMwIAgUCY1kFA25pbAUDbmlsBQR1bml0AwkAAAIFAmZ2BQJmdgQCZngDCQBmAgUCY1oAAAkA/AcEBQJmcwIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJYBQJjWgUDbmlsBQNuaWwDCQAAAgUCZngFAmZ4BAJmeQMJAGYCBQJkYQAACQD8BwQFAmZzAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYlkFAmRhBQNuaWwFA25pbAMJAAACBQJmeQUCZnkEAmZ6AwUCZnAEAmZBCQD8BwQFAmZyAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJmdQUCY1kFA25pbAMJAAACBQJmQQUCZkEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCZHQGY2FsbGVyBQJjWQUCZnUFA25pbAkAzggCBQJjcAUCZnoJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZHQBC3B1dE9uZVRrblYyAgJlTQJmcAMJAQIhPQIJAJADAQgFAmR0CHBheW1lbnRzAAEJAAIBAgsxIHBtbnQgZXhwZAQCZXEJAQJhSAAEAmJYCQCRAwIFAmVxBQF0BAJiWQkAkQMCBQJlcQUBdQQCYlcJANkEAQkAkQMCBQJlcQUBcwQCZVEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJlcQUBdgQCZVIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJlcQUBdwQCYlYDCQAAAggFAmR0BmNhbGxlcgUEdGhpcwgFAmR0DG9yaWdpbkNhbGxlcggFAmR0BmNhbGxlcgQCZHUJAQV2YWx1ZQEJAJEDAggFAmR0CHBheW1lbnRzAAAEAmJUCQDYBAEJAQV2YWx1ZQEIBQJkdQdhc3NldElkBAJjeggFAmR1BmFtb3VudAQCZkIJAQJlbwQFAmN6BQJiVAkApQgBBQJiVgkA2AQBCAUCZHQNdHJhbnNhY3Rpb25JZAQCZkMIBQJmQgJfMQQCY3AIBQJmQgJfMgQCYlEIBQJmQgJfMwQCY1kDAwkAZgIFAmVNAAAJAGYCBQJlTQUCZkMHCQACAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJlTQUDbmlsAgAFAmZDBAJmdAkA/AcEBQJhQwIEZW1pdAkAzAgCBQJjWQUDbmlsBQNuaWwDCQAAAgUCZnQFAmZ0BAJmdgQCYXcFAmZ0AwkAAQIFAmF3AgdBZGRyZXNzBAJmdwUCYXcJAPwHBAUCZncCBGVtaXQJAMwIAgUCY1kFA25pbAUDbmlsBQR1bml0AwkAAAIFAmZ2BQJmdgQCZnoDBQJmcAQCZkEJAPwHBAUCYU4CBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJXBQJjWQUDbmlsAwkAAAIFAmZBBQJmQQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJkdAZjYWxsZXIFAmNZBQJiVwUDbmlsBAJmZAMJAGYCBQJiUQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFHBQJiUQkA2QQBBQJiVAUDbmlsBQNuaWwJAJQKAgkAzggCCQDOCAIFAmNwBQJmegUCZmQFAmNZCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmR0AQpwdXRGb3JGcmVlAQJmRAMJAGYCAAAFAmZECQACAQIKV3Jvbmcgc2xwZwMJAQIhPQIJAJADAQgFAmR0CHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmZFCQECZHYKCQClCAEIBQJkdAZjYWxsZXIJANgEAQgFAmR0DXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZHQIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZHQIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmR0CHBheW1lbnRzAAEFAmZEBwcGAAACAAgFAmZFAl85AmR0AQNnZXQABAJjTAkBAmRzAQUCZHQEAmZGCAUCY0wCXzEEAmNvCAUCY0wCXzIEAmN6CAUCY0wCXzMEAmJUCAUCY0wCXzQEAmNwCAUCY0wCXzUEAmVpCQD8BwQFAmFDAgRidXJuCQDMCAIFAmN6BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJUBQJjegUDbmlsAwkAAAIFAmVpBQJlaQUCY3AJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZHQBC2dldE9uZVRrblYyAgJlTAJlTQQCZkcJAQJlSwYFAmVMBQJlTQgFAmR0CHBheW1lbnRzCAUCZHQGY2FsbGVyCAUCZHQMb3JpZ2luQ2FsbGVyCAUCZHQNdHJhbnNhY3Rpb25JZAQCY3AIBQJmRwJfMQQCZVcIBQJmRwJfMgkAlAoCBQJjcAUCZVcCZHQBE2dldE9uZVRrblYyUkVBRE9OTFkCAmVMAmZIBAJlcQkBAmFIAAQCYlgJAJEDAgUCZXEFAXQEAmJZCQCRAwIFAmVxBQF1BAJiVwkAkQMCBQJlcQUBcwQCZEEJAMwIAgkAtgIBCQECYmcBBQJiWAkAzAgCCQC2AgEJAQJiZwEFAmJZBQNuaWwEAmZJCQC2AgEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJiVwIQaW52YWxpZCBscCBhc3NldAhxdWFudGl0eQQCYnQJAQJkegEFAmRBBAJicwkAuAICBQJidAkAvAIDCQC2AgEFAmZIBQJidAUCZkkEAmZKAwkAAAIFAmVMBQJiWAAAAwkAAAIFAmVMBQJiWQABCQACAQIUaW52YWxpZCBvdXQgYXNzZXQgaWQEAmZLCQECZWUDBQJkQQUCZkoFAmJzBAJmTAkAuAICCQCRAwIFAmRBBQJmSgUCZksEAmZNCQCWAwEJAMwIAgAACQDMCAIJAKADAQkAuAICBQJmTAUBZgUDbmlsBAJmTgkBAmJPAQUCZk0EAmVWCAUCZk4CXzEEAmJRCAUCZk4CXzIJAJQKAgUDbmlsCQCUCgIFAmVWBQJiUQJkdAEcZ2V0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQICZUwCZkgEAmVxCQECYUgABAJiWAkAkQMCBQJlcQUBdAQCYlkJAJEDAgUCZXEFAXUEAmJXCQCRAwIFAmVxBQFzBAJjZAkBAmJnAQUCYlgEAmNmCQECYmcBBQJiWQQCZk8KAAJlVQkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmVMCQDMCAIFAmZIBQNuaWwFA25pbAMJAAECBQJlVQIKKEludCwgSW50KQUCZVUJAAIBCQCsAgIJAAMBBQJlVQIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQQCZVYIBQJmTwJfMQQCYlEIBQJmTwJfMgQCY0wJAQJiUgQCAAUCYlcFAmZIBQR0aGlzBAJjbggFAmNMAl8xBAJjbwgFAmNMAl8yBAJmUAkAZAIFAmNuBQJjbwQCZUoDCQAAAgUCZlAAAAMJAAACBQJlVgAAAAAJAAIBAhdib251cyBjYWxjdWxhdGlvbiBlcnJvcgkAawMJAGUCBQJlVgUCZlAFAWEFAmZQCQCUCgIFA25pbAkAlQoDBQJlVgUCYlEFAmVKAmR0AQlnZXROb0xlc3MCAmZRAmZSBAJjTAkBAmRzAQUCZHQEAmNuCAUCY0wCXzEEAmNvCAUCY0wCXzIEAmN6CAUCY0wCXzMEAmJUCAUCY0wCXzQEAmNwCAUCY0wCXzUDCQBmAgUCZlEFAmNuCQACAQkArAICCQCsAgIJAKwCAgIJRmFpbGVkOiAgCQCkAwEFAmNuAgMgPCAJAKQDAQUCZlEDCQBmAgUCZlIFAmNvCQACAQkArAICCQCsAgIJAKwCAgIIRmFpbGVkOiAJAKQDAQUCY28CAyA8IAkApAMBBQJmUgQCZlMJAPwHBAUCYUMCBGJ1cm4JAMwIAgUCY3oFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYlQFAmN6BQNuaWwDCQAAAgUCZlMFAmZTBQJjcAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkdAENdW5zdGFrZUFuZEdldAECYlAEAmZUAwkBAiE9AgkAkAMBCAUCZHQIcGF5bWVudHMAAAkAAgECDU5vIHBtbnRzIGV4cGQGAwkAAAIFAmZUBQJmVAQCYkYJAQJhSAAEAmZVCQECYUwABAJmdQkA2QQBCQCRAwIFAmJGBQFzBAJmVgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZlUFAXoCCldyIHN0IGFkZHIEAmZXCQD8BwQFAmZWAgd1bnN0YWtlCQDMCAIJANgEAQUCZnUJAMwIAgUCYlAFA25pbAUDbmlsAwkAAAIFAmZXBQJmVwQCY0wJAQJiUgQJANgEAQgFAmR0DXRyYW5zYWN0aW9uSWQJANgEAQUCZnUFAmJQCAUCZHQGY2FsbGVyBAJjYgkBDXBhcnNlSW50VmFsdWUBCAUCY0wCXzkEAmNwCAUCY0wDXzEwBAJmWAMDCQECYUUABgkAAAIFAmNiBQFwCQACAQkArAICAglCbG9ja2VkOiAJAKQDAQUCY2IGAwkAAAIFAmZYBQJmWAQCZlkJAPwHBAUCYUMCBGJ1cm4JAMwIAgUCYlAFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZnUFAmJQBQNuaWwDCQAAAgUCZlkFAmZZBQJjcAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkdAEVdW5zdGFrZUFuZEdldE9uZVRrblYyAwJmWgJlTAJlTQQCZlQDCQECIT0CCQCQAwEIBQJkdAhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCZlQFAmZUBAJiRgkBAmFIAAQCZlUJAQJhTAAEAmZ1CQDZBAEJAJEDAgUCYkYFAXMEAmZWCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJmVQUBegIKV3Igc3QgYWRkcgQCZlcJAPwHBAUCZlYCB3Vuc3Rha2UJAMwIAgkA2AQBBQJmdQkAzAgCBQJmWgUDbmlsBQNuaWwDCQAAAgUCZlcFAmZXBAJnYQkBAmVLBgUCZUwFAmVNCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJmdQUCZloFA25pbAgFAmR0BmNhbGxlcggFAmR0DG9yaWdpbkNhbGxlcggFAmR0DXRyYW5zYWN0aW9uSWQEAmNwCAUCZ2ECXzEEAmVXCAUCZ2ECXzIJAJQKAgUCY3AFAmVXCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmR0ARxwdXRPbmVUa25WMldpdGhCb251c1JFQURPTkxZAgJnYgJnYwQCZXEJAQJhSAAEAmJYCQCRAwIFAmVxBQF0BAJiWQkAkQMCBQJlcQUBdQQCYlcJAJEDAgUCZXEFAXMEAmdkCQECZW8EBQJnYgUCZ2MCAAIABAJlRQgFAmdkAl8xBAJjcAgFAmdkAl8yBAJiUQgFAmdkAl8zBAJlSggFAmdkAl80CQCUCgIFA25pbAkAlQoDBQJlRQUCYlEFAmVKAmR0AQhhY3RpdmF0ZQICZ2UCZ2YDCQECIT0CCQClCAEIBQJkdAZjYWxsZXIJAKUIAQUCYUMJAAIBAgZkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWIABQJnZQkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMABQJnZgUDbmlsAgdzdWNjZXNzAmR0AQRzZXRTAgJnZwJmWAMJAQIhPQIJAKUIAQgFAmR0BmNhbGxlcgkBAmF5AgUEdGhpcwkBAmFlAAUCZmgJAMwIAgkBC1N0cmluZ0VudHJ5AgUCZ2cFAmZYBQNuaWwCZHQBBHNldEkCAmdnAmZYAwkBAiE9AgkApQgBCAUCZHQGY2FsbGVyCQECYXkCBQR0aGlzCQECYWUABQJmaAkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZ2cFAmZYBQNuaWwCZHQBHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkACQCUCgIFA25pbAkBAmFIAAJkdAEcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQECYmgJAJQKAgUDbmlsCQECYmcBBQJiaAJkdAEZY2FsY1ByaWNlc1dyYXBwZXJSRUFET05MWQMCYnoCYkECYkUEAmdoCQECYkQDBQJiegUCYkEFAmJFCQCUCgIFA25pbAkAzAgCCQCmAwEJAJEDAgUCZ2gAAAkAzAgCCQCmAwEJAJEDAgUCZ2gAAQkAzAgCCQCmAwEJAJEDAgUCZ2gAAgUDbmlsAmR0ARZmcm9tWDE4V3JhcHBlclJFQURPTkxZAgFJAmdpCQCUCgIFA25pbAkBAUgCCQCnAwEFAUkFAmdpAmR0ARR0b1gxOFdyYXBwZXJSRUFET05MWQIBRgFHCQCUCgIFA25pbAkApgMBCQEBRQIFAUYFAUcCZHQBHmNhbGNQcmljZUJpZ0ludFdyYXBwZXJSRUFET05MWQICYmoCYmsJAJQKAgUDbmlsCQCmAwEJAQJiaQIJAKcDAQUCYmoJAKcDAQUCYmsCZHQBI2VzdGltYXRlUHV0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZCQJiUwJibwJjcgJjcwJjdAJjdQJnagJjdgJjdwkAlAoCBQNuaWwJAQJjcQ0FAmJTBQJibwUCY3IFAmNzBQJjdAUCY3UFAmdqBQJjdgUCY3cGBwAAAgACZHQBI2VzdGltYXRlR2V0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZBAJiUwJnawJiVQJnagQCY0wJAQJiUgQFAmJTBQJnawUCYlUJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmdqCQCUCgIFA25pbAkAnAoKCAUCY0wCXzEIBQJjTAJfMggFAmNMAl8zCAUCY0wCXzQIBQJjTAJfNQgFAmNMAl82CAUCY0wCXzcJAKYDAQgFAmNMAl84CAUCY0wCXzkIBQJjTANfMTACZHQBDmdldEZlZVJFQURPTkxZAAkAlAoCBQNuaWwFAmFnAQJnbAECZ20ABAJnbgQCYXcJAQJmZgADCQABAgUCYXcCCkJ5dGVWZWN0b3IEAmZqBQJhdwUCZmoDCQABAgUCYXcCBFVuaXQIBQJnbA9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgQCYXcFAmdsAwkAAQIFAmF3AgVPcmRlcgQCZGcFAmF3BAJnbwkBAmFGAAQCZ3AJAQJkZgEFAmRnBAJncQkA9AMDCAUCZGcJYm9keUJ5dGVzCQCRAwIIBQJkZwZwcm9vZnMAAAgFAmRnD3NlbmRlclB1YmxpY0tleQQCZ3IJAPQDAwgFAmRnCWJvZHlCeXRlcwkAkQMCCAUCZGcGcHJvb2ZzAAEFAmdvAwMDBQJncAUCZ3EHBQJncgcGCQECYXIDBQJncAUCZ3EFAmdyAwkAAQIFAmF3AhRTZXRTY3JpcHRUcmFuc2FjdGlvbgQCZEcFAmF3BAJncwkA9gMBCQEFdmFsdWUBCAUCZEcGc2NyaXB0BAJndAkA2wQBCQEFdmFsdWUBCQCdCAIFAmFDCQECYXAABAJndQkA8QcBBQR0aGlzAwMJAAACBQJndAUCZ3MJAQIhPQIFAmd1BQJncwcGCQD0AwMIBQJnbAlib2R5Qnl0ZXMJAJEDAggFAmdsBnByb29mcwAABQJnbgkA9AMDCAUCZ2wJYm9keUJ5dGVzCQCRAwIIBQJnbAZwcm9vZnMAAAUCZ26XeZ6I", "chainId": 84, "height": 2286420, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BCXfQsLPed7gabn5SBQ7FqkQ3qJKujVDSNxzX9U6Gi8D Next: 7QJzozovA5LhSfuC3h7VxXAbKKFcSaMR8qzAonBsHMFy Diff:
OldNewDifferences
660660 }
661661 let totalGet = $t02635826466._1
662662 let feeAmount = $t02635826466._2
663- let checkTotalGet = if ((totalGet > 0))
664- then true
665- else throw("nothing to get")
666- if ((checkTotalGet == checkTotalGet))
663+ let totalAmount = if (if ((minOutAmount > 0))
664+ then (minOutAmount > totalGet)
665+ else false)
666+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
667+ else totalGet
668+ let $t02665326960 = if ((outAssetId == amId))
669+ then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
670+ else if ((outAssetId == prId))
671+ then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
672+ else throw("invalid out asset id")
673+ let outAm = $t02665326960._1
674+ let outPr = $t02665326960._2
675+ let amBalanceNew = $t02665326960._3
676+ let prBalanceNew = $t02665326960._4
677+ let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
678+ let curPr = f1(curPrX18, scale8)
679+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
680+ then unit
681+ else fromBase58String(outAssetId)
682+ let sendFeeToMatcher = if ((feeAmount > 0))
683+ then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
684+ else nil
685+ 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)] ++ sendFeeToMatcher)
686+ if ((state == state))
667687 then {
668- let totalAmount = if (if ((minOutAmount > 0))
669- then (minOutAmount > totalGet)
670- else false)
671- then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
672- else totalGet
673- let $t02671927026 = if ((outAssetId == amId))
674- then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
675- else if ((outAssetId == prId))
676- then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
677- else throw("invalid out asset id")
678- let outAm = $t02671927026._1
679- let outPr = $t02671927026._2
680- let amBalanceNew = $t02671927026._3
681- let prBalanceNew = $t02671927026._4
682- let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
683- let curPr = f1(curPrX18, scale8)
684- let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
685- then unit
686- else fromBase58String(outAssetId)
687- let sendFeeToMatcher = if ((feeAmount > 0))
688- then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
689- else nil
690- 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)] ++ sendFeeToMatcher)
691- if ((state == state))
692- then {
693- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
694- if ((burn == burn))
695- then $Tuple2(state, totalAmount)
696- else throw("Strict value is not equal to itself.")
697- }
688+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
689+ if ((burn == burn))
690+ then $Tuple2(state, totalAmount)
698691 else throw("Strict value is not equal to itself.")
699692 }
700693 else throw("Strict value is not equal to itself.")
860853 let pmt = value(i.payments[0])
861854 let pmtAssetId = toBase58String(value(pmt.assetId))
862855 let pmtAmt = pmt.amount
863- let $t03184031965 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
864- let estimLP = $t03184031965._1
865- let state = $t03184031965._2
866- let feeAmount = $t03184031965._3
856+ let $t03177431899 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
857+ let estimLP = $t03177431899._1
858+ let state = $t03177431899._2
859+ let feeAmount = $t03177431899._3
867860 let emitLpAmt = if (if ((minOutAmount > 0))
868861 then (minOutAmount > estimLP)
869862 else false)
930923
931924 @Callable(i)
932925 func getOneTknV2 (outAssetId,minOutAmount) = {
933- let $t03414834303 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
934- let state = $t03414834303._1
935- let totalAmount = $t03414834303._2
926+ let $t03408234237 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
927+ let state = $t03408234237._1
928+ let totalAmount = $t03408234237._2
936929 $Tuple2(state, totalAmount)
937930 }
938931
956949 let newY = getYD(xp, index, D1)
957950 let dy = (xp[index] - newY)
958951 let totalGetRaw = max([0, toInt((dy - big1))])
959- let $t03509335142 = takeFee(totalGetRaw)
960- let totalGet = $t03509335142._1
961- let feeAmount = $t03509335142._2
952+ let $t03502735076 = takeFee(totalGetRaw)
953+ let totalGet = $t03502735076._1
954+ let feeAmount = $t03502735076._2
962955 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
963956 }
964957
972965 let lpId = poolConfig[idxLPAsId]
973966 let amBalance = getAccBalance(amId)
974967 let prBalance = getAccBalance(prId)
975- let $t03548735602 = {
968+ let $t03542135536 = {
976969 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
977970 if ($isInstanceOf(@, "(Int, Int)"))
978971 then @
979972 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
980973 }
981- let totalGet = $t03548735602._1
982- let feeAmount = $t03548735602._2
974+ let totalGet = $t03542135536._1
975+ let feeAmount = $t03542135536._2
983976 let r = ego("", lpId, lpAssetAmount, this)
984977 let outAmAmt = r._1
985978 let outPrAmt = r._2
10681061 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
10691062 if ((unstakeInv == unstakeInv))
10701063 then {
1071- let $t03802938217 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1072- let state = $t03802938217._1
1073- let totalAmount = $t03802938217._2
1064+ let $t03796338151 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1065+ let state = $t03796338151._1
1066+ let totalAmount = $t03796338151._2
10741067 $Tuple2(state, totalAmount)
10751068 }
10761069 else throw("Strict value is not equal to itself.")
10861079 let amId = poolConfig[idxAmAsId]
10871080 let prId = poolConfig[idxPrAsId]
10881081 let lpId = poolConfig[idxLPAsId]
1089- let $t03847638573 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1090- let lpAmount = $t03847638573._1
1091- let state = $t03847638573._2
1092- let feeAmount = $t03847638573._3
1093- let bonus = $t03847638573._4
1082+ let $t03841038507 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1083+ let lpAmount = $t03841038507._1
1084+ let state = $t03841038507._2
1085+ let feeAmount = $t03841038507._3
1086+ let bonus = $t03841038507._4
10941087 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
10951088 }
10961089
Full:
OldNewDifferences
11 {-# 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 zeroBigInt = toBigInt(0)
1111
1212 let big0 = toBigInt(0)
1313
1414 let big1 = toBigInt(1)
1515
1616 let big2 = toBigInt(2)
1717
1818 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1919
2020 let Amult = "100"
2121
2222 let Dconv = "1"
2323
2424 let SEP = "__"
2525
2626 let EMPTY = ""
2727
2828 let PoolActive = 1
2929
3030 let PoolPutDis = 2
3131
3232 let PoolMatcherDis = 3
3333
3434 let PoolShutdown = 4
3535
3636 let idxPoolAddress = 1
3737
3838 let idxPoolSt = 2
3939
4040 let idxLPAsId = 3
4141
4242 let idxAmAsId = 4
4343
4444 let idxPrAsId = 5
4545
4646 let idxAmtAsDcm = 6
4747
4848 let idxPriceAsDcm = 7
4949
5050 let idxIAmtAsId = 8
5151
5252 let idxIPriceAsId = 9
5353
5454 let idxFactStakCntr = 1
5555
5656 let idxFactoryRestCntr = 6
5757
5858 let idxFactSlippCntr = 7
5959
6060 let idxFactGwxRewCntr = 10
6161
6262 let feeDefault = fraction(5, scale8, 10000)
6363
6464 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6565
6666
6767 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6868
6969
7070 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
7171
7272
7373 func abs (val) = if ((zeroBigInt > val))
7474 then -(val)
7575 else val
7676
7777
7878 func absBigInt (val) = if ((zeroBigInt > val))
7979 then -(val)
8080 else val
8181
8282
8383 func fc () = "%s__factoryContract"
8484
8585
8686 func mpk () = "%s__managerPublicKey"
8787
8888
8989 func pmpk () = "%s__pendingManagerPublicKey"
9090
9191
9292 func pl () = "%s%s__price__last"
9393
9494
9595 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
9696
9797
9898 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
9999
100100
101101 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
102102
103103
104104 func aa () = "%s__amountAsset"
105105
106106
107107 func pa () = "%s__priceAsset"
108108
109109
110110 func amp () = "%s__amp"
111111
112112
113113 func ada () = "%s__addonAddr"
114114
115115
116116 let keyFee = "%s__fee"
117117
118118 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
119119
120120 func fcfg () = "%s__factoryConfig"
121121
122122
123123 func mtpk () = "%s%s__matcher__publicKey"
124124
125125
126126 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
127127
128128
129129 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
130130
131131
132132 func aps () = "%s__shutdown"
133133
134134
135135 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
136136
137137
138138 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
139139
140140
141141 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
142142
143143
144144 func str (val) = match val {
145145 case valStr: String =>
146146 valStr
147147 case _ =>
148148 throw("fail cast to String")
149149 }
150150
151151
152152 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
153153
154154
155155 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
156156
157157
158158 let fca = addressFromStringValue(strf(this, fc()))
159159
160160 let A = strf(this, amp())
161161
162162 func igs () = valueOrElse(getBoolean(fca, aps()), false)
163163
164164
165165 func mp () = fromBase58String(strf(fca, mtpk()))
166166
167167
168168 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
169169
170170 func gpc () = {
171171 let amtAs = strf(this, aa())
172172 let priceAs = strf(this, pa())
173173 let iPriceAs = intf(fca, mba(priceAs))
174174 let iAmtAs = intf(fca, mba(amtAs))
175175 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
176176 }
177177
178178
179179 func gfc () = split(strf(fca, fcfg()), SEP)
180180
181181
182182 let factoryConfig = gfc()
183183
184184 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
185185
186186 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
187187
188188 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
189189
190190 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
191191
192192 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)
193193
194194
195195 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)
196196
197197
198198 func getAccBalance (assetId) = if ((assetId == "WAVES"))
199199 then wavesBalance(this).available
200200 else assetBalance(this, fromBase58String(assetId))
201201
202202
203203 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
204204
205205
206206 func vad (A1,A2,slippage) = {
207207 let diff = fraction((A1 - A2), scale8BigInt, A2)
208208 let pass = ((slippage - abs(diff)) > zeroBigInt)
209209 if (!(pass))
210210 then throw(("Big slpg: " + toString(diff)))
211211 else $Tuple2(pass, min([A1, A2]))
212212 }
213213
214214
215215 func vd (D1,D0,slpg) = {
216216 let diff = fraction(D0, scale8BigInt, D1)
217217 let fail = (slpg > diff)
218218 if (if (fail)
219219 then true
220220 else (D0 > D1))
221221 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
222222 else fail
223223 }
224224
225225
226226 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
227227 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
228228 let prAsAmtX18 = t1(prAmt, prAssetDcm)
229229 cpbi(prAsAmtX18, amtAsAmtX18)
230230 }
231231
232232
233233 func calcPrices (amAmt,prAmt,lpAmt) = {
234234 let cfg = gpc()
235235 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
236236 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
237237 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
238238 let amAmtX18 = t1(amAmt, amtAsDcm)
239239 let prAmtX18 = t1(prAmt, prAsDcm)
240240 let lpAmtX18 = t1(lpAmt, scale8)
241241 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
242242 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
243243 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
244244 }
245245
246246
247247 func calculatePrices (amAmt,prAmt,lpAmt) = {
248248 let p = calcPrices(amAmt, prAmt, lpAmt)
249249 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
250250 }
251251
252252
253253 func takeFee (amount) = {
254254 let feeAmount = fraction(amount, fee, scale8)
255255 $Tuple2((amount - feeAmount), feeAmount)
256256 }
257257
258258
259259 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
260260 let cfg = gpc()
261261 let lpId = cfg[idxLPAsId]
262262 let amId = cfg[idxAmAsId]
263263 let prId = cfg[idxPrAsId]
264264 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
265265 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
266266 let sts = cfg[idxPoolSt]
267267 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
268268 if ((lpId != pmtAssetId))
269269 then throw("Wrong pmt asset")
270270 else {
271271 let amBalance = getAccBalance(amId)
272272 let amBalanceX18 = t1(amBalance, amDcm)
273273 let prBalance = getAccBalance(prId)
274274 let prBalanceX18 = t1(prBalance, prDcm)
275275 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
276276 let curPrice = f1(curPriceX18, scale8)
277277 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
278278 let lpEmissX18 = t1(lpEmiss, scale8)
279279 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
280280 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
281281 let outAmAmt = f1(outAmAmtX18, amDcm)
282282 let outPrAmt = f1(outPrAmtX18, prDcm)
283283 let state = if ((txId58 == ""))
284284 then nil
285285 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
286286 then unit
287287 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
288288 then unit
289289 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)]
290290 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
291291 }
292292 }
293293
294294
295295 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
296296 let cfg = gpc()
297297 let lpId = fromBase58String(cfg[idxLPAsId])
298298 let amIdStr = cfg[idxAmAsId]
299299 let prIdStr = cfg[idxPrAsId]
300300 let inAmIdStr = cfg[idxIAmtAsId]
301301 let inPrIdStr = cfg[idxIPriceAsId]
302302 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
303303 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
304304 let sts = cfg[idxPoolSt]
305305 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
306306 let amBalance = if (isEval)
307307 then getAccBalance(amIdStr)
308308 else if (if (isOneAsset)
309309 then (pmtId == amIdStr)
310310 else false)
311311 then (getAccBalance(amIdStr) - pmtAmt)
312312 else if (isOneAsset)
313313 then getAccBalance(amIdStr)
314314 else (getAccBalance(amIdStr) - inAmAmt)
315315 let prBalance = if (isEval)
316316 then getAccBalance(prIdStr)
317317 else if (if (isOneAsset)
318318 then (pmtId == prIdStr)
319319 else false)
320320 then (getAccBalance(prIdStr) - pmtAmt)
321321 else if (isOneAsset)
322322 then getAccBalance(prIdStr)
323323 else (getAccBalance(prIdStr) - inPrAmt)
324324 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
325325 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
326326 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
327327 let amBalanceX18 = t1(amBalance, amtDcm)
328328 let prBalanceX18 = t1(prBalance, priceDcm)
329329 let r = if ((lpEm == 0))
330330 then {
331331 let curPriceX18 = zeroBigInt
332332 let slippageX18 = zeroBigInt
333333 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
334334 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
335335 }
336336 else {
337337 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
338338 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
339339 let slippageX18 = t1(slippage, scale8)
340340 if (if (if (validateSlippage)
341341 then (curPriceX18 != zeroBigInt)
342342 else false)
343343 then (slippageRealX18 > slippageX18)
344344 else false)
345345 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
346346 else {
347347 let lpEmissionX18 = t1(lpEm, scale8)
348348 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
349349 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
350350 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
351351 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
352352 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
353353 let expAmtAssetAmtX18 = expectedAmts._1
354354 let expPriceAssetAmtX18 = expectedAmts._2
355355 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
356356 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
357357 }
358358 }
359359 let calcLpAmt = r._1
360360 let calcAmAssetPmt = r._2
361361 let calcPrAssetPmt = r._3
362362 let curPrice = f1(r._4, scale8)
363363 let slippageCalc = f1(r._5, scale8)
364364 if ((0 >= calcLpAmt))
365365 then throw("LP <= 0")
366366 else {
367367 let emitLpAmt = if (!(emitLp))
368368 then 0
369369 else calcLpAmt
370370 let amDiff = (inAmAmt - calcAmAssetPmt)
371371 let prDiff = (inPrAmt - calcPrAssetPmt)
372372 let $t01650916854 = if (if (isOneAsset)
373373 then (pmtId == amIdStr)
374374 else false)
375375 then $Tuple2(pmtAmt, 0)
376376 else if (if (isOneAsset)
377377 then (pmtId == prIdStr)
378378 else false)
379379 then $Tuple2(0, pmtAmt)
380380 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
381381 let writeAmAmt = $t01650916854._1
382382 let writePrAmt = $t01650916854._2
383383 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))]
384384 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
385385 }
386386 }
387387
388388
389389 func moa (order) = {
390390 let cfg = gpc()
391391 let amtAsId = cfg[idxAmAsId]
392392 let prAsId = cfg[idxPrAsId]
393393 let sts = parseIntValue(cfg[idxPoolSt])
394394 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
395395 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
396396 let accAmtAsBalance = getAccBalance(amtAsId)
397397 let accPrAsBalance = getAccBalance(prAsId)
398398 let curPriceX18 = if ((order.orderType == Buy))
399399 then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
400400 else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
401401 let curPrice = f1(curPriceX18, scale8)
402402 if (if (if (igs())
403403 then true
404404 else (sts == PoolMatcherDis))
405405 then true
406406 else (sts == PoolShutdown))
407407 then throw("Admin blocked")
408408 else {
409409 let orAmtAsset = order.assetPair.amountAsset
410410 let orAmtAsStr = if ((orAmtAsset == unit))
411411 then "WAVES"
412412 else toBase58String(value(orAmtAsset))
413413 let orPrAsset = order.assetPair.priceAsset
414414 let orPrAsStr = if ((orPrAsset == unit))
415415 then "WAVES"
416416 else toBase58String(value(orPrAsset))
417417 if (if ((orAmtAsStr != amtAsId))
418418 then true
419419 else (orPrAsStr != prAsId))
420420 then throw("Wr assets")
421421 else {
422422 let orderPrice = order.price
423423 let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
424424 let castOrderPrice = ts(orderPrice, scale8, priceDcm)
425425 let isOrderPriceValid = if ((order.orderType == Buy))
426426 then (curPrice >= castOrderPrice)
427427 else (castOrderPrice >= curPrice)
428428 true
429429 }
430430 }
431431 }
432432
433433
434434 func cg (i) = if ((size(i.payments) != 1))
435435 then throw("1 pmnt exp")
436436 else {
437437 let pmt = value(i.payments[0])
438438 let pmtAssetId = value(pmt.assetId)
439439 let pmtAmt = pmt.amount
440440 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
441441 let outAmAmt = r._1
442442 let outPrAmt = r._2
443443 let sts = parseIntValue(r._9)
444444 let state = r._10
445445 if (if (igs())
446446 then true
447447 else (sts == PoolShutdown))
448448 then throw(("Admin blocked: " + toString(sts)))
449449 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
450450 }
451451
452452
453453 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
454454 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
455455 let sts = parseIntValue(r._8)
456456 if (if (if (igs())
457457 then true
458458 else (sts == PoolPutDis))
459459 then true
460460 else (sts == PoolShutdown))
461461 then throw(("Blocked:" + toString(sts)))
462462 else r
463463 }
464464
465465
466466 func getD (xp) = {
467467 let n = big2
468468 let xp0 = xp[0]
469469 let xp1 = xp[1]
470470 let aPrecision = parseBigIntValue(Amult)
471471 let a = (parseBigIntValue(A) * aPrecision)
472472 let s = (xp0 + xp1)
473473 if ((s == big0))
474474 then big0
475475 else {
476476 let ann = (a * n)
477477 let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
478478 let ann_s_aPrecision = ((ann * s) / aPrecision)
479479 let ann_aPrecision = (ann - aPrecision)
480480 let n1 = (n + big1)
481481 func calc (acc,cur) = {
482482 let $t02140621426 = acc
483483 let d = $t02140621426._1
484484 let found = $t02140621426._2
485485 if ((found != unit))
486486 then acc
487487 else {
488488 let dp = (((d * d) * d) / xp0_xp1_n_n)
489489 let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
490490 let dDiff = absBigInt((dNext - value(d)))
491491 if ((big1 >= dDiff))
492492 then $Tuple2(dNext, cur)
493493 else $Tuple2(dNext, unit)
494494 }
495495 }
496496
497497 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
498498 let $t02184721894 = {
499499 let $l = arr
500500 let $s = size($l)
501501 let $acc0 = $Tuple2(s, unit)
502502 func $f0_1 ($a,$i) = if (($i >= $s))
503503 then $a
504504 else calc($a, $l[$i])
505505
506506 func $f0_2 ($a,$i) = if (($i >= $s))
507507 then $a
508508 else throw("List size exceeds 15")
509509
510510 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
511511 }
512512 let d = $t02184721894._1
513513 let found = $t02184721894._2
514514 if ((found != unit))
515515 then d
516516 else throw(("D calculation error, D = " + toString(d)))
517517 }
518518 }
519519
520520
521521 func getYD (xp,i,D) = {
522522 let n = big2
523523 let x = xp[if ((i == 0))
524524 then 1
525525 else 0]
526526 let aPrecision = parseBigIntValue(Amult)
527527 let a = (parseBigIntValue(A) * aPrecision)
528528 let s = x
529529 let ann = (a * n)
530530 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
531531 let b = ((s + ((D * aPrecision) / ann)) - D)
532532 func calc (acc,cur) = {
533533 let $t02239422414 = acc
534534 let y = $t02239422414._1
535535 let found = $t02239422414._2
536536 if ((found != unit))
537537 then acc
538538 else {
539539 let yNext = (((y * y) + c) / ((big2 * y) + b))
540540 let yDiff = absBigInt((yNext - value(y)))
541541 if ((big1 >= yDiff))
542542 then $Tuple2(yNext, cur)
543543 else $Tuple2(yNext, unit)
544544 }
545545 }
546546
547547 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
548548 let $t02272122768 = {
549549 let $l = arr
550550 let $s = size($l)
551551 let $acc0 = $Tuple2(D, unit)
552552 func $f0_1 ($a,$i) = if (($i >= $s))
553553 then $a
554554 else calc($a, $l[$i])
555555
556556 func $f0_2 ($a,$i) = if (($i >= $s))
557557 then $a
558558 else throw("List size exceeds 15")
559559
560560 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
561561 }
562562 let y = $t02272122768._1
563563 let found = $t02272122768._2
564564 if ((found != unit))
565565 then y
566566 else throw(("Y calculation error, Y = " + toString(y)))
567567 }
568568
569569
570570 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId) = {
571571 let poolConfig = gpc()
572572 let amId = poolConfig[idxAmAsId]
573573 let prId = poolConfig[idxPrAsId]
574574 let lpId = poolConfig[idxLPAsId]
575575 let amtDcm = parseIntValue(poolConfig[idxAmtAsDcm])
576576 let priceDcm = parseIntValue(poolConfig[idxPriceAsDcm])
577577 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
578578 let chechEmission = if ((lpAssetEmission > big0))
579579 then true
580580 else throw("initial deposit requires all coins")
581581 if ((chechEmission == chechEmission))
582582 then {
583583 let amBalance = getAccBalance(amId)
584584 let prBalance = getAccBalance(prId)
585585 let $t02352723989 = if ((txId == ""))
586586 then $Tuple2(amBalance, prBalance)
587587 else if ((pmtAssetId == amId))
588588 then if ((pmtAmtRaw > amBalance))
589589 then throw("invalid payment amount")
590590 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
591591 else if ((pmtAssetId == prId))
592592 then if ((pmtAmtRaw > prBalance))
593593 then throw("invalid payment amount")
594594 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
595595 else throw("wrong pmtAssetId")
596596 let amBalanceOld = $t02352723989._1
597597 let prBalanceOld = $t02352723989._2
598598 let $t02399524171 = if ((pmtAssetId == amId))
599599 then $Tuple2(pmtAmtRaw, 0)
600600 else if ((pmtAssetId == prId))
601601 then $Tuple2(0, pmtAmtRaw)
602602 else throw("invalid payment")
603603 let amAmountRaw = $t02399524171._1
604604 let prAmountRaw = $t02399524171._2
605605 let amAmount = takeFee(amAmountRaw)._1
606606 let prAmount = takeFee(prAmountRaw)._1
607607 let feeAmount = takeFee(pmtAmtRaw)._2
608608 let amBalanceNew = (amBalanceOld + amAmount)
609609 let prBalanceNew = (prBalanceOld + prAmount)
610610 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
611611 let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
612612 let checkD = if ((D1 > D0))
613613 then true
614614 else throw()
615615 if ((checkD == checkD))
616616 then {
617617 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0)
618618 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
619619 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId), dataPutActionInfo(amAmountRaw, prAmountRaw, toInt(lpAmount), curPrice, 0, 0, height, lastBlock.timestamp, 0, 0))]
620620 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
621621 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
622622 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
623623 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
624624 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
625625 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
626626 }
627627 else throw("Strict value is not equal to itself.")
628628 }
629629 else throw("Strict value is not equal to itself.")
630630 }
631631
632632
633633 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = if ((size(payments) != 1))
634634 then throw("1 pmnt expd")
635635 else {
636636 let poolConfig = gpc()
637637 let lpId = poolConfig[idxLPAsId]
638638 let amId = poolConfig[idxAmAsId]
639639 let prId = poolConfig[idxPrAsId]
640640 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
641641 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
642642 let poolStatus = poolConfig[idxPoolSt]
643643 let userAddress = if ((caller == restContract))
644644 then originCaller
645645 else caller
646646 let pmt = value(payments[0])
647647 let pmtAssetId = value(pmt.assetId)
648648 let pmtAmt = pmt.amount
649649 let txId58 = toBase58String(transactionId)
650650 if ((lpId != toBase58String(pmtAssetId)))
651651 then throw("Wrong LP")
652652 else {
653653 let amBalance = getAccBalance(amId)
654654 let prBalance = getAccBalance(prId)
655655 let $t02635826466 = {
656656 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
657657 if ($isInstanceOf(@, "(Int, Int)"))
658658 then @
659659 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
660660 }
661661 let totalGet = $t02635826466._1
662662 let feeAmount = $t02635826466._2
663- let checkTotalGet = if ((totalGet > 0))
664- then true
665- else throw("nothing to get")
666- if ((checkTotalGet == checkTotalGet))
663+ let totalAmount = if (if ((minOutAmount > 0))
664+ then (minOutAmount > totalGet)
665+ else false)
666+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
667+ else totalGet
668+ let $t02665326960 = if ((outAssetId == amId))
669+ then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
670+ else if ((outAssetId == prId))
671+ then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
672+ else throw("invalid out asset id")
673+ let outAm = $t02665326960._1
674+ let outPr = $t02665326960._2
675+ let amBalanceNew = $t02665326960._3
676+ let prBalanceNew = $t02665326960._4
677+ let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
678+ let curPr = f1(curPrX18, scale8)
679+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
680+ then unit
681+ else fromBase58String(outAssetId)
682+ let sendFeeToMatcher = if ((feeAmount > 0))
683+ then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
684+ else nil
685+ 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)] ++ sendFeeToMatcher)
686+ if ((state == state))
667687 then {
668- let totalAmount = if (if ((minOutAmount > 0))
669- then (minOutAmount > totalGet)
670- else false)
671- then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
672- else totalGet
673- let $t02671927026 = if ((outAssetId == amId))
674- then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
675- else if ((outAssetId == prId))
676- then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
677- else throw("invalid out asset id")
678- let outAm = $t02671927026._1
679- let outPr = $t02671927026._2
680- let amBalanceNew = $t02671927026._3
681- let prBalanceNew = $t02671927026._4
682- let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
683- let curPr = f1(curPrX18, scale8)
684- let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
685- then unit
686- else fromBase58String(outAssetId)
687- let sendFeeToMatcher = if ((feeAmount > 0))
688- then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
689- else nil
690- 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)] ++ sendFeeToMatcher)
691- if ((state == state))
692- then {
693- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
694- if ((burn == burn))
695- then $Tuple2(state, totalAmount)
696- else throw("Strict value is not equal to itself.")
697- }
688+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
689+ if ((burn == burn))
690+ then $Tuple2(state, totalAmount)
698691 else throw("Strict value is not equal to itself.")
699692 }
700693 else throw("Strict value is not equal to itself.")
701694 }
702695 }
703696
704697
705698 func m () = match getString(mpk()) {
706699 case s: String =>
707700 fromBase58String(s)
708701 case _: Unit =>
709702 unit
710703 case _ =>
711704 throw("Match error")
712705 }
713706
714707
715708 func pm () = match getString(pmpk()) {
716709 case s: String =>
717710 fromBase58String(s)
718711 case _: Unit =>
719712 unit
720713 case _ =>
721714 throw("Match error")
722715 }
723716
724717
725718 let pd = throw("Permission denied")
726719
727720 func mm (i) = match m() {
728721 case pk: ByteVector =>
729722 if ((i.callerPublicKey == pk))
730723 then true
731724 else pd
732725 case _: Unit =>
733726 if ((i.caller == this))
734727 then true
735728 else pd
736729 case _ =>
737730 throw("Match error")
738731 }
739732
740733
741734 @Callable(i)
742735 func constructor (fc) = {
743736 let c = mm(i)
744737 if ((c == c))
745738 then [StringEntry(fc(), fc)]
746739 else throw("Strict value is not equal to itself.")
747740 }
748741
749742
750743
751744 @Callable(i)
752745 func setManager (pendingManagerPublicKey) = {
753746 let c = mm(i)
754747 if ((c == c))
755748 then {
756749 let cm = fromBase58String(pendingManagerPublicKey)
757750 if ((cm == cm))
758751 then [StringEntry(pmpk(), pendingManagerPublicKey)]
759752 else throw("Strict value is not equal to itself.")
760753 }
761754 else throw("Strict value is not equal to itself.")
762755 }
763756
764757
765758
766759 @Callable(i)
767760 func confirmManager () = {
768761 let p = pm()
769762 let hpm = if (isDefined(p))
770763 then true
771764 else throw("No pending manager")
772765 if ((hpm == hpm))
773766 then {
774767 let cpm = if ((i.callerPublicKey == value(p)))
775768 then true
776769 else throw("You are not pending manager")
777770 if ((cpm == cpm))
778771 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
779772 else throw("Strict value is not equal to itself.")
780773 }
781774 else throw("Strict value is not equal to itself.")
782775 }
783776
784777
785778
786779 @Callable(i)
787780 func put (slip,autoStake) = {
788781 let factCfg = gfc()
789782 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
790783 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
791784 if ((0 > slip))
792785 then throw("Wrong slippage")
793786 else if ((size(i.payments) != 2))
794787 then throw("2 pmnts expd")
795788 else {
796789 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, true, 0, "")
797790 let emitLpAmt = e._2
798791 let lpAssetId = e._7
799792 let state = e._9
800793 let amDiff = e._10
801794 let prDiff = e._11
802795 let amId = e._12
803796 let prId = e._13
804797 let r = invoke(fca, "emit", [emitLpAmt], nil)
805798 if ((r == r))
806799 then {
807800 let el = match r {
808801 case legacy: Address =>
809802 invoke(legacy, "emit", [emitLpAmt], nil)
810803 case _ =>
811804 unit
812805 }
813806 if ((el == el))
814807 then {
815808 let sa = if ((amDiff > 0))
816809 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
817810 else nil
818811 if ((sa == sa))
819812 then {
820813 let sp = if ((prDiff > 0))
821814 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
822815 else nil
823816 if ((sp == sp))
824817 then {
825818 let lpTrnsfr = if (autoStake)
826819 then {
827820 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
828821 if ((ss == ss))
829822 then nil
830823 else throw("Strict value is not equal to itself.")
831824 }
832825 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
833826 (state ++ lpTrnsfr)
834827 }
835828 else throw("Strict value is not equal to itself.")
836829 }
837830 else throw("Strict value is not equal to itself.")
838831 }
839832 else throw("Strict value is not equal to itself.")
840833 }
841834 else throw("Strict value is not equal to itself.")
842835 }
843836 }
844837
845838
846839
847840 @Callable(i)
848841 func putOneTknV2 (minOutAmount,autoStake) = if ((size(i.payments) != 1))
849842 then throw("1 pmnt expd")
850843 else {
851844 let poolConfig = gpc()
852845 let amId = poolConfig[idxAmAsId]
853846 let prId = poolConfig[idxPrAsId]
854847 let lpId = fromBase58String(poolConfig[idxLPAsId])
855848 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
856849 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
857850 let userAddress = if ((i.caller == this))
858851 then i.originCaller
859852 else i.caller
860853 let pmt = value(i.payments[0])
861854 let pmtAssetId = toBase58String(value(pmt.assetId))
862855 let pmtAmt = pmt.amount
863- let $t03184031965 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
864- let estimLP = $t03184031965._1
865- let state = $t03184031965._2
866- let feeAmount = $t03184031965._3
856+ let $t03177431899 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
857+ let estimLP = $t03177431899._1
858+ let state = $t03177431899._2
859+ let feeAmount = $t03177431899._3
867860 let emitLpAmt = if (if ((minOutAmount > 0))
868861 then (minOutAmount > estimLP)
869862 else false)
870863 then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
871864 else estimLP
872865 let e = invoke(fca, "emit", [emitLpAmt], nil)
873866 if ((e == e))
874867 then {
875868 let el = match e {
876869 case legacy: Address =>
877870 invoke(legacy, "emit", [emitLpAmt], nil)
878871 case _ =>
879872 unit
880873 }
881874 if ((el == el))
882875 then {
883876 let lpTrnsfr = if (autoStake)
884877 then {
885878 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
886879 if ((ss == ss))
887880 then nil
888881 else throw("Strict value is not equal to itself.")
889882 }
890883 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
891884 let sendFeeToMatcher = if ((feeAmount > 0))
892885 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
893886 else nil
894887 $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
895888 }
896889 else throw("Strict value is not equal to itself.")
897890 }
898891 else throw("Strict value is not equal to itself.")
899892 }
900893
901894
902895
903896 @Callable(i)
904897 func putForFree (maxSlpg) = if ((0 > maxSlpg))
905898 then throw("Wrong slpg")
906899 else if ((size(i.payments) != 2))
907900 then throw("2 pmnts expd")
908901 else {
909902 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, true, 0, "")
910903 estPut._9
911904 }
912905
913906
914907
915908 @Callable(i)
916909 func get () = {
917910 let r = cg(i)
918911 let outAmtAmt = r._1
919912 let outPrAmt = r._2
920913 let pmtAmt = r._3
921914 let pmtAssetId = r._4
922915 let state = r._5
923916 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
924917 if ((b == b))
925918 then state
926919 else throw("Strict value is not equal to itself.")
927920 }
928921
929922
930923
931924 @Callable(i)
932925 func getOneTknV2 (outAssetId,minOutAmount) = {
933- let $t03414834303 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
934- let state = $t03414834303._1
935- let totalAmount = $t03414834303._2
926+ let $t03408234237 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
927+ let state = $t03408234237._1
928+ let totalAmount = $t03408234237._2
936929 $Tuple2(state, totalAmount)
937930 }
938931
939932
940933
941934 @Callable(i)
942935 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
943936 let poolConfig = gpc()
944937 let amId = poolConfig[idxAmAsId]
945938 let prId = poolConfig[idxPrAsId]
946939 let lpId = poolConfig[idxLPAsId]
947940 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
948941 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
949942 let D0 = getD(xp)
950943 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
951944 let index = if ((outAssetId == amId))
952945 then 0
953946 else if ((outAssetId == prId))
954947 then 1
955948 else throw("invalid out asset id")
956949 let newY = getYD(xp, index, D1)
957950 let dy = (xp[index] - newY)
958951 let totalGetRaw = max([0, toInt((dy - big1))])
959- let $t03509335142 = takeFee(totalGetRaw)
960- let totalGet = $t03509335142._1
961- let feeAmount = $t03509335142._2
952+ let $t03502735076 = takeFee(totalGetRaw)
953+ let totalGet = $t03502735076._1
954+ let feeAmount = $t03502735076._2
962955 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
963956 }
964957
965958
966959
967960 @Callable(i)
968961 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
969962 let poolConfig = gpc()
970963 let amId = poolConfig[idxAmAsId]
971964 let prId = poolConfig[idxPrAsId]
972965 let lpId = poolConfig[idxLPAsId]
973966 let amBalance = getAccBalance(amId)
974967 let prBalance = getAccBalance(prId)
975- let $t03548735602 = {
968+ let $t03542135536 = {
976969 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
977970 if ($isInstanceOf(@, "(Int, Int)"))
978971 then @
979972 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
980973 }
981- let totalGet = $t03548735602._1
982- let feeAmount = $t03548735602._2
974+ let totalGet = $t03542135536._1
975+ let feeAmount = $t03542135536._2
983976 let r = ego("", lpId, lpAssetAmount, this)
984977 let outAmAmt = r._1
985978 let outPrAmt = r._2
986979 let sumOfGetAssets = (outAmAmt + outPrAmt)
987980 let bonus = if ((sumOfGetAssets == 0))
988981 then if ((totalGet == 0))
989982 then 0
990983 else throw("bonus calculation error")
991984 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
992985 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
993986 }
994987
995988
996989
997990 @Callable(i)
998991 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
999992 let r = cg(i)
1000993 let outAmAmt = r._1
1001994 let outPrAmt = r._2
1002995 let pmtAmt = r._3
1003996 let pmtAssetId = r._4
1004997 let state = r._5
1005998 if ((noLessThenAmtAsset > outAmAmt))
1006999 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
10071000 else if ((noLessThenPriceAsset > outPrAmt))
10081001 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
10091002 else {
10101003 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
10111004 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
10121005 then state
10131006 else throw("Strict value is not equal to itself.")
10141007 }
10151008 }
10161009
10171010
10181011
10191012 @Callable(i)
10201013 func unstakeAndGet (amount) = {
10211014 let checkPayments = if ((size(i.payments) != 0))
10221015 then throw("No pmnts expd")
10231016 else true
10241017 if ((checkPayments == checkPayments))
10251018 then {
10261019 let cfg = gpc()
10271020 let factoryCfg = gfc()
10281021 let lpAssetId = fromBase58String(cfg[idxLPAsId])
10291022 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
10301023 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
10311024 if ((unstakeInv == unstakeInv))
10321025 then {
10331026 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
10341027 let sts = parseIntValue(r._9)
10351028 let state = r._10
10361029 let v = if (if (igs())
10371030 then true
10381031 else (sts == PoolShutdown))
10391032 then throw(("Blocked: " + toString(sts)))
10401033 else true
10411034 if ((v == v))
10421035 then {
10431036 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
10441037 if ((burnA == burnA))
10451038 then state
10461039 else throw("Strict value is not equal to itself.")
10471040 }
10481041 else throw("Strict value is not equal to itself.")
10491042 }
10501043 else throw("Strict value is not equal to itself.")
10511044 }
10521045 else throw("Strict value is not equal to itself.")
10531046 }
10541047
10551048
10561049
10571050 @Callable(i)
10581051 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
10591052 let checkPayments = if ((size(i.payments) != 0))
10601053 then throw("No pmnts expd")
10611054 else true
10621055 if ((checkPayments == checkPayments))
10631056 then {
10641057 let cfg = gpc()
10651058 let factoryCfg = gfc()
10661059 let lpAssetId = fromBase58String(cfg[idxLPAsId])
10671060 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
10681061 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
10691062 if ((unstakeInv == unstakeInv))
10701063 then {
1071- let $t03802938217 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1072- let state = $t03802938217._1
1073- let totalAmount = $t03802938217._2
1064+ let $t03796338151 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1065+ let state = $t03796338151._1
1066+ let totalAmount = $t03796338151._2
10741067 $Tuple2(state, totalAmount)
10751068 }
10761069 else throw("Strict value is not equal to itself.")
10771070 }
10781071 else throw("Strict value is not equal to itself.")
10791072 }
10801073
10811074
10821075
10831076 @Callable(i)
10841077 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
10851078 let poolConfig = gpc()
10861079 let amId = poolConfig[idxAmAsId]
10871080 let prId = poolConfig[idxPrAsId]
10881081 let lpId = poolConfig[idxLPAsId]
1089- let $t03847638573 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1090- let lpAmount = $t03847638573._1
1091- let state = $t03847638573._2
1092- let feeAmount = $t03847638573._3
1093- let bonus = $t03847638573._4
1082+ let $t03841038507 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1083+ let lpAmount = $t03841038507._1
1084+ let state = $t03841038507._2
1085+ let feeAmount = $t03841038507._3
1086+ let bonus = $t03841038507._4
10941087 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
10951088 }
10961089
10971090
10981091
10991092 @Callable(i)
11001093 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
11011094 then throw("denied")
11021095 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
11031096
11041097
11051098
11061099 @Callable(i)
11071100 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
11081101 then pd
11091102 else [StringEntry(k, v)]
11101103
11111104
11121105
11131106 @Callable(i)
11141107 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
11151108 then pd
11161109 else [IntegerEntry(k, v)]
11171110
11181111
11191112
11201113 @Callable(i)
11211114 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
11221115
11231116
11241117
11251118 @Callable(i)
11261119 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
11271120
11281121
11291122
11301123 @Callable(i)
11311124 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
11321125 let pr = calcPrices(amAmt, prAmt, lpAmt)
11331126 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
11341127 }
11351128
11361129
11371130
11381131 @Callable(i)
11391132 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
11401133
11411134
11421135
11431136 @Callable(i)
11441137 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
11451138
11461139
11471140
11481141 @Callable(i)
11491142 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
11501143
11511144
11521145
11531146 @Callable(i)
11541147 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, true, false, 0, ""))
11551148
11561149
11571150
11581151 @Callable(i)
11591152 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
11601153 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
11611154 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
11621155 }
11631156
11641157
11651158
11661159 @Callable(i)
11671160 func getFeeREADONLY () = $Tuple2(nil, fee)
11681161
11691162
11701163 @Verifier(tx)
11711164 func verify () = {
11721165 let targetPublicKey = match m() {
11731166 case pk: ByteVector =>
11741167 pk
11751168 case _: Unit =>
11761169 tx.senderPublicKey
11771170 case _ =>
11781171 throw("Match error")
11791172 }
11801173 match tx {
11811174 case order: Order =>
11821175 let matcherPub = mp()
11831176 let orderValid = moa(order)
11841177 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
11851178 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
11861179 if (if (if (orderValid)
11871180 then senderValid
11881181 else false)
11891182 then matcherValid
11901183 else false)
11911184 then true
11921185 else toe(orderValid, senderValid, matcherValid)
11931186 case s: SetScriptTransaction =>
11941187 let newHash = blake2b256(value(s.script))
11951188 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
11961189 let currentHash = scriptHash(this)
11971190 if (if ((allowedHash == newHash))
11981191 then (currentHash != newHash)
11991192 else false)
12001193 then true
12011194 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
12021195 case _ =>
12031196 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
12041197 }
12051198 }
12061199

github/deemru/w8io/873ac7e 
318.80 ms