2023.03.22 12:56 [3566658] smart account 3P8KMyAJCPWNcyedqrmymxaeWonvmkhGauz > SELF 0.00000000 Waves

{ "type": 13, "id": "Du4HEPDtdWQYji91BZuDE3v5wNFgV7nSgh18KQa4P1Ui", "fee": 4100000, "feeAssetId": null, "timestamp": 1679479010388, "version": 2, "chainId": 87, "sender": "3P8KMyAJCPWNcyedqrmymxaeWonvmkhGauz", "senderPublicKey": "DxhbzFs9BZTiN6kcnyybxmqPTV8xReD6Z5gWQ5AgRX8w", "proofs": [ "2ivFrmAVHnVueeLNTV3sN7rjfjBkyMGJxpzmMvq5p9gmhLe6oY9EJrsf1xGzer5kUPuk9zsc31Ffus8Hz6CBwVLK" ], "script": "base64:BgK8KwgCEgUKAwEEARIHCgUBBAEIARIDCgEIEgMKAQgSABIECgIBBBIECgIBBBIDCgEBEgASBAoCCAESABIECgIIARIECgIIARIECgIBARIDCgEBEgUKAwEBARIFCgMBCAESBAoCAQgSBAoCAQgSBAoCCAgSBAoCCAgSBAoCCAESABIDCgEIEgUKAwEBARIECgIIARIECgIBARIECgIICBILCgkIAQECAQIIBAQSBgoECAgBCCIGc2NhbGU4IgxzY2FsZThCaWdJbnQiB3NjYWxlMTgiCnplcm9CaWdJbnQiBGJpZzAiBGJpZzEiBGJpZzIiBGJpZzMiBGJpZzQiCnNsaXBwYWdlNEQiC3dhdmVzU3RyaW5nIgVBbXVsdCIFRGNvbnYiA1NFUCIFRU1QVFkiClBvb2xBY3RpdmUiClBvb2xQdXREaXMiDlBvb2xNYXRjaGVyRGlzIgxQb29sU2h1dGRvd24iDmlkeFBvb2xBZGRyZXNzIglpZHhQb29sU3QiCWlkeExQQXNJZCIJaWR4QW1Bc0lkIglpZHhQckFzSWQiC2lkeEFtdEFzRGNtIg1pZHhQcmljZUFzRGNtIgtpZHhJQW10QXNJZCINaWR4SVByaWNlQXNJZCIPaWR4RmFjdFN0YWtDbnRyIhJpZHhGYWN0b3J5UmVzdENudHIiEGlkeEZhY3RTbGlwcENudHIiEWlkeEZhY3RHd3hSZXdDbnRyIgpmZWVEZWZhdWx0IgJ0MSIHb3JpZ1ZhbCINb3JpZ1NjYWxlTXVsdCIIdDFCaWdJbnQiAmYxIgN2YWwiD3Jlc3VsdFNjYWxlTXVsdCIMZnJvbVgxOFJvdW5kIgVyb3VuZCICdDIiAmYyIgJ0cyIDYW10IghyZXNTY2FsZSIIY3VyU2NhbGUiA2FicyIJYWJzQmlnSW50IgJmYyIDbXBrIgRwbXBrIgJwbCICcGgiAWgiAXQiA3BhdSICdWEiBHR4SWQiA2dhdSICYWEiAnBhIgNhbXAiA2FkYSIGa2V5RmVlIgNmZWUiBmtleURMcCIVa2V5RExwUmVmcmVzaGVkSGVpZ2h0IhJrZXlETHBSZWZyZXNoRGVsYXkiFmRMcFJlZnJlc2hEZWxheURlZmF1bHQiD2RMcFJlZnJlc2hEZWxheSIEZmNmZyIEbXRwayICcGMiBmlBbXRBcyIFaVByQXMiA21iYSIFYkFTdHIiA2FwcyIca2V5QWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaCIWa2V5RmVlQ29sbGVjdG9yQWRkcmVzcyIWa2V5U2tpcE9yZGVyVmFsaWRhdGlvbiILcG9vbEFkZHJlc3MiD3Rocm93T3JkZXJFcnJvciIKb3JkZXJWYWxpZCIOb3JkZXJWYWxpZEluZm8iC3NlbmRlclZhbGlkIgxtYXRjaGVyVmFsaWQiBHN0cmYiBGFkZHIiA2tleSIEaW50ZiIIdGhyb3dFcnIiA21zZyIGZm10RXJyIgNmY2EiBWluRmVlIgFAIgZvdXRGZWUiAUEiA2lncyICbXAiE2ZlZUNvbGxlY3RvckFkZHJlc3MiA2dwYyIFYW10QXMiB3ByaWNlQXMiCGlQcmljZUFzIgxwYXJzZUFzc2V0SWQiBWlucHV0Ig9hc3NldElkVG9TdHJpbmciD3BhcnNlUG9vbENvbmZpZyIKcG9vbENvbmZpZyIQcG9vbENvbmZpZ1BhcnNlZCILJHQwODA2MDgyODkiDmNmZ1Bvb2xBZGRyZXNzIg1jZmdQb29sU3RhdHVzIgxjZmdMcEFzc2V0SWQiEGNmZ0Ftb3VudEFzc2V0SWQiD2NmZ1ByaWNlQXNzZXRJZCIWY2ZnQW1vdW50QXNzZXREZWNpbWFscyIVY2ZnUHJpY2VBc3NldERlY2ltYWxzIhJjZmdJbkFtb3VudEFzc2VkSWQiEWNmZ0luUHJpY2VBc3NldElkIgNnZmMiDWZhY3RvcnlDb25maWciD3N0YWtpbmdDb250cmFjdCIPc2xpcGFnZUNvbnRyYWN0Igtnd3hDb250cmFjdCIMcmVzdENvbnRyYWN0IhFkYXRhUHV0QWN0aW9uSW5mbyINaW5BbXRBc3NldEFtdCIPaW5QcmljZUFzc2V0QW10IghvdXRMcEFtdCIFcHJpY2UiCnNsaXBCeVVzZXIiDHNsaXBwYWdlUmVhbCIIdHhIZWlnaHQiC3R4VGltZXN0YW1wIgxzbGlwYWdlQW1BbXQiDHNsaXBhZ2VQckFtdCIRZGF0YUdldEFjdGlvbkluZm8iDm91dEFtdEFzc2V0QW10IhBvdXRQcmljZUFzc2V0QW10IgdpbkxwQW10Ig1nZXRBY2NCYWxhbmNlIgdhc3NldElkIgRjcGJpIghwckFtdFgxOCIIYW1BbXRYMTgiBWNwYmlyIgN2YWQiAkExIgJBMiIIc2xpcHBhZ2UiBGRpZmYiBHBhc3MiAnZkIgJEMSICRDAiBHNscGciBGZhaWwiA3BjcCIKYW1Bc3NldERjbSIKcHJBc3NldERjbSIFYW1BbXQiBXByQW10IgthbXRBc0FtdFgxOCIKcHJBc0FtdFgxOCIKY2FsY1ByaWNlcyIFbHBBbXQiCGFtdEFzRGNtIgdwckFzRGNtIghwcmljZVgxOCIIbHBBbXRYMTgiDWxwUHJJbkFtQXNYMTgiDWxwUHJJblByQXNYMTgiD2NhbGN1bGF0ZVByaWNlcyIBcCIHdGFrZUZlZSIGYW1vdW50IglmZWVBbW91bnQiBGdldEQiAnhwIgN4cDAiA3hwMSIBcyIBYSIDYW5uIgt4cDBfeHAxX25fbiIFYW5uX3MiBWFubl8xIgljYWxjRE5leHQiAWQiAmRkIgNkZGQiAmRwIgRjYWxjIgNhY2MiAWkiBWROZXh0IghkRGlmZlJhdyIFZERpZmYiA2FyciINJHQwMTI3OTQxMjg0MiICJGwiAiRzIgUkYWNjMCIFJGYwXzEiAiRhIgIkaSIFJGYwXzIiBWZvdW5kIgNlZ28iBnR4SWQ1OCIKcG10QXNzZXRJZCIIcG10THBBbXQiC3VzZXJBZGRyZXNzIgRscElkIgRhbUlkIgRwcklkIgVhbURjbSIFcHJEY20iA3N0cyIHbHBFbWlzcyIJYW1CYWxhbmNlIgxhbUJhbGFuY2VYMTgiCXByQmFsYW5jZSIMcHJCYWxhbmNlWDE4IgtjdXJQcmljZVgxOCIIY3VyUHJpY2UiC3BtdExwQW10WDE4IgpscEVtaXNzWDE4IgtvdXRBbUFtdFgxOCILb3V0UHJBbXRYMTgiCG91dEFtQW10IghvdXRQckFtdCIFc3RhdGUiA2VwbyIHaW5BbUFtdCIGaW5BbUlkIgdpblByQW10IgZpblBySWQiBmlzRXZhbCIGZW1pdExwIgppc09uZUFzc2V0IhB2YWxpZGF0ZVNsaXBwYWdlIgZwbXRBbXQiBXBtdElkIgdhbUlkU3RyIgdwcklkU3RyIglpbkFtSWRTdHIiCWluUHJJZFN0ciIGYW10RGNtIghwcmljZURjbSIEbHBFbSIPaW5BbUFzc2V0QW10WDE4Ig9pblByQXNzZXRBbXRYMTgiDHVzZXJQcmljZVgxOCIBciIGY2hlY2tEIgtzbGlwcGFnZVgxOCIPc2xpcHBhZ2VSZWFsWDE4Ig1scEVtaXNzaW9uWDE4IgpwclZpYUFtWDE4IgphbVZpYVByWDE4IgxleHBlY3RlZEFtdHMiEWV4cEFtdEFzc2V0QW10WDE4IhNleHBQcmljZUFzc2V0QW10WDE4IgljYWxjTHBBbXQiDmNhbGNBbUFzc2V0UG10Ig5jYWxjUHJBc3NldFBtdCIMc2xpcHBhZ2VDYWxjIgllbWl0THBBbXQiBmFtRGlmZiIGcHJEaWZmIg0kdDAyMDY4MTIxMDI2Igp3cml0ZUFtQW10Igp3cml0ZVByQW10Igtjb21tb25TdGF0ZSIFZ2V0WUQiAUQiAW4iAXgiCmFQcmVjaXNpb24iAWMiAWIiA2N1ciINJHQwMjIyMjEyMjI0MSIBeSIFeU5leHQiBXlEaWZmIg0kdDAyMjU0ODIyNTk1IgdjYWxjRExwIg1hbW91bnRCYWxhbmNlIgxwcmljZUJhbGFuY2UiCmxwRW1pc3Npb24iCnVwZGF0ZWRETHAiDmNhbGNDdXJyZW50RExwIhBhbW91bnRBc3NldERlbHRhIg9wcmljZUFzc2V0RGVsdGEiFGxwQXNzZXRFbWlzc2lvbkRlbHRhIhJhbW91bnRBc3NldEJhbGFuY2UiEXByaWNlQXNzZXRCYWxhbmNlIg9scEFzc2V0RW1pc3Npb24iCmN1cnJlbnRETHAiEnJlZnJlc2hETHBJbnRlcm5hbCIXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEiFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEiB2FjdGlvbnMiEnZhbGlkYXRlVXBkYXRlZERMcCIGb2xkRExwIht2YWxpZGF0ZU1hdGNoZXJPcmRlckFsbG93ZWQiBW9yZGVyIhFhbW91bnRBc3NldEFtb3VudCIQcHJpY2VBc3NldEFtb3VudCINJHQwMjQ3OTMyNTAwNSIDZExwIg0kdDAyNTM0NzI1NDQ3Ig11bnVzZWRBY3Rpb25zIgZkTHBOZXciDGlzT3JkZXJWYWxpZCIEaW5mbyICY2ciA3BtdCICY3AiBmNhbGxlciIHYW1Bc1BtdCIHcHJBc1BtdCINY2FsY1B1dE9uZVRrbiIJcG10QW10UmF3Igt3aXRoVGFrZUZlZSINY2hlY2hFbWlzc2lvbiINJHQwMjgxMDMyODU2NSIMYW1CYWxhbmNlT2xkIgxwckJhbGFuY2VPbGQiDSR0MDI4NTcxMjg3NDciC2FtQW1vdW50UmF3IgtwckFtb3VudFJhdyINJHQwMjg3NTEyOTAwNSIIYW1BbW91bnQiCHByQW1vdW50IgxhbUJhbGFuY2VOZXciDHByQmFsYW5jZU5ldyIIbHBBbW91bnQiDnBvb2xQcm9wb3J0aW9uIg9hbW91bnRBc3NldFBhcnQiDnByaWNlQXNzZXRQYXJ0IglscEFtdEJvdGgiBWJvbnVzIhNnZXRPbmVUa25WMkludGVybmFsIgpvdXRBc3NldElkIgxtaW5PdXRBbW91bnQiCHBheW1lbnRzIgxvcmlnaW5DYWxsZXIiDXRyYW5zYWN0aW9uSWQiCmFtRGVjaW1hbHMiCnByRGVjaW1hbHMiCnBvb2xTdGF0dXMiDSR0MDMxMTE3MzEyMjgiCHRvdGFsR2V0Igt0b3RhbEFtb3VudCINJHQwMzE0MTgzMTcyNSIFb3V0QW0iBW91dFByIghjdXJQclgxOCIFY3VyUHIiEW91dEFzc2V0SWRPcldhdmVzIhBzZW5kRmVlVG9NYXRjaGVyIgRidXJuIg0kdDAzMjUxMDMyODYwIhBmZWVBbW91bnRGb3JDYWxjIhBvdXRJbkFtb3VudEFzc2V0Ig0kdDAzMjg2MzMyOTcxIhFyZWZyZXNoRExwQWN0aW9ucyIRaXNVcGRhdGVkRExwVmFsaWQiAW0iByRtYXRjaDAiAnBtIgJwZCIJaXNNYW5hZ2VyIgJwayICbW0iBGdldFkiCWlzUmV2ZXJzZSITcG9vbEFtb3VudEluQmFsYW5jZSINJHQwMzQ0MTgzNDQzOCINJHQwMzQ3NjkzNDgxNiITc2tpcE9yZGVyVmFsaWRhdGlvbiINY2xlYW5BbW91bnRJbiINZmVlUG9vbEFtb3VudCINJHQwMzUxNjgzNTU5MiIIYXNzZXRPdXQiAmR5Igt0b3RhbEdldFJhdyIFbmV3WHAiBG5ld0QiDGFtb3VudE91dE1pbiIJYWRkcmVzc1RvIgtzd2FwQ29udGFjdCIGY2hlY2tzIgdhc3NldEluIg0kdDAzNzAyODM3NDIyIghjaGVja01pbiIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiAmNtIgNocG0iA2NwbSIEc2xpcCIJYXV0b1N0YWtlIgdmYWN0Q2ZnIgtzdGFraW5nQ250ciIIc2xpcENudHIiCmFtQXNzZXRQbXQiCnByQXNzZXRQbXQiAWUiCWxwQXNzZXRJZCICZWwiBmxlZ2FjeSICc2EiAnNwIghscFRybnNmciICc3MiDSR0MDQyMDQxNDIxODMiBWNoZWNrIhRscEFzc2V0RW1pc3Npb25BZnRlciIgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiDWlzUHV0RGlzYWJsZWQiDSR0MDQzODI0NDM5ODIiB2VzdGltTFAiDSR0MDQ0ODY3NDUyMTYiFHBheW1lbnRJbkFtb3VudEFzc2V0Ig0kdDA0NTIxOTQ1MzI3IgdtYXhTbHBnIgZlc3RQdXQiDSR0MDQ2MzU3NDY0MjIiCW91dEFtdEFtdCINJHQwNDc1OTU0NzY3NyINaXNHZXREaXNhYmxlZCINJHQwNDgyOTU0ODQ1MCIYbGFzdFJlZnJlc2hlZEJsb2NrSGVpZ2h0Ih1jaGVja0xhc3RSZWZyZXNoZWRCbG9ja0hlaWdodCINJHQwNDg5NzQ0OTAzOCIQZExwVXBkYXRlQWN0aW9ucyINbHBBc3NldEFtb3VudCIFaW5kZXgiBG5ld1kiDSR0MDUwMDQ4NTAxMDMiDSR0MDUwNDc4NTA1OTMiDnN1bU9mR2V0QXNzZXRzIhJub0xlc3NUaGVuQW10QXNzZXQiFG5vTGVzc1RoZW5QcmljZUFzc2V0IhRidXJuTFBBc3NldE9uRmFjdG9yeSINJHQwNTE3NTk1MTg0MCINY2hlY2tQYXltZW50cyIKZmFjdG9yeUNmZyIHc3Rha2luZyIKdW5zdGFrZUludiIBdiIFYnVybkEiDSR0MDUyODY3NTI5NDgiDXVuc3Rha2VBbW91bnQiFW5vTGVzc1RoZW5BbW91bnRBc3NldCIDcmVzIgxjaGVja0Ftb3VudHMiDSR0MDU0MTk5NTQyODAiF2xwQXNzZXRSZWNpcGllbnRBZGRyZXNzIg0kdDA1NTMwMjU1NDkwIhBwYXltZW50QW1vdW50UmF3Ig5wYXltZW50QXNzZXRJZCINJHQwNTU2MTg1NTcyMSINJHQwNTU4Njk1NTk3MyIIYW10QXNTdHIiB3ByQXNTdHIiAWsiAnByIgxyZXNTY2FsZU11bHQiB3VzckFkZHIiB3BtdEFzSWQiAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleSIKbWF0Y2hlclB1YiINJHQwNTg3NjU1ODg4MiIHbmV3SGFzaCILYWxsb3dlZEhhc2giC2N1cnJlbnRIYXNohAEAAWEAgMLXLwABYgkAtgIBAIDC1y8AAWMJALYCAQCAgJC7utat8A0AAWQJALYCAQAAAAFlCQC2AgEAAAABZgkAtgIBAAEAAWcJALYCAQACAAFoCQC2AgEAAwABaQkAtgIBAAQAAWoJALYCAQkAZQIFAWEJAGkCCQBoAgUBYQABBQFhAAFrAgVXQVZFUwABbAIDMTAwAAFtAgExAAFuAgJfXwABbwIAAAFwAAEAAXEAAgABcgADAAFzAAQAAXQAAQABdQACAAF2AAMAAXcABAABeAAFAAF5AAYAAXoABwABQQAIAAFCAAkAAUMAAQABRAAGAAFFAAcAAUYACgABRwkAawMACgUBYQCQTgEBSAIBSQFKCQC8AgMJALYCAQUBSQUBYwkAtgIBBQFKAQFLAgFJAUoJALwCAwUBSQUBYwUBSgEBTAIBTQFOCQCgAwEJALwCAwUBTQkAtgIBBQFOBQFjAQFPAwFNAU4BUAkAoAMBCQC9AgQFAU0JALYCAQUBTgUBYwUBUAEBUQIBSQFKCQC8AgMFAUkFAWMJALYCAQUBSgEBUgIBTQFOCQC8AgMFAU0JALYCAQUBTgUBYwEBUwMBVAFVAVYJAGsDBQFUBQFVBQFWAQFXAQFNAwkAvwICBQFkBQFNCQC+AgEFAU0FAU0BAVgBAU0DCQC/AgIFAWQFAU0JAL4CAQUBTQUBTQEBWQACEyVzX19mYWN0b3J5Q29udHJhY3QBAVoAAhQlc19fbWFuYWdlclB1YmxpY0tleQECYWEAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBAmFiAAIRJXMlc19fcHJpY2VfX2xhc3QBAmFjAgJhZAJhZQkAuQkCCQDMCAICGCVzJXMlZCVkX19wcmljZV9faGlzdG9yeQkAzAgCCQCkAwEFAmFkCQDMCAIJAKQDAQUCYWUFA25pbAUBbgECYWYCAmFnAmFoCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwUCYWcCAl9fBQJhaAECYWkCAmFnAmFoCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX0dfXwUCYWcCAl9fBQJhaAECYWoAAg8lc19fYW1vdW50QXNzZXQBAmFrAAIOJXNfX3ByaWNlQXNzZXQBAmFsAAIHJXNfX2FtcAECYW0AAg0lc19fYWRkb25BZGRyAAJhbgIHJXNfX2ZlZQACYW8JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYW4FAUcAAmFwCQC5CQIJAMwIAgICJXMJAMwIAgIDZExwBQNuaWwFAW4AAmFxCQC5CQIJAMwIAgICJXMJAMwIAgISZExwUmVmcmVzaGVkSGVpZ2h0BQNuaWwFAW4AAmFyCQC5CQIJAMwIAgICJXMJAMwIAgIPcmVmcmVzaERMcERlbGF5BQNuaWwFAW4AAmFzAB4AAmF0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmFyBQJhcwECYXUAAhElc19fZmFjdG9yeUNvbmZpZwECYXYAAhglcyVzX19tYXRjaGVyX19wdWJsaWNLZXkBAmF3AgJheAJheQkArAICCQCsAgIJAKwCAgkArAICAgglZCVkJXNfXwUCYXgCAl9fBQJheQIIX19jb25maWcBAmF6AQJhQQkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQJhQQECYUIAAgwlc19fc2h1dGRvd24BAmFDAAIdJXNfX2FsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2gBAmFEAAIXJXNfX2ZlZUNvbGxlY3RvckFkZHJlc3MBAmFFAQJhRgkArAICAhslcyVzX19za2lwT3JkZXJWYWxpZGF0aW9uX18FAmFGAQJhRwQCYUgCYUkCYUoCYUsJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIkb3JkZXIgdmFsaWRhdGlvbiBmYWlsZWQ6IG9yZGVyVmFsaWQ9CQClAwEFAmFIAgIgKAUCYUkCASkCDSBzZW5kZXJWYWxpZD0JAKUDAQUCYUoCDiBtYXRjaGVyVmFsaWQ9CQClAwEFAmFLAQJhTAICYU0CYU4JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQJhTQUCYU4JALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUCYU0JAMwIAgIBLgkAzAgCBQJhTgkAzAgCAgwgbm90IGRlZmluZWQFA25pbAIAAQJhTwICYU0CYU4JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQJhTQUCYU4JALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUCYU0JAMwIAgIBLgkAzAgCBQJhTgkAzAgCAgwgbm90IGRlZmluZWQFA25pbAIAAQJhUAECYVEJAAIBCQC5CQIJAMwIAgIPbHBfc3RhYmxlLnJpZGU6CQDMCAIFAmFRBQNuaWwCASABAmFSAQJhUQkAuQkCCQDMCAICD2xwX3N0YWJsZS5yaWRlOgkAzAgCBQJhUQUDbmlsAgEgAAJhUwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFMAgUEdGhpcwkBAVkAAAJhVAoAAmFVCQD8BwQFAmFTAhBnZXRJbkZlZVJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYVUCA0ludAUCYVUJAAIBCQCsAgIJAAMBBQJhVQIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AAJhVgoAAmFVCQD8BwQFAmFTAhFnZXRPdXRGZWVSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmFVAgNJbnQFAmFVCQACAQkArAICCQADAQUCYVUCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAACYVcJAQJhTAIFBHRoaXMJAQJhbAABAmFYAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhUwkBAmFCAAcBAmFZAAkA2QQBCQECYUwCBQJhUwkBAmF2AAACYVoJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhTAIFAmFTCQECYUQAAQJiYQAEAmJiCQECYUwCBQR0aGlzCQECYWoABAJiYwkBAmFMAgUEdGhpcwkBAmFrAAQCYmQJAQJhTwIFAmFTCQECYXoBBQJiYwQCYXgJAQJhTwIFAmFTCQECYXoBBQJiYgkAtQkCCQECYUwCBQJhUwkBAmF3AgkApAMBBQJheAkApAMBBQJiZAUBbgECYmUBAmJmAwkAAAIFAmJmBQFrBQR1bml0CQDZBAEFAmJmAQJiZwECYmYDCQAAAgUCYmYFBHVuaXQFAWsJANgEAQkBBXZhbHVlAQUCYmYBAmJoAQJiaQkAmwoJCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmJpBQF0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYmkFAXUJANkEAQkAkQMCBQJiaQUBdgkBAmJlAQkAkQMCBQJiaQUBdwkBAmJlAQkAkQMCBQJiaQUBeAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJpBQF5CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYmkFAXoJANkEAQkAkQMCBQJiaQUBQQkA2QQBCQCRAwIFAmJpBQFCAAJiagkBAmJoAQkBAmJhAAACYmsFAmJqAAJibAgFAmJrAl8xAAJibQgFAmJrAl8yAAJibggFAmJrAl8zAAJibwgFAmJrAl80AAJicAgFAmJrAl81AAJicQgFAmJrAl82AAJicggFAmJrAl83AAJicwgFAmJrAl84AAJidAgFAmJrAl85AQJidQAJALUJAgkBAmFMAgUCYVMJAQJhdQAFAW4AAmJ2CQECYnUAAAJidwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYnYFAUMCIEludmFsaWQgc3Rha2luZyBjb250cmFjdCBhZGRyZXNzAAJieAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYnYFAUUCIEludmFsaWQgc2xpcGFnZSBjb250cmFjdCBhZGRyZXNzAAJieQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYnYFAUYCHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MAAmJ6CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJidgUBRAIcSW52YWxpZCBnd3ggY29udHJhY3QgYWRkcmVzcwECYkEKAmJCAmJDAmJEAmJFAmJGAmJHAmJIAmJJAmJKAmJLCQC5CQIJAMwIAgIUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJiQgkAzAgCCQCkAwEFAmJDCQDMCAIJAKQDAQUCYkQJAMwIAgkApAMBBQJiRQkAzAgCCQCkAwEFAmJGCQDMCAIJAKQDAQUCYkcJAMwIAgkApAMBBQJiSAkAzAgCCQCkAwEFAmJJCQDMCAIJAKQDAQUCYkoJAMwIAgkApAMBBQJiSwUDbmlsBQFuAQJiTAYCYk0CYk4CYk8CYkUCYkgCYkkJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJiTQkAzAgCCQCkAwEFAmJOCQDMCAIJAKQDAQUCYk8JAMwIAgkApAMBBQJiRQkAzAgCCQCkAwEFAmJICQDMCAIJAKQDAQUCYkkFA25pbAUBbgECYlABAmJRAwkAAAIFAmJRAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQJiUQECYlICAmJTAmJUCQC8AgMFAmJTBQFjBQJiVAECYlUDAmJTAmJUAVAJAL0CBAUCYlMFAWMFAmJUBQFQAQJiVgMCYlcCYlgCYlkEAmJaCQC8AgMJALgCAgUCYlcFAmJYBQFiBQJiWAQCY2EJAL8CAgkAuAICBQJiWQkBAVcBBQJiWgUBZAMJAQEhAQUCY2EJAAIBCQCsAgICCkJpZyBzbHBnOiAJAKYDAQUCYloJAJQKAgUCY2EJAJkDAQkAzAgCBQJiVwkAzAgCBQJiWAUDbmlsAQJjYgMCY2MCY2QCY2UEAmJaCQC8AgMFAmNkBQFiBQJjYwQCY2YJAL8CAgUCY2UFAmJaAwMFAmNmBgkAvwICBQJjZAUCY2MJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCmAwEFAmNkAgEgCQCmAwEFAmNjAgEgCQCmAwEFAmJaAgEgCQCmAwEFAmNlBQJjZgECY2cEAmNoAmNpAmNqAmNrBAJjbAkBAUgCBQJjagUCY2gEAmNtCQEBSAIFAmNrBQJjaQkBAmJSAgUCY20FAmNsAQJjbgMCY2oCY2sCY28EAmNwBQJicQQCY3EFAmJyBAJjcgkBAmNnBAUCY3AFAmNxBQJjagUCY2sEAmJUCQEBSAIFAmNqBQJjcAQCYlMJAQFIAgUCY2sFAmNxBAJjcwkBAUgCBQJjbwUBYQQCY3QJAQJiUgIFAmJUBQJjcwQCY3UJAQJiUgIFAmJTBQJjcwkAzAgCBQJjcgkAzAgCBQJjdAkAzAgCBQJjdQUDbmlsAQJjdgMCY2oCY2sCY28EAmN3CQECY24DBQJjagUCY2sFAmNvCQDMCAIJAQFMAgkAkQMCBQJjdwAABQFhCQDMCAIJAQFMAgkAkQMCBQJjdwABBQFhCQDMCAIJAQFMAgkAkQMCBQJjdwACBQFhBQNuaWwBAmN4AgJjeQJhbwQCY3oDCQAAAgUCYW8AAAAACQBrAwUCY3kFAmFvBQFhCQCUCgIJAGUCBQJjeQUCY3oFAmN6AQJjQQECY0IEAmNDCQCRAwIFAmNCAAAEAmNECQCRAwIFAmNCAAEEAmNFCQC3AgIFAmNDBQJjRAMJAAACBQJjRQUBZQUBZQQCY0YJAQ1wYXJzZUludFZhbHVlAQUCYVcEAmNHCQBoAgUCY0YAAgQCY3cJALwCAwUCY0MFAmNEBQFmBAJjSAkAvAIDBQJjdwUBaQUBZgQCY0kJALwCAwkAtgIBBQJjRwUCY0UFAWYEAmNKCQC2AgEJAGUCBQJjRwABCgECY0sBAmNMBAJjTQkAvAIDBQJjTAUCY0wFAWYEAmNOCQC8AgMFAmNNBQJjTAUBZgQCY08JALwCAwUCY04FAWYFAmNICQC8AgMJALcCAgUCY0kJALwCAwUCY08FAWcFAWYFAmNMCQC3AgIJALwCAwUCY0oFAmNMBQFmCQC8AgMFAWgFAmNPBQFmCgECY1ACAmNRAmNSAwgFAmNRAl8yBQJjUQQCY0wIBQJjUQJfMQQCY1MJAQJjSwEFAmNMBAJjVAkAuAICBQJjUwkBBXZhbHVlAQUCY0wEAmNVAwkAvwICBQFlBQJjVAkAvgIBBQJjVAUCY1QDCQDAAgIFAWYFAmNVCQCUCgIFAmNTBgkAlAoCBQJjUwcEAmNWCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOCQDMCAIADwkAzAgCABAFA25pbAQCY1cKAAJjWAUCY1YKAAJjWQkAkAMBBQJjWAoAAmNaCQCUCgIFAmNFBwoBAmRhAgJkYgJkYwMJAGcCBQJkYwUCY1kFAmRiCQECY1ACBQJkYgkAkQMCBQJjWAUCZGMKAQJkZAICZGICZGMDCQBnAgUCZGMFAmNZBQJkYgkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE3CQECZGQCCQECZGECCQECZGECCQECZGECCQECZGECCQECZGECCQECZGECCQECZGECCQECZGECCQECZGECCQECZGECCQECZGECCQECZGECCQECZGECCQECZGECCQECZGECCQECZGECCQECZGECBQJjWgAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQQCY0wIBQJjVwJfMQQCZGUIBQJjVwJfMgMFAmRlBQJjTAkAAgEJAKwCAgIZRCBjYWxjdWxhdGlvbiBlcnJvciwgRCA9IAkApgMBBQJjTAECZGYEAmRnAmRoAmRpAmRqBAJkawUCYm4EAmRsCQDYBAEJAQV2YWx1ZQEFAmJvBAJkbQkA2AQBCQEFdmFsdWUBBQJicAQCZG4FAmJxBAJkbwUCYnIEAmRwCQCkAwEFAmJtBAJkcQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJkawILV3JvbmcgTFAgaWQIcXVhbnRpdHkDCQECIT0CCQDYBAEFAmRrBQJkaAkAAgECD1dyb25nIHBtdCBhc3NldAQCZHIJAQJiUAEFAmRsBAJkcwkBAUgCBQJkcgUCZG4EAmR0CQECYlABBQJkbQQCZHUJAQFIAgUCZHQFAmRvBAJkdgkBAmJSAgUCZHUFAmRzBAJkdwkBAUwCBQJkdgUBYQQCZHgJAQFIAgUCZGkFAWEEAmR5CQEBSAIFAmRxBQFhBAJkegkAvAIDBQJkcwUCZHgFAmR5BAJkQQkAvAIDBQJkdQUCZHgFAmR5BAJkQgkBAU8DBQJkegUCZG4FBUZMT09SBAJkQwkBAU8DBQJkQQUCZG8FBUZMT09SBAJkRAMJAAACBQJkZwIABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCZGoFAmRCAwkAAAIFAmRsAgVXQVZFUwUEdW5pdAkA2QQBBQJkbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJkagUCZEMDCQAAAgUCZG0CBVdBVkVTBQR1bml0CQDZBAEFAmRtCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhaQIJAKUIAQUCZGoFAmRnCQECYkwGBQJkQgUCZEMFAmRpBQJkdwUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFiAAUCZHcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYwIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmR3BQNuaWwJAJwKCgUCZEIFAmRDBQJkbAUCZG0FAmRyBQJkdAUCZHEFAmR2BQJkcAUCZEQBAmRFDQJkZwJiWQJkRgJkRwJkSAJkSQJkagJkSgJkSwJkTAJkTQJkTgJkTwQCZGsFAmJuBAJkUAkA2AQBCQEFdmFsdWUBBQJibwQCZFEJANgEAQkBBXZhbHVlAQUCYnAEAmRSBQJicwQCZFMFAmJ0BAJkVAUCYnEEAmRVBQJicgQCZHAJAKQDAQUCYm0EAmRWCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmRrAghXciBscCBhcwhxdWFudGl0eQQCZHIDBQJkSgkBAmJQAQUCZFADAwUCZEwJAAACBQJkTwUCZFAHCQBlAgkBAmJQAQUCZFAFAmROAwUCZEwJAQJiUAEFAmRQCQBlAgkBAmJQAQUCZFAFAmRGBAJkdAMFAmRKCQECYlABBQJkUQMDBQJkTAkAAAIFAmRPBQJkUQcJAGUCCQECYlABBQJkUQUCZE4DBQJkTAkBAmJQAQUCZFEJAGUCCQECYlABBQJkUQUCZEgEAmRXCQEBSAIFAmRGBQJkVAQCZFgJAQFIAgUCZEgFAmRVBAJkWQkBAmJSAgUCZFgFAmRXBAJkcwkBAUgCBQJkcgUCZFQEAmR1CQEBSAIFAmR0BQJkVQQCY2QJAQJjQQEJAMwIAgUCZHMJAMwIAgUCZHUFA25pbAQCZFoDCQAAAgUCZFYAAAQCY2MJAQJjQQEJAMwIAgkAtwICBQJkcwUCZFcJAMwIAgkAtwICBQJkdQUCZFgFA25pbAQCZWEDCQC/AgIFAmNjBQJjZAYJAAIBAhxEMSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIEQwAwkAAAIFAmVhBQJlYQQCZHYFAWQEAmViBQFkBAJjcwUCY2MJAJcKBQkBAUwCBQJjcwUBYQkBAUwCBQJkVwUCZFQJAQFMAgUCZFgFAmRVCQECYlICCQC3AgIFAmR1BQJkWAkAtwICBQJkcwUCZFcFAmViCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAJkdgkBAmJSAgUCZHUFAmRzBAJlYwkAvAIDCQEBVwEJALgCAgUCZHYFAmRZBQFjBQJkdgQCZWIJAQFIAgUCYlkFAWEDAwMFAmRNCQECIT0CBQJkdgUBZAcJAL8CAgUCZWMFAmViBwkAAgEJAKwCAgkArAICCQCsAgICD1ByaWNlIHNsaXBwYWdlIAkApgMBBQJlYwIDID4gCQCmAwEFAmViBAJlZAkBAUgCBQJkVgUBYQQCZWUJAL0CBAUCZFcJAQJiVQMFAmR1BQJkcwUHQ0VJTElORwUBYwUHQ0VJTElORwQCZWYJAL0CBAUCZFgFAWMJAQJiVQMFAmR1BQJkcwUFRkxPT1IFB0NFSUxJTkcEAmVnAwkAvwICBQJlZQUCZFgJAJQKAgUCZWYFAmRYCQCUCgIFAmRXBQJlZQQCZWgIBQJlZwJfMQQCZWkIBQJlZwJfMgQCY2MJAQJjQQEJAMwIAgkAtwICBQJkcwUCZWgJAMwIAgkAtwICBQJkdQUCZWkFA25pbAQCZWEDCQC/AgIFAmNjBQJjZAYJAAIBAhxEMSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIEQwAwkAAAIFAmVhBQJlYQQCY3MJALwCAwUCZWQJALgCAgUCY2MFAmNkBQJjZAkAlwoFCQEBTwMFAmNzBQFhBQVGTE9PUgkBAU8DBQJlaAUCZFQFB0NFSUxJTkcJAQFPAwUCZWkFAmRVBQdDRUlMSU5HBQJkdgUCZWIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAmVqCAUCZFoCXzEEAmVrCAUCZFoCXzIEAmVsCAUCZFoCXzMEAmR3CQEBTAIIBQJkWgJfNAUBYQQCZW0JAQFMAggFAmRaAl81BQFhAwkAZwIAAAUCZWoJAAIBAgdMUCA8PSAwBAJlbgMJAQEhAQUCZEsAAAUCZWoEAmVvCQBlAgUCZEYFAmVrBAJlcAkAZQIFAmRIBQJlbAQCZXEDAwUCZEwJAAACBQJkTwUCZFAHCQCUCgIFAmROAAADAwUCZEwJAAACBQJkTwUCZFEHCQCUCgIAAAUCZE4JAJQKAgUCZWsFAmVsBAJlcggFAmVxAl8xBAJlcwgFAmVxAl8yBAJldAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFiAAUCZHcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYwIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmR3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZgIFAmRqBQJkZwkBAmJBCgUCZXIFAmVzBQJlbgUCZHcFAmJZBQJlbQUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZW8FAmVwBQNuaWwJAJ8KDQUCZWoFAmVuBQJkdwUCZHIFAmR0BQJkVgUCZGsFAmRwBQJldAUCZW8FAmVwBQJkRwUCZEkBAmV1AwJjQgJjUgJldgQCZXcFAWcEAmV4CQCRAwIFAmNCAwkAAAIFAmNSAAAAAQAABAJleQkApwMBBQFsBAJjRgkAuQICCQCnAwEFAmFXBQJleQQCY0UFAmV4BAJjRwkAuQICBQJjRgUCZXcEAmV6CQC6AgIJALkCAgkAuQICCQC6AgIJALkCAgUCZXYFAmV2CQC5AgIFAmV4BQJldwUCZXYFAmV5CQC5AgIFAmNHBQJldwQCZUEJALgCAgkAtwICBQJjRQkAugICCQC5AgIFAmV2BQJleQUCY0cFAmV2CgECY1ACAmNRAmVCBAJlQwUCY1EEAmVECAUCZUMCXzEEAmRlCAUCZUMCXzIDCQECIT0CBQJkZQUEdW5pdAUCY1EEAmVFCQC6AgIJALcCAgkAuQICBQJlRAUCZUQFAmV6CQC3AgIJALkCAgUBZwUCZUQFAmVBBAJlRgkBAVgBCQC4AgIFAmVFCQEFdmFsdWUBBQJlRAMJAMACAgUBZgUCZUYJAJQKAgUCZUUFAmVCCQCUCgIFAmVFBQR1bml0BAJjVgkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJlRwoAAmNYBQJjVgoAAmNZCQCQAwEFAmNYCgACY1oJAJQKAgUCZXYFBHVuaXQKAQJkYQICZGICZGMDCQBnAgUCZGMFAmNZBQJkYgkBAmNQAgUCZGIJAJEDAgUCY1gFAmRjCgECZGQCAmRiAmRjAwkAZwIFAmRjBQJjWQUCZGIJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmRkAgkBAmRhAgkBAmRhAgkBAmRhAgkBAmRhAgkBAmRhAgkBAmRhAgkBAmRhAgkBAmRhAgkBAmRhAgkBAmRhAgkBAmRhAgkBAmRhAgkBAmRhAgkBAmRhAgkBAmRhAgUCY1oAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZUQIBQJlRwJfMQQCZGUIBQJlRwJfMgMJAQIhPQIFAmRlBQR1bml0BQJlRAkAAgEJAKwCAgIZWSBjYWxjdWxhdGlvbiBlcnJvciwgWSA9IAkApgMBBQJlRAECZUgDAmVJAmVKAmVLBAJlTAkAvAIDCQECY0EBCQDMCAIJAQFLAgUCZUkJALYCAQUCYnEJAMwIAgkBAUsCBQJlSgkAtgIBBQJicgUDbmlsBQFjBQJlSwMJAAACBQJlSwUBZQUBZQUCZUwBAmVNAwJlTgJlTwJlUAQCZVEJALgCAgkAtgIBCQECYlABCQECYmcBBQJibwUCZU4EAmVSCQC4AgIJALYCAQkBAmJQAQkBAmJnAQUCYnAFAmVPBAJlUwkAuAICCQC2AgEICQEFdmFsdWUBCQDsBwEFAmJuCHF1YW50aXR5BQJlUAQCZVQJAQJlSAMFAmVRBQJlUgUCZVMFAmVUAQJlVQMCZVYCZVcCZVAEAmVRCQBkAgkBAmJQAQkBAmJnAQUCYm8FAmVWBAJlUgkAZAIJAQJiUAEJAQJiZwEFAmJwBQJlVwQCZVMJAGQCCAkBBXZhbHVlAQkA7AcBBQJibghxdWFudGl0eQUCZVAEAmVMCQECZUgDCQC2AgEFAmVRCQC2AgEFAmVSCQC2AgEFAmVTBAJlWAkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYXEFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCBQJhcAkApgMBBQJlTAUDbmlsCQCUCgIFAmVYBQJlTAECZVkCAmVaAmVMAwkAwAICBQJlTAUCZVoGCQECYVABAiJ1cGRhdGVkIERMcCBsb3dlciB0aGFuIGN1cnJlbnQgRExwAQJmYQECZmIEAmVRCQECYlABCQECYmcBBQJibwQCZVIJAQJiUAEJAQJiZwEFAmJwBAJmYwgFAmZiBmFtb3VudAQCZmQJAG4ECAUCZmIGYW1vdW50CAUCZmIFcHJpY2UFAWEFBUZMT09SBAJmZQMJAAACCAUCZmIJb3JkZXJUeXBlBQNCdXkJAJQKAgUCZmMJAQEtAQUCZmQJAJQKAgkBAS0BBQJmYwUCZmQEAmVWCAUCZmUCXzEEAmVXCAUCZmUCXzIDAwMJAQJhWAAGCQAAAgUCYm0FAXIGCQAAAgUCYm0FAXMJAAIBAg1BZG1pbiBibG9ja2VkAwMJAQIhPQIICAUCZmIJYXNzZXRQYWlyC2Ftb3VudEFzc2V0BQJibwYJAQIhPQIICAUCZmIJYXNzZXRQYWlyCnByaWNlQXNzZXQFAmJwCQACAQIJV3IgYXNzZXRzBAJmZgkApwMBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAmFwAgEwBAJmZwkBAmVVAwUCZVYFAmVXAAAEAmZoCAUCZmcCXzEEAmZpCAUCZmcCXzIEAmZqCQDAAgIFAmZpBQJmZgQCZmsJALkJAgkAzAgCAgRkTHA9CQDMCAIJAKYDAQUCZmYJAMwIAgIIIGRMcE5ldz0JAMwIAgkApgMBBQJmaQkAzAgCAhQgYW1vdW50QXNzZXRCYWxhbmNlPQkAzAgCCQCkAwEFAmVRCQDMCAICEyBwcmljZUFzc2V0QmFsYW5jZT0JAMwIAgkApAMBBQJlUgkAzAgCAhkgYW1vdW50QXNzZXRCYWxhbmNlRGVsdGE9CQDMCAIJAKQDAQUCZVYJAMwIAgIYIHByaWNlQXNzZXRCYWxhbmNlRGVsdGE9CQDMCAIJAKQDAQUCZVcJAMwIAgIIIGhlaWdodD0JAMwIAgkApAMBBQZoZWlnaHQFA25pbAIACQCUCgIFAmZqBQJmawECZmwBAmNSAwkBAiE9AgkAkAMBCAUCY1IIcGF5bWVudHMAAQkAAgECCjEgcG1udCBleHAEAmZtCQEFdmFsdWUBCQCRAwIIBQJjUghwYXltZW50cwAABAJkaAkBBXZhbHVlAQgFAmZtB2Fzc2V0SWQEAmROCAUCZm0GYW1vdW50BAJkWgkBAmRmBAkA2AQBCAUCY1INdHJhbnNhY3Rpb25JZAkA2AQBBQJkaAUCZE4IBQJjUgZjYWxsZXIEAmRCCAUCZFoCXzEEAmRDCAUCZFoCXzIEAmRwCQENcGFyc2VJbnRWYWx1ZQEIBQJkWgJfOQQCZEQIBQJkWgNfMTADAwkBAmFYAAYJAAACBQJkcAUBcwkAAgEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFAmRwCQCXCgUFAmRCBQJkQwUCZE4FAmRoBQJkRAECZm4KAmZvAmFoAmZwAmZxAmJZAmRLAmRMAmRNAmROAmRPBAJkWgkBAmRFDQUCYWgFAmJZCAkBBXZhbHVlAQUCZnAGYW1vdW50CAkBBXZhbHVlAQUCZnAHYXNzZXRJZAgJAQV2YWx1ZQEFAmZxBmFtb3VudAgJAQV2YWx1ZQEFAmZxB2Fzc2V0SWQFAmZvCQAAAgUCYWgCAAUCZEsFAmRMBQJkTQUCZE4FAmRPBAJkcAkBDXBhcnNlSW50VmFsdWUBCAUCZFoCXzgDAwMJAQJhWAAGCQAAAgUCZHAFAXEGCQAAAgUCZHAFAXMJAAIBCQCsAgICCEJsb2NrZWQ6CQCkAwEFAmRwBQJkWgECZnIFAmZzAmRoAmRqAmFoAmZ0BAJkbAkA2AQBCQEFdmFsdWUBBQJibwQCZG0JANgEAQkBBXZhbHVlAQUCYnAEAmRrBQJibgQCZFQFAmJxBAJkVQUCYnIEAmVTCQC2AgEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCZGsCEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmZ1AwkAvwICBQJlUwUBZQYJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zAwkAAAIFAmZ1BQJmdQQCZHIJAQJiUAEFAmRsBAJkdAkBAmJQAQUCZG0EAmZ2AwkAAAIFAmFoAgAJAJQKAgUCZHIFAmR0AwkAAAIFAmRoBQJkbAMJAGYCBQJmcwUCZHIJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIJAGUCBQJkcgUCZnMFAmR0AwkAAAIFAmRoBQJkbQMJAGYCBQJmcwUCZHQJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIFAmRyCQBlAgUCZHQFAmZzCQACAQIQd3JvbmcgcG10QXNzZXRJZAQCZncIBQJmdgJfMQQCZngIBQJmdgJfMgQCZnkDCQAAAgUCZGgFAmRsCQCUCgIFAmZzAAADCQAAAgUCZGgFAmRtCQCUCgIAAAUCZnMJAAIBAg9pbnZhbGlkIHBheW1lbnQEAmZ6CAUCZnkCXzEEAmZBCAUCZnkCXzIEAmZCAwUCZnQJAJUKAwgJAQJjeAIFAmZ6BQJhVAJfMQgJAQJjeAIFAmZBBQJhVAJfMQgJAQJjeAIFAmZzBQJhVAJfMgkAlQoDBQJmegUCZkEAAAQCZkMIBQJmQgJfMQQCZkQIBQJmQgJfMgQCY3oIBQJmQgJfMwQCZkUJAGQCBQJmdwUCZkMEAmZGCQBkAgUCZngFAmZEBAJjZAkBAmNBAQkAzAgCCQEBSAIFAmZ3BQJicQkAzAgCCQEBSAIFAmZ4BQJicgUDbmlsBAJjYwkBAmNBAQkAzAgCCQEBSAIFAmZFBQJicQkAzAgCCQEBSAIFAmZGBQJicgUDbmlsBAJlYQMJAL8CAgUCY2MFAmNkBgkBBXRocm93AAMJAAACBQJlYQUCZWEEAmZHCQC9AgQFAmVTCQC4AgIFAmNjBQJjZAUCY2QFBUZMT09SBAJkdwkBAUwCCQECYlICCQEBSAIFAmZGBQJkVQkBAUgCBQJmRQUCZFQFAWEEAmV0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWIABQJkdwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFjAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZHcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFmAgUCZGoFAmFoCQECYkEKBQJmegUCZkEJAKADAQUCZkcFAmR3AAAAAAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAAAAAFA25pbAQCZkgJAGsDBQJmeAUBYQUCZncEAmZJCQBrAwUCZnMFAWEJAGQCBQJmSAUBYQQCZkoJAGUCBQJmcwUCZkkEAmZLCQC8AgMFAmVTCQC2AgEFAmZKCQC2AgEFAmZ4BAJmTAkAoAMBCQC8AgMJALgCAgUCZkcFAmZLBQFiBQJmSwkAlgoECQCgAwEFAmZHBQJldAUCY3oFAmZMCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJmTQYCZk4CZk8CZlACZm8CZlECZlIEAmRrCQDYBAEJAQV2YWx1ZQEFAmJuBAJkbAkA2AQBCQEFdmFsdWUBBQJibwQCZG0JANgEAQkBBXZhbHVlAQUCYnAEAmZTBQJicQQCZlQFAmJyBAJmVQUCYm0EAmRqAwkAAAIFAmZvBQJiegUCZlEFAmZvBAJmbQkBBXZhbHVlAQkAkQMCBQJmUAAABAJkaAkBBXZhbHVlAQgFAmZtB2Fzc2V0SWQEAmROCAUCZm0GYW1vdW50BAJlVAkBAmVNAwUBZQUBZQUBZQMJAAACBQJlVAUCZVQEAmRnCQDYBAEFAmZSAwkBAiE9AgUCZGsJANgEAQUCZGgJAAIBAghXcm9uZyBMUAQCZHIJAQJiUAEFAmRsBAJkdAkBAmJQAQUCZG0EAmZWCgACYVUJAPwHBAUEdGhpcwITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQJmTgkAzAgCBQJkTgUDbmlsBQNuaWwDCQABAgUCYVUCCihJbnQsIEludCkFAmFVCQACAQkArAICCQADAQUCYVUCHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkDCQAAAgUCZlYFAmZWBAJjeggFAmZWAl8yBAJmVwgFAmZWAl8xBAJmWAMDCQBmAgUCZk8AAAkAZgIFAmZPBQJmVwcJAQJhUAEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZk8FA25pbAIABQJmVwQCZlkDCQAAAgUCZk4FAmRsCQCWCgQFAmZYAAAJAGUCCQBlAgUCZHIFAmZYBQJjegUCZHQDCQAAAgUCZk4FAmRtCQCWCgQAAAUCZlgFAmRyCQBlAgkAZQIFAmR0BQJmWAUCY3oJAAIBAhRpbnZhbGlkIG91dCBhc3NldCBpZAQCZloIBQJmWQJfMQQCZ2EIBQJmWQJfMgQCZkUIBQJmWQJfMwQCZkYIBQJmWQJfNAQCZ2IJAQJiUgIJAQFIAgUCZkYFAmZUCQEBSAIFAmZFBQJmUwQCZ2MJAQFMAgUCZ2IFAWEEAmdkAwkAAAIFAmZOAgVXQVZFUwUEdW5pdAkA2QQBBQJmTgQCZ2UDCQBmAgUCY3oAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhWgUCY3oFAmdkBQNuaWwFA25pbAQCZEQJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJkagUCZlgFAmdkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhaQIJAKUIAQUCZGoFAmRnCQECYkwGBQJmWgUCZ2EFAmROBQJnYwUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFiAAUCZ2MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYwIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmdjBQNuaWwFAmdlAwkAAAIFAmREBQJkRAQCZ2YJAPwHBAUCYVMCBGJ1cm4JAMwIAgUCZE4FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZGgFAmROBQNuaWwDCQAAAgUCZ2YFAmdmBAJnZwQCZ2gDCQAAAgUEdGhpcwUCYVoAAAUCY3oEAmdpAwkAAAIJAQJiZQEFAmZOBQJibwYHAwUCZ2kJAJQKAgkBAS0BCQBkAgUCZlcFAmdoAAAJAJQKAgAACQEBLQEJAGQCBQJmVwUCZ2gEAmVWCAUCZ2cCXzEEAmVXCAUCZ2cCXzIEAmdqCQECZVUDBQJlVgUCZVcAAAQCZ2sIBQJnagJfMQQCZUwIBQJnagJfMgQCZ2wJAQJlWQIFAmVUBQJlTAMJAAACBQJnbAUCZ2wJAJQKAgkAzggCBQJkRAUCZ2sFAmZYCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJnbQAEAmduCQCiCAEJAQFaAAMJAAECBQJnbgIGU3RyaW5nBAJjRQUCZ24JANkEAQUCY0UDCQABAgUCZ24CBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECZ28ABAJnbgkAoggBCQECYWEAAwkAAQIFAmduAgZTdHJpbmcEAmNFBQJnbgkA2QQBBQJjRQMJAAECBQJnbgIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAAJncAkAAgECEVBlcm1pc3Npb24gZGVuaWVkAQJncQECY1IEAmduCQECZ20AAwkAAQIFAmduAgpCeXRlVmVjdG9yBAJncgUCZ24JAAACCAUCY1IPY2FsbGVyUHVibGljS2V5BQJncgMJAAECBQJnbgIEVW5pdAkAAAIIBQJjUgZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgECZ3MBAmNSBAJnbgkBAmdtAAMJAAECBQJnbgIKQnl0ZVZlY3RvcgQCZ3IFAmduAwkAAAIIBQJjUg9jYWxsZXJQdWJsaWNLZXkFAmdyBgUCZ3ADCQABAgUCZ24CBFVuaXQDCQAAAggFAmNSBmNhbGxlcgUEdGhpcwYFAmdwCQACAQILTWF0Y2ggZXJyb3IBAmd0AwJndQJldgJndgQCYmkJAQJiYQAEAmRsCQCRAwIFAmJpBQF3BAJkbQkAkQMCBQJiaQUBeAQCZXcFAWcEAmV5CQCnAwEFAWwEAmNGCQC5AgIJAKcDAQUCYVcFAmV5BAJjQgMJAAACBQJndQcJAMwIAgkAtwICCQC2AgEJAQJiUAEFAmRsBQJndgkAzAgCCQC2AgEJAQJiUAEFAmRtBQNuaWwJAMwIAgkAtwICCQC2AgEJAQJiUAEFAmRtBQJndgkAzAgCCQC2AgEJAQJiUAEFAmRsBQNuaWwEAmV4CQCRAwIFAmNCAAAEAmNFBQJleAQCY0cJALkCAgUCY0YFAmV3BAJlegkAugICCQC5AgIJALkCAgkAugICCQC5AgIFAmV2BQJldgkAuQICBQJleAUCZXcFAmV2BQJleQkAuQICBQJjRwUCZXcEAmVBCQC4AgIJALcCAgUCY0UJALoCAgkAuQICBQJldgUCZXkFAmNHBQJldgoBAmNQAgJjUQJlQgQCZ3cFAmNRBAJlRAgFAmd3Al8xBAJkZQgFAmd3Al8yAwkBAiE9AgUCZGUFBHVuaXQFAmNRBAJlRQkAugICCQC3AgIJALkCAgUCZUQFAmVEBQJlegkAtwICCQC5AgIFAWcFAmVEBQJlQQQCZUYJAQFYAQkAuAICBQJlRQkBBXZhbHVlAQUCZUQDCQDAAgIFAWYFAmVGCQCUCgIFAmVFBQJlQgkAlAoCBQJlRQUEdW5pdAQCY1YJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQCZ3gKAAJjWAUCY1YKAAJjWQkAkAMBBQJjWAoAAmNaCQCUCgIFAmV2BQR1bml0CgECZGECAmRiAmRjAwkAZwIFAmRjBQJjWQUCZGIJAQJjUAIFAmRiCQCRAwIFAmNYBQJkYwoBAmRkAgJkYgJkYwMJAGcCBQJkYwUCY1kFAmRiCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQJkZAIJAQJkYQIJAQJkYQIJAQJkYQIJAQJkYQIJAQJkYQIJAQJkYQIJAQJkYQIJAQJkYQIJAQJkYQIJAQJkYQIJAQJkYQIJAQJkYQIJAQJkYQIJAQJkYQIJAQJkYQIFAmNaAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EAmVECAUCZ3gCXzEEAmRlCAUCZ3gCXzIDCQECIT0CBQJkZQUEdW5pdAUCZUQJAAIBCQCsAgICGVkgY2FsY3VsYXRpb24gZXJyb3IsIFkgPSAJAKYDAQUCZUQBAmd5AAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhUwkBAmFFAQkApQgBBQR0aGlzBx4CY1IBIWNhbGN1bGF0ZUFtb3VudE91dEZvclN3YXBSRUFET05MWQMCZ3oCZ3UCZ0EEAmdCAwkAAAIFAmd1BwQCZ0MJAQJhTAIFBHRoaXMJAQJhawAEAmd2CQC3AgIJALYCAQkBAmJQAQkBAmFMAgUEdGhpcwkBAmFqAAkAtgIBBQJnegkAlAoCBQJnQwUCZ3YEAmdDCQECYUwCBQR0aGlzCQECYWoABAJndgkAtwICCQC2AgEJAQJiUAEJAQJhTAIFBHRoaXMJAQJhawAJALYCAQUCZ3oJAJQKAgUCZ0MFAmd2BAJnQwgFAmdCAl8xBAJndggFAmdCAl8yBAJiaQkBAmJhAAQCZGwJAJEDAgUCYmkFAXcEAmRtCQCRAwIFAmJpBQF4BAJjQgkAzAgCCQC2AgEJAQJiUAEFAmRsCQDMCAIJALYCAQkBAmJQAQUCZG0FA25pbAQCZXYJAQJjQQEFAmNCBAJlRAkBAmd0AwUCZ3UFAmV2CQC2AgEFAmd6BAJnRAkAuAICCQC4AgIJALYCAQkBAmJQAQUCZ0MFAmVECQC2AgEAAQQCZ0UJAJYDAQkAzAgCAAAJAMwIAgkAoAMBBQJnRAUDbmlsBAJnRgMJAAACBQJndQcJAMwIAgkAtwICCQC3AgIJALYCAQkBAmJQAQUCZGwJALYCAQUCZ3oJALYCAQUCZ0EJAMwIAgkAuAICCQC2AgEJAQJiUAEFAmRtBQJnRAUDbmlsCQDMCAIJALgCAgkAtgIBCQECYlABBQJkbAUCZ0QJAMwIAgkAtwICCQC3AgIJALYCAQkBAmJQAQUCZG0JALYCAQUCZ3oJALYCAQUCZ0EFA25pbAQCZ0cJAQJjQQEFAmdGBAJlYQMJAMACAgUCZ0cFAmV2BgkAAgEJALkJAgkAzAgCAhRuZXcgRCBpcyBmZXdlciBlcnJvcgkAzAgCCQCmAwEFAmV2CQDMCAIJAKYDAQUCZ0cFA25pbAICX18DCQAAAgUCZWEFAmVhCQCUCgIFA25pbAUCZ0UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY1IBJmNhbGN1bGF0ZUFtb3VudE91dEZvclN3YXBBbmRTZW5kVG9rZW5zBQJnegJndQJnSAJnSQJnQQQCZ0oKAAJhVQkA/AcEBQJhUwIXZ2V0U3dhcENvbnRyYWN0UkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAmFVAgZTdHJpbmcFAmFVCQACAQkArAICCQADAQUCYVUCGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwQCZ0sJAMwIAgMJAGcCCAkBBXZhbHVlAQkAkQMCCAUCY1IIcGF5bWVudHMAAAZhbW91bnQFAmd6BgkBAmFQAQIMV3JvbmcgYW1vdW50CQDMCAIDCQAAAggFAmNSBmNhbGxlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUCZ0oGCQECYVABAhFQZXJtaXNzaW9uIGRlbmllZAUDbmlsAwkAAAIFAmdLBQJnSwQCZm0JAQV2YWx1ZQEJAJEDAggFAmNSCHBheW1lbnRzAAAEAmdMCQECYmcBCAUCZm0HYXNzZXRJZAQCZ00DCQAAAgUCZ3UHBAJnQwkBAmFMAgUEdGhpcwkBAmFrAAQCZ3YJAGUCCQECYlABBQJnTAgJAQV2YWx1ZQEJAJEDAggFAmNSCHBheW1lbnRzAAAGYW1vdW50CQCUCgIFAmdDBQJndgQCZ0MJAQJhTAIFBHRoaXMJAQJhagAEAmd2CQBlAgkBAmJQAQUCZ0wICQEFdmFsdWUBCQCRAwIIBQJjUghwYXltZW50cwAABmFtb3VudAkAlAoCBQJnQwUCZ3YEAmdDCAUCZ00CXzEEAmd2CAUCZ00CXzIEAmJpCQECYmEABAJkbAkAkQMCBQJiaQUBdwQCZG0JAJEDAgUCYmkFAXgEAmNCAwkAAAIFAmd1BwkAzAgCCQC4AgIJALYCAQkBAmJQAQUCZGwJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmNSCHBheW1lbnRzAAAGYW1vdW50CQDMCAIJALYCAQkBAmJQAQUCZG0FA25pbAkAzAgCCQC2AgEJAQJiUAEFAmRsCQDMCAIJALgCAgkAtgIBCQECYlABBQJkbQkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCY1IIcGF5bWVudHMAAAZhbW91bnQFA25pbAQCZXYJAQJjQQEFAmNCBAJlRAkBAmd0AwUCZ3UFAmV2CQC2AgEAAAQCZ0QJALgCAgkAuAICCQC2AgEJAQJiUAEFAmdDBQJlRAkAtgIBAAEEAmdFCQCWAwEJAMwIAgAACQDMCAIJAKADAQUCZ0QFA25pbAQCZ04DCQBnAgUCZ0UFAmdIBgkAAgECLEV4Y2hhbmdlIHJlc3VsdCBpcyBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkAwkAAAIFAmdOBQJnTgQCZ0YDCQAAAgUCZ3UHCQDMCAIJALcCAgkAtgIBCQECYlABBQJkbAkAtgIBBQJnQQkAzAgCCQC4AgIJALYCAQkBAmJQAQUCZG0FAmdEBQNuaWwJAMwIAgkAuAICCQC2AgEJAQJiUAEFAmRsBQJnRAkAzAgCCQC3AgIJALYCAQkBAmJQAQUCZG0JALYCAQUCZ0EFA25pbAQCZ0cJAQJjQQEFAmdGBAJlYQMJAMACAgUCZ0cFAmV2BgkAAgECFG5ldyBEIGlzIGZld2VyIGVycm9yAwkAAAIFAmVhBQJlYQkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmdJBQJnRQkBAmJlAQUCZ0MFA25pbAUCZ0UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY1IBC2NvbnN0cnVjdG9yAQFZBAJlegkBAmdzAQUCY1IDCQAAAgUCZXoFAmV6CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFZAAUBWQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNSAQpzZXRNYW5hZ2VyAQJnTwQCZXoJAQJncwEFAmNSAwkAAAIFAmV6BQJlegQCZ1AJANkEAQUCZ08DCQAAAgUCZ1AFAmdQCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQAFAmdPBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY1IBDmNvbmZpcm1NYW5hZ2VyAAQCY3cJAQJnbwAEAmdRAwkBCWlzRGVmaW5lZAEFAmN3BgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJnUQUCZ1EEAmdSAwkAAAIIBQJjUg9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmN3BgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJnUgUCZ1IJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVoACQDYBAEJAQV2YWx1ZQEFAmN3CQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhYQAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjUgEDcHV0AgJnUwJnVAQCZ1UJAQJidQAEAmdWCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJnVQUBQwIKV3Igc3QgYWRkcgQCZ1cJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmdVBQFFAgpXciBzbCBhZGRyAwkAZgIAAAUCZ1MJAAIBAg5Xcm9uZyBzbGlwcGFnZQMJAQIhPQIJAJADAQgFAmNSCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmdYCQC2AgEICQEFdmFsdWUBCQCRAwIIBQJjUghwYXltZW50cwAABmFtb3VudAQCZ1kJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmNSCHBheW1lbnRzAAEGYW1vdW50BAJlUQkAuAICCQC2AgEJAQJiUAEJAQJiZwEFAmJvBQJnWAMJAAACBQJlUQUCZVEEAmVSCQC4AgIJALYCAQkBAmJQAQkBAmJnAQUCYnAFAmdZAwkAAAIFAmVSBQJlUgQCZVMJALYCAQgJAQV2YWx1ZQEJAOwHAQUCYm4IcXVhbnRpdHkDCQAAAgUCZVMFAmVTBAJlVAkBAmVNAwUCZ1gFAmdZCQC2AgEAAAMJAAACBQJlVAUCZVQEAmdaCQECZm4KCQClCAEIBQJjUgZjYWxsZXIJANgEAQgFAmNSDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCY1IIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCY1IIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmNSCHBheW1lbnRzAAEFAmdTBgcGAAACAAQCZW4IBQJnWgJfMgQCaGEIBQJnWgJfNwQCZEQIBQJnWgJfOQQCZW8IBQJnWgNfMTAEAmVwCAUCZ1oDXzExBAJkbAgFAmdaA18xMgQCZG0IBQJnWgNfMTMEAmRaCQD8BwQFAmFTAgRlbWl0CQDMCAIFAmVuBQNuaWwFA25pbAMJAAACBQJkWgUCZFoEAmhiBAJnbgUCZFoDCQABAgUCZ24CB0FkZHJlc3MEAmhjBQJnbgkA/AcEBQJoYwIEZW1pdAkAzAgCBQJlbgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCaGIFAmhiBAJoZAMJAGYCBQJlbwAACQD8BwQFAmdXAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZGwFAmVvBQNuaWwFA25pbAMJAAACBQJoZAUCaGQEAmhlAwkAZgIFAmVwAAAJAPwHBAUCZ1cCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJkbQUCZXAFA25pbAUDbmlsAwkAAAIFAmhlBQJoZQQCaGYDBQJnVAQCaGcJAPwHBAUCZ1YCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmhhBQJlbgUDbmlsAwkAAAIFAmhnBQJoZwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJjUgZjYWxsZXIFAmVuBQJoYQUDbmlsBAJoaAkBAmVVAwAAAAAAAAQCZ2sIBQJoaAJfMQQCZUwIBQJoaAJfMgQCaGkDCQDAAgIFAmVMBQJlVAYJAQJhUAEJALkJAgkAzAgCAiJ1cGRhdGVkIERMcCBsb3dlciB0aGFuIGN1cnJlbnQgRExwCQDMCAIJAKYDAQUCZVEJAMwIAgkApgMBBQJlUgkAzAgCCQCmAwEFAmVTCQDMCAIJAKYDAQUCZVQJAMwIAgkApgMBBQJlTAkAzAgCCQCkAwEFAmVvCQDMCAIJAKQDAQUCZXAFA25pbAIBIAMJAAACBQJoaQUCaGkEAmhqCAkBBXZhbHVlAQkA7AcBBQJibghxdWFudGl0eQMJAAACBQJoagUCaGoJAM4IAgkAzggCBQJkRAUCaGYFAmdrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNSAQtwdXRPbmVUa25WMgICZk8CZ1QEAmhrCgACYVUJAPwHBAUCYVMCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJhVQIHQm9vbGVhbgUCYVUJAAIBCQCsAgIJAAMBBQJhVQIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCaGwDAwMJAQJhWAAGCQAAAgUCYm0FAXEGCQAAAgUCYm0FAXMGBQJoawQCZ0sJAMwIAgMDCQEBIQEFAmhsBgkBAmdxAQUCY1IGCQECYVABAiFwdXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJjUghwYXltZW50cwABBgkBAmFQAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ0sFAmdLBAJkbAkA2AQBCQEFdmFsdWUBBQJibwQCZG0JANgEAQkBBXZhbHVlAQUCYnAEAmRrBQJibgQCZlMFAmJxBAJmVAUCYnIEAmRqAwkAAAIIBQJjUgZjYWxsZXIFBHRoaXMIBQJjUgxvcmlnaW5DYWxsZXIIBQJjUgZjYWxsZXIEAmZtCQEFdmFsdWUBCQCRAwIIBQJjUghwYXltZW50cwAABAJkaAkA2AQBCQEFdmFsdWUBCAUCZm0HYXNzZXRJZAQCZE4IBQJmbQZhbW91bnQEAmVUAwkAAAIIBQJmbQdhc3NldElkBQJibwkBAmVNAwkAtgIBBQJkTgkAtgIBAAAJALYCAQAACQECZU0DCQC2AgEAAAkAtgIBBQJkTgkAtgIBAAADCQAAAgUCZVQFAmVUBAJobQkBAmZyBQUCZE4FAmRoCQClCAEFAmRqCQDYBAEIBQJjUg10cmFuc2FjdGlvbklkBgMJAAACBQJobQUCaG0EAmN6CAUCaG0CXzMEAmRECAUCaG0CXzIEAmhuCAUCaG0CXzEEAmVuAwMJAGYCBQJmTwAACQBmAgUCZk8FAmhuBwkBAmFQAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJmTwUDbmlsAgAFAmhuBAJnWgkA/AcEBQJhUwIEZW1pdAkAzAgCBQJlbgUDbmlsBQNuaWwDCQAAAgUCZ1oFAmdaBAJoYgQCZ24FAmdaAwkAAQIFAmduAgdBZGRyZXNzBAJoYwUCZ24JAPwHBAUCaGMCBGVtaXQJAMwIAgUCZW4FA25pbAUDbmlsBQR1bml0AwkAAAIFAmhiBQJoYgQCaGYDBQJnVAQCaGcJAPwHBAUCYncCCHN0YWtlRm9yCQDMCAIJAKUIAQgFAmNSBmNhbGxlcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJkawUCZW4FA25pbAMJAAACBQJoZwUCaGcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCY1IGY2FsbGVyBQJlbgUCZGsFA25pbAQCZ2UDCQBmAgUCY3oAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhWgUCY3oJANkEAQUCZGgFA25pbAUDbmlsBAJobwMJAAACBQR0aGlzBQJhWgkAlAoCAAAAAAQCaHADCQAAAggFAmZtB2Fzc2V0SWQFAmJvBgcDBQJocAkAlAoCCQEBLQEFAmN6AAAJAJQKAgAACQEBLQEFAmN6BAJlVggFAmhvAl8xBAJlVwgFAmhvAl8yBAJocQkBAmVVAwUCZVYFAmVXAAAEAmdrCAUCaHECXzEEAmVMCAUCaHECXzIEAmdsCQECZVkCBQJlVAUCZUwDCQAAAgUCZ2wFAmdsCQCUCgIJAM4IAgkAzggCCQDOCAIFAmREBQJoZgUCZ2UFAmdrBQJlbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjUgEKcHV0Rm9yRnJlZQECaHIDCQBmAgAABQJocgkAAgECCldyb25nIHNscGcDCQECIT0CCQCQAwEIBQJjUghwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAJocwkBAmZuCgkApQgBCAUCY1IGY2FsbGVyCQDYBAEIBQJjUg10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAmNSCHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAmNSCHBheW1lbnRzAAAGYW1vdW50CQCRAwIIBQJjUghwYXltZW50cwABBQJocgcHBgAAAgAEAmRECAUCaHMCXzkEAmdYCQC2AgEICQEFdmFsdWUBCQCRAwIIBQJjUghwYXltZW50cwAABmFtb3VudAQCZ1kJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmNSCHBheW1lbnRzAAEGYW1vdW50BAJlVAkBAmVNAwUCZ1gFAmdZCQC2AgEAAAMJAAACBQJlVAUCZVQEAmh0CQECZVUDAAAAAAAABAJnawgFAmh0Al8xBAJlTAgFAmh0Al8yBAJnbAkBAmVZAgUCZVQFAmVMAwkAAAIFAmdsBQJnbAkAzggCBQJkRAUCZ2sJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY1IBA2dldAAEAmVUCQECZU0DCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmVUBQJlVAQCZFoJAQJmbAEFAmNSBAJodQgFAmRaAl8xBAJkQwgFAmRaAl8yBAJkTggFAmRaAl8zBAJkaAgFAmRaAl80BAJkRAgFAmRaAl81BAJlQQkA/AcEBQJhUwIEYnVybgkAzAgCBQJkTgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJkaAUCZE4FA25pbAMJAAACBQJlQQUCZUEEAmh2CQECZVUDCQEBLQEFAmh1CQEBLQEFAmRDAAAEAmdrCAUCaHYCXzEEAmVMCAUCaHYCXzIEAmdsCQECZVkCBQJlVAUCZUwDCQAAAgUCZ2wFAmdsCQDOCAIFAmREBQJnawkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjUgELZ2V0T25lVGtuVjICAmZOAmZPBAJoawoAAmFVCQD8BwQFAmFTAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYVUCB0Jvb2xlYW4FAmFVCQACAQkArAICCQADAQUCYVUCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmh3AwMJAQJhWAAGCQAAAgUCYm0FAXMGBQJoawQCZ0sJAMwIAgMDCQEBIQEFAmh3BgkBAmdxAQUCY1IGCQECYVABAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJjUghwYXltZW50cwABBgkBAmFQAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ0sFAmdLBAJoeAkBAmZNBgUCZk4FAmZPCAUCY1IIcGF5bWVudHMIBQJjUgZjYWxsZXIIBQJjUgxvcmlnaW5DYWxsZXIIBQJjUg10cmFuc2FjdGlvbklkBAJkRAgFAmh4Al8xBAJmWAgFAmh4Al8yCQCUCgIFAmREBQJmWAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjUgEKcmVmcmVzaERMcAAEAmh5CQELdmFsdWVPckVsc2UCCQCfCAEFAmFxAAAEAmh6AwkAZwIJAGUCBQZoZWlnaHQFAmh5BQJhdAUEdW5pdAkBAmFQAQkAuQkCCQDMCAIJAKQDAQUCYXQJAMwIAgIvIGJsb2NrcyBoYXZlIG5vdCBwYXNzZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwFA25pbAIAAwkAAAIFAmh6BQJoegQCZmYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAqAMBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAmFwAgEwCQECYVIBAgtpbnZhbGlkIGRMcAQCaEEJAQJlVQMAAAAAAAAEAmhCCAUCaEECXzEEAmVMCAUCaEECXzIEAmVYAwkBAiE9AgUCZmYFAmVMBQJoQgkBAmFQAQISbm90aGluZyB0byByZWZyZXNoCQCUCgIFAmVYCQCmAwEFAmVMCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNSARNnZXRPbmVUa25WMlJFQURPTkxZAgJmTgJoQwQCZGwJANgEAQkBBXZhbHVlAQUCYm8EAmRtCQDYBAEJAQV2YWx1ZQEFAmJwBAJkawkA2AQBCQEFdmFsdWUBBQJibgQCY0IJAMwIAgkAtgIBCQECYlABBQJkbAkAzAgCCQC2AgEJAQJiUAEFAmRtBQNuaWwEAmVLCQC2AgEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJkawIQaW52YWxpZCBscCBhc3NldAhxdWFudGl0eQQCY2QJAQJjQQEFAmNCBAJjYwkAuAICBQJjZAkAvAIDCQC2AgEFAmhDBQJjZAUCZUsEAmhEAwkAAAIFAmZOBQJkbAAAAwkAAAIFAmZOBQJkbQABCQACAQIUaW52YWxpZCBvdXQgYXNzZXQgaWQEAmhFCQECZXUDBQJjQgUCaEQFAmNjBAJnRAkAuAICCQCRAwIFAmNCBQJoRAUCaEUEAmdFCQCWAwEJAMwIAgAACQDMCAIJAKADAQkAuAICBQJnRAUBZgUDbmlsBAJoRgkBAmN4AgUCZ0UFAmFWBAJmVwgFAmhGAl8xBAJjeggFAmhGAl8yCQCUCgIFA25pbAkAlAoCBQJmVwUCY3oCY1IBHGdldE9uZVRrblYyV2l0aEJvbnVzUkVBRE9OTFkCAmZOAmhDBAJkbAkA2AQBCQEFdmFsdWUBBQJibwQCZG0JANgEAQkBBXZhbHVlAQUCYnAEAmRrCQDYBAEJAQV2YWx1ZQEFAmJuBAJkcgkBAmJQAQUCZGwEAmR0CQECYlABBQJkbQQCaEcKAAJhVQkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmZOCQDMCAIFAmhDBQNuaWwFA25pbAMJAAECBQJhVQIKKEludCwgSW50KQUCYVUJAAIBCQCsAgIJAAMBBQJhVQIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQQCZlcIBQJoRwJfMQQCY3oIBQJoRwJfMgQCZFoJAQJkZgQCAAUCZGsFAmhDBQR0aGlzBAJkQggFAmRaAl8xBAJkQwgFAmRaAl8yBAJoSAkAZAIFAmRCBQJkQwQCZkwDCQAAAgUCaEgAAAMJAAACBQJmVwAAAAAJAAIBAhdib251cyBjYWxjdWxhdGlvbiBlcnJvcgkAawMJAGUCBQJmVwUCaEgFAWEFAmhICQCUCgIFA25pbAkAlQoDBQJmVwUCY3oFAmZMAmNSAQlnZXROb0xlc3MCAmhJAmhKBAJkWgkBAmZsAQUCY1IEAmRCCAUCZFoCXzEEAmRDCAUCZFoCXzIEAmROCAUCZFoCXzMEAmRoCAUCZFoCXzQEAmRECAUCZFoCXzUDCQBmAgUCaEkFAmRCCQACAQkArAICCQCsAgIJAKwCAgIJRmFpbGVkOiAgCQCkAwEFAmRCAgMgPCAJAKQDAQUCaEkDCQBmAgUCaEoFAmRDCQACAQkArAICCQCsAgIJAKwCAgIIRmFpbGVkOiAJAKQDAQUCZEMCAyA8IAkApAMBBQJoSgQCZVQJAQJlTQMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUCZVQFAmVUBAJoSwkA/AcEBQJhUwIEYnVybgkAzAgCBQJkTgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJkaAUCZE4FA25pbAMJAAACBQJoSwUCaEsEAmhMCQECZVUDCQEBLQEFAmRCCQEBLQEFAmRDAAAEAmdrCAUCaEwCXzEEAmVMCAUCaEwCXzIEAmdsCQECZVkCBQJlVAUCZUwDCQAAAgUCZ2wFAmdsCQDOCAIFAmREBQJnawkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjUgENdW5zdGFrZUFuZEdldAECY3kEAmhNAwkBAiE9AgkAkAMBCAUCY1IIcGF5bWVudHMAAAkAAgECDU5vIHBtbnRzIGV4cGQGAwkAAAIFAmhNBQJoTQQCaE4JAQJidQAEAmhhBQJibgQCaE8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmhOBQFDAgpXciBzdCBhZGRyBAJlVAkBAmVNAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQJlVAUCZVQEAmhQCQD8BwQFAmhPAgd1bnN0YWtlCQDMCAIJANgEAQUCaGEJAMwIAgUCY3kFA25pbAUDbmlsAwkAAAIFAmhQBQJoUAQCZFoJAQJkZgQJANgEAQgFAmNSDXRyYW5zYWN0aW9uSWQJANgEAQUCaGEFAmN5CAUCY1IGY2FsbGVyBAJkQggFAmRaAl8xBAJkQwgFAmRaAl8yBAJkcAkBDXBhcnNlSW50VmFsdWUBCAUCZFoCXzkEAmRECAUCZFoDXzEwBAJoUQMDCQECYVgABgkAAAIFAmRwBQFzCQACAQkArAICAglCbG9ja2VkOiAJAKQDAQUCZHAGAwkAAAIFAmhRBQJoUQQCaFIJAPwHBAUCYVMCBGJ1cm4JAMwIAgUCY3kFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCaGEFAmN5BQNuaWwDCQAAAgUCaFIFAmhSBAJoUwkBAmVVAwkBAS0BBQJkQgkBAS0BBQJkQwAABAJnawgFAmhTAl8xBAJlTAgFAmhTAl8yBAJnbAkBAmVZAgUCZVQFAmVMAwkAAAIFAmdsBQJnbAkAzggCBQJkRAUCZ2sJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY1IBE3Vuc3Rha2VBbmRHZXROb0xlc3MDAmhUAmhVAmhKBAJodwMJAQJhWAAGCQAAAgUCYm0FAXMEAmdLCQDMCAIDCQEBIQEFAmh3BgkAAgECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmNSCHBheW1lbnRzAAAGCQACAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ0sFAmdLBAJlVAkBAmVNAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQJlVAUCZVQEAmhQCQD8BwQFAmJ3Agd1bnN0YWtlCQDMCAIJANgEAQUCYm4JAMwIAgUCaFQFA25pbAUDbmlsAwkAAAIFAmhQBQJoUAQCaFYJAQJkZgQJANgEAQgFAmNSDXRyYW5zYWN0aW9uSWQJANgEAQUCYm4FAmhUCAUCY1IGY2FsbGVyBAJkQggFAmhWAl8xBAJkQwgFAmhWAl8yBAJkRAgFAmhWA18xMAQCaFcJAMwIAgMJAGcCBQJkQgUCaFUGCQACAQkAuQkCCQDMCAICLGFtb3VudCBhc3NldCBhbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCaFUFA25pbAIACQDMCAIDCQBnAgUCZEMFAmhKBgkAAgEJALkJAgkAzAgCAitwcmljZSBhc3NldCBhbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCaEoFA25pbAIABQNuaWwDCQAAAgUCaFcFAmhXBAJoSwkA/AcEBQJhUwIEYnVybgkAzAgCBQJoVAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJibgUCaFQFA25pbAMJAAACBQJoSwUCaEsEAmhYCQECZVUDCQEBLQEFAmRCCQEBLQEFAmRDAAAEAmdrCAUCaFgCXzEEAmVMCAUCaFgCXzIEAmdsCQECZVkCBQJlVAUCZUwDCQAAAgUCZ2wFAmdsCQDOCAIFAmREBQJnawkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjUgEVdW5zdGFrZUFuZEdldE9uZVRrblYyAwJoVAJmTgJmTwQCaGsKAAJhVQkA/AcEBQJhUwIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmFVAgdCb29sZWFuBQJhVQkAAgEJAKwCAgkAAwEFAmFVAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJodwMDCQECYVgABgkAAAIFAmJtBQFzBgUCaGsEAmdLCQDMCAIDAwkBASEBBQJodwYJAQJncQEFAmNSBgkBAmFQAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCY1IIcGF5bWVudHMAAAYJAQJhUAECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmdLBQJnSwQCaE4JAQJidQAEAmhhBQJibgQCaE8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmhOBQFDAgpXciBzdCBhZGRyBAJkaggFAmNSBmNhbGxlcgQCaFkFBHRoaXMEAmhQCQD8BwQFAmhPAg91bnN0YWtlSU5URVJOQUwJAMwIAgUCaGEJAMwIAgUCaFQJAMwIAggFAmRqBWJ5dGVzCQDMCAIIBQJoWQVieXRlcwUDbmlsBQNuaWwDCQAAAgUCaFAFAmhQBAJoWgkBAmZNBgUCZk4FAmZPCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJoYQUCaFQFA25pbAgFAmNSBmNhbGxlcggFAmNSDG9yaWdpbkNhbGxlcggFAmNSDXRyYW5zYWN0aW9uSWQEAmRECAUCaFoCXzEEAmZYCAUCaFoCXzIJAJQKAgUCZEQFAmZYCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNSARxwdXRPbmVUa25WMldpdGhCb251c1JFQURPTkxZAgJpYQJpYgQCaWMJAQJmcgUFAmlhBQJpYgIAAgAGBAJmRwgFAmljAl8xBAJkRAgFAmljAl8yBAJjeggFAmljAl8zBAJmTAgFAmljAl80CQCUCgIFA25pbAkAlQoDBQJmRwUCY3oFAmZMAmNSASFwdXRPbmVUa25WMldpdGhvdXRUYWtlRmVlUkVBRE9OTFkCAmlhAmliBAJpZAkBAmZyBQUCaWEFAmliAgACAAcEAmZHCAUCaWQCXzEEAmRECAUCaWQCXzIEAmN6CAUCaWQCXzMEAmZMCAUCaWQCXzQJAJQKAgUDbmlsCQCVCgMFAmZHBQJjegUCZkwCY1IBCGFjdGl2YXRlAgJpZQJpZgMJAQIhPQIJAKUIAQgFAmNSBmNhbGxlcgkApQgBBQJhUwkAAgECBmRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhagAFAmllCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhawAFAmlmBQNuaWwCB3N1Y2Nlc3MCY1IBBHNldFMCAmlnAmhRAwkBAiE9AgkApQgBCAUCY1IGY2FsbGVyCQECYUwCBQR0aGlzCQECYW0ABQJncAkAzAgCCQELU3RyaW5nRW50cnkCBQJpZwUCaFEFA25pbAJjUgEEc2V0SQICaWcCaFEDCQECIT0CCQClCAEIBQJjUgZjYWxsZXIJAQJhTAIFBHRoaXMJAQJhbQAFAmdwCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJpZwUCaFEFA25pbAJjUgEcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQAJAJQKAgUDbmlsCQECYmEAAmNSARxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZAQJiUQkAlAoCBQNuaWwJAQJiUAEFAmJRAmNSARljYWxjUHJpY2VzV3JhcHBlclJFQURPTkxZAwJjagJjawJjbwQCaWgJAQJjbgMFAmNqBQJjawUCY28JAJQKAgUDbmlsCQDMCAIJAKYDAQkAkQMCBQJpaAAACQDMCAIJAKYDAQkAkQMCBQJpaAABCQDMCAIJAKYDAQkAkQMCBQJpaAACBQNuaWwCY1IBFmZyb21YMThXcmFwcGVyUkVBRE9OTFkCAU0CaWkJAJQKAgUDbmlsCQEBTAIJAKcDAQUBTQUCaWkCY1IBFHRvWDE4V3JhcHBlclJFQURPTkxZAgFJAUoJAJQKAgUDbmlsCQCmAwEJAQFIAgUBSQUBSgJjUgEeY2FsY1ByaWNlQmlnSW50V3JhcHBlclJFQURPTkxZAgJiUwJiVAkAlAoCBQNuaWwJAKYDAQkBAmJSAgkApwMBBQJiUwkApwMBBQJiVAJjUgEjZXN0aW1hdGVQdXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkJAmRnAmJZAmRGAmRHAmRIAmRJAmlqAmRKAmRLCQCUCgIFA25pbAkBAmRFDQUCZGcFAmJZBQJkRgUCZEcFAmRIBQJkSQUCaWoFAmRKBQJkSwYHAAACAAJjUgEjZXN0aW1hdGVHZXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkEAmRnAmlrAmRpAmlqBAJkWgkBAmRmBAUCZGcFAmlrBQJkaQkBEUBleHRyTmF0aXZlKDEwNjIpAQUCaWoJAJQKAgUDbmlsCQCcCgoIBQJkWgJfMQgFAmRaAl8yCAUCZFoCXzMIBQJkWgJfNAgFAmRaAl81CAUCZFoCXzYIBQJkWgJfNwkApgMBCAUCZFoCXzgIBQJkWgJfOQgFAmRaA18xMAECaWwBAmltAAQCaW4EAmduCQECZ20AAwkAAQIFAmduAgpCeXRlVmVjdG9yBAJncgUCZ24FAmdyAwkAAQIFAmduAgRVbml0CAUCaWwPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IEAmduBQJpbAMJAAECBQJnbgIFT3JkZXIEAmZiBQJnbgQCaW8JAQJhWQAEAmlwAwkBAmd5AAkAlAoCBgIACQECZmEBBQJmYgQCYUgIBQJpcAJfMQQCYUkIBQJpcAJfMgQCYUoJAPQDAwgFAmZiCWJvZHlCeXRlcwkAkQMCCAUCZmIGcHJvb2ZzAAAIBQJmYg9zZW5kZXJQdWJsaWNLZXkEAmFLCQD0AwMIBQJmYglib2R5Qnl0ZXMJAJEDAggFAmZiBnByb29mcwABBQJpbwMDAwUCYUgFAmFKBwUCYUsHBgkBAmFHBAUCYUgFAmFJBQJhSgUCYUsDCQABAgUCZ24CFFNldFNjcmlwdFRyYW5zYWN0aW9uBAJjRQUCZ24DCQD0AwMIBQJpbAlib2R5Qnl0ZXMJAJEDAggFAmlsBnByb29mcwAABQJpbgYEAmlxCQD2AwEJAQV2YWx1ZQEIBQJjRQZzY3JpcHQEAmlyCQDbBAEJAQV2YWx1ZQEJAJ0IAgUCYVMJAQJhQwAEAmlzCQDxBwEFBHRoaXMDCQAAAgUCaXIFAmlxCQECIT0CBQJpcwUCaXEHCQD0AwMIBQJpbAlib2R5Qnl0ZXMJAJEDAggFAmlsBnByb29mcwAABQJpbutAyXM=", "height": 3566658, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Bsr5dYLr9pAjDm9swZpMQebZQtH7STrUdzxQw2tLcnKk Next: DiVZQE6C8A8A4jZEXSyPiiv9PenDUf3MxWPN4xgfdcjb Diff:
OldNewDifferences
12501250 then {
12511251 let lpTrnsfr = if (autoStake)
12521252 then {
1253- let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
1253+ let ss = invoke(stakingContract, "stakeFor", [toString(i.caller)], [AttachedPayment(lpId, emitLpAmt)])
12541254 if ((ss == ss))
12551255 then nil
12561256 else throw("Strict value is not equal to itself.")
12591259 let sendFeeToMatcher = if ((feeAmount > 0))
12601260 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
12611261 else nil
1262- let $t04479745146 = if ((this == feeCollectorAddress))
1262+ let $t04486745216 = if ((this == feeCollectorAddress))
12631263 then $Tuple2(0, 0)
12641264 else {
12651265 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
12691269 then $Tuple2(-(feeAmount), 0)
12701270 else $Tuple2(0, -(feeAmount))
12711271 }
1272- let amountAssetBalanceDelta = $t04479745146._1
1273- let priceAssetBalanceDelta = $t04479745146._2
1274- let $t04514945257 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1275- let refreshDLpActions = $t04514945257._1
1276- let updatedDLp = $t04514945257._2
1272+ let amountAssetBalanceDelta = $t04486745216._1
1273+ let priceAssetBalanceDelta = $t04486745216._2
1274+ let $t04521945327 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1275+ let refreshDLpActions = $t04521945327._1
1276+ let updatedDLp = $t04521945327._2
12771277 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
12781278 if ((isUpdatedDLpValid == isUpdatedDLpValid))
12791279 then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
13051305 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
13061306 if ((currentDLp == currentDLp))
13071307 then {
1308- let $t04628746352 = refreshDLpInternal(0, 0, 0)
1309- let refreshDLpActions = $t04628746352._1
1310- let updatedDLp = $t04628746352._2
1308+ let $t04635746422 = refreshDLpInternal(0, 0, 0)
1309+ let refreshDLpActions = $t04635746422._1
1310+ let updatedDLp = $t04635746422._2
13111311 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13121312 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13131313 then (state ++ refreshDLpActions)
13321332 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13331333 if ((b == b))
13341334 then {
1335- let $t04752547607 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1336- let refreshDLpActions = $t04752547607._1
1337- let updatedDLp = $t04752547607._2
1335+ let $t04759547677 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1336+ let refreshDLpActions = $t04759547677._1
1337+ let updatedDLp = $t04759547677._2
13381338 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13391339 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13401340 then (state ++ refreshDLpActions)
13691369 else throwErr("exactly 1 payment are expected")]
13701370 if ((checks == checks))
13711371 then {
1372- let $t04822548380 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1373- let state = $t04822548380._1
1374- let totalAmount = $t04822548380._2
1372+ let $t04829548450 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1373+ let state = $t04829548450._1
1374+ let totalAmount = $t04829548450._2
13751375 $Tuple2(state, totalAmount)
13761376 }
13771377 else throw("Strict value is not equal to itself.")
13881388 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
13891389 then {
13901390 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1391- let $t04890448968 = refreshDLpInternal(0, 0, 0)
1392- let dLpUpdateActions = $t04890448968._1
1393- let updatedDLp = $t04890448968._2
1391+ let $t04897449038 = refreshDLpInternal(0, 0, 0)
1392+ let dLpUpdateActions = $t04897449038._1
1393+ let updatedDLp = $t04897449038._2
13941394 let actions = if ((dLp != updatedDLp))
13951395 then dLpUpdateActions
13961396 else throwErr("nothing to refresh")
14181418 let newY = getYD(xp, index, D1)
14191419 let dy = (xp[index] - newY)
14201420 let totalGetRaw = max([0, toInt((dy - big1))])
1421- let $t04997850033 = takeFee(totalGetRaw, outFee)
1422- let totalGet = $t04997850033._1
1423- let feeAmount = $t04997850033._2
1421+ let $t05004850103 = takeFee(totalGetRaw, outFee)
1422+ let totalGet = $t05004850103._1
1423+ let feeAmount = $t05004850103._2
14241424 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
14251425 }
14261426
14331433 let lpId = toBase58String(value(cfgLpAssetId))
14341434 let amBalance = getAccBalance(amId)
14351435 let prBalance = getAccBalance(prId)
1436- let $t05040850523 = {
1436+ let $t05047850593 = {
14371437 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
14381438 if ($isInstanceOf(@, "(Int, Int)"))
14391439 then @
14401440 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
14411441 }
1442- let totalGet = $t05040850523._1
1443- let feeAmount = $t05040850523._2
1442+ let totalGet = $t05047850593._1
1443+ let feeAmount = $t05047850593._2
14441444 let r = ego("", lpId, lpAssetAmount, this)
14451445 let outAmAmt = r._1
14461446 let outPrAmt = r._2
14741474 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14751475 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14761476 then {
1477- let $t05168951770 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1478- let refreshDLpActions = $t05168951770._1
1479- let updatedDLp = $t05168951770._2
1477+ let $t05175951840 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1478+ let refreshDLpActions = $t05175951840._1
1479+ let updatedDLp = $t05175951840._2
14801480 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
14811481 if ((isUpdatedDLpValid == isUpdatedDLpValid))
14821482 then (state ++ refreshDLpActions)
15211521 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15221522 if ((burnA == burnA))
15231523 then {
1524- let $t05279752878 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1525- let refreshDLpActions = $t05279752878._1
1526- let updatedDLp = $t05279752878._2
1524+ let $t05286752948 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1525+ let refreshDLpActions = $t05286752948._1
1526+ let updatedDLp = $t05286752948._2
15271527 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15281528 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15291529 then (state ++ refreshDLpActions)
15741574 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15751575 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15761576 then {
1577- let $t05412954210 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1578- let refreshDLpActions = $t05412954210._1
1579- let updatedDLp = $t05412954210._2
1577+ let $t05419954280 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1578+ let refreshDLpActions = $t05419954280._1
1579+ let updatedDLp = $t05419954280._2
15801580 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15811581 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15821582 then (state ++ refreshDLpActions)
16251625 let unstakeInv = invoke(staking, "unstakeINTERNAL", [lpAssetId, unstakeAmount, userAddress.bytes, lpAssetRecipientAddress.bytes], nil)
16261626 if ((unstakeInv == unstakeInv))
16271627 then {
1628- let $t05523255420 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1629- let state = $t05523255420._1
1630- let totalAmount = $t05523255420._2
1628+ let $t05530255490 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1629+ let state = $t05530255490._1
1630+ let totalAmount = $t05530255490._2
16311631 $Tuple2(state, totalAmount)
16321632 }
16331633 else throw("Strict value is not equal to itself.")
16391639
16401640 @Callable(i)
16411641 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1642- let $t05554855651 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1643- let lpAmount = $t05554855651._1
1644- let state = $t05554855651._2
1645- let feeAmount = $t05554855651._3
1646- let bonus = $t05554855651._4
1642+ let $t05561855721 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1643+ let lpAmount = $t05561855721._1
1644+ let state = $t05561855721._2
1645+ let feeAmount = $t05561855721._3
1646+ let bonus = $t05561855721._4
16471647 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16481648 }
16491649
16511651
16521652 @Callable(i)
16531653 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1654- let $t05579955903 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1655- let lpAmount = $t05579955903._1
1656- let state = $t05579955903._2
1657- let feeAmount = $t05579955903._3
1658- let bonus = $t05579955903._4
1654+ let $t05586955973 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1655+ let lpAmount = $t05586955973._1
1656+ let state = $t05586955973._2
1657+ let feeAmount = $t05586955973._3
1658+ let bonus = $t05586955973._4
16591659 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16601660 }
16611661
17401740 match tx {
17411741 case order: Order =>
17421742 let matcherPub = mp()
1743- let $t05869558812 = if (skipOrderValidation())
1743+ let $t05876558882 = if (skipOrderValidation())
17441744 then $Tuple2(true, "")
17451745 else validateMatcherOrderAllowed(order)
1746- let orderValid = $t05869558812._1
1747- let orderValidInfo = $t05869558812._2
1746+ let orderValid = $t05876558882._1
1747+ let orderValidInfo = $t05876558882._2
17481748 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
17491749 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
17501750 if (if (if (orderValid)
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 big3 = toBigInt(3)
1919
2020 let big4 = toBigInt(4)
2121
2222 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
2323
2424 let wavesString = "WAVES"
2525
2626 let Amult = "100"
2727
2828 let Dconv = "1"
2929
3030 let SEP = "__"
3131
3232 let EMPTY = ""
3333
3434 let PoolActive = 1
3535
3636 let PoolPutDis = 2
3737
3838 let PoolMatcherDis = 3
3939
4040 let PoolShutdown = 4
4141
4242 let idxPoolAddress = 1
4343
4444 let idxPoolSt = 2
4545
4646 let idxLPAsId = 3
4747
4848 let idxAmAsId = 4
4949
5050 let idxPrAsId = 5
5151
5252 let idxAmtAsDcm = 6
5353
5454 let idxPriceAsDcm = 7
5555
5656 let idxIAmtAsId = 8
5757
5858 let idxIPriceAsId = 9
5959
6060 let idxFactStakCntr = 1
6161
6262 let idxFactoryRestCntr = 6
6363
6464 let idxFactSlippCntr = 7
6565
6666 let idxFactGwxRewCntr = 10
6767
6868 let feeDefault = fraction(10, scale8, 10000)
6969
7070 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
7171
7272
7373 func t1BigInt (origVal,origScaleMult) = fraction(origVal, scale18, origScaleMult)
7474
7575
7676 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
7777
7878
7979 func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
8080
8181
8282 func t2 (origVal,origScaleMult) = fraction(origVal, scale18, toBigInt(origScaleMult))
8383
8484
8585 func f2 (val,resultScaleMult) = fraction(val, toBigInt(resultScaleMult), scale18)
8686
8787
8888 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
8989
9090
9191 func abs (val) = if ((zeroBigInt > val))
9292 then -(val)
9393 else val
9494
9595
9696 func absBigInt (val) = if ((zeroBigInt > val))
9797 then -(val)
9898 else val
9999
100100
101101 func fc () = "%s__factoryContract"
102102
103103
104104 func mpk () = "%s__managerPublicKey"
105105
106106
107107 func pmpk () = "%s__pendingManagerPublicKey"
108108
109109
110110 func pl () = "%s%s__price__last"
111111
112112
113113 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
114114
115115
116116 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
117117
118118
119119 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
120120
121121
122122 func aa () = "%s__amountAsset"
123123
124124
125125 func pa () = "%s__priceAsset"
126126
127127
128128 func amp () = "%s__amp"
129129
130130
131131 func ada () = "%s__addonAddr"
132132
133133
134134 let keyFee = "%s__fee"
135135
136136 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
137137
138138 let keyDLp = makeString(["%s", "dLp"], SEP)
139139
140140 let keyDLpRefreshedHeight = makeString(["%s", "dLpRefreshedHeight"], SEP)
141141
142142 let keyDLpRefreshDelay = makeString(["%s", "refreshDLpDelay"], SEP)
143143
144144 let dLpRefreshDelayDefault = 30
145145
146146 let dLpRefreshDelay = valueOrElse(getInteger(this, keyDLpRefreshDelay), dLpRefreshDelayDefault)
147147
148148 func fcfg () = "%s__factoryConfig"
149149
150150
151151 func mtpk () = "%s%s__matcher__publicKey"
152152
153153
154154 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
155155
156156
157157 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
158158
159159
160160 func aps () = "%s__shutdown"
161161
162162
163163 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
164164
165165
166166 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
167167
168168
169169 func keySkipOrderValidation (poolAddress) = ("%s%s__skipOrderValidation__" + poolAddress)
170170
171171
172172 func throwOrderError (orderValid,orderValidInfo,senderValid,matcherValid) = throw((((((((("order validation failed: orderValid=" + toString(orderValid)) + " (") + orderValidInfo) + ")") + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
173173
174174
175175 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
176176
177177
178178 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
179179
180180
181181 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
182182
183183
184184 func fmtErr (msg) = makeString(["lp_stable.ride:", msg], " ")
185185
186186
187187 let fca = addressFromStringValue(strf(this, fc()))
188188
189189 let inFee = {
190190 let @ = invoke(fca, "getInFeeREADONLY", [toString(this)], nil)
191191 if ($isInstanceOf(@, "Int"))
192192 then @
193193 else throw(($getType(@) + " couldn't be cast to Int"))
194194 }
195195
196196 let outFee = {
197197 let @ = invoke(fca, "getOutFeeREADONLY", [toString(this)], nil)
198198 if ($isInstanceOf(@, "Int"))
199199 then @
200200 else throw(($getType(@) + " couldn't be cast to Int"))
201201 }
202202
203203 let A = strf(this, amp())
204204
205205 func igs () = valueOrElse(getBoolean(fca, aps()), false)
206206
207207
208208 func mp () = fromBase58String(strf(fca, mtpk()))
209209
210210
211211 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
212212
213213 func gpc () = {
214214 let amtAs = strf(this, aa())
215215 let priceAs = strf(this, pa())
216216 let iPriceAs = intf(fca, mba(priceAs))
217217 let iAmtAs = intf(fca, mba(amtAs))
218218 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
219219 }
220220
221221
222222 func parseAssetId (input) = if ((input == wavesString))
223223 then unit
224224 else fromBase58String(input)
225225
226226
227227 func assetIdToString (input) = if ((input == unit))
228228 then wavesString
229229 else toBase58String(value(input))
230230
231231
232232 func parsePoolConfig (poolConfig) = $Tuple9(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]), fromBase58String(poolConfig[idxIAmtAsId]), fromBase58String(poolConfig[idxIPriceAsId]))
233233
234234
235235 let poolConfigParsed = parsePoolConfig(gpc())
236236
237237 let $t080608289 = poolConfigParsed
238238
239239 let cfgPoolAddress = $t080608289._1
240240
241241 let cfgPoolStatus = $t080608289._2
242242
243243 let cfgLpAssetId = $t080608289._3
244244
245245 let cfgAmountAssetId = $t080608289._4
246246
247247 let cfgPriceAssetId = $t080608289._5
248248
249249 let cfgAmountAssetDecimals = $t080608289._6
250250
251251 let cfgPriceAssetDecimals = $t080608289._7
252252
253253 let cfgInAmountAssedId = $t080608289._8
254254
255255 let cfgInPriceAssetId = $t080608289._9
256256
257257 func gfc () = split(strf(fca, fcfg()), SEP)
258258
259259
260260 let factoryConfig = gfc()
261261
262262 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
263263
264264 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
265265
266266 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
267267
268268 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
269269
270270 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)
271271
272272
273273 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)
274274
275275
276276 func getAccBalance (assetId) = if ((assetId == "WAVES"))
277277 then wavesBalance(this).available
278278 else assetBalance(this, fromBase58String(assetId))
279279
280280
281281 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
282282
283283
284284 func cpbir (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
285285
286286
287287 func vad (A1,A2,slippage) = {
288288 let diff = fraction((A1 - A2), scale8BigInt, A2)
289289 let pass = ((slippage - abs(diff)) > zeroBigInt)
290290 if (!(pass))
291291 then throw(("Big slpg: " + toString(diff)))
292292 else $Tuple2(pass, min([A1, A2]))
293293 }
294294
295295
296296 func vd (D1,D0,slpg) = {
297297 let diff = fraction(D0, scale8BigInt, D1)
298298 let fail = (slpg > diff)
299299 if (if (fail)
300300 then true
301301 else (D0 > D1))
302302 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
303303 else fail
304304 }
305305
306306
307307 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
308308 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
309309 let prAsAmtX18 = t1(prAmt, prAssetDcm)
310310 cpbi(prAsAmtX18, amtAsAmtX18)
311311 }
312312
313313
314314 func calcPrices (amAmt,prAmt,lpAmt) = {
315315 let amtAsDcm = cfgAmountAssetDecimals
316316 let prAsDcm = cfgPriceAssetDecimals
317317 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
318318 let amAmtX18 = t1(amAmt, amtAsDcm)
319319 let prAmtX18 = t1(prAmt, prAsDcm)
320320 let lpAmtX18 = t1(lpAmt, scale8)
321321 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
322322 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
323323 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
324324 }
325325
326326
327327 func calculatePrices (amAmt,prAmt,lpAmt) = {
328328 let p = calcPrices(amAmt, prAmt, lpAmt)
329329 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
330330 }
331331
332332
333333 func takeFee (amount,fee) = {
334334 let feeAmount = if ((fee == 0))
335335 then 0
336336 else fraction(amount, fee, scale8)
337337 $Tuple2((amount - feeAmount), feeAmount)
338338 }
339339
340340
341341 func getD (xp) = {
342342 let xp0 = xp[0]
343343 let xp1 = xp[1]
344344 let s = (xp0 + xp1)
345345 if ((s == big0))
346346 then big0
347347 else {
348348 let a = parseIntValue(A)
349349 let ann = (a * 2)
350350 let p = fraction(xp0, xp1, big1)
351351 let xp0_xp1_n_n = fraction(p, big4, big1)
352352 let ann_s = fraction(toBigInt(ann), s, big1)
353353 let ann_1 = toBigInt((ann - 1))
354354 func calcDNext (d) = {
355355 let dd = fraction(d, d, big1)
356356 let ddd = fraction(dd, d, big1)
357357 let dp = fraction(ddd, big1, xp0_xp1_n_n)
358358 fraction((ann_s + fraction(dp, big2, big1)), d, (fraction(ann_1, d, big1) + fraction(big3, dp, big1)))
359359 }
360360
361361 func calc (acc,i) = if (acc._2)
362362 then acc
363363 else {
364364 let d = acc._1
365365 let dNext = calcDNext(d)
366366 let dDiffRaw = (dNext - value(d))
367367 let dDiff = if ((big0 > dDiffRaw))
368368 then -(dDiffRaw)
369369 else dDiffRaw
370370 if ((big1 >= dDiff))
371371 then $Tuple2(dNext, true)
372372 else $Tuple2(dNext, false)
373373 }
374374
375375 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
376376 let $t01279412842 = {
377377 let $l = arr
378378 let $s = size($l)
379379 let $acc0 = $Tuple2(s, false)
380380 func $f0_1 ($a,$i) = if (($i >= $s))
381381 then $a
382382 else calc($a, $l[$i])
383383
384384 func $f0_2 ($a,$i) = if (($i >= $s))
385385 then $a
386386 else throw("List size exceeds 17")
387387
388388 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17)
389389 }
390390 let d = $t01279412842._1
391391 let found = $t01279412842._2
392392 if (found)
393393 then d
394394 else throw(("D calculation error, D = " + toString(d)))
395395 }
396396 }
397397
398398
399399 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
400400 let lpId = cfgLpAssetId
401401 let amId = toBase58String(value(cfgAmountAssetId))
402402 let prId = toBase58String(value(cfgPriceAssetId))
403403 let amDcm = cfgAmountAssetDecimals
404404 let prDcm = cfgPriceAssetDecimals
405405 let sts = toString(cfgPoolStatus)
406406 let lpEmiss = valueOrErrorMessage(assetInfo(lpId), "Wrong LP id").quantity
407407 if ((toBase58String(lpId) != pmtAssetId))
408408 then throw("Wrong pmt asset")
409409 else {
410410 let amBalance = getAccBalance(amId)
411411 let amBalanceX18 = t1(amBalance, amDcm)
412412 let prBalance = getAccBalance(prId)
413413 let prBalanceX18 = t1(prBalance, prDcm)
414414 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
415415 let curPrice = f1(curPriceX18, scale8)
416416 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
417417 let lpEmissX18 = t1(lpEmiss, scale8)
418418 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
419419 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
420420 let outAmAmt = fromX18Round(outAmAmtX18, amDcm, FLOOR)
421421 let outPrAmt = fromX18Round(outPrAmtX18, prDcm, FLOOR)
422422 let state = if ((txId58 == ""))
423423 then nil
424424 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
425425 then unit
426426 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
427427 then unit
428428 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)]
429429 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
430430 }
431431 }
432432
433433
434434 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
435435 let lpId = cfgLpAssetId
436436 let amIdStr = toBase58String(value(cfgAmountAssetId))
437437 let prIdStr = toBase58String(value(cfgPriceAssetId))
438438 let inAmIdStr = cfgInAmountAssedId
439439 let inPrIdStr = cfgInPriceAssetId
440440 let amtDcm = cfgAmountAssetDecimals
441441 let priceDcm = cfgPriceAssetDecimals
442442 let sts = toString(cfgPoolStatus)
443443 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
444444 let amBalance = if (isEval)
445445 then getAccBalance(amIdStr)
446446 else if (if (isOneAsset)
447447 then (pmtId == amIdStr)
448448 else false)
449449 then (getAccBalance(amIdStr) - pmtAmt)
450450 else if (isOneAsset)
451451 then getAccBalance(amIdStr)
452452 else (getAccBalance(amIdStr) - inAmAmt)
453453 let prBalance = if (isEval)
454454 then getAccBalance(prIdStr)
455455 else if (if (isOneAsset)
456456 then (pmtId == prIdStr)
457457 else false)
458458 then (getAccBalance(prIdStr) - pmtAmt)
459459 else if (isOneAsset)
460460 then getAccBalance(prIdStr)
461461 else (getAccBalance(prIdStr) - inPrAmt)
462462 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
463463 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
464464 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
465465 let amBalanceX18 = t1(amBalance, amtDcm)
466466 let prBalanceX18 = t1(prBalance, priceDcm)
467467 let D0 = getD([amBalanceX18, prBalanceX18])
468468 let r = if ((lpEm == 0))
469469 then {
470470 let D1 = getD([(amBalanceX18 + inAmAssetAmtX18), (prBalanceX18 + inPrAssetAmtX18)])
471471 let checkD = if ((D1 > D0))
472472 then true
473473 else throw("D1 should be greater than D0")
474474 if ((checkD == checkD))
475475 then {
476476 let curPriceX18 = zeroBigInt
477477 let slippageX18 = zeroBigInt
478478 let lpAmtX18 = D1
479479 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
480480 }
481481 else throw("Strict value is not equal to itself.")
482482 }
483483 else {
484484 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
485485 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
486486 let slippageX18 = t1(slippage, scale8)
487487 if (if (if (validateSlippage)
488488 then (curPriceX18 != zeroBigInt)
489489 else false)
490490 then (slippageRealX18 > slippageX18)
491491 else false)
492492 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
493493 else {
494494 let lpEmissionX18 = t1(lpEm, scale8)
495495 let prViaAmX18 = fraction(inAmAssetAmtX18, cpbir(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
496496 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, cpbir(prBalanceX18, amBalanceX18, FLOOR), CEILING)
497497 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
498498 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
499499 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
500500 let expAmtAssetAmtX18 = expectedAmts._1
501501 let expPriceAssetAmtX18 = expectedAmts._2
502502 let D1 = getD([(amBalanceX18 + expAmtAssetAmtX18), (prBalanceX18 + expPriceAssetAmtX18)])
503503 let checkD = if ((D1 > D0))
504504 then true
505505 else throw("D1 should be greater than D0")
506506 if ((checkD == checkD))
507507 then {
508508 let lpAmtX18 = fraction(lpEmissionX18, (D1 - D0), D0)
509509 $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
510510 }
511511 else throw("Strict value is not equal to itself.")
512512 }
513513 }
514514 let calcLpAmt = r._1
515515 let calcAmAssetPmt = r._2
516516 let calcPrAssetPmt = r._3
517517 let curPrice = f1(r._4, scale8)
518518 let slippageCalc = f1(r._5, scale8)
519519 if ((0 >= calcLpAmt))
520520 then throw("LP <= 0")
521521 else {
522522 let emitLpAmt = if (!(emitLp))
523523 then 0
524524 else calcLpAmt
525525 let amDiff = (inAmAmt - calcAmAssetPmt)
526526 let prDiff = (inPrAmt - calcPrAssetPmt)
527527 let $t02068121026 = if (if (isOneAsset)
528528 then (pmtId == amIdStr)
529529 else false)
530530 then $Tuple2(pmtAmt, 0)
531531 else if (if (isOneAsset)
532532 then (pmtId == prIdStr)
533533 else false)
534534 then $Tuple2(0, pmtAmt)
535535 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
536536 let writeAmAmt = $t02068121026._1
537537 let writePrAmt = $t02068121026._2
538538 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))]
539539 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
540540 }
541541 }
542542
543543
544544 func getYD (xp,i,D) = {
545545 let n = big2
546546 let x = xp[if ((i == 0))
547547 then 1
548548 else 0]
549549 let aPrecision = parseBigIntValue(Amult)
550550 let a = (parseBigIntValue(A) * aPrecision)
551551 let s = x
552552 let ann = (a * n)
553553 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
554554 let b = ((s + ((D * aPrecision) / ann)) - D)
555555 func calc (acc,cur) = {
556556 let $t02222122241 = acc
557557 let y = $t02222122241._1
558558 let found = $t02222122241._2
559559 if ((found != unit))
560560 then acc
561561 else {
562562 let yNext = (((y * y) + c) / ((big2 * y) + b))
563563 let yDiff = absBigInt((yNext - value(y)))
564564 if ((big1 >= yDiff))
565565 then $Tuple2(yNext, cur)
566566 else $Tuple2(yNext, unit)
567567 }
568568 }
569569
570570 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
571571 let $t02254822595 = {
572572 let $l = arr
573573 let $s = size($l)
574574 let $acc0 = $Tuple2(D, unit)
575575 func $f0_1 ($a,$i) = if (($i >= $s))
576576 then $a
577577 else calc($a, $l[$i])
578578
579579 func $f0_2 ($a,$i) = if (($i >= $s))
580580 then $a
581581 else throw("List size exceeds 15")
582582
583583 $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)
584584 }
585585 let y = $t02254822595._1
586586 let found = $t02254822595._2
587587 if ((found != unit))
588588 then y
589589 else throw(("Y calculation error, Y = " + toString(y)))
590590 }
591591
592592
593593 func calcDLp (amountBalance,priceBalance,lpEmission) = {
594594 let updatedDLp = fraction(getD([t1BigInt(amountBalance, toBigInt(cfgAmountAssetDecimals)), t1BigInt(priceBalance, toBigInt(cfgPriceAssetDecimals))]), scale18, lpEmission)
595595 if ((lpEmission == big0))
596596 then big0
597597 else updatedDLp
598598 }
599599
600600
601601 func calcCurrentDLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
602602 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
603603 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
604604 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
605605 let currentDLp = calcDLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
606606 currentDLp
607607 }
608608
609609
610610 func refreshDLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
611611 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
612612 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
613613 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
614614 let updatedDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
615615 let actions = [IntegerEntry(keyDLpRefreshedHeight, height), StringEntry(keyDLp, toString(updatedDLp))]
616616 $Tuple2(actions, updatedDLp)
617617 }
618618
619619
620620 func validateUpdatedDLp (oldDLp,updatedDLp) = if ((updatedDLp >= oldDLp))
621621 then true
622622 else throwErr("updated DLp lower than current DLp")
623623
624624
625625 func validateMatcherOrderAllowed (order) = {
626626 let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
627627 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
628628 let amountAssetAmount = order.amount
629629 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
630630 let $t02479325005 = if ((order.orderType == Buy))
631631 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
632632 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
633633 let amountAssetBalanceDelta = $t02479325005._1
634634 let priceAssetBalanceDelta = $t02479325005._2
635635 if (if (if (igs())
636636 then true
637637 else (cfgPoolStatus == PoolMatcherDis))
638638 then true
639639 else (cfgPoolStatus == PoolShutdown))
640640 then throw("Admin blocked")
641641 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
642642 then true
643643 else (order.assetPair.priceAsset != cfgPriceAssetId))
644644 then throw("Wr assets")
645645 else {
646646 let dLp = parseBigIntValue(valueOrElse(getString(this, keyDLp), "0"))
647647 let $t02534725447 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
648648 let unusedActions = $t02534725447._1
649649 let dLpNew = $t02534725447._2
650650 let isOrderValid = (dLpNew >= dLp)
651651 let info = makeString(["dLp=", toString(dLp), " dLpNew=", toString(dLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
652652 $Tuple2(isOrderValid, info)
653653 }
654654 }
655655
656656
657657 func cg (i) = if ((size(i.payments) != 1))
658658 then throw("1 pmnt exp")
659659 else {
660660 let pmt = value(i.payments[0])
661661 let pmtAssetId = value(pmt.assetId)
662662 let pmtAmt = pmt.amount
663663 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
664664 let outAmAmt = r._1
665665 let outPrAmt = r._2
666666 let sts = parseIntValue(r._9)
667667 let state = r._10
668668 if (if (igs())
669669 then true
670670 else (sts == PoolShutdown))
671671 then throw(("Admin blocked: " + toString(sts)))
672672 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
673673 }
674674
675675
676676 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
677677 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
678678 let sts = parseIntValue(r._8)
679679 if (if (if (igs())
680680 then true
681681 else (sts == PoolPutDis))
682682 then true
683683 else (sts == PoolShutdown))
684684 then throw(("Blocked:" + toString(sts)))
685685 else r
686686 }
687687
688688
689689 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId,withTakeFee) = {
690690 let amId = toBase58String(value(cfgAmountAssetId))
691691 let prId = toBase58String(value(cfgPriceAssetId))
692692 let lpId = cfgLpAssetId
693693 let amtDcm = cfgAmountAssetDecimals
694694 let priceDcm = cfgPriceAssetDecimals
695695 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(lpId), "invalid lp asset").quantity)
696696 let chechEmission = if ((lpAssetEmission > big0))
697697 then true
698698 else throw("initial deposit requires all coins")
699699 if ((chechEmission == chechEmission))
700700 then {
701701 let amBalance = getAccBalance(amId)
702702 let prBalance = getAccBalance(prId)
703703 let $t02810328565 = if ((txId == ""))
704704 then $Tuple2(amBalance, prBalance)
705705 else if ((pmtAssetId == amId))
706706 then if ((pmtAmtRaw > amBalance))
707707 then throw("invalid payment amount")
708708 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
709709 else if ((pmtAssetId == prId))
710710 then if ((pmtAmtRaw > prBalance))
711711 then throw("invalid payment amount")
712712 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
713713 else throw("wrong pmtAssetId")
714714 let amBalanceOld = $t02810328565._1
715715 let prBalanceOld = $t02810328565._2
716716 let $t02857128747 = if ((pmtAssetId == amId))
717717 then $Tuple2(pmtAmtRaw, 0)
718718 else if ((pmtAssetId == prId))
719719 then $Tuple2(0, pmtAmtRaw)
720720 else throw("invalid payment")
721721 let amAmountRaw = $t02857128747._1
722722 let prAmountRaw = $t02857128747._2
723723 let $t02875129005 = if (withTakeFee)
724724 then $Tuple3(takeFee(amAmountRaw, inFee)._1, takeFee(prAmountRaw, inFee)._1, takeFee(pmtAmtRaw, inFee)._2)
725725 else $Tuple3(amAmountRaw, prAmountRaw, 0)
726726 let amAmount = $t02875129005._1
727727 let prAmount = $t02875129005._2
728728 let feeAmount = $t02875129005._3
729729 let amBalanceNew = (amBalanceOld + amAmount)
730730 let prBalanceNew = (prBalanceOld + prAmount)
731731 let D0 = getD([t1(amBalanceOld, cfgAmountAssetDecimals), t1(prBalanceOld, cfgPriceAssetDecimals)])
732732 let D1 = getD([t1(amBalanceNew, cfgAmountAssetDecimals), t1(prBalanceNew, cfgPriceAssetDecimals)])
733733 let checkD = if ((D1 > D0))
734734 then true
735735 else throw()
736736 if ((checkD == checkD))
737737 then {
738738 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0, FLOOR)
739739 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
740740 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))]
741741 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
742742 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
743743 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
744744 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
745745 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
746746 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
747747 }
748748 else throw("Strict value is not equal to itself.")
749749 }
750750 else throw("Strict value is not equal to itself.")
751751 }
752752
753753
754754 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
755755 let lpId = toBase58String(value(cfgLpAssetId))
756756 let amId = toBase58String(value(cfgAmountAssetId))
757757 let prId = toBase58String(value(cfgPriceAssetId))
758758 let amDecimals = cfgAmountAssetDecimals
759759 let prDecimals = cfgPriceAssetDecimals
760760 let poolStatus = cfgPoolStatus
761761 let userAddress = if ((caller == restContract))
762762 then originCaller
763763 else caller
764764 let pmt = value(payments[0])
765765 let pmtAssetId = value(pmt.assetId)
766766 let pmtAmt = pmt.amount
767767 let currentDLp = calcCurrentDLp(big0, big0, big0)
768768 if ((currentDLp == currentDLp))
769769 then {
770770 let txId58 = toBase58String(transactionId)
771771 if ((lpId != toBase58String(pmtAssetId)))
772772 then throw("Wrong LP")
773773 else {
774774 let amBalance = getAccBalance(amId)
775775 let prBalance = getAccBalance(prId)
776776 let $t03111731228 = {
777777 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
778778 if ($isInstanceOf(@, "(Int, Int)"))
779779 then @
780780 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
781781 }
782782 if (($t03111731228 == $t03111731228))
783783 then {
784784 let feeAmount = $t03111731228._2
785785 let totalGet = $t03111731228._1
786786 let totalAmount = if (if ((minOutAmount > 0))
787787 then (minOutAmount > totalGet)
788788 else false)
789789 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
790790 else totalGet
791791 let $t03141831725 = if ((outAssetId == amId))
792792 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
793793 else if ((outAssetId == prId))
794794 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
795795 else throw("invalid out asset id")
796796 let outAm = $t03141831725._1
797797 let outPr = $t03141831725._2
798798 let amBalanceNew = $t03141831725._3
799799 let prBalanceNew = $t03141831725._4
800800 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
801801 let curPr = f1(curPrX18, scale8)
802802 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
803803 then unit
804804 else fromBase58String(outAssetId)
805805 let sendFeeToMatcher = if ((feeAmount > 0))
806806 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
807807 else nil
808808 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)
809809 if ((state == state))
810810 then {
811811 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
812812 if ((burn == burn))
813813 then {
814814 let $t03251032860 = {
815815 let feeAmountForCalc = if ((this == feeCollectorAddress))
816816 then 0
817817 else feeAmount
818818 let outInAmountAsset = if ((parseAssetId(outAssetId) == cfgAmountAssetId))
819819 then true
820820 else false
821821 if (outInAmountAsset)
822822 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
823823 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
824824 }
825825 let amountAssetBalanceDelta = $t03251032860._1
826826 let priceAssetBalanceDelta = $t03251032860._2
827827 let $t03286332971 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
828828 let refreshDLpActions = $t03286332971._1
829829 let updatedDLp = $t03286332971._2
830830 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
831831 if ((isUpdatedDLpValid == isUpdatedDLpValid))
832832 then $Tuple2((state ++ refreshDLpActions), totalAmount)
833833 else throw("Strict value is not equal to itself.")
834834 }
835835 else throw("Strict value is not equal to itself.")
836836 }
837837 else throw("Strict value is not equal to itself.")
838838 }
839839 else throw("Strict value is not equal to itself.")
840840 }
841841 }
842842 else throw("Strict value is not equal to itself.")
843843 }
844844
845845
846846 func m () = match getString(mpk()) {
847847 case s: String =>
848848 fromBase58String(s)
849849 case _: Unit =>
850850 unit
851851 case _ =>
852852 throw("Match error")
853853 }
854854
855855
856856 func pm () = match getString(pmpk()) {
857857 case s: String =>
858858 fromBase58String(s)
859859 case _: Unit =>
860860 unit
861861 case _ =>
862862 throw("Match error")
863863 }
864864
865865
866866 let pd = throw("Permission denied")
867867
868868 func isManager (i) = match m() {
869869 case pk: ByteVector =>
870870 (i.callerPublicKey == pk)
871871 case _: Unit =>
872872 (i.caller == this)
873873 case _ =>
874874 throw("Match error")
875875 }
876876
877877
878878 func mm (i) = match m() {
879879 case pk: ByteVector =>
880880 if ((i.callerPublicKey == pk))
881881 then true
882882 else pd
883883 case _: Unit =>
884884 if ((i.caller == this))
885885 then true
886886 else pd
887887 case _ =>
888888 throw("Match error")
889889 }
890890
891891
892892 func getY (isReverse,D,poolAmountInBalance) = {
893893 let poolConfig = gpc()
894894 let amId = poolConfig[idxAmAsId]
895895 let prId = poolConfig[idxPrAsId]
896896 let n = big2
897897 let aPrecision = parseBigIntValue(Amult)
898898 let a = (parseBigIntValue(A) * aPrecision)
899899 let xp = if ((isReverse == false))
900900 then [(toBigInt(getAccBalance(amId)) + poolAmountInBalance), toBigInt(getAccBalance(prId))]
901901 else [(toBigInt(getAccBalance(prId)) + poolAmountInBalance), toBigInt(getAccBalance(amId))]
902902 let x = xp[0]
903903 let s = x
904904 let ann = (a * n)
905905 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
906906 let b = ((s + ((D * aPrecision) / ann)) - D)
907907 func calc (acc,cur) = {
908908 let $t03441834438 = acc
909909 let y = $t03441834438._1
910910 let found = $t03441834438._2
911911 if ((found != unit))
912912 then acc
913913 else {
914914 let yNext = (((y * y) + c) / ((big2 * y) + b))
915915 let yDiff = absBigInt((yNext - value(y)))
916916 if ((big1 >= yDiff))
917917 then $Tuple2(yNext, cur)
918918 else $Tuple2(yNext, unit)
919919 }
920920 }
921921
922922 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
923923 let $t03476934816 = {
924924 let $l = arr
925925 let $s = size($l)
926926 let $acc0 = $Tuple2(D, unit)
927927 func $f0_1 ($a,$i) = if (($i >= $s))
928928 then $a
929929 else calc($a, $l[$i])
930930
931931 func $f0_2 ($a,$i) = if (($i >= $s))
932932 then $a
933933 else throw("List size exceeds 15")
934934
935935 $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)
936936 }
937937 let y = $t03476934816._1
938938 let found = $t03476934816._2
939939 if ((found != unit))
940940 then y
941941 else throw(("Y calculation error, Y = " + toString(y)))
942942 }
943943
944944
945945 func skipOrderValidation () = valueOrElse(getBoolean(fca, keySkipOrderValidation(toString(this))), false)
946946
947947
948948 @Callable(i)
949949 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
950950 let $t03516835592 = if ((isReverse == false))
951951 then {
952952 let assetOut = strf(this, pa())
953953 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, aa()))) + toBigInt(cleanAmountIn))
954954 $Tuple2(assetOut, poolAmountInBalance)
955955 }
956956 else {
957957 let assetOut = strf(this, aa())
958958 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, pa()))) + toBigInt(cleanAmountIn))
959959 $Tuple2(assetOut, poolAmountInBalance)
960960 }
961961 let assetOut = $t03516835592._1
962962 let poolAmountInBalance = $t03516835592._2
963963 let poolConfig = gpc()
964964 let amId = poolConfig[idxAmAsId]
965965 let prId = poolConfig[idxPrAsId]
966966 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
967967 let D = getD(xp)
968968 let y = getY(isReverse, D, toBigInt(cleanAmountIn))
969969 let dy = ((toBigInt(getAccBalance(assetOut)) - y) - toBigInt(1))
970970 let totalGetRaw = max([0, toInt(dy)])
971971 let newXp = if ((isReverse == false))
972972 then [((toBigInt(getAccBalance(amId)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount)), (toBigInt(getAccBalance(prId)) - dy)]
973973 else [(toBigInt(getAccBalance(amId)) - dy), ((toBigInt(getAccBalance(prId)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount))]
974974 let newD = getD(newXp)
975975 let checkD = if ((newD >= D))
976976 then true
977977 else throw(makeString(["new D is fewer error", toString(D), toString(newD)], "__"))
978978 if ((checkD == checkD))
979979 then $Tuple2(nil, totalGetRaw)
980980 else throw("Strict value is not equal to itself.")
981981 }
982982
983983
984984
985985 @Callable(i)
986986 func calculateAmountOutForSwapAndSendTokens (cleanAmountIn,isReverse,amountOutMin,addressTo,feePoolAmount) = {
987987 let swapContact = {
988988 let @ = invoke(fca, "getSwapContractREADONLY", nil, nil)
989989 if ($isInstanceOf(@, "String"))
990990 then @
991991 else throw(($getType(@) + " couldn't be cast to String"))
992992 }
993993 let checks = [if ((value(i.payments[0]).amount >= cleanAmountIn))
994994 then true
995995 else throwErr("Wrong amount"), if ((i.caller == addressFromStringValue(swapContact)))
996996 then true
997997 else throwErr("Permission denied")]
998998 if ((checks == checks))
999999 then {
10001000 let pmt = value(i.payments[0])
10011001 let assetIn = assetIdToString(pmt.assetId)
10021002 let $t03702837422 = if ((isReverse == false))
10031003 then {
10041004 let assetOut = strf(this, pa())
10051005 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
10061006 $Tuple2(assetOut, poolAmountInBalance)
10071007 }
10081008 else {
10091009 let assetOut = strf(this, aa())
10101010 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
10111011 $Tuple2(assetOut, poolAmountInBalance)
10121012 }
10131013 let assetOut = $t03702837422._1
10141014 let poolAmountInBalance = $t03702837422._2
10151015 let poolConfig = gpc()
10161016 let amId = poolConfig[idxAmAsId]
10171017 let prId = poolConfig[idxPrAsId]
10181018 let xp = if ((isReverse == false))
10191019 then [(toBigInt(getAccBalance(amId)) - toBigInt(value(i.payments[0]).amount)), toBigInt(getAccBalance(prId))]
10201020 else [toBigInt(getAccBalance(amId)), (toBigInt(getAccBalance(prId)) - toBigInt(value(i.payments[0]).amount))]
10211021 let D = getD(xp)
10221022 let y = getY(isReverse, D, toBigInt(0))
10231023 let dy = ((toBigInt(getAccBalance(assetOut)) - y) - toBigInt(1))
10241024 let totalGetRaw = max([0, toInt(dy)])
10251025 let checkMin = if ((totalGetRaw >= amountOutMin))
10261026 then true
10271027 else throw("Exchange result is fewer coins than expected")
10281028 if ((checkMin == checkMin))
10291029 then {
10301030 let newXp = if ((isReverse == false))
10311031 then [(toBigInt(getAccBalance(amId)) + toBigInt(feePoolAmount)), (toBigInt(getAccBalance(prId)) - dy)]
10321032 else [(toBigInt(getAccBalance(amId)) - dy), (toBigInt(getAccBalance(prId)) + toBigInt(feePoolAmount))]
10331033 let newD = getD(newXp)
10341034 let checkD = if ((newD >= D))
10351035 then true
10361036 else throw("new D is fewer error")
10371037 if ((checkD == checkD))
10381038 then $Tuple2([ScriptTransfer(addressFromStringValue(addressTo), totalGetRaw, parseAssetId(assetOut))], totalGetRaw)
10391039 else throw("Strict value is not equal to itself.")
10401040 }
10411041 else throw("Strict value is not equal to itself.")
10421042 }
10431043 else throw("Strict value is not equal to itself.")
10441044 }
10451045
10461046
10471047
10481048 @Callable(i)
10491049 func constructor (fc) = {
10501050 let c = mm(i)
10511051 if ((c == c))
10521052 then [StringEntry(fc(), fc)]
10531053 else throw("Strict value is not equal to itself.")
10541054 }
10551055
10561056
10571057
10581058 @Callable(i)
10591059 func setManager (pendingManagerPublicKey) = {
10601060 let c = mm(i)
10611061 if ((c == c))
10621062 then {
10631063 let cm = fromBase58String(pendingManagerPublicKey)
10641064 if ((cm == cm))
10651065 then [StringEntry(pmpk(), pendingManagerPublicKey)]
10661066 else throw("Strict value is not equal to itself.")
10671067 }
10681068 else throw("Strict value is not equal to itself.")
10691069 }
10701070
10711071
10721072
10731073 @Callable(i)
10741074 func confirmManager () = {
10751075 let p = pm()
10761076 let hpm = if (isDefined(p))
10771077 then true
10781078 else throw("No pending manager")
10791079 if ((hpm == hpm))
10801080 then {
10811081 let cpm = if ((i.callerPublicKey == value(p)))
10821082 then true
10831083 else throw("You are not pending manager")
10841084 if ((cpm == cpm))
10851085 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
10861086 else throw("Strict value is not equal to itself.")
10871087 }
10881088 else throw("Strict value is not equal to itself.")
10891089 }
10901090
10911091
10921092
10931093 @Callable(i)
10941094 func put (slip,autoStake) = {
10951095 let factCfg = gfc()
10961096 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
10971097 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
10981098 if ((0 > slip))
10991099 then throw("Wrong slippage")
11001100 else if ((size(i.payments) != 2))
11011101 then throw("2 pmnts expd")
11021102 else {
11031103 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
11041104 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
11051105 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amAssetPmt)
11061106 if ((amountAssetBalance == amountAssetBalance))
11071107 then {
11081108 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - prAssetPmt)
11091109 if ((priceAssetBalance == priceAssetBalance))
11101110 then {
11111111 let lpAssetEmission = toBigInt(value(assetInfo(cfgLpAssetId)).quantity)
11121112 if ((lpAssetEmission == lpAssetEmission))
11131113 then {
11141114 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
11151115 if ((currentDLp == currentDLp))
11161116 then {
11171117 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, "")
11181118 let emitLpAmt = e._2
11191119 let lpAssetId = e._7
11201120 let state = e._9
11211121 let amDiff = e._10
11221122 let prDiff = e._11
11231123 let amId = e._12
11241124 let prId = e._13
11251125 let r = invoke(fca, "emit", [emitLpAmt], nil)
11261126 if ((r == r))
11271127 then {
11281128 let el = match r {
11291129 case legacy: Address =>
11301130 invoke(legacy, "emit", [emitLpAmt], nil)
11311131 case _ =>
11321132 unit
11331133 }
11341134 if ((el == el))
11351135 then {
11361136 let sa = if ((amDiff > 0))
11371137 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
11381138 else nil
11391139 if ((sa == sa))
11401140 then {
11411141 let sp = if ((prDiff > 0))
11421142 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
11431143 else nil
11441144 if ((sp == sp))
11451145 then {
11461146 let lpTrnsfr = if (autoStake)
11471147 then {
11481148 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
11491149 if ((ss == ss))
11501150 then nil
11511151 else throw("Strict value is not equal to itself.")
11521152 }
11531153 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
11541154 let $t04204142183 = refreshDLpInternal(0, 0, 0)
11551155 let refreshDLpActions = $t04204142183._1
11561156 let updatedDLp = $t04204142183._2
11571157 let check = if ((updatedDLp >= currentDLp))
11581158 then true
11591159 else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp), toString(amDiff), toString(prDiff)], " "))
11601160 if ((check == check))
11611161 then {
11621162 let lpAssetEmissionAfter = value(assetInfo(cfgLpAssetId)).quantity
11631163 if ((lpAssetEmissionAfter == lpAssetEmissionAfter))
11641164 then ((state ++ lpTrnsfr) ++ refreshDLpActions)
11651165 else throw("Strict value is not equal to itself.")
11661166 }
11671167 else throw("Strict value is not equal to itself.")
11681168 }
11691169 else throw("Strict value is not equal to itself.")
11701170 }
11711171 else throw("Strict value is not equal to itself.")
11721172 }
11731173 else throw("Strict value is not equal to itself.")
11741174 }
11751175 else throw("Strict value is not equal to itself.")
11761176 }
11771177 else throw("Strict value is not equal to itself.")
11781178 }
11791179 else throw("Strict value is not equal to itself.")
11801180 }
11811181 else throw("Strict value is not equal to itself.")
11821182 }
11831183 else throw("Strict value is not equal to itself.")
11841184 }
11851185 }
11861186
11871187
11881188
11891189 @Callable(i)
11901190 func putOneTknV2 (minOutAmount,autoStake) = {
11911191 let isPoolOneTokenOperationsDisabled = {
11921192 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
11931193 if ($isInstanceOf(@, "Boolean"))
11941194 then @
11951195 else throw(($getType(@) + " couldn't be cast to Boolean"))
11961196 }
11971197 let isPutDisabled = if (if (if (igs())
11981198 then true
11991199 else (cfgPoolStatus == PoolPutDis))
12001200 then true
12011201 else (cfgPoolStatus == PoolShutdown))
12021202 then true
12031203 else isPoolOneTokenOperationsDisabled
12041204 let checks = [if (if (!(isPutDisabled))
12051205 then true
12061206 else isManager(i))
12071207 then true
12081208 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
12091209 then true
12101210 else throwErr("exactly 1 payment are expected")]
12111211 if ((checks == checks))
12121212 then {
12131213 let amId = toBase58String(value(cfgAmountAssetId))
12141214 let prId = toBase58String(value(cfgPriceAssetId))
12151215 let lpId = cfgLpAssetId
12161216 let amDecimals = cfgAmountAssetDecimals
12171217 let prDecimals = cfgPriceAssetDecimals
12181218 let userAddress = if ((i.caller == this))
12191219 then i.originCaller
12201220 else i.caller
12211221 let pmt = value(i.payments[0])
12221222 let pmtAssetId = toBase58String(value(pmt.assetId))
12231223 let pmtAmt = pmt.amount
12241224 let currentDLp = if ((pmt.assetId == cfgAmountAssetId))
12251225 then calcCurrentDLp(toBigInt(pmtAmt), toBigInt(0), toBigInt(0))
12261226 else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
12271227 if ((currentDLp == currentDLp))
12281228 then {
12291229 let $t04382443982 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
12301230 if (($t04382443982 == $t04382443982))
12311231 then {
12321232 let feeAmount = $t04382443982._3
12331233 let state = $t04382443982._2
12341234 let estimLP = $t04382443982._1
12351235 let emitLpAmt = if (if ((minOutAmount > 0))
12361236 then (minOutAmount > estimLP)
12371237 else false)
12381238 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
12391239 else estimLP
12401240 let e = invoke(fca, "emit", [emitLpAmt], nil)
12411241 if ((e == e))
12421242 then {
12431243 let el = match e {
12441244 case legacy: Address =>
12451245 invoke(legacy, "emit", [emitLpAmt], nil)
12461246 case _ =>
12471247 unit
12481248 }
12491249 if ((el == el))
12501250 then {
12511251 let lpTrnsfr = if (autoStake)
12521252 then {
1253- let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
1253+ let ss = invoke(stakingContract, "stakeFor", [toString(i.caller)], [AttachedPayment(lpId, emitLpAmt)])
12541254 if ((ss == ss))
12551255 then nil
12561256 else throw("Strict value is not equal to itself.")
12571257 }
12581258 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
12591259 let sendFeeToMatcher = if ((feeAmount > 0))
12601260 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
12611261 else nil
1262- let $t04479745146 = if ((this == feeCollectorAddress))
1262+ let $t04486745216 = if ((this == feeCollectorAddress))
12631263 then $Tuple2(0, 0)
12641264 else {
12651265 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
12661266 then true
12671267 else false
12681268 if (paymentInAmountAsset)
12691269 then $Tuple2(-(feeAmount), 0)
12701270 else $Tuple2(0, -(feeAmount))
12711271 }
1272- let amountAssetBalanceDelta = $t04479745146._1
1273- let priceAssetBalanceDelta = $t04479745146._2
1274- let $t04514945257 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1275- let refreshDLpActions = $t04514945257._1
1276- let updatedDLp = $t04514945257._2
1272+ let amountAssetBalanceDelta = $t04486745216._1
1273+ let priceAssetBalanceDelta = $t04486745216._2
1274+ let $t04521945327 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1275+ let refreshDLpActions = $t04521945327._1
1276+ let updatedDLp = $t04521945327._2
12771277 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
12781278 if ((isUpdatedDLpValid == isUpdatedDLpValid))
12791279 then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
12801280 else throw("Strict value is not equal to itself.")
12811281 }
12821282 else throw("Strict value is not equal to itself.")
12831283 }
12841284 else throw("Strict value is not equal to itself.")
12851285 }
12861286 else throw("Strict value is not equal to itself.")
12871287 }
12881288 else throw("Strict value is not equal to itself.")
12891289 }
12901290 else throw("Strict value is not equal to itself.")
12911291 }
12921292
12931293
12941294
12951295 @Callable(i)
12961296 func putForFree (maxSlpg) = if ((0 > maxSlpg))
12971297 then throw("Wrong slpg")
12981298 else if ((size(i.payments) != 2))
12991299 then throw("2 pmnts expd")
13001300 else {
13011301 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, "")
13021302 let state = estPut._9
13031303 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
13041304 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
13051305 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
13061306 if ((currentDLp == currentDLp))
13071307 then {
1308- let $t04628746352 = refreshDLpInternal(0, 0, 0)
1309- let refreshDLpActions = $t04628746352._1
1310- let updatedDLp = $t04628746352._2
1308+ let $t04635746422 = refreshDLpInternal(0, 0, 0)
1309+ let refreshDLpActions = $t04635746422._1
1310+ let updatedDLp = $t04635746422._2
13111311 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13121312 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13131313 then (state ++ refreshDLpActions)
13141314 else throw("Strict value is not equal to itself.")
13151315 }
13161316 else throw("Strict value is not equal to itself.")
13171317 }
13181318
13191319
13201320
13211321 @Callable(i)
13221322 func get () = {
13231323 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
13241324 if ((currentDLp == currentDLp))
13251325 then {
13261326 let r = cg(i)
13271327 let outAmtAmt = r._1
13281328 let outPrAmt = r._2
13291329 let pmtAmt = r._3
13301330 let pmtAssetId = r._4
13311331 let state = r._5
13321332 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13331333 if ((b == b))
13341334 then {
1335- let $t04752547607 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1336- let refreshDLpActions = $t04752547607._1
1337- let updatedDLp = $t04752547607._2
1335+ let $t04759547677 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1336+ let refreshDLpActions = $t04759547677._1
1337+ let updatedDLp = $t04759547677._2
13381338 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13391339 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13401340 then (state ++ refreshDLpActions)
13411341 else throw("Strict value is not equal to itself.")
13421342 }
13431343 else throw("Strict value is not equal to itself.")
13441344 }
13451345 else throw("Strict value is not equal to itself.")
13461346 }
13471347
13481348
13491349
13501350 @Callable(i)
13511351 func getOneTknV2 (outAssetId,minOutAmount) = {
13521352 let isPoolOneTokenOperationsDisabled = {
13531353 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
13541354 if ($isInstanceOf(@, "Boolean"))
13551355 then @
13561356 else throw(($getType(@) + " couldn't be cast to Boolean"))
13571357 }
13581358 let isGetDisabled = if (if (igs())
13591359 then true
13601360 else (cfgPoolStatus == PoolShutdown))
13611361 then true
13621362 else isPoolOneTokenOperationsDisabled
13631363 let checks = [if (if (!(isGetDisabled))
13641364 then true
13651365 else isManager(i))
13661366 then true
13671367 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
13681368 then true
13691369 else throwErr("exactly 1 payment are expected")]
13701370 if ((checks == checks))
13711371 then {
1372- let $t04822548380 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1373- let state = $t04822548380._1
1374- let totalAmount = $t04822548380._2
1372+ let $t04829548450 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1373+ let state = $t04829548450._1
1374+ let totalAmount = $t04829548450._2
13751375 $Tuple2(state, totalAmount)
13761376 }
13771377 else throw("Strict value is not equal to itself.")
13781378 }
13791379
13801380
13811381
13821382 @Callable(i)
13831383 func refreshDLp () = {
13841384 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
13851385 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
13861386 then unit
13871387 else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
13881388 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
13891389 then {
13901390 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1391- let $t04890448968 = refreshDLpInternal(0, 0, 0)
1392- let dLpUpdateActions = $t04890448968._1
1393- let updatedDLp = $t04890448968._2
1391+ let $t04897449038 = refreshDLpInternal(0, 0, 0)
1392+ let dLpUpdateActions = $t04897449038._1
1393+ let updatedDLp = $t04897449038._2
13941394 let actions = if ((dLp != updatedDLp))
13951395 then dLpUpdateActions
13961396 else throwErr("nothing to refresh")
13971397 $Tuple2(actions, toString(updatedDLp))
13981398 }
13991399 else throw("Strict value is not equal to itself.")
14001400 }
14011401
14021402
14031403
14041404 @Callable(i)
14051405 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
14061406 let amId = toBase58String(value(cfgAmountAssetId))
14071407 let prId = toBase58String(value(cfgPriceAssetId))
14081408 let lpId = toBase58String(value(cfgLpAssetId))
14091409 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
14101410 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
14111411 let D0 = getD(xp)
14121412 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
14131413 let index = if ((outAssetId == amId))
14141414 then 0
14151415 else if ((outAssetId == prId))
14161416 then 1
14171417 else throw("invalid out asset id")
14181418 let newY = getYD(xp, index, D1)
14191419 let dy = (xp[index] - newY)
14201420 let totalGetRaw = max([0, toInt((dy - big1))])
1421- let $t04997850033 = takeFee(totalGetRaw, outFee)
1422- let totalGet = $t04997850033._1
1423- let feeAmount = $t04997850033._2
1421+ let $t05004850103 = takeFee(totalGetRaw, outFee)
1422+ let totalGet = $t05004850103._1
1423+ let feeAmount = $t05004850103._2
14241424 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
14251425 }
14261426
14271427
14281428
14291429 @Callable(i)
14301430 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
14311431 let amId = toBase58String(value(cfgAmountAssetId))
14321432 let prId = toBase58String(value(cfgPriceAssetId))
14331433 let lpId = toBase58String(value(cfgLpAssetId))
14341434 let amBalance = getAccBalance(amId)
14351435 let prBalance = getAccBalance(prId)
1436- let $t05040850523 = {
1436+ let $t05047850593 = {
14371437 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
14381438 if ($isInstanceOf(@, "(Int, Int)"))
14391439 then @
14401440 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
14411441 }
1442- let totalGet = $t05040850523._1
1443- let feeAmount = $t05040850523._2
1442+ let totalGet = $t05047850593._1
1443+ let feeAmount = $t05047850593._2
14441444 let r = ego("", lpId, lpAssetAmount, this)
14451445 let outAmAmt = r._1
14461446 let outPrAmt = r._2
14471447 let sumOfGetAssets = (outAmAmt + outPrAmt)
14481448 let bonus = if ((sumOfGetAssets == 0))
14491449 then if ((totalGet == 0))
14501450 then 0
14511451 else throw("bonus calculation error")
14521452 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
14531453 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
14541454 }
14551455
14561456
14571457
14581458 @Callable(i)
14591459 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
14601460 let r = cg(i)
14611461 let outAmAmt = r._1
14621462 let outPrAmt = r._2
14631463 let pmtAmt = r._3
14641464 let pmtAssetId = r._4
14651465 let state = r._5
14661466 if ((noLessThenAmtAsset > outAmAmt))
14671467 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
14681468 else if ((noLessThenPriceAsset > outPrAmt))
14691469 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
14701470 else {
14711471 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
14721472 if ((currentDLp == currentDLp))
14731473 then {
14741474 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14751475 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14761476 then {
1477- let $t05168951770 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1478- let refreshDLpActions = $t05168951770._1
1479- let updatedDLp = $t05168951770._2
1477+ let $t05175951840 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1478+ let refreshDLpActions = $t05175951840._1
1479+ let updatedDLp = $t05175951840._2
14801480 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
14811481 if ((isUpdatedDLpValid == isUpdatedDLpValid))
14821482 then (state ++ refreshDLpActions)
14831483 else throw("Strict value is not equal to itself.")
14841484 }
14851485 else throw("Strict value is not equal to itself.")
14861486 }
14871487 else throw("Strict value is not equal to itself.")
14881488 }
14891489 }
14901490
14911491
14921492
14931493 @Callable(i)
14941494 func unstakeAndGet (amount) = {
14951495 let checkPayments = if ((size(i.payments) != 0))
14961496 then throw("No pmnts expd")
14971497 else true
14981498 if ((checkPayments == checkPayments))
14991499 then {
15001500 let factoryCfg = gfc()
15011501 let lpAssetId = cfgLpAssetId
15021502 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
15031503 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
15041504 if ((currentDLp == currentDLp))
15051505 then {
15061506 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
15071507 if ((unstakeInv == unstakeInv))
15081508 then {
15091509 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
15101510 let outAmAmt = r._1
15111511 let outPrAmt = r._2
15121512 let sts = parseIntValue(r._9)
15131513 let state = r._10
15141514 let v = if (if (igs())
15151515 then true
15161516 else (sts == PoolShutdown))
15171517 then throw(("Blocked: " + toString(sts)))
15181518 else true
15191519 if ((v == v))
15201520 then {
15211521 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15221522 if ((burnA == burnA))
15231523 then {
1524- let $t05279752878 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1525- let refreshDLpActions = $t05279752878._1
1526- let updatedDLp = $t05279752878._2
1524+ let $t05286752948 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1525+ let refreshDLpActions = $t05286752948._1
1526+ let updatedDLp = $t05286752948._2
15271527 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15281528 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15291529 then (state ++ refreshDLpActions)
15301530 else throw("Strict value is not equal to itself.")
15311531 }
15321532 else throw("Strict value is not equal to itself.")
15331533 }
15341534 else throw("Strict value is not equal to itself.")
15351535 }
15361536 else throw("Strict value is not equal to itself.")
15371537 }
15381538 else throw("Strict value is not equal to itself.")
15391539 }
15401540 else throw("Strict value is not equal to itself.")
15411541 }
15421542
15431543
15441544
15451545 @Callable(i)
15461546 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
15471547 let isGetDisabled = if (igs())
15481548 then true
15491549 else (cfgPoolStatus == PoolShutdown)
15501550 let checks = [if (!(isGetDisabled))
15511551 then true
15521552 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
15531553 then true
15541554 else throw("no payments are expected")]
15551555 if ((checks == checks))
15561556 then {
15571557 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
15581558 if ((currentDLp == currentDLp))
15591559 then {
15601560 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
15611561 if ((unstakeInv == unstakeInv))
15621562 then {
15631563 let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
15641564 let outAmAmt = res._1
15651565 let outPrAmt = res._2
15661566 let state = res._10
15671567 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
15681568 then true
15691569 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
15701570 then true
15711571 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
15721572 if ((checkAmounts == checkAmounts))
15731573 then {
15741574 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15751575 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15761576 then {
1577- let $t05412954210 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1578- let refreshDLpActions = $t05412954210._1
1579- let updatedDLp = $t05412954210._2
1577+ let $t05419954280 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1578+ let refreshDLpActions = $t05419954280._1
1579+ let updatedDLp = $t05419954280._2
15801580 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15811581 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15821582 then (state ++ refreshDLpActions)
15831583 else throw("Strict value is not equal to itself.")
15841584 }
15851585 else throw("Strict value is not equal to itself.")
15861586 }
15871587 else throw("Strict value is not equal to itself.")
15881588 }
15891589 else throw("Strict value is not equal to itself.")
15901590 }
15911591 else throw("Strict value is not equal to itself.")
15921592 }
15931593 else throw("Strict value is not equal to itself.")
15941594 }
15951595
15961596
15971597
15981598 @Callable(i)
15991599 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
16001600 let isPoolOneTokenOperationsDisabled = {
16011601 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
16021602 if ($isInstanceOf(@, "Boolean"))
16031603 then @
16041604 else throw(($getType(@) + " couldn't be cast to Boolean"))
16051605 }
16061606 let isGetDisabled = if (if (igs())
16071607 then true
16081608 else (cfgPoolStatus == PoolShutdown))
16091609 then true
16101610 else isPoolOneTokenOperationsDisabled
16111611 let checks = [if (if (!(isGetDisabled))
16121612 then true
16131613 else isManager(i))
16141614 then true
16151615 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
16161616 then true
16171617 else throwErr("no payments are expected")]
16181618 if ((checks == checks))
16191619 then {
16201620 let factoryCfg = gfc()
16211621 let lpAssetId = cfgLpAssetId
16221622 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
16231623 let userAddress = i.caller
16241624 let lpAssetRecipientAddress = this
16251625 let unstakeInv = invoke(staking, "unstakeINTERNAL", [lpAssetId, unstakeAmount, userAddress.bytes, lpAssetRecipientAddress.bytes], nil)
16261626 if ((unstakeInv == unstakeInv))
16271627 then {
1628- let $t05523255420 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1629- let state = $t05523255420._1
1630- let totalAmount = $t05523255420._2
1628+ let $t05530255490 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1629+ let state = $t05530255490._1
1630+ let totalAmount = $t05530255490._2
16311631 $Tuple2(state, totalAmount)
16321632 }
16331633 else throw("Strict value is not equal to itself.")
16341634 }
16351635 else throw("Strict value is not equal to itself.")
16361636 }
16371637
16381638
16391639
16401640 @Callable(i)
16411641 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1642- let $t05554855651 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1643- let lpAmount = $t05554855651._1
1644- let state = $t05554855651._2
1645- let feeAmount = $t05554855651._3
1646- let bonus = $t05554855651._4
1642+ let $t05561855721 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1643+ let lpAmount = $t05561855721._1
1644+ let state = $t05561855721._2
1645+ let feeAmount = $t05561855721._3
1646+ let bonus = $t05561855721._4
16471647 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16481648 }
16491649
16501650
16511651
16521652 @Callable(i)
16531653 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1654- let $t05579955903 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1655- let lpAmount = $t05579955903._1
1656- let state = $t05579955903._2
1657- let feeAmount = $t05579955903._3
1658- let bonus = $t05579955903._4
1654+ let $t05586955973 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1655+ let lpAmount = $t05586955973._1
1656+ let state = $t05586955973._2
1657+ let feeAmount = $t05586955973._3
1658+ let bonus = $t05586955973._4
16591659 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16601660 }
16611661
16621662
16631663
16641664 @Callable(i)
16651665 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
16661666 then throw("denied")
16671667 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
16681668
16691669
16701670
16711671 @Callable(i)
16721672 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
16731673 then pd
16741674 else [StringEntry(k, v)]
16751675
16761676
16771677
16781678 @Callable(i)
16791679 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
16801680 then pd
16811681 else [IntegerEntry(k, v)]
16821682
16831683
16841684
16851685 @Callable(i)
16861686 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
16871687
16881688
16891689
16901690 @Callable(i)
16911691 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
16921692
16931693
16941694
16951695 @Callable(i)
16961696 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
16971697 let pr = calcPrices(amAmt, prAmt, lpAmt)
16981698 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
16991699 }
17001700
17011701
17021702
17031703 @Callable(i)
17041704 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
17051705
17061706
17071707
17081708 @Callable(i)
17091709 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
17101710
17111711
17121712
17131713 @Callable(i)
17141714 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
17151715
17161716
17171717
17181718 @Callable(i)
17191719 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, ""))
17201720
17211721
17221722
17231723 @Callable(i)
17241724 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
17251725 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
17261726 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
17271727 }
17281728
17291729
17301730 @Verifier(tx)
17311731 func verify () = {
17321732 let targetPublicKey = match m() {
17331733 case pk: ByteVector =>
17341734 pk
17351735 case _: Unit =>
17361736 tx.senderPublicKey
17371737 case _ =>
17381738 throw("Match error")
17391739 }
17401740 match tx {
17411741 case order: Order =>
17421742 let matcherPub = mp()
1743- let $t05869558812 = if (skipOrderValidation())
1743+ let $t05876558882 = if (skipOrderValidation())
17441744 then $Tuple2(true, "")
17451745 else validateMatcherOrderAllowed(order)
1746- let orderValid = $t05869558812._1
1747- let orderValidInfo = $t05869558812._2
1746+ let orderValid = $t05876558882._1
1747+ let orderValidInfo = $t05876558882._2
17481748 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
17491749 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
17501750 if (if (if (orderValid)
17511751 then senderValid
17521752 else false)
17531753 then matcherValid
17541754 else false)
17551755 then true
17561756 else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
17571757 case s: SetScriptTransaction =>
17581758 if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
17591759 then true
17601760 else {
17611761 let newHash = blake2b256(value(s.script))
17621762 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
17631763 let currentHash = scriptHash(this)
17641764 if ((allowedHash == newHash))
17651765 then (currentHash != newHash)
17661766 else false
17671767 }
17681768 case _ =>
17691769 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
17701770 }
17711771 }
17721772

github/deemru/w8io/786bc32 
178.04 ms