2023.10.16 13:32 [3866905] smart account 3P8KMyAJCPWNcyedqrmymxaeWonvmkhGauz > SELF 0.00000000 Waves

{ "type": 13, "id": "DxBZzH4mWKw7otSJkPb1CkGPohreFeV3wCt3UUVCPn1T", "fee": 4200000, "feeAssetId": null, "timestamp": 1697452151734, "version": 2, "chainId": 87, "sender": "3P8KMyAJCPWNcyedqrmymxaeWonvmkhGauz", "senderPublicKey": "DxhbzFs9BZTiN6kcnyybxmqPTV8xReD6Z5gWQ5AgRX8w", "proofs": [ "svcWEFw3F5wESsdrprSY7fTdGUCk5XhWEQtqoT2i1Z9F7Cvq25CT43FR9MLUnjLUdqxAs763wxj48tjhwYgW1Wc" ], "script": "base64:BgLaLQgCEgUKAwEEARIHCgUBBAEIARIDCgEIEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIAEgQKAggBEgQKAggBEgQKAgEBEgMKAQESBQoDAQEBEgUKAwEIARIECgIBCBIECgIBCBIECgIICBIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgAiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igp6ZXJvQmlnSW50IgRiaWcwIgRiaWcxIgRiaWcyIgRiaWczIgRiaWc0IgpzbGlwcGFnZTREIgt3YXZlc1N0cmluZyIKYW1wSW5pdGlhbCIFQW11bHQiBURjb252IgNTRVAiBUVNUFRZIgpQb29sQWN0aXZlIgpQb29sUHV0RGlzIg5Qb29sTWF0Y2hlckRpcyIMUG9vbFNodXRkb3duIg5pZHhQb29sQWRkcmVzcyIJaWR4UG9vbFN0IglpZHhMUEFzSWQiCWlkeEFtQXNJZCIJaWR4UHJBc0lkIgtpZHhBbXRBc0RjbSINaWR4UHJpY2VBc0RjbSILaWR4SUFtdEFzSWQiDWlkeElQcmljZUFzSWQiD2lkeEZhY3RTdGFrQ250ciISaWR4RmFjdG9yeVJlc3RDbnRyIhBpZHhGYWN0U2xpcHBDbnRyIhFpZHhGYWN0R3d4UmV3Q250ciIKZmVlRGVmYXVsdCICdDEiB29yaWdWYWwiDW9yaWdTY2FsZU11bHQiCHQxQmlnSW50IgJmMSIDdmFsIg9yZXN1bHRTY2FsZU11bHQiDGZyb21YMThSb3VuZCIFcm91bmQiAnQyIgJmMiICdHMiA2FtdCIIcmVzU2NhbGUiCGN1clNjYWxlIgNhYnMiCWFic0JpZ0ludCICZmMiE2tleU1hbmFnZXJQdWJsaWNLZXkiFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MiAnBsIgJwaCIBaCIBdCIDcGF1IgJ1YSIEdHhJZCIDZ2F1IgJhYSICcGEiA2FtcCINa2V5QW1wSGlzdG9yeSIMaGVpZ2h0QmxvY2tzIhRrZXlDaGFuZ2VBbXBMYXN0Q2FsbCIGa2V5RmVlIgNmZWUiBmtleURMcCIVa2V5RExwUmVmcmVzaGVkSGVpZ2h0IhJrZXlETHBSZWZyZXNoRGVsYXkiFmRMcFJlZnJlc2hEZWxheURlZmF1bHQiD2RMcFJlZnJlc2hEZWxheSIEZmNmZyIEbXRwayICcGMiBmlBbXRBcyIFaVByQXMiA21iYSIFYkFTdHIiA2FwcyIca2V5QWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaCIWa2V5RmVlQ29sbGVjdG9yQWRkcmVzcyIWa2V5U2tpcE9yZGVyVmFsaWRhdGlvbiILcG9vbEFkZHJlc3MiD3Rocm93T3JkZXJFcnJvciIKb3JkZXJWYWxpZCIOb3JkZXJWYWxpZEluZm8iC3NlbmRlclZhbGlkIgxtYXRjaGVyVmFsaWQiF2FkZHJlc3NGcm9tU3RyaW5nT3JUaGlzIg1hZGRyZXNzU3RyaW5nIgckbWF0Y2gwIgFhIhxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzIg5mYWN0b3J5QWRkcmVzcyIDZmNhIgFzIgRzdHJmIgRhZGRyIgNrZXkiBGludGYiCHRocm93RXJyIgNtc2ciBmZtdEVyciIFaW5GZWUiAUAiBm91dEZlZSIVa2V5QWRkcmVzc1doaXRlbGlzdGVkIgdhZGRyZXNzIhRpc0FkZHJlc3NXaGl0ZWxpc3RlZCIBQSIDaWdzIgJtcCITZmVlQ29sbGVjdG9yQWRkcmVzcyIDZ3BjIgVhbXRBcyIHcHJpY2VBcyIIaVByaWNlQXMiDHBhcnNlQXNzZXRJZCIFaW5wdXQiD2Fzc2V0SWRUb1N0cmluZyIPcGFyc2VQb29sQ29uZmlnIgpwb29sQ29uZmlnIhBwb29sQ29uZmlnUGFyc2VkIgskdDA4ODM2OTAyMiIOY2ZnUG9vbEFkZHJlc3MiDWNmZ1Bvb2xTdGF0dXMiDGNmZ0xwQXNzZXRJZCIQY2ZnQW1vdW50QXNzZXRJZCIPY2ZnUHJpY2VBc3NldElkIhZjZmdBbW91bnRBc3NldERlY2ltYWxzIhVjZmdQcmljZUFzc2V0RGVjaW1hbHMiA2dmYyINZmFjdG9yeUNvbmZpZyIPc3Rha2luZ0NvbnRyYWN0Ig9zbGlwYWdlQ29udHJhY3QiC2d3eENvbnRyYWN0IgxyZXN0Q29udHJhY3QiEWRhdGFQdXRBY3Rpb25JbmZvIg1pbkFtdEFzc2V0QW10Ig9pblByaWNlQXNzZXRBbXQiCG91dExwQW10IgVwcmljZSIKc2xpcEJ5VXNlciIMc2xpcHBhZ2VSZWFsIgh0eEhlaWdodCILdHhUaW1lc3RhbXAiDHNsaXBhZ2VBbUFtdCIMc2xpcGFnZVByQW10IhFkYXRhR2V0QWN0aW9uSW5mbyIOb3V0QW10QXNzZXRBbXQiEG91dFByaWNlQXNzZXRBbXQiB2luTHBBbXQiDWdldEFjY0JhbGFuY2UiB2Fzc2V0SWQiBGNwYmkiCHByQW10WDE4IghhbUFtdFgxOCIFY3BiaXIiA3ZhZCICQTEiAkEyIghzbGlwcGFnZSIEZGlmZiIEcGFzcyICdmQiAkQxIgJEMCIEc2xwZyIEZmFpbCIDcGNwIgphbUFzc2V0RGNtIgpwckFzc2V0RGNtIgVhbUFtdCIFcHJBbXQiC2FtdEFzQW10WDE4IgpwckFzQW10WDE4IgpjYWxjUHJpY2VzIgVscEFtdCIIYW10QXNEY20iB3ByQXNEY20iCHByaWNlWDE4IghscEFtdFgxOCINbHBQckluQW1Bc1gxOCINbHBQckluUHJBc1gxOCIPY2FsY3VsYXRlUHJpY2VzIgFwIgd0YWtlRmVlIgZhbW91bnQiCWZlZUFtb3VudCIEZ2V0RCICeHAiA3hwMCIDeHAxIgNhbm4iC3hwMF94cDFfbl9uIgVhbm5fcyIFYW5uXzEiCWNhbGNETmV4dCIBZCICZGQiA2RkZCICZHAiBGNhbGMiA2FjYyIBaSIFZE5leHQiCGREaWZmUmF3IgVkRGlmZiIDYXJyIg0kdDAxMzUyNzEzNTc1IgIkbCICJHMiBSRhY2MwIgUkZjBfMSICJGEiAiRpIgUkZjBfMiIFZm91bmQiA2VnbyIGdHhJZDU4IgpwbXRBc3NldElkIghwbXRMcEFtdCILdXNlckFkZHJlc3MiBGxwSWQiBGFtSWQiBHBySWQiBWFtRGNtIgVwckRjbSIDc3RzIgdscEVtaXNzIglhbUJhbGFuY2UiDGFtQmFsYW5jZVgxOCIJcHJCYWxhbmNlIgxwckJhbGFuY2VYMTgiC2N1clByaWNlWDE4IghjdXJQcmljZSILcG10THBBbXRYMTgiCmxwRW1pc3NYMTgiC291dEFtQW10WDE4IgtvdXRQckFtdFgxOCIIb3V0QW1BbXQiCG91dFByQW10IgVzdGF0ZSIDZXBvIgdpbkFtQW10IgZpbkFtSWQiB2luUHJBbXQiBmluUHJJZCIGaXNFdmFsIgZlbWl0THAiCmlzT25lQXNzZXQiEHZhbGlkYXRlU2xpcHBhZ2UiBnBtdEFtdCIFcG10SWQiB2FtSWRTdHIiB3BySWRTdHIiBmFtdERjbSIIcHJpY2VEY20iBGxwRW0iD2luQW1Bc3NldEFtdFgxOCIPaW5QckFzc2V0QW10WDE4Igx1c2VyUHJpY2VYMTgiAXIiBmNoZWNrRCILc2xpcHBhZ2VYMTgiD3NsaXBwYWdlUmVhbFgxOCINbHBFbWlzc2lvblgxOCIKcHJWaWFBbVgxOCIKYW1WaWFQclgxOCIMZXhwZWN0ZWRBbXRzIhFleHBBbXRBc3NldEFtdFgxOCITZXhwUHJpY2VBc3NldEFtdFgxOCIJY2FsY0xwQW10Ig5jYWxjQW1Bc3NldFBtdCIOY2FsY1ByQXNzZXRQbXQiDHNsaXBwYWdlQ2FsYyIJZW1pdExwQW10IgZhbURpZmYiBnByRGlmZiINJHQwMjEzMzcyMTY4MiIKd3JpdGVBbUFtdCIKd3JpdGVQckFtdCILY29tbW9uU3RhdGUiBWdldFlEIgFEIgFuIgF4IgphUHJlY2lzaW9uIgFjIgFiIgNjdXIiDSR0MDIyODc3MjI4OTciAXkiBXlOZXh0IgV5RGlmZiINJHQwMjMyMDQyMzI1MSIHY2FsY0RMcCINYW1vdW50QmFsYW5jZSIMcHJpY2VCYWxhbmNlIgpscEVtaXNzaW9uIgp1cGRhdGVkRExwIg5jYWxjQ3VycmVudERMcCIQYW1vdW50QXNzZXREZWx0YSIPcHJpY2VBc3NldERlbHRhIhRscEFzc2V0RW1pc3Npb25EZWx0YSISYW1vdW50QXNzZXRCYWxhbmNlIhFwcmljZUFzc2V0QmFsYW5jZSIPbHBBc3NldEVtaXNzaW9uIgpjdXJyZW50RExwIhJyZWZyZXNoRExwSW50ZXJuYWwiF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhIhZwcmljZUFzc2V0QmFsYW5jZURlbHRhIgdhY3Rpb25zIhJ2YWxpZGF0ZVVwZGF0ZWRETHAiBm9sZERMcCIbdmFsaWRhdGVNYXRjaGVyT3JkZXJBbGxvd2VkIgVvcmRlciIRYW1vdW50QXNzZXRBbW91bnQiEHByaWNlQXNzZXRBbW91bnQiDSR0MDI1NDQ5MjU2NjEiA2RMcCINJHQwMjYwMDMyNjEwMyINdW51c2VkQWN0aW9ucyIGZExwTmV3Igxpc09yZGVyVmFsaWQiBGluZm8iAmNnIgNwbXQiDWlzR2V0RGlzYWJsZWQiAmNwIgZjYWxsZXIiB2FtQXNQbXQiB3ByQXNQbXQiDWlzUHV0RGlzYWJsZWQiDWNhbGNQdXRPbmVUa24iCXBtdEFtdFJhdyILd2l0aFRha2VGZWUiDWNoZWNoRW1pc3Npb24iDSR0MDI4OTYyMjk0MjQiDGFtQmFsYW5jZU9sZCIMcHJCYWxhbmNlT2xkIg0kdDAyOTQzMDI5NjA2IgthbUFtb3VudFJhdyILcHJBbW91bnRSYXciDSR0MDI5NjEwMjk4NjQiCGFtQW1vdW50IghwckFtb3VudCIMYW1CYWxhbmNlTmV3IgxwckJhbGFuY2VOZXciCGxwQW1vdW50Ig5wb29sUHJvcG9ydGlvbiIPYW1vdW50QXNzZXRQYXJ0Ig5wcmljZUFzc2V0UGFydCIJbHBBbXRCb3RoIgVib251cyITZ2V0T25lVGtuVjJJbnRlcm5hbCIKb3V0QXNzZXRJZCIMbWluT3V0QW1vdW50IghwYXltZW50cyIMb3JpZ2luQ2FsbGVyIg10cmFuc2FjdGlvbklkIgphbURlY2ltYWxzIgpwckRlY2ltYWxzIgpwb29sU3RhdHVzIg0kdDAzMTk3NjMyMDg3Igh0b3RhbEdldCILdG90YWxBbW91bnQiDSR0MDMyMjc3MzI1ODQiBW91dEFtIgVvdXRQciIIY3VyUHJYMTgiBWN1clByIhFvdXRBc3NldElkT3JXYXZlcyIQc2VuZEZlZVRvTWF0Y2hlciIEYnVybiINJHQwMzMzNjkzMzcxOSIQZmVlQW1vdW50Rm9yQ2FsYyIQb3V0SW5BbW91bnRBc3NldCINJHQwMzM3MjIzMzgzMCIRcmVmcmVzaERMcEFjdGlvbnMiEWlzVXBkYXRlZERMcFZhbGlkIhZtYW5hZ2VyUHVibGljS2V5T3JVbml0IhNtYW5hZ2VyVmF1bHRBZGRyZXNzIgJwZCIJaXNNYW5hZ2VyIgJwayILbXVzdE1hbmFnZXIiBGdldFkiCWlzUmV2ZXJzZSITcG9vbEFtb3VudEluQmFsYW5jZSINJHQwMzUzMTczNTMzNyINJHQwMzU2NjgzNTcxNSITc2tpcE9yZGVyVmFsaWRhdGlvbiINY2xlYW5BbW91bnRJbiINZmVlUG9vbEFtb3VudCINJHQwMzYwNjczNjQ5MSIIYXNzZXRPdXQiAmR5Igt0b3RhbEdldFJhdyIFbmV3WHAiBG5ld0QiDGFtb3VudE91dE1pbiIJYWRkcmVzc1RvIgtzd2FwQ29udGFjdCISaXNQb29sU3dhcERpc2FibGVkIg5pc1N3YXBEaXNhYmxlZCIGY2hlY2tzIgdhc3NldEluIg0kdDAzODI2MzM4NjU3IghjaGVja01pbiIEc2xpcCIJYXV0b1N0YWtlIgdmYWN0Q2ZnIgtzdGFraW5nQ250ciIIc2xpcENudHIiCmFtQXNzZXRQbXQiCnByQXNzZXRQbXQiAWUiCWxwQXNzZXRJZCICZWwiBmxlZ2FjeSICc2EiAnNwIghscFRybnNmciICc3MiDSR0MDQzMTEyNDMyNTQiBWNoZWNrIhRscEFzc2V0RW1pc3Npb25BZnRlciIgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiDSR0MDQ0OTMyNDUwOTAiB2VzdGltTFAiDSR0MDQ1OTc1NDYzMjQiFHBheW1lbnRJbkFtb3VudEFzc2V0Ig0kdDA0NjMyNzQ2NDM1IgdtYXhTbHBnIgZlc3RQdXQiDSR0MDQ3NDY1NDc1MzAiCW91dEFtdEFtdCINJHQwNDg3MDM0ODc4NSINJHQwNDk0NDA0OTU5NSIYbGFzdFJlZnJlc2hlZEJsb2NrSGVpZ2h0Ih1jaGVja0xhc3RSZWZyZXNoZWRCbG9ja0hlaWdodCINJHQwNTAxMTk1MDE4MyIQZExwVXBkYXRlQWN0aW9ucyINbHBBc3NldEFtb3VudCIFaW5kZXgiBG5ld1kiDSR0MDUxMTkzNTEyNDgiDSR0MDUxNjIzNTE3MzgiDnN1bU9mR2V0QXNzZXRzIhJub0xlc3NUaGVuQW10QXNzZXQiFG5vTGVzc1RoZW5QcmljZUFzc2V0IhRidXJuTFBBc3NldE9uRmFjdG9yeSINJHQwNTI5MDQ1Mjk4NSINY2hlY2tQYXltZW50cyIKZmFjdG9yeUNmZyIHc3Rha2luZyIKdW5zdGFrZUludiIBdiIFYnVybkEiDSR0MDU0MDk1NTQxNzYiDXVuc3Rha2VBbW91bnQiFW5vTGVzc1RoZW5BbW91bnRBc3NldCIDcmVzIgxjaGVja0Ftb3VudHMiDSR0MDU1NDY0NTU1NDUiF2xwQXNzZXRSZWNpcGllbnRBZGRyZXNzIg0kdDA1NjYwNDU2NzkyIhBwYXltZW50QW1vdW50UmF3Ig5wYXltZW50QXNzZXRJZCINJHQwNTY5MjA1NzAyMyINJHQwNTcxNzE1NzI3NSIIYW10QXNTdHIiB3ByQXNTdHIiAnByIgxyZXNTY2FsZU11bHQiB3VzckFkZHIiB3BtdEFzSWQiA2NmZyINJHQwNTk3NTU1OTk1NCIEbGlzdCIFZGVsYXkiBWRlbHRhIgZ0YXJnZXQiBmN1ckFtcCIJbmV3QW1wUmF3IgZuZXdBbXAiCGxhc3RDYWxsIgR3YWl0IgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXkiCm1hdGNoZXJQdWIiDSR0MDYwODg3NjEwMDQiB25ld0hhc2giC2FsbG93ZWRIYXNoIgtjdXJyZW50SGFzaIcBAAFhAIDC1y8AAWIJALYCAQCAwtcvAAFjCQC2AgEAgICQu7rWrfANAAFkCQC2AgEAAAABZQkAtgIBAAAAAWYJALYCAQABAAFnCQC2AgEAAgABaAkAtgIBAAMAAWkJALYCAQAEAAFqCQC2AgEJAGUCBQFhCQBpAgkAaAIFAWEAAQUBYQABawIFV0FWRVMAAWwAMgABbQIDMTAwAAFuAgExAAFvAgJfXwABcAIAAAFxAAEAAXIAAgABcwADAAF0AAQAAXUAAQABdgACAAF3AAMAAXgABAABeQAFAAF6AAYAAUEABwABQgAIAAFDAAkAAUQAAQABRQAGAAFGAAcAAUcACgABSAkAawMACgUBYQCQTgEBSQIBSgFLCQC8AgMJALYCAQUBSgUBYwkAtgIBBQFLAQFMAgFKAUsJALwCAwUBSgUBYwUBSwEBTQIBTgFPCQCgAwEJALwCAwUBTgkAtgIBBQFPBQFjAQFQAwFOAU8BUQkAoAMBCQC9AgQFAU4JALYCAQUBTwUBYwUBUQEBUgIBSgFLCQC8AgMFAUoFAWMJALYCAQUBSwEBUwIBTgFPCQC8AgMFAU4JALYCAQUBTwUBYwEBVAMBVQFWAVcJAGsDBQFVBQFWBQFXAQFYAQFOAwkAvwICBQFkBQFOCQC+AgEFAU4FAU4BAVkBAU4DCQC/AgIFAWQFAU4JAL4CAQUBTgUBTgEBWgACEyVzX19mYWN0b3J5Q29udHJhY3QBAmFhAAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBAmFiAAIXJXNfX21hbmFnZXJWYXVsdEFkZHJlc3MBAmFjAAIRJXMlc19fcHJpY2VfX2xhc3QBAmFkAgJhZQJhZgkAuQkCCQDMCAICGCVzJXMlZCVkX19wcmljZV9faGlzdG9yeQkAzAgCCQCkAwEFAmFlCQDMCAIJAKQDAQUCYWYFA25pbAUBbwECYWcCAmFoAmFpCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwUCYWgCAl9fBQJhaQECYWoCAmFoAmFpCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX0dfXwUCYWgCAl9fBQJhaQECYWsAAg8lc19fYW1vdW50QXNzZXQBAmFsAAIOJXNfX3ByaWNlQXNzZXQBAmFtAAIHJXNfX2FtcAECYW4BAmFvCQCsAgICCyVzJWRfX2FtcF9fCQCkAwEFAmFvAQJhcAACFSVzX19jaGFuZ2VBbXBMYXN0Q2FsbAACYXECByVzX19mZWUAAmFyCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmFxBQFIAAJhcwkAuQkCCQDMCAICAiVzCQDMCAICA2RMcAUDbmlsBQFvAAJhdAkAuQkCCQDMCAICAiVzCQDMCAICEmRMcFJlZnJlc2hlZEhlaWdodAUDbmlsBQFvAAJhdQkAuQkCCQDMCAICAiVzCQDMCAICD3JlZnJlc2hETHBEZWxheQUDbmlsBQFvAAJhdgAeAAJhdwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJhdQUCYXYBAmF4AAIRJXNfX2ZhY3RvcnlDb25maWcBAmF5AAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJhegICYUECYUIJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmFBAgJfXwUCYUICCF9fY29uZmlnAQJhQwECYUQJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYUQBAmFFAAIMJXNfX3NodXRkb3duAQJhRgACHSVzX19hbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAQJhRwACFyVzX19mZWVDb2xsZWN0b3JBZGRyZXNzAQJhSAECYUkJAKwCAgIbJXMlc19fc2tpcE9yZGVyVmFsaWRhdGlvbl9fBQJhSQECYUoEAmFLAmFMAmFNAmFOCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICJG9yZGVyIHZhbGlkYXRpb24gZmFpbGVkOiBvcmRlclZhbGlkPQkApQMBBQJhSwICICgFAmFMAgEpAg0gc2VuZGVyVmFsaWQ9CQClAwEFAmFNAg4gbWF0Y2hlclZhbGlkPQkApQMBBQJhTgECYU8BAmFQBAJhUQkApggBBQJhUAMJAAECBQJhUQIHQWRkcmVzcwQCYVIFAmFRBQJhUgUEdGhpcwECYVMABAJhVAQCYVEJAKIIAQkBAVoAAwkAAQIFAmFRAgZTdHJpbmcEAmFVBQJhUQkBAmFPAQUCYVUFBHRoaXMEAmFRCQCdCAIFAmFUCQECYWIAAwkAAQIFAmFRAgZTdHJpbmcEAmFWBQJhUQkBAmFPAQUCYVYFBHRoaXMBAmFXAgJhWAJhWQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFAmFYBQJhWQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQJhWAkAzAgCAgEuCQDMCAIFAmFZCQDMCAICDCBub3QgZGVmaW5lZAUDbmlsAgABAmFaAgJhWAJhWQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFAmFYBQJhWQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQJhWAkAzAgCAgEuCQDMCAIFAmFZCQDMCAICDCBub3QgZGVmaW5lZAUDbmlsAgABAmJhAQJiYgkAAgEJALkJAgkAzAgCAg9scF9zdGFibGUucmlkZToJAMwIAgUCYmIFA25pbAIBIAECYmMBAmJiCQC5CQIJAMwIAgIPbHBfc3RhYmxlLnJpZGU6CQDMCAIFAmJiBQNuaWwCASAAAmFVCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYVcCBQR0aGlzCQEBWgAAAmJkCgACYmUJAPwHBAUCYVUCEGdldEluRmVlUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJiZQIDSW50BQJiZQkAAgEJAKwCAgkAAwEFAmJlAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQAAmJmCgACYmUJAPwHBAUCYVUCEWdldE91dEZlZVJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYmUCA0ludAUCYmUJAAIBCQCsAgIJAAMBBQJiZQIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQJiZwECYmgJALkJAgkAzAgCAgQlcyVzCQDMCAICC3doaXRlbGlzdGVkCQDMCAIJAKUIAQUCYmgFA25pbAUBbwECYmkBAmJoCQELdmFsdWVPckVsc2UCCQCbCAIFAmFVCQECYmcBBQJiaAcAAmJqCQECYVcCBQR0aGlzCQECYW0AAQJiawAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUCYVUJAQJhRQAHAQJibAAJANkEAQkBAmFXAgUCYVUJAQJheQAAAmJtCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYVcCBQJhVQkBAmFHAAECYm4ABAJibwkBAmFXAgUEdGhpcwkBAmFrAAQCYnAJAQJhVwIFBHRoaXMJAQJhbAAEAmJxCQECYVoCBQJhVQkBAmFDAQUCYnAEAmFBCQECYVoCBQJhVQkBAmFDAQUCYm8JALUJAgkBAmFXAgUCYVUJAQJhegIJAKQDAQUCYUEJAKQDAQUCYnEFAW8BAmJyAQJicwMJAAACBQJicwUBawUEdW5pdAkA2QQBBQJicwECYnQBAmJzAwkAAAIFAmJzBQR1bml0BQFrCQDYBAEJAQV2YWx1ZQEFAmJzAQJidQECYnYJAJkKBwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJidgUBdQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ2BQF2CQDZBAEJAJEDAgUCYnYFAXcJAQJicgEJAJEDAgUCYnYFAXgJAQJicgEJAJEDAgUCYnYFAXkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJidgUBegkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ2BQFBAAJidwkBAmJ1AQkBAmJuAAACYngFAmJ3AAJieQgFAmJ4Al8xAAJieggFAmJ4Al8yAAJiQQgFAmJ4Al8zAAJiQggFAmJ4Al80AAJiQwgFAmJ4Al81AAJiRAgFAmJ4Al82AAJiRQgFAmJ4Al83AQJiRgAJALUJAgkBAmFXAgUCYVUJAQJheAAFAW8AAmJHCQECYkYAAAJiSAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYkcFAUQCIEludmFsaWQgc3Rha2luZyBjb250cmFjdCBhZGRyZXNzAAJiSQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYkcFAUYCIEludmFsaWQgc2xpcGFnZSBjb250cmFjdCBhZGRyZXNzAAJiSgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYkcFAUcCHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MAAmJLCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJiRwUBRQIcSW52YWxpZCBnd3ggY29udHJhY3QgYWRkcmVzcwECYkwKAmJNAmJOAmJPAmJQAmJRAmJSAmJTAmJUAmJVAmJWCQC5CQIJAMwIAgIUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJiTQkAzAgCCQCkAwEFAmJOCQDMCAIJAKQDAQUCYk8JAMwIAgkApAMBBQJiUAkAzAgCCQCkAwEFAmJRCQDMCAIJAKQDAQUCYlIJAMwIAgkApAMBBQJiUwkAzAgCCQCkAwEFAmJUCQDMCAIJAKQDAQUCYlUJAMwIAgkApAMBBQJiVgUDbmlsBQFvAQJiVwYCYlgCYlkCYloCYlACYlMCYlQJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJiWAkAzAgCCQCkAwEFAmJZCQDMCAIJAKQDAQUCYloJAMwIAgkApAMBBQJiUAkAzAgCCQCkAwEFAmJTCQDMCAIJAKQDAQUCYlQFA25pbAUBbwECY2EBAmNiAwkAAAIFAmNiAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQJjYgECY2MCAmNkAmNlCQC8AgMFAmNkBQFjBQJjZQECY2YDAmNkAmNlAVEJAL0CBAUCY2QFAWMFAmNlBQFRAQJjZwMCY2gCY2kCY2oEAmNrCQC8AgMJALgCAgUCY2gFAmNpBQFiBQJjaQQCY2wJAL8CAgkAuAICBQJjagkBAVgBBQJjawUBZAMJAQEhAQUCY2wJAAIBCQCsAgICCkJpZyBzbHBnOiAJAKYDAQUCY2sJAJQKAgUCY2wJAJkDAQkAzAgCBQJjaAkAzAgCBQJjaQUDbmlsAQJjbQMCY24CY28CY3AEAmNrCQC8AgMFAmNvBQFiBQJjbgQCY3EJAL8CAgUCY3AFAmNrAwMFAmNxBgkAvwICBQJjbwUCY24JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCmAwEFAmNvAgEgCQCmAwEFAmNuAgEgCQCmAwEFAmNrAgEgCQCmAwEFAmNwBQJjcQECY3IEAmNzAmN0AmN1AmN2BAJjdwkBAUkCBQJjdQUCY3MEAmN4CQEBSQIFAmN2BQJjdAkBAmNjAgUCY3gFAmN3AQJjeQMCY3UCY3YCY3oEAmNBBQJiRAQCY0IFAmJFBAJjQwkBAmNyBAUCY0EFAmNCBQJjdQUCY3YEAmNlCQEBSQIFAmN1BQJjQQQCY2QJAQFJAgUCY3YFAmNCBAJjRAkBAUkCBQJjegUBYQQCY0UJAQJjYwIFAmNlBQJjRAQCY0YJAQJjYwIFAmNkBQJjRAkAzAgCBQJjQwkAzAgCBQJjRQkAzAgCBQJjRgUDbmlsAQJjRwMCY3UCY3YCY3oEAmNICQECY3kDBQJjdQUCY3YFAmN6CQDMCAIJAQFNAgkAkQMCBQJjSAAABQFhCQDMCAIJAQFNAgkAkQMCBQJjSAABBQFhCQDMCAIJAQFNAgkAkQMCBQJjSAACBQFhBQNuaWwBAmNJAgJjSgJhcgQCY0sDCQAAAgUCYXIAAAAACQBrAwUCY0oFAmFyBQFhCQCUCgIJAGUCBQJjSgUCY0sFAmNLAQJjTAECY00EAmNOCQCRAwIFAmNNAAAEAmNPCQCRAwIFAmNNAAEEAmFWCQC3AgIFAmNOBQJjTwMJAAACBQJhVgUBZQUBZQQCYVIJAQ1wYXJzZUludFZhbHVlAQUCYmoEAmNQCQBoAgUCYVIAAgQCY0gJALwCAwUCY04FAmNPBQFmBAJjUQkAvAIDBQJjSAUBaQUBZgQCY1IJALwCAwkAtgIBBQJjUAUCYVYFAWYEAmNTCQC2AgEJAGUCBQJjUAABCgECY1QBAmNVBAJjVgkAvAIDBQJjVQUCY1UFAWYEAmNXCQC8AgMFAmNWBQJjVQUBZgQCY1gJALwCAwUCY1cFAWYFAmNRCQC8AgMJALcCAgUCY1IJALwCAwUCY1gFAWcFAWYFAmNVCQC3AgIJALwCAwUCY1MFAmNVBQFmCQC8AgMFAWgFAmNYBQFmCgECY1kCAmNaAmRhAwgFAmNaAl8yBQJjWgQCY1UIBQJjWgJfMQQCZGIJAQJjVAEFAmNVBAJkYwkAuAICBQJkYgkBBXZhbHVlAQUCY1UEAmRkAwkAvwICBQFlBQJkYwkAvgIBBQJkYwUCZGMDCQDAAgIFAWYFAmRkCQCUCgIFAmRiBgkAlAoCBQJkYgcEAmRlCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOCQDMCAIADwkAzAgCABAFA25pbAQCZGYKAAJkZwUCZGUKAAJkaAkAkAMBBQJkZwoAAmRpCQCUCgIFAmFWBwoBAmRqAgJkawJkbAMJAGcCBQJkbAUCZGgFAmRrCQECY1kCBQJkawkAkQMCBQJkZwUCZGwKAQJkbQICZGsCZGwDCQBnAgUCZGwFAmRoBQJkawkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE3CQECZG0CCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCBQJkaQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQQCY1UIBQJkZgJfMQQCZG4IBQJkZgJfMgMFAmRuBQJjVQkAAgEJAKwCAgIZRCBjYWxjdWxhdGlvbiBlcnJvciwgRCA9IAkApgMBBQJjVQECZG8EAmRwAmRxAmRyAmRzBAJkdAUCYkEEAmR1CQDYBAEJAQV2YWx1ZQEFAmJCBAJkdgkA2AQBCQEFdmFsdWUBBQJiQwQCZHcFAmJEBAJkeAUCYkUEAmR5CQCkAwEFAmJ6BAJkeggJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJkdAILV3JvbmcgTFAgaWQIcXVhbnRpdHkDCQECIT0CCQDYBAEFAmR0BQJkcQkAAgECD1dyb25nIHBtdCBhc3NldAQCZEEJAQJjYQEFAmR1BAJkQgkBAUkCBQJkQQUCZHcEAmRDCQECY2EBBQJkdgQCZEQJAQFJAgUCZEMFAmR4BAJkRQkBAmNjAgUCZEQFAmRCBAJkRgkBAU0CBQJkRQUBYQQCZEcJAQFJAgUCZHIFAWEEAmRICQEBSQIFAmR6BQFhBAJkSQkAvAIDBQJkQgUCZEcFAmRIBAJkSgkAvAIDBQJkRAUCZEcFAmRIBAJkSwkBAVADBQJkSQUCZHcFBUZMT09SBAJkTAkBAVADBQJkSgUCZHgFBUZMT09SBAJkTQMJAAACBQJkcAIABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCZHMFAmRLAwkAAAIFAmR1AgVXQVZFUwUEdW5pdAkA2QQBBQJkdQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJkcwUCZEwDCQAAAgUCZHYCBVdBVkVTBQR1bml0CQDZBAEFAmR2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhagIJAKUIAQUCZHMFAmRwCQECYlcGBQJkSwUCZEwFAmRyBQJkRgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFjAAUCZEYJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhZAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmRGBQNuaWwJAJwKCgUCZEsFAmRMBQJkdQUCZHYFAmRBBQJkQwUCZHoFAmRFBQJkeQUCZE0BAmRODQJkcAJjagJkTwJkUAJkUQJkUgJkcwJkUwJkVAJkVQJkVgJkVwJkWAQCZHQFAmJBBAJkWQkA2AQBCQEFdmFsdWUBBQJiQgQCZFoJANgEAQkBBXZhbHVlAQUCYkMEAmVhBQJiRAQCZWIFAmJFBAJkeQkApAMBBQJiegQCZWMICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCZHQCCFdyIGxwIGFzCHF1YW50aXR5BAJkQQMFAmRTCQECY2EBBQJkWQMDBQJkVQkAAAIFAmRYBQJkWQcJAGUCCQECY2EBBQJkWQUCZFcDBQJkVQkBAmNhAQUCZFkJAGUCCQECY2EBBQJkWQUCZE8EAmRDAwUCZFMJAQJjYQEFAmRaAwMFAmRVCQAAAgUCZFgFAmRaBwkAZQIJAQJjYQEFAmRaBQJkVwMFAmRVCQECY2EBBQJkWgkAZQIJAQJjYQEFAmRaBQJkUQQCZWQJAQFJAgUCZE8FAmVhBAJlZQkBAUkCBQJkUQUCZWIEAmVmCQECY2MCBQJlZQUCZWQEAmRCCQEBSQIFAmRBBQJlYQQCZEQJAQFJAgUCZEMFAmViBAJjbwkBAmNMAQkAzAgCBQJkQgkAzAgCBQJkRAUDbmlsBAJlZwMJAAACBQJlYwAABAJjbgkBAmNMAQkAzAgCCQC3AgIFAmRCBQJlZAkAzAgCCQC3AgIFAmREBQJlZQUDbmlsBAJlaAMJAL8CAgUCY24FAmNvBgkAAgECHEQxIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gRDADCQAAAgUCZWgFAmVoBAJkRQUBZAQCZWkFAWQEAmNEBQJjbgkAlwoFCQEBTQIFAmNEBQFhCQEBTQIFAmVkBQJlYQkBAU0CBQJlZQUCZWIJAQJjYwIJALcCAgUCZEQFAmVlCQC3AgIFAmRCBQJlZAUCZWkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAmRFCQECY2MCBQJkRAUCZEIEAmVqCQC8AgMJAQFYAQkAuAICBQJkRQUCZWYFAWMFAmRFBAJlaQkBAUkCBQJjagUBYQMDAwUCZFYJAQIhPQIFAmRFBQFkBwkAvwICBQJlagUCZWkHCQACAQkArAICCQCsAgIJAKwCAgIPUHJpY2Ugc2xpcHBhZ2UgCQCmAwEFAmVqAgMgPiAJAKYDAQUCZWkEAmVrCQEBSQIFAmVjBQFhBAJlbAkAvQIEBQJlZAkBAmNmAwUCZEQFAmRCBQdDRUlMSU5HBQFjBQdDRUlMSU5HBAJlbQkAvQIEBQJlZQUBYwkBAmNmAwUCZEQFAmRCBQVGTE9PUgUHQ0VJTElORwQCZW4DCQC/AgIFAmVsBQJlZQkAlAoCBQJlbQUCZWUJAJQKAgUCZWQFAmVsBAJlbwgFAmVuAl8xBAJlcAgFAmVuAl8yBAJjbgkBAmNMAQkAzAgCCQC3AgIFAmRCBQJlbwkAzAgCCQC3AgIFAmREBQJlcAUDbmlsBAJlaAMJAL8CAgUCY24FAmNvBgkAAgECHEQxIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gRDADCQAAAgUCZWgFAmVoBAJjRAkAvAIDBQJlawkAuAICBQJjbgUCY28FAmNvCQCXCgUJAQFQAwUCY0QFAWEFBUZMT09SCQEBUAMFAmVvBQJlYQUHQ0VJTElORwkBAVADBQJlcAUCZWIFB0NFSUxJTkcFAmRFBQJlaQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQCZXEIBQJlZwJfMQQCZXIIBQJlZwJfMgQCZXMIBQJlZwJfMwQCZEYJAQFNAggFAmVnAl80BQFhBAJldAkBAU0CCAUCZWcCXzUFAWEDCQBnAgAABQJlcQkAAgECB0xQIDw9IDAEAmV1AwkBASEBBQJkVAAABQJlcQQCZXYJAGUCBQJkTwUCZXIEAmV3CQBlAgUCZFEFAmVzBAJleAMDBQJkVQkAAAIFAmRYBQJkWQcJAJQKAgUCZFcAAAMDBQJkVQkAAAIFAmRYBQJkWgcJAJQKAgAABQJkVwkAlAoCBQJlcgUCZXMEAmV5CAUCZXgCXzEEAmV6CAUCZXgCXzIEAmVBCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWMABQJkRgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFkAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZEYJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFnAgUCZHMFAmRwCQECYkwKBQJleQUCZXoFAmV1BQJkRgUCY2oFAmV0BQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJldgUCZXcFA25pbAkAnwoNBQJlcQUCZXUFAmRGBQJkQQUCZEMFAmVjBQJkdAUCZHkFAmVBBQJldgUCZXcFAmRQBQJkUgECZUIDAmNNAmRhAmVDBAJlRAUBZwQCZUUJAJEDAgUCY00DCQAAAgUCZGEAAAABAAAEAmVGCQCnAwEFAW0EAmFSCQC5AgIJAKcDAQUCYmoFAmVGBAJhVgUCZUUEAmNQCQC5AgIFAmFSBQJlRAQCZUcJALoCAgkAuQICCQC5AgIJALoCAgkAuQICBQJlQwUCZUMJALkCAgUCZUUFAmVEBQJlQwUCZUYJALkCAgUCY1AFAmVEBAJlSAkAuAICCQC3AgIFAmFWCQC6AgIJALkCAgUCZUMFAmVGBQJjUAUCZUMKAQJjWQICY1oCZUkEAmVKBQJjWgQCZUsIBQJlSgJfMQQCZG4IBQJlSgJfMgMJAQIhPQIFAmRuBQR1bml0BQJjWgQCZUwJALoCAgkAtwICCQC5AgIFAmVLBQJlSwUCZUcJALcCAgkAuQICBQFnBQJlSwUCZUgEAmVNCQEBWQEJALgCAgUCZUwJAQV2YWx1ZQEFAmVLAwkAwAICBQFmBQJlTQkAlAoCBQJlTAUCZUkJAJQKAgUCZUwFBHVuaXQEAmRlCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOBQNuaWwEAmVOCgACZGcFAmRlCgACZGgJAJADAQUCZGcKAAJkaQkAlAoCBQJlQwUEdW5pdAoBAmRqAgJkawJkbAMJAGcCBQJkbAUCZGgFAmRrCQECY1kCBQJkawkAkQMCBQJkZwUCZGwKAQJkbQICZGsCZGwDCQBnAgUCZGwFAmRoBQJkawkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQECZG0CCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCBQJkaQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAJlSwgFAmVOAl8xBAJkbggFAmVOAl8yAwkBAiE9AgUCZG4FBHVuaXQFAmVLCQACAQkArAICAhlZIGNhbGN1bGF0aW9uIGVycm9yLCBZID0gCQCmAwEFAmVLAQJlTwMCZVACZVECZVIEAmVTCQC8AgMJAQJjTAEJAMwIAgkBAUwCBQJlUAkAtgIBBQJiRAkAzAgCCQEBTAIFAmVRCQC2AgEFAmJFBQNuaWwFAWMFAmVSAwkAAAIFAmVSBQFlBQFlBQJlUwECZVQDAmVVAmVWAmVXBAJlWAkAuAICCQC2AgEJAQJjYQEJAQJidAEFAmJCBQJlVQQCZVkJALgCAgkAtgIBCQECY2EBCQECYnQBBQJiQwUCZVYEAmVaCQC4AgIJALYCAQgJAQV2YWx1ZQEJAOwHAQUCYkEIcXVhbnRpdHkFAmVXBAJmYQkBAmVPAwUCZVgFAmVZBQJlWgUCZmEBAmZiAwJmYwJmZAJlVwQCZVgJAGQCCQECY2EBCQECYnQBBQJiQgUCZmMEAmVZCQBkAgkBAmNhAQkBAmJ0AQUCYkMFAmZkBAJlWgkAZAIICQEFdmFsdWUBCQDsBwEFAmJBCHF1YW50aXR5BQJlVwQCZVMJAQJlTwMJALYCAQUCZVgJALYCAQUCZVkJALYCAQUCZVoEAmZlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJhdAUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIFAmFzCQCmAwEFAmVTBQNuaWwJAJQKAgUCZmUFAmVTAQJmZgICZmcCZVMDCQDAAgIFAmVTBQJmZwYJAQJiYQECInVwZGF0ZWQgRExwIGxvd2VyIHRoYW4gY3VycmVudCBETHABAmZoAQJmaQQCZVgJAQJjYQEJAQJidAEFAmJCBAJlWQkBAmNhAQkBAmJ0AQUCYkMEAmZqCAUCZmkGYW1vdW50BAJmawkAbgQIBQJmaQZhbW91bnQIBQJmaQVwcmljZQUBYQUFRkxPT1IEAmZsAwkAAAIIBQJmaQlvcmRlclR5cGUFA0J1eQkAlAoCBQJmagkBAS0BBQJmawkAlAoCCQEBLQEFAmZqBQJmawQCZmMIBQJmbAJfMQQCZmQIBQJmbAJfMgMDAwkBAmJrAAYJAAACBQJiegUBcwYJAAACBQJiegUBdAkAAgECDUFkbWluIGJsb2NrZWQDAwkBAiE9AggIBQJmaQlhc3NldFBhaXILYW1vdW50QXNzZXQFAmJCBgkBAiE9AggIBQJmaQlhc3NldFBhaXIKcHJpY2VBc3NldAUCYkMJAAIBAglXciBhc3NldHMEAmZtCQCnAwEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUCYXMCATAEAmZuCQECZmIDBQJmYwUCZmQAAAQCZm8IBQJmbgJfMQQCZnAIBQJmbgJfMgQCZnEJAMACAgUCZnAFAmZtBAJmcgkAuQkCCQDMCAICBGRMcD0JAMwIAgkApgMBBQJmbQkAzAgCAgggZExwTmV3PQkAzAgCCQCmAwEFAmZwCQDMCAICFCBhbW91bnRBc3NldEJhbGFuY2U9CQDMCAIJAKQDAQUCZVgJAMwIAgITIHByaWNlQXNzZXRCYWxhbmNlPQkAzAgCCQCkAwEFAmVZCQDMCAICGSBhbW91bnRBc3NldEJhbGFuY2VEZWx0YT0JAMwIAgkApAMBBQJmYwkAzAgCAhggcHJpY2VBc3NldEJhbGFuY2VEZWx0YT0JAMwIAgkApAMBBQJmZAkAzAgCAgggaGVpZ2h0PQkAzAgCCQCkAwEFBmhlaWdodAUDbmlsAgAJAJQKAgUCZnEFAmZyAQJmcwECZGEDCQECIT0CCQCQAwEIBQJkYQhwYXltZW50cwABCQACAQIKMSBwbW50IGV4cAQCZnQJAQV2YWx1ZQEJAJEDAggFAmRhCHBheW1lbnRzAAAEAmRxCQEFdmFsdWUBCAUCZnQHYXNzZXRJZAQCZFcIBQJmdAZhbW91bnQEAmVnCQECZG8ECQDYBAEIBQJkYQ10cmFuc2FjdGlvbklkCQDYBAEFAmRxBQJkVwgFAmRhBmNhbGxlcgQCZEsIBQJlZwJfMQQCZEwIBQJlZwJfMgQCZHkJAQ1wYXJzZUludFZhbHVlAQgFAmVnAl85BAJkTQgFAmVnA18xMAQCZnUDCQEBIQEJAQJiaQEIBQJkYQZjYWxsZXIDCQECYmsABgkAAAIFAmJ6BQF0BwMFAmZ1CQACAQkArAICAg9BZG1pbiBibG9ja2VkOiAJAKQDAQUCZHkJAJcKBQUCZEsFAmRMBQJkVwUCZHEFAmRNAQJmdgoCZncCYWkCZngCZnkCY2oCZFQCZFUCZFYCZFcCZFgEAmVnCQECZE4NBQJhaQUCY2oICQEFdmFsdWUBBQJmeAZhbW91bnQICQEFdmFsdWUBBQJmeAdhc3NldElkCAkBBXZhbHVlAQUCZnkGYW1vdW50CAkBBXZhbHVlAQUCZnkHYXNzZXRJZAUCZncJAAACBQJhaQIABQJkVAUCZFUFAmRWBQJkVwUCZFgEAmR5CQENcGFyc2VJbnRWYWx1ZQEIBQJlZwJfOAQCZnoDCQEBIQEJAQJiaQEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmZ3AwMJAQJiawAGCQAAAgUCYnoFAXQGCQAAAgUCYnoFAXIHAwUCZnoJAAIBCQCsAgICCEJsb2NrZWQ6CQCkAwEFAmR5BQJlZwECZkEFAmZCAmRxAmRzAmFpAmZDBAJkdQkA2AQBCQEFdmFsdWUBBQJiQgQCZHYJANgEAQkBBXZhbHVlAQUCYkMEAmR0BQJiQQQCZWEFAmJEBAJlYgUCYkUEAmVaCQC2AgEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCZHQCEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmZEAwkAvwICBQJlWgUBZQYJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zAwkAAAIFAmZEBQJmRAQCZEEJAQJjYQEFAmR1BAJkQwkBAmNhAQUCZHYEAmZFAwkAAAIFAmFpAgAJAJQKAgUCZEEFAmRDAwkAAAIFAmRxBQJkdQMJAGYCBQJmQgUCZEEJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIJAGUCBQJkQQUCZkIFAmRDAwkAAAIFAmRxBQJkdgMJAGYCBQJmQgUCZEMJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIFAmRBCQBlAgUCZEMFAmZCCQACAQIQd3JvbmcgcG10QXNzZXRJZAQCZkYIBQJmRQJfMQQCZkcIBQJmRQJfMgQCZkgDCQAAAgUCZHEFAmR1CQCUCgIFAmZCAAADCQAAAgUCZHEFAmR2CQCUCgIAAAUCZkIJAAIBAg9pbnZhbGlkIHBheW1lbnQEAmZJCAUCZkgCXzEEAmZKCAUCZkgCXzIEAmZLAwUCZkMJAJUKAwgJAQJjSQIFAmZJBQJiZAJfMQgJAQJjSQIFAmZKBQJiZAJfMQgJAQJjSQIFAmZCBQJiZAJfMgkAlQoDBQJmSQUCZkoAAAQCZkwIBQJmSwJfMQQCZk0IBQJmSwJfMgQCY0sIBQJmSwJfMwQCZk4JAGQCBQJmRgUCZkwEAmZPCQBkAgUCZkcFAmZNBAJjbwkBAmNMAQkAzAgCCQEBSQIFAmZGBQJiRAkAzAgCCQEBSQIFAmZHBQJiRQUDbmlsBAJjbgkBAmNMAQkAzAgCCQEBSQIFAmZOBQJiRAkAzAgCCQEBSQIFAmZPBQJiRQUDbmlsBAJlaAMJAL8CAgUCY24FAmNvBgkBBXRocm93AAMJAAACBQJlaAUCZWgEAmZQCQC9AgQFAmVaCQC4AgIFAmNuBQJjbwUCY28FBUZMT09SBAJkRgkBAU0CCQECY2MCCQEBSQIFAmZPBQJlYgkBAUkCBQJmTgUCZWEFAWEEAmVBCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWMABQJkRgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFkAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZEYJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFnAgUCZHMFAmFpCQECYkwKBQJmSQUCZkoJAKADAQUCZlAFAmRGAAAAAAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAAAAAFA25pbAQCZlEJAGsDBQJmRwUBYQUCZkYEAmZSCQBrAwUCZkIFAWEJAGQCBQJmUQUBYQQCZlMJAGUCBQJmQgUCZlIEAmZUCQC8AgMFAmVaCQC2AgEFAmZTCQC2AgEFAmZHBAJmVQkAoAMBCQC8AgMJALgCAgUCZlAFAmZUBQFiBQJmVAkAlgoECQCgAwEFAmZQBQJlQQUCY0sFAmZVCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJmVgYCZlcCZlgCZlkCZncCZloCZ2EEAmR0CQDYBAEJAQV2YWx1ZQEFAmJBBAJkdQkA2AQBCQEFdmFsdWUBBQJiQgQCZHYJANgEAQkBBXZhbHVlAQUCYkMEAmdiBQJiRAQCZ2MFAmJFBAJnZAUCYnoEAmRzAwkAAAIFAmZ3BQJiSwUCZloFAmZ3BAJmdAkBBXZhbHVlAQkAkQMCBQJmWQAABAJkcQkBBXZhbHVlAQgFAmZ0B2Fzc2V0SWQEAmRXCAUCZnQGYW1vdW50BAJmYQkBAmVUAwUBZQUBZQUBZQMJAAACBQJmYQUCZmEEAmRwCQDYBAEFAmdhAwkBAiE9AgUCZHQJANgEAQUCZHEJAAIBAghXcm9uZyBMUAQCZEEJAQJjYQEFAmR1BAJkQwkBAmNhAQUCZHYEAmdlCgACYmUJAPwHBAUEdGhpcwITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQJmVwkAzAgCBQJkVwUDbmlsBQNuaWwDCQABAgUCYmUCCihJbnQsIEludCkFAmJlCQACAQkArAICCQADAQUCYmUCHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkDCQAAAgUCZ2UFAmdlBAJjSwgFAmdlAl8yBAJnZggFAmdlAl8xBAJnZwMDCQBmAgUCZlgAAAkAZgIFAmZYBQJnZgcJAQJiYQEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZlgFA25pbAIABQJnZgQCZ2gDCQAAAgUCZlcFAmR1CQCWCgQFAmdnAAAJAGUCCQBlAgUCZEEFAmdnBQJjSwUCZEMDCQAAAgUCZlcFAmR2CQCWCgQAAAUCZ2cFAmRBCQBlAgkAZQIFAmRDBQJnZwUCY0sJAAIBAhRpbnZhbGlkIG91dCBhc3NldCBpZAQCZ2kIBQJnaAJfMQQCZ2oIBQJnaAJfMgQCZk4IBQJnaAJfMwQCZk8IBQJnaAJfNAQCZ2sJAQJjYwIJAQFJAgUCZk8FAmdjCQEBSQIFAmZOBQJnYgQCZ2wJAQFNAgUCZ2sFAWEEAmdtAwkAAAIFAmZXAgVXQVZFUwUEdW5pdAkA2QQBBQJmVwQCZ24DCQBmAgUCY0sAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJibQUCY0sFAmdtBQNuaWwFA25pbAQCZE0JAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJkcwUCZ2cFAmdtCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhagIJAKUIAQUCZHMFAmRwCQECYlcGBQJnaQUCZ2oFAmRXBQJnbAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFjAAUCZ2wJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhZAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmdsBQNuaWwFAmduAwkAAAIFAmRNBQJkTQQCZ28JAPwHBAUCYVUCBGJ1cm4JAMwIAgUCZFcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZHEFAmRXBQNuaWwDCQAAAgUCZ28FAmdvBAJncAQCZ3EDCQAAAgUEdGhpcwUCYm0AAAUCY0sEAmdyAwkAAAIJAQJicgEFAmZXBQJiQgYHAwUCZ3IJAJQKAgkBAS0BCQBkAgUCZ2YFAmdxAAAJAJQKAgAACQEBLQEJAGQCBQJnZgUCZ3EEAmZjCAUCZ3ACXzEEAmZkCAUCZ3ACXzIEAmdzCQECZmIDBQJmYwUCZmQAAAQCZ3QIBQJncwJfMQQCZVMIBQJncwJfMgQCZ3UJAQJmZgIFAmZhBQJlUwMJAAACBQJndQUCZ3UJAJQKAgkAzggCBQJkTQUCZ3QFAmdnCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJndgAEAmd3CQECYVMABAJhUQkAnQgCBQJndwkBAmFhAAMJAAECBQJhUQIGU3RyaW5nBAJhVgUCYVEJANkEAQUCYVYDCQABAgUCYVECBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACZ3gJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAECZ3kBAmRhBAJhUQkBAmd2AAMJAAECBQJhUQIKQnl0ZVZlY3RvcgQCZ3oFAmFRCQAAAggFAmRhD2NhbGxlclB1YmxpY0tleQUCZ3oDCQABAgUCYVECBFVuaXQJAAACCAUCZGEGY2FsbGVyBQR0aGlzCQACAQILTWF0Y2ggZXJyb3IBAmdBAQJkYQQCYVEJAQJndgADCQABAgUCYVECCkJ5dGVWZWN0b3IEAmd6BQJhUQMJAAACCAUCZGEPY2FsbGVyUHVibGljS2V5BQJnegYFAmd4AwkAAQIFAmFRAgRVbml0AwkAAAIIBQJkYQZjYWxsZXIFBHRoaXMGBQJneAkAAgECC01hdGNoIGVycm9yAQJnQgMCZ0MCZUMCZ0QEAmJ2CQECYm4ABAJkdQkAkQMCBQJidgUBeAQCZHYJAJEDAgUCYnYFAXkEAmVEBQFnBAJlRgkApwMBBQFtBAJhUgkAuQICCQCnAwEFAmJqBQJlRgQCY00DCQAAAgUCZ0MHCQDMCAIJALcCAgkAtgIBCQECY2EBBQJkdQUCZ0QJAMwIAgkAtgIBCQECY2EBBQJkdgUDbmlsCQDMCAIJALcCAgkAtgIBCQECY2EBBQJkdgUCZ0QJAMwIAgkAtgIBCQECY2EBBQJkdQUDbmlsBAJlRQkAkQMCBQJjTQAABAJhVgUCZUUEAmNQCQC5AgIFAmFSBQJlRAQCZUcJALoCAgkAuQICCQC5AgIJALoCAgkAuQICBQJlQwUCZUMJALkCAgUCZUUFAmVEBQJlQwUCZUYJALkCAgUCY1AFAmVEBAJlSAkAuAICCQC3AgIFAmFWCQC6AgIJALkCAgUCZUMFAmVGBQJjUAUCZUMKAQJjWQICY1oCZUkEAmdFBQJjWgQCZUsIBQJnRQJfMQQCZG4IBQJnRQJfMgMJAQIhPQIFAmRuBQR1bml0BQJjWgQCZUwJALoCAgkAtwICCQC5AgIFAmVLBQJlSwUCZUcJALcCAgkAuQICBQFnBQJlSwUCZUgEAmVNCQEBWQEJALgCAgUCZUwJAQV2YWx1ZQEFAmVLAwkAwAICBQFmBQJlTQkAlAoCBQJlTAUCZUkJAJQKAgUCZUwFBHVuaXQEAmRlCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOBQNuaWwEAmdGCgACZGcFAmRlCgACZGgJAJADAQUCZGcKAAJkaQkAlAoCBQJlQwUEdW5pdAoBAmRqAgJkawJkbAMJAGcCBQJkbAUCZGgFAmRrCQECY1kCBQJkawkAkQMCBQJkZwUCZGwKAQJkbQICZGsCZGwDCQBnAgUCZGwFAmRoBQJkawkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQECZG0CCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCCQECZGoCBQJkaQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAJlSwgFAmdGAl8xBAJkbggFAmdGAl8yAwkBAiE9AgUCZG4FBHVuaXQFAmVLCQACAQkArAICAhlZIGNhbGN1bGF0aW9uIGVycm9yLCBZID0gCQCmAwEFAmVLAQJnRwAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUCYVUJAQJhSAEJAKUIAQUEdGhpcwcbAmRhASFjYWxjdWxhdGVBbW91bnRPdXRGb3JTd2FwUkVBRE9OTFkDAmdIAmdDAmdJBAJnSgMJAAACBQJnQwcEAmdLCQECYVcCBQR0aGlzCQECYWwABAJnRAkAtwICCQC2AgEJAQJjYQEJAQJhVwIFBHRoaXMJAQJhawAJALYCAQUCZ0gJAJQKAgUCZ0sFAmdEBAJnSwkBAmFXAgUEdGhpcwkBAmFrAAQCZ0QJALcCAgkAtgIBCQECY2EBCQECYVcCBQR0aGlzCQECYWwACQC2AgEFAmdICQCUCgIFAmdLBQJnRAQCZ0sIBQJnSgJfMQQCZ0QIBQJnSgJfMgQCYnYJAQJibgAEAmR1CQCRAwIFAmJ2BQF4BAJkdgkAkQMCBQJidgUBeQQCY00JAMwIAgkAtgIBCQECY2EBBQJkdQkAzAgCCQC2AgEJAQJjYQEFAmR2BQNuaWwEAmVDCQECY0wBBQJjTQQCZUsJAQJnQgMFAmdDBQJlQwkAtgIBBQJnSAQCZ0wJALgCAgkAuAICCQC2AgEJAQJjYQEFAmdLBQJlSwkAtgIBAAEEAmdNCQCWAwEJAMwIAgAACQDMCAIJAKADAQUCZ0wFA25pbAQCZ04DCQAAAgUCZ0MHCQDMCAIJALcCAgkAtwICCQC2AgEJAQJjYQEFAmR1CQC2AgEFAmdICQC2AgEFAmdJCQDMCAIJALgCAgkAtgIBCQECY2EBBQJkdgUCZ0wFA25pbAkAzAgCCQC4AgIJALYCAQkBAmNhAQUCZHUFAmdMCQDMCAIJALcCAgkAtwICCQC2AgEJAQJjYQEFAmR2CQC2AgEFAmdICQC2AgEFAmdJBQNuaWwEAmdPCQECY0wBBQJnTgQCZWgDCQDAAgIFAmdPBQJlQwYJAAIBCQC5CQIJAMwIAgIUbmV3IEQgaXMgZmV3ZXIgZXJyb3IJAMwIAgkApgMBBQJlQwkAzAgCCQCmAwEFAmdPBQNuaWwCAl9fAwkAAAIFAmVoBQJlaAkAlAoCBQNuaWwFAmdNCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRhASZjYWxjdWxhdGVBbW91bnRPdXRGb3JTd2FwQW5kU2VuZFRva2VucwUCZ0gCZ0MCZ1ACZ1ECZ0kEAmdSCgACYmUJAPwHBAUCYVUCF2dldFN3YXBDb250cmFjdFJFQURPTkxZBQNuaWwFA25pbAMJAAECBQJiZQIGU3RyaW5nBQJiZQkAAgEJAKwCAgkAAwEFAmJlAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcEAmdTCgACYmUJAPwHBAUCYVUCGmlzUG9vbFN3YXBEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYmUCB0Jvb2xlYW4FAmJlCQACAQkArAICCQADAQUCYmUCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmdUAwkBASEBCQECYmkBCAUCZGEGY2FsbGVyAwMJAQJiawAGCQAAAgUCYnoFAXQGBQJnUwcEAmdVCQDMCAIDAwkBASEBBQJnVAYJAQJneQEFAmRhBgkBAmJhAQIic3dhcCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAZwIICQEFdmFsdWUBCQCRAwIIBQJkYQhwYXltZW50cwAABmFtb3VudAUCZ0gGCQECYmEBAgxXcm9uZyBhbW91bnQJAMwIAgMJAAACCAUCZGEGY2FsbGVyCQERQGV4dHJOYXRpdmUoMTA2MikBBQJnUgYJAQJiYQECEVBlcm1pc3Npb24gZGVuaWVkBQNuaWwDCQAAAgUCZ1UFAmdVBAJmdAkBBXZhbHVlAQkAkQMCCAUCZGEIcGF5bWVudHMAAAQCZ1YJAQJidAEIBQJmdAdhc3NldElkBAJnVwMJAAACBQJnQwcEAmdLCQECYVcCBQR0aGlzCQECYWwABAJnRAkAZQIJAQJjYQEFAmdWCAkBBXZhbHVlAQkAkQMCCAUCZGEIcGF5bWVudHMAAAZhbW91bnQJAJQKAgUCZ0sFAmdEBAJnSwkBAmFXAgUEdGhpcwkBAmFrAAQCZ0QJAGUCCQECY2EBBQJnVggJAQV2YWx1ZQEJAJEDAggFAmRhCHBheW1lbnRzAAAGYW1vdW50CQCUCgIFAmdLBQJnRAQCZ0sIBQJnVwJfMQQCZ0QIBQJnVwJfMgQCYnYJAQJibgAEAmR1CQCRAwIFAmJ2BQF4BAJkdgkAkQMCBQJidgUBeQQCY00DCQAAAgUCZ0MHCQDMCAIJALgCAgkAtgIBCQECY2EBBQJkdQkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCZGEIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkAtgIBCQECY2EBBQJkdgUDbmlsCQDMCAIJALYCAQkBAmNhAQUCZHUJAMwIAgkAuAICCQC2AgEJAQJjYQEFAmR2CQC2AgEICQEFdmFsdWUBCQCRAwIIBQJkYQhwYXltZW50cwAABmFtb3VudAUDbmlsBAJlQwkBAmNMAQUCY00EAmVLCQECZ0IDBQJnQwUCZUMJALYCAQAABAJnTAkAuAICCQC4AgIJALYCAQkBAmNhAQUCZ0sFAmVLCQC2AgEAAQQCZ00JAJYDAQkAzAgCAAAJAMwIAgkAoAMBBQJnTAUDbmlsBAJnWAMJAGcCBQJnTQUCZ1AGCQACAQIsRXhjaGFuZ2UgcmVzdWx0IGlzIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQDCQAAAgUCZ1gFAmdYBAJnTgMJAAACBQJnQwcJAMwIAgkAtwICCQC2AgEJAQJjYQEFAmR1CQC2AgEFAmdJCQDMCAIJALgCAgkAtgIBCQECY2EBBQJkdgUCZ0wFA25pbAkAzAgCCQC4AgIJALYCAQkBAmNhAQUCZHUFAmdMCQDMCAIJALcCAgkAtgIBCQECY2EBBQJkdgkAtgIBBQJnSQUDbmlsBAJnTwkBAmNMAQUCZ04EAmVoAwkAwAICBQJnTwUCZUMGCQACAQIUbmV3IEQgaXMgZmV3ZXIgZXJyb3IDCQAAAgUCZWgFAmVoBAJmYwMFAmdDCQEBLQEFAmdNBQJnSQQCZmQDBQJnQwUCZ0kJAQEtAQUCZ00EAmd0CAkBAmZiAwUCZmMFAmZkAAACXzEDCQAAAgUCZ3QFAmd0CQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUCZ1EFAmdNCQECYnIBBQJnSwUDbmlsBQJnTQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkYQELY29uc3RydWN0b3IBAVoEAmVHCQECZ0EBBQJkYQMJAAACBQJlRwUCZUcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVoABQFaBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGEBA3B1dAICZ1kCZ1oEAmhhCQECYkYABAJoYgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCaGEFAUQCCldyIHN0IGFkZHIEAmhjCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJoYQUBRgIKV3Igc2wgYWRkcgMJAGYCAAAFAmdZCQACAQIOV3Jvbmcgc2xpcHBhZ2UDCQECIT0CCQCQAwEIBQJkYQhwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAJoZAkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCZGEIcGF5bWVudHMAAAZhbW91bnQEAmhlCQC2AgEICQEFdmFsdWUBCQCRAwIIBQJkYQhwYXltZW50cwABBmFtb3VudAQCZVgJALgCAgkAtgIBCQECY2EBCQECYnQBBQJiQgUCaGQDCQAAAgUCZVgFAmVYBAJlWQkAuAICCQC2AgEJAQJjYQEJAQJidAEFAmJDBQJoZQMJAAACBQJlWQUCZVkEAmVaCQC2AgEICQEFdmFsdWUBCQDsBwEFAmJBCHF1YW50aXR5AwkAAAIFAmVaBQJlWgQCZmEJAQJlVAMFAmhkBQJoZQkAtgIBAAADCQAAAgUCZmEFAmZhBAJoZgkBAmZ2CgkApQgBCAUCZGEGY2FsbGVyCQDYBAEIBQJkYQ10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAmRhCHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAmRhCHBheW1lbnRzAAAGYW1vdW50CQCRAwIIBQJkYQhwYXltZW50cwABBQJnWQYHBgAAAgAEAmV1CAUCaGYCXzIEAmhnCAUCaGYCXzcEAmRNCAUCaGYCXzkEAmV2CAUCaGYDXzEwBAJldwgFAmhmA18xMQQCZHUIBQJoZgNfMTIEAmR2CAUCaGYDXzEzBAJlZwkA/AcEBQJhVQIEZW1pdAkAzAgCBQJldQUDbmlsBQNuaWwDCQAAAgUCZWcFAmVnBAJoaAQCYVEFAmVnAwkAAQIFAmFRAgdBZGRyZXNzBAJoaQUCYVEJAPwHBAUCaGkCBGVtaXQJAMwIAgUCZXUFA25pbAUDbmlsBQR1bml0AwkAAAIFAmhoBQJoaAQCaGoDCQBmAgUCZXYAAAkA/AcEBQJoYwIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmR1BQJldgUDbmlsBQNuaWwDCQAAAgUCaGoFAmhqBAJoawMJAGYCBQJldwAACQD8BwQFAmhjAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZHYFAmV3BQNuaWwFA25pbAMJAAACBQJoawUCaGsEAmhsAwUCZ1oEAmhtCQD8BwQFAmhiAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJoZwUCZXUFA25pbAMJAAACBQJobQUCaG0FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCZGEGY2FsbGVyBQJldQUCaGcFA25pbAQCaG4JAQJmYgMAAAAAAAAEAmd0CAUCaG4CXzEEAmVTCAUCaG4CXzIEAmhvAwkAwAICBQJlUwUCZmEGCQECYmEBCQC5CQIJAMwIAgIidXBkYXRlZCBETHAgbG93ZXIgdGhhbiBjdXJyZW50IERMcAkAzAgCCQCmAwEFAmVYCQDMCAIJAKYDAQUCZVkJAMwIAgkApgMBBQJlWgkAzAgCCQCmAwEFAmZhCQDMCAIJAKYDAQUCZVMJAMwIAgkApAMBBQJldgkAzAgCCQCkAwEFAmV3BQNuaWwCASADCQAAAgUCaG8FAmhvBAJocAgJAQV2YWx1ZQEJAOwHAQUCYkEIcXVhbnRpdHkDCQAAAgUCaHAFAmhwCQDOCAIJAM4IAgUCZE0FAmhsBQJndAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkYQELcHV0T25lVGtuVjICAmZYAmdaBAJocQoAAmJlCQD8BwQFAmFVAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYmUCB0Jvb2xlYW4FAmJlCQACAQkArAICCQADAQUCYmUCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmZ6AwkBASEBCQECYmkBCAUCZGEGY2FsbGVyAwMDCQECYmsABgkAAAIFAmJ6BQFyBgkAAAIFAmJ6BQF0BgUCaHEHBAJnVQkAzAgCAwMJAQEhAQUCZnoGCQECZ3kBBQJkYQYJAQJiYQECIXB1dCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmRhCHBheW1lbnRzAAEGCQECYmEBAh5leGFjdGx5IDEgcGF5bWVudCBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQJnVQUCZ1UEAmR1CQDYBAEJAQV2YWx1ZQEFAmJCBAJkdgkA2AQBCQEFdmFsdWUBBQJiQwQCZHQFAmJBBAJnYgUCYkQEAmdjBQJiRQQCZHMDCQAAAggFAmRhBmNhbGxlcgUEdGhpcwgFAmRhDG9yaWdpbkNhbGxlcggFAmRhBmNhbGxlcgQCZnQJAQV2YWx1ZQEJAJEDAggFAmRhCHBheW1lbnRzAAAEAmRxCQDYBAEJAQV2YWx1ZQEIBQJmdAdhc3NldElkBAJkVwgFAmZ0BmFtb3VudAQCZmEDCQAAAggFAmZ0B2Fzc2V0SWQFAmJCCQECZVQDCQC2AgEFAmRXCQC2AgEAAAkAtgIBAAAJAQJlVAMJALYCAQAACQC2AgEFAmRXCQC2AgEAAAMJAAACBQJmYQUCZmEEAmhyCQECZkEFBQJkVwUCZHEJAKUIAQUCZHMJANgEAQgFAmRhDXRyYW5zYWN0aW9uSWQGAwkAAAIFAmhyBQJocgQCY0sIBQJocgJfMwQCZE0IBQJocgJfMgQCaHMIBQJocgJfMQQCZXUDAwkAZgIFAmZYAAAJAGYCBQJmWAUCaHMHCQECYmEBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmZYBQNuaWwCAAUCaHMEAmhmCQD8BwQFAmFVAgRlbWl0CQDMCAIFAmV1BQNuaWwFA25pbAMJAAACBQJoZgUCaGYEAmhoBAJhUQUCaGYDCQABAgUCYVECB0FkZHJlc3MEAmhpBQJhUQkA/AcEBQJoaQIEZW1pdAkAzAgCBQJldQUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCaGgFAmhoBAJobAMFAmdaBAJobQkA/AcEBQJiSAIIc3Rha2VGb3IJAMwIAgkApQgBCAUCZGEGY2FsbGVyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmR0BQJldQUDbmlsAwkAAAIFAmhtBQJobQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJkYQZjYWxsZXIFAmV1BQJkdAUDbmlsBAJnbgMJAGYCBQJjSwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJtBQJjSwkA2QQBBQJkcQUDbmlsBQNuaWwEAmh0AwkAAAIFBHRoaXMFAmJtCQCUCgIAAAAABAJodQMJAAACCAUCZnQHYXNzZXRJZAUCYkIGBwMFAmh1CQCUCgIJAQEtAQUCY0sAAAkAlAoCAAAJAQEtAQUCY0sEAmZjCAUCaHQCXzEEAmZkCAUCaHQCXzIEAmh2CQECZmIDBQJmYwUCZmQAAAQCZ3QIBQJodgJfMQQCZVMIBQJodgJfMgQCZ3UJAQJmZgIFAmZhBQJlUwMJAAACBQJndQUCZ3UJAJQKAgkAzggCCQDOCAIJAM4IAgUCZE0FAmhsBQJnbgUCZ3QFAmV1CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRhAQpwdXRGb3JGcmVlAQJodwMJAGYCAAAFAmh3CQACAQIKV3Jvbmcgc2xwZwMJAQIhPQIJAJADAQgFAmRhCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmh4CQECZnYKCQClCAEIBQJkYQZjYWxsZXIJANgEAQgFAmRhDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZGEIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZGEIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmRhCHBheW1lbnRzAAEFAmh3BwcGAAACAAQCZE0IBQJoeAJfOQQCaGQJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmRhCHBheW1lbnRzAAAGYW1vdW50BAJoZQkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCZGEIcGF5bWVudHMAAQZhbW91bnQEAmZhCQECZVQDBQJoZAUCaGUJALYCAQAAAwkAAAIFAmZhBQJmYQQCaHkJAQJmYgMAAAAAAAAEAmd0CAUCaHkCXzEEAmVTCAUCaHkCXzIEAmd1CQECZmYCBQJmYQUCZVMDCQAAAgUCZ3UFAmd1CQDOCAIFAmRNBQJndAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkYQEDZ2V0AAQCZmEJAQJlVAMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUCZmEFAmZhBAJlZwkBAmZzAQUCZGEEAmh6CAUCZWcCXzEEAmRMCAUCZWcCXzIEAmRXCAUCZWcCXzMEAmRxCAUCZWcCXzQEAmRNCAUCZWcCXzUEAmVICQD8BwQFAmFVAgRidXJuCQDMCAIFAmRXBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmRxBQJkVwUDbmlsAwkAAAIFAmVIBQJlSAQCaEEJAQJmYgMJAQEtAQUCaHoJAQEtAQUCZEwAAAQCZ3QIBQJoQQJfMQQCZVMIBQJoQQJfMgQCZ3UJAQJmZgIFAmZhBQJlUwMJAAACBQJndQUCZ3UJAM4IAgUCZE0FAmd0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRhAQtnZXRPbmVUa25WMgICZlcCZlgEAmhxCgACYmUJAPwHBAUCYVUCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJiZQIHQm9vbGVhbgUCYmUJAAIBCQCsAgIJAAMBBQJiZQIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZnUDCQEBIQEJAQJiaQEIBQJkYQZjYWxsZXIDAwkBAmJrAAYJAAACBQJiegUBdAYFAmhxBwQCZ1UJAMwIAgMDCQEBIQEFAmZ1BgkBAmd5AQUCZGEGCQECYmEBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJkYQhwYXltZW50cwABBgkBAmJhAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ1UFAmdVBAJoQgkBAmZWBgUCZlcFAmZYCAUCZGEIcGF5bWVudHMIBQJkYQZjYWxsZXIIBQJkYQxvcmlnaW5DYWxsZXIIBQJkYQ10cmFuc2FjdGlvbklkBAJkTQgFAmhCAl8xBAJnZwgFAmhCAl8yCQCUCgIFAmRNBQJnZwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkYQEKcmVmcmVzaERMcAAEAmhDCQELdmFsdWVPckVsc2UCCQCfCAEFAmF0AAAEAmhEAwkAZwIJAGUCBQZoZWlnaHQFAmhDBQJhdwUEdW5pdAkBAmJhAQkAuQkCCQDMCAIJAKQDAQUCYXcJAMwIAgIvIGJsb2NrcyBoYXZlIG5vdCBwYXNzZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwFA25pbAIAAwkAAAIFAmhEBQJoRAQCZm0JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAqAMBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAmFzAgEwCQECYmMBAgtpbnZhbGlkIGRMcAQCaEUJAQJmYgMAAAAAAAAEAmhGCAUCaEUCXzEEAmVTCAUCaEUCXzIEAmZlAwkBAiE9AgUCZm0FAmVTBQJoRgkBAmJhAQISbm90aGluZyB0byByZWZyZXNoCQCUCgIFAmZlCQCmAwEFAmVTCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRhARNnZXRPbmVUa25WMlJFQURPTkxZAgJmVwJoRwQCZHUJANgEAQkBBXZhbHVlAQUCYkIEAmR2CQDYBAEJAQV2YWx1ZQEFAmJDBAJkdAkA2AQBCQEFdmFsdWUBBQJiQQQCY00JAMwIAgkAtgIBCQECY2EBBQJkdQkAzAgCCQC2AgEJAQJjYQEFAmR2BQNuaWwEAmVSCQC2AgEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJkdAIQaW52YWxpZCBscCBhc3NldAhxdWFudGl0eQQCY28JAQJjTAEFAmNNBAJjbgkAuAICBQJjbwkAvAIDCQC2AgEFAmhHBQJjbwUCZVIEAmhIAwkAAAIFAmZXBQJkdQAAAwkAAAIFAmZXBQJkdgABCQACAQIUaW52YWxpZCBvdXQgYXNzZXQgaWQEAmhJCQECZUIDBQJjTQUCaEgFAmNuBAJnTAkAuAICCQCRAwIFAmNNBQJoSAUCaEkEAmdNCQCWAwEJAMwIAgAACQDMCAIJAKADAQkAuAICBQJnTAUBZgUDbmlsBAJoSgkBAmNJAgUCZ00FAmJmBAJnZggFAmhKAl8xBAJjSwgFAmhKAl8yCQCUCgIFA25pbAkAlAoCBQJnZgUCY0sCZGEBHGdldE9uZVRrblYyV2l0aEJvbnVzUkVBRE9OTFkCAmZXAmhHBAJkdQkA2AQBCQEFdmFsdWUBBQJiQgQCZHYJANgEAQkBBXZhbHVlAQUCYkMEAmR0CQDYBAEJAQV2YWx1ZQEFAmJBBAJkQQkBAmNhAQUCZHUEAmRDCQECY2EBBQJkdgQCaEsKAAJiZQkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmZXCQDMCAIFAmhHBQNuaWwFA25pbAMJAAECBQJiZQIKKEludCwgSW50KQUCYmUJAAIBCQCsAgIJAAMBBQJiZQIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQQCZ2YIBQJoSwJfMQQCY0sIBQJoSwJfMgQCZWcJAQJkbwQCAAUCZHQFAmhHBQR0aGlzBAJkSwgFAmVnAl8xBAJkTAgFAmVnAl8yBAJoTAkAZAIFAmRLBQJkTAQCZlUDCQAAAgUCaEwAAAMJAAACBQJnZgAAAAAJAAIBAhdib251cyBjYWxjdWxhdGlvbiBlcnJvcgkAawMJAGUCBQJnZgUCaEwFAWEFAmhMCQCUCgIFA25pbAkAlQoDBQJnZgUCY0sFAmZVAmRhAQlnZXROb0xlc3MCAmhNAmhOBAJlZwkBAmZzAQUCZGEEAmRLCAUCZWcCXzEEAmRMCAUCZWcCXzIEAmRXCAUCZWcCXzMEAmRxCAUCZWcCXzQEAmRNCAUCZWcCXzUDCQBmAgUCaE0FAmRLCQACAQkArAICCQCsAgIJAKwCAgIJRmFpbGVkOiAgCQCkAwEFAmRLAgMgPCAJAKQDAQUCaE0DCQBmAgUCaE4FAmRMCQACAQkArAICCQCsAgIJAKwCAgIIRmFpbGVkOiAJAKQDAQUCZEwCAyA8IAkApAMBBQJoTgQCZmEJAQJlVAMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUCZmEFAmZhBAJoTwkA/AcEBQJhVQIEYnVybgkAzAgCBQJkVwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJkcQUCZFcFA25pbAMJAAACBQJoTwUCaE8EAmhQCQECZmIDCQEBLQEFAmRLCQEBLQEFAmRMAAAEAmd0CAUCaFACXzEEAmVTCAUCaFACXzIEAmd1CQECZmYCBQJmYQUCZVMDCQAAAgUCZ3UFAmd1CQDOCAIFAmRNBQJndAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkYQENdW5zdGFrZUFuZEdldAECY0oEAmhRAwkBAiE9AgkAkAMBCAUCZGEIcGF5bWVudHMAAAkAAgECDU5vIHBtbnRzIGV4cGQGAwkAAAIFAmhRBQJoUQQCaFIJAQJiRgAEAmhnBQJiQQQCaFMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmhSBQFEAgpXciBzdCBhZGRyBAJmYQkBAmVUAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQJmYQUCZmEEAmhUCQD8BwQFAmhTAgd1bnN0YWtlCQDMCAIJANgEAQUCaGcJAMwIAgUCY0oFA25pbAUDbmlsAwkAAAIFAmhUBQJoVAQCZWcJAQJkbwQJANgEAQgFAmRhDXRyYW5zYWN0aW9uSWQJANgEAQUCaGcFAmNKCAUCZGEGY2FsbGVyBAJkSwgFAmVnAl8xBAJkTAgFAmVnAl8yBAJkeQkBDXBhcnNlSW50VmFsdWUBCAUCZWcCXzkEAmRNCAUCZWcDXzEwBAJmdQMJAQEhAQkBAmJpAQgFAmRhBmNhbGxlcgMJAQJiawAGCQAAAgUCYnoFAXQHBAJoVQMFAmZ1CQACAQkArAICAglCbG9ja2VkOiAJAKQDAQUCZHkGAwkAAAIFAmhVBQJoVQQCaFYJAPwHBAUCYVUCBGJ1cm4JAMwIAgUCY0oFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCaGcFAmNKBQNuaWwDCQAAAgUCaFYFAmhWBAJoVwkBAmZiAwkBAS0BBQJkSwkBAS0BBQJkTAAABAJndAgFAmhXAl8xBAJlUwgFAmhXAl8yBAJndQkBAmZmAgUCZmEFAmVTAwkAAAIFAmd1BQJndQkAzggCBQJkTQUCZ3QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGEBE3Vuc3Rha2VBbmRHZXROb0xlc3MDAmhYAmhZAmhOBAJmdQMJAQEhAQkBAmJpAQgFAmRhBmNhbGxlcgMJAQJiawAGCQAAAgUCYnoFAXQHBAJnVQkAzAgCAwkBASEBBQJmdQYJAAIBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJkYQhwYXltZW50cwAABgkAAgECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmdVBQJnVQQCZmEJAQJlVAMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUCZmEFAmZhBAJoVAkA/AcEBQJiSAIHdW5zdGFrZQkAzAgCCQDYBAEFAmJBCQDMCAIFAmhYBQNuaWwFA25pbAMJAAACBQJoVAUCaFQEAmhaCQECZG8ECQDYBAEIBQJkYQ10cmFuc2FjdGlvbklkCQDYBAEFAmJBBQJoWAgFAmRhBmNhbGxlcgQCZEsIBQJoWgJfMQQCZEwIBQJoWgJfMgQCZE0IBQJoWgNfMTAEAmlhCQDMCAIDCQBnAgUCZEsFAmhZBgkAAgEJALkJAgkAzAgCAixhbW91bnQgYXNzZXQgYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmhZBQNuaWwCAAkAzAgCAwkAZwIFAmRMBQJoTgYJAAIBCQC5CQIJAMwIAgIrcHJpY2UgYXNzZXQgYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmhOBQNuaWwCAAUDbmlsAwkAAAIFAmlhBQJpYQQCaE8JAPwHBAUCYVUCBGJ1cm4JAMwIAgUCaFgFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYkEFAmhYBQNuaWwDCQAAAgUCaE8FAmhPBAJpYgkBAmZiAwkBAS0BBQJkSwkBAS0BBQJkTAAABAJndAgFAmliAl8xBAJlUwgFAmliAl8yBAJndQkBAmZmAgUCZmEFAmVTAwkAAAIFAmd1BQJndQkAzggCBQJkTQUCZ3QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGEBFXVuc3Rha2VBbmRHZXRPbmVUa25WMgMCaFgCZlcCZlgEAmhxCgACYmUJAPwHBAUCYVUCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJiZQIHQm9vbGVhbgUCYmUJAAIBCQCsAgIJAAMBBQJiZQIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZnUDCQEBIQEJAQJiaQEIBQJkYQZjYWxsZXIDAwkBAmJrAAYJAAACBQJiegUBdAYFAmhxBwQCZ1UJAMwIAgMDCQEBIQEFAmZ1BgkBAmd5AQUCZGEGCQECYmEBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJkYQhwYXltZW50cwAABgkBAmJhAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ1UFAmdVBAJoUgkBAmJGAAQCaGcFAmJBBAJoUwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCaFIFAUQCCldyIHN0IGFkZHIEAmRzCAUCZGEGY2FsbGVyBAJpYwUEdGhpcwQCaFQJAPwHBAUCaFMCD3Vuc3Rha2VJTlRFUk5BTAkAzAgCBQJoZwkAzAgCBQJoWAkAzAgCCAUCZHMFYnl0ZXMJAMwIAggFAmljBWJ5dGVzBQNuaWwFA25pbAMJAAACBQJoVAUCaFQEAmlkCQECZlYGBQJmVwUCZlgJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmhnBQJoWAUDbmlsCAUCZGEGY2FsbGVyCAUCZGEMb3JpZ2luQ2FsbGVyCAUCZGENdHJhbnNhY3Rpb25JZAQCZE0IBQJpZAJfMQQCZ2cIBQJpZAJfMgkAlAoCBQJkTQUCZ2cJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGEBHHB1dE9uZVRrblYyV2l0aEJvbnVzUkVBRE9OTFkCAmllAmlmBAJpZwkBAmZBBQUCaWUFAmlmAgACAAYEAmZQCAUCaWcCXzEEAmRNCAUCaWcCXzIEAmNLCAUCaWcCXzMEAmZVCAUCaWcCXzQJAJQKAgUDbmlsCQCVCgMFAmZQBQJjSwUCZlUCZGEBIXB1dE9uZVRrblYyV2l0aG91dFRha2VGZWVSRUFET05MWQICaWUCaWYEAmloCQECZkEFBQJpZQUCaWYCAAIABwQCZlAIBQJpaAJfMQQCZE0IBQJpaAJfMgQCY0sIBQJpaAJfMwQCZlUIBQJpaAJfNAkAlAoCBQNuaWwJAJUKAwUCZlAFAmNLBQJmVQJkYQEIYWN0aXZhdGUCAmlpAmlqAwkBAiE9AgkApQgBCAUCZGEGY2FsbGVyCQClCAEFAmFVCQACAQIGZGVuaWVkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFrAAUCaWkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFsAAUCaWoJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFtAAkApAMBBQFsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhbgEFBmhlaWdodAkApAMBBQFsBQNuaWwCB3N1Y2Nlc3MCZGEBHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkACQCUCgIFA25pbAkBAmJuAAJkYQEcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQECY2IJAJQKAgUDbmlsCQECY2EBBQJjYgJkYQEZY2FsY1ByaWNlc1dyYXBwZXJSRUFET05MWQMCY3UCY3YCY3oEAmlrCQECY3kDBQJjdQUCY3YFAmN6CQCUCgIFA25pbAkAzAgCCQCmAwEJAJEDAgUCaWsAAAkAzAgCCQCmAwEJAJEDAgUCaWsAAQkAzAgCCQCmAwEJAJEDAgUCaWsAAgUDbmlsAmRhARZmcm9tWDE4V3JhcHBlclJFQURPTkxZAgFOAmlsCQCUCgIFA25pbAkBAU0CCQCnAwEFAU4FAmlsAmRhARR0b1gxOFdyYXBwZXJSRUFET05MWQIBSgFLCQCUCgIFA25pbAkApgMBCQEBSQIFAUoFAUsCZGEBHmNhbGNQcmljZUJpZ0ludFdyYXBwZXJSRUFET05MWQICY2QCY2UJAJQKAgUDbmlsCQCmAwEJAQJjYwIJAKcDAQUCY2QJAKcDAQUCY2UCZGEBI2VzdGltYXRlUHV0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZCQJkcAJjagJkTwJkUAJkUQJkUgJpbQJkUwJkVAkAlAoCBQNuaWwJAQJkTg0FAmRwBQJjagUCZE8FAmRQBQJkUQUCZFIFAmltBQJkUwUCZFQGBwAAAgACZGEBI2VzdGltYXRlR2V0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZBAJkcAJpbgJkcgJpbQQCZWcJAQJkbwQFAmRwBQJpbgUCZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmltCQCUCgIFA25pbAkAnAoKCAUCZWcCXzEIBQJlZwJfMggFAmVnAl8zCAUCZWcCXzQIBQJlZwJfNQgFAmVnAl82CAUCZWcCXzcJAKYDAQgFAmVnAl84CAUCZWcCXzkIBQJlZwNfMTACZGEBCWNoYW5nZUFtcAAEAmlvCQD8BwQFAmFVAhpnZXRDaGFuZ2VBbXBDb25maWdSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsBAJpcAQCYVEFAmlvAwkAAQIFAmFRAglMaXN0W0FueV0EAmlxBQJhUQkAlQoDCgACYmUJAJEDAgUCaXEAAAMJAAECBQJiZQIDSW50BQJiZQkAAgEJAKwCAgkAAwEFAmJlAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAJiZQkAkQMCBQJpcQABAwkAAQIFAmJlAgNJbnQFAmJlCQACAQkArAICCQADAQUCYmUCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAmJlCQCRAwIFAmlxAAIDCQABAgUCYmUCA0ludAUCYmUJAAIBCQCsAgIJAAMBBQJiZQIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQECYmEBAhJpbnZhbGlkIGVudHJ5IHR5cGUEAmlyCAUCaXACXzEEAmlzCAUCaXACXzIEAml0CAUCaXACXzMEAml1CQENcGFyc2VJbnRWYWx1ZQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAQJhbQAEAml2CQBkAgUCaXUFAmlzBAJpdwMJAGYCAAAFAmlzAwkAZgIFAml0BQJpdgUCaXQFAml2AwkAZgIFAml2BQJpdAUCaXQFAml2BAJpeAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQECYXAAAAAEAml5CQBkAgUCaXgFAmlyBAJnVQkAzAgCAwkAZgIFBmhlaWdodAUCaXkGCQECYmEBAhd0cnkgYWdhaW4gaW4gZmV3IGJsb2NrcwkAzAgCAwkBAiE9AgUCaXUFAml3BgkBAmJhAQIWYWxyZWFkeSByZWFjaGVkIHRhcmdldAUDbmlsAwkAAAIFAmdVBQJnVQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFwAAUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhbQAJAKQDAQUCaXcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFuAQUGaGVpZ2h0CQCkAwEFAml3BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAml6AQJpQQAEAmlCBAJhUQkBAmd2AAMJAAECBQJhUQIKQnl0ZVZlY3RvcgQCZ3oFAmFRBQJnegMJAAECBQJhUQIEVW5pdAgFAml6D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yBAJhUQUCaXoDCQABAgUCYVECBU9yZGVyBAJmaQUCYVEEAmlDCQECYmwABAJpRAMJAQJnRwAJAJQKAgYCAAkBAmZoAQUCZmkEAmFLCAUCaUQCXzEEAmFMCAUCaUQCXzIEAmFNCQD0AwMIBQJmaQlib2R5Qnl0ZXMJAJEDAggFAmZpBnByb29mcwAACAUCZmkPc2VuZGVyUHVibGljS2V5BAJhTgkA9AMDCAUCZmkJYm9keUJ5dGVzCQCRAwIIBQJmaQZwcm9vZnMAAQUCaUMDAwMFAmFLBQJhTQcFAmFOBwYJAQJhSgQFAmFLBQJhTAUCYU0FAmFOAwkAAQIFAmFRAhRTZXRTY3JpcHRUcmFuc2FjdGlvbgQCYVYFAmFRAwkA9AMDCAUCaXoJYm9keUJ5dGVzCQCRAwIIBQJpegZwcm9vZnMAAAUCaUIGBAJpRQkA9gMBCQEFdmFsdWUBCAUCYVYGc2NyaXB0BAJpRgkA2wQBCQEFdmFsdWUBCQCdCAIFAmFVCQECYUYABAJpRwkA8QcBBQR0aGlzAwkAAAIFAmlGBQJpRQkBAiE9AgUCaUcFAmlFBwkA9AMDCAUCaXoJYm9keUJ5dGVzCQCRAwIIBQJpegZwcm9vZnMAAAUCaUIbQH/Q", "height": 3866905, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7ooebJMq5LKRdk45921hC51SmtEkw1FWTVFJZyAHvKi1 Next: DGxgzhaGyVSHxPutX3mgzHx1Gzb3BYqLk4sEeYRoqPnx Diff:
OldNewDifferences
229229 else throw(($getType(@) + " couldn't be cast to Int"))
230230 }
231231
232+func keyAddressWhitelisted (address) = makeString(["%s%s", "whitelisted", toString(address)], SEP)
233+
234+
235+func isAddressWhitelisted (address) = valueOrElse(getBoolean(fca, keyAddressWhitelisted(address)), false)
236+
237+
232238 let A = strf(this, amp())
233239
234240 func igs () = valueOrElse(getBoolean(fca, aps()), false)
263269
264270 let poolConfigParsed = parsePoolConfig(gpc())
265271
266-let $t086088794 = poolConfigParsed
272+let $t088369022 = poolConfigParsed
267273
268-let cfgPoolAddress = $t086088794._1
274+let cfgPoolAddress = $t088369022._1
269275
270-let cfgPoolStatus = $t086088794._2
276+let cfgPoolStatus = $t088369022._2
271277
272-let cfgLpAssetId = $t086088794._3
278+let cfgLpAssetId = $t088369022._3
273279
274-let cfgAmountAssetId = $t086088794._4
280+let cfgAmountAssetId = $t088369022._4
275281
276-let cfgPriceAssetId = $t086088794._5
282+let cfgPriceAssetId = $t088369022._5
277283
278-let cfgAmountAssetDecimals = $t086088794._6
284+let cfgAmountAssetDecimals = $t088369022._6
279285
280-let cfgPriceAssetDecimals = $t086088794._7
286+let cfgPriceAssetDecimals = $t088369022._7
281287
282288 func gfc () = split(strf(fca, fcfg()), SEP)
283289
398404 }
399405
400406 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
401- let $t01329913347 = {
407+ let $t01352713575 = {
402408 let $l = arr
403409 let $s = size($l)
404410 let $acc0 = $Tuple2(s, false)
412418
413419 $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)
414420 }
415- let d = $t01329913347._1
416- let found = $t01329913347._2
421+ let d = $t01352713575._1
422+ let found = $t01352713575._2
417423 if (found)
418424 then d
419425 else throw(("D calculation error, D = " + toString(d)))
547553 else calcLpAmt
548554 let amDiff = (inAmAmt - calcAmAssetPmt)
549555 let prDiff = (inPrAmt - calcPrAssetPmt)
550- let $t02110921454 = if (if (isOneAsset)
556+ let $t02133721682 = if (if (isOneAsset)
551557 then (pmtId == amIdStr)
552558 else false)
553559 then $Tuple2(pmtAmt, 0)
556562 else false)
557563 then $Tuple2(0, pmtAmt)
558564 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
559- let writeAmAmt = $t02110921454._1
560- let writePrAmt = $t02110921454._2
565+ let writeAmAmt = $t02133721682._1
566+ let writePrAmt = $t02133721682._2
561567 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))]
562568 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
563569 }
576582 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
577583 let b = ((s + ((D * aPrecision) / ann)) - D)
578584 func calc (acc,cur) = {
579- let $t02264922669 = acc
580- let y = $t02264922669._1
581- let found = $t02264922669._2
585+ let $t02287722897 = acc
586+ let y = $t02287722897._1
587+ let found = $t02287722897._2
582588 if ((found != unit))
583589 then acc
584590 else {
591597 }
592598
593599 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
594- let $t02297623023 = {
600+ let $t02320423251 = {
595601 let $l = arr
596602 let $s = size($l)
597603 let $acc0 = $Tuple2(D, unit)
605611
606612 $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)
607613 }
608- let y = $t02297623023._1
609- let found = $t02297623023._2
614+ let y = $t02320423251._1
615+ let found = $t02320423251._2
610616 if ((found != unit))
611617 then y
612618 else throw(("Y calculation error, Y = " + toString(y)))
650656 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
651657 let amountAssetAmount = order.amount
652658 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
653- let $t02522125433 = if ((order.orderType == Buy))
659+ let $t02544925661 = if ((order.orderType == Buy))
654660 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
655661 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
656- let amountAssetBalanceDelta = $t02522125433._1
657- let priceAssetBalanceDelta = $t02522125433._2
662+ let amountAssetBalanceDelta = $t02544925661._1
663+ let priceAssetBalanceDelta = $t02544925661._2
658664 if (if (if (igs())
659665 then true
660666 else (cfgPoolStatus == PoolMatcherDis))
667673 then throw("Wr assets")
668674 else {
669675 let dLp = parseBigIntValue(valueOrElse(getString(this, keyDLp), "0"))
670- let $t02577525875 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
671- let unusedActions = $t02577525875._1
672- let dLpNew = $t02577525875._2
676+ let $t02600326103 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
677+ let unusedActions = $t02600326103._1
678+ let dLpNew = $t02600326103._2
673679 let isOrderValid = (dLpNew >= dLp)
674680 let info = makeString(["dLp=", toString(dLp), " dLpNew=", toString(dLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
675681 $Tuple2(isOrderValid, info)
688694 let outPrAmt = r._2
689695 let sts = parseIntValue(r._9)
690696 let state = r._10
691- if (if (igs())
692- then true
693- else (sts == PoolShutdown))
697+ let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
698+ then if (igs())
699+ then true
700+ else (cfgPoolStatus == PoolShutdown)
701+ else false
702+ if (isGetDisabled)
694703 then throw(("Admin blocked: " + toString(sts)))
695704 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
696705 }
699708 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
700709 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
701710 let sts = parseIntValue(r._8)
702- if (if (if (igs())
703- then true
704- else (sts == PoolPutDis))
705- then true
706- else (sts == PoolShutdown))
711+ let isPutDisabled = if (!(isAddressWhitelisted(addressFromStringValue(caller))))
712+ then if (if (igs())
713+ then true
714+ else (cfgPoolStatus == PoolShutdown))
715+ then true
716+ else (cfgPoolStatus == PoolPutDis)
717+ else false
718+ if (isPutDisabled)
707719 then throw(("Blocked:" + toString(sts)))
708720 else r
709721 }
723735 then {
724736 let amBalance = getAccBalance(amId)
725737 let prBalance = getAccBalance(prId)
726- let $t02853128993 = if ((txId == ""))
738+ let $t02896229424 = if ((txId == ""))
727739 then $Tuple2(amBalance, prBalance)
728740 else if ((pmtAssetId == amId))
729741 then if ((pmtAmtRaw > amBalance))
734746 then throw("invalid payment amount")
735747 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
736748 else throw("wrong pmtAssetId")
737- let amBalanceOld = $t02853128993._1
738- let prBalanceOld = $t02853128993._2
739- let $t02899929175 = if ((pmtAssetId == amId))
749+ let amBalanceOld = $t02896229424._1
750+ let prBalanceOld = $t02896229424._2
751+ let $t02943029606 = if ((pmtAssetId == amId))
740752 then $Tuple2(pmtAmtRaw, 0)
741753 else if ((pmtAssetId == prId))
742754 then $Tuple2(0, pmtAmtRaw)
743755 else throw("invalid payment")
744- let amAmountRaw = $t02899929175._1
745- let prAmountRaw = $t02899929175._2
746- let $t02917929433 = if (withTakeFee)
756+ let amAmountRaw = $t02943029606._1
757+ let prAmountRaw = $t02943029606._2
758+ let $t02961029864 = if (withTakeFee)
747759 then $Tuple3(takeFee(amAmountRaw, inFee)._1, takeFee(prAmountRaw, inFee)._1, takeFee(pmtAmtRaw, inFee)._2)
748760 else $Tuple3(amAmountRaw, prAmountRaw, 0)
749- let amAmount = $t02917929433._1
750- let prAmount = $t02917929433._2
751- let feeAmount = $t02917929433._3
761+ let amAmount = $t02961029864._1
762+ let prAmount = $t02961029864._2
763+ let feeAmount = $t02961029864._3
752764 let amBalanceNew = (amBalanceOld + amAmount)
753765 let prBalanceNew = (prBalanceOld + prAmount)
754766 let D0 = getD([t1(amBalanceOld, cfgAmountAssetDecimals), t1(prBalanceOld, cfgPriceAssetDecimals)])
796808 else {
797809 let amBalance = getAccBalance(amId)
798810 let prBalance = getAccBalance(prId)
799- let $t03154531656 = {
811+ let $t03197632087 = {
800812 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
801813 if ($isInstanceOf(@, "(Int, Int)"))
802814 then @
803815 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
804816 }
805- if (($t03154531656 == $t03154531656))
817+ if (($t03197632087 == $t03197632087))
806818 then {
807- let feeAmount = $t03154531656._2
808- let totalGet = $t03154531656._1
819+ let feeAmount = $t03197632087._2
820+ let totalGet = $t03197632087._1
809821 let totalAmount = if (if ((minOutAmount > 0))
810822 then (minOutAmount > totalGet)
811823 else false)
812824 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
813825 else totalGet
814- let $t03184632153 = if ((outAssetId == amId))
826+ let $t03227732584 = if ((outAssetId == amId))
815827 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
816828 else if ((outAssetId == prId))
817829 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
818830 else throw("invalid out asset id")
819- let outAm = $t03184632153._1
820- let outPr = $t03184632153._2
821- let amBalanceNew = $t03184632153._3
822- let prBalanceNew = $t03184632153._4
831+ let outAm = $t03227732584._1
832+ let outPr = $t03227732584._2
833+ let amBalanceNew = $t03227732584._3
834+ let prBalanceNew = $t03227732584._4
823835 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
824836 let curPr = f1(curPrX18, scale8)
825837 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
834846 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
835847 if ((burn == burn))
836848 then {
837- let $t03293833288 = {
849+ let $t03336933719 = {
838850 let feeAmountForCalc = if ((this == feeCollectorAddress))
839851 then 0
840852 else feeAmount
845857 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
846858 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
847859 }
848- let amountAssetBalanceDelta = $t03293833288._1
849- let priceAssetBalanceDelta = $t03293833288._2
850- let $t03329133399 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
851- let refreshDLpActions = $t03329133399._1
852- let updatedDLp = $t03329133399._2
860+ let amountAssetBalanceDelta = $t03336933719._1
861+ let priceAssetBalanceDelta = $t03336933719._2
862+ let $t03372233830 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
863+ let refreshDLpActions = $t03372233830._1
864+ let updatedDLp = $t03372233830._2
853865 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
854866 if ((isUpdatedDLpValid == isUpdatedDLpValid))
855867 then $Tuple2((state ++ refreshDLpActions), totalAmount)
921933 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
922934 let b = ((s + ((D * aPrecision) / ann)) - D)
923935 func calc (acc,cur) = {
924- let $t03488634906 = acc
925- let y = $t03488634906._1
926- let found = $t03488634906._2
936+ let $t03531735337 = acc
937+ let y = $t03531735337._1
938+ let found = $t03531735337._2
927939 if ((found != unit))
928940 then acc
929941 else {
936948 }
937949
938950 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
939- let $t03523735284 = {
951+ let $t03566835715 = {
940952 let $l = arr
941953 let $s = size($l)
942954 let $acc0 = $Tuple2(D, unit)
950962
951963 $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)
952964 }
953- let y = $t03523735284._1
954- let found = $t03523735284._2
965+ let y = $t03566835715._1
966+ let found = $t03566835715._2
955967 if ((found != unit))
956968 then y
957969 else throw(("Y calculation error, Y = " + toString(y)))
963975
964976 @Callable(i)
965977 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
966- let $t03563636060 = if ((isReverse == false))
978+ let $t03606736491 = if ((isReverse == false))
967979 then {
968980 let assetOut = strf(this, pa())
969981 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, aa()))) + toBigInt(cleanAmountIn))
974986 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, pa()))) + toBigInt(cleanAmountIn))
975987 $Tuple2(assetOut, poolAmountInBalance)
976988 }
977- let assetOut = $t03563636060._1
978- let poolAmountInBalance = $t03563636060._2
989+ let assetOut = $t03606736491._1
990+ let poolAmountInBalance = $t03606736491._2
979991 let poolConfig = gpc()
980992 let amId = poolConfig[idxAmAsId]
981993 let prId = poolConfig[idxPrAsId]
10121024 then @
10131025 else throw(($getType(@) + " couldn't be cast to Boolean"))
10141026 }
1015- let isSwapDisabled = if (if (igs())
1016- then true
1017- else (cfgPoolStatus == PoolShutdown))
1018- then true
1019- else isPoolSwapDisabled
1027+ let isSwapDisabled = if (!(isAddressWhitelisted(i.caller)))
1028+ then if (if (igs())
1029+ then true
1030+ else (cfgPoolStatus == PoolShutdown))
1031+ then true
1032+ else isPoolSwapDisabled
1033+ else false
10201034 let checks = [if (if (!(isSwapDisabled))
10211035 then true
10221036 else isManager(i))
10301044 then {
10311045 let pmt = value(i.payments[0])
10321046 let assetIn = assetIdToString(pmt.assetId)
1033- let $t03779538189 = if ((isReverse == false))
1047+ let $t03826338657 = if ((isReverse == false))
10341048 then {
10351049 let assetOut = strf(this, pa())
10361050 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
10411055 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
10421056 $Tuple2(assetOut, poolAmountInBalance)
10431057 }
1044- let assetOut = $t03779538189._1
1045- let poolAmountInBalance = $t03779538189._2
1058+ let assetOut = $t03826338657._1
1059+ let poolAmountInBalance = $t03826338657._2
10461060 let poolConfig = gpc()
10471061 let amId = poolConfig[idxAmAsId]
10481062 let prId = poolConfig[idxPrAsId]
11581172 else throw("Strict value is not equal to itself.")
11591173 }
11601174 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1161- let $t04264442786 = refreshDLpInternal(0, 0, 0)
1162- let refreshDLpActions = $t04264442786._1
1163- let updatedDLp = $t04264442786._2
1175+ let $t04311243254 = refreshDLpInternal(0, 0, 0)
1176+ let refreshDLpActions = $t04311243254._1
1177+ let updatedDLp = $t04311243254._2
11641178 let check = if ((updatedDLp >= currentDLp))
11651179 then true
11661180 else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp), toString(amDiff), toString(prDiff)], " "))
12011215 then @
12021216 else throw(($getType(@) + " couldn't be cast to Boolean"))
12031217 }
1204- let isPutDisabled = if (if (if (igs())
1205- then true
1206- else (cfgPoolStatus == PoolPutDis))
1207- then true
1208- else (cfgPoolStatus == PoolShutdown))
1209- then true
1210- else isPoolOneTokenOperationsDisabled
1218+ let isPutDisabled = if (!(isAddressWhitelisted(i.caller)))
1219+ then if (if (if (igs())
1220+ then true
1221+ else (cfgPoolStatus == PoolPutDis))
1222+ then true
1223+ else (cfgPoolStatus == PoolShutdown))
1224+ then true
1225+ else isPoolOneTokenOperationsDisabled
1226+ else false
12111227 let checks = [if (if (!(isPutDisabled))
12121228 then true
12131229 else isManager(i))
12331249 else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
12341250 if ((currentDLp == currentDLp))
12351251 then {
1236- let $t04442744585 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1237- if (($t04442744585 == $t04442744585))
1252+ let $t04493245090 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1253+ if (($t04493245090 == $t04493245090))
12381254 then {
1239- let feeAmount = $t04442744585._3
1240- let state = $t04442744585._2
1241- let estimLP = $t04442744585._1
1255+ let feeAmount = $t04493245090._3
1256+ let state = $t04493245090._2
1257+ let estimLP = $t04493245090._1
12421258 let emitLpAmt = if (if ((minOutAmount > 0))
12431259 then (minOutAmount > estimLP)
12441260 else false)
12661282 let sendFeeToMatcher = if ((feeAmount > 0))
12671283 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
12681284 else nil
1269- let $t04547045819 = if ((this == feeCollectorAddress))
1285+ let $t04597546324 = if ((this == feeCollectorAddress))
12701286 then $Tuple2(0, 0)
12711287 else {
12721288 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
12761292 then $Tuple2(-(feeAmount), 0)
12771293 else $Tuple2(0, -(feeAmount))
12781294 }
1279- let amountAssetBalanceDelta = $t04547045819._1
1280- let priceAssetBalanceDelta = $t04547045819._2
1281- let $t04582245930 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1282- let refreshDLpActions = $t04582245930._1
1283- let updatedDLp = $t04582245930._2
1295+ let amountAssetBalanceDelta = $t04597546324._1
1296+ let priceAssetBalanceDelta = $t04597546324._2
1297+ let $t04632746435 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1298+ let refreshDLpActions = $t04632746435._1
1299+ let updatedDLp = $t04632746435._2
12841300 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
12851301 if ((isUpdatedDLpValid == isUpdatedDLpValid))
12861302 then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
13121328 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
13131329 if ((currentDLp == currentDLp))
13141330 then {
1315- let $t04696047025 = refreshDLpInternal(0, 0, 0)
1316- let refreshDLpActions = $t04696047025._1
1317- let updatedDLp = $t04696047025._2
1331+ let $t04746547530 = refreshDLpInternal(0, 0, 0)
1332+ let refreshDLpActions = $t04746547530._1
1333+ let updatedDLp = $t04746547530._2
13181334 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13191335 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13201336 then (state ++ refreshDLpActions)
13391355 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13401356 if ((b == b))
13411357 then {
1342- let $t04819848280 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1343- let refreshDLpActions = $t04819848280._1
1344- let updatedDLp = $t04819848280._2
1358+ let $t04870348785 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1359+ let refreshDLpActions = $t04870348785._1
1360+ let updatedDLp = $t04870348785._2
13451361 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13461362 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13471363 then (state ++ refreshDLpActions)
13621378 then @
13631379 else throw(($getType(@) + " couldn't be cast to Boolean"))
13641380 }
1365- let isGetDisabled = if (if (igs())
1366- then true
1367- else (cfgPoolStatus == PoolShutdown))
1368- then true
1369- else isPoolOneTokenOperationsDisabled
1381+ let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
1382+ then if (if (igs())
1383+ then true
1384+ else (cfgPoolStatus == PoolShutdown))
1385+ then true
1386+ else isPoolOneTokenOperationsDisabled
1387+ else false
13701388 let checks = [if (if (!(isGetDisabled))
13711389 then true
13721390 else isManager(i))
13761394 else throwErr("exactly 1 payment are expected")]
13771395 if ((checks == checks))
13781396 then {
1379- let $t04889849053 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1380- let state = $t04889849053._1
1381- let totalAmount = $t04889849053._2
1397+ let $t04944049595 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1398+ let state = $t04944049595._1
1399+ let totalAmount = $t04944049595._2
13821400 $Tuple2(state, totalAmount)
13831401 }
13841402 else throw("Strict value is not equal to itself.")
13951413 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
13961414 then {
13971415 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1398- let $t04957749641 = refreshDLpInternal(0, 0, 0)
1399- let dLpUpdateActions = $t04957749641._1
1400- let updatedDLp = $t04957749641._2
1416+ let $t05011950183 = refreshDLpInternal(0, 0, 0)
1417+ let dLpUpdateActions = $t05011950183._1
1418+ let updatedDLp = $t05011950183._2
14011419 let actions = if ((dLp != updatedDLp))
14021420 then dLpUpdateActions
14031421 else throwErr("nothing to refresh")
14251443 let newY = getYD(xp, index, D1)
14261444 let dy = (xp[index] - newY)
14271445 let totalGetRaw = max([0, toInt((dy - big1))])
1428- let $t05065150706 = takeFee(totalGetRaw, outFee)
1429- let totalGet = $t05065150706._1
1430- let feeAmount = $t05065150706._2
1446+ let $t05119351248 = takeFee(totalGetRaw, outFee)
1447+ let totalGet = $t05119351248._1
1448+ let feeAmount = $t05119351248._2
14311449 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
14321450 }
14331451
14401458 let lpId = toBase58String(value(cfgLpAssetId))
14411459 let amBalance = getAccBalance(amId)
14421460 let prBalance = getAccBalance(prId)
1443- let $t05108151196 = {
1461+ let $t05162351738 = {
14441462 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
14451463 if ($isInstanceOf(@, "(Int, Int)"))
14461464 then @
14471465 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
14481466 }
1449- let totalGet = $t05108151196._1
1450- let feeAmount = $t05108151196._2
1467+ let totalGet = $t05162351738._1
1468+ let feeAmount = $t05162351738._2
14511469 let r = ego("", lpId, lpAssetAmount, this)
14521470 let outAmAmt = r._1
14531471 let outPrAmt = r._2
14811499 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14821500 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14831501 then {
1484- let $t05236252443 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1485- let refreshDLpActions = $t05236252443._1
1486- let updatedDLp = $t05236252443._2
1502+ let $t05290452985 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1503+ let refreshDLpActions = $t05290452985._1
1504+ let updatedDLp = $t05290452985._2
14871505 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
14881506 if ((isUpdatedDLpValid == isUpdatedDLpValid))
14891507 then (state ++ refreshDLpActions)
15181536 let outPrAmt = r._2
15191537 let sts = parseIntValue(r._9)
15201538 let state = r._10
1521- let v = if (if (igs())
1522- then true
1523- else (sts == PoolShutdown))
1539+ let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
1540+ then if (igs())
1541+ then true
1542+ else (cfgPoolStatus == PoolShutdown)
1543+ else false
1544+ let v = if (isGetDisabled)
15241545 then throw(("Blocked: " + toString(sts)))
15251546 else true
15261547 if ((v == v))
15281549 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15291550 if ((burnA == burnA))
15301551 then {
1531- let $t05347053551 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1532- let refreshDLpActions = $t05347053551._1
1533- let updatedDLp = $t05347053551._2
1552+ let $t05409554176 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1553+ let refreshDLpActions = $t05409554176._1
1554+ let updatedDLp = $t05409554176._2
15341555 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15351556 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15361557 then (state ++ refreshDLpActions)
15511572
15521573 @Callable(i)
15531574 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
1554- let isGetDisabled = if (igs())
1555- then true
1556- else (cfgPoolStatus == PoolShutdown)
1575+ let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
1576+ then if (igs())
1577+ then true
1578+ else (cfgPoolStatus == PoolShutdown)
1579+ else false
15571580 let checks = [if (!(isGetDisabled))
15581581 then true
15591582 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
15811604 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15821605 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15831606 then {
1584- let $t05480254883 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1585- let refreshDLpActions = $t05480254883._1
1586- let updatedDLp = $t05480254883._2
1607+ let $t05546455545 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1608+ let refreshDLpActions = $t05546455545._1
1609+ let updatedDLp = $t05546455545._2
15871610 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15881611 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15891612 then (state ++ refreshDLpActions)
16101633 then @
16111634 else throw(($getType(@) + " couldn't be cast to Boolean"))
16121635 }
1613- let isGetDisabled = if (if (igs())
1614- then true
1615- else (cfgPoolStatus == PoolShutdown))
1616- then true
1617- else isPoolOneTokenOperationsDisabled
1636+ let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
1637+ then if (if (igs())
1638+ then true
1639+ else (cfgPoolStatus == PoolShutdown))
1640+ then true
1641+ else isPoolOneTokenOperationsDisabled
1642+ else false
16181643 let checks = [if (if (!(isGetDisabled))
16191644 then true
16201645 else isManager(i))
16321657 let unstakeInv = invoke(staking, "unstakeINTERNAL", [lpAssetId, unstakeAmount, userAddress.bytes, lpAssetRecipientAddress.bytes], nil)
16331658 if ((unstakeInv == unstakeInv))
16341659 then {
1635- let $t05590556093 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1636- let state = $t05590556093._1
1637- let totalAmount = $t05590556093._2
1660+ let $t05660456792 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1661+ let state = $t05660456792._1
1662+ let totalAmount = $t05660456792._2
16381663 $Tuple2(state, totalAmount)
16391664 }
16401665 else throw("Strict value is not equal to itself.")
16461671
16471672 @Callable(i)
16481673 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1649- let $t05622156324 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1650- let lpAmount = $t05622156324._1
1651- let state = $t05622156324._2
1652- let feeAmount = $t05622156324._3
1653- let bonus = $t05622156324._4
1674+ let $t05692057023 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1675+ let lpAmount = $t05692057023._1
1676+ let state = $t05692057023._2
1677+ let feeAmount = $t05692057023._3
1678+ let bonus = $t05692057023._4
16541679 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16551680 }
16561681
16581683
16591684 @Callable(i)
16601685 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1661- let $t05647256576 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1662- let lpAmount = $t05647256576._1
1663- let state = $t05647256576._2
1664- let feeAmount = $t05647256576._3
1665- let bonus = $t05647256576._4
1686+ let $t05717157275 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1687+ let lpAmount = $t05717157275._1
1688+ let state = $t05717157275._2
1689+ let feeAmount = $t05717157275._3
1690+ let bonus = $t05717157275._4
16661691 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16671692 }
16681693
17241749 @Callable(i)
17251750 func changeAmp () = {
17261751 let cfg = invoke(fca, "getChangeAmpConfigREADONLY", [toString(this)], nil)
1727- let $t05905659255 = match cfg {
1752+ let $t05975559954 = match cfg {
17281753 case list: List[Any] =>
17291754 $Tuple3({
17301755 let @ = list[0]
17451770 case _ =>
17461771 throwErr("invalid entry type")
17471772 }
1748- let delay = $t05905659255._1
1749- let delta = $t05905659255._2
1750- let target = $t05905659255._3
1773+ let delay = $t05975559954._1
1774+ let delta = $t05975559954._2
1775+ let target = $t05975559954._3
17511776 let curAmp = parseIntValue(getStringValue(amp()))
17521777 let newAmpRaw = (curAmp + delta)
17531778 let newAmp = if ((0 > delta))
17831808 match tx {
17841809 case order: Order =>
17851810 let matcherPub = mp()
1786- let $t06018860305 = if (skipOrderValidation())
1811+ let $t06088761004 = if (skipOrderValidation())
17871812 then $Tuple2(true, "")
17881813 else validateMatcherOrderAllowed(order)
1789- let orderValid = $t06018860305._1
1790- let orderValidInfo = $t06018860305._2
1814+ let orderValid = $t06088761004._1
1815+ let orderValidInfo = $t06088761004._2
17911816 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
17921817 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
17931818 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 ampInitial = 50
2727
2828 let Amult = "100"
2929
3030 let Dconv = "1"
3131
3232 let SEP = "__"
3333
3434 let EMPTY = ""
3535
3636 let PoolActive = 1
3737
3838 let PoolPutDis = 2
3939
4040 let PoolMatcherDis = 3
4141
4242 let PoolShutdown = 4
4343
4444 let idxPoolAddress = 1
4545
4646 let idxPoolSt = 2
4747
4848 let idxLPAsId = 3
4949
5050 let idxAmAsId = 4
5151
5252 let idxPrAsId = 5
5353
5454 let idxAmtAsDcm = 6
5555
5656 let idxPriceAsDcm = 7
5757
5858 let idxIAmtAsId = 8
5959
6060 let idxIPriceAsId = 9
6161
6262 let idxFactStakCntr = 1
6363
6464 let idxFactoryRestCntr = 6
6565
6666 let idxFactSlippCntr = 7
6767
6868 let idxFactGwxRewCntr = 10
6969
7070 let feeDefault = fraction(10, scale8, 10000)
7171
7272 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
7373
7474
7575 func t1BigInt (origVal,origScaleMult) = fraction(origVal, scale18, origScaleMult)
7676
7777
7878 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
7979
8080
8181 func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
8282
8383
8484 func t2 (origVal,origScaleMult) = fraction(origVal, scale18, toBigInt(origScaleMult))
8585
8686
8787 func f2 (val,resultScaleMult) = fraction(val, toBigInt(resultScaleMult), scale18)
8888
8989
9090 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
9191
9292
9393 func abs (val) = if ((zeroBigInt > val))
9494 then -(val)
9595 else val
9696
9797
9898 func absBigInt (val) = if ((zeroBigInt > val))
9999 then -(val)
100100 else val
101101
102102
103103 func fc () = "%s__factoryContract"
104104
105105
106106 func keyManagerPublicKey () = "%s__managerPublicKey"
107107
108108
109109 func keyManagerVaultAddress () = "%s__managerVaultAddress"
110110
111111
112112 func pl () = "%s%s__price__last"
113113
114114
115115 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
116116
117117
118118 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
119119
120120
121121 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
122122
123123
124124 func aa () = "%s__amountAsset"
125125
126126
127127 func pa () = "%s__priceAsset"
128128
129129
130130 func amp () = "%s__amp"
131131
132132
133133 func keyAmpHistory (heightBlocks) = ("%s%d__amp__" + toString(heightBlocks))
134134
135135
136136 func keyChangeAmpLastCall () = "%s__changeAmpLastCall"
137137
138138
139139 let keyFee = "%s__fee"
140140
141141 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
142142
143143 let keyDLp = makeString(["%s", "dLp"], SEP)
144144
145145 let keyDLpRefreshedHeight = makeString(["%s", "dLpRefreshedHeight"], SEP)
146146
147147 let keyDLpRefreshDelay = makeString(["%s", "refreshDLpDelay"], SEP)
148148
149149 let dLpRefreshDelayDefault = 30
150150
151151 let dLpRefreshDelay = valueOrElse(getInteger(this, keyDLpRefreshDelay), dLpRefreshDelayDefault)
152152
153153 func fcfg () = "%s__factoryConfig"
154154
155155
156156 func mtpk () = "%s%s__matcher__publicKey"
157157
158158
159159 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
160160
161161
162162 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
163163
164164
165165 func aps () = "%s__shutdown"
166166
167167
168168 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
169169
170170
171171 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
172172
173173
174174 func keySkipOrderValidation (poolAddress) = ("%s%s__skipOrderValidation__" + poolAddress)
175175
176176
177177 func throwOrderError (orderValid,orderValidInfo,senderValid,matcherValid) = throw((((((((("order validation failed: orderValid=" + toString(orderValid)) + " (") + orderValidInfo) + ")") + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
178178
179179
180180 func addressFromStringOrThis (addressString) = match addressFromString(addressString) {
181181 case a: Address =>
182182 a
183183 case _ =>
184184 this
185185 }
186186
187187
188188 func getManagerVaultAddressOrThis () = {
189189 let factoryAddress = match getString(fc()) {
190190 case fca: String =>
191191 addressFromStringOrThis(fca)
192192 case _ =>
193193 this
194194 }
195195 match getString(factoryAddress, keyManagerVaultAddress()) {
196196 case s: String =>
197197 addressFromStringOrThis(s)
198198 case _ =>
199199 this
200200 }
201201 }
202202
203203
204204 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
205205
206206
207207 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
208208
209209
210210 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
211211
212212
213213 func fmtErr (msg) = makeString(["lp_stable.ride:", msg], " ")
214214
215215
216216 let fca = addressFromStringValue(strf(this, fc()))
217217
218218 let inFee = {
219219 let @ = invoke(fca, "getInFeeREADONLY", [toString(this)], nil)
220220 if ($isInstanceOf(@, "Int"))
221221 then @
222222 else throw(($getType(@) + " couldn't be cast to Int"))
223223 }
224224
225225 let outFee = {
226226 let @ = invoke(fca, "getOutFeeREADONLY", [toString(this)], nil)
227227 if ($isInstanceOf(@, "Int"))
228228 then @
229229 else throw(($getType(@) + " couldn't be cast to Int"))
230230 }
231231
232+func keyAddressWhitelisted (address) = makeString(["%s%s", "whitelisted", toString(address)], SEP)
233+
234+
235+func isAddressWhitelisted (address) = valueOrElse(getBoolean(fca, keyAddressWhitelisted(address)), false)
236+
237+
232238 let A = strf(this, amp())
233239
234240 func igs () = valueOrElse(getBoolean(fca, aps()), false)
235241
236242
237243 func mp () = fromBase58String(strf(fca, mtpk()))
238244
239245
240246 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
241247
242248 func gpc () = {
243249 let amtAs = strf(this, aa())
244250 let priceAs = strf(this, pa())
245251 let iPriceAs = intf(fca, mba(priceAs))
246252 let iAmtAs = intf(fca, mba(amtAs))
247253 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
248254 }
249255
250256
251257 func parseAssetId (input) = if ((input == wavesString))
252258 then unit
253259 else fromBase58String(input)
254260
255261
256262 func assetIdToString (input) = if ((input == unit))
257263 then wavesString
258264 else toBase58String(value(input))
259265
260266
261267 func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]))
262268
263269
264270 let poolConfigParsed = parsePoolConfig(gpc())
265271
266-let $t086088794 = poolConfigParsed
272+let $t088369022 = poolConfigParsed
267273
268-let cfgPoolAddress = $t086088794._1
274+let cfgPoolAddress = $t088369022._1
269275
270-let cfgPoolStatus = $t086088794._2
276+let cfgPoolStatus = $t088369022._2
271277
272-let cfgLpAssetId = $t086088794._3
278+let cfgLpAssetId = $t088369022._3
273279
274-let cfgAmountAssetId = $t086088794._4
280+let cfgAmountAssetId = $t088369022._4
275281
276-let cfgPriceAssetId = $t086088794._5
282+let cfgPriceAssetId = $t088369022._5
277283
278-let cfgAmountAssetDecimals = $t086088794._6
284+let cfgAmountAssetDecimals = $t088369022._6
279285
280-let cfgPriceAssetDecimals = $t086088794._7
286+let cfgPriceAssetDecimals = $t088369022._7
281287
282288 func gfc () = split(strf(fca, fcfg()), SEP)
283289
284290
285291 let factoryConfig = gfc()
286292
287293 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
288294
289295 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
290296
291297 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
292298
293299 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
294300
295301 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)
296302
297303
298304 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)
299305
300306
301307 func getAccBalance (assetId) = if ((assetId == "WAVES"))
302308 then wavesBalance(this).available
303309 else assetBalance(this, fromBase58String(assetId))
304310
305311
306312 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
307313
308314
309315 func cpbir (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
310316
311317
312318 func vad (A1,A2,slippage) = {
313319 let diff = fraction((A1 - A2), scale8BigInt, A2)
314320 let pass = ((slippage - abs(diff)) > zeroBigInt)
315321 if (!(pass))
316322 then throw(("Big slpg: " + toString(diff)))
317323 else $Tuple2(pass, min([A1, A2]))
318324 }
319325
320326
321327 func vd (D1,D0,slpg) = {
322328 let diff = fraction(D0, scale8BigInt, D1)
323329 let fail = (slpg > diff)
324330 if (if (fail)
325331 then true
326332 else (D0 > D1))
327333 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
328334 else fail
329335 }
330336
331337
332338 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
333339 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
334340 let prAsAmtX18 = t1(prAmt, prAssetDcm)
335341 cpbi(prAsAmtX18, amtAsAmtX18)
336342 }
337343
338344
339345 func calcPrices (amAmt,prAmt,lpAmt) = {
340346 let amtAsDcm = cfgAmountAssetDecimals
341347 let prAsDcm = cfgPriceAssetDecimals
342348 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
343349 let amAmtX18 = t1(amAmt, amtAsDcm)
344350 let prAmtX18 = t1(prAmt, prAsDcm)
345351 let lpAmtX18 = t1(lpAmt, scale8)
346352 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
347353 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
348354 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
349355 }
350356
351357
352358 func calculatePrices (amAmt,prAmt,lpAmt) = {
353359 let p = calcPrices(amAmt, prAmt, lpAmt)
354360 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
355361 }
356362
357363
358364 func takeFee (amount,fee) = {
359365 let feeAmount = if ((fee == 0))
360366 then 0
361367 else fraction(amount, fee, scale8)
362368 $Tuple2((amount - feeAmount), feeAmount)
363369 }
364370
365371
366372 func getD (xp) = {
367373 let xp0 = xp[0]
368374 let xp1 = xp[1]
369375 let s = (xp0 + xp1)
370376 if ((s == big0))
371377 then big0
372378 else {
373379 let a = parseIntValue(A)
374380 let ann = (a * 2)
375381 let p = fraction(xp0, xp1, big1)
376382 let xp0_xp1_n_n = fraction(p, big4, big1)
377383 let ann_s = fraction(toBigInt(ann), s, big1)
378384 let ann_1 = toBigInt((ann - 1))
379385 func calcDNext (d) = {
380386 let dd = fraction(d, d, big1)
381387 let ddd = fraction(dd, d, big1)
382388 let dp = fraction(ddd, big1, xp0_xp1_n_n)
383389 fraction((ann_s + fraction(dp, big2, big1)), d, (fraction(ann_1, d, big1) + fraction(big3, dp, big1)))
384390 }
385391
386392 func calc (acc,i) = if (acc._2)
387393 then acc
388394 else {
389395 let d = acc._1
390396 let dNext = calcDNext(d)
391397 let dDiffRaw = (dNext - value(d))
392398 let dDiff = if ((big0 > dDiffRaw))
393399 then -(dDiffRaw)
394400 else dDiffRaw
395401 if ((big1 >= dDiff))
396402 then $Tuple2(dNext, true)
397403 else $Tuple2(dNext, false)
398404 }
399405
400406 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
401- let $t01329913347 = {
407+ let $t01352713575 = {
402408 let $l = arr
403409 let $s = size($l)
404410 let $acc0 = $Tuple2(s, false)
405411 func $f0_1 ($a,$i) = if (($i >= $s))
406412 then $a
407413 else calc($a, $l[$i])
408414
409415 func $f0_2 ($a,$i) = if (($i >= $s))
410416 then $a
411417 else throw("List size exceeds 17")
412418
413419 $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)
414420 }
415- let d = $t01329913347._1
416- let found = $t01329913347._2
421+ let d = $t01352713575._1
422+ let found = $t01352713575._2
417423 if (found)
418424 then d
419425 else throw(("D calculation error, D = " + toString(d)))
420426 }
421427 }
422428
423429
424430 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
425431 let lpId = cfgLpAssetId
426432 let amId = toBase58String(value(cfgAmountAssetId))
427433 let prId = toBase58String(value(cfgPriceAssetId))
428434 let amDcm = cfgAmountAssetDecimals
429435 let prDcm = cfgPriceAssetDecimals
430436 let sts = toString(cfgPoolStatus)
431437 let lpEmiss = valueOrErrorMessage(assetInfo(lpId), "Wrong LP id").quantity
432438 if ((toBase58String(lpId) != pmtAssetId))
433439 then throw("Wrong pmt asset")
434440 else {
435441 let amBalance = getAccBalance(amId)
436442 let amBalanceX18 = t1(amBalance, amDcm)
437443 let prBalance = getAccBalance(prId)
438444 let prBalanceX18 = t1(prBalance, prDcm)
439445 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
440446 let curPrice = f1(curPriceX18, scale8)
441447 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
442448 let lpEmissX18 = t1(lpEmiss, scale8)
443449 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
444450 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
445451 let outAmAmt = fromX18Round(outAmAmtX18, amDcm, FLOOR)
446452 let outPrAmt = fromX18Round(outPrAmtX18, prDcm, FLOOR)
447453 let state = if ((txId58 == ""))
448454 then nil
449455 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
450456 then unit
451457 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
452458 then unit
453459 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)]
454460 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
455461 }
456462 }
457463
458464
459465 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
460466 let lpId = cfgLpAssetId
461467 let amIdStr = toBase58String(value(cfgAmountAssetId))
462468 let prIdStr = toBase58String(value(cfgPriceAssetId))
463469 let amtDcm = cfgAmountAssetDecimals
464470 let priceDcm = cfgPriceAssetDecimals
465471 let sts = toString(cfgPoolStatus)
466472 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
467473 let amBalance = if (isEval)
468474 then getAccBalance(amIdStr)
469475 else if (if (isOneAsset)
470476 then (pmtId == amIdStr)
471477 else false)
472478 then (getAccBalance(amIdStr) - pmtAmt)
473479 else if (isOneAsset)
474480 then getAccBalance(amIdStr)
475481 else (getAccBalance(amIdStr) - inAmAmt)
476482 let prBalance = if (isEval)
477483 then getAccBalance(prIdStr)
478484 else if (if (isOneAsset)
479485 then (pmtId == prIdStr)
480486 else false)
481487 then (getAccBalance(prIdStr) - pmtAmt)
482488 else if (isOneAsset)
483489 then getAccBalance(prIdStr)
484490 else (getAccBalance(prIdStr) - inPrAmt)
485491 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
486492 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
487493 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
488494 let amBalanceX18 = t1(amBalance, amtDcm)
489495 let prBalanceX18 = t1(prBalance, priceDcm)
490496 let D0 = getD([amBalanceX18, prBalanceX18])
491497 let r = if ((lpEm == 0))
492498 then {
493499 let D1 = getD([(amBalanceX18 + inAmAssetAmtX18), (prBalanceX18 + inPrAssetAmtX18)])
494500 let checkD = if ((D1 > D0))
495501 then true
496502 else throw("D1 should be greater than D0")
497503 if ((checkD == checkD))
498504 then {
499505 let curPriceX18 = zeroBigInt
500506 let slippageX18 = zeroBigInt
501507 let lpAmtX18 = D1
502508 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
503509 }
504510 else throw("Strict value is not equal to itself.")
505511 }
506512 else {
507513 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
508514 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
509515 let slippageX18 = t1(slippage, scale8)
510516 if (if (if (validateSlippage)
511517 then (curPriceX18 != zeroBigInt)
512518 else false)
513519 then (slippageRealX18 > slippageX18)
514520 else false)
515521 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
516522 else {
517523 let lpEmissionX18 = t1(lpEm, scale8)
518524 let prViaAmX18 = fraction(inAmAssetAmtX18, cpbir(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
519525 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, cpbir(prBalanceX18, amBalanceX18, FLOOR), CEILING)
520526 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
521527 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
522528 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
523529 let expAmtAssetAmtX18 = expectedAmts._1
524530 let expPriceAssetAmtX18 = expectedAmts._2
525531 let D1 = getD([(amBalanceX18 + expAmtAssetAmtX18), (prBalanceX18 + expPriceAssetAmtX18)])
526532 let checkD = if ((D1 > D0))
527533 then true
528534 else throw("D1 should be greater than D0")
529535 if ((checkD == checkD))
530536 then {
531537 let lpAmtX18 = fraction(lpEmissionX18, (D1 - D0), D0)
532538 $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
533539 }
534540 else throw("Strict value is not equal to itself.")
535541 }
536542 }
537543 let calcLpAmt = r._1
538544 let calcAmAssetPmt = r._2
539545 let calcPrAssetPmt = r._3
540546 let curPrice = f1(r._4, scale8)
541547 let slippageCalc = f1(r._5, scale8)
542548 if ((0 >= calcLpAmt))
543549 then throw("LP <= 0")
544550 else {
545551 let emitLpAmt = if (!(emitLp))
546552 then 0
547553 else calcLpAmt
548554 let amDiff = (inAmAmt - calcAmAssetPmt)
549555 let prDiff = (inPrAmt - calcPrAssetPmt)
550- let $t02110921454 = if (if (isOneAsset)
556+ let $t02133721682 = if (if (isOneAsset)
551557 then (pmtId == amIdStr)
552558 else false)
553559 then $Tuple2(pmtAmt, 0)
554560 else if (if (isOneAsset)
555561 then (pmtId == prIdStr)
556562 else false)
557563 then $Tuple2(0, pmtAmt)
558564 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
559- let writeAmAmt = $t02110921454._1
560- let writePrAmt = $t02110921454._2
565+ let writeAmAmt = $t02133721682._1
566+ let writePrAmt = $t02133721682._2
561567 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))]
562568 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
563569 }
564570 }
565571
566572
567573 func getYD (xp,i,D) = {
568574 let n = big2
569575 let x = xp[if ((i == 0))
570576 then 1
571577 else 0]
572578 let aPrecision = parseBigIntValue(Amult)
573579 let a = (parseBigIntValue(A) * aPrecision)
574580 let s = x
575581 let ann = (a * n)
576582 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
577583 let b = ((s + ((D * aPrecision) / ann)) - D)
578584 func calc (acc,cur) = {
579- let $t02264922669 = acc
580- let y = $t02264922669._1
581- let found = $t02264922669._2
585+ let $t02287722897 = acc
586+ let y = $t02287722897._1
587+ let found = $t02287722897._2
582588 if ((found != unit))
583589 then acc
584590 else {
585591 let yNext = (((y * y) + c) / ((big2 * y) + b))
586592 let yDiff = absBigInt((yNext - value(y)))
587593 if ((big1 >= yDiff))
588594 then $Tuple2(yNext, cur)
589595 else $Tuple2(yNext, unit)
590596 }
591597 }
592598
593599 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
594- let $t02297623023 = {
600+ let $t02320423251 = {
595601 let $l = arr
596602 let $s = size($l)
597603 let $acc0 = $Tuple2(D, unit)
598604 func $f0_1 ($a,$i) = if (($i >= $s))
599605 then $a
600606 else calc($a, $l[$i])
601607
602608 func $f0_2 ($a,$i) = if (($i >= $s))
603609 then $a
604610 else throw("List size exceeds 15")
605611
606612 $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)
607613 }
608- let y = $t02297623023._1
609- let found = $t02297623023._2
614+ let y = $t02320423251._1
615+ let found = $t02320423251._2
610616 if ((found != unit))
611617 then y
612618 else throw(("Y calculation error, Y = " + toString(y)))
613619 }
614620
615621
616622 func calcDLp (amountBalance,priceBalance,lpEmission) = {
617623 let updatedDLp = fraction(getD([t1BigInt(amountBalance, toBigInt(cfgAmountAssetDecimals)), t1BigInt(priceBalance, toBigInt(cfgPriceAssetDecimals))]), scale18, lpEmission)
618624 if ((lpEmission == big0))
619625 then big0
620626 else updatedDLp
621627 }
622628
623629
624630 func calcCurrentDLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
625631 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
626632 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
627633 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
628634 let currentDLp = calcDLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
629635 currentDLp
630636 }
631637
632638
633639 func refreshDLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
634640 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
635641 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
636642 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
637643 let updatedDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
638644 let actions = [IntegerEntry(keyDLpRefreshedHeight, height), StringEntry(keyDLp, toString(updatedDLp))]
639645 $Tuple2(actions, updatedDLp)
640646 }
641647
642648
643649 func validateUpdatedDLp (oldDLp,updatedDLp) = if ((updatedDLp >= oldDLp))
644650 then true
645651 else throwErr("updated DLp lower than current DLp")
646652
647653
648654 func validateMatcherOrderAllowed (order) = {
649655 let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
650656 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
651657 let amountAssetAmount = order.amount
652658 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
653- let $t02522125433 = if ((order.orderType == Buy))
659+ let $t02544925661 = if ((order.orderType == Buy))
654660 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
655661 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
656- let amountAssetBalanceDelta = $t02522125433._1
657- let priceAssetBalanceDelta = $t02522125433._2
662+ let amountAssetBalanceDelta = $t02544925661._1
663+ let priceAssetBalanceDelta = $t02544925661._2
658664 if (if (if (igs())
659665 then true
660666 else (cfgPoolStatus == PoolMatcherDis))
661667 then true
662668 else (cfgPoolStatus == PoolShutdown))
663669 then throw("Admin blocked")
664670 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
665671 then true
666672 else (order.assetPair.priceAsset != cfgPriceAssetId))
667673 then throw("Wr assets")
668674 else {
669675 let dLp = parseBigIntValue(valueOrElse(getString(this, keyDLp), "0"))
670- let $t02577525875 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
671- let unusedActions = $t02577525875._1
672- let dLpNew = $t02577525875._2
676+ let $t02600326103 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
677+ let unusedActions = $t02600326103._1
678+ let dLpNew = $t02600326103._2
673679 let isOrderValid = (dLpNew >= dLp)
674680 let info = makeString(["dLp=", toString(dLp), " dLpNew=", toString(dLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
675681 $Tuple2(isOrderValid, info)
676682 }
677683 }
678684
679685
680686 func cg (i) = if ((size(i.payments) != 1))
681687 then throw("1 pmnt exp")
682688 else {
683689 let pmt = value(i.payments[0])
684690 let pmtAssetId = value(pmt.assetId)
685691 let pmtAmt = pmt.amount
686692 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
687693 let outAmAmt = r._1
688694 let outPrAmt = r._2
689695 let sts = parseIntValue(r._9)
690696 let state = r._10
691- if (if (igs())
692- then true
693- else (sts == PoolShutdown))
697+ let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
698+ then if (igs())
699+ then true
700+ else (cfgPoolStatus == PoolShutdown)
701+ else false
702+ if (isGetDisabled)
694703 then throw(("Admin blocked: " + toString(sts)))
695704 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
696705 }
697706
698707
699708 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
700709 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
701710 let sts = parseIntValue(r._8)
702- if (if (if (igs())
703- then true
704- else (sts == PoolPutDis))
705- then true
706- else (sts == PoolShutdown))
711+ let isPutDisabled = if (!(isAddressWhitelisted(addressFromStringValue(caller))))
712+ then if (if (igs())
713+ then true
714+ else (cfgPoolStatus == PoolShutdown))
715+ then true
716+ else (cfgPoolStatus == PoolPutDis)
717+ else false
718+ if (isPutDisabled)
707719 then throw(("Blocked:" + toString(sts)))
708720 else r
709721 }
710722
711723
712724 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId,withTakeFee) = {
713725 let amId = toBase58String(value(cfgAmountAssetId))
714726 let prId = toBase58String(value(cfgPriceAssetId))
715727 let lpId = cfgLpAssetId
716728 let amtDcm = cfgAmountAssetDecimals
717729 let priceDcm = cfgPriceAssetDecimals
718730 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(lpId), "invalid lp asset").quantity)
719731 let chechEmission = if ((lpAssetEmission > big0))
720732 then true
721733 else throw("initial deposit requires all coins")
722734 if ((chechEmission == chechEmission))
723735 then {
724736 let amBalance = getAccBalance(amId)
725737 let prBalance = getAccBalance(prId)
726- let $t02853128993 = if ((txId == ""))
738+ let $t02896229424 = if ((txId == ""))
727739 then $Tuple2(amBalance, prBalance)
728740 else if ((pmtAssetId == amId))
729741 then if ((pmtAmtRaw > amBalance))
730742 then throw("invalid payment amount")
731743 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
732744 else if ((pmtAssetId == prId))
733745 then if ((pmtAmtRaw > prBalance))
734746 then throw("invalid payment amount")
735747 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
736748 else throw("wrong pmtAssetId")
737- let amBalanceOld = $t02853128993._1
738- let prBalanceOld = $t02853128993._2
739- let $t02899929175 = if ((pmtAssetId == amId))
749+ let amBalanceOld = $t02896229424._1
750+ let prBalanceOld = $t02896229424._2
751+ let $t02943029606 = if ((pmtAssetId == amId))
740752 then $Tuple2(pmtAmtRaw, 0)
741753 else if ((pmtAssetId == prId))
742754 then $Tuple2(0, pmtAmtRaw)
743755 else throw("invalid payment")
744- let amAmountRaw = $t02899929175._1
745- let prAmountRaw = $t02899929175._2
746- let $t02917929433 = if (withTakeFee)
756+ let amAmountRaw = $t02943029606._1
757+ let prAmountRaw = $t02943029606._2
758+ let $t02961029864 = if (withTakeFee)
747759 then $Tuple3(takeFee(amAmountRaw, inFee)._1, takeFee(prAmountRaw, inFee)._1, takeFee(pmtAmtRaw, inFee)._2)
748760 else $Tuple3(amAmountRaw, prAmountRaw, 0)
749- let amAmount = $t02917929433._1
750- let prAmount = $t02917929433._2
751- let feeAmount = $t02917929433._3
761+ let amAmount = $t02961029864._1
762+ let prAmount = $t02961029864._2
763+ let feeAmount = $t02961029864._3
752764 let amBalanceNew = (amBalanceOld + amAmount)
753765 let prBalanceNew = (prBalanceOld + prAmount)
754766 let D0 = getD([t1(amBalanceOld, cfgAmountAssetDecimals), t1(prBalanceOld, cfgPriceAssetDecimals)])
755767 let D1 = getD([t1(amBalanceNew, cfgAmountAssetDecimals), t1(prBalanceNew, cfgPriceAssetDecimals)])
756768 let checkD = if ((D1 > D0))
757769 then true
758770 else throw()
759771 if ((checkD == checkD))
760772 then {
761773 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0, FLOOR)
762774 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
763775 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))]
764776 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
765777 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
766778 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
767779 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
768780 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
769781 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
770782 }
771783 else throw("Strict value is not equal to itself.")
772784 }
773785 else throw("Strict value is not equal to itself.")
774786 }
775787
776788
777789 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
778790 let lpId = toBase58String(value(cfgLpAssetId))
779791 let amId = toBase58String(value(cfgAmountAssetId))
780792 let prId = toBase58String(value(cfgPriceAssetId))
781793 let amDecimals = cfgAmountAssetDecimals
782794 let prDecimals = cfgPriceAssetDecimals
783795 let poolStatus = cfgPoolStatus
784796 let userAddress = if ((caller == restContract))
785797 then originCaller
786798 else caller
787799 let pmt = value(payments[0])
788800 let pmtAssetId = value(pmt.assetId)
789801 let pmtAmt = pmt.amount
790802 let currentDLp = calcCurrentDLp(big0, big0, big0)
791803 if ((currentDLp == currentDLp))
792804 then {
793805 let txId58 = toBase58String(transactionId)
794806 if ((lpId != toBase58String(pmtAssetId)))
795807 then throw("Wrong LP")
796808 else {
797809 let amBalance = getAccBalance(amId)
798810 let prBalance = getAccBalance(prId)
799- let $t03154531656 = {
811+ let $t03197632087 = {
800812 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
801813 if ($isInstanceOf(@, "(Int, Int)"))
802814 then @
803815 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
804816 }
805- if (($t03154531656 == $t03154531656))
817+ if (($t03197632087 == $t03197632087))
806818 then {
807- let feeAmount = $t03154531656._2
808- let totalGet = $t03154531656._1
819+ let feeAmount = $t03197632087._2
820+ let totalGet = $t03197632087._1
809821 let totalAmount = if (if ((minOutAmount > 0))
810822 then (minOutAmount > totalGet)
811823 else false)
812824 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
813825 else totalGet
814- let $t03184632153 = if ((outAssetId == amId))
826+ let $t03227732584 = if ((outAssetId == amId))
815827 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
816828 else if ((outAssetId == prId))
817829 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
818830 else throw("invalid out asset id")
819- let outAm = $t03184632153._1
820- let outPr = $t03184632153._2
821- let amBalanceNew = $t03184632153._3
822- let prBalanceNew = $t03184632153._4
831+ let outAm = $t03227732584._1
832+ let outPr = $t03227732584._2
833+ let amBalanceNew = $t03227732584._3
834+ let prBalanceNew = $t03227732584._4
823835 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
824836 let curPr = f1(curPrX18, scale8)
825837 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
826838 then unit
827839 else fromBase58String(outAssetId)
828840 let sendFeeToMatcher = if ((feeAmount > 0))
829841 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
830842 else nil
831843 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)
832844 if ((state == state))
833845 then {
834846 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
835847 if ((burn == burn))
836848 then {
837- let $t03293833288 = {
849+ let $t03336933719 = {
838850 let feeAmountForCalc = if ((this == feeCollectorAddress))
839851 then 0
840852 else feeAmount
841853 let outInAmountAsset = if ((parseAssetId(outAssetId) == cfgAmountAssetId))
842854 then true
843855 else false
844856 if (outInAmountAsset)
845857 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
846858 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
847859 }
848- let amountAssetBalanceDelta = $t03293833288._1
849- let priceAssetBalanceDelta = $t03293833288._2
850- let $t03329133399 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
851- let refreshDLpActions = $t03329133399._1
852- let updatedDLp = $t03329133399._2
860+ let amountAssetBalanceDelta = $t03336933719._1
861+ let priceAssetBalanceDelta = $t03336933719._2
862+ let $t03372233830 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
863+ let refreshDLpActions = $t03372233830._1
864+ let updatedDLp = $t03372233830._2
853865 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
854866 if ((isUpdatedDLpValid == isUpdatedDLpValid))
855867 then $Tuple2((state ++ refreshDLpActions), totalAmount)
856868 else throw("Strict value is not equal to itself.")
857869 }
858870 else throw("Strict value is not equal to itself.")
859871 }
860872 else throw("Strict value is not equal to itself.")
861873 }
862874 else throw("Strict value is not equal to itself.")
863875 }
864876 }
865877 else throw("Strict value is not equal to itself.")
866878 }
867879
868880
869881 func managerPublicKeyOrUnit () = {
870882 let managerVaultAddress = getManagerVaultAddressOrThis()
871883 match getString(managerVaultAddress, keyManagerPublicKey()) {
872884 case s: String =>
873885 fromBase58String(s)
874886 case _: Unit =>
875887 unit
876888 case _ =>
877889 throw("Match error")
878890 }
879891 }
880892
881893
882894 let pd = throw("Permission denied")
883895
884896 func isManager (i) = match managerPublicKeyOrUnit() {
885897 case pk: ByteVector =>
886898 (i.callerPublicKey == pk)
887899 case _: Unit =>
888900 (i.caller == this)
889901 case _ =>
890902 throw("Match error")
891903 }
892904
893905
894906 func mustManager (i) = match managerPublicKeyOrUnit() {
895907 case pk: ByteVector =>
896908 if ((i.callerPublicKey == pk))
897909 then true
898910 else pd
899911 case _: Unit =>
900912 if ((i.caller == this))
901913 then true
902914 else pd
903915 case _ =>
904916 throw("Match error")
905917 }
906918
907919
908920 func getY (isReverse,D,poolAmountInBalance) = {
909921 let poolConfig = gpc()
910922 let amId = poolConfig[idxAmAsId]
911923 let prId = poolConfig[idxPrAsId]
912924 let n = big2
913925 let aPrecision = parseBigIntValue(Amult)
914926 let a = (parseBigIntValue(A) * aPrecision)
915927 let xp = if ((isReverse == false))
916928 then [(toBigInt(getAccBalance(amId)) + poolAmountInBalance), toBigInt(getAccBalance(prId))]
917929 else [(toBigInt(getAccBalance(prId)) + poolAmountInBalance), toBigInt(getAccBalance(amId))]
918930 let x = xp[0]
919931 let s = x
920932 let ann = (a * n)
921933 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
922934 let b = ((s + ((D * aPrecision) / ann)) - D)
923935 func calc (acc,cur) = {
924- let $t03488634906 = acc
925- let y = $t03488634906._1
926- let found = $t03488634906._2
936+ let $t03531735337 = acc
937+ let y = $t03531735337._1
938+ let found = $t03531735337._2
927939 if ((found != unit))
928940 then acc
929941 else {
930942 let yNext = (((y * y) + c) / ((big2 * y) + b))
931943 let yDiff = absBigInt((yNext - value(y)))
932944 if ((big1 >= yDiff))
933945 then $Tuple2(yNext, cur)
934946 else $Tuple2(yNext, unit)
935947 }
936948 }
937949
938950 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
939- let $t03523735284 = {
951+ let $t03566835715 = {
940952 let $l = arr
941953 let $s = size($l)
942954 let $acc0 = $Tuple2(D, unit)
943955 func $f0_1 ($a,$i) = if (($i >= $s))
944956 then $a
945957 else calc($a, $l[$i])
946958
947959 func $f0_2 ($a,$i) = if (($i >= $s))
948960 then $a
949961 else throw("List size exceeds 15")
950962
951963 $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)
952964 }
953- let y = $t03523735284._1
954- let found = $t03523735284._2
965+ let y = $t03566835715._1
966+ let found = $t03566835715._2
955967 if ((found != unit))
956968 then y
957969 else throw(("Y calculation error, Y = " + toString(y)))
958970 }
959971
960972
961973 func skipOrderValidation () = valueOrElse(getBoolean(fca, keySkipOrderValidation(toString(this))), false)
962974
963975
964976 @Callable(i)
965977 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
966- let $t03563636060 = if ((isReverse == false))
978+ let $t03606736491 = if ((isReverse == false))
967979 then {
968980 let assetOut = strf(this, pa())
969981 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, aa()))) + toBigInt(cleanAmountIn))
970982 $Tuple2(assetOut, poolAmountInBalance)
971983 }
972984 else {
973985 let assetOut = strf(this, aa())
974986 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, pa()))) + toBigInt(cleanAmountIn))
975987 $Tuple2(assetOut, poolAmountInBalance)
976988 }
977- let assetOut = $t03563636060._1
978- let poolAmountInBalance = $t03563636060._2
989+ let assetOut = $t03606736491._1
990+ let poolAmountInBalance = $t03606736491._2
979991 let poolConfig = gpc()
980992 let amId = poolConfig[idxAmAsId]
981993 let prId = poolConfig[idxPrAsId]
982994 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
983995 let D = getD(xp)
984996 let y = getY(isReverse, D, toBigInt(cleanAmountIn))
985997 let dy = ((toBigInt(getAccBalance(assetOut)) - y) - toBigInt(1))
986998 let totalGetRaw = max([0, toInt(dy)])
987999 let newXp = if ((isReverse == false))
9881000 then [((toBigInt(getAccBalance(amId)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount)), (toBigInt(getAccBalance(prId)) - dy)]
9891001 else [(toBigInt(getAccBalance(amId)) - dy), ((toBigInt(getAccBalance(prId)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount))]
9901002 let newD = getD(newXp)
9911003 let checkD = if ((newD >= D))
9921004 then true
9931005 else throw(makeString(["new D is fewer error", toString(D), toString(newD)], "__"))
9941006 if ((checkD == checkD))
9951007 then $Tuple2(nil, totalGetRaw)
9961008 else throw("Strict value is not equal to itself.")
9971009 }
9981010
9991011
10001012
10011013 @Callable(i)
10021014 func calculateAmountOutForSwapAndSendTokens (cleanAmountIn,isReverse,amountOutMin,addressTo,feePoolAmount) = {
10031015 let swapContact = {
10041016 let @ = invoke(fca, "getSwapContractREADONLY", nil, nil)
10051017 if ($isInstanceOf(@, "String"))
10061018 then @
10071019 else throw(($getType(@) + " couldn't be cast to String"))
10081020 }
10091021 let isPoolSwapDisabled = {
10101022 let @ = invoke(fca, "isPoolSwapDisabledREADONLY", [toString(this)], nil)
10111023 if ($isInstanceOf(@, "Boolean"))
10121024 then @
10131025 else throw(($getType(@) + " couldn't be cast to Boolean"))
10141026 }
1015- let isSwapDisabled = if (if (igs())
1016- then true
1017- else (cfgPoolStatus == PoolShutdown))
1018- then true
1019- else isPoolSwapDisabled
1027+ let isSwapDisabled = if (!(isAddressWhitelisted(i.caller)))
1028+ then if (if (igs())
1029+ then true
1030+ else (cfgPoolStatus == PoolShutdown))
1031+ then true
1032+ else isPoolSwapDisabled
1033+ else false
10201034 let checks = [if (if (!(isSwapDisabled))
10211035 then true
10221036 else isManager(i))
10231037 then true
10241038 else throwErr("swap operation is blocked by admin"), if ((value(i.payments[0]).amount >= cleanAmountIn))
10251039 then true
10261040 else throwErr("Wrong amount"), if ((i.caller == addressFromStringValue(swapContact)))
10271041 then true
10281042 else throwErr("Permission denied")]
10291043 if ((checks == checks))
10301044 then {
10311045 let pmt = value(i.payments[0])
10321046 let assetIn = assetIdToString(pmt.assetId)
1033- let $t03779538189 = if ((isReverse == false))
1047+ let $t03826338657 = if ((isReverse == false))
10341048 then {
10351049 let assetOut = strf(this, pa())
10361050 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
10371051 $Tuple2(assetOut, poolAmountInBalance)
10381052 }
10391053 else {
10401054 let assetOut = strf(this, aa())
10411055 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
10421056 $Tuple2(assetOut, poolAmountInBalance)
10431057 }
1044- let assetOut = $t03779538189._1
1045- let poolAmountInBalance = $t03779538189._2
1058+ let assetOut = $t03826338657._1
1059+ let poolAmountInBalance = $t03826338657._2
10461060 let poolConfig = gpc()
10471061 let amId = poolConfig[idxAmAsId]
10481062 let prId = poolConfig[idxPrAsId]
10491063 let xp = if ((isReverse == false))
10501064 then [(toBigInt(getAccBalance(amId)) - toBigInt(value(i.payments[0]).amount)), toBigInt(getAccBalance(prId))]
10511065 else [toBigInt(getAccBalance(amId)), (toBigInt(getAccBalance(prId)) - toBigInt(value(i.payments[0]).amount))]
10521066 let D = getD(xp)
10531067 let y = getY(isReverse, D, toBigInt(0))
10541068 let dy = ((toBigInt(getAccBalance(assetOut)) - y) - toBigInt(1))
10551069 let totalGetRaw = max([0, toInt(dy)])
10561070 let checkMin = if ((totalGetRaw >= amountOutMin))
10571071 then true
10581072 else throw("Exchange result is fewer coins than expected")
10591073 if ((checkMin == checkMin))
10601074 then {
10611075 let newXp = if ((isReverse == false))
10621076 then [(toBigInt(getAccBalance(amId)) + toBigInt(feePoolAmount)), (toBigInt(getAccBalance(prId)) - dy)]
10631077 else [(toBigInt(getAccBalance(amId)) - dy), (toBigInt(getAccBalance(prId)) + toBigInt(feePoolAmount))]
10641078 let newD = getD(newXp)
10651079 let checkD = if ((newD >= D))
10661080 then true
10671081 else throw("new D is fewer error")
10681082 if ((checkD == checkD))
10691083 then {
10701084 let amountAssetBalanceDelta = if (isReverse)
10711085 then -(totalGetRaw)
10721086 else feePoolAmount
10731087 let priceAssetBalanceDelta = if (isReverse)
10741088 then feePoolAmount
10751089 else -(totalGetRaw)
10761090 let refreshDLpActions = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)._1
10771091 if ((refreshDLpActions == refreshDLpActions))
10781092 then $Tuple2([ScriptTransfer(addressFromStringValue(addressTo), totalGetRaw, parseAssetId(assetOut))], totalGetRaw)
10791093 else throw("Strict value is not equal to itself.")
10801094 }
10811095 else throw("Strict value is not equal to itself.")
10821096 }
10831097 else throw("Strict value is not equal to itself.")
10841098 }
10851099 else throw("Strict value is not equal to itself.")
10861100 }
10871101
10881102
10891103
10901104 @Callable(i)
10911105 func constructor (fc) = {
10921106 let c = mustManager(i)
10931107 if ((c == c))
10941108 then [StringEntry(fc(), fc)]
10951109 else throw("Strict value is not equal to itself.")
10961110 }
10971111
10981112
10991113
11001114 @Callable(i)
11011115 func put (slip,autoStake) = {
11021116 let factCfg = gfc()
11031117 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
11041118 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
11051119 if ((0 > slip))
11061120 then throw("Wrong slippage")
11071121 else if ((size(i.payments) != 2))
11081122 then throw("2 pmnts expd")
11091123 else {
11101124 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
11111125 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
11121126 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amAssetPmt)
11131127 if ((amountAssetBalance == amountAssetBalance))
11141128 then {
11151129 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - prAssetPmt)
11161130 if ((priceAssetBalance == priceAssetBalance))
11171131 then {
11181132 let lpAssetEmission = toBigInt(value(assetInfo(cfgLpAssetId)).quantity)
11191133 if ((lpAssetEmission == lpAssetEmission))
11201134 then {
11211135 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
11221136 if ((currentDLp == currentDLp))
11231137 then {
11241138 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, "")
11251139 let emitLpAmt = e._2
11261140 let lpAssetId = e._7
11271141 let state = e._9
11281142 let amDiff = e._10
11291143 let prDiff = e._11
11301144 let amId = e._12
11311145 let prId = e._13
11321146 let r = invoke(fca, "emit", [emitLpAmt], nil)
11331147 if ((r == r))
11341148 then {
11351149 let el = match r {
11361150 case legacy: Address =>
11371151 invoke(legacy, "emit", [emitLpAmt], nil)
11381152 case _ =>
11391153 unit
11401154 }
11411155 if ((el == el))
11421156 then {
11431157 let sa = if ((amDiff > 0))
11441158 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
11451159 else nil
11461160 if ((sa == sa))
11471161 then {
11481162 let sp = if ((prDiff > 0))
11491163 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
11501164 else nil
11511165 if ((sp == sp))
11521166 then {
11531167 let lpTrnsfr = if (autoStake)
11541168 then {
11551169 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
11561170 if ((ss == ss))
11571171 then nil
11581172 else throw("Strict value is not equal to itself.")
11591173 }
11601174 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1161- let $t04264442786 = refreshDLpInternal(0, 0, 0)
1162- let refreshDLpActions = $t04264442786._1
1163- let updatedDLp = $t04264442786._2
1175+ let $t04311243254 = refreshDLpInternal(0, 0, 0)
1176+ let refreshDLpActions = $t04311243254._1
1177+ let updatedDLp = $t04311243254._2
11641178 let check = if ((updatedDLp >= currentDLp))
11651179 then true
11661180 else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp), toString(amDiff), toString(prDiff)], " "))
11671181 if ((check == check))
11681182 then {
11691183 let lpAssetEmissionAfter = value(assetInfo(cfgLpAssetId)).quantity
11701184 if ((lpAssetEmissionAfter == lpAssetEmissionAfter))
11711185 then ((state ++ lpTrnsfr) ++ refreshDLpActions)
11721186 else throw("Strict value is not equal to itself.")
11731187 }
11741188 else throw("Strict value is not equal to itself.")
11751189 }
11761190 else throw("Strict value is not equal to itself.")
11771191 }
11781192 else throw("Strict value is not equal to itself.")
11791193 }
11801194 else throw("Strict value is not equal to itself.")
11811195 }
11821196 else throw("Strict value is not equal to itself.")
11831197 }
11841198 else throw("Strict value is not equal to itself.")
11851199 }
11861200 else throw("Strict value is not equal to itself.")
11871201 }
11881202 else throw("Strict value is not equal to itself.")
11891203 }
11901204 else throw("Strict value is not equal to itself.")
11911205 }
11921206 }
11931207
11941208
11951209
11961210 @Callable(i)
11971211 func putOneTknV2 (minOutAmount,autoStake) = {
11981212 let isPoolOneTokenOperationsDisabled = {
11991213 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
12001214 if ($isInstanceOf(@, "Boolean"))
12011215 then @
12021216 else throw(($getType(@) + " couldn't be cast to Boolean"))
12031217 }
1204- let isPutDisabled = if (if (if (igs())
1205- then true
1206- else (cfgPoolStatus == PoolPutDis))
1207- then true
1208- else (cfgPoolStatus == PoolShutdown))
1209- then true
1210- else isPoolOneTokenOperationsDisabled
1218+ let isPutDisabled = if (!(isAddressWhitelisted(i.caller)))
1219+ then if (if (if (igs())
1220+ then true
1221+ else (cfgPoolStatus == PoolPutDis))
1222+ then true
1223+ else (cfgPoolStatus == PoolShutdown))
1224+ then true
1225+ else isPoolOneTokenOperationsDisabled
1226+ else false
12111227 let checks = [if (if (!(isPutDisabled))
12121228 then true
12131229 else isManager(i))
12141230 then true
12151231 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
12161232 then true
12171233 else throwErr("exactly 1 payment are expected")]
12181234 if ((checks == checks))
12191235 then {
12201236 let amId = toBase58String(value(cfgAmountAssetId))
12211237 let prId = toBase58String(value(cfgPriceAssetId))
12221238 let lpId = cfgLpAssetId
12231239 let amDecimals = cfgAmountAssetDecimals
12241240 let prDecimals = cfgPriceAssetDecimals
12251241 let userAddress = if ((i.caller == this))
12261242 then i.originCaller
12271243 else i.caller
12281244 let pmt = value(i.payments[0])
12291245 let pmtAssetId = toBase58String(value(pmt.assetId))
12301246 let pmtAmt = pmt.amount
12311247 let currentDLp = if ((pmt.assetId == cfgAmountAssetId))
12321248 then calcCurrentDLp(toBigInt(pmtAmt), toBigInt(0), toBigInt(0))
12331249 else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
12341250 if ((currentDLp == currentDLp))
12351251 then {
1236- let $t04442744585 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1237- if (($t04442744585 == $t04442744585))
1252+ let $t04493245090 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1253+ if (($t04493245090 == $t04493245090))
12381254 then {
1239- let feeAmount = $t04442744585._3
1240- let state = $t04442744585._2
1241- let estimLP = $t04442744585._1
1255+ let feeAmount = $t04493245090._3
1256+ let state = $t04493245090._2
1257+ let estimLP = $t04493245090._1
12421258 let emitLpAmt = if (if ((minOutAmount > 0))
12431259 then (minOutAmount > estimLP)
12441260 else false)
12451261 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
12461262 else estimLP
12471263 let e = invoke(fca, "emit", [emitLpAmt], nil)
12481264 if ((e == e))
12491265 then {
12501266 let el = match e {
12511267 case legacy: Address =>
12521268 invoke(legacy, "emit", [emitLpAmt], nil)
12531269 case _ =>
12541270 unit
12551271 }
12561272 if ((el == el))
12571273 then {
12581274 let lpTrnsfr = if (autoStake)
12591275 then {
12601276 let ss = invoke(stakingContract, "stakeFor", [toString(i.caller)], [AttachedPayment(lpId, emitLpAmt)])
12611277 if ((ss == ss))
12621278 then nil
12631279 else throw("Strict value is not equal to itself.")
12641280 }
12651281 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
12661282 let sendFeeToMatcher = if ((feeAmount > 0))
12671283 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
12681284 else nil
1269- let $t04547045819 = if ((this == feeCollectorAddress))
1285+ let $t04597546324 = if ((this == feeCollectorAddress))
12701286 then $Tuple2(0, 0)
12711287 else {
12721288 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
12731289 then true
12741290 else false
12751291 if (paymentInAmountAsset)
12761292 then $Tuple2(-(feeAmount), 0)
12771293 else $Tuple2(0, -(feeAmount))
12781294 }
1279- let amountAssetBalanceDelta = $t04547045819._1
1280- let priceAssetBalanceDelta = $t04547045819._2
1281- let $t04582245930 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1282- let refreshDLpActions = $t04582245930._1
1283- let updatedDLp = $t04582245930._2
1295+ let amountAssetBalanceDelta = $t04597546324._1
1296+ let priceAssetBalanceDelta = $t04597546324._2
1297+ let $t04632746435 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1298+ let refreshDLpActions = $t04632746435._1
1299+ let updatedDLp = $t04632746435._2
12841300 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
12851301 if ((isUpdatedDLpValid == isUpdatedDLpValid))
12861302 then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
12871303 else throw("Strict value is not equal to itself.")
12881304 }
12891305 else throw("Strict value is not equal to itself.")
12901306 }
12911307 else throw("Strict value is not equal to itself.")
12921308 }
12931309 else throw("Strict value is not equal to itself.")
12941310 }
12951311 else throw("Strict value is not equal to itself.")
12961312 }
12971313 else throw("Strict value is not equal to itself.")
12981314 }
12991315
13001316
13011317
13021318 @Callable(i)
13031319 func putForFree (maxSlpg) = if ((0 > maxSlpg))
13041320 then throw("Wrong slpg")
13051321 else if ((size(i.payments) != 2))
13061322 then throw("2 pmnts expd")
13071323 else {
13081324 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, "")
13091325 let state = estPut._9
13101326 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
13111327 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
13121328 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
13131329 if ((currentDLp == currentDLp))
13141330 then {
1315- let $t04696047025 = refreshDLpInternal(0, 0, 0)
1316- let refreshDLpActions = $t04696047025._1
1317- let updatedDLp = $t04696047025._2
1331+ let $t04746547530 = refreshDLpInternal(0, 0, 0)
1332+ let refreshDLpActions = $t04746547530._1
1333+ let updatedDLp = $t04746547530._2
13181334 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13191335 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13201336 then (state ++ refreshDLpActions)
13211337 else throw("Strict value is not equal to itself.")
13221338 }
13231339 else throw("Strict value is not equal to itself.")
13241340 }
13251341
13261342
13271343
13281344 @Callable(i)
13291345 func get () = {
13301346 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
13311347 if ((currentDLp == currentDLp))
13321348 then {
13331349 let r = cg(i)
13341350 let outAmtAmt = r._1
13351351 let outPrAmt = r._2
13361352 let pmtAmt = r._3
13371353 let pmtAssetId = r._4
13381354 let state = r._5
13391355 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13401356 if ((b == b))
13411357 then {
1342- let $t04819848280 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1343- let refreshDLpActions = $t04819848280._1
1344- let updatedDLp = $t04819848280._2
1358+ let $t04870348785 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1359+ let refreshDLpActions = $t04870348785._1
1360+ let updatedDLp = $t04870348785._2
13451361 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13461362 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13471363 then (state ++ refreshDLpActions)
13481364 else throw("Strict value is not equal to itself.")
13491365 }
13501366 else throw("Strict value is not equal to itself.")
13511367 }
13521368 else throw("Strict value is not equal to itself.")
13531369 }
13541370
13551371
13561372
13571373 @Callable(i)
13581374 func getOneTknV2 (outAssetId,minOutAmount) = {
13591375 let isPoolOneTokenOperationsDisabled = {
13601376 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
13611377 if ($isInstanceOf(@, "Boolean"))
13621378 then @
13631379 else throw(($getType(@) + " couldn't be cast to Boolean"))
13641380 }
1365- let isGetDisabled = if (if (igs())
1366- then true
1367- else (cfgPoolStatus == PoolShutdown))
1368- then true
1369- else isPoolOneTokenOperationsDisabled
1381+ let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
1382+ then if (if (igs())
1383+ then true
1384+ else (cfgPoolStatus == PoolShutdown))
1385+ then true
1386+ else isPoolOneTokenOperationsDisabled
1387+ else false
13701388 let checks = [if (if (!(isGetDisabled))
13711389 then true
13721390 else isManager(i))
13731391 then true
13741392 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
13751393 then true
13761394 else throwErr("exactly 1 payment are expected")]
13771395 if ((checks == checks))
13781396 then {
1379- let $t04889849053 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1380- let state = $t04889849053._1
1381- let totalAmount = $t04889849053._2
1397+ let $t04944049595 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1398+ let state = $t04944049595._1
1399+ let totalAmount = $t04944049595._2
13821400 $Tuple2(state, totalAmount)
13831401 }
13841402 else throw("Strict value is not equal to itself.")
13851403 }
13861404
13871405
13881406
13891407 @Callable(i)
13901408 func refreshDLp () = {
13911409 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
13921410 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
13931411 then unit
13941412 else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
13951413 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
13961414 then {
13971415 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1398- let $t04957749641 = refreshDLpInternal(0, 0, 0)
1399- let dLpUpdateActions = $t04957749641._1
1400- let updatedDLp = $t04957749641._2
1416+ let $t05011950183 = refreshDLpInternal(0, 0, 0)
1417+ let dLpUpdateActions = $t05011950183._1
1418+ let updatedDLp = $t05011950183._2
14011419 let actions = if ((dLp != updatedDLp))
14021420 then dLpUpdateActions
14031421 else throwErr("nothing to refresh")
14041422 $Tuple2(actions, toString(updatedDLp))
14051423 }
14061424 else throw("Strict value is not equal to itself.")
14071425 }
14081426
14091427
14101428
14111429 @Callable(i)
14121430 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
14131431 let amId = toBase58String(value(cfgAmountAssetId))
14141432 let prId = toBase58String(value(cfgPriceAssetId))
14151433 let lpId = toBase58String(value(cfgLpAssetId))
14161434 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
14171435 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
14181436 let D0 = getD(xp)
14191437 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
14201438 let index = if ((outAssetId == amId))
14211439 then 0
14221440 else if ((outAssetId == prId))
14231441 then 1
14241442 else throw("invalid out asset id")
14251443 let newY = getYD(xp, index, D1)
14261444 let dy = (xp[index] - newY)
14271445 let totalGetRaw = max([0, toInt((dy - big1))])
1428- let $t05065150706 = takeFee(totalGetRaw, outFee)
1429- let totalGet = $t05065150706._1
1430- let feeAmount = $t05065150706._2
1446+ let $t05119351248 = takeFee(totalGetRaw, outFee)
1447+ let totalGet = $t05119351248._1
1448+ let feeAmount = $t05119351248._2
14311449 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
14321450 }
14331451
14341452
14351453
14361454 @Callable(i)
14371455 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
14381456 let amId = toBase58String(value(cfgAmountAssetId))
14391457 let prId = toBase58String(value(cfgPriceAssetId))
14401458 let lpId = toBase58String(value(cfgLpAssetId))
14411459 let amBalance = getAccBalance(amId)
14421460 let prBalance = getAccBalance(prId)
1443- let $t05108151196 = {
1461+ let $t05162351738 = {
14441462 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
14451463 if ($isInstanceOf(@, "(Int, Int)"))
14461464 then @
14471465 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
14481466 }
1449- let totalGet = $t05108151196._1
1450- let feeAmount = $t05108151196._2
1467+ let totalGet = $t05162351738._1
1468+ let feeAmount = $t05162351738._2
14511469 let r = ego("", lpId, lpAssetAmount, this)
14521470 let outAmAmt = r._1
14531471 let outPrAmt = r._2
14541472 let sumOfGetAssets = (outAmAmt + outPrAmt)
14551473 let bonus = if ((sumOfGetAssets == 0))
14561474 then if ((totalGet == 0))
14571475 then 0
14581476 else throw("bonus calculation error")
14591477 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
14601478 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
14611479 }
14621480
14631481
14641482
14651483 @Callable(i)
14661484 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
14671485 let r = cg(i)
14681486 let outAmAmt = r._1
14691487 let outPrAmt = r._2
14701488 let pmtAmt = r._3
14711489 let pmtAssetId = r._4
14721490 let state = r._5
14731491 if ((noLessThenAmtAsset > outAmAmt))
14741492 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
14751493 else if ((noLessThenPriceAsset > outPrAmt))
14761494 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
14771495 else {
14781496 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
14791497 if ((currentDLp == currentDLp))
14801498 then {
14811499 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14821500 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14831501 then {
1484- let $t05236252443 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1485- let refreshDLpActions = $t05236252443._1
1486- let updatedDLp = $t05236252443._2
1502+ let $t05290452985 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1503+ let refreshDLpActions = $t05290452985._1
1504+ let updatedDLp = $t05290452985._2
14871505 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
14881506 if ((isUpdatedDLpValid == isUpdatedDLpValid))
14891507 then (state ++ refreshDLpActions)
14901508 else throw("Strict value is not equal to itself.")
14911509 }
14921510 else throw("Strict value is not equal to itself.")
14931511 }
14941512 else throw("Strict value is not equal to itself.")
14951513 }
14961514 }
14971515
14981516
14991517
15001518 @Callable(i)
15011519 func unstakeAndGet (amount) = {
15021520 let checkPayments = if ((size(i.payments) != 0))
15031521 then throw("No pmnts expd")
15041522 else true
15051523 if ((checkPayments == checkPayments))
15061524 then {
15071525 let factoryCfg = gfc()
15081526 let lpAssetId = cfgLpAssetId
15091527 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
15101528 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
15111529 if ((currentDLp == currentDLp))
15121530 then {
15131531 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
15141532 if ((unstakeInv == unstakeInv))
15151533 then {
15161534 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
15171535 let outAmAmt = r._1
15181536 let outPrAmt = r._2
15191537 let sts = parseIntValue(r._9)
15201538 let state = r._10
1521- let v = if (if (igs())
1522- then true
1523- else (sts == PoolShutdown))
1539+ let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
1540+ then if (igs())
1541+ then true
1542+ else (cfgPoolStatus == PoolShutdown)
1543+ else false
1544+ let v = if (isGetDisabled)
15241545 then throw(("Blocked: " + toString(sts)))
15251546 else true
15261547 if ((v == v))
15271548 then {
15281549 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15291550 if ((burnA == burnA))
15301551 then {
1531- let $t05347053551 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1532- let refreshDLpActions = $t05347053551._1
1533- let updatedDLp = $t05347053551._2
1552+ let $t05409554176 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1553+ let refreshDLpActions = $t05409554176._1
1554+ let updatedDLp = $t05409554176._2
15341555 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15351556 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15361557 then (state ++ refreshDLpActions)
15371558 else throw("Strict value is not equal to itself.")
15381559 }
15391560 else throw("Strict value is not equal to itself.")
15401561 }
15411562 else throw("Strict value is not equal to itself.")
15421563 }
15431564 else throw("Strict value is not equal to itself.")
15441565 }
15451566 else throw("Strict value is not equal to itself.")
15461567 }
15471568 else throw("Strict value is not equal to itself.")
15481569 }
15491570
15501571
15511572
15521573 @Callable(i)
15531574 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
1554- let isGetDisabled = if (igs())
1555- then true
1556- else (cfgPoolStatus == PoolShutdown)
1575+ let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
1576+ then if (igs())
1577+ then true
1578+ else (cfgPoolStatus == PoolShutdown)
1579+ else false
15571580 let checks = [if (!(isGetDisabled))
15581581 then true
15591582 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
15601583 then true
15611584 else throw("no payments are expected")]
15621585 if ((checks == checks))
15631586 then {
15641587 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
15651588 if ((currentDLp == currentDLp))
15661589 then {
15671590 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
15681591 if ((unstakeInv == unstakeInv))
15691592 then {
15701593 let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
15711594 let outAmAmt = res._1
15721595 let outPrAmt = res._2
15731596 let state = res._10
15741597 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
15751598 then true
15761599 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
15771600 then true
15781601 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
15791602 if ((checkAmounts == checkAmounts))
15801603 then {
15811604 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15821605 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15831606 then {
1584- let $t05480254883 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1585- let refreshDLpActions = $t05480254883._1
1586- let updatedDLp = $t05480254883._2
1607+ let $t05546455545 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1608+ let refreshDLpActions = $t05546455545._1
1609+ let updatedDLp = $t05546455545._2
15871610 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15881611 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15891612 then (state ++ refreshDLpActions)
15901613 else throw("Strict value is not equal to itself.")
15911614 }
15921615 else throw("Strict value is not equal to itself.")
15931616 }
15941617 else throw("Strict value is not equal to itself.")
15951618 }
15961619 else throw("Strict value is not equal to itself.")
15971620 }
15981621 else throw("Strict value is not equal to itself.")
15991622 }
16001623 else throw("Strict value is not equal to itself.")
16011624 }
16021625
16031626
16041627
16051628 @Callable(i)
16061629 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
16071630 let isPoolOneTokenOperationsDisabled = {
16081631 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
16091632 if ($isInstanceOf(@, "Boolean"))
16101633 then @
16111634 else throw(($getType(@) + " couldn't be cast to Boolean"))
16121635 }
1613- let isGetDisabled = if (if (igs())
1614- then true
1615- else (cfgPoolStatus == PoolShutdown))
1616- then true
1617- else isPoolOneTokenOperationsDisabled
1636+ let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
1637+ then if (if (igs())
1638+ then true
1639+ else (cfgPoolStatus == PoolShutdown))
1640+ then true
1641+ else isPoolOneTokenOperationsDisabled
1642+ else false
16181643 let checks = [if (if (!(isGetDisabled))
16191644 then true
16201645 else isManager(i))
16211646 then true
16221647 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
16231648 then true
16241649 else throwErr("no payments are expected")]
16251650 if ((checks == checks))
16261651 then {
16271652 let factoryCfg = gfc()
16281653 let lpAssetId = cfgLpAssetId
16291654 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
16301655 let userAddress = i.caller
16311656 let lpAssetRecipientAddress = this
16321657 let unstakeInv = invoke(staking, "unstakeINTERNAL", [lpAssetId, unstakeAmount, userAddress.bytes, lpAssetRecipientAddress.bytes], nil)
16331658 if ((unstakeInv == unstakeInv))
16341659 then {
1635- let $t05590556093 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1636- let state = $t05590556093._1
1637- let totalAmount = $t05590556093._2
1660+ let $t05660456792 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1661+ let state = $t05660456792._1
1662+ let totalAmount = $t05660456792._2
16381663 $Tuple2(state, totalAmount)
16391664 }
16401665 else throw("Strict value is not equal to itself.")
16411666 }
16421667 else throw("Strict value is not equal to itself.")
16431668 }
16441669
16451670
16461671
16471672 @Callable(i)
16481673 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1649- let $t05622156324 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1650- let lpAmount = $t05622156324._1
1651- let state = $t05622156324._2
1652- let feeAmount = $t05622156324._3
1653- let bonus = $t05622156324._4
1674+ let $t05692057023 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1675+ let lpAmount = $t05692057023._1
1676+ let state = $t05692057023._2
1677+ let feeAmount = $t05692057023._3
1678+ let bonus = $t05692057023._4
16541679 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16551680 }
16561681
16571682
16581683
16591684 @Callable(i)
16601685 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1661- let $t05647256576 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1662- let lpAmount = $t05647256576._1
1663- let state = $t05647256576._2
1664- let feeAmount = $t05647256576._3
1665- let bonus = $t05647256576._4
1686+ let $t05717157275 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1687+ let lpAmount = $t05717157275._1
1688+ let state = $t05717157275._2
1689+ let feeAmount = $t05717157275._3
1690+ let bonus = $t05717157275._4
16661691 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16671692 }
16681693
16691694
16701695
16711696 @Callable(i)
16721697 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
16731698 then throw("denied")
16741699 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr), StringEntry(amp(), toString(ampInitial)), StringEntry(keyAmpHistory(height), toString(ampInitial))], "success")
16751700
16761701
16771702
16781703 @Callable(i)
16791704 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
16801705
16811706
16821707
16831708 @Callable(i)
16841709 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
16851710
16861711
16871712
16881713 @Callable(i)
16891714 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
16901715 let pr = calcPrices(amAmt, prAmt, lpAmt)
16911716 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
16921717 }
16931718
16941719
16951720
16961721 @Callable(i)
16971722 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
16981723
16991724
17001725
17011726 @Callable(i)
17021727 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
17031728
17041729
17051730
17061731 @Callable(i)
17071732 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
17081733
17091734
17101735
17111736 @Callable(i)
17121737 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, ""))
17131738
17141739
17151740
17161741 @Callable(i)
17171742 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
17181743 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
17191744 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
17201745 }
17211746
17221747
17231748
17241749 @Callable(i)
17251750 func changeAmp () = {
17261751 let cfg = invoke(fca, "getChangeAmpConfigREADONLY", [toString(this)], nil)
1727- let $t05905659255 = match cfg {
1752+ let $t05975559954 = match cfg {
17281753 case list: List[Any] =>
17291754 $Tuple3({
17301755 let @ = list[0]
17311756 if ($isInstanceOf(@, "Int"))
17321757 then @
17331758 else throw(($getType(@) + " couldn't be cast to Int"))
17341759 }, {
17351760 let @ = list[1]
17361761 if ($isInstanceOf(@, "Int"))
17371762 then @
17381763 else throw(($getType(@) + " couldn't be cast to Int"))
17391764 }, {
17401765 let @ = list[2]
17411766 if ($isInstanceOf(@, "Int"))
17421767 then @
17431768 else throw(($getType(@) + " couldn't be cast to Int"))
17441769 })
17451770 case _ =>
17461771 throwErr("invalid entry type")
17471772 }
1748- let delay = $t05905659255._1
1749- let delta = $t05905659255._2
1750- let target = $t05905659255._3
1773+ let delay = $t05975559954._1
1774+ let delta = $t05975559954._2
1775+ let target = $t05975559954._3
17511776 let curAmp = parseIntValue(getStringValue(amp()))
17521777 let newAmpRaw = (curAmp + delta)
17531778 let newAmp = if ((0 > delta))
17541779 then if ((target > newAmpRaw))
17551780 then target
17561781 else newAmpRaw
17571782 else if ((newAmpRaw > target))
17581783 then target
17591784 else newAmpRaw
17601785 let lastCall = valueOrElse(getInteger(keyChangeAmpLastCall()), 0)
17611786 let wait = (lastCall + delay)
17621787 let checks = [if ((height > wait))
17631788 then true
17641789 else throwErr("try again in few blocks"), if ((curAmp != newAmp))
17651790 then true
17661791 else throwErr("already reached target")]
17671792 if ((checks == checks))
17681793 then [IntegerEntry(keyChangeAmpLastCall(), height), StringEntry(amp(), toString(newAmp)), StringEntry(keyAmpHistory(height), toString(newAmp))]
17691794 else throw("Strict value is not equal to itself.")
17701795 }
17711796
17721797
17731798 @Verifier(tx)
17741799 func verify () = {
17751800 let targetPublicKey = match managerPublicKeyOrUnit() {
17761801 case pk: ByteVector =>
17771802 pk
17781803 case _: Unit =>
17791804 tx.senderPublicKey
17801805 case _ =>
17811806 throw("Match error")
17821807 }
17831808 match tx {
17841809 case order: Order =>
17851810 let matcherPub = mp()
1786- let $t06018860305 = if (skipOrderValidation())
1811+ let $t06088761004 = if (skipOrderValidation())
17871812 then $Tuple2(true, "")
17881813 else validateMatcherOrderAllowed(order)
1789- let orderValid = $t06018860305._1
1790- let orderValidInfo = $t06018860305._2
1814+ let orderValid = $t06088761004._1
1815+ let orderValidInfo = $t06088761004._2
17911816 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
17921817 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
17931818 if (if (if (orderValid)
17941819 then senderValid
17951820 else false)
17961821 then matcherValid
17971822 else false)
17981823 then true
17991824 else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
18001825 case s: SetScriptTransaction =>
18011826 if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
18021827 then true
18031828 else {
18041829 let newHash = blake2b256(value(s.script))
18051830 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
18061831 let currentHash = scriptHash(this)
18071832 if ((allowedHash == newHash))
18081833 then (currentHash != newHash)
18091834 else false
18101835 }
18111836 case _ =>
18121837 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
18131838 }
18141839 }
18151840

github/deemru/w8io/786bc32 
242.37 ms