tx · BR6iYctGAvENpofigfsQev1TPf7j3Hk4A3CfuXKirwim

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02500000 Waves

2023.01.20 07:27 [2412785] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "BR6iYctGAvENpofigfsQev1TPf7j3Hk4A3CfuXKirwim", "fee": 2500000, "feeAssetId": null, "timestamp": 1674188831340, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "LARYGunN6peBAE4zj4dNiEAMH7rr7kNZgYGWAioeg8Rpx7LF5Dfkb2RtUKULTt5rzKQMhe5Cs4ko6iRuanaRXW8" ], "script": "base64:BgJfCAISBAoCCAgSEAoOCAgICAgICAgICAgIAQgSDwoNCAgICAgICAgICAgBCBIGCgQICAgIEgQKAggIEggKBggBAQgBCBIECgIICBIECgIICBIGCgQICAgIEgYKBAgICAhOAAdWRVJTSU9OAgYxLjEuMTABDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgAACHVuaXRUZXN0BwAJb3JhY2xlRmVlCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECD2NvbmZfb3JhY2xlX2ZlZQAIc2lnbkRhcHAJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9zaWdud2ViX2RhcHAAC2ZlZVJlY2VpdmVyCQEOZ2V0U3RyaW5nQnlLZXkBAhFjb25mX2ZlZV9yZWNlaXZlcgAIdXNlckRhcHADBQh1bml0VGVzdAkBBXZhbHVlAQkApggBAiMzTXQ0UkdNRXlqU1dZQW9jVFBxZDU1d2RIUVFCM1BVMlVDbQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX3VzZXJzX2RhcHAADXdoaXRlbGlzdERhcHAJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQITY29uZl93aGl0ZWxpc3RfZGFwcAALc2lnbkFzc2V0SWQJANkEAQkBDmdldFN0cmluZ0J5S2V5AQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAt1c2RuQXNzZXRJZAkA2QQBCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRE4AC3VzZHRBc3NldElkCQDZBAEJAQ5nZXRTdHJpbmdCeUtleQECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEVAAMd2F2ZXNBc3NldElkAQAABWNocmlzCQEOZ2V0U3RyaW5nQnlLZXkBAgxjb25mX2FkbWluXzEBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCW9yYWNsZUZlZQUDa2V5Ah9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlAQ9nZXRJbnRlZ2VyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEOY2hlY2tXaGl0ZWxpc3QBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ13aGl0ZWxpc3REYXBwBQNrZXkAAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwAHc2lnbkN1dAAHAAt1c2RuV2F2ZUN1dAAKAA5kZWZhdWx0TGljZW5jZQkBDmdldFN0cmluZ0J5S2V5AQIUY29uZl9kZWZhdWx0X2xpY2VuY2UAEmRlZmF1bHRIYXNoTGljZW5jZQkBDmdldFN0cmluZ0J5S2V5AQIZY29uZl9kZWZhdWx0X2xpY2VuY2VfaGFzaAALZGFwcFJ1bm5pbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUIdXNlckRhcHACFGNvbmZfZGFwcF9pc19ydW5uaW5nBgAObWFpbnRlbmFuY2VNU0cJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHACFGNvbmZfbWFpbnRlbmFuY2VfbXNnAgAADXVzZXJTdXNwZW5kZWQCCVNVU1BFTkRFRAALdXNlclJlbW92ZWQCB1JFTU9WRUQAEHVzZXJVbnJlZ2lzdGVyZWQCDFVOUkVHSVNURVJFRAALdXNlckFsbG93ZWQCB0FMTE9XRUQAGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJARlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAQkArAICAhJjZXJ0aWZpY2F0aW9uX2ZlZV8JANgEAQULc2lnbkFzc2V0SWQBE2dldEFydHdvcmtSb3lhbHRpZXMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkA6AcBFGNoZWNrU2lnbkNlcnRpZmljYXRlAwZzaWduSUQFT3duZXIKc2hhMjU2SGFzaAQHJG1hdGNoMAkAnQgCBQhzaWduRGFwcAkArAICCQCsAgIJAKwCAgIIZGF0YV9mY18FBnNpZ25JRAIBXwUFT3duZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkBCGNvbnRhaW5zAgUBYQUKc2hhMjU2SGFzaAYHBwELdmFsaWRhdGVDSUQBA2NpZAMJAQhjb250YWlucwIFA2NpZAIBLwMDCQBmAgBMCQCxAgEFA2NpZAkAAAIJALECAQkAkQMCCQC1CQIFA2NpZAIBLwAAADsHCQBmAgAQCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAQcHAQx2YWxpZGF0ZUhhc2gBBGhhc2gJAAACCQCxAgEFBGhhc2gAQAENa2V5VXNlclN0YXR1cwEGY2FsbGVyCQCsAgICDHVzZXJfc3RhdHVzXwUGY2FsbGVyAQdrZXlEYXRlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5TmFtZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleURlc2MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlEaXNwbGF5Q2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDWtleUV4cG9ydEhhc2gCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUFYXJ0SWQCAV8FBmNhbGxlcgEMa2V5RXhwb3J0Q2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICD2FydF9leHBvcnRfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5TWF4TWludAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfbWF4bWludF8FBWFydElkAgFfBQZjYWxsZXIBCWtleVNpZ25JRAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfc2lnbmlkXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5SXNzdWVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlPblNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X29uc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBDmtleUxpY2VuY2VIYXNoAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlMaWNlbmNlQ2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9saWNlbmNlX2NpZF8FBWFydElkAgFfBQZjYWxsZXIBB2tleVRhZ3MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3RhZ3NfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUeXBlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5Tm90ZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfbm90ZV8FBWFydElkAgFfBQZjYWxsZXIBCmtleUNyYXdsZXICBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2NyYXdsZXJfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEMa2V5Um95YWx0aWVzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDmFydF9yb3lhbHRpZXNfBQVhcnRJZAIBXwUGY2FsbGVyAQhrZXlQcmljZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgphcnRfcHJpY2VfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlFbmRTYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDGFydF9lbmRzYWxlXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXNzZXRJZEFjY2VwdGVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEmFydF9hc3NldEFjY2VwdGVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5RmxhZwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZmxhZ18FBWFydElkAgFfBQZjYWxsZXIBEmtleUFydGlzdEFnZW50QWRkcgEKYXJ0aXN0QWRkcgkArAICAg1hcnRpc3RfYWdlbnRfBQphcnRpc3RBZGRyAQ9rZXlQcmltYXJ5U2hhcmUBCmFydGlzdEFkZHIJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQphcnRpc3RBZGRyARFrZXlIYXNoQnlUeGlkQWRkcgIGY2FsbGVyBHR4aWQJAKwCAgkArAICCQCsAgICE2dldF9oYXNoYnl0eGlkYWRkcl8FBHR4aWQCAV8FBmNhbGxlcgEOa2V5T3duZXJCeUhhc2gBCnNoYTI1Nkhhc2gJAKwCAgISZ2V0X293bmVyX2J5X2hhc2hfBQpzaGEyNTZIYXNoAQ1rZXlpZEJ5U2lnbmlkAgZjYWxsZXIGc2lnbklkCQCsAgIJAKwCAgkArAICAhJnZXRfYXJ0aWRieXNpZ25pZF8FBnNpZ25JZAIBXwUGY2FsbGVyARJrZXlUeGlkQnlIYXNoT3duZXICCnNoYTI1Nkhhc2gGY2FsbGVyCQCsAgICF2dldF90eGlkX2J5X2hhc2hfb3duZXJfCQDYBAEJANQWAQkAmwMBCQCsAgIFCnNoYTI1Nkhhc2gFBmNhbGxlcgEOdmFsaWRhdGVBbGxDSUQDCmNpZERpc3BsYXkJY2lkRXhwb3J0CmNpZExpY2VuY2UDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZERpc3BsYXkJAAIBAhFXcm9uZyBEaXNwbGF5IENJRAMJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUJY2lkRXhwb3J0CQACAQIQV3JvbmcgRXhwb3J0IENJRAMDCQECIT0CBQpjaWRMaWNlbmNlAgAJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUKY2lkTGljZW5jZQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBD3ZhbGlkYXRlQWxsSGFzaAIMc2hhMjU2RXhwb3J0DXNoYTI1NkxpY2VuY2UDCQEBIQEJAQx2YWxpZGF0ZUhhc2gBBQxzaGEyNTZFeHBvcnQJAAIBAhhFeHBvcnQgSGFzaCA2NCBjaGFyLiBtYXgDCQEBIQEJAQx2YWxpZGF0ZUhhc2gBBQ1zaGEyNTZMaWNlbmNlCQACAQIZTGljZW5jZSBIYXNoIDY0IGNoYXIuIG1heAYBDnZhbGlkYXRlU3RyaW5nAgNzdHIDbWF4AwkAAAIJALECAQUDc3RyAAAJAAIBAhhGaWVsZCBjYW5ub3QgYmUgaXMgZW1wdHkDCQBmAgkAsQIBBQNzdHIFA21heAkAAgEJAKwCAgUDc3RyAgwgaXMgdG9vIGxvbmcGAQx2YWxpZGF0ZVVzZXIBBmNhbGxlcgQKdXNlclN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBDWtleVVzZXJTdGF0dXMBBQZjYWxsZXIFEHVzZXJVbnJlZ2lzdGVyZWQDAwkAAAIFCnVzZXJTdGF0dXMFEHVzZXJVbnJlZ2lzdGVyZWQGCQAAAgUKdXNlclN0YXR1cwULdXNlckFsbG93ZWQCLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUKdXNlclN0YXR1cwUNdXNlclN1c3BlbmRlZAIRQWNjb3VudCBzdXNwZW5kZWQDCQAAAgUKdXNlclN0YXR1cwULdXNlclJlbW92ZWQCD0FjY291bnQgcmVtb3ZlZAIAAQpzZXRMSWNlbmNlAgpjaWRMaWNlbmNlDXNoYTI1NkxpY2VuY2UEA2NpZAMJAAACCQCxAgEFCmNpZExpY2VuY2UAAAUOZGVmYXVsdExpY2VuY2UFCmNpZExpY2VuY2UEBGhhc2gDCQAAAgkAsQIBBQ1zaGEyNTZMaWNlbmNlAAAFEmRlZmF1bHRIYXNoTGljZW5jZQUNc2hhMjU2TGljZW5jZQkAlAoCBQNjaWQFBGhhc2gBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBmNhbGxlcgpjaWREaXNwbGF5CWNpZEV4cG9ydApsaWNlbmNlQ0lEDHNoYTI1NkV4cG9ydAtsaWNlbmNlSGFzaARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MJcm95YWx0aWVzBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAAACCQCxAgEFCmNpZERpc3BsYXkAAAkAAgECG0Rpc3BsYXkgQ0lEIGNhbm5vdCBiZSBlbXB0eQMJAQEhAQkBDnZhbGlkYXRlQWxsQ0lEAwUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lECQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBD3ZhbGlkYXRlQWxsSGFzaAIFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gJAAIBAhNQcm9ibGVtIHdpdGggSGFzaGVzAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQRuYW1lAGQJAAIBAhIxMDAgQ2hhci4gbWF4IG5hbWUDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFC2Rlc2NyaXB0aW9uAOgHCQACAQIaMTAwMCBDaGFyLiBtYXggZGVzY3JpcHRpb24DAwkAZgIAAAUJcm95YWx0aWVzBgkAZgIFCXJveWFsdGllcwDoBwkAAgECM1JveWFsdGllcyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAlIG9yIGhpZ2hlciB0aGFuIDEwJQMJAGYCCQCQAwEJALUJAgUEdGFncwIBLAAFCQACAQILNSB0YWdzIG1heC4CAAEJaXNQYXltZW50AQFpAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECE05vIHBheW1lbnQgYXR0YWNoZWQEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQGYW1vdW50CQEFdmFsdWUBCAUHcGF5bWVudAZhbW91bnQJAJQKAgUHcGF5bWVudAUGYW1vdW50AQ92YWxpZGF0ZVBheW1lbnQBAWkECyR0MDg5MDc4OTQzCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFCyR0MDg5MDc4OTQzAl8xBAZhbW91bnQIBQskdDA4OTA3ODk0MwJfMgQHYXNzZXRJZAMDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkAAAIIBQdwYXltZW50B2Fzc2V0SWQFC3NpZ25Bc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECK09ubHkgU0lHTiB0b2tlbiBhY2NlcHRlZCBhcyB0cmFuc2FjdGlvbiBmZWUDCQECIT0CBQZhbW91bnQFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBAskdDA5NTMxOTU2NwkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQskdDA5NTMxOTU2NwJfMQQGYW1vdW50CAULJHQwOTUzMTk1NjcCXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFDHByaWNlQXNzZXRJZAAACQAAAgkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBQxwcmljZUFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFB2Fzc2V0SWQFBHVuaXQJAQIhPQIFDHByaWNlQXNzZXRJZAIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBAhNQYXltZW50IGRvbid0IG1hdGNoCQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMDAwMDCQECIT0CBQdhc3NldElkCQDYBAEFC3NpZ25Bc3NldElkCQECIT0CBQdhc3NldElkCQDYBAEFDHdhdmVzQXNzZXRJZAcJAQIhPQIFB2Fzc2V0SWQCBVdBVkVTBwkBAiE9AgUHYXNzZXRJZAkA2AQBBQt1c2RuQXNzZXRJZAcJAQIhPQIFB2Fzc2V0SWQJANgEAQULdXNkdEFzc2V0SWQHCQACAQImT25seSBTSUdOLCBVU0ROLFVTRFQgb3IgV0FWRVMgYWNjZXB0ZWQGAQ92YWxpZGF0ZU1pblNlbGwCB2Fzc2V0SWQFcHJpY2UEDG1pblNlbGxXYXZlcwMFCHVuaXRUZXN0AAoJARlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAQIOd2F2ZXNfbWluX3NlbGwEC21pblNlbGxVc2RuAMCEPQQLbWluU2VsbFNpZ24DBQh1bml0VGVzdAABCQBoAgUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQACAwMDAwMDCQAAAgUHYXNzZXRJZAkA2AQBBQt1c2RuQXNzZXRJZAkAZgIFC21pblNlbGxVc2RuBQVwcmljZQcJAQIhPQIFBXByaWNlAAAHBgMDCQAAAgUHYXNzZXRJZAkA2AQBBQt1c2R0QXNzZXRJZAkAZgIFC21pblNlbGxVc2RuBQVwcmljZQcJAQIhPQIFBXByaWNlAAAHBgMDCQAAAgUHYXNzZXRJZAkA2AQBBQtzaWduQXNzZXRJZAkAZgIFC21pblNlbGxTaWduBQVwcmljZQcJAQIhPQIFBXByaWNlAAAHBgMDAwkAAAIFB2Fzc2V0SWQJANgEAQUMd2F2ZXNBc3NldElkBgkAAAIFB2Fzc2V0SWQCBVdBVkVTCQBmAgUMbWluU2VsbFdhdmVzBQVwcmljZQcJAQIhPQIFBXByaWNlAAAHCQACAQIYV3JvbmcgbWluaW11bSBzZWxsIHByaWNlBgENZ2V0QmlkQXNzZXRJZAEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQpiaWREYXRhS2V5BAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQJYmlkQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBApiaWRBc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAAAwkAZwIAAAUJYmlkQW1vdW50CQACAQIMV3JvbmcgYW1vdW50CQCUCgIFCWJpZEFtb3VudAUKYmlkQXNzZXRJZAEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgFpBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQLaXNTcG9uc29yZWQJAQt2YWx1ZU9yRWxzZQIJAQ5jaGVja1doaXRlbGlzdAEJAKwCAgkApQgBCQCnCAEJANkEAQUGcHViS2V5AglfZnJlZV90eHMAAAQGY2FsbGVyAwMDCQAAAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQClCAEFBHRoaXMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAHCQBmAgULaXNTcG9uc29yZWQAAAcJAKUIAQkApwgBCQDZBAEFBnB1YktleQkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBNnZXRfc3BvbnNvcmVkX3dhdmVzAwkBAiE9AgUGcHViS2V5AgAJAPwHBAUNd2hpdGVsaXN0RGFwcAIJdXNlRnJlZVR4CQDMCAIJAKUIAQkApwgBCQDZBAEFBnB1YktleQUDbmlsBQNuaWwFBHVuaXQDCQAAAgUTZ2V0X3Nwb25zb3JlZF93YXZlcwUTZ2V0X3Nwb25zb3JlZF93YXZlcwkAlgoECQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFBmNhbGxlcggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAGYCBQtpc1Nwb25zb3JlZAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxpZENhbGxlckRhdGUBAWkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQdidXlNaW50BQFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMTI5MTkxMjk3OAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMTI5MTkxMjk3OAJfMQQGY2FsbGVyCAUNJHQwMTI5MTkxMjk3OAJfMgQEZGF0ZQgFDSR0MDEyOTE5MTI5NzgCXzMEBWlzQmlkAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIFBmNhbGxlcgUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEBnNpZ25JRAkBDmdldFN0cmluZ0J5S2V5AQkBCWtleVNpZ25JRAIFBmlzc3VlcgUFYXJ0SWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyCQBoAgUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQACCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCGtleVByaWNlAgUGaXNzdWVyBQVhcnRJZAQMcHJpY2VBc3NldElkAwUOY2FsbGVySXNJc3N1ZXIJANgEAQULc2lnbkFzc2V0SWQJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwMDCQEBIQEFBWlzQmlkCQEBIQEFDmNhbGxlcklzSXNzdWVyBwMDCQBnAgAABQxhcnR3b3JrUHJpY2UGCQEBIQEFCGlzT25TYWxlBgkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFBWlzQmlkBQ5jYWxsZXJJc0lzc3VlcgcJAGcCAAAFCm1heENhblNlbGwHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmlzc3VlcgMDBQVpc0JpZAkBAiE9AgUJY2hlY2tVc2VyAgAHCQACAQUJY2hlY2tVc2VyBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQNJHQwMTQ2ODExNDg0OAMFBWlzQmlkCQEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEFCmJpZERhdGFLZXkJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAUMYXJ0d29ya1ByaWNlBAZhbW91bnQIBQ0kdDAxNDY4MTE0ODQ4Al8xBAdhc3NldElkCAUNJHQwMTQ2ODExNDg0OAJfMgQFYWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARJrZXlBcnRpc3RBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBAphZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEPa2V5UHJpbWFyeVNoYXJlAQUGaXNzdWVyAAAEDWlzV2hpdGVsaXN0ZWQJAQ5jaGVja1doaXRlbGlzdAEFBmlzc3VlcgQDY3V0AwkAZgIFDWlzV2hpdGVsaXN0ZWQFBmhlaWdodAAAAwkAAAIFB2Fzc2V0SWQFC3NpZ25Bc3NldElkBQdzaWduQ3V0BQt1c2RuV2F2ZUN1dAQNYW1vdW50Rm9yU2lnbgkAawMFBmFtb3VudAUDY3V0AGQEDmFtb3VudEZvckFnZW50AwMDCQECIT0CBQVhZ2VudAULZmVlUmVjZWl2ZXIJAGYCBQphZ2VudFNoYXJlAAAHCQBmAgUGaGVpZ2h0BQ1pc1doaXRlbGlzdGVkBwkAawMFBmFtb3VudAUKYWdlbnRTaGFyZQBkAAAEEGFtb3VudEZvckNyZWF0b3IJAGUCBQZhbW91bnQFDWFtb3VudEZvclNpZ24DCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDEFydCBzb2xkIG91dAQNbmV3QW1vdW50U29sZAkAZAIFCmFtb3VudFNvbGQAAQQJaXNzdWVNZXRhCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJQ3JlYXRvcjogBQZpc3N1ZXICCiwKIEFydElEOiAFBWFydElkAgssCiBTaWduSUQ6IAUGc2lnbklEAhEsCiBBcnR3b3JrIG5hbWU6IAULYXJ0d29ya05hbWUCCiwKIElzc3VlOiAJAKQDAQUNbmV3QW1vdW50U29sZAIBLwkApAMBBQptYXhDYW5TZWxsBAhpc3N1ZU5GVAkAwggFCQCsAgICA1NBXwkApAMBCQBkAgUIdG90YWxORlQAAQUJaXNzdWVNZXRhAAEAAAcEBWlkTkZUCQC4CAEFCGlzc3VlTkZUBApzZWxsU3RhdHVzAwMJAAACBQ1uZXdBbW91bnRTb2xkBQptYXhDYW5TZWxsBgkBASEBBQhpc09uU2FsZQcGBApyZWNlaXZlTkZUAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYmlkT3duZXIIBQFpBmNhbGxlcgQKYXNzZXRJZEJpZAMJAQEhAQkBCWlzRGVmaW5lZAEFB2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFB2Fzc2V0SWQEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZERlbE9sZAkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgQJYmlkVXBkYXRlCQELU3RyaW5nRW50cnkCCQCsAgIFCmJpZERhdGFLZXkCB19DTE9TRUQJAKwCAgkArAICBQdiaWREYXRhAgFfCQCkAwEFBGRhdGUEB3NvbGRLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJYXJ0X3NvbGRfCQCkAwEFDW5ld0Ftb3VudFNvbGQCBF9vZl8JAKQDAQUKbWF4Q2FuU2VsbAIBXwUFYXJ0SWQCAV8FBmlzc3VlcgQJc29sZFZhbHVlAwkBASEBBQVpc0JpZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZjYWxsZXICAV8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8JAKQDAQUMYXJ0d29ya1ByaWNlAgFfBQxwcmljZUFzc2V0SWQCAV8JANgEAQUFaWRORlQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQpyZWNlaXZlTkZUAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFBmFtb3VudAIBXwUKYXNzZXRJZEJpZAIBXwkA2AQBBQVpZE5GVAQIc29sZERhdGEJAQtTdHJpbmdFbnRyeQIFB3NvbGRLZXkFCXNvbGRWYWx1ZQQLY29tbWlzc2lvbnMDCQECIT0CBQ5hbW91bnRGb3JBZ2VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50BQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQVhZ2VudAUOYW1vdW50Rm9yQWdlbnQFB2Fzc2V0SWQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIFDWFtb3VudEZvclNpZ24FB2Fzc2V0SWQFA25pbAQGYnV5UmVzCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBQ1uZXdBbW91bnRTb2xkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIEbmZ0XwkA2AQBBQVpZE5GVAUHc29sZEtleQkAzAgCCQEMSW50ZWdlckVudHJ5AgIQdG90YWxfbmZ0X2lzc3VlZAkAZAIFCHRvdGFsTkZUAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlFbmRTYWxlAgUGaXNzdWVyBQVhcnRJZAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGaXNzdWVyBQVhcnRJZAUKc2VsbFN0YXR1cwkAzAgCBQhpc3N1ZU5GVAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGaXNzdWVyBRBhbW91bnRGb3JDcmVhdG9yBQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCnJlY2VpdmVORlQAAQUFaWRORlQFA25pbAULY29tbWlzc2lvbnMDBQVpc0JpZAkAzAgCBQhzb2xkRGF0YQkAzAgCBQliaWRVcGRhdGUJAMwIAgUJYmlkRGVsT2xkBQZidXlSZXMJAMwIAgUIc29sZERhdGEFBmJ1eVJlcwEIYXNTdHJpbmcBAmJ2BAckbWF0Y2gwBQJidgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA2J2MAUHJG1hdGNoMAUDYnYwCQACAQIkU3BvbnNvcmVkIFB1YmxpYyBLZXkgU3RyaW5nIGV4cGVjdGVkCgZpbnZva2UBB3NldENvbmYCA2tleQN2YWwEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEIY29udGFpbnMCBQNrZXkCBWNvbmZfCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwJAAIBAiBFbnRyaWVzIHN0YXJ0aW5nIHdpdGggY29uZl8gb25seQkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMBaQEKYWRkQXJ0d29yaw4Kc2hhMjU2SGFzaAZzaWduSUQEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQxzaGEyNTZFeHBvcnQJY2lkRXhwb3J0DXNoYTI1NkxpY2VuY2UKY2lkTGljZW5jZQdjcmF3bGVyCXJveWFsdGllcwZwdWJLZXkEDSR0MDE4ODgxMTg5NTQJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEBWFydElkCAUNJHQwMTg4ODExODk1NAJfMQQGY2FsbGVyCAUNJHQwMTg4ODExODk1NAJfMgQEZGF0ZQgFDSR0MDE4ODgxMTg5NTQCXzMEC2lzU3BvbnNvcmVkCAUNJHQwMTg4ODExODk1NAJfNAMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFCnNoYTI1Nkhhc2gJAAIBAiRIYXNoIHNob3VsZCBiZSA2NCBjaGFyYWN0ZXJzIG1heGltdW0EDSR0MDE5MDU1MTkxMjQJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDE5MDU1MTkxMjQCXzEEC2xpY2VuY2VIYXNoCAUNJHQwMTkwNTUxOTEyNAJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQoFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUJcm95YWx0aWVzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEEHdoaXRlbGlzdGVkX2Ryb3AJAGYCCQEOY2hlY2tXaGl0ZWxpc3QBCQCsAgIFBmNhbGxlcgILX2ZyZWVfZHJvcHMAAAQNJHQwMTk0MjMxOTUwNwMFEHdoaXRlbGlzdGVkX2Ryb3AJAJQKAgAABQZzaWduSUQJAQ92YWxpZGF0ZVBheW1lbnQBBQFpBAZhbW91bnQIBQ0kdDAxOTQyMzE5NTA3Al8xBAdhc3NldElkCAUNJHQwMTk0MjMxOTUwNwJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFBmFtb3VudAkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQESa2V5VHhpZEJ5SGFzaE93bmVyAgUKc2hhMjU2SGFzaAUGY2FsbGVyAwkBAiE9AgUKZW50cnlFeGlzdAIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQECWhhc2hFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAMJAQIhPQIFCWhhc2hFeGlzdAIACQACAQIXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQED2lzU2lnbkNlcnRpZmllZAkBFGNoZWNrU2lnbkNlcnRpZmljYXRlAwUGc2lnbklEBQZjYWxsZXIFCnNoYTI1Nkhhc2gDCQEBIQEFD2lzU2lnbkNlcnRpZmllZAkAAgECLFNpZ24gQ2VydGlmaWNhdGUgbm90IGZvdW5kIGZvciB0aGlzIGFkZHJlc3MuBBdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAMFEHdoaXRlbGlzdGVkX2Ryb3AJAPwHBAUNd2hpdGVsaXN0RGFwcAILdXNlRnJlZURyb3AJAMwIAgUGY2FsbGVyBQNuaWwFA25pbAUEdW5pdAMJAAACBRdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAUGY2FsbGVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlUeGlkQnlIYXNoT3duZXICBQpzaGEyNTZIYXNoBQZjYWxsZXIFBWFydElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEHa2V5RGF0ZQIFBmNhbGxlcgUFYXJ0SWQFBGRhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQVhcnRJZAULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleURpc3BsYXlDaWQCBQZjYWxsZXIFBWFydElkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFeHBvcnRDaWQCBQZjYWxsZXIFBWFydElkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBWFydElkBQxzaGEyNTZFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUxpY2VuY2VIYXNoAgUGY2FsbGVyBQVhcnRJZAULbGljZW5jZUhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUxpY2VuY2VDaWQCBQZjYWxsZXIFBWFydElkBQpsaWNlbmNlQ0lECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQVhcnRJZAUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VGFncwIFBmNhbGxlcgUFYXJ0SWQFBHRhZ3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAQlrZXlTaWduSUQCBQZjYWxsZXIFBWFydElkBQZzaWduSUQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBwkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5aWRCeVNpZ25pZAIFBmNhbGxlcgUGc2lnbklEBQVhcnRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5SGFzaEJ5VHhpZEFkZHICBQZjYWxsZXIFBWFydElkBQpzaGEyNTZIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQVhcnRJZAUHY3Jhd2xlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGtleVJveWFsdGllcwIFBmNhbGxlcgUFYXJ0SWQFCXJveWFsdGllcwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIFBmFtb3VudAULc2lnbkFzc2V0SWQFA25pbAUKdHhUb0NhbGxlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ11cGRhdGVBcnR3b3JrDQR0eGlkBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5AwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBA0kdDAyMjU0MTIyNjExCQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDIyNTQxMjI2MTECXzEEBmNhbGxlcggFDSR0MDIyNTQxMjI2MTECXzIEBGRhdGUIBQ0kdDAyMjU0MTIyNjExAl8zBAtpc1Nwb25zb3JlZAgFDSR0MDIyNTQxMjI2MTECXzQEDSR0MDIyNjIxMjI2OTAJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDIyNjIxMjI2OTACXzEEC2xpY2VuY2VIYXNoCAUNJHQwMjI2MjEyMjY5MAJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQoFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUJcm95YWx0aWVzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECmVudHJ5RXhpc3QJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkAwkAAAIFCmVudHJ5RXhpc3QCAAkAAgECD0VudHJ5IG5vdCBmb3VuZAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBHR4aWQDCQAAAgUEZmxhZwIHSUxMRUdBTAkAAgECHUNhbm5vdCB1cGRhdGUgSUxMRUdBTCBhcnR3b3JrAwkBASEBCQELaXNBcnRNaW50ZWQCBQZjYWxsZXIFBHR4aWQECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5hbWUCBQZjYWxsZXIFBHR4aWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBHR4aWQFC2Rlc2NyaXB0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlEaXNwbGF5Q2lkAgUGY2FsbGVyBQR0eGlkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFeHBvcnRDaWQCBQZjYWxsZXIFBHR4aWQFCWNpZEV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RXhwb3J0SGFzaAIFBmNhbGxlcgUEdHhpZAUMc2hhMjU2RXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlMaWNlbmNlQ2lkAgUGY2FsbGVyBQR0eGlkBQpsaWNlbmNlQ0lECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlMaWNlbmNlSGFzaAIFBmNhbGxlcgUEdHhpZAULbGljZW5jZUhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVRhZ3MCBQZjYWxsZXIFBHR4aWQFBHRhZ3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBHR4aWQFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUNyYXdsZXICBQZjYWxsZXIFBHR4aWQFB2NyYXdsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlSb3lhbHRpZXMCBQZjYWxsZXIFBHR4aWQFCXJveWFsdGllcwUDbmlsBQp0eFRvQ2FsbGVyCQACAQIOQWxyZWFkeSBtaW50ZWQBaQELZmxhZ0FydHdvcmsEBWFydElkBGFkZHIEZmxhZwRub3RlBA0kdDAyNDMxNzI0MzUxCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNDMxNzI0MzUxAl8xBAZjYWxsZXIIBQ0kdDAyNDMxNzI0MzUxAl8yAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICB0NPTlNFTlQJAMwIAgIACQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5RmxhZwIFBGFkZHIFBWFydElkBQRmbGFnCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOb3RlAgUEYWRkcgUFYXJ0SWQFBG5vdGUFA25pbAkAAgEJAKwCAgIOVW5rbm93IHN0YXR1cyAFBGZsYWcJAAIBAhNZb3UgYXJlIG5vdCBhbGxvd2VkAWkBDWRlbGV0ZUFydHdvcmsCBWFydElkBGFkZHIEDSR0MDI0Nzg3MjQ4MjEJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDI0Nzg3MjQ4MjECXzEEBmNhbGxlcggFDSR0MDI0Nzg3MjQ4MjECXzIECWFkZHJUb1VzZQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIFBGFkZHIFBmNhbGxlcgQKZW50cnlFeGlzdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFCWFkZHJUb1VzZQUFYXJ0SWQCIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzAwkAAAIFCmVudHJ5RXhpc3QCAAkAAgECIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBApzaGEyNTZIYXNoCQEOZ2V0U3RyaW5nQnlLZXkBCQERa2V5SGFzaEJ5VHhpZEFkZHICBQlhZGRyVG9Vc2UFBWFydElkAwkAAAIFCnNoYTI1Nkhhc2gCAAkAAgECJU5vIGFydCBoYXNoIG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MEBnNpZ25JRAkBDmdldFN0cmluZ0J5S2V5AQkBCWtleVNpZ25JRAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQAAAgUGc2lnbklEAgAJAAIBAhNObyBTSUdOIElEIG1hdGNoaW5nBAxkYXRhVG9EZWxldGUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleURhdGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOYW1lAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RGVzYwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleURpc3BsYXlDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlFeHBvcnRDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlFeHBvcnRIYXNoAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEOa2V5TGljZW5jZUhhc2gCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlMaWNlbmNlQ2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5VHlwZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVRhZ3MCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlNYXhNaW50AgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5U2lnbklEAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5SXNzdWVkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5T25TYWxlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RmxhZwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCGtleVByaWNlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlpZEJ5U2lnbmlkAgUJYWRkclRvVXNlBQZzaWduSUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleVR4aWRCeUhhc2hPd25lcgIFCnNoYTI1Nkhhc2gFCWFkZHJUb1VzZQkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5RW5kU2FsZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleU5vdGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlDcmF3bGVyAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5Um95YWx0aWVzAgUJYWRkclRvVXNlBQVhcnRJZAUDbmlsAwkBASEBCQELaXNBcnRNaW50ZWQCBQlhZGRyVG9Vc2UFBWFydElkAwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBQxkYXRhVG9EZWxldGUDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQxkYXRhVG9EZWxldGUJAAIBAihBcnQgYWxyZWFkeSBtaW50ZWQsIHlvdSBjYW5ub3QgZGVsZXRlIGl0AWkBC3NlbGxBcnR3b3JrBgVhcnRJZAVwcmljZQdtYXhNaW50B2Fzc2V0SWQIYmxvY2tFbmQGcHViS2V5BA0kdDAyNzY1NzI3NzI3CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDI3NjU3Mjc3MjcCXzEEBmNhbGxlcggFDSR0MDI3NjU3Mjc3MjcCXzIEBGRhdGUIBQ0kdDAyNzY1NzI3NzI3Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDI3NjU3Mjc3MjcCXzQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECI1RoaXMgYXJ0IGRvZXNuJ3QgbWF0Y2ggeW91ciBhY2NvdW50BARmbGFnCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5RmxhZwIFBmNhbGxlcgUFYXJ0SWQDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAAIBAg9GbGFnZ2VkIGFydHdvcmsEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAGYCAAAFCGJsb2NrRW5kCQACAQIMTmVnYXRpdmUgZW5kAwMJAGYCBQhibG9ja0VuZAAAAwkBAiE9AgUHbWF4TWludAABBgkBAiE9AgUFcHJpY2UAAAcJAAIBAjpUaW1lZCBvZmZlciBvbmx5IGFsbG93ZWQgZm9yIHVuaXF1ZSBlZGl0aW9uIGFuZCBvZmZlciBvbmx5BApiYXNlSGVpZ2h0AwkAAAIFCGJsb2NrRW5kAAAAAAUGaGVpZ2h0AwkBASEBCQEQYWNjZXB0ZWRBc3NldElkcwEFB2Fzc2V0SWQJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEDCQEBIQEJAQ92YWxpZGF0ZU1pblNlbGwCBQdhc3NldElkBQVwcmljZQkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAMJAGYCBQdtYXhNaW50AGQJAAIBAhwxMDAgZWRpdGlvbnMgbWF4IHBlciBhcnR3b3JrAwMJAQIhPQIFCmFtb3VudFNvbGQAAAkAAAIFCmFtb3VudFNvbGQFCm1heENhblNlbGwHCQACAQIUTWF4IGVkaXRpb24gcmVhY2hlZC4DAwkAZgIFCmFtb3VudFNvbGQAAAkBAiE9AgUKbWF4Q2FuU2VsbAUHbWF4TWludAcJAAIBAiZDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgYW55bW9yZQMDCQBmAgUGYmlkTmJyAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQIxQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIHdpdGggYWN0aXZlIG9yZGVycwQKc2VsbFN0YXR1cwMDCQBmAgUFcHJpY2UAAAkAZgIFB21heE1pbnQAAAcGBwQKdHhUb0NhbGxlcgMFC2lzU3BvbnNvcmVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZjYWxsZXIAAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAQhrZXlQcmljZQIFBmNhbGxlcgUFYXJ0SWQFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQFB21heE1pbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEmtleUFzc2V0SWRBY2NlcHRlZAIFBmNhbGxlcgUFYXJ0SWQFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAkAZAIFCmJhc2VIZWlnaHQFCGJsb2NrRW5kBQNuaWwFCnR4VG9DYWxsZXIBaQEKYnV5QXJ0d29yawIFYXJ0SWQGaXNzdWVyCQEHYnV5TWludAUFAWkFBWFydElkBQZpc3N1ZXICAAIAAWkBBnNldEJpZAIFYXJ0SWQGaXNzdWVyBA0kdDAzMDEwNTMwMTQ1CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMDEwNTMwMTQ1Al8xBAZjYWxsZXIIBQ0kdDAzMDEwNTMwMTQ1Al8yBARkYXRlCAUNJHQwMzAxMDUzMDE0NQJfMwQNJHQwMzAxNTAzMDE4NgkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQ0kdDAzMDE1MDMwMTg2Al8xBAZhbW91bnQIBQ0kdDAzMDE1MDMwMTg2Al8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQIYmxvY2tFbmQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQACAQILU2FsZSBlbmRlZC4EBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAgUHYXNzZXRJZAUGYW1vdW50CQACAQIOV3JvbmcgbWluIHNlbGwECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMJAGcCAAAFCm1heENhblNlbGwJAAIBAiNObyBtYXggZWRpdGlvbiBzZXQgZm9yIHRoaXMgYXJ0d29yawMJAGcCBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIYU29sZCBvdXQsIHlvdSBjYW5ub3QgYmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FAmlkAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQdhc3NldElkAgFfCQCkAwEFBmFtb3VudAIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGQCBQZiaWROYnIAAQUDbmlsAWkBCWFjY2VwdEJpZAQFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBA0kdDAzMTM0NDMxMzg0CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMTM0NDMxMzg0Al8xBAZjYWxsZXIIBQ0kdDAzMTM0NDMxMzg0Al8yBARkYXRlCAUNJHQwMzEzNDQzMTM4NAJfMwMJAQIhPQIFBmNhbGxlcgUGaXNzdWVyCQACAQIZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgkBB2J1eU1pbnQFBQFpBQVhcnRJZAUGaXNzdWVyBQViaWRJZAUIYmlkT3duZXIBaQEJY2FuY2VsQmlkBAVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIEDSR0MDMxNjEwMzE2NzEJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDMxNjEwMzE2NzECXzEEBmNhbGxlcggFDSR0MDMxNjEwMzE2NzECXzIEBGRhdGUIBQ0kdDAzMTYxMDMxNjcxAl8zAwMJAQIhPQIFBmNhbGxlcgUIYmlkT3duZXIJAQIhPQIFBmNhbGxlcgUGaXNzdWVyBwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24EDXJldHVybk1vbmV5VG8DCQAAAgUGY2FsbGVyBQZpc3N1ZXIFCGJpZE93bmVyBQZjYWxsZXIEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAQKYmlkRGF0YUtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQhiaWRPd25lcgIBXwUFYmlkSWQEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAdhc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAABAliaWRTdGF0dXMCCENBTkNFTEVECQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIFCmJpZERhdGFLZXkCAV8FCWJpZFN0YXR1cwkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBlAgUGYmlkTmJyAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFDXJldHVybk1vbmV5VG8JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEFB2Fzc2V0SWQFA25pbAECdHgBCHZlcmlmaWVyAAQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwANAwMDCQAAAggFA2ludghmdW5jdGlvbgINdXBkYXRlQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAwDAwMJAAACCAUDaW52CGZ1bmN0aW9uAgtzZWxsQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAUJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXnUd3pP", "height": 2412785, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DhPV23pWXM8vnz9PnysqScoETuxGN33m2zMmZbPEsujm Next: CxATTQkJGwMW5NJnMhwXzm2Kowba6fCNhY2U4qbNpbhx Diff:
OldNewDifferences
854854 @Verifier(tx)
855855 func verifier () = match tx {
856856 case inv: InvokeScriptTransaction =>
857- if (if ((inv.function == "addArtwork"))
857+ if (if (if ((inv.function == "addArtwork"))
858858 then (inv.dApp == this)
859859 else false)
860+ then (inv.fee == 500000)
861+ else false)
860862 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
861- else if (if ((inv.function == "updateArtwork"))
863+ else if (if (if ((inv.function == "updateArtwork"))
862864 then (inv.dApp == this)
863865 else false)
866+ then (inv.fee == 500000)
867+ else false)
864868 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
865- else if (if ((inv.function == "sellArtwork"))
869+ else if (if (if ((inv.function == "sellArtwork"))
866870 then (inv.dApp == this)
871+ else false)
872+ then (inv.fee == 500000)
867873 else false)
868874 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
869875 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "1.1.10"
55
66 func getStringByKey (key) = valueOrElse(getString(this, key), "")
77
88
99 let unitTest = false
1010
1111 let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1212
1313 let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1414
1515 let feeReceiver = getStringByKey("conf_fee_receiver")
1616
1717 let userDapp = if (unitTest)
1818 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1919 else value(addressFromString(getStringByKey("conf_users_dapp")))
2020
2121 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2222
2323 let signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
2424
2525 let usdnAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDN"))
2626
2727 let usdtAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT"))
2828
2929 let wavesAssetId = base58''
3030
3131 let chris = getStringByKey("conf_admin_1")
3232
3333 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
3434
3535
3636 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
3737
3838
3939 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
4040
4141
4242 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
4343
4444
4545 let signCut = 7
4646
4747 let usdnWaveCut = 10
4848
4949 let defaultLicence = getStringByKey("conf_default_licence")
5050
5151 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
5252
5353 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
5454
5555 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
5656
5757 let userSuspended = "SUSPENDED"
5858
5959 let userRemoved = "REMOVED"
6060
6161 let userUnregistered = "UNREGISTERED"
6262
6363 let userAllowed = "ALLOWED"
6464
6565 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
6666
6767 func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
6868
6969
7070 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
7171 case a: String =>
7272 if (contains(a, sha256Hash))
7373 then true
7474 else false
7575 case _ =>
7676 false
7777 }
7878
7979
8080 func validateCID (cid) = if (contains(cid, "/"))
8181 then if (if ((76 > size(cid)))
8282 then (size(split(cid, "/")[0]) == 59)
8383 else false)
8484 then (16 > size(split(cid, "/")[1]))
8585 else false
8686 else false
8787
8888
8989 func validateHash (hash) = (size(hash) == 64)
9090
9191
9292 func keyUserStatus (caller) = ("user_status_" + caller)
9393
9494
9595 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9696
9797
9898 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9999
100100
101101 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
102102
103103
104104 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
105105
106106
107107 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
108108
109109
110110 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
111111
112112
113113 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
114114
115115
116116 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
117117
118118
119119 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
120120
121121
122122 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
123123
124124
125125 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
126126
127127
128128 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
129129
130130
131131 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
132132
133133
134134 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
135135
136136
137137 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
138138
139139
140140 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
141141
142142
143143 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
144144
145145
146146 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
147147
148148
149149 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
150150
151151
152152 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
153153
154154
155155 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
156156
157157
158158 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
159159
160160
161161 func keyPrimaryShare (artistAddr) = ("artist_agent_primary_" + artistAddr)
162162
163163
164164 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
165165
166166
167167 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
168168
169169
170170 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
171171
172172
173173 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
174174
175175
176176 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
177177 then throw("Wrong Display CID")
178178 else if (!(validateCID(cidExport)))
179179 then throw("Wrong Export CID")
180180 else if (if ((cidLicence != ""))
181181 then !(validateCID(cidLicence))
182182 else false)
183183 then throw("Wrong Licence CID")
184184 else true
185185
186186
187187 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
188188 then throw("Export Hash 64 char. max")
189189 else if (!(validateHash(sha256Licence)))
190190 then throw("Licence Hash 64 char. max")
191191 else true
192192
193193
194194 func validateString (str,max) = if ((size(str) == 0))
195195 then throw("Field cannot be is empty")
196196 else if ((size(str) > max))
197197 then throw((str + " is too long"))
198198 else true
199199
200200
201201 func validateUser (caller) = {
202202 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
203203 if (if ((userStatus == userUnregistered))
204204 then true
205205 else (userStatus == userAllowed))
206206 then "Register this account first with \"Account\" tab"
207207 else if ((userStatus == userSuspended))
208208 then "Account suspended"
209209 else if ((userStatus == userRemoved))
210210 then "Account removed"
211211 else ""
212212 }
213213
214214
215215 func setLIcence (cidLicence,sha256Licence) = {
216216 let cid = if ((size(cidLicence) == 0))
217217 then defaultLicence
218218 else cidLicence
219219 let hash = if ((size(sha256Licence) == 0))
220220 then defaultHashLicence
221221 else sha256Licence
222222 $Tuple2(cid, hash)
223223 }
224224
225225
226226 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
227227 let checkUser = validateUser(caller)
228228 if ((checkUser != ""))
229229 then throw(checkUser)
230230 else if ((size(cidDisplay) == 0))
231231 then throw("Display CID cannot be empty")
232232 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
233233 then throw("Problem with CID")
234234 else if (!(validateAllHash(sha256Export, licenceHash)))
235235 then throw("Problem with Hashes")
236236 else if (!(validateString(name, 100)))
237237 then throw("100 Char. max name")
238238 else if (!(validateString(description, 1000)))
239239 then throw("1000 Char. max description")
240240 else if (if ((0 > royalties))
241241 then true
242242 else (royalties > 1000))
243243 then throw("Royalties cannot be less than 0% or higher than 10%")
244244 else if ((size(split(tags, ",")) > 5))
245245 then throw("5 tags max.")
246246 else ""
247247 }
248248
249249
250250 func isPayment (i) = if ((size(i.payments) == 0))
251251 then throw("No payment attached")
252252 else {
253253 let payment = value(i.payments[0])
254254 let amount = value(payment.amount)
255255 $Tuple2(payment, amount)
256256 }
257257
258258
259259 func validatePayment (i) = {
260260 let $t089078943 = isPayment(i)
261261 let payment = $t089078943._1
262262 let amount = $t089078943._2
263263 let assetId = if (if (isDefined(payment.assetId))
264264 then (payment.assetId == signAssetId)
265265 else false)
266266 then payment.assetId
267267 else throw("Only SIGN token accepted as transaction fee")
268268 if ((amount != currentCertificationPrice))
269269 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
270270 else $Tuple2(amount, assetId)
271271 }
272272
273273
274274 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
275275 case b: Int =>
276276 if ((b != 0))
277277 then true
278278 else false
279279 case _ =>
280280 false
281281 }
282282
283283
284284 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
285285 let $t095319567 = isPayment(i)
286286 let payment = $t095319567._1
287287 let amount = $t095319567._2
288288 let assetId = if (!(isDefined(payment.assetId)))
289289 then unit
290290 else if (if ((size(priceAssetId) > 0))
291291 then (toBase58String(value(payment.assetId)) == priceAssetId)
292292 else false)
293293 then payment.assetId
294294 else throw("Wrong asset id")
295295 if (if ((assetId == unit))
296296 then (priceAssetId != "")
297297 else false)
298298 then throw("Wrong asset id")
299299 else if ((artworkPrice != amount))
300300 then throw("Payment don't match")
301301 else $Tuple2(amount, assetId)
302302 }
303303
304304
305305 func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
306306 then (assetId != toBase58String(wavesAssetId))
307307 else false)
308308 then (assetId != "WAVES")
309309 else false)
310310 then (assetId != toBase58String(usdnAssetId))
311311 else false)
312312 then (assetId != toBase58String(usdtAssetId))
313313 else false)
314314 then throw("Only SIGN, USDN,USDT or WAVES accepted")
315315 else true
316316
317317
318318 func validateMinSell (assetId,price) = {
319319 let minSellWaves = if (unitTest)
320320 then 10
321321 else getIntegerByKeyFromOracle("waves_min_sell")
322322 let minSellUsdn = 1000000
323323 let minSellSign = if (unitTest)
324324 then 1
325325 else (currentCertificationPrice * 2)
326326 if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
327327 then (minSellUsdn > price)
328328 else false)
329329 then (price != 0)
330330 else false)
331331 then true
332332 else if (if ((assetId == toBase58String(usdtAssetId)))
333333 then (minSellUsdn > price)
334334 else false)
335335 then (price != 0)
336336 else false)
337337 then true
338338 else if (if ((assetId == toBase58String(signAssetId)))
339339 then (minSellSign > price)
340340 else false)
341341 then (price != 0)
342342 else false)
343343 then true
344344 else if (if (if ((assetId == toBase58String(wavesAssetId)))
345345 then true
346346 else (assetId == "WAVES"))
347347 then (minSellWaves > price)
348348 else false)
349349 then (price != 0)
350350 else false)
351351 then throw("Wrong minimum sell price")
352352 else true
353353 }
354354
355355
356356 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
357357 then unit
358358 else fromBase58String(assetId)
359359
360360
361361 func getPriceAssetIdFromBid (bidDataKey) = {
362362 let bidData = getStringByKey((bidDataKey + "_OPEN"))
363363 if ((bidData == ""))
364364 then throw("Bid not found")
365365 else {
366366 let bidDataArr = split(bidData, "_")
367367 let bidAmount = parseIntValue(bidDataArr[1])
368368 let bidAssetId = getBidAssetId(bidDataArr[0])
369369 if ((0 >= bidAmount))
370370 then throw("Wrong amount")
371371 else $Tuple2(bidAmount, bidAssetId)
372372 }
373373 }
374374
375375
376376 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
377377 then throw(maintenanceMSG)
378378 else {
379379 let isSponsored = valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
380380 let caller = if (if (if ((toBase58String(i.caller.bytes) == toString(this)))
381381 then (size(i.payments) == 0)
382382 else false)
383383 then (isSponsored > 0)
384384 else false)
385385 then toString(addressFromPublicKey(fromBase58String(pubKey)))
386386 else toBase58String(i.caller.bytes)
387387 let get_sponsored_waves = if ((pubKey != ""))
388388 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
389389 else unit
390390 if ((get_sponsored_waves == get_sponsored_waves))
391391 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
392392 else throw("Strict value is not equal to itself.")
393393 }
394394
395395
396396 func idCallerDate (i) = if (!(dappRunning))
397397 then throw(maintenanceMSG)
398398 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
399399
400400
401401 func buyMint (i,artId,issuer,bidId,bidOwner) = {
402402 let $t01291912978 = idCallerDate(i)
403403 let id = $t01291912978._1
404404 let caller = $t01291912978._2
405405 let date = $t01291912978._3
406406 let isBid = if (if (if ((caller == issuer))
407407 then (bidOwner != "")
408408 else false)
409409 then (bidId != "")
410410 else false)
411411 then true
412412 else false
413413 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
414414 if (if (if ((blockEnd != 0))
415415 then (height >= blockEnd)
416416 else false)
417417 then !(isBid)
418418 else false)
419419 then throw("Sale ended.")
420420 else {
421421 let callerIsIssuer = (caller == issuer)
422422 let totalNFT = getIntegerByKey("total_nft_issued")
423423 let signID = getStringByKey(keySignID(issuer, artId))
424424 let artworkName = getStringByKey(keyName(issuer, artId))
425425 if ((artworkName == ""))
426426 then throw("Art doesn't exist")
427427 else {
428428 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
429429 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
430430 let artworkPrice = if (callerIsIssuer)
431431 then (currentCertificationPrice * 2)
432432 else getIntegerByKey(keyPrice(issuer, artId))
433433 let priceAssetId = if (callerIsIssuer)
434434 then toBase58String(signAssetId)
435435 else getStringByKey(keyAssetIdAccepted(issuer, artId))
436436 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
437437 if (if (if (!(isBid))
438438 then !(callerIsIssuer)
439439 else false)
440440 then if (if ((0 >= artworkPrice))
441441 then true
442442 else !(isOnSale))
443443 then true
444444 else (0 >= maxCanSell)
445445 else false)
446446 then throw("Art not for sale")
447447 else if (if (if (!(isBid))
448448 then callerIsIssuer
449449 else false)
450450 then (0 >= maxCanSell)
451451 else false)
452452 then throw("Max issuable not set")
453453 else {
454454 let checkUser = validateUser(issuer)
455455 if (if (isBid)
456456 then (checkUser != "")
457457 else false)
458458 then throw(checkUser)
459459 else {
460460 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
461461 let $t01468114848 = if (isBid)
462462 then getPriceAssetIdFromBid(bidDataKey)
463463 else validatePriceAssetId(i, priceAssetId, artworkPrice)
464464 let amount = $t01468114848._1
465465 let assetId = $t01468114848._2
466466 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
467467 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
468468 let isWhitelisted = checkWhitelist(issuer)
469469 let cut = if ((isWhitelisted > height))
470470 then 0
471471 else if ((assetId == signAssetId))
472472 then signCut
473473 else usdnWaveCut
474474 let amountForSign = fraction(amount, cut, 100)
475475 let amountForAgent = if (if (if ((agent != feeReceiver))
476476 then (agentShare > 0)
477477 else false)
478478 then (height > isWhitelisted)
479479 else false)
480480 then fraction(amount, agentShare, 100)
481481 else 0
482482 let amountForCreator = (amount - amountForSign)
483483 if ((amountSold == maxCanSell))
484484 then throw("Art sold out")
485485 else {
486486 let newAmountSold = (amountSold + 1)
487487 let issueMeta = ((((((((((("Creator: " + issuer) + ",
488488 ArtID: ") + artId) + ",
489489 SignID: ") + signID) + ",
490490 Artwork name: ") + artworkName) + ",
491491 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
492492 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
493493 let idNFT = calculateAssetId(issueNFT)
494494 let sellStatus = if (if ((newAmountSold == maxCanSell))
495495 then true
496496 else !(isOnSale))
497497 then false
498498 else true
499499 let receiveNFT = if (if (if ((caller == issuer))
500500 then (bidOwner != "")
501501 else false)
502502 then (bidId != "")
503503 else false)
504504 then addressFromStringValue(bidOwner)
505505 else i.caller
506506 let assetIdBid = if (!(isDefined(assetId)))
507507 then "WAVES"
508508 else toBase58String(value(assetId))
509509 let bidData = getStringByKey((bidDataKey + "_OPEN"))
510510 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
511511 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
512512 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
513513 let soldValue = if (!(isBid))
514514 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
515515 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
516516 let soldData = StringEntry(soldKey, soldValue)
517517 let commissions = if ((amountForAgent != 0))
518518 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
519519 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
520520 let buyRes = ([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissions)
521521 if (isBid)
522522 then [soldData, bidUpdate, bidDelOld] :: buyRes
523523 else soldData :: buyRes
524524 }
525525 }
526526 }
527527 }
528528 }
529529 }
530530
531531
532532 func asString (bv) = match bv {
533533 case bv0: String =>
534534 bv0
535535 case _ =>
536536 throw("Sponsored Public Key String expected")
537537 }
538538
539539
540540 @Callable(invoke)
541541 func setConf (key,val) = {
542542 let caller = toString(invoke.caller)
543543 if (containsElement([chris, toString(this)], caller))
544544 then if (contains(key, "conf_"))
545545 then [StringEntry(key, val)]
546546 else throw("Entries starting with conf_ only")
547547 else throw("You are not allowed to change this")
548548 }
549549
550550
551551
552552 @Callable(i)
553553 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
554554 let $t01888118954 = idCallerDateSponsored(i, pubKey)
555555 let artId = $t01888118954._1
556556 let caller = $t01888118954._2
557557 let date = $t01888118954._3
558558 let isSponsored = $t01888118954._4
559559 if (!(validateHash(sha256Hash)))
560560 then throw("Hash should be 64 characters maximum")
561561 else {
562562 let $t01905519124 = setLIcence(cidLicence, sha256Licence)
563563 let licenceCID = $t01905519124._1
564564 let licenceHash = $t01905519124._2
565565 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
566566 if ((validateArtwork != ""))
567567 then throw("Something went wrong!")
568568 else {
569569 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
570570 let $t01942319507 = if (whitelisted_drop)
571571 then $Tuple2(0, signID)
572572 else validatePayment(i)
573573 let amount = $t01942319507._1
574574 let assetId = $t01942319507._2
575575 if (!(isDefined(amount)))
576576 then throw("Something went wrong")
577577 else {
578578 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
579579 if ((entryExist != ""))
580580 then throw("You already added it")
581581 else {
582582 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
583583 if ((hashExist != ""))
584584 then throw("Hash already registered")
585585 else {
586586 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
587587 if (!(isSignCertified))
588588 then throw("Sign Certificate not found for this address.")
589589 else {
590590 let decrease_whitelist_drop = if (whitelisted_drop)
591591 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
592592 else unit
593593 if ((decrease_whitelist_drop == decrease_whitelist_drop))
594594 then {
595595 let txToCaller = if (isSponsored)
596596 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
597597 else nil
598598 ([StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyCrawler(caller, artId), crawler), IntegerEntry(keyRoyalties(caller, artId), royalties), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, signAssetId)] ++ txToCaller)
599599 }
600600 else throw("Strict value is not equal to itself.")
601601 }
602602 }
603603 }
604604 }
605605 }
606606 }
607607 }
608608
609609
610610
611611 @Callable(i)
612612 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
613613 then throw(maintenanceMSG)
614614 else {
615615 let $t02254122611 = idCallerDateSponsored(i, pubKey)
616616 let id = $t02254122611._1
617617 let caller = $t02254122611._2
618618 let date = $t02254122611._3
619619 let isSponsored = $t02254122611._4
620620 let $t02262122690 = setLIcence(cidLicence, sha256Licence)
621621 let licenceCID = $t02262122690._1
622622 let licenceHash = $t02262122690._2
623623 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
624624 if ((validateArtwork != ""))
625625 then throw("Something went wrong!")
626626 else {
627627 let entryExist = getStringByKey(keyName(caller, txid))
628628 if ((entryExist == ""))
629629 then throw("Entry not found")
630630 else {
631631 let flag = getStringByKey(keyFlag(caller, txid))
632632 if ((flag == "ILLEGAL"))
633633 then throw("Cannot update ILLEGAL artwork")
634634 else if (!(isArtMinted(caller, txid)))
635635 then {
636636 let txToCaller = if (isSponsored)
637637 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
638638 else nil
639639 ([StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type), StringEntry(keyCrawler(caller, txid), crawler), IntegerEntry(keyRoyalties(caller, txid), royalties)] ++ txToCaller)
640640 }
641641 else throw("Already minted")
642642 }
643643 }
644644 }
645645
646646
647647
648648 @Callable(i)
649649 func flagArtwork (artId,addr,flag,note) = {
650650 let $t02431724351 = idCallerDate(i)
651651 let id = $t02431724351._1
652652 let caller = $t02431724351._2
653653 if (containsElement([chris, toString(this)], caller))
654654 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
655655 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
656656 else throw(("Unknow status " + flag))
657657 else throw("You are not allowed")
658658 }
659659
660660
661661
662662 @Callable(i)
663663 func deleteArtwork (artId,addr) = {
664664 let $t02478724821 = idCallerDate(i)
665665 let id = $t02478724821._1
666666 let caller = $t02478724821._2
667667 let addrToUse = if (containsElement([chris, toString(this)], caller))
668668 then addr
669669 else caller
670670 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
671671 if ((entryExist == ""))
672672 then throw("No art matching for this address")
673673 else {
674674 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
675675 if ((sha256Hash == ""))
676676 then throw("No art hash matching for this address")
677677 else {
678678 let signID = getStringByKey(keySignID(addrToUse, artId))
679679 if ((signID == ""))
680680 then throw("No SIGN ID matching")
681681 else {
682682 let dataToDelete = [DeleteEntry(keyDate(addrToUse, artId)), DeleteEntry(keyName(addrToUse, artId)), DeleteEntry(keyDesc(addrToUse, artId)), DeleteEntry(keyDisplayCid(addrToUse, artId)), DeleteEntry(keyExportCid(addrToUse, artId)), DeleteEntry(keyExportHash(addrToUse, artId)), DeleteEntry(keyLicenceHash(addrToUse, artId)), DeleteEntry(keyLicenceCid(addrToUse, artId)), DeleteEntry(keyType(addrToUse, artId)), DeleteEntry(keyTags(addrToUse, artId)), DeleteEntry(keyMaxMint(addrToUse, artId)), DeleteEntry(keySignID(addrToUse, artId)), DeleteEntry(keyIssued(addrToUse, artId)), DeleteEntry(keyOnSale(addrToUse, artId)), DeleteEntry(keyFlag(addrToUse, artId)), DeleteEntry(keyPrice(addrToUse, artId)), DeleteEntry(keyAssetIdAccepted(addrToUse, artId)), DeleteEntry(keyOwnerByHash(sha256Hash)), DeleteEntry(keyidBySignid(addrToUse, signID)), DeleteEntry(keyTxidByHashOwner(sha256Hash, addrToUse)), DeleteEntry(keyEndSale(addrToUse, artId)), DeleteEntry(keyNote(addrToUse, artId)), DeleteEntry(keyCrawler(addrToUse, artId)), DeleteEntry(keyRoyalties(addrToUse, artId))]
683683 if (!(isArtMinted(addrToUse, artId)))
684684 then if (!(dappRunning))
685685 then throw(maintenanceMSG)
686686 else dataToDelete
687687 else if (containsElement([chris, toString(this)], caller))
688688 then dataToDelete
689689 else throw("Art already minted, you cannot delete it")
690690 }
691691 }
692692 }
693693 }
694694
695695
696696
697697 @Callable(i)
698698 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
699699 let $t02765727727 = idCallerDateSponsored(i, pubKey)
700700 let id = $t02765727727._1
701701 let caller = $t02765727727._2
702702 let date = $t02765727727._3
703703 let isSponsored = $t02765727727._4
704704 let artworkName = getStringByKey(keyName(caller, artId))
705705 if ((artworkName == ""))
706706 then throw("This art doesn't match your account")
707707 else {
708708 let flag = getStringByKey(keyFlag(caller, artId))
709709 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
710710 then throw("Flagged artwork")
711711 else {
712712 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
713713 if ((0 > blockEnd))
714714 then throw("Negative end")
715715 else if (if ((blockEnd > 0))
716716 then if ((maxMint != 1))
717717 then true
718718 else (price != 0)
719719 else false)
720720 then throw("Timed offer only allowed for unique edition and offer only")
721721 else {
722722 let baseHeight = if ((blockEnd == 0))
723723 then 0
724724 else height
725725 if (!(acceptedAssetIds(assetId)))
726726 then throw("Something went wrong!")
727727 else if (!(validateMinSell(assetId, price)))
728728 then throw("Something went wrong!")
729729 else {
730730 let checkUser = validateUser(caller)
731731 if ((checkUser != ""))
732732 then throw(checkUser)
733733 else {
734734 let amountSold = getIntegerByKey(keyIssued(caller, artId))
735735 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
736736 if ((maxMint > 100))
737737 then throw("100 editions max per artwork")
738738 else if (if ((amountSold != 0))
739739 then (amountSold == maxCanSell)
740740 else false)
741741 then throw("Max edition reached.")
742742 else if (if ((amountSold > 0))
743743 then (maxCanSell != maxMint)
744744 else false)
745745 then throw("Cannot change maximum issuable anymore")
746746 else if (if ((bidNbr > 0))
747747 then (maxCanSell != maxMint)
748748 else false)
749749 then throw("Cannot change maximum issuable with active orders")
750750 else {
751751 let sellStatus = if (if ((price > 0))
752752 then (maxMint > 0)
753753 else false)
754754 then true
755755 else false
756756 let txToCaller = if (isSponsored)
757757 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
758758 else nil
759759 ([BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId), IntegerEntry(keyEndSale(caller, artId), (baseHeight + blockEnd))] ++ txToCaller)
760760 }
761761 }
762762 }
763763 }
764764 }
765765 }
766766 }
767767
768768
769769
770770 @Callable(i)
771771 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
772772
773773
774774
775775 @Callable(i)
776776 func setBid (artId,issuer) = {
777777 let $t03010530145 = idCallerDate(i)
778778 let id = $t03010530145._1
779779 let caller = $t03010530145._2
780780 let date = $t03010530145._3
781781 let $t03015030186 = isPayment(i)
782782 let payment = $t03015030186._1
783783 let amount = $t03015030186._2
784784 let assetId = if (!(isDefined(payment.assetId)))
785785 then "WAVES"
786786 else toBase58String(value(payment.assetId))
787787 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
788788 if (if ((blockEnd != 0))
789789 then (height >= blockEnd)
790790 else false)
791791 then throw("Sale ended.")
792792 else {
793793 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
794794 if (!(acceptedAssetIds(assetId)))
795795 then throw("asset not accepted")
796796 else if (!(validateMinSell(assetId, amount)))
797797 then throw("Wrong min sell")
798798 else {
799799 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
800800 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
801801 if ((0 >= maxCanSell))
802802 then throw("No max edition set for this artwork")
803803 else if ((amountSold >= maxCanSell))
804804 then throw("Sold out, you cannot bid")
805805 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
806806 }
807807 }
808808 }
809809
810810
811811
812812 @Callable(i)
813813 func acceptBid (artId,issuer,bidId,bidOwner) = {
814814 let $t03134431384 = idCallerDate(i)
815815 let id = $t03134431384._1
816816 let caller = $t03134431384._2
817817 let date = $t03134431384._3
818818 if ((caller != issuer))
819819 then throw("You cannot do this action")
820820 else buyMint(i, artId, issuer, bidId, bidOwner)
821821 }
822822
823823
824824
825825 @Callable(i)
826826 func cancelBid (artId,issuer,bidId,bidOwner) = {
827827 let $t03161031671 = idCallerDate(i)
828828 let id = $t03161031671._1
829829 let caller = $t03161031671._2
830830 let date = $t03161031671._3
831831 if (if ((caller != bidOwner))
832832 then (caller != issuer)
833833 else false)
834834 then throw("You cannot do this action")
835835 else {
836836 let returnMoneyTo = if ((caller == issuer))
837837 then bidOwner
838838 else caller
839839 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
840840 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
841841 let bidData = getStringByKey((bidDataKey + "_OPEN"))
842842 if ((bidData == ""))
843843 then throw("Bid not found")
844844 else {
845845 let bidDataArr = split(bidData, "_")
846846 let assetId = getBidAssetId(bidDataArr[0])
847847 let bidStatus = "CANCELED"
848848 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
849849 }
850850 }
851851 }
852852
853853
854854 @Verifier(tx)
855855 func verifier () = match tx {
856856 case inv: InvokeScriptTransaction =>
857- if (if ((inv.function == "addArtwork"))
857+ if (if (if ((inv.function == "addArtwork"))
858858 then (inv.dApp == this)
859859 else false)
860+ then (inv.fee == 500000)
861+ else false)
860862 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
861- else if (if ((inv.function == "updateArtwork"))
863+ else if (if (if ((inv.function == "updateArtwork"))
862864 then (inv.dApp == this)
863865 else false)
866+ then (inv.fee == 500000)
867+ else false)
864868 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
865- else if (if ((inv.function == "sellArtwork"))
869+ else if (if (if ((inv.function == "sellArtwork"))
866870 then (inv.dApp == this)
871+ else false)
872+ then (inv.fee == 500000)
867873 else false)
868874 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
869875 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
870876 case _ =>
871877 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
872878 }
873879

github/deemru/w8io/873ac7e 
85.97 ms