tx · Hy4aWwQ4FbkaX97TBTDfRPgmgpbq1qmZuEE6o8JTQgkB 3P4m4beJ6p1pMPHqCQMAXEdquUuXJz72CMe: -0.03800000 Waves 2023.03.20 21:26 [3564308] smart account 3P4m4beJ6p1pMPHqCQMAXEdquUuXJz72CMe > SELF 0.00000000 Waves
{ "type": 13, "id": "Hy4aWwQ4FbkaX97TBTDfRPgmgpbq1qmZuEE6o8JTQgkB", "fee": 3800000, "feeAssetId": null, "timestamp": 1679336793790, "version": 2, "chainId": 87, "sender": "3P4m4beJ6p1pMPHqCQMAXEdquUuXJz72CMe", "senderPublicKey": "FEt6j4pK9wxVdSAm4KYW3VgCc3ncqq8aJvHM6vC37R64", "proofs": [ "5eEUZaBSeF3jeHrgtRMkwpNCAwoa4bxh64uycE24hWkyMYV7qC1aGXjhLj3rAsN1EWprgsvzsnxv7UrX9pfUeU4S" ], "script": "base64:BgKFAQgCEgMKAQgSAwoBCBIDCgEIEgQKAhgREgMKAQgSBgoECAEBARIECgIIARIFCgMBCBESBQoDAQgREgYKBAEIARESAwoBCBIAEhcKFQgICAEBAQEYCAgICAgICBgYGBgYGBIECgIICBIAEgYKBAgBCAESAwoBCBIDCgEIEgMKAQgSBAoCCAERABRuZnRfY3JlYXRpb25fYWRkcmVzcwkBB0FkZHJlc3MBARoBV5PdxNIX5yAK/fchEk7w8HZnJoMDeNRcTAAVcHJpY2VfaW5jcmVhc2VfcGVyaW9kAAEAD21pbnRfY29sbGVjdGlvbgISQ2xlZiBnZW5lc2lzIHNvbmdzABBtaW50X2Rlc2NyaXB0aW9uAmRHZW5lc2lzIENsZWYgc29uZy4gVGhpcyBtZWxvZHkgaXMgY3JhZnRlZCB0byBiZWNvbWUgeW91ciBlbGVjdHJvbmljIGphbS4gVXNlIGl0IG9uIGNsZWYub25lIPCfkprwn6SNABFoeWJyaWRfY29sbGVjdGlvbgIKQ2xlZiBtaXhlcwASaHlicmlkX2Rlc2NyaXB0aW9uAldDbGVmIG1peC4gVGhpcyBtZWxvZHkgd2FzIGNyZWF0ZWQgYnkgYW4gYWxnb3JpdGhtLiBFbmpveSB0aGlzIGphbSBvciB1c2UgaXQgb24gY2xlZi5vbmUACmluZGljZXNfMjAJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPCQDMCAIAEAkAzAgCABEJAMwIAgASCQDMCAIAEwUDbmlsAQZ0b19rZXkBAW4JANgEAQkAmgMBBQFuAQx1bmlxdWVfYnl0ZXMBAWkJAMsBAgkAywECCQDLAQIJAMsBAggFAWkNdHJhbnNhY3Rpb25JZAgFAWkPY2FsbGVyUHVibGljS2V5CAUJbGFzdEJsb2NrE2dlbmVyYXRpb25TaWduYXR1cmUJAJoDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAJoDAQgFCWxhc3RCbG9jawZoZWlnaHQBC3JhbmRvbV91aW50AgVieXRlcwVub25jZQQBbgkAsQkBCQDUFgEJAMsBAgUFYnl0ZXMJAJoDAQUFbm9uY2UDCQBmAgAABQFuCQEBLQEFAW4FAW4BCHBpY2tfb25lBAVrZXlfMAVrZXlfMQhyYW5kX2ludAliaXRfcG93ZXIDCQAAAgkAagIJAGkCBQhyYW5kX2ludAUJYml0X3Bvd2VyAAIAAAUFa2V5XzAFBWtleV8xARdoeWJyaWRfY2FsY3VsYXRlX2NoYW5nZQMBaQV0b2tlbgZhbW91bnQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEA////////////AQQBcAkAkQMCCAUBaQhwYXltZW50cwAABAdwX3Rva2VuBAckbWF0Y2gwCAUBcAdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAgADCQECIT0CBQdwX3Rva2VuBQV0b2tlbgD///////////8BCQBlAggFAXAGYW1vdW50BQZhbW91bnQBDm1ha2VfaHlicmlkX3R4AwFpBnNvbmdfMAZzb25nXzEEAW4EByRtYXRjaDAJAJ8IAQIFY291bnQDCQABAgUHJG1hdGNoMAIDSW50BAFqBQckbWF0Y2gwBQFqAAAECm5hbWVfc2hvcnQJAK8CAgkArAICAgVDbGVmIAkApAMBBQFuABAEC2Rlc2NyaXB0aW9uBRJoeWJyaWRfZGVzY3JpcHRpb24ECmNvbGxlY3Rpb24FEWh5YnJpZF9jb2xsZWN0aW9uBAJpZAQHJG1hdGNoMAkA/AcEBRRuZnRfY3JlYXRpb25fYWRkcmVzcwIJY3JlYXRlTkZUCQDMCAIFCm5hbWVfc2hvcnQJAMwIAgULZGVzY3JpcHRpb24JAMwIAgkBEUBleHRyTmF0aXZlKDEwNTgpAQIRbWFya2V0X2ltYWdlX2xpbmsJAMwIAgUKY29sbGVjdGlvbgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF4BQckbWF0Y2gwBQF4CQACAQITTkZUIGNyZWF0aW9uIGZhaWxlZAMJAAACBQJpZAUCaWQEBGlkX2IJANkEAQUCaWQEA2tleQkBBnRvX2tleQEFAW4EBWJ5dGVzCQEMdW5pcXVlX2J5dGVzAQUBaQQGcmFuZF8wCQELcmFuZG9tX3VpbnQCBQVieXRlcwAABAZyYW5kXzEJAQtyYW5kb21fdWludAIFBWJ5dGVzAAEJAMwIAgkBDEludGVnZXJFbnRyeQICBWNvdW50CQBkAgUBbgABCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmlkBQNrZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUDa2V5BQJpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCAl9HCQBkAgkAlgMBCQDMCAIJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAKwCAgUGc29uZ18wAgJfRwkAzAgCCQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgIFBnNvbmdfMQICX0cFA25pbAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgNfU0wCAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCA19TTgUGcmFuZF8wCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgRfU1AwBQZzb25nXzAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TUDEFBnNvbmdfMQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9TQjAJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMAABAgRfU0IwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX1NCMQkBEUBleHRyTmF0aXZlKDEwNTUpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8wAAICBF9TQjEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUDa2V5AgRfU0IyCQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzAABAIEX1NCMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCA19TVAkBEUBleHRyTmF0aXZlKDEwNTUpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8wAAgCA19TVAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIEX1NDMAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8wABACBF9TQzAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TQzEJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMAAgAgRfU0MxCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgRfU0MyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzAAQAIEX1NDMgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIEX1NDMwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8wAIABAgRfU0MzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgRfU0M0CQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzAAgAQCBF9TQzQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TQzUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACACAIEX1NDNQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIEX1NDNgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8wAIAQAgRfU0M2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgRfU0M3CQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzAAgCACBF9TQzcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCA19TQQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8wAIBAAgNfU0EJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TSTAJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgAECBF9TSTAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TSTEJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgAICBF9TSTEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TSTIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgAQCBF9TSTIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TSTMJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgAgCBF9TSTMJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TSTQJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgBACBF9TSTQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TSTUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgCACBF9TSTUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTUwCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzAAgIBAAgVfU0k1MAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNTEJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgIABAgVfU0k1MQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNTIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgIACAgVfU0k1MgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNTMJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgIAEAgVfU0k1MwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNTQJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgIAIAgVfU0k1NAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNTUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgIAQAgVfU0k1NQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNTYJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgIAgAgVfU0k1NgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNTcJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgIBAAgVfU0k1NwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMDAJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgICAAQIFX1NJMDAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTAxCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzAAgICAgAICBV9TSTAxCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kwMgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8wAICAgIAEAgVfU0kwMgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMDMJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMACAgICACAIFX1NJMDMJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTA0CQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzAAgICAgBACBV9TSTA0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kwNQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8wAICAgIAgAgVfU0kwNQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMDYJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQABAgVfU0kwNgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMDcJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQACAgVfU0kwNwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMTAJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQAEAgVfU0kxMAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMTEJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQAIAgVfU0kxMQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMTIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQAQAgVfU0kxMgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMTMJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQAgAgVfU0kxMwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMTQJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQBAAgVfU0kxNAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMTUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCAAQIFX1NJMTUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTE2CQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzEAgAICBV9TSTE2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kxNwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8xAIAEAgVfU0kxNwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMjAJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCACAIFX1NJMjAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTIxCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzEAgBACBV9TSTIxCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kyMgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8xAIAgAgVfU0kyMgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMjMJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCAQAIFX1NJMjMJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTI0CQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzEAgIABAgVfU0kyNAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMjUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCAgAICBV9TSTI1CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kyNgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8xAICABAIFX1NJMjYJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTI3CQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzEAgIAIAgVfU0kyNwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMzAJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCAgBACBV9TSTMwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kzMQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8xAICAIAIFX1NJMzEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTMyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzEAgIBAAgVfU0kzMgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMzMJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCAgIABAgVfU0kzMwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMzQJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCAgIACAgVfU0kzNAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMzUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCAgIAEAgVfU0kzNQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMzYJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCAgIAIAgVfU0kzNgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMzcJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCAgIAQAgVfU0kzNwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNDAJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCAgIAgAgVfU0k0MAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNDEJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCAgIBAAgVfU0k0MQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNDIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCAgICAAQIFX1NJNDIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTQzCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzEAgICAgAICBV9TSTQzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k0NAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8xAICAgIAEAgVfU0k0NAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNDUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkBCHBpY2tfb25lBAUGc29uZ18wBQZzb25nXzEFBnJhbmRfMQCAgICACAIFX1NJNDUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTQ2CQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAQhwaWNrX29uZQQFBnNvbmdfMAUGc29uZ18xBQZyYW5kXzEAgICAgBACBV9TSTQ2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k0NwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQEIcGlja19vbmUEBQZzb25nXzAFBnNvbmdfMQUGcmFuZF8xAICAgIAgAgVfU0k0NwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEICAUBaQZjYWxsZXIFYnl0ZXMAAQUEaWRfYgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARBtaW50X2h5YnJpZF9wYWlkAwFpBnNvbmdfMAZzb25nXzEEC2NhbGxlcl9hZGRyCQEHQWRkcmVzcwEICAUBaQZjYWxsZXIFYnl0ZXMECXNvbmdfMF9pZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1OCkBBQZzb25nXzAECXNvbmdfMV9pZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1OCkBBQZzb25nXzEEDHByaWNlX2Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQITcHJpY2VfaHlicmlkX2Ftb3VudAQLcHJpY2VfbGltaXQJARFAZXh0ck5hdGl2ZSgxMDU1KQECEnByaWNlX2h5YnJpZF9saW1pdAQLcHJpY2VfdG9rZW4JARFAZXh0ck5hdGl2ZSgxMDU4KQECEnByaWNlX2h5YnJpZF90b2tlbgQMcHJpY2VfY2hhbmdlCQEXaHlicmlkX2NhbGN1bGF0ZV9jaGFuZ2UDBQFpBQtwcmljZV90b2tlbgUMcHJpY2VfYW1vdW50AwkAZgIAAAUMcHJpY2VfY2hhbmdlCQACAQINV3JvbmcgcGF5bWVudAMJAAACBQlzb25nXzBfaWQFCXNvbmdfMV9pZAkAAgECGVNvbmdzIHNob3VsZCBiZSBkaWZmZXJlbnQDCQBmAgABCQDwBwIFC2NhbGxlcl9hZGRyBQlzb25nXzBfaWQJAAIBAhxDYWxsZXIgZG8gbm90IG93biBmaXJzdCBzb25nAwkAZgIAAQkA8AcCBQtjYWxsZXJfYWRkcgUJc29uZ18xX2lkCQACAQIdQ2FsbGVyIGRvIG5vdCBvd24gc2Vjb25kIHNvbmcECm1pbnRfY291bnQJARFAZXh0ck5hdGl2ZSgxMDU1KQECCm1pbnRfY291bnQECXByaWNlX2luYwkBEUBleHRyTmF0aXZlKDEwNTUpAQIWcHJpY2VfaHlicmlkX2luY3JlbWVudAQPcHJpY2VfY291bnRfaW5jCQEMSW50ZWdlckVudHJ5AgIKbWludF9jb3VudAkAZAIFCm1pbnRfY291bnQAAQQOcHJpY2VfaW5jcmVhc2UDAwkAAAIJAGoCBQptaW50X2NvdW50BRVwcmljZV9pbmNyZWFzZV9wZXJpb2QJAGUCBRVwcmljZV9pbmNyZWFzZV9wZXJpb2QAAQkAZgIFC3ByaWNlX2xpbWl0CQBkAgUMcHJpY2VfYW1vdW50BQlwcmljZV9pbmMHCQDMCAIFD3ByaWNlX2NvdW50X2luYwkAzAgCCQEMSW50ZWdlckVudHJ5AgITcHJpY2VfaHlicmlkX2Ftb3VudAkAZAIFDHByaWNlX2Ftb3VudAUJcHJpY2VfaW5jBQNuaWwJAMwIAgUPcHJpY2VfY291bnRfaW5jBQNuaWwDCQBmAgUMcHJpY2VfY2hhbmdlAAAJAJQKAgkAzggCCQDOCAIJAQ5tYWtlX2h5YnJpZF90eAMFAWkFBnNvbmdfMAUGc29uZ18xBQ5wcmljZV9pbmNyZWFzZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQtjYWxsZXJfYWRkcgUMcHJpY2VfY2hhbmdlAwkAAAIFC3ByaWNlX3Rva2VuAgAFBHVuaXQJANkEAQULcHJpY2VfdG9rZW4FA25pbAUEdW5pdAkAlAoCCQDOCAIJAQ5tYWtlX2h5YnJpZF90eAMFAWkFBnNvbmdfMAUGc29uZ18xBQ5wcmljZV9pbmNyZWFzZQUEdW5pdAEQbWludF9oeWJyaWRfZnJlZQMBaQZzb25nXzAGc29uZ18xBAtjYWxsZXJfYWRkcgkBB0FkZHJlc3MBCAgFAWkGY2FsbGVyBWJ5dGVzBAlzb25nXzBfaWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUGc29uZ18wBAlzb25nXzFfaWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUGc29uZ18xAwkAAAIFCXNvbmdfMF9pZAUJc29uZ18xX2lkCQACAQIZU29uZ3Mgc2hvdWxkIGJlIGRpZmZlcmVudAMJAGYCAAEJAPAHAgULY2FsbGVyX2FkZHIFCXNvbmdfMF9pZAkAAgECHENhbGxlciBkbyBub3Qgb3duIGZpcnN0IHNvbmcDCQBmAgABCQDwBwIFC2NhbGxlcl9hZGRyBQlzb25nXzFfaWQJAAIBAh1DYWxsZXIgZG8gbm90IG93biBzZWNvbmQgc29uZwkAlAoCCQEObWFrZV9oeWJyaWRfdHgDBQFpBQZzb25nXzAFBnNvbmdfMQUEdW5pdAEPY2hlY2tfd2hpdGVsaXN0AQZjYWxsZXIDCQAAAgUEdGhpcwUGY2FsbGVyBgQHJG1hdGNoMAkAoAgBCQCsAgICAldfCQDYBAEIBQZjYWxsZXIFYnl0ZXMDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBeAUHJG1hdGNoMAUBeAcBD2ZvbGRfc2V0X3Jhcml0eQIFYWNjdW0FaW5kZXgEDSR0MDEyMTUwMTIxODcFBWFjY3VtBAdlbnRyaWVzCAUNJHQwMTIxNTAxMjE4NwJfMQQGYXNzZXRzCAUNJHQwMTIxNTAxMjE4NwJfMgQGdmFsdWVzCAUNJHQwMTIxNTAxMjE4NwJfMwMJAGcCBQVpbmRleAkAkAMBBQZhc3NldHMFBWFjY3VtAwMJAGYCAAAJAJEDAgUGdmFsdWVzBQVpbmRleAYJAGYCCQCRAwIFBnZhbHVlcwUFaW5kZXgAZAkAAgECNUludmFsaWQgcmFyaXR5IHZhbHVlIChtdXN0IGJlIGluIHJhbmdlIGZyb20gMCB0byAxMDApCQCVCgMJAM0IAgUHZW50cmllcwkBDEludGVnZXJFbnRyeQIJAKwCAgIHcmFyaXR5XwkAkQMCBQZhc3NldHMFBWluZGV4CQCRAwIFBnZhbHVlcwUFaW5kZXgFBmFzc2V0cwUGdmFsdWVzFAFpAQ13aGl0ZWxpc3RfYWRkAQR1c2VyAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIYQ2FsbGVyIGlzIG5vdCBkQXBwIG93bmVyCQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgICV18FBHVzZXIGBQNuaWwFBHVuaXQBaQEQd2hpdGVsaXN0X3JlbW92ZQEEdXNlcgMJAQIhPQIFBHRoaXMIBQFpBmNhbGxlcgkAAgECGENhbGxlciBpcyBub3QgZEFwcCBvd25lcgkAlAoCCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgICV18FBHVzZXIFA25pbAUEdW5pdAFpAQpzZXRfZGFlbW9uAQdhZGRyZXNzAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIYQ2FsbGVyIGlzIG5vdCBkQXBwIG93bmVyCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgIGZGFlbW9uBQdhZGRyZXNzBQNuaWwFBHVuaXQBaQEKc2V0X3Jhcml0eQIGYXNzZXRzBnZhbHVlcwMEByRtYXRjaDAJAKIIAQIGZGFlbW9uAwkAAQIFByRtYXRjaDACBlN0cmluZwQBeAUHJG1hdGNoMAkBAiE9AgUBeAkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBgkAAgECFENhbGxlciBpcyBub3QgZGFlbW9uAwkAAAIJAJADAQUGYXNzZXRzAAAJAAIBAglObyBhc3NldHMDCQBmAgkAkAMBBQZhc3NldHMAFAkAAgECKFRvIG1hbnkgYXNzZXRzIChtdXN0IGJlIG5vIG1vcmUgdGhhbiAyMCkDCQECIT0CCQCQAwEFBmFzc2V0cwkAkAMBBQZ2YWx1ZXMJAAIBAiRBc3NldHMgYW5kIHZhbHVlcyBsaXN0IHNpemUgbWlzbWF0Y2gEDSR0MDEzNDkwMTM1ODUKAAIkbAUKaW5kaWNlc18yMAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQZhc3NldHMFBnZhbHVlcwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPZm9sZF9zZXRfcmFyaXR5AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQEB2VudHJpZXMIBQ0kdDAxMzQ5MDEzNTg1Al8xBAdhc3NldHNfCAUNJHQwMTM0OTAxMzU4NQJfMgQHdmFsdWVzXwgFDSR0MDEzNDkwMTM1ODUCXzMJAJQKAgUHZW50cmllcwUEdW5pdAFpARBzZXRfbWFya2V0X2ltYWdlAQN1cmwDCQEBIQEJAQ9jaGVja193aGl0ZWxpc3QBCAUBaQZjYWxsZXIJAAIBAhdDYWxsZXIgbm90IGluIHdoaXRlbGlzdAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQICEW1hcmtldF9pbWFnZV9saW5rBQN1cmwFA25pbAUEdW5pdAFpARBzZXRfcHJpY2VfaHlicmlkBAV0b2tlbgZhbW91bnQFbGltaXQJaW5jcmVtZW50AwkBASEBCQEPY2hlY2tfd2hpdGVsaXN0AQgFAWkGY2FsbGVyCQACAQIXQ2FsbGVyIG5vdCBpbiB3aGl0ZWxpc3QJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgIKbWludF9jb3VudAAACQDMCAIJAQtTdHJpbmdFbnRyeQICEnByaWNlX2h5YnJpZF90b2tlbgUFdG9rZW4JAMwIAgkBDEludGVnZXJFbnRyeQICE3ByaWNlX2h5YnJpZF9hbW91bnQFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgIScHJpY2VfaHlicmlkX2xpbWl0BQVsaW1pdAkAzAgCCQEMSW50ZWdlckVudHJ5AgIWcHJpY2VfaHlicmlkX2luY3JlbWVudAUJaW5jcmVtZW50BQNuaWwFBHVuaXQBaQESc2V0X2ZyZWVfbWl4X3Rva2VuAgV0b2tlbgZhbW91bnQDCQEBIQEJAQ9jaGVja193aGl0ZWxpc3QBCAUBaQZjYWxsZXIJAAIBAhdDYWxsZXIgbm90IGluIHdoaXRlbGlzdAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQICDmZyZWVfbWl4X3Rva2VuBQV0b2tlbgkAzAgCCQEMSW50ZWdlckVudHJ5AgIPZnJlZV9taXhfYW1vdW50BQZhbW91bnQFA25pbAUEdW5pdAFpAQptaW50X2Nob3JkAwVpbmRleARuYW1lBW5vdGVzAwkBASEBCQEPY2hlY2tfd2hpdGVsaXN0AQgFAWkGY2FsbGVyCQACAQIXQ2FsbGVyIG5vdCBpbiB3aGl0ZWxpc3QDCQECIT0CCQCQAwEFBW5vdGVzABAJAAIBAhBXcm9uZyBub3RlcyBzaXplBAFuBAckbWF0Y2gwCQCfCAECBWNvdW50AwkAAQIFByRtYXRjaDACA0ludAQBagUHJG1hdGNoMAUBagAABANrZXkJAQZ0b19rZXkBBQVpbmRleAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgVjb3VudAkAlgMBCQDMCAIJAGQCBQVpbmRleAABCQDMCAIFAW4FA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIDX0NMBQRuYW1lCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MwMAkAkQMCBQVub3RlcwAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MwMQkAkQMCBQVub3RlcwABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MwMgkAkQMCBQVub3RlcwACCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MwMwkAkQMCBQVub3RlcwADCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MwNAkAkQMCBQVub3RlcwAECQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MwNQkAkQMCBQVub3RlcwAFCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MwNgkAkQMCBQVub3RlcwAGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MwNwkAkQMCBQVub3RlcwAHCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MwOAkAkQMCBQVub3RlcwAICQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MwOQkAkQMCBQVub3RlcwAJCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MxMAkAkQMCBQVub3RlcwAKCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MxMQkAkQMCBQVub3RlcwALCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MxMgkAkQMCBQVub3RlcwAMCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MxMwkAkQMCBQVub3RlcwANCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MxNAkAkQMCBQVub3RlcwAOCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX0MxNQkAkQMCBQVub3RlcwAPBQNuaWwFBHVuaXQBaQENbWludF9hcnBlZ2dpbwMFaW5kZXgEbmFtZQVub3RlcwMJAQEhAQkBD2NoZWNrX3doaXRlbGlzdAEIBQFpBmNhbGxlcgkAAgECF0NhbGxlciBub3QgaW4gd2hpdGVsaXN0AwkBAiE9AgkAkAMBBQVub3RlcwAQCQACAQIQV3Jvbmcgbm90ZXMgc2l6ZQQBbgQHJG1hdGNoMAkAnwgBAgVjb3VudAMJAAECBQckbWF0Y2gwAgNJbnQEAWoFByRtYXRjaDAFAWoAAAQDa2V5CQEGdG9fa2V5AQUFaW5kZXgJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgIFY291bnQJAJYDAQkAzAgCCQBkAgUFaW5kZXgAAQkAzAgCBQFuBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCA19BTAUEbmFtZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMDAJAJEDAgUFbm90ZXMAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMDEJAJEDAgUFbm90ZXMAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMDIJAJEDAgUFbm90ZXMAAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMDMJAJEDAgUFbm90ZXMAAwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMDQJAJEDAgUFbm90ZXMABAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMDUJAJEDAgUFbm90ZXMABQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMDYJAJEDAgUFbm90ZXMABgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMDcJAJEDAgUFbm90ZXMABwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMDgJAJEDAgUFbm90ZXMACAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMDkJAJEDAgUFbm90ZXMACQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMTAJAJEDAgUFbm90ZXMACgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMTEJAJEDAgUFbm90ZXMACwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMTIJAJEDAgUFbm90ZXMADAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMTMJAJEDAgUFbm90ZXMADQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMTQJAJEDAgUFbm90ZXMADgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9BMTUJAJEDAgUFbm90ZXMADwUDbmlsBQR1bml0AWkBC21pbnRfcmh5dGhtBAVpbmRleARuYW1lBXNjYWxlBW5vdGVzAwkBASEBCQEPY2hlY2tfd2hpdGVsaXN0AQgFAWkGY2FsbGVyCQACAQIXQ2FsbGVyIG5vdCBpbiB3aGl0ZWxpc3QDCQECIT0CCQCQAwEFBW5vdGVzABAJAAIBAhBXcm9uZyBub3RlcyBzaXplBAFuBAckbWF0Y2gwCQCfCAECBWNvdW50AwkAAQIFByRtYXRjaDACA0ludAQBagUHJG1hdGNoMAUBagAABANrZXkJAQZ0b19rZXkBBQVpbmRleAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgVjb3VudAkAlgMBCQDMCAIJAGQCBQVpbmRleAABCQDMCAIFAW4FA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIDX1JMBQRuYW1lCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIDX1JTBQVzY2FsZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMDAJAJEDAgUFbm90ZXMAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMDEJAJEDAgUFbm90ZXMAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMDIJAJEDAgUFbm90ZXMAAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMDMJAJEDAgUFbm90ZXMAAwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMDQJAJEDAgUFbm90ZXMABAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMDUJAJEDAgUFbm90ZXMABQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMDYJAJEDAgUFbm90ZXMABgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMDcJAJEDAgUFbm90ZXMABwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMDgJAJEDAgUFbm90ZXMACAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMDkJAJEDAgUFbm90ZXMACQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMTAJAJEDAgUFbm90ZXMACgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMTEJAJEDAgUFbm90ZXMACwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMTIJAJEDAgUFbm90ZXMADAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMTMJAJEDAgUFbm90ZXMADQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMTQJAJEDAgUFbm90ZXMADgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9SMTUJAJEDAgUFbm90ZXMADwUDbmlsBQR1bml0AWkBDWJ1cm5faW50ZXJuYWwBCGFzc2V0X2lkAwkBASEBCQEPY2hlY2tfd2hpdGVsaXN0AQgFAWkGY2FsbGVyCQACAQIXQ2FsbGVyIG5vdCBpbiB3aGl0ZWxpc3QEBWJ1cm4wCQD8BwQFFG5mdF9jcmVhdGlvbl9hZGRyZXNzAgdidXJuTkZUBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUIYXNzZXRfaWQAAQUDbmlsAwkAAAIFBWJ1cm4wBQVidXJuMAkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEYnVybgADCQEBIQEJAQ9jaGVja193aGl0ZWxpc3QBCAUBaQZjYWxsZXIJAAIBAhdDYWxsZXIgbm90IGluIHdoaXRlbGlzdAQFYnVybjAJAPwHBAUUbmZ0X2NyZWF0aW9uX2FkZHJlc3MCB2J1cm5ORlQFA25pbAkAzAgCCQCRAwIIBQFpCHBheW1lbnRzAAAFA25pbAMJAAACBQVidXJuMAUFYnVybjAJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCW1pbnRfc29uZxUEbmFtZQhwYXJlbnRfMAhwYXJlbnRfMQNicG0IYmFyX3NpemUJYmVhdF9zaXplCHRvbmFsaXR5BmNob3JkcwhhcnBlZ2dpbw9raWNrX2luc3RydW1lbnQQc25hcmVfaW5zdHJ1bWVudBBoaWhhdF9pbnN0cnVtZW50D2Jhc3NfaW5zdHJ1bWVudA9iYWNrX2luc3RydW1lbnQPbGVhZF9pbnN0cnVtZW50DGtpY2tfcmh5dGhtcw1zbmFyZV9yaHl0aG1zDWhpaGF0X3JoeXRobXMMYmFzc19yaHl0aG1zDGJhY2tfcmh5dGhtcwxsZWFkX3JoeXRobXMDCQEBIQEJAQ9jaGVja193aGl0ZWxpc3QBCAUBaQZjYWxsZXIJAAIBAhdDYWxsZXIgbm90IGluIHdoaXRlbGlzdAMJAQIhPQIJAJADAQUGY2hvcmRzAAgJAAIBAhFXcm9uZyBjaG9yZHMgc2l6ZQMJAQIhPQIJAJADAQUMa2lja19yaHl0aG1zAAgJAAIBAhdXcm9uZyBraWNrIHJoeXRobXMgc2l6ZQMJAQIhPQIJAJADAQUNc25hcmVfcmh5dGhtcwAICQACAQIYV3Jvbmcgc25hcmUgcmh5dGhtcyBzaXplAwkBAiE9AgkAkAMBBQ1oaWhhdF9yaHl0aG1zAAgJAAIBAhhXcm9uZyBoaWhhdCByaHl0aG1zIHNpemUDCQECIT0CCQCQAwEFDGJhc3Nfcmh5dGhtcwAICQACAQIXV3JvbmcgYmFzcyByaHl0aG1zIHNpemUDCQECIT0CCQCQAwEFDGJhY2tfcmh5dGhtcwAICQACAQIXV3JvbmcgYmFjayByaHl0aG1zIHNpemUDCQECIT0CCQCQAwEFDGxlYWRfcmh5dGhtcwAICQACAQIXV3JvbmcgbGVhZCByaHl0aG1zIHNpemUEAW4EByRtYXRjaDAJAJ8IAQIFY291bnQDCQABAgUHJG1hdGNoMAIDSW50BAFqBQckbWF0Y2gwBQFqAAAECm5hbWVfc2hvcnQJAK8CAgUEbmFtZQAQBAtkZXNjcmlwdGlvbgUQbWludF9kZXNjcmlwdGlvbgQKY29sbGVjdGlvbgUPbWludF9jb2xsZWN0aW9uBAJpZAQHJG1hdGNoMAkA/AcEBRRuZnRfY3JlYXRpb25fYWRkcmVzcwIJY3JlYXRlTkZUCQDMCAIFCm5hbWVfc2hvcnQJAMwIAgULZGVzY3JpcHRpb24JAMwIAgkBEUBleHRyTmF0aXZlKDEwNTgpAQIRbWFya2V0X2ltYWdlX2xpbmsJAMwIAgUKY29sbGVjdGlvbgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF4BQckbWF0Y2gwBQF4CQACAQITTkZUIGNyZWF0aW9uIGZhaWxlZAMJAAACBQJpZAUCaWQEA2tleQkBBnRvX2tleQEFAW4EC3R4X3RyYW5zZmVyAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQgIBQFpBmNhbGxlcgVieXRlcwABCQDZBAEFAmlkBQNuaWwFA25pbAkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQICBWNvdW50CQBkAgUBbgABCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmlkBQNrZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUDa2V5BQJpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCAl9HAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCA19TTAUEbmFtZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCA19TTgAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgRfU1AwBQhwYXJlbnRfMAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIEX1NQMQUIcGFyZW50XzEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUDa2V5AgRfU0IwBQNicG0JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUDa2V5AgRfU0IxBQhiYXJfc2l6ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9TQjIFCWJlYXRfc2l6ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCA19TVAUIdG9uYWxpdHkJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TQzAJAJEDAgUGY2hvcmRzAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TQzEJAJEDAgUGY2hvcmRzAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TQzIJAJEDAgUGY2hvcmRzAAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TQzMJAJEDAgUGY2hvcmRzAAMJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TQzQJAJEDAgUGY2hvcmRzAAQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TQzUJAJEDAgUGY2hvcmRzAAUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TQzYJAJEDAgUGY2hvcmRzAAYJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TQzcJAJEDAgUGY2hvcmRzAAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCA19TQQUIYXJwZWdnaW8JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TSTAFD2tpY2tfaW5zdHJ1bWVudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIEX1NJMQUQc25hcmVfaW5zdHJ1bWVudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIEX1NJMgUQaGloYXRfaW5zdHJ1bWVudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIEX1NJMwUPYmFzc19pbnN0cnVtZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgRfU0k0BQ9iYWNrX2luc3RydW1lbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TSTUFD2xlYWRfaW5zdHJ1bWVudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMDAJAJEDAgUMa2lja19yaHl0aG1zAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTAxCQCRAwIFDGtpY2tfcmh5dGhtcwABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kwMgkAkQMCBQxraWNrX3JoeXRobXMAAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMDMJAJEDAgUMa2lja19yaHl0aG1zAAMJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTA0CQCRAwIFDGtpY2tfcmh5dGhtcwAECQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kwNQkAkQMCBQxraWNrX3JoeXRobXMABQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMDYJAJEDAgUMa2lja19yaHl0aG1zAAYJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTA3CQCRAwIFDGtpY2tfcmh5dGhtcwAHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kxMAkAkQMCBQ1zbmFyZV9yaHl0aG1zAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTExCQCRAwIFDXNuYXJlX3JoeXRobXMAAQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMTIJAJEDAgUNc25hcmVfcmh5dGhtcwACCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kxMwkAkQMCBQ1zbmFyZV9yaHl0aG1zAAMJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTE0CQCRAwIFDXNuYXJlX3JoeXRobXMABAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMTUJAJEDAgUNc25hcmVfcmh5dGhtcwAFCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kxNgkAkQMCBQ1zbmFyZV9yaHl0aG1zAAYJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTE3CQCRAwIFDXNuYXJlX3JoeXRobXMABwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMjAJAJEDAgUNaGloYXRfcmh5dGhtcwAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kyMQkAkQMCBQ1oaWhhdF9yaHl0aG1zAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTIyCQCRAwIFDWhpaGF0X3JoeXRobXMAAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMjMJAJEDAgUNaGloYXRfcmh5dGhtcwADCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kyNAkAkQMCBQ1oaWhhdF9yaHl0aG1zAAQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTI1CQCRAwIFDWhpaGF0X3JoeXRobXMABQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMjYJAJEDAgUNaGloYXRfcmh5dGhtcwAGCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kyNwkAkQMCBQ1oaWhhdF9yaHl0aG1zAAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTMwCQCRAwIFDGJhc3Nfcmh5dGhtcwAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kzMQkAkQMCBQxiYXNzX3JoeXRobXMAAQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMzIJAJEDAgUMYmFzc19yaHl0aG1zAAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTMzCQCRAwIFDGJhc3Nfcmh5dGhtcwADCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kzNAkAkQMCBQxiYXNzX3JoeXRobXMABAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJMzUJAJEDAgUMYmFzc19yaHl0aG1zAAUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTM2CQCRAwIFDGJhc3Nfcmh5dGhtcwAGCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kzNwkAkQMCBQxiYXNzX3JoeXRobXMABwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNDAJAJEDAgUMYmFja19yaHl0aG1zAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTQxCQCRAwIFDGJhY2tfcmh5dGhtcwABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k0MgkAkQMCBQxiYWNrX3JoeXRobXMAAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNDMJAJEDAgUMYmFja19yaHl0aG1zAAMJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTQ0CQCRAwIFDGJhY2tfcmh5dGhtcwAECQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k0NQkAkQMCBQxiYWNrX3JoeXRobXMABQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNDYJAJEDAgUMYmFja19yaHl0aG1zAAYJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTQ3CQCRAwIFDGJhY2tfcmh5dGhtcwAHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k1MAkAkQMCBQxsZWFkX3JoeXRobXMAAAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNTEJAJEDAgUMbGVhZF9yaHl0aG1zAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTUyCQCRAwIFDGxlYWRfcmh5dGhtcwACCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k1MwkAkQMCBQxsZWFkX3JoeXRobXMAAwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNTQJAJEDAgUMbGVhZF9yaHl0aG1zAAQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBV9TSTU1CQCRAwIFDGxlYWRfcmh5dGhtcwAFCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k1NgkAkQMCBQxsZWFkX3JoeXRobXMABgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIFX1NJNTcJAJEDAgUMbGVhZF9yaHl0aG1zAAcFA25pbAULdHhfdHJhbnNmZXIFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELbWludF9oeWJyaWQCBnNvbmdfMAZzb25nXzEDAwMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAAACCQERQGV4dHJOYXRpdmUoMTA1OCkBAg5mcmVlX21peF90b2tlbgQHJG1hdGNoMAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgIABwkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQERQGV4dHJOYXRpdmUoMTA1NSkBAg9mcmVlX21peF9hbW91bnQHCQEQbWludF9oeWJyaWRfZnJlZQMFAWkFBnNvbmdfMAUGc29uZ18xCQEQbWludF9oeWJyaWRfcGFpZAMFAWkFBnNvbmdfMAUGc29uZ18xAWkBFG1pbnRfaHlicmlkX2FuZF9idXJuAAMDAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwACBgkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAQYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50AAEJAAIBAg1Xcm9uZyBwYXltZW50BAlzb25nXzBfaWQEByRtYXRjaDAICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwBQFiCQACAQINV3JvbmcgcGF5bWVudAQJc29uZ18xX2lkBAckbWF0Y2gwCAkAkQMCCAUBaQhwYXltZW50cwABB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAUBYgkAAgECDVdyb25nIHBheW1lbnQDCQAAAgUJc29uZ18wX2lkBQlzb25nXzFfaWQJAAIBAhlTb25ncyBzaG91bGQgYmUgZGlmZmVyZW50BAZzb25nXzAJARFAZXh0ck5hdGl2ZSgxMDU4KQEJANgEAQUJc29uZ18wX2lkBAZzb25nXzEJARFAZXh0ck5hdGl2ZSgxMDU4KQEJANgEAQUJc29uZ18xX2lkBAVidXJuMAkA/AcEBRRuZnRfY3JlYXRpb25fYWRkcmVzcwIHYnVybk5GVAUDbmlsCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAAUDbmlsAwkAAAIFBWJ1cm4wBQVidXJuMAQFYnVybjEJAPwHBAUUbmZ0X2NyZWF0aW9uX2FkZHJlc3MCB2J1cm5ORlQFA25pbAkAzAgCCQCRAwIIBQFpCHBheW1lbnRzAAEFA25pbAMJAAACBQVidXJuMQUFYnVybjEJAJQKAgkBDm1ha2VfaHlicmlkX3R4AwUBaQUGc29uZ18wBQZzb25nXzEFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOc3RvcmVfYWRkX3NvbmcECGFzc2V0X2lkBmFtb3VudA5wcmljZV9hc3NldF9pZAxwcmljZV9hbW91bnQDCQEBIQEJAQ9jaGVja193aGl0ZWxpc3QBCAUBaQZjYWxsZXIJAAIBAhdDYWxsZXIgbm90IGluIHdoaXRlbGlzdAQOaW5pdGlhbF9hbW91bnQEByRtYXRjaDAJAJ8IAQkArAICAgNTQV8FCGFzc2V0X2lkAwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAAACQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIDU0FfBQhhc3NldF9pZAkAZAIFDmluaXRpYWxfYW1vdW50BQZhbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgNTVF8FCGFzc2V0X2lkBQ5wcmljZV9hc3NldF9pZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAgNTUF8FCGFzc2V0X2lkBQxwcmljZV9hbW91bnQFA25pbAUEdW5pdAFpAQ9zdG9yZV9taW50X3NvbmcBCGFzc2V0X2lkBAZhbW91bnQJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAKwCAgIDU0FfBQhhc3NldF9pZAQMa2V5X29yaWdpbmFsCQERQGV4dHJOYXRpdmUoMTA1OCkBBQhhc3NldF9pZAQEbmFtZQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCA19TTAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECEldyb25nIHBheW1lbnQgc2l6ZQMJAQIhPQIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIDU1RfBQhhc3NldF9pZAQHJG1hdGNoMAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgIACQACAQITV3JvbmcgcGF5bWVudCBhc3NldAMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgICA1NQXwUIYXNzZXRfaWQJAAIBAhRXcm9uZyBwYXltZW50IGFtb3VudAMJAGcCAAAFBmFtb3VudAkAAgECEk5vIHNvbmdzIGF2YWlsYWJsZQMJAAACBQRuYW1lAgAJAAIBAg1JbnZhbGlkIGFzc2V0BAFuBAckbWF0Y2gwCQCfCAECBWNvdW50AwkAAQIFByRtYXRjaDACA0ludAQBagUHJG1hdGNoMAUBagAABApuYW1lX3Nob3J0CQCvAgIFBG5hbWUAEAQLZGVzY3JpcHRpb24FEG1pbnRfZGVzY3JpcHRpb24ECmNvbGxlY3Rpb24FD21pbnRfY29sbGVjdGlvbgQCaWQEByRtYXRjaDAJAPwHBAUUbmZ0X2NyZWF0aW9uX2FkZHJlc3MCCWNyZWF0ZU5GVAkAzAgCBQpuYW1lX3Nob3J0CQDMCAIFC2Rlc2NyaXB0aW9uCQDMCAIJARFAZXh0ck5hdGl2ZSgxMDU4KQECEW1hcmtldF9pbWFnZV9saW5rCQDMCAIFCmNvbGxlY3Rpb24FA25pbAUDbmlsAwkAAQIFByRtYXRjaDACBlN0cmluZwQBeAUHJG1hdGNoMAUBeAkAAgECE05GVCBjcmVhdGlvbiBmYWlsZWQDCQAAAgUCaWQFAmlkBARpZF9iCQDZBAEFAmlkBANrZXkJAQZ0b19rZXkBBQFuCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQICBWNvdW50CQBkAgUBbgABCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmlkBQNrZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUDa2V5BQJpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCAl9HCQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgIFDGtleV9vcmlnaW5hbAICX0cJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCA19TTAUEbmFtZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCA19TTgAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgRfU1AwCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFDGtleV9vcmlnaW5hbAIEX1NQMAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIEX1NQMQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBF9TUDEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUDa2V5AgRfU0IwCQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgIFDGtleV9vcmlnaW5hbAIEX1NCMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQNrZXkCBF9TQjEJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAKwCAgUMa2V5X29yaWdpbmFsAgRfU0IxCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFA2tleQIEX1NCMgkBEUBleHRyTmF0aXZlKDEwNTUpAQkArAICBQxrZXlfb3JpZ2luYWwCBF9TQjIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUDa2V5AgNfU1QJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAKwCAgUMa2V5X29yaWdpbmFsAgNfU1QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TQzAJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgUMa2V5X29yaWdpbmFsAgRfU0MwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgRfU0MxCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFDGtleV9vcmlnaW5hbAIEX1NDMQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIEX1NDMgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBF9TQzIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TQzMJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgUMa2V5X29yaWdpbmFsAgRfU0MzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgRfU0M0CQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFDGtleV9vcmlnaW5hbAIEX1NDNAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIEX1NDNQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBF9TQzUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TQzYJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgUMa2V5X29yaWdpbmFsAgRfU0M2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgRfU0M3CQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFDGtleV9vcmlnaW5hbAIEX1NDNwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIDX1NBCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFDGtleV9vcmlnaW5hbAIDX1NBCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgRfU0kwCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFDGtleV9vcmlnaW5hbAIEX1NJMAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIEX1NJMQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBF9TSTEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TSTIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgUMa2V5X29yaWdpbmFsAgRfU0kyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgRfU0kzCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFDGtleV9vcmlnaW5hbAIEX1NJMwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFA2tleQIEX1NJNAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBF9TSTQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQNrZXkCBF9TSTUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgUMa2V5X29yaWdpbmFsAgRfU0k1CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k1MAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTUwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k1MQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTUxCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k1MgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTUyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k1MwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTUzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k1NAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTU0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k1NQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTU1CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k1NgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTU2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k1NwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTU3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kwMAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTAwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kwMQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTAxCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kwMgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTAyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kwMwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTAzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kwNAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTA0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kwNQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTA1CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kwNgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTA2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kwNwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTA3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kxMAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTEwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kxMQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTExCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kxMgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTEyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kxMwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTEzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kxNAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTE0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kxNQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTE1CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kxNgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTE2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kxNwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTE3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kyMAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTIwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kyMQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTIxCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kyMgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTIyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kyMwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTIzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kyNAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTI0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kyNQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTI1CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kyNgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTI2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kyNwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTI3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kzMAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTMwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kzMQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTMxCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kzMgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTMyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kzMwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTMzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kzNAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTM0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kzNQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTM1CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kzNgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTM2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0kzNwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTM3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k0MAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTQwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k0MQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTQxCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k0MgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTQyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k0MwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTQzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k0NAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTQ0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k0NQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTQ1CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k0NgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTQ2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUDa2V5AgVfU0k0NwkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQxrZXlfb3JpZ2luYWwCBV9TSTQ3CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQgIBQFpBmNhbGxlcgVieXRlcwABBQRpZF9iCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICA1NBXwUIYXNzZXRfaWQJAGUCBQZhbW91bnQAAQUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNoYXJ0X2xpa2VfYWRkAQhhc3NldF9pZAQHc29uZ19pZAQHJG1hdGNoMAkAoggBBQhhc3NldF9pZAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhBJbnZhbGlkIGFzc2V0IGlkBA9zb25nX25hbWVfaW5kZXgEByRtYXRjaDAJAJ8IAQkArAICBQdzb25nX2lkAgNfU04DCQABAgUHJG1hdGNoMAIDSW50BAFuBQckbWF0Y2gwBQFuCQACAQIKTm90IGEgc29uZwMJAAACBQ9zb25nX25hbWVfaW5kZXgFD3NvbmdfbmFtZV9pbmRleAQGY2FsbGVyCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMECWhhdmVfbGlrZQQHJG1hdGNoMAkAoAgBCQCsAgIJAKwCAgkArAICAgNDTF8FCGFzc2V0X2lkAgFfBQZjYWxsZXIDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcEBmFtb3VudAQHJG1hdGNoMAkAnwgBCQCsAgICA0NOXwUIYXNzZXRfaWQDCQABAgUHJG1hdGNoMAIDSW50BAFuBQckbWF0Y2gwBQFuAAADBQloYXZlX2xpa2UJAAIBAhNBbHJlYWR5IGhhdmUgYSBsaWtlCQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgICA0NMXwUIYXNzZXRfaWQCAV8FBmNhbGxlcgYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIDQ05fBQhhc3NldF9pZAkAZAIFBmFtb3VudAABBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERY2hhcnRfbGlrZV9yZW1vdmUBCGFzc2V0X2lkBAdzb25nX2lkBAckbWF0Y2gwCQCiCAEFCGFzc2V0X2lkAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAUBcwkAAgECEEludmFsaWQgYXNzZXQgaWQED3NvbmdfbmFtZV9pbmRleAQHJG1hdGNoMAkAnwgBCQCsAgIFB3NvbmdfaWQCA19TTgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAgpOb3QgYSBzb25nAwkAAAIFD3NvbmdfbmFtZV9pbmRleAUPc29uZ19uYW1lX2luZGV4BAZjYWxsZXIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQJaGF2ZV9saWtlBAckbWF0Y2gwCQCgCAEJAKwCAgkArAICCQCsAgICA0NMXwUIYXNzZXRfaWQCAV8FBmNhbGxlcgMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwQGYW1vdW50BAckbWF0Y2gwCQCfCAEJAKwCAgIDQ05fBQhhc3NldF9pZAMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4AAAMJAQEhAQUJaGF2ZV9saWtlCQACAQISRG8gbm90IGhhdmUgYSBsaWtlAwkAZgIAAQUGYW1vdW50CQACAQIUSW52YWxpZCBsaWtlcyBhbW91bnQJAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgIDQ0xfBQhhc3NldF9pZAIBXwUGY2FsbGVyBwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAgNDTl8FCGFzc2V0X2lkCQBlAgUGYW1vdW50AAEFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jaGFydF9saWtlX3NldAIIYXNzZXRfaWQKbmV3X2Ftb3VudAMJAQEhAQkBD2NoZWNrX3doaXRlbGlzdAEIBQFpBmNhbGxlcgkAAgECF0NhbGxlciBub3QgaW4gd2hpdGVsaXN0AwkAZgIAAAUKbmV3X2Ftb3VudAkAAgECFEludmFsaWQgbGlrZXMgYW1vdW50BAZhbW91bnQEByRtYXRjaDAJAJ8IAQkArAICAgNDTl8FCGFzc2V0X2lkAwkAAQIFByRtYXRjaDACA0ludAQBbgUHJG1hdGNoMAUBbgAACQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIDQ05fBQhhc3NldF9pZAUKbmV3X2Ftb3VudAUDbmlsBQR1bml0ABQj4kI=", "height": 3564308, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6EaQnzDopqenATMB6RA2fbVxPAfnFqGDYN6emW1qpwbA Next: none Diff:
Old | New | Differences | |
---|---|---|---|
472 | 472 | } | |
473 | 473 | ||
474 | 474 | ||
475 | + | ||
476 | + | @Callable(i) | |
477 | + | func chart_like_add (asset_id) = { | |
478 | + | let song_id = match getString(asset_id) { | |
479 | + | case s: String => | |
480 | + | s | |
481 | + | case _ => | |
482 | + | throw("Invalid asset id") | |
483 | + | } | |
484 | + | let song_name_index = match getInteger((song_id + "_SN")) { | |
485 | + | case n: Int => | |
486 | + | n | |
487 | + | case _ => | |
488 | + | throw("Not a song") | |
489 | + | } | |
490 | + | if ((song_name_index == song_name_index)) | |
491 | + | then { | |
492 | + | let caller = toBase58String(i.caller.bytes) | |
493 | + | let have_like = match getBoolean(((("CL_" + asset_id) + "_") + caller)) { | |
494 | + | case b: Boolean => | |
495 | + | b | |
496 | + | case _ => | |
497 | + | false | |
498 | + | } | |
499 | + | let amount = match getInteger(("CN_" + asset_id)) { | |
500 | + | case n: Int => | |
501 | + | n | |
502 | + | case _ => | |
503 | + | 0 | |
504 | + | } | |
505 | + | if (have_like) | |
506 | + | then throw("Already have a like") | |
507 | + | else $Tuple2([BooleanEntry(((("CL_" + asset_id) + "_") + caller), true), IntegerEntry(("CN_" + asset_id), (amount + 1))], unit) | |
508 | + | } | |
509 | + | else throw("Strict value is not equal to itself.") | |
510 | + | } | |
511 | + | ||
512 | + | ||
513 | + | ||
514 | + | @Callable(i) | |
515 | + | func chart_like_remove (asset_id) = { | |
516 | + | let song_id = match getString(asset_id) { | |
517 | + | case s: String => | |
518 | + | s | |
519 | + | case _ => | |
520 | + | throw("Invalid asset id") | |
521 | + | } | |
522 | + | let song_name_index = match getInteger((song_id + "_SN")) { | |
523 | + | case n: Int => | |
524 | + | n | |
525 | + | case _ => | |
526 | + | throw("Not a song") | |
527 | + | } | |
528 | + | if ((song_name_index == song_name_index)) | |
529 | + | then { | |
530 | + | let caller = toBase58String(i.caller.bytes) | |
531 | + | let have_like = match getBoolean(((("CL_" + asset_id) + "_") + caller)) { | |
532 | + | case b: Boolean => | |
533 | + | b | |
534 | + | case _ => | |
535 | + | false | |
536 | + | } | |
537 | + | let amount = match getInteger(("CN_" + asset_id)) { | |
538 | + | case n: Int => | |
539 | + | n | |
540 | + | case _ => | |
541 | + | 0 | |
542 | + | } | |
543 | + | if (!(have_like)) | |
544 | + | then throw("Do not have a like") | |
545 | + | else if ((1 > amount)) | |
546 | + | then throw("Invalid likes amount") | |
547 | + | else $Tuple2([BooleanEntry(((("CL_" + asset_id) + "_") + caller), false), IntegerEntry(("CN_" + asset_id), (amount - 1))], unit) | |
548 | + | } | |
549 | + | else throw("Strict value is not equal to itself.") | |
550 | + | } | |
551 | + | ||
552 | + | ||
553 | + | ||
554 | + | @Callable(i) | |
555 | + | func chart_like_set (asset_id,new_amount) = if (!(check_whitelist(i.caller))) | |
556 | + | then throw("Caller not in whitelist") | |
557 | + | else if ((0 > new_amount)) | |
558 | + | then throw("Invalid likes amount") | |
559 | + | else { | |
560 | + | let amount = match getInteger(("CN_" + asset_id)) { | |
561 | + | case n: Int => | |
562 | + | n | |
563 | + | case _ => | |
564 | + | 0 | |
565 | + | } | |
566 | + | $Tuple2([IntegerEntry(("CN_" + asset_id), new_amount)], unit) | |
567 | + | } | |
568 | + | ||
569 | + |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let nft_creation_address = Address(base58'3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By') | |
5 | 5 | ||
6 | 6 | let price_increase_period = 1 | |
7 | 7 | ||
8 | 8 | let mint_collection = "Clef genesis songs" | |
9 | 9 | ||
10 | 10 | let mint_description = "Genesis Clef song. This melody is crafted to become your electronic jam. Use it on clef.one 💚🤍" | |
11 | 11 | ||
12 | 12 | let hybrid_collection = "Clef mixes" | |
13 | 13 | ||
14 | 14 | let hybrid_description = "Clef mix. This melody was created by an algorithm. Enjoy this jam or use it on clef.one" | |
15 | 15 | ||
16 | 16 | let indices_20 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] | |
17 | 17 | ||
18 | 18 | func to_key (n) = toBase58String(toBytes(n)) | |
19 | 19 | ||
20 | 20 | ||
21 | 21 | func unique_bytes (i) = ((((i.transactionId + i.callerPublicKey) + lastBlock.generationSignature) + toBytes(lastBlock.timestamp)) + toBytes(lastBlock.height)) | |
22 | 22 | ||
23 | 23 | ||
24 | 24 | func random_uint (bytes,nonce) = { | |
25 | 25 | let n = toInt(sha256_16Kb((bytes + toBytes(nonce)))) | |
26 | 26 | if ((0 > n)) | |
27 | 27 | then -(n) | |
28 | 28 | else n | |
29 | 29 | } | |
30 | 30 | ||
31 | 31 | ||
32 | 32 | func pick_one (key_0,key_1,rand_int,bit_power) = if ((((rand_int / bit_power) % 2) == 0)) | |
33 | 33 | then key_0 | |
34 | 34 | else key_1 | |
35 | 35 | ||
36 | 36 | ||
37 | 37 | func hybrid_calculate_change (i,token,amount) = if ((size(i.payments) != 1)) | |
38 | 38 | then -1 | |
39 | 39 | else { | |
40 | 40 | let p = i.payments[0] | |
41 | 41 | let p_token = match p.assetId { | |
42 | 42 | case id: ByteVector => | |
43 | 43 | toBase58String(id) | |
44 | 44 | case _ => | |
45 | 45 | "" | |
46 | 46 | } | |
47 | 47 | if ((p_token != token)) | |
48 | 48 | then -1 | |
49 | 49 | else (p.amount - amount) | |
50 | 50 | } | |
51 | 51 | ||
52 | 52 | ||
53 | 53 | func make_hybrid_tx (i,song_0,song_1) = { | |
54 | 54 | let n = match getInteger("count") { | |
55 | 55 | case j: Int => | |
56 | 56 | j | |
57 | 57 | case _ => | |
58 | 58 | 0 | |
59 | 59 | } | |
60 | 60 | let name_short = take(("Clef " + toString(n)), 16) | |
61 | 61 | let description = hybrid_description | |
62 | 62 | let collection = hybrid_collection | |
63 | 63 | let id = match invoke(nft_creation_address, "createNFT", [name_short, description, getStringValue("market_image_link"), collection], nil) { | |
64 | 64 | case x: String => | |
65 | 65 | x | |
66 | 66 | case _ => | |
67 | 67 | throw("NFT creation failed") | |
68 | 68 | } | |
69 | 69 | if ((id == id)) | |
70 | 70 | then { | |
71 | 71 | let id_b = fromBase58String(id) | |
72 | 72 | let key = to_key(n) | |
73 | 73 | let bytes = unique_bytes(i) | |
74 | 74 | let rand_0 = random_uint(bytes, 0) | |
75 | 75 | let rand_1 = random_uint(bytes, 1) | |
76 | 76 | [IntegerEntry("count", (n + 1)), StringEntry(id, key), StringEntry(key, id), IntegerEntry((key + "_G"), (max([getIntegerValue((song_0 + "_G")), getIntegerValue((song_1 + "_G"))]) + 1)), StringEntry((key + "_SL"), ""), IntegerEntry((key + "_SN"), rand_0), StringEntry((key + "_SP0"), song_0), StringEntry((key + "_SP1"), song_1), IntegerEntry((key + "_SB0"), getIntegerValue((pick_one(song_0, song_1, rand_0, 1) + "_SB0"))), IntegerEntry((key + "_SB1"), getIntegerValue((pick_one(song_0, song_1, rand_0, 2) + "_SB1"))), IntegerEntry((key + "_SB2"), getIntegerValue((pick_one(song_0, song_1, rand_0, 4) + "_SB2"))), IntegerEntry((key + "_ST"), getIntegerValue((pick_one(song_0, song_1, rand_0, 8) + "_ST"))), StringEntry((key + "_SC0"), getStringValue((pick_one(song_0, song_1, rand_0, 16) + "_SC0"))), StringEntry((key + "_SC1"), getStringValue((pick_one(song_0, song_1, rand_0, 32) + "_SC1"))), StringEntry((key + "_SC2"), getStringValue((pick_one(song_0, song_1, rand_0, 64) + "_SC2"))), StringEntry((key + "_SC3"), getStringValue((pick_one(song_0, song_1, rand_0, 128) + "_SC3"))), StringEntry((key + "_SC4"), getStringValue((pick_one(song_0, song_1, rand_0, 512) + "_SC4"))), StringEntry((key + "_SC5"), getStringValue((pick_one(song_0, song_1, rand_0, 1024) + "_SC5"))), StringEntry((key + "_SC6"), getStringValue((pick_one(song_0, song_1, rand_0, 2048) + "_SC6"))), StringEntry((key + "_SC7"), getStringValue((pick_one(song_0, song_1, rand_0, 4096) + "_SC7"))), StringEntry((key + "_SA"), getStringValue((pick_one(song_0, song_1, rand_0, 8192) + "_SA"))), StringEntry((key + "_SI0"), getStringValue((pick_one(song_0, song_1, rand_0, 16384) + "_SI0"))), StringEntry((key + "_SI1"), getStringValue((pick_one(song_0, song_1, rand_0, 32768) + "_SI1"))), StringEntry((key + "_SI2"), getStringValue((pick_one(song_0, song_1, rand_0, 65536) + "_SI2"))), StringEntry((key + "_SI3"), getStringValue((pick_one(song_0, song_1, rand_0, 131072) + "_SI3"))), StringEntry((key + "_SI4"), getStringValue((pick_one(song_0, song_1, rand_0, 262144) + "_SI4"))), StringEntry((key + "_SI5"), getStringValue((pick_one(song_0, song_1, rand_0, 524288) + "_SI5"))), StringEntry((key + "_SI50"), getStringValue((pick_one(song_0, song_1, rand_0, 1048576) + "_SI50"))), StringEntry((key + "_SI51"), getStringValue((pick_one(song_0, song_1, rand_0, 2097152) + "_SI51"))), StringEntry((key + "_SI52"), getStringValue((pick_one(song_0, song_1, rand_0, 4194304) + "_SI52"))), StringEntry((key + "_SI53"), getStringValue((pick_one(song_0, song_1, rand_0, 8388608) + "_SI53"))), StringEntry((key + "_SI54"), getStringValue((pick_one(song_0, song_1, rand_0, 16777216) + "_SI54"))), StringEntry((key + "_SI55"), getStringValue((pick_one(song_0, song_1, rand_0, 33554432) + "_SI55"))), StringEntry((key + "_SI56"), getStringValue((pick_one(song_0, song_1, rand_0, 67108864) + "_SI56"))), StringEntry((key + "_SI57"), getStringValue((pick_one(song_0, song_1, rand_0, 134217728) + "_SI57"))), StringEntry((key + "_SI00"), getStringValue((pick_one(song_0, song_1, rand_0, 268435456) + "_SI00"))), StringEntry((key + "_SI01"), getStringValue((pick_one(song_0, song_1, rand_0, 536870912) + "_SI01"))), StringEntry((key + "_SI02"), getStringValue((pick_one(song_0, song_1, rand_0, 1073741824) + "_SI02"))), StringEntry((key + "_SI03"), getStringValue((pick_one(song_0, song_1, rand_0, 2147483648) + "_SI03"))), StringEntry((key + "_SI04"), getStringValue((pick_one(song_0, song_1, rand_0, 4294967296) + "_SI04"))), StringEntry((key + "_SI05"), getStringValue((pick_one(song_0, song_1, rand_0, 8589934592) + "_SI05"))), StringEntry((key + "_SI06"), getStringValue((pick_one(song_0, song_1, rand_1, 1) + "_SI06"))), StringEntry((key + "_SI07"), getStringValue((pick_one(song_0, song_1, rand_1, 2) + "_SI07"))), StringEntry((key + "_SI10"), getStringValue((pick_one(song_0, song_1, rand_1, 4) + "_SI10"))), StringEntry((key + "_SI11"), getStringValue((pick_one(song_0, song_1, rand_1, 8) + "_SI11"))), StringEntry((key + "_SI12"), getStringValue((pick_one(song_0, song_1, rand_1, 16) + "_SI12"))), StringEntry((key + "_SI13"), getStringValue((pick_one(song_0, song_1, rand_1, 32) + "_SI13"))), StringEntry((key + "_SI14"), getStringValue((pick_one(song_0, song_1, rand_1, 64) + "_SI14"))), StringEntry((key + "_SI15"), getStringValue((pick_one(song_0, song_1, rand_1, 128) + "_SI15"))), StringEntry((key + "_SI16"), getStringValue((pick_one(song_0, song_1, rand_1, 256) + "_SI16"))), StringEntry((key + "_SI17"), getStringValue((pick_one(song_0, song_1, rand_1, 512) + "_SI17"))), StringEntry((key + "_SI20"), getStringValue((pick_one(song_0, song_1, rand_1, 1024) + "_SI20"))), StringEntry((key + "_SI21"), getStringValue((pick_one(song_0, song_1, rand_1, 2048) + "_SI21"))), StringEntry((key + "_SI22"), getStringValue((pick_one(song_0, song_1, rand_1, 4096) + "_SI22"))), StringEntry((key + "_SI23"), getStringValue((pick_one(song_0, song_1, rand_1, 8192) + "_SI23"))), StringEntry((key + "_SI24"), getStringValue((pick_one(song_0, song_1, rand_1, 16384) + "_SI24"))), StringEntry((key + "_SI25"), getStringValue((pick_one(song_0, song_1, rand_1, 32768) + "_SI25"))), StringEntry((key + "_SI26"), getStringValue((pick_one(song_0, song_1, rand_1, 65536) + "_SI26"))), StringEntry((key + "_SI27"), getStringValue((pick_one(song_0, song_1, rand_1, 131072) + "_SI27"))), StringEntry((key + "_SI30"), getStringValue((pick_one(song_0, song_1, rand_1, 262144) + "_SI30"))), StringEntry((key + "_SI31"), getStringValue((pick_one(song_0, song_1, rand_1, 524288) + "_SI31"))), StringEntry((key + "_SI32"), getStringValue((pick_one(song_0, song_1, rand_1, 1048576) + "_SI32"))), StringEntry((key + "_SI33"), getStringValue((pick_one(song_0, song_1, rand_1, 2097152) + "_SI33"))), StringEntry((key + "_SI34"), getStringValue((pick_one(song_0, song_1, rand_1, 4194304) + "_SI34"))), StringEntry((key + "_SI35"), getStringValue((pick_one(song_0, song_1, rand_1, 8388608) + "_SI35"))), StringEntry((key + "_SI36"), getStringValue((pick_one(song_0, song_1, rand_1, 16777216) + "_SI36"))), StringEntry((key + "_SI37"), getStringValue((pick_one(song_0, song_1, rand_1, 33554432) + "_SI37"))), StringEntry((key + "_SI40"), getStringValue((pick_one(song_0, song_1, rand_1, 67108864) + "_SI40"))), StringEntry((key + "_SI41"), getStringValue((pick_one(song_0, song_1, rand_1, 134217728) + "_SI41"))), StringEntry((key + "_SI42"), getStringValue((pick_one(song_0, song_1, rand_1, 268435456) + "_SI42"))), StringEntry((key + "_SI43"), getStringValue((pick_one(song_0, song_1, rand_1, 536870912) + "_SI43"))), StringEntry((key + "_SI44"), getStringValue((pick_one(song_0, song_1, rand_1, 1073741824) + "_SI44"))), StringEntry((key + "_SI45"), getStringValue((pick_one(song_0, song_1, rand_1, 2147483648) + "_SI45"))), StringEntry((key + "_SI46"), getStringValue((pick_one(song_0, song_1, rand_1, 4294967296) + "_SI46"))), StringEntry((key + "_SI47"), getStringValue((pick_one(song_0, song_1, rand_1, 8589934592) + "_SI47"))), ScriptTransfer(Address(i.caller.bytes), 1, id_b)] | |
77 | 77 | } | |
78 | 78 | else throw("Strict value is not equal to itself.") | |
79 | 79 | } | |
80 | 80 | ||
81 | 81 | ||
82 | 82 | func mint_hybrid_paid (i,song_0,song_1) = { | |
83 | 83 | let caller_addr = Address(i.caller.bytes) | |
84 | 84 | let song_0_id = fromBase58String(getStringValue(song_0)) | |
85 | 85 | let song_1_id = fromBase58String(getStringValue(song_1)) | |
86 | 86 | let price_amount = getIntegerValue("price_hybrid_amount") | |
87 | 87 | let price_limit = getIntegerValue("price_hybrid_limit") | |
88 | 88 | let price_token = getStringValue("price_hybrid_token") | |
89 | 89 | let price_change = hybrid_calculate_change(i, price_token, price_amount) | |
90 | 90 | if ((0 > price_change)) | |
91 | 91 | then throw("Wrong payment") | |
92 | 92 | else if ((song_0_id == song_1_id)) | |
93 | 93 | then throw("Songs should be different") | |
94 | 94 | else if ((1 > assetBalance(caller_addr, song_0_id))) | |
95 | 95 | then throw("Caller do not own first song") | |
96 | 96 | else if ((1 > assetBalance(caller_addr, song_1_id))) | |
97 | 97 | then throw("Caller do not own second song") | |
98 | 98 | else { | |
99 | 99 | let mint_count = getIntegerValue("mint_count") | |
100 | 100 | let price_inc = getIntegerValue("price_hybrid_increment") | |
101 | 101 | let price_count_inc = IntegerEntry("mint_count", (mint_count + 1)) | |
102 | 102 | let price_increase = if (if (((mint_count % price_increase_period) == (price_increase_period - 1))) | |
103 | 103 | then (price_limit > (price_amount + price_inc)) | |
104 | 104 | else false) | |
105 | 105 | then [price_count_inc, IntegerEntry("price_hybrid_amount", (price_amount + price_inc))] | |
106 | 106 | else [price_count_inc] | |
107 | 107 | if ((price_change > 0)) | |
108 | 108 | then $Tuple2(((make_hybrid_tx(i, song_0, song_1) ++ price_increase) ++ [ScriptTransfer(caller_addr, price_change, if ((price_token == "")) | |
109 | 109 | then unit | |
110 | 110 | else fromBase58String(price_token))]), unit) | |
111 | 111 | else $Tuple2((make_hybrid_tx(i, song_0, song_1) ++ price_increase), unit) | |
112 | 112 | } | |
113 | 113 | } | |
114 | 114 | ||
115 | 115 | ||
116 | 116 | func mint_hybrid_free (i,song_0,song_1) = { | |
117 | 117 | let caller_addr = Address(i.caller.bytes) | |
118 | 118 | let song_0_id = fromBase58String(getStringValue(song_0)) | |
119 | 119 | let song_1_id = fromBase58String(getStringValue(song_1)) | |
120 | 120 | if ((song_0_id == song_1_id)) | |
121 | 121 | then throw("Songs should be different") | |
122 | 122 | else if ((1 > assetBalance(caller_addr, song_0_id))) | |
123 | 123 | then throw("Caller do not own first song") | |
124 | 124 | else if ((1 > assetBalance(caller_addr, song_1_id))) | |
125 | 125 | then throw("Caller do not own second song") | |
126 | 126 | else $Tuple2(make_hybrid_tx(i, song_0, song_1), unit) | |
127 | 127 | } | |
128 | 128 | ||
129 | 129 | ||
130 | 130 | func check_whitelist (caller) = if ((this == caller)) | |
131 | 131 | then true | |
132 | 132 | else match getBoolean(("W_" + toBase58String(caller.bytes))) { | |
133 | 133 | case x: Boolean => | |
134 | 134 | x | |
135 | 135 | case _ => | |
136 | 136 | false | |
137 | 137 | } | |
138 | 138 | ||
139 | 139 | ||
140 | 140 | func fold_set_rarity (accum,index) = { | |
141 | 141 | let $t01215012187 = accum | |
142 | 142 | let entries = $t01215012187._1 | |
143 | 143 | let assets = $t01215012187._2 | |
144 | 144 | let values = $t01215012187._3 | |
145 | 145 | if ((index >= size(assets))) | |
146 | 146 | then accum | |
147 | 147 | else if (if ((0 > values[index])) | |
148 | 148 | then true | |
149 | 149 | else (values[index] > 100)) | |
150 | 150 | then throw("Invalid rarity value (must be in range from 0 to 100)") | |
151 | 151 | else $Tuple3((entries :+ IntegerEntry(("rarity_" + assets[index]), values[index])), assets, values) | |
152 | 152 | } | |
153 | 153 | ||
154 | 154 | ||
155 | 155 | @Callable(i) | |
156 | 156 | func whitelist_add (user) = if ((this != i.caller)) | |
157 | 157 | then throw("Caller is not dApp owner") | |
158 | 158 | else $Tuple2([BooleanEntry(("W_" + user), true)], unit) | |
159 | 159 | ||
160 | 160 | ||
161 | 161 | ||
162 | 162 | @Callable(i) | |
163 | 163 | func whitelist_remove (user) = if ((this != i.caller)) | |
164 | 164 | then throw("Caller is not dApp owner") | |
165 | 165 | else $Tuple2([DeleteEntry(("W_" + user))], unit) | |
166 | 166 | ||
167 | 167 | ||
168 | 168 | ||
169 | 169 | @Callable(i) | |
170 | 170 | func set_daemon (address) = if ((this != i.caller)) | |
171 | 171 | then throw("Caller is not dApp owner") | |
172 | 172 | else $Tuple2([StringEntry("daemon", address)], unit) | |
173 | 173 | ||
174 | 174 | ||
175 | 175 | ||
176 | 176 | @Callable(i) | |
177 | 177 | func set_rarity (assets,values) = if (match getString("daemon") { | |
178 | 178 | case x: String => | |
179 | 179 | (x != toBase58String(i.caller.bytes)) | |
180 | 180 | case _ => | |
181 | 181 | true | |
182 | 182 | }) | |
183 | 183 | then throw("Caller is not daemon") | |
184 | 184 | else if ((size(assets) == 0)) | |
185 | 185 | then throw("No assets") | |
186 | 186 | else if ((size(assets) > 20)) | |
187 | 187 | then throw("To many assets (must be no more than 20)") | |
188 | 188 | else if ((size(assets) != size(values))) | |
189 | 189 | then throw("Assets and values list size mismatch") | |
190 | 190 | else { | |
191 | 191 | let $t01349013585 = { | |
192 | 192 | let $l = indices_20 | |
193 | 193 | let $s = size($l) | |
194 | 194 | let $acc0 = $Tuple3(nil, assets, values) | |
195 | 195 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
196 | 196 | then $a | |
197 | 197 | else fold_set_rarity($a, $l[$i]) | |
198 | 198 | ||
199 | 199 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
200 | 200 | then $a | |
201 | 201 | else throw("List size exceeds 20") | |
202 | 202 | ||
203 | 203 | $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($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), 18), 19), 20) | |
204 | 204 | } | |
205 | 205 | let entries = $t01349013585._1 | |
206 | 206 | let assets_ = $t01349013585._2 | |
207 | 207 | let values_ = $t01349013585._3 | |
208 | 208 | $Tuple2(entries, unit) | |
209 | 209 | } | |
210 | 210 | ||
211 | 211 | ||
212 | 212 | ||
213 | 213 | @Callable(i) | |
214 | 214 | func set_market_image (url) = if (!(check_whitelist(i.caller))) | |
215 | 215 | then throw("Caller not in whitelist") | |
216 | 216 | else $Tuple2([StringEntry("market_image_link", url)], unit) | |
217 | 217 | ||
218 | 218 | ||
219 | 219 | ||
220 | 220 | @Callable(i) | |
221 | 221 | func set_price_hybrid (token,amount,limit,increment) = if (!(check_whitelist(i.caller))) | |
222 | 222 | then throw("Caller not in whitelist") | |
223 | 223 | else $Tuple2([IntegerEntry("mint_count", 0), StringEntry("price_hybrid_token", token), IntegerEntry("price_hybrid_amount", amount), IntegerEntry("price_hybrid_limit", limit), IntegerEntry("price_hybrid_increment", increment)], unit) | |
224 | 224 | ||
225 | 225 | ||
226 | 226 | ||
227 | 227 | @Callable(i) | |
228 | 228 | func set_free_mix_token (token,amount) = if (!(check_whitelist(i.caller))) | |
229 | 229 | then throw("Caller not in whitelist") | |
230 | 230 | else $Tuple2([StringEntry("free_mix_token", token), IntegerEntry("free_mix_amount", amount)], unit) | |
231 | 231 | ||
232 | 232 | ||
233 | 233 | ||
234 | 234 | @Callable(i) | |
235 | 235 | func mint_chord (index,name,notes) = if (!(check_whitelist(i.caller))) | |
236 | 236 | then throw("Caller not in whitelist") | |
237 | 237 | else if ((size(notes) != 16)) | |
238 | 238 | then throw("Wrong notes size") | |
239 | 239 | else { | |
240 | 240 | let n = match getInteger("count") { | |
241 | 241 | case j: Int => | |
242 | 242 | j | |
243 | 243 | case _ => | |
244 | 244 | 0 | |
245 | 245 | } | |
246 | 246 | let key = to_key(index) | |
247 | 247 | $Tuple2([IntegerEntry("count", max([(index + 1), n])), StringEntry((key + "_CL"), name), IntegerEntry((key + "_C00"), notes[0]), IntegerEntry((key + "_C01"), notes[1]), IntegerEntry((key + "_C02"), notes[2]), IntegerEntry((key + "_C03"), notes[3]), IntegerEntry((key + "_C04"), notes[4]), IntegerEntry((key + "_C05"), notes[5]), IntegerEntry((key + "_C06"), notes[6]), IntegerEntry((key + "_C07"), notes[7]), IntegerEntry((key + "_C08"), notes[8]), IntegerEntry((key + "_C09"), notes[9]), IntegerEntry((key + "_C10"), notes[10]), IntegerEntry((key + "_C11"), notes[11]), IntegerEntry((key + "_C12"), notes[12]), IntegerEntry((key + "_C13"), notes[13]), IntegerEntry((key + "_C14"), notes[14]), IntegerEntry((key + "_C15"), notes[15])], unit) | |
248 | 248 | } | |
249 | 249 | ||
250 | 250 | ||
251 | 251 | ||
252 | 252 | @Callable(i) | |
253 | 253 | func mint_arpeggio (index,name,notes) = if (!(check_whitelist(i.caller))) | |
254 | 254 | then throw("Caller not in whitelist") | |
255 | 255 | else if ((size(notes) != 16)) | |
256 | 256 | then throw("Wrong notes size") | |
257 | 257 | else { | |
258 | 258 | let n = match getInteger("count") { | |
259 | 259 | case j: Int => | |
260 | 260 | j | |
261 | 261 | case _ => | |
262 | 262 | 0 | |
263 | 263 | } | |
264 | 264 | let key = to_key(index) | |
265 | 265 | $Tuple2([IntegerEntry("count", max([(index + 1), n])), StringEntry((key + "_AL"), name), IntegerEntry((key + "_A00"), notes[0]), IntegerEntry((key + "_A01"), notes[1]), IntegerEntry((key + "_A02"), notes[2]), IntegerEntry((key + "_A03"), notes[3]), IntegerEntry((key + "_A04"), notes[4]), IntegerEntry((key + "_A05"), notes[5]), IntegerEntry((key + "_A06"), notes[6]), IntegerEntry((key + "_A07"), notes[7]), IntegerEntry((key + "_A08"), notes[8]), IntegerEntry((key + "_A09"), notes[9]), IntegerEntry((key + "_A10"), notes[10]), IntegerEntry((key + "_A11"), notes[11]), IntegerEntry((key + "_A12"), notes[12]), IntegerEntry((key + "_A13"), notes[13]), IntegerEntry((key + "_A14"), notes[14]), IntegerEntry((key + "_A15"), notes[15])], unit) | |
266 | 266 | } | |
267 | 267 | ||
268 | 268 | ||
269 | 269 | ||
270 | 270 | @Callable(i) | |
271 | 271 | func mint_rhythm (index,name,scale,notes) = if (!(check_whitelist(i.caller))) | |
272 | 272 | then throw("Caller not in whitelist") | |
273 | 273 | else if ((size(notes) != 16)) | |
274 | 274 | then throw("Wrong notes size") | |
275 | 275 | else { | |
276 | 276 | let n = match getInteger("count") { | |
277 | 277 | case j: Int => | |
278 | 278 | j | |
279 | 279 | case _ => | |
280 | 280 | 0 | |
281 | 281 | } | |
282 | 282 | let key = to_key(index) | |
283 | 283 | $Tuple2([IntegerEntry("count", max([(index + 1), n])), StringEntry((key + "_RL"), name), IntegerEntry((key + "_RS"), scale), IntegerEntry((key + "_R00"), notes[0]), IntegerEntry((key + "_R01"), notes[1]), IntegerEntry((key + "_R02"), notes[2]), IntegerEntry((key + "_R03"), notes[3]), IntegerEntry((key + "_R04"), notes[4]), IntegerEntry((key + "_R05"), notes[5]), IntegerEntry((key + "_R06"), notes[6]), IntegerEntry((key + "_R07"), notes[7]), IntegerEntry((key + "_R08"), notes[8]), IntegerEntry((key + "_R09"), notes[9]), IntegerEntry((key + "_R10"), notes[10]), IntegerEntry((key + "_R11"), notes[11]), IntegerEntry((key + "_R12"), notes[12]), IntegerEntry((key + "_R13"), notes[13]), IntegerEntry((key + "_R14"), notes[14]), IntegerEntry((key + "_R15"), notes[15])], unit) | |
284 | 284 | } | |
285 | 285 | ||
286 | 286 | ||
287 | 287 | ||
288 | 288 | @Callable(i) | |
289 | 289 | func burn_internal (asset_id) = if (!(check_whitelist(i.caller))) | |
290 | 290 | then throw("Caller not in whitelist") | |
291 | 291 | else { | |
292 | 292 | let burn0 = invoke(nft_creation_address, "burnNFT", nil, [AttachedPayment(fromBase58String(asset_id), 1)]) | |
293 | 293 | if ((burn0 == burn0)) | |
294 | 294 | then $Tuple2(nil, unit) | |
295 | 295 | else throw("Strict value is not equal to itself.") | |
296 | 296 | } | |
297 | 297 | ||
298 | 298 | ||
299 | 299 | ||
300 | 300 | @Callable(i) | |
301 | 301 | func burn () = if (!(check_whitelist(i.caller))) | |
302 | 302 | then throw("Caller not in whitelist") | |
303 | 303 | else { | |
304 | 304 | let burn0 = invoke(nft_creation_address, "burnNFT", nil, [i.payments[0]]) | |
305 | 305 | if ((burn0 == burn0)) | |
306 | 306 | then $Tuple2(nil, unit) | |
307 | 307 | else throw("Strict value is not equal to itself.") | |
308 | 308 | } | |
309 | 309 | ||
310 | 310 | ||
311 | 311 | ||
312 | 312 | @Callable(i) | |
313 | 313 | func mint_song (name,parent_0,parent_1,bpm,bar_size,beat_size,tonality,chords,arpeggio,kick_instrument,snare_instrument,hihat_instrument,bass_instrument,back_instrument,lead_instrument,kick_rhythms,snare_rhythms,hihat_rhythms,bass_rhythms,back_rhythms,lead_rhythms) = if (!(check_whitelist(i.caller))) | |
314 | 314 | then throw("Caller not in whitelist") | |
315 | 315 | else if ((size(chords) != 8)) | |
316 | 316 | then throw("Wrong chords size") | |
317 | 317 | else if ((size(kick_rhythms) != 8)) | |
318 | 318 | then throw("Wrong kick rhythms size") | |
319 | 319 | else if ((size(snare_rhythms) != 8)) | |
320 | 320 | then throw("Wrong snare rhythms size") | |
321 | 321 | else if ((size(hihat_rhythms) != 8)) | |
322 | 322 | then throw("Wrong hihat rhythms size") | |
323 | 323 | else if ((size(bass_rhythms) != 8)) | |
324 | 324 | then throw("Wrong bass rhythms size") | |
325 | 325 | else if ((size(back_rhythms) != 8)) | |
326 | 326 | then throw("Wrong back rhythms size") | |
327 | 327 | else if ((size(lead_rhythms) != 8)) | |
328 | 328 | then throw("Wrong lead rhythms size") | |
329 | 329 | else { | |
330 | 330 | let n = match getInteger("count") { | |
331 | 331 | case j: Int => | |
332 | 332 | j | |
333 | 333 | case _ => | |
334 | 334 | 0 | |
335 | 335 | } | |
336 | 336 | let name_short = take(name, 16) | |
337 | 337 | let description = mint_description | |
338 | 338 | let collection = mint_collection | |
339 | 339 | let id = match invoke(nft_creation_address, "createNFT", [name_short, description, getStringValue("market_image_link"), collection], nil) { | |
340 | 340 | case x: String => | |
341 | 341 | x | |
342 | 342 | case _ => | |
343 | 343 | throw("NFT creation failed") | |
344 | 344 | } | |
345 | 345 | if ((id == id)) | |
346 | 346 | then { | |
347 | 347 | let key = to_key(n) | |
348 | 348 | let tx_transfer = if ((this != i.caller)) | |
349 | 349 | then [ScriptTransfer(Address(i.caller.bytes), 1, fromBase58String(id))] | |
350 | 350 | else nil | |
351 | 351 | $Tuple2(([IntegerEntry("count", (n + 1)), StringEntry(id, key), StringEntry(key, id), IntegerEntry((key + "_G"), 1), StringEntry((key + "_SL"), name), IntegerEntry((key + "_SN"), 0), StringEntry((key + "_SP0"), parent_0), StringEntry((key + "_SP1"), parent_1), IntegerEntry((key + "_SB0"), bpm), IntegerEntry((key + "_SB1"), bar_size), IntegerEntry((key + "_SB2"), beat_size), IntegerEntry((key + "_ST"), tonality), StringEntry((key + "_SC0"), chords[0]), StringEntry((key + "_SC1"), chords[1]), StringEntry((key + "_SC2"), chords[2]), StringEntry((key + "_SC3"), chords[3]), StringEntry((key + "_SC4"), chords[4]), StringEntry((key + "_SC5"), chords[5]), StringEntry((key + "_SC6"), chords[6]), StringEntry((key + "_SC7"), chords[7]), StringEntry((key + "_SA"), arpeggio), StringEntry((key + "_SI0"), kick_instrument), StringEntry((key + "_SI1"), snare_instrument), StringEntry((key + "_SI2"), hihat_instrument), StringEntry((key + "_SI3"), bass_instrument), StringEntry((key + "_SI4"), back_instrument), StringEntry((key + "_SI5"), lead_instrument), StringEntry((key + "_SI00"), kick_rhythms[0]), StringEntry((key + "_SI01"), kick_rhythms[1]), StringEntry((key + "_SI02"), kick_rhythms[2]), StringEntry((key + "_SI03"), kick_rhythms[3]), StringEntry((key + "_SI04"), kick_rhythms[4]), StringEntry((key + "_SI05"), kick_rhythms[5]), StringEntry((key + "_SI06"), kick_rhythms[6]), StringEntry((key + "_SI07"), kick_rhythms[7]), StringEntry((key + "_SI10"), snare_rhythms[0]), StringEntry((key + "_SI11"), snare_rhythms[1]), StringEntry((key + "_SI12"), snare_rhythms[2]), StringEntry((key + "_SI13"), snare_rhythms[3]), StringEntry((key + "_SI14"), snare_rhythms[4]), StringEntry((key + "_SI15"), snare_rhythms[5]), StringEntry((key + "_SI16"), snare_rhythms[6]), StringEntry((key + "_SI17"), snare_rhythms[7]), StringEntry((key + "_SI20"), hihat_rhythms[0]), StringEntry((key + "_SI21"), hihat_rhythms[1]), StringEntry((key + "_SI22"), hihat_rhythms[2]), StringEntry((key + "_SI23"), hihat_rhythms[3]), StringEntry((key + "_SI24"), hihat_rhythms[4]), StringEntry((key + "_SI25"), hihat_rhythms[5]), StringEntry((key + "_SI26"), hihat_rhythms[6]), StringEntry((key + "_SI27"), hihat_rhythms[7]), StringEntry((key + "_SI30"), bass_rhythms[0]), StringEntry((key + "_SI31"), bass_rhythms[1]), StringEntry((key + "_SI32"), bass_rhythms[2]), StringEntry((key + "_SI33"), bass_rhythms[3]), StringEntry((key + "_SI34"), bass_rhythms[4]), StringEntry((key + "_SI35"), bass_rhythms[5]), StringEntry((key + "_SI36"), bass_rhythms[6]), StringEntry((key + "_SI37"), bass_rhythms[7]), StringEntry((key + "_SI40"), back_rhythms[0]), StringEntry((key + "_SI41"), back_rhythms[1]), StringEntry((key + "_SI42"), back_rhythms[2]), StringEntry((key + "_SI43"), back_rhythms[3]), StringEntry((key + "_SI44"), back_rhythms[4]), StringEntry((key + "_SI45"), back_rhythms[5]), StringEntry((key + "_SI46"), back_rhythms[6]), StringEntry((key + "_SI47"), back_rhythms[7]), StringEntry((key + "_SI50"), lead_rhythms[0]), StringEntry((key + "_SI51"), lead_rhythms[1]), StringEntry((key + "_SI52"), lead_rhythms[2]), StringEntry((key + "_SI53"), lead_rhythms[3]), StringEntry((key + "_SI54"), lead_rhythms[4]), StringEntry((key + "_SI55"), lead_rhythms[5]), StringEntry((key + "_SI56"), lead_rhythms[6]), StringEntry((key + "_SI57"), lead_rhythms[7])] ++ tx_transfer), unit) | |
352 | 352 | } | |
353 | 353 | else throw("Strict value is not equal to itself.") | |
354 | 354 | } | |
355 | 355 | ||
356 | 356 | ||
357 | 357 | ||
358 | 358 | @Callable(i) | |
359 | 359 | func mint_hybrid (song_0,song_1) = if (if (if ((size(i.payments) == 1)) | |
360 | 360 | then (getStringValue("free_mix_token") == match i.payments[0].assetId { | |
361 | 361 | case b: ByteVector => | |
362 | 362 | toBase58String(b) | |
363 | 363 | case _ => | |
364 | 364 | "" | |
365 | 365 | }) | |
366 | 366 | else false) | |
367 | 367 | then (i.payments[0].amount == getIntegerValue("free_mix_amount")) | |
368 | 368 | else false) | |
369 | 369 | then mint_hybrid_free(i, song_0, song_1) | |
370 | 370 | else mint_hybrid_paid(i, song_0, song_1) | |
371 | 371 | ||
372 | 372 | ||
373 | 373 | ||
374 | 374 | @Callable(i) | |
375 | 375 | func mint_hybrid_and_burn () = if (if (if ((size(i.payments) != 2)) | |
376 | 376 | then true | |
377 | 377 | else (i.payments[0].amount != 1)) | |
378 | 378 | then true | |
379 | 379 | else (i.payments[1].amount != 1)) | |
380 | 380 | then throw("Wrong payment") | |
381 | 381 | else { | |
382 | 382 | let song_0_id = match i.payments[0].assetId { | |
383 | 383 | case b: ByteVector => | |
384 | 384 | b | |
385 | 385 | case _ => | |
386 | 386 | throw("Wrong payment") | |
387 | 387 | } | |
388 | 388 | let song_1_id = match i.payments[1].assetId { | |
389 | 389 | case b: ByteVector => | |
390 | 390 | b | |
391 | 391 | case _ => | |
392 | 392 | throw("Wrong payment") | |
393 | 393 | } | |
394 | 394 | if ((song_0_id == song_1_id)) | |
395 | 395 | then throw("Songs should be different") | |
396 | 396 | else { | |
397 | 397 | let song_0 = getStringValue(toBase58String(song_0_id)) | |
398 | 398 | let song_1 = getStringValue(toBase58String(song_1_id)) | |
399 | 399 | let burn0 = invoke(nft_creation_address, "burnNFT", nil, [i.payments[0]]) | |
400 | 400 | if ((burn0 == burn0)) | |
401 | 401 | then { | |
402 | 402 | let burn1 = invoke(nft_creation_address, "burnNFT", nil, [i.payments[1]]) | |
403 | 403 | if ((burn1 == burn1)) | |
404 | 404 | then $Tuple2(make_hybrid_tx(i, song_0, song_1), unit) | |
405 | 405 | else throw("Strict value is not equal to itself.") | |
406 | 406 | } | |
407 | 407 | else throw("Strict value is not equal to itself.") | |
408 | 408 | } | |
409 | 409 | } | |
410 | 410 | ||
411 | 411 | ||
412 | 412 | ||
413 | 413 | @Callable(i) | |
414 | 414 | func store_add_song (asset_id,amount,price_asset_id,price_amount) = if (!(check_whitelist(i.caller))) | |
415 | 415 | then throw("Caller not in whitelist") | |
416 | 416 | else { | |
417 | 417 | let initial_amount = match getInteger(("SA_" + asset_id)) { | |
418 | 418 | case x: Int => | |
419 | 419 | x | |
420 | 420 | case _ => | |
421 | 421 | 0 | |
422 | 422 | } | |
423 | 423 | $Tuple2([IntegerEntry(("SA_" + asset_id), (initial_amount + amount)), StringEntry(("ST_" + asset_id), price_asset_id), IntegerEntry(("SP_" + asset_id), price_amount)], unit) | |
424 | 424 | } | |
425 | 425 | ||
426 | 426 | ||
427 | 427 | ||
428 | 428 | @Callable(i) | |
429 | 429 | func store_mint_song (asset_id) = { | |
430 | 430 | let amount = getIntegerValue(("SA_" + asset_id)) | |
431 | 431 | let key_original = getStringValue(asset_id) | |
432 | 432 | let name = getStringValue((key_original + "_SL")) | |
433 | 433 | if ((size(i.payments) != 1)) | |
434 | 434 | then throw("Wrong payment size") | |
435 | 435 | else if ((getStringValue(("ST_" + asset_id)) != match i.payments[0].assetId { | |
436 | 436 | case b: ByteVector => | |
437 | 437 | toBase58String(b) | |
438 | 438 | case _ => | |
439 | 439 | "" | |
440 | 440 | })) | |
441 | 441 | then throw("Wrong payment asset") | |
442 | 442 | else if ((i.payments[0].amount != getIntegerValue(("SP_" + asset_id)))) | |
443 | 443 | then throw("Wrong payment amount") | |
444 | 444 | else if ((0 >= amount)) | |
445 | 445 | then throw("No songs available") | |
446 | 446 | else if ((name == "")) | |
447 | 447 | then throw("Invalid asset") | |
448 | 448 | else { | |
449 | 449 | let n = match getInteger("count") { | |
450 | 450 | case j: Int => | |
451 | 451 | j | |
452 | 452 | case _ => | |
453 | 453 | 0 | |
454 | 454 | } | |
455 | 455 | let name_short = take(name, 16) | |
456 | 456 | let description = mint_description | |
457 | 457 | let collection = mint_collection | |
458 | 458 | let id = match invoke(nft_creation_address, "createNFT", [name_short, description, getStringValue("market_image_link"), collection], nil) { | |
459 | 459 | case x: String => | |
460 | 460 | x | |
461 | 461 | case _ => | |
462 | 462 | throw("NFT creation failed") | |
463 | 463 | } | |
464 | 464 | if ((id == id)) | |
465 | 465 | then { | |
466 | 466 | let id_b = fromBase58String(id) | |
467 | 467 | let key = to_key(n) | |
468 | 468 | $Tuple2([IntegerEntry("count", (n + 1)), StringEntry(id, key), StringEntry(key, id), IntegerEntry((key + "_G"), getIntegerValue((key_original + "_G"))), StringEntry((key + "_SL"), name), IntegerEntry((key + "_SN"), 0), StringEntry((key + "_SP0"), getStringValue((key_original + "_SP0"))), StringEntry((key + "_SP1"), getStringValue((key_original + "_SP1"))), IntegerEntry((key + "_SB0"), getIntegerValue((key_original + "_SB0"))), IntegerEntry((key + "_SB1"), getIntegerValue((key_original + "_SB1"))), IntegerEntry((key + "_SB2"), getIntegerValue((key_original + "_SB2"))), IntegerEntry((key + "_ST"), getIntegerValue((key_original + "_ST"))), StringEntry((key + "_SC0"), getStringValue((key_original + "_SC0"))), StringEntry((key + "_SC1"), getStringValue((key_original + "_SC1"))), StringEntry((key + "_SC2"), getStringValue((key_original + "_SC2"))), StringEntry((key + "_SC3"), getStringValue((key_original + "_SC3"))), StringEntry((key + "_SC4"), getStringValue((key_original + "_SC4"))), StringEntry((key + "_SC5"), getStringValue((key_original + "_SC5"))), StringEntry((key + "_SC6"), getStringValue((key_original + "_SC6"))), StringEntry((key + "_SC7"), getStringValue((key_original + "_SC7"))), StringEntry((key + "_SA"), getStringValue((key_original + "_SA"))), StringEntry((key + "_SI0"), getStringValue((key_original + "_SI0"))), StringEntry((key + "_SI1"), getStringValue((key_original + "_SI1"))), StringEntry((key + "_SI2"), getStringValue((key_original + "_SI2"))), StringEntry((key + "_SI3"), getStringValue((key_original + "_SI3"))), StringEntry((key + "_SI4"), getStringValue((key_original + "_SI4"))), StringEntry((key + "_SI5"), getStringValue((key_original + "_SI5"))), StringEntry((key + "_SI50"), getStringValue((key_original + "_SI50"))), StringEntry((key + "_SI51"), getStringValue((key_original + "_SI51"))), StringEntry((key + "_SI52"), getStringValue((key_original + "_SI52"))), StringEntry((key + "_SI53"), getStringValue((key_original + "_SI53"))), StringEntry((key + "_SI54"), getStringValue((key_original + "_SI54"))), StringEntry((key + "_SI55"), getStringValue((key_original + "_SI55"))), StringEntry((key + "_SI56"), getStringValue((key_original + "_SI56"))), StringEntry((key + "_SI57"), getStringValue((key_original + "_SI57"))), StringEntry((key + "_SI00"), getStringValue((key_original + "_SI00"))), StringEntry((key + "_SI01"), getStringValue((key_original + "_SI01"))), StringEntry((key + "_SI02"), getStringValue((key_original + "_SI02"))), StringEntry((key + "_SI03"), getStringValue((key_original + "_SI03"))), StringEntry((key + "_SI04"), getStringValue((key_original + "_SI04"))), StringEntry((key + "_SI05"), getStringValue((key_original + "_SI05"))), StringEntry((key + "_SI06"), getStringValue((key_original + "_SI06"))), StringEntry((key + "_SI07"), getStringValue((key_original + "_SI07"))), StringEntry((key + "_SI10"), getStringValue((key_original + "_SI10"))), StringEntry((key + "_SI11"), getStringValue((key_original + "_SI11"))), StringEntry((key + "_SI12"), getStringValue((key_original + "_SI12"))), StringEntry((key + "_SI13"), getStringValue((key_original + "_SI13"))), StringEntry((key + "_SI14"), getStringValue((key_original + "_SI14"))), StringEntry((key + "_SI15"), getStringValue((key_original + "_SI15"))), StringEntry((key + "_SI16"), getStringValue((key_original + "_SI16"))), StringEntry((key + "_SI17"), getStringValue((key_original + "_SI17"))), StringEntry((key + "_SI20"), getStringValue((key_original + "_SI20"))), StringEntry((key + "_SI21"), getStringValue((key_original + "_SI21"))), StringEntry((key + "_SI22"), getStringValue((key_original + "_SI22"))), StringEntry((key + "_SI23"), getStringValue((key_original + "_SI23"))), StringEntry((key + "_SI24"), getStringValue((key_original + "_SI24"))), StringEntry((key + "_SI25"), getStringValue((key_original + "_SI25"))), StringEntry((key + "_SI26"), getStringValue((key_original + "_SI26"))), StringEntry((key + "_SI27"), getStringValue((key_original + "_SI27"))), StringEntry((key + "_SI30"), getStringValue((key_original + "_SI30"))), StringEntry((key + "_SI31"), getStringValue((key_original + "_SI31"))), StringEntry((key + "_SI32"), getStringValue((key_original + "_SI32"))), StringEntry((key + "_SI33"), getStringValue((key_original + "_SI33"))), StringEntry((key + "_SI34"), getStringValue((key_original + "_SI34"))), StringEntry((key + "_SI35"), getStringValue((key_original + "_SI35"))), StringEntry((key + "_SI36"), getStringValue((key_original + "_SI36"))), StringEntry((key + "_SI37"), getStringValue((key_original + "_SI37"))), StringEntry((key + "_SI40"), getStringValue((key_original + "_SI40"))), StringEntry((key + "_SI41"), getStringValue((key_original + "_SI41"))), StringEntry((key + "_SI42"), getStringValue((key_original + "_SI42"))), StringEntry((key + "_SI43"), getStringValue((key_original + "_SI43"))), StringEntry((key + "_SI44"), getStringValue((key_original + "_SI44"))), StringEntry((key + "_SI45"), getStringValue((key_original + "_SI45"))), StringEntry((key + "_SI46"), getStringValue((key_original + "_SI46"))), StringEntry((key + "_SI47"), getStringValue((key_original + "_SI47"))), ScriptTransfer(Address(i.caller.bytes), 1, id_b), IntegerEntry(("SA_" + asset_id), (amount - 1))], unit) | |
469 | 469 | } | |
470 | 470 | else throw("Strict value is not equal to itself.") | |
471 | 471 | } | |
472 | 472 | } | |
473 | 473 | ||
474 | 474 | ||
475 | + | ||
476 | + | @Callable(i) | |
477 | + | func chart_like_add (asset_id) = { | |
478 | + | let song_id = match getString(asset_id) { | |
479 | + | case s: String => | |
480 | + | s | |
481 | + | case _ => | |
482 | + | throw("Invalid asset id") | |
483 | + | } | |
484 | + | let song_name_index = match getInteger((song_id + "_SN")) { | |
485 | + | case n: Int => | |
486 | + | n | |
487 | + | case _ => | |
488 | + | throw("Not a song") | |
489 | + | } | |
490 | + | if ((song_name_index == song_name_index)) | |
491 | + | then { | |
492 | + | let caller = toBase58String(i.caller.bytes) | |
493 | + | let have_like = match getBoolean(((("CL_" + asset_id) + "_") + caller)) { | |
494 | + | case b: Boolean => | |
495 | + | b | |
496 | + | case _ => | |
497 | + | false | |
498 | + | } | |
499 | + | let amount = match getInteger(("CN_" + asset_id)) { | |
500 | + | case n: Int => | |
501 | + | n | |
502 | + | case _ => | |
503 | + | 0 | |
504 | + | } | |
505 | + | if (have_like) | |
506 | + | then throw("Already have a like") | |
507 | + | else $Tuple2([BooleanEntry(((("CL_" + asset_id) + "_") + caller), true), IntegerEntry(("CN_" + asset_id), (amount + 1))], unit) | |
508 | + | } | |
509 | + | else throw("Strict value is not equal to itself.") | |
510 | + | } | |
511 | + | ||
512 | + | ||
513 | + | ||
514 | + | @Callable(i) | |
515 | + | func chart_like_remove (asset_id) = { | |
516 | + | let song_id = match getString(asset_id) { | |
517 | + | case s: String => | |
518 | + | s | |
519 | + | case _ => | |
520 | + | throw("Invalid asset id") | |
521 | + | } | |
522 | + | let song_name_index = match getInteger((song_id + "_SN")) { | |
523 | + | case n: Int => | |
524 | + | n | |
525 | + | case _ => | |
526 | + | throw("Not a song") | |
527 | + | } | |
528 | + | if ((song_name_index == song_name_index)) | |
529 | + | then { | |
530 | + | let caller = toBase58String(i.caller.bytes) | |
531 | + | let have_like = match getBoolean(((("CL_" + asset_id) + "_") + caller)) { | |
532 | + | case b: Boolean => | |
533 | + | b | |
534 | + | case _ => | |
535 | + | false | |
536 | + | } | |
537 | + | let amount = match getInteger(("CN_" + asset_id)) { | |
538 | + | case n: Int => | |
539 | + | n | |
540 | + | case _ => | |
541 | + | 0 | |
542 | + | } | |
543 | + | if (!(have_like)) | |
544 | + | then throw("Do not have a like") | |
545 | + | else if ((1 > amount)) | |
546 | + | then throw("Invalid likes amount") | |
547 | + | else $Tuple2([BooleanEntry(((("CL_" + asset_id) + "_") + caller), false), IntegerEntry(("CN_" + asset_id), (amount - 1))], unit) | |
548 | + | } | |
549 | + | else throw("Strict value is not equal to itself.") | |
550 | + | } | |
551 | + | ||
552 | + | ||
553 | + | ||
554 | + | @Callable(i) | |
555 | + | func chart_like_set (asset_id,new_amount) = if (!(check_whitelist(i.caller))) | |
556 | + | then throw("Caller not in whitelist") | |
557 | + | else if ((0 > new_amount)) | |
558 | + | then throw("Invalid likes amount") | |
559 | + | else { | |
560 | + | let amount = match getInteger(("CN_" + asset_id)) { | |
561 | + | case n: Int => | |
562 | + | n | |
563 | + | case _ => | |
564 | + | 0 | |
565 | + | } | |
566 | + | $Tuple2([IntegerEntry(("CN_" + asset_id), new_amount)], unit) | |
567 | + | } | |
568 | + | ||
569 | + |
github/deemru/w8io/3ef1775 89.17 ms ◑