tx · 9Ft1Qc5C8se9GnkKQUQCbKSsG5yfjwXr4bxMc87PkQyU

3N2aqRmNtj7an2Pyvxc9R2uxvBv1PbvtK42:  -0.01700000 Waves

2022.10.27 00:01 [2289910] smart account 3N2aqRmNtj7an2Pyvxc9R2uxvBv1PbvtK42 > SELF 0.00000000 Waves

{ "type": 13, "id": "9Ft1Qc5C8se9GnkKQUQCbKSsG5yfjwXr4bxMc87PkQyU", "fee": 1700000, "feeAssetId": null, "timestamp": 1666818124970, "version": 2, "chainId": 84, "sender": "3N2aqRmNtj7an2Pyvxc9R2uxvBv1PbvtK42", "senderPublicKey": "4mZfsmdsxX2XvPM1sFzg7KQXcykmxdKtWrpt5et9bhot", "proofs": [ "4jtf8ioQFGYzq5jJkN5Vi4SvqNRMc25ALPBmbkUi3TUiGHtkwY9zdEXwyqDjiK329Kx3ah2kh3eNZxbGgFdvuMUq" ], "script": "base64:BgJECAISAwoBCBIAEgMKAQgSAwoBCBIDCgEIEgcKBQgIAQEIEgMKAQgSBAoCCAgSBQoDCAgBEgMKAQgSAwoBCBIFCgMICAguAAV3YXZlcwCAwtcvAA50aWNrZXRQcmljZUludADAhD0AC3RpY2tldFByaWNlBQ50aWNrZXRQcmljZUludAAGaW52RmVlAKDCHgASd2l0aGRyYXdGZWVQZXJjZW50AAUAFmZlZUNvbGxlY3RvckFkZHJlc3NLZXkCE2ZlZUNvbGxlY3RvckFkZHJlc3MAGXRvdXJuYW1lbnRCdXlJbkZlZVBlcmNlbnQACgAOZGVwb3NpdEFzc2V0SWQCLDV1ZTFmaXVWNmo2VUJyNlhmMjhRbXM2eTVGcXpLdHF2YXh4aHd1N2hUUTU4AB9hbGxvd2VkU3BlY2lhbFRvdXJuYW1lbnRDcmVhdG9yAiMzTXpDVTl6UHRFUWVUNFhpQmtNb2hzMWYxS3E1MWkyajZ0MwENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAESZ2V0VGlja2V0c0NvdW50S2V5AQ1hZGRyZXNzU3RyaW5nCQCsAgIFDWFkZHJlc3NTdHJpbmcCDV90aWNrZXRzQ291bnQBImJ1eUluQW1vdW50Rm9yVG91cm5hbWVudEZvckFjY291bnQCDHRvdXJuYW1lbnRJZAdhY2NvdW50CQCsAgIJAKwCAgUMdG91cm5hbWVudElkAhdfYnV5SW5BbW91bnRGb3JBY2NvdW50XwUHYWNjb3VudAEjYnV5SW5Bc3NldElkRm9yVG91cm5hbWVudEZvckFjY291bnQCDHRvdXJuYW1lbnRJZAdhY2NvdW50CQCsAgIJAKwCAgUMdG91cm5hbWVudElkAhhfYnV5SW5Bc3NldElkRm9yQWNjb3VudF8FB2FjY291bnQBHXRpY2tldEZvclRvdXJuYW1lbnRGb3JBY2NvdW50Agx0b3VybmFtZW50SWQHYWNjb3VudAkArAICCQCsAgIFDHRvdXJuYW1lbnRJZAISX3RpY2tldEZvckFjY291bnRfBQdhY2NvdW50ASZ0b3VybmFtZW50VG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudEtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIkX3RvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50AS90b3VybmFtZW50VG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudE1pbnVzRmVlc0tleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAItX3RvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50TWludXNGZWVzARR0b3VybmFtZW50Q3JlYXRvcktleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAISX3RvdXJuYW1lbnRDcmVhdG9yARF0b3VybmFtZW50TmFtZUtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIPX3RvdXJuYW1lbnROYW1lARh0b3VybmFtZW50UHJpemVBbW91bnRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCFl90b3VybmFtZW50UHJpemVBbW91bnQBHHRvdXJuYW1lbnRNYXhQbGF5ZXJzQ291bnRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCGl90b3VybmFtZW50TWF4UGxheWVyc0NvdW50ARl0b3VybmFtZW50UGxheWVyc0NvdW50S2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhdfdG91cm5hbWVudFBsYXllcnNDb3VudAEZdG91cm5hbWVudFByaXplQXNzZXRJZEtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIXX3RvdXJuYW1lbnRQcml6ZUFzc2V0SWQBG3RvdXJuYW1lbnRQcml6ZUFzc2V0TmFtZUtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIZX3RvdXJuYW1lbnRQcml6ZUFzc2V0TmFtZQEYdG91cm5hbWVudEJ1eUluQW1vdW50S2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhZfdG91cm5hbWVudEJ1eUluQW1vdW50ARl0b3VybmFtZW50QnV5SW5Bc3NldElkS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhdfdG91cm5hbWVudEJ1eUluQXNzZXRJZAEbdG91cm5hbWVudEJ1eUluQXNzZXROYW1lS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhlfdG91cm5hbWVudEJ1eUluQXNzZXROYW1lAR90b3VybmFtZW50QnV5SW5Bc3NldERlY2ltYWxzS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAh1fdG91cm5hbWVudEJ1eUluQXNzZXREZWNpbWFscwEfdG91cm5hbWVudFByaXplQXNzZXREZWNpbWFsc0tleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIdX3RvdXJuYW1lbnRQcml6ZUFzc2V0RGVjaW1hbHMBE3RvdXJuYW1lbnRTdGF0dXNLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCEV90b3VybmFtZW50U3RhdHVzAR50b3VybmFtZW50QnV5SW5GZWVDb2xsZWN0ZWRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCHF90b3VybmFtZW50QnV5SW5GZWVDb2xsZWN0ZWQBIHRvdXJuYW1lbnRTZXJ2aWNlRmVlQ29sbGVjdGVkS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAh5fdG91cm5hbWVudFNlcnZpY2VGZWVDb2xsZWN0ZWQBIXRvdXJuYW1lbnRXaW5uaW5nVHJhbnNhY3Rpb25JZEtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIfX3RvdXJuYW1lbnRXaW5uaW5nVHJhbnNhY3Rpb25JZAENZ2FtZVdpbm5lcktleQEGZ2FtZUlkCQCsAgIFBmdhbWVJZAIHX3dpbm5lcgEYYWRkcmVzc0F2YWlsYWJsZUZ1bmRzS2V5AQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCD19hdmFpbGFibGVGdW5kcwEaYWRkcmVzc1RvdGFsTG9ja2VkRnVuZHNLZXkBB2FkZHJlc3MJAKwCAgUHYWRkcmVzcwIRX3RvdGFsTG9ja2VkRnVuZHMBIWFkZHJlc3NMb2NrZWRGdW5kc1RvdGFsSGlzdG9yeUtleQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAhhfbG9ja2VkRnVuZHNUb3RhbEhpc3RvcnkBHGFkZHJlc3NMb2NrZWRGdW5kc0ZvckdhbWVLZXkCB2FkZHJlc3MGZ2FtZUlkCQCsAgIJAKwCAgUHYWRkcmVzcwINX2xvY2tlZEZ1bmRzXwUGZ2FtZUlkARphZGRyZXNzQXZhaWxhYmxlUmV3YXJkc0tleQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAhFfYXZhaWxhYmxlUmV3YXJkcwEXdmlkZW9Qb2tlckJldEZvckFjY291bnQCBmdhbWVJZAdhY2NvdW50CQCsAgIJAKwCAgUGZ2FtZUlkAhJfdmlkZW9Qb2tlckJldEZvcl8FB2FjY291bnQBF3ZpZGVvUG9rZXJDYXJkc0RyYXduS2V5AQZnYW1lSWQJAKwCAgUGZ2FtZUlkAhVfdmlkZW9Qb2tlckNhcmRzRHJhd24BE3ZpZGVvUG9rZXJSZXN1bHRLZXkBBmdhbWVJZAkArAICBQZnYW1lSWQCEV92aWRlb1Bva2VyUmVzdWx0ARl2aWRlb1Bva2VyUmVzdWx0UHJvZml0S2V5AQZnYW1lSWQJAKwCAgUGZ2FtZUlkAhdfdmlkZW9Qb2tlclJlc3VsdFByb2ZpdAETdmlkZW9Qb2tlclN0YXR1c0tleQEGZ2FtZUlkCQCsAgIFBmdhbWVJZAIRX3ZpZGVvUG9rZXJTdGF0dXMBGnZpZGVvUG9rZXJQbGF5ZXJBZGRyZXNzS2V5AQZnYW1lSWQJAKwCAgUGZ2FtZUlkAhhfdmlkZW9Qb2tlclBsYXllckFkZHJlc3MBD2dldFRpY2tldHNDb3VudAENYWRkcmVzc1N0cmluZwkBDXRyeUdldEludGVnZXIBCQESZ2V0VGlja2V0c0NvdW50S2V5AQUNYWRkcmVzc1N0cmluZwENY29uc3VtZVRpY2tldAEKcGxheWVyQWRkcgQSY3VycmVudFRpY2tldENvdW50CQEPZ2V0VGlja2V0c0NvdW50AQUKcGxheWVyQWRkcgQVbmV3Q3VycmVudFRpY2tldENvdW50CQBlAgUSY3VycmVudFRpY2tldENvdW50AAEDCQBmAgAABRVuZXdDdXJyZW50VGlja2V0Q291bnQAAAUVbmV3Q3VycmVudFRpY2tldENvdW50DAFpARZzZXRGZWVDb2xsZWN0b3JBZGRyZXNzAQ1jb2xsZWN0b3JBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gT25seQkAzAgCCQELU3RyaW5nRW50cnkCBRZmZWVDb2xsZWN0b3JBZGRyZXNzS2V5BQ1jb2xsZWN0b3JBZGRyBQNuaWwBaQEMZGVwb3NpdEZ1bmRzAAQDcG10AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQACAQIhUGxlYXNlIGF0dGFjaCBleGFjdGx5IG9uZSBwYXltZW50AwkBAiE9AggFA3BtdAdhc3NldElkCQDZBAEFDmRlcG9zaXRBc3NldElkCQACAQIZWW91IGNhbiBvbmx5IGRlcG9zaXQgVVNETgQNY2FsbGVyQWRkclN0cgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBVjdXJyZW50QXZhaWxhYmxlRnVuZHMJAQ10cnlHZXRJbnRlZ2VyAQkBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIJAGQCBRVjdXJyZW50QXZhaWxhYmxlRnVuZHMIBQNwbXQGYW1vdW50BQNuaWwAAQFpARhjYW5jZWxTaWduVXBUb1RvdXJuYW1lbnQBDHRvdXJuYW1lbnRJZAQQdG91cm5hbWVudFN0YXR1cwkBEUBleHRyTmF0aXZlKDEwNTgpAQkBE3RvdXJuYW1lbnRTdGF0dXNLZXkBBQx0b3VybmFtZW50SWQDCQECIT0CBRB0b3VybmFtZW50U3RhdHVzAgxyZWdpc3RyYXRpb24JAAIBAihUb3VybmFtZW50IGlzIG5vdCBpbiByZWdpc3RyYXRpb24gcGhhc2UhBA1jYWxsZXJBZGRyU3RyCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMED3BhaWRCdXlJbkFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBImJ1eUluQW1vdW50Rm9yVG91cm5hbWVudEZvckFjY291bnQCBQx0b3VybmFtZW50SWQFDWNhbGxlckFkZHJTdHIEEHBhaWRCdXlJbkFzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDU4KQEJASNidXlJbkFzc2V0SWRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgQdYWxyZWFkeVJlZ2lzdGVyZWRQbGF5ZXJzQ291bnQJAQ10cnlHZXRJbnRlZ2VyAQkBGXRvdXJuYW1lbnRQbGF5ZXJzQ291bnRLZXkBBQx0b3VybmFtZW50SWQEGXRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnQJAGUCCQENdHJ5R2V0SW50ZWdlcgEJASZ0b3VybmFtZW50VG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAUPcGFpZEJ1eUluQW1vdW50BAlmZWVzVGFrZW4JAGsDBRl0b3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50BRl0b3VybmFtZW50QnV5SW5GZWVQZXJjZW50AGQJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1jYWxsZXJBZGRyU3RyBQ9wYWlkQnV5SW5BbW91bnQJANkEAQUQcGFpZEJ1eUluQXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEddGlja2V0Rm9yVG91cm5hbWVudEZvckFjY291bnQCBQx0b3VybmFtZW50SWQFDWNhbGxlckFkZHJTdHIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBImJ1eUluQW1vdW50Rm9yVG91cm5hbWVudEZvckFjY291bnQCBQx0b3VybmFtZW50SWQFDWNhbGxlckFkZHJTdHIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBI2J1eUluQXNzZXRJZEZvclRvdXJuYW1lbnRGb3JBY2NvdW50AgUMdG91cm5hbWVudElkBQ1jYWxsZXJBZGRyU3RyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZdG91cm5hbWVudFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAkAZQIFHWFscmVhZHlSZWdpc3RlcmVkUGxheWVyc0NvdW50AAEJAMwIAgkBDEludGVnZXJFbnRyeQIJASZ0b3VybmFtZW50VG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAUZdG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBL3RvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50TWludXNGZWVzS2V5AQUMdG91cm5hbWVudElkCQBlAgUZdG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudAUJZmVlc1Rha2VuBQNuaWwAAQFpARJzaWduVXBUb1RvdXJuYW1lbnQBDHRvdXJuYW1lbnRJZAQPbWF4UGxheWVyc0NvdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEcdG91cm5hbWVudE1heFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAQdYWxyZWFkeVJlZ2lzdGVyZWRQbGF5ZXJzQ291bnQJAQ10cnlHZXRJbnRlZ2VyAQkBGXRvdXJuYW1lbnRQbGF5ZXJzQ291bnRLZXkBBQx0b3VybmFtZW50SWQEEHRvdXJuYW1lbnRTdGF0dXMJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARN0b3VybmFtZW50U3RhdHVzS2V5AQUMdG91cm5hbWVudElkAwMJAQIhPQIFEHRvdXJuYW1lbnRTdGF0dXMCDHJlZ2lzdHJhdGlvbgkBAiE9AgUQdG91cm5hbWVudFN0YXR1cwIHc3RhcnRlZAcJAAIBAihUb3VybmFtZW50IGlzIG5vdCBpbiByZWdpc3RyYXRpb24gcGhhc2UhAwkAAAIFHWFscmVhZHlSZWdpc3RlcmVkUGxheWVyc0NvdW50BQ9tYXhQbGF5ZXJzQ291bnQJAAIBAjVUb3VybmFtZW50IGlzIGN1cnJlbnRseSBmdWxsLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIQQDcG10AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQACAQIhUGxlYXNlIGF0dGFjaCBleGFjdGx5IG9uZSBwYXltZW50BAxidXlJbkFzc2V0aWQEByRtYXRjaDAIBQNwbXQHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgRVbml0BAFiBQckbWF0Y2gwAgADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA2AQBBQFiCQACAQILTWF0Y2ggZXJyb3IEE2J1eUluUmVxdWlyZWRBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJARh0b3VybmFtZW50QnV5SW5BbW91bnRLZXkBBQx0b3VybmFtZW50SWQEFGJ1eUluUmVxdWlyZWRBc3NldElkCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQEZdG91cm5hbWVudEJ1eUluQXNzZXRJZEtleQEFDHRvdXJuYW1lbnRJZAMJAQIhPQIFE2J1eUluUmVxdWlyZWRBbW91bnQIBQNwbXQGYW1vdW50CQACAQkArAICAixBdHRhY2hlZCBwYXltZW50IGFtb3VudCBpcyBpbnZhbGlkLCBtdXN0IGJlIAkApAMBBRNidXlJblJlcXVpcmVkQW1vdW50AwkBAiE9AgUUYnV5SW5SZXF1aXJlZEFzc2V0SWQFDGJ1eUluQXNzZXRpZAkAAgEJAKwCAgIuQXR0YWNoZWQgcGF5bWVudCBhc3NldCBpZCBpcyBpbnZhbGlkLCBtdXN0IGJlIAUUYnV5SW5SZXF1aXJlZEFzc2V0SWQEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQZdG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkBJnRvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50S2V5AQUMdG91cm5hbWVudElkCAUDcG10BmFtb3VudAQJZmVlc1Rha2VuCQBrAwUZdG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudAUZdG91cm5hbWVudEJ1eUluRmVlUGVyY2VudABkCQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAR10aWNrZXRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgYJAMwIAgkBDEludGVnZXJFbnRyeQIJASJidXlJbkFtb3VudEZvclRvdXJuYW1lbnRGb3JBY2NvdW50AgUMdG91cm5hbWVudElkBQ1jYWxsZXJBZGRyU3RyCAUDcG10BmFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQEjYnV5SW5Bc3NldElkRm9yVG91cm5hbWVudEZvckFjY291bnQCBQx0b3VybmFtZW50SWQFDWNhbGxlckFkZHJTdHIFDGJ1eUluQXNzZXRpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGXRvdXJuYW1lbnRQbGF5ZXJzQ291bnRLZXkBBQx0b3VybmFtZW50SWQJAGQCBR1hbHJlYWR5UmVnaXN0ZXJlZFBsYXllcnNDb3VudAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEmdG91cm5hbWVudFRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnRLZXkBBQx0b3VybmFtZW50SWQFGXRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAS90b3VybmFtZW50VG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudE1pbnVzRmVlc0tleQEFDHRvdXJuYW1lbnRJZAkAZQIFGXRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnQFCWZlZXNUYWtlbgUDbmlsAAEBaQEQY2FuY2VsVG91cm5hbWVudAEMdG91cm5hbWVudElkBA1jYWxsZXJBZGRyU3RyCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEEXRvdXJuYW1lbnRDcmVhdG9yCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEUdG91cm5hbWVudENyZWF0b3JLZXkBBQx0b3VybmFtZW50SWQEDGNyZWF0b3JDaGVjawMJAAACBRF0b3VybmFtZW50Q3JlYXRvcgUNY2FsbGVyQWRkclN0cgYDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgkAAgECJk9ubHkgdG91cm5hbWVudCBjcmVhdG9yIGNhbiBjYW5jZWwgaXQhAwkAAAIFDGNyZWF0b3JDaGVjawUMY3JlYXRvckNoZWNrBBB0b3VybmFtZW50U3RhdHVzCQERQGV4dHJOYXRpdmUoMTA1OCkBCQETdG91cm5hbWVudFN0YXR1c0tleQEFDHRvdXJuYW1lbnRJZAMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAQIhPQIFEHRvdXJuYW1lbnRTdGF0dXMCDHJlZ2lzdHJhdGlvbgcJAAIBAihUb3VybmFtZW50IGlzIG5vdCBpbiByZWdpc3RyYXRpb24gcGhhc2UhBB1hbHJlYWR5UmVnaXN0ZXJlZFBsYXllcnNDb3VudAkBDXRyeUdldEludGVnZXIBCQEZdG91cm5hbWVudFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAMJAGYCBR1hbHJlYWR5UmVnaXN0ZXJlZFBsYXllcnNDb3VudAAACQACAQJFQ2Fubm90IGNhbmNlbCBhIHRvdXJuYW1lbnQgd2hlbiBwbGF5ZXJzIGFyZSBhbHJlYWR5IHJlZ2lzdGVyZWQgdG8gaXQhBBV0b3VybmFtZW50UHJpemVBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDU1KQEJARh0b3VybmFtZW50UHJpemVBbW91bnRLZXkBBQx0b3VybmFtZW50SWQEFnRvdXJuYW1lbnRQcml6ZUFzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARl0b3VybmFtZW50UHJpemVBc3NldElkS2V5AQUMdG91cm5hbWVudElkCQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGHRvdXJuYW1lbnRQcml6ZUFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEZdG91cm5hbWVudFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEcdG91cm5hbWVudE1heFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEZdG91cm5hbWVudFByaXplQXNzZXRJZEtleQEFDHRvdXJuYW1lbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEbdG91cm5hbWVudFByaXplQXNzZXROYW1lS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAR90b3VybmFtZW50UHJpemVBc3NldERlY2ltYWxzS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARN0b3VybmFtZW50U3RhdHVzS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARh0b3VybmFtZW50QnV5SW5BbW91bnRLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBG3RvdXJuYW1lbnRCdXlJbkFzc2V0TmFtZUtleQEFDHRvdXJuYW1lbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEfdG91cm5hbWVudEJ1eUluQXNzZXREZWNpbWFsc0tleQEFDHRvdXJuYW1lbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEZdG91cm5hbWVudEJ1eUluQXNzZXRJZEtleQEFDHRvdXJuYW1lbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQERdG91cm5hbWVudE5hbWVLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBFHRvdXJuYW1lbnRDcmVhdG9yS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEXRvdXJuYW1lbnRDcmVhdG9yBRV0b3VybmFtZW50UHJpemVBbW91bnQJANkEAQUWdG91cm5hbWVudFByaXplQXNzZXRJZAUDbmlsAAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQY3JlYXRlVG91cm5hbWVudAUMdG91cm5hbWVudElkBG5hbWUMcGxheWVyc0NvdW50C2J1eUluQW1vdW50DGJ1eUluQXNzZXRJZAQDcG10AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAABA1jYWxsZXJBZGRyU3RyCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMDCQAAAgUNY2FsbGVyQWRkclN0cgUfYWxsb3dlZFNwZWNpYWxUb3VybmFtZW50Q3JlYXRvcgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQAAAkAAgECIVBsZWFzZSBhdHRhY2ggZXhhY3RseSBvbmUgcGF5bWVudAQRdG91cm5hbWVudENyZWF0b3IEByRtYXRjaDAJAKIIAQkBFHRvdXJuYW1lbnRDcmVhdG9yS2V5AQUMdG91cm5hbWVudElkAwkAAQIFByRtYXRjaDACBlN0cmluZwQHY3JlYXRvcgUHJG1hdGNoMAkAAgEJAKwCAgInVG91cm5hbWVudCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoaXMgaWQgBQx0b3VybmFtZW50SWQFBHVuaXQDCQAAAgURdG91cm5hbWVudENyZWF0b3IFEXRvdXJuYW1lbnRDcmVhdG9yBAxwcml6ZUFzc2V0SWQEByRtYXRjaDAIBQNwbXQHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgRVbml0BAFiBQckbWF0Y2gwAgADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA2AQBBQFiCQACAQILTWF0Y2ggZXJyb3IEDGFzc2V0RGV0YWlscwQHJG1hdGNoMAgFA3BtdAdhc3NldElkAwkAAQIFByRtYXRjaDACBFVuaXQEAWIFByRtYXRjaDAJAMwIAgIFV2F2ZXMJAMwIAgAIBQNuaWwDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAQHJG1hdGNoMQkA7AcBBQFiAwkAAQIFByRtYXRjaDECBUFzc2V0BAVhc3NldAUHJG1hdGNoMQkAzAgCCAUFYXNzZXQEbmFtZQkAzAgCCAUFYXNzZXQIZGVjaW1hbHMFA25pbAkAAgECEENhbid0IGZpbmQgYXNzZXQJAAIBAgtNYXRjaCBlcnJvcgQKYnV5SW5Bc3NldAQHJG1hdGNoMAkA7AcBCQDZBAEFDGJ1eUluQXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAJAMwIAggFBWFzc2V0BG5hbWUJAMwIAggFBWFzc2V0CGRlY2ltYWxzBQNuaWwJAMwIAgIACQDMCAIAAAUDbmlsBA1jYWxsZXJBZGRyU3RyCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGHRvdXJuYW1lbnRQcml6ZUFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAgFA3BtdAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARl0b3VybmFtZW50UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJARx0b3VybmFtZW50TWF4UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkBQxwbGF5ZXJzQ291bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBGXRvdXJuYW1lbnRQcml6ZUFzc2V0SWRLZXkBBQx0b3VybmFtZW50SWQFDHByaXplQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQEbdG91cm5hbWVudFByaXplQXNzZXROYW1lS2V5AQUMdG91cm5hbWVudElkCgABQAkAkQMCBQxhc3NldERldGFpbHMAAAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcJAMwIAgkBDEludGVnZXJFbnRyeQIJAR90b3VybmFtZW50UHJpemVBc3NldERlY2ltYWxzS2V5AQUMdG91cm5hbWVudElkCgABQAkAkQMCBQxhc3NldERldGFpbHMAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBE3RvdXJuYW1lbnRTdGF0dXNLZXkBBQx0b3VybmFtZW50SWQCDHJlZ2lzdHJhdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGHRvdXJuYW1lbnRCdXlJbkFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAULYnV5SW5BbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBG3RvdXJuYW1lbnRCdXlJbkFzc2V0TmFtZUtleQEFDHRvdXJuYW1lbnRJZAoAAUAJAJEDAgUKYnV5SW5Bc3NldAAAAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBH3RvdXJuYW1lbnRCdXlJbkFzc2V0RGVjaW1hbHNLZXkBBQx0b3VybmFtZW50SWQKAAFACQCRAwIFCmJ1eUluQXNzZXQAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBGXRvdXJuYW1lbnRCdXlJbkFzc2V0SWRLZXkBBQx0b3VybmFtZW50SWQFDGJ1eUluQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQERdG91cm5hbWVudE5hbWVLZXkBBQx0b3VybmFtZW50SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFHRvdXJuYW1lbnRDcmVhdG9yS2V5AQUMdG91cm5hbWVudElkBQ1jYWxsZXJBZGRyU3RyBQNuaWwAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ9zdGFydFRvdXJuYW1lbnQBDHRvdXJuYW1lbnRJZAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCkFkbWluIE9ubHkJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQETdG91cm5hbWVudFN0YXR1c0tleQEFDHRvdXJuYW1lbnRJZAIHc3RhcnRlZAUDbmlsAAEBaQEQZmluaXNoVG91cm5hbWVudAIMdG91cm5hbWVudElkHXdpbm5pbmdUcmFuc2ZlcnRUcmFuc2FjdGlvbklkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gT25seQQRdG91cm5hbWVudENyZWF0b3IJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARR0b3VybmFtZW50Q3JlYXRvcktleQEFDHRvdXJuYW1lbnRJZAQadG91cm5hbWVudFRvdGFsQnV5SW5BbW91bnQJAQ10cnlHZXRJbnRlZ2VyAQkBJnRvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50S2V5AQUMdG91cm5hbWVudElkBBV0b3VybmFtZW50QnV5SW5BbW91bnQJARFAZXh0ck5hdGl2ZSgxMDU1KQEJARh0b3VybmFtZW50QnV5SW5BbW91bnRLZXkBBQx0b3VybmFtZW50SWQEFnRvdXJuYW1lbnRCdXlJbkFzc2V0SWQEByRtYXRjaDAJAKIIAQkBGXRvdXJuYW1lbnRCdXlJbkFzc2V0SWRLZXkBBQx0b3VybmFtZW50SWQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAJpZAUHJG1hdGNoMAMJAAACBQJpZAIABQR1bml0CQDZBAEFAmlkBQR1bml0BBJ0b3VybmFtZW50QnV5SW5GZWUJAGsDBRp0b3VybmFtZW50VG90YWxCdXlJbkFtb3VudAUZdG91cm5hbWVudEJ1eUluRmVlUGVyY2VudABkBBV0b3VybmFtZW50UHJpemVBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDU1KQEJARh0b3VybmFtZW50UHJpemVBbW91bnRLZXkBBQx0b3VybmFtZW50SWQDCQBmAgUVdG91cm5hbWVudFByaXplQW1vdW50AAAJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQEhdG91cm5hbWVudFdpbm5pbmdUcmFuc2FjdGlvbklkS2V5AQUMdG91cm5hbWVudElkBR13aW5uaW5nVHJhbnNmZXJ0VHJhbnNhY3Rpb25JZAkAzAgCCQELU3RyaW5nRW50cnkCCQETdG91cm5hbWVudFN0YXR1c0tleQEFDHRvdXJuYW1lbnRJZAIIZmluaXNoZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR50b3VybmFtZW50QnV5SW5GZWVDb2xsZWN0ZWRLZXkBBQx0b3VybmFtZW50SWQFEnRvdXJuYW1lbnRCdXlJbkZlZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBRF0b3VybmFtZW50Q3JlYXRvcgkAZQIFGnRvdXJuYW1lbnRUb3RhbEJ1eUluQW1vdW50BRJ0b3VybmFtZW50QnV5SW5GZWUFFnRvdXJuYW1lbnRCdXlJbkFzc2V0SWQFA25pbAABBApzZXJ2aWNlRmVlCQBrAwUSdG91cm5hbWVudEJ1eUluRmVlABQAZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJASF0b3VybmFtZW50V2lubmluZ1RyYW5zYWN0aW9uSWRLZXkBBQx0b3VybmFtZW50SWQFHXdpbm5pbmdUcmFuc2ZlcnRUcmFuc2FjdGlvbklkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARN0b3VybmFtZW50U3RhdHVzS2V5AQUMdG91cm5hbWVudElkAghmaW5pc2hlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHnRvdXJuYW1lbnRCdXlJbkZlZUNvbGxlY3RlZEtleQEFDHRvdXJuYW1lbnRJZAUSdG91cm5hbWVudEJ1eUluRmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEgdG91cm5hbWVudFNlcnZpY2VGZWVDb2xsZWN0ZWRLZXkBBQx0b3VybmFtZW50SWQFCnNlcnZpY2VGZWUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQURdG91cm5hbWVudENyZWF0b3IJAGUCBRJ0b3VybmFtZW50QnV5SW5GZWUFCnNlcnZpY2VGZWUFFnRvdXJuYW1lbnRCdXlJbkFzc2V0SWQFA25pbAABAWkBDnBsYXllckV4aXRHYW1lAwZnYW1lSWQKcGxheWVyQWRkcg9leGl0U3RhY2tBbW91bnQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgpBZG1pbiBPbmx5BBdjdXJyZW50VG90YWxMb2NrZWRGdW5kcwkBDXRyeUdldEludGVnZXIBCQEaYWRkcmVzc1RvdGFsTG9ja2VkRnVuZHNLZXkBBQpwbGF5ZXJBZGRyBCBjdXJyZW50R2FtZUxvY2tlZEFtb3VudEZvclBsYXllcgkBDXRyeUdldEludGVnZXIBCQEcYWRkcmVzc0xvY2tlZEZ1bmRzRm9yR2FtZUtleQIFCnBsYXllckFkZHIFBmdhbWVJZAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaYWRkcmVzc1RvdGFsTG9ja2VkRnVuZHNLZXkBBQpwbGF5ZXJBZGRyCQBlAgUXY3VycmVudFRvdGFsTG9ja2VkRnVuZHMFIGN1cnJlbnRHYW1lTG9ja2VkQW1vdW50Rm9yUGxheWVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEcYWRkcmVzc0xvY2tlZEZ1bmRzRm9yR2FtZUtleQIFCnBsYXllckFkZHIFBmdhbWVJZAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCnBsYXllckFkZHIFD2V4aXRTdGFja0Ftb3VudAkA2QQBBQ5kZXBvc2l0QXNzZXRJZAUDbmlsAAEBaQEQbG9ja0Z1bmRzRm9yR2FtZQEGZ2FtZUlkBANwbXQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAiFQbGVhc2UgYXR0YWNoIGV4YWN0bHkgb25lIHBheW1lbnQDCQECIT0CCAUDcG10B2Fzc2V0SWQJANkEAQUOZGVwb3NpdEFzc2V0SWQJAAIBAhlZb3UgY2FuIG9ubHkgZGVwb3NpdCBVU0ROBA1jYWxsZXJBZGRyU3RyCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEF2N1cnJlbnRUb3RhbExvY2tlZEZ1bmRzCQENdHJ5R2V0SW50ZWdlcgEJARphZGRyZXNzVG90YWxMb2NrZWRGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIEHmN1cnJlbnRMb2NrZWRGdW5kc1RvdGFsSGlzdG9yeQkBDXRyeUdldEludGVnZXIBCQEhYWRkcmVzc0xvY2tlZEZ1bmRzVG90YWxIaXN0b3J5S2V5AQUNY2FsbGVyQWRkclN0cgkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaYWRkcmVzc1RvdGFsTG9ja2VkRnVuZHNLZXkBBQ1jYWxsZXJBZGRyU3RyCQBkAgUXY3VycmVudFRvdGFsTG9ja2VkRnVuZHMIBQNwbXQGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEhYWRkcmVzc0xvY2tlZEZ1bmRzVG90YWxIaXN0b3J5S2V5AQUNY2FsbGVyQWRkclN0cgkAZAIFHmN1cnJlbnRMb2NrZWRGdW5kc1RvdGFsSGlzdG9yeQgFA3BtdAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARxhZGRyZXNzTG9ja2VkRnVuZHNGb3JHYW1lS2V5AgUNY2FsbGVyQWRkclN0cgUGZ2FtZUlkCAUDcG10BmFtb3VudAUDbmlsAAEBaQETYmV0T25WaWRlb1Bva2VyR2FtZQEGZ2FtZUlkBANwbXQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAiFQbGVhc2UgYXR0YWNoIGV4YWN0bHkgb25lIHBheW1lbnQDCQECIT0CCAUDcG10B2Fzc2V0SWQJANkEAQUOZGVwb3NpdEFzc2V0SWQJAAIBAhlZb3UgY2FuIG9ubHkgZGVwb3NpdCBVU0ROBA1jYWxsZXJBZGRyU3RyCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF3ZpZGVvUG9rZXJCZXRGb3JBY2NvdW50AgUGZ2FtZUlkBQ1jYWxsZXJBZGRyU3RyCAUDcG10BmFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQEadmlkZW9Qb2tlclBsYXllckFkZHJlc3NLZXkBBQZnYW1lSWQFDWNhbGxlckFkZHJTdHIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBE3ZpZGVvUG9rZXJTdGF0dXNLZXkBBQZnYW1lSWQCB2NyZWF0ZWQFA25pbAABAWkBFGZpbmlzaFZpZGVvUG9rZXJHYW1lAwZnYW1lSWQGcmVzdWx0CmNhcmRzRHJhd24DCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgpBZG1pbiBPbmx5BApwbGF5ZXJBZGRyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEadmlkZW9Qb2tlclBsYXllckFkZHJlc3NLZXkBBQZnYW1lSWQECWJldEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBF3ZpZGVvUG9rZXJCZXRGb3JBY2NvdW50AgUGZ2FtZUlkBQpwbGF5ZXJBZGRyBBFjdXJyZW50R2FtZVN0YXR1cwkBEUBleHRyTmF0aXZlKDEwNTgpAQkBE3ZpZGVvUG9rZXJTdGF0dXNLZXkBBQZnYW1lSWQEC2NoZWNrU3RhdHVzAwkAAAIFEWN1cnJlbnRHYW1lU3RhdHVzAgdjcmVhdGVkBgkAAgECIkdhbWUgaXMgbm90IGluIHRoZSBjb3JyZWN0IHN0YXR1cyEDCQAAAgULY2hlY2tTdGF0dXMFC2NoZWNrU3RhdHVzBA1iZXRNdWx0aXBsaWVyAwkAAAIFBnJlc3VsdAIEUGFpcgABAwkAAAIFBnJlc3VsdAIIVHdvIFBhaXIAAgMJAAACBQZyZXN1bHQCD1RocmVlIG9mIGEgS2luZAADAwkAAAIFBnJlc3VsdAIIU3RyYWlnaHQABAMJAAACBQZyZXN1bHQCBUZsdXNoAAYDCQAAAgUGcmVzdWx0AgpGdWxsIEhvdXNlAAkDCQAAAgUGcmVzdWx0Ag5Gb3VyIG9mIGEgS2luZAAZAwkAAAIFBnJlc3VsdAIOU3RyYWlnaHQgRmx1c2gAMgMJAAACBQZyZXN1bHQCC1JveWFsIEZsdXNoAKAGAAADCQAAAgUNYmV0TXVsdGlwbGllcgUNYmV0TXVsdGlwbGllcgQJYW1vdW50V29uCQBoAgUJYmV0QW1vdW50BQ1iZXRNdWx0aXBsaWVyCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBF3ZpZGVvUG9rZXJDYXJkc0RyYXduS2V5AQUGZ2FtZUlkBQpjYXJkc0RyYXduCQDMCAIJAQtTdHJpbmdFbnRyeQIJARN2aWRlb1Bva2VyUmVzdWx0S2V5AQUGZ2FtZUlkBQZyZXN1bHQJAMwIAgkBDEludGVnZXJFbnRyeQIJARl2aWRlb1Bva2VyUmVzdWx0UHJvZml0S2V5AQUGZ2FtZUlkBQlhbW91bnRXb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBE3ZpZGVvUG9rZXJTdGF0dXNLZXkBBQZnYW1lSWQCCGZpbmlzaGVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCnBsYXllckFkZHIFCWFtb3VudFdvbgkA2QQBBQ5kZXBvc2l0QXNzZXRJZAUDbmlsAAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5DY73/A==", "height": 2289910, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let waves = 100000000
5+
6+let ticketPriceInt = 1000000
7+
8+let ticketPrice = ticketPriceInt
9+
10+let invFee = 500000
11+
12+let withdrawFeePercent = 5
13+
14+let feeCollectorAddressKey = "feeCollectorAddress"
15+
16+let tournamentBuyInFeePercent = 10
17+
18+let depositAssetId = "5ue1fiuV6j6UBr6Xf28Qms6y5FqzKtqvaxxhwu7hTQ58"
19+
20+let allowedSpecialTournamentCreator = "3MzCU9zPtEQeT4XiBkMohs1f1Kq51i2j6t3"
21+
22+func tryGetInteger (key) = match getInteger(this, key) {
23+ case b: Int =>
24+ b
25+ case _ =>
26+ 0
27+}
28+
29+
30+func getTicketsCountKey (addressString) = (addressString + "_ticketsCount")
31+
32+
33+func buyInAmountForTournamentForAccount (tournamentId,account) = ((tournamentId + "_buyInAmountForAccount_") + account)
34+
35+
36+func buyInAssetIdForTournamentForAccount (tournamentId,account) = ((tournamentId + "_buyInAssetIdForAccount_") + account)
37+
38+
39+func ticketForTournamentForAccount (tournamentId,account) = ((tournamentId + "_ticketForAccount_") + account)
40+
41+
42+func tournamentTotalBuyInCollectedAmountKey (tournamentId) = (tournamentId + "_tournamentTotalBuyInCollectedAmount")
43+
44+
45+func tournamentTotalBuyInCollectedAmountMinusFeesKey (tournamentId) = (tournamentId + "_tournamentTotalBuyInCollectedAmountMinusFees")
46+
47+
48+func tournamentCreatorKey (tournamentId) = (tournamentId + "_tournamentCreator")
49+
50+
51+func tournamentNameKey (tournamentId) = (tournamentId + "_tournamentName")
52+
53+
54+func tournamentPrizeAmountKey (tournamentId) = (tournamentId + "_tournamentPrizeAmount")
55+
56+
57+func tournamentMaxPlayersCountKey (tournamentId) = (tournamentId + "_tournamentMaxPlayersCount")
58+
59+
60+func tournamentPlayersCountKey (tournamentId) = (tournamentId + "_tournamentPlayersCount")
61+
62+
63+func tournamentPrizeAssetIdKey (tournamentId) = (tournamentId + "_tournamentPrizeAssetId")
64+
65+
66+func tournamentPrizeAssetNameKey (tournamentId) = (tournamentId + "_tournamentPrizeAssetName")
67+
68+
69+func tournamentBuyInAmountKey (tournamentId) = (tournamentId + "_tournamentBuyInAmount")
70+
71+
72+func tournamentBuyInAssetIdKey (tournamentId) = (tournamentId + "_tournamentBuyInAssetId")
73+
74+
75+func tournamentBuyInAssetNameKey (tournamentId) = (tournamentId + "_tournamentBuyInAssetName")
76+
77+
78+func tournamentBuyInAssetDecimalsKey (tournamentId) = (tournamentId + "_tournamentBuyInAssetDecimals")
79+
80+
81+func tournamentPrizeAssetDecimalsKey (tournamentId) = (tournamentId + "_tournamentPrizeAssetDecimals")
82+
83+
84+func tournamentStatusKey (tournamentId) = (tournamentId + "_tournamentStatus")
85+
86+
87+func tournamentBuyInFeeCollectedKey (tournamentId) = (tournamentId + "_tournamentBuyInFeeCollected")
88+
89+
90+func tournamentServiceFeeCollectedKey (tournamentId) = (tournamentId + "_tournamentServiceFeeCollected")
91+
92+
93+func tournamentWinningTransactionIdKey (tournamentId) = (tournamentId + "_tournamentWinningTransactionId")
94+
95+
96+func gameWinnerKey (gameId) = (gameId + "_winner")
97+
98+
99+func addressAvailableFundsKey (address) = (address + "_availableFunds")
100+
101+
102+func addressTotalLockedFundsKey (address) = (address + "_totalLockedFunds")
103+
104+
105+func addressLockedFundsTotalHistoryKey (address) = (address + "_lockedFundsTotalHistory")
106+
107+
108+func addressLockedFundsForGameKey (address,gameId) = ((address + "_lockedFunds_") + gameId)
109+
110+
111+func addressAvailableRewardsKey (address) = (address + "_availableRewards")
112+
113+
114+func videoPokerBetForAccount (gameId,account) = ((gameId + "_videoPokerBetFor_") + account)
115+
116+
117+func videoPokerCardsDrawnKey (gameId) = (gameId + "_videoPokerCardsDrawn")
118+
119+
120+func videoPokerResultKey (gameId) = (gameId + "_videoPokerResult")
121+
122+
123+func videoPokerResultProfitKey (gameId) = (gameId + "_videoPokerResultProfit")
124+
125+
126+func videoPokerStatusKey (gameId) = (gameId + "_videoPokerStatus")
127+
128+
129+func videoPokerPlayerAddressKey (gameId) = (gameId + "_videoPokerPlayerAddress")
130+
131+
132+func getTicketsCount (addressString) = tryGetInteger(getTicketsCountKey(addressString))
133+
134+
135+func consumeTicket (playerAddr) = {
136+ let currentTicketCount = getTicketsCount(playerAddr)
137+ let newCurrentTicketCount = (currentTicketCount - 1)
138+ if ((0 > newCurrentTicketCount))
139+ then 0
140+ else newCurrentTicketCount
141+ }
142+
143+
144+@Callable(i)
145+func setFeeCollectorAddress (collectorAddr) = if ((i.caller != this))
146+ then throw("Admin Only")
147+ else [StringEntry(feeCollectorAddressKey, collectorAddr)]
148+
149+
150+
151+@Callable(i)
152+func depositFunds () = {
153+ let pmt = if ((size(i.payments) == 1))
154+ then i.payments[0]
155+ else throw("Please attach exactly one payment")
156+ if ((pmt.assetId != fromBase58String(depositAssetId)))
157+ then throw("You can only deposit USDN")
158+ else {
159+ let callerAddrStr = toBase58String(i.caller.bytes)
160+ let currentAvailableFunds = tryGetInteger(addressAvailableFundsKey(callerAddrStr))
161+ $Tuple2([IntegerEntry(addressAvailableFundsKey(callerAddrStr), (currentAvailableFunds + pmt.amount))], 1)
162+ }
163+ }
164+
165+
166+
167+@Callable(i)
168+func cancelSignUpToTournament (tournamentId) = {
169+ let tournamentStatus = getStringValue(tournamentStatusKey(tournamentId))
170+ if ((tournamentStatus != "registration"))
171+ then throw("Tournament is not in registration phase!")
172+ else {
173+ let callerAddrStr = toBase58String(i.caller.bytes)
174+ let paidBuyInAmount = getIntegerValue(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr))
175+ let paidBuyInAssetId = getStringValue(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr))
176+ let alreadyRegisteredPlayersCount = tryGetInteger(tournamentPlayersCountKey(tournamentId))
177+ let totalBuyInCollectedAmount = (tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId)) - paidBuyInAmount)
178+ let feesTaken = fraction(totalBuyInCollectedAmount, tournamentBuyInFeePercent, 100)
179+ $Tuple2([ScriptTransfer(addressFromStringValue(callerAddrStr), paidBuyInAmount, fromBase58String(paidBuyInAssetId)), DeleteEntry(ticketForTournamentForAccount(tournamentId, callerAddrStr)), DeleteEntry(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr)), DeleteEntry(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr)), IntegerEntry(tournamentPlayersCountKey(tournamentId), (alreadyRegisteredPlayersCount - 1)), IntegerEntry(tournamentTotalBuyInCollectedAmountKey(tournamentId), totalBuyInCollectedAmount), IntegerEntry(tournamentTotalBuyInCollectedAmountMinusFeesKey(tournamentId), (totalBuyInCollectedAmount - feesTaken))], 1)
180+ }
181+ }
182+
183+
184+
185+@Callable(i)
186+func signUpToTournament (tournamentId) = {
187+ let maxPlayersCount = getIntegerValue(this, tournamentMaxPlayersCountKey(tournamentId))
188+ let alreadyRegisteredPlayersCount = tryGetInteger(tournamentPlayersCountKey(tournamentId))
189+ let tournamentStatus = getStringValue(tournamentStatusKey(tournamentId))
190+ if (if ((tournamentStatus != "registration"))
191+ then (tournamentStatus != "started")
192+ else false)
193+ then throw("Tournament is not in registration phase!")
194+ else if ((alreadyRegisteredPlayersCount == maxPlayersCount))
195+ then throw("Tournament is currently full, please try again later!")
196+ else {
197+ let pmt = if ((size(i.payments) == 1))
198+ then i.payments[0]
199+ else throw("Please attach exactly one payment")
200+ let buyInAssetid = match pmt.assetId {
201+ case b: Unit =>
202+ ""
203+ case b: ByteVector =>
204+ toBase58String(b)
205+ case _ =>
206+ throw("Match error")
207+ }
208+ let buyInRequiredAmount = getIntegerValue(this, tournamentBuyInAmountKey(tournamentId))
209+ let buyInRequiredAssetId = getStringValue(this, tournamentBuyInAssetIdKey(tournamentId))
210+ if ((buyInRequiredAmount != pmt.amount))
211+ then throw(("Attached payment amount is invalid, must be " + toString(buyInRequiredAmount)))
212+ else if ((buyInRequiredAssetId != buyInAssetid))
213+ then throw(("Attached payment asset id is invalid, must be " + buyInRequiredAssetId))
214+ else {
215+ let callerAddrStr = toBase58String(i.caller.bytes)
216+ let totalBuyInCollectedAmount = (tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId)) + pmt.amount)
217+ let feesTaken = fraction(totalBuyInCollectedAmount, tournamentBuyInFeePercent, 100)
218+ $Tuple2([BooleanEntry(ticketForTournamentForAccount(tournamentId, callerAddrStr), true), IntegerEntry(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr), pmt.amount), StringEntry(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr), buyInAssetid), IntegerEntry(tournamentPlayersCountKey(tournamentId), (alreadyRegisteredPlayersCount + 1)), IntegerEntry(tournamentTotalBuyInCollectedAmountKey(tournamentId), totalBuyInCollectedAmount), IntegerEntry(tournamentTotalBuyInCollectedAmountMinusFeesKey(tournamentId), (totalBuyInCollectedAmount - feesTaken))], 1)
219+ }
220+ }
221+ }
222+
223+
224+
225+@Callable(i)
226+func cancelTournament (tournamentId) = {
227+ let callerAddrStr = toBase58String(i.caller.bytes)
228+ let tournamentCreator = getStringValue(tournamentCreatorKey(tournamentId))
229+ let creatorCheck = if ((tournamentCreator == callerAddrStr))
230+ then true
231+ else if ((i.caller == this))
232+ then true
233+ else throw("Only tournament creator can cancel it!")
234+ if ((creatorCheck == creatorCheck))
235+ then {
236+ let tournamentStatus = getStringValue(tournamentStatusKey(tournamentId))
237+ if (if ((i.caller != this))
238+ then (tournamentStatus != "registration")
239+ else false)
240+ then throw("Tournament is not in registration phase!")
241+ else {
242+ let alreadyRegisteredPlayersCount = tryGetInteger(tournamentPlayersCountKey(tournamentId))
243+ if ((alreadyRegisteredPlayersCount > 0))
244+ then throw("Cannot cancel a tournament when players are already registered to it!")
245+ else {
246+ let tournamentPrizeAmount = getIntegerValue(tournamentPrizeAmountKey(tournamentId))
247+ let tournamentPrizeAssetId = getStringValue(tournamentPrizeAssetIdKey(tournamentId))
248+ $Tuple2([DeleteEntry(tournamentPrizeAmountKey(tournamentId)), DeleteEntry(tournamentPlayersCountKey(tournamentId)), DeleteEntry(tournamentMaxPlayersCountKey(tournamentId)), DeleteEntry(tournamentPrizeAssetIdKey(tournamentId)), DeleteEntry(tournamentPrizeAssetNameKey(tournamentId)), DeleteEntry(tournamentPrizeAssetDecimalsKey(tournamentId)), DeleteEntry(tournamentStatusKey(tournamentId)), DeleteEntry(tournamentBuyInAmountKey(tournamentId)), DeleteEntry(tournamentBuyInAssetNameKey(tournamentId)), DeleteEntry(tournamentBuyInAssetDecimalsKey(tournamentId)), DeleteEntry(tournamentBuyInAssetIdKey(tournamentId)), DeleteEntry(tournamentNameKey(tournamentId)), DeleteEntry(tournamentCreatorKey(tournamentId)), ScriptTransfer(addressFromStringValue(tournamentCreator), tournamentPrizeAmount, fromBase58String(tournamentPrizeAssetId))], 1)
249+ }
250+ }
251+ }
252+ else throw("Strict value is not equal to itself.")
253+ }
254+
255+
256+
257+@Callable(i)
258+func createTournament (tournamentId,name,playersCount,buyInAmount,buyInAssetId) = {
259+ let pmt = if ((size(i.payments) == 1))
260+ then i.payments[0]
261+ else {
262+ let callerAddrStr = toBase58String(i.caller.bytes)
263+ if ((callerAddrStr == allowedSpecialTournamentCreator))
264+ then AttachedPayment(unit, 0)
265+ else throw("Please attach exactly one payment")
266+ }
267+ let tournamentCreator = match getString(tournamentCreatorKey(tournamentId)) {
268+ case creator: String =>
269+ throw(("Tournament already exists with this id " + tournamentId))
270+ case _ =>
271+ unit
272+ }
273+ if ((tournamentCreator == tournamentCreator))
274+ then {
275+ let prizeAssetId = match pmt.assetId {
276+ case b: Unit =>
277+ ""
278+ case b: ByteVector =>
279+ toBase58String(b)
280+ case _ =>
281+ throw("Match error")
282+ }
283+ let assetDetails = match pmt.assetId {
284+ case b: Unit =>
285+["Waves", 8]
286+ case b: ByteVector =>
287+ match assetInfo(b) {
288+ case asset: Asset =>
289+[asset.name, asset.decimals]
290+ case _ =>
291+ throw("Can't find asset")
292+ }
293+ case _ =>
294+ throw("Match error")
295+ }
296+ let buyInAsset = match assetInfo(fromBase58String(buyInAssetId)) {
297+ case asset: Asset =>
298+[asset.name, asset.decimals]
299+ case _ =>
300+["", 0]
301+ }
302+ let callerAddrStr = toBase58String(i.caller.bytes)
303+ $Tuple2([IntegerEntry(tournamentPrizeAmountKey(tournamentId), pmt.amount), IntegerEntry(tournamentPlayersCountKey(tournamentId), 0), IntegerEntry(tournamentMaxPlayersCountKey(tournamentId), playersCount), StringEntry(tournamentPrizeAssetIdKey(tournamentId), prizeAssetId), StringEntry(tournamentPrizeAssetNameKey(tournamentId), {
304+ let @ = assetDetails[0]
305+ if ($isInstanceOf(@, "String"))
306+ then @
307+ else throw(($getType(@) + " couldn't be cast to String"))
308+ }), IntegerEntry(tournamentPrizeAssetDecimalsKey(tournamentId), {
309+ let @ = assetDetails[1]
310+ if ($isInstanceOf(@, "Int"))
311+ then @
312+ else throw(($getType(@) + " couldn't be cast to Int"))
313+ }), StringEntry(tournamentStatusKey(tournamentId), "registration"), IntegerEntry(tournamentBuyInAmountKey(tournamentId), buyInAmount), StringEntry(tournamentBuyInAssetNameKey(tournamentId), {
314+ let @ = buyInAsset[0]
315+ if ($isInstanceOf(@, "String"))
316+ then @
317+ else throw(($getType(@) + " couldn't be cast to String"))
318+ }), IntegerEntry(tournamentBuyInAssetDecimalsKey(tournamentId), {
319+ let @ = buyInAsset[1]
320+ if ($isInstanceOf(@, "Int"))
321+ then @
322+ else throw(($getType(@) + " couldn't be cast to Int"))
323+ }), StringEntry(tournamentBuyInAssetIdKey(tournamentId), buyInAssetId), StringEntry(tournamentNameKey(tournamentId), name), StringEntry(tournamentCreatorKey(tournamentId), callerAddrStr)], 1)
324+ }
325+ else throw("Strict value is not equal to itself.")
326+ }
327+
328+
329+
330+@Callable(i)
331+func startTournament (tournamentId) = if ((i.caller != this))
332+ then throw("Admin Only")
333+ else $Tuple2([StringEntry(tournamentStatusKey(tournamentId), "started")], 1)
334+
335+
336+
337+@Callable(i)
338+func finishTournament (tournamentId,winningTransfertTransactionId) = if ((i.caller != this))
339+ then throw("Admin Only")
340+ else {
341+ let tournamentCreator = getStringValue(tournamentCreatorKey(tournamentId))
342+ let tournamentTotalBuyInAmount = tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId))
343+ let tournamentBuyInAmount = getIntegerValue(tournamentBuyInAmountKey(tournamentId))
344+ let tournamentBuyInAssetId = match getString(tournamentBuyInAssetIdKey(tournamentId)) {
345+ case id: String =>
346+ if ((id == ""))
347+ then unit
348+ else fromBase58String(id)
349+ case _ =>
350+ unit
351+ }
352+ let tournamentBuyInFee = fraction(tournamentTotalBuyInAmount, tournamentBuyInFeePercent, 100)
353+ let tournamentPrizeAmount = getIntegerValue(tournamentPrizeAmountKey(tournamentId))
354+ if ((tournamentPrizeAmount > 0))
355+ then $Tuple2([StringEntry(tournamentWinningTransactionIdKey(tournamentId), winningTransfertTransactionId), StringEntry(tournamentStatusKey(tournamentId), "finished"), IntegerEntry(tournamentBuyInFeeCollectedKey(tournamentId), tournamentBuyInFee), ScriptTransfer(addressFromStringValue(tournamentCreator), (tournamentTotalBuyInAmount - tournamentBuyInFee), tournamentBuyInAssetId)], 1)
356+ else {
357+ let serviceFee = fraction(tournamentBuyInFee, 20, 100)
358+ $Tuple2([StringEntry(tournamentWinningTransactionIdKey(tournamentId), winningTransfertTransactionId), StringEntry(tournamentStatusKey(tournamentId), "finished"), IntegerEntry(tournamentBuyInFeeCollectedKey(tournamentId), tournamentBuyInFee), IntegerEntry(tournamentServiceFeeCollectedKey(tournamentId), serviceFee), ScriptTransfer(addressFromStringValue(tournamentCreator), (tournamentBuyInFee - serviceFee), tournamentBuyInAssetId)], 1)
359+ }
360+ }
361+
362+
363+
364+@Callable(i)
365+func playerExitGame (gameId,playerAddr,exitStackAmount) = if ((i.caller != this))
366+ then throw("Admin Only")
367+ else {
368+ let currentTotalLockedFunds = tryGetInteger(addressTotalLockedFundsKey(playerAddr))
369+ let currentGameLockedAmountForPlayer = tryGetInteger(addressLockedFundsForGameKey(playerAddr, gameId))
370+ $Tuple2([IntegerEntry(addressTotalLockedFundsKey(playerAddr), (currentTotalLockedFunds - currentGameLockedAmountForPlayer)), IntegerEntry(addressLockedFundsForGameKey(playerAddr, gameId), 0), ScriptTransfer(addressFromStringValue(playerAddr), exitStackAmount, fromBase58String(depositAssetId))], 1)
371+ }
372+
373+
374+
375+@Callable(i)
376+func lockFundsForGame (gameId) = {
377+ let pmt = if ((size(i.payments) == 1))
378+ then i.payments[0]
379+ else throw("Please attach exactly one payment")
380+ if ((pmt.assetId != fromBase58String(depositAssetId)))
381+ then throw("You can only deposit USDN")
382+ else {
383+ let callerAddrStr = toBase58String(i.caller.bytes)
384+ let currentTotalLockedFunds = tryGetInteger(addressTotalLockedFundsKey(callerAddrStr))
385+ let currentLockedFundsTotalHistory = tryGetInteger(addressLockedFundsTotalHistoryKey(callerAddrStr))
386+ $Tuple2([IntegerEntry(addressTotalLockedFundsKey(callerAddrStr), (currentTotalLockedFunds + pmt.amount)), IntegerEntry(addressLockedFundsTotalHistoryKey(callerAddrStr), (currentLockedFundsTotalHistory + pmt.amount)), IntegerEntry(addressLockedFundsForGameKey(callerAddrStr, gameId), pmt.amount)], 1)
387+ }
388+ }
389+
390+
391+
392+@Callable(i)
393+func betOnVideoPokerGame (gameId) = {
394+ let pmt = if ((size(i.payments) == 1))
395+ then i.payments[0]
396+ else throw("Please attach exactly one payment")
397+ if ((pmt.assetId != fromBase58String(depositAssetId)))
398+ then throw("You can only deposit USDN")
399+ else {
400+ let callerAddrStr = toBase58String(i.caller.bytes)
401+ $Tuple2([IntegerEntry(videoPokerBetForAccount(gameId, callerAddrStr), pmt.amount), StringEntry(videoPokerPlayerAddressKey(gameId), callerAddrStr), StringEntry(videoPokerStatusKey(gameId), "created")], 1)
402+ }
403+ }
404+
405+
406+
407+@Callable(i)
408+func finishVideoPokerGame (gameId,result,cardsDrawn) = if ((i.caller != this))
409+ then throw("Admin Only")
410+ else {
411+ let playerAddr = getStringValue(videoPokerPlayerAddressKey(gameId))
412+ let betAmount = getIntegerValue(videoPokerBetForAccount(gameId, playerAddr))
413+ let currentGameStatus = getStringValue(videoPokerStatusKey(gameId))
414+ let checkStatus = if ((currentGameStatus == "created"))
415+ then true
416+ else throw("Game is not in the correct status!")
417+ if ((checkStatus == checkStatus))
418+ then {
419+ let betMultiplier = if ((result == "Pair"))
420+ then 1
421+ else if ((result == "Two Pair"))
422+ then 2
423+ else if ((result == "Three of a Kind"))
424+ then 3
425+ else if ((result == "Straight"))
426+ then 4
427+ else if ((result == "Flush"))
428+ then 6
429+ else if ((result == "Full House"))
430+ then 9
431+ else if ((result == "Four of a Kind"))
432+ then 25
433+ else if ((result == "Straight Flush"))
434+ then 50
435+ else if ((result == "Royal Flush"))
436+ then 800
437+ else 0
438+ if ((betMultiplier == betMultiplier))
439+ then {
440+ let amountWon = (betAmount * betMultiplier)
441+ $Tuple2([StringEntry(videoPokerCardsDrawnKey(gameId), cardsDrawn), StringEntry(videoPokerResultKey(gameId), result), IntegerEntry(videoPokerResultProfitKey(gameId), amountWon), StringEntry(videoPokerStatusKey(gameId), "finished"), ScriptTransfer(addressFromStringValue(playerAddr), amountWon, fromBase58String(depositAssetId))], 1)
442+ }
443+ else throw("Strict value is not equal to itself.")
444+ }
445+ else throw("Strict value is not equal to itself.")
446+ }
447+
448+
449+@Verifier(tx)
450+func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
451+

github/deemru/w8io/169f3d6 
30.19 ms