tx · BTj7h45K9FXppD4mCBQtQb4exvYv6cbp6jzd8eh26ecS

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02600000 Waves

2023.10.10 07:31 [2792054] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "BTj7h45K9FXppD4mCBQtQb4exvYv6cbp6jzd8eh26ecS", "fee": 2600000, "feeAssetId": null, "timestamp": 1696912300200, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "7C2idLo8DwUdDaBayAkNozY2Yu2UwziKesPe6GWSocwgzjgYKPUSPBYq6hj4Riq9fiotc4rKaDZ8DUkEcGrSZzE" ], "script": "base64:BgJeCAISBAoCCAgSDgoMCAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICFsAB1ZFUlNJT04CBTIuMC4wAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAAh1bml0VGVzdAcACW9yYWNsZUZlZQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX29yYWNsZV9mZWUACHNpZ25EYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfc2lnbndlYl9kYXBwAAtmZWVSZWNlaXZlcgkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9mZWVfcmVjZWl2ZXIACHVzZXJEYXBwAwUIdW5pdFRlc3QJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl91c2Vyc19kYXBwAA13aGl0ZWxpc3REYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECE2NvbmZfd2hpdGVsaXN0X2RhcHAAD3B1enpsZV9hcnRfcG9vbAkBDmdldFN0cmluZ0J5S2V5AQIUY29uZl9wdXp6bGVfYXJ0X3Bvb2wAEXVzZHRQUEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhtjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRFRfUFAADmFydEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhdjb25mX2FjY2VwdGVkX2Fzc2V0X0FSVAARdXNkY1BQQXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECG2NvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEQ19QUAAPZWFzdEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X0VBU1QAEXB1enpsZUFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhpjb25mX2FjY2VwdGVkX2Fzc2V0X1BVWlpMRQAQZXRoUFBBc3NldElkX3N0cgkBDmdldFN0cmluZ0J5S2V5AQIaY29uZl9hY2NlcHRlZF9hc3NldF9FVEhfUFAAEHdhdmVzQXNzZXRJZF9zdHICBVdBVkVTAA11c2R0UFBBc3NldElkCQDZBAEFEXVzZHRQUEFzc2V0SWRfc3RyAAphcnRBc3NldElkCQDZBAEFDmFydEFzc2V0SWRfc3RyAA11c2RjUFBBc3NldElkCQDZBAEFEXVzZGNQUEFzc2V0SWRfc3RyAAtlYXN0QXNzZXRJZAkA2QQBBQ9lYXN0QXNzZXRJZF9zdHIADXB1enpsZUFzc2V0SWQJANkEAQURcHV6emxlQXNzZXRJZF9zdHIADGV0aFBQQXNzZXRJZAkA2QQBBRBldGhQUEFzc2V0SWRfc3RyAAx3YXZlc0Fzc2V0SWQBAAATYWxsX2FjY2VwdGVkX2Fzc2V0cwkAzAgCBRF1c2R0UFBBc3NldElkX3N0cgkAzAgCBQ5hcnRBc3NldElkX3N0cgkAzAgCBRF1c2RjUFBBc3NldElkX3N0cgkAzAgCBQ9lYXN0QXNzZXRJZF9zdHIJAMwIAgURcHV6emxlQXNzZXRJZF9zdHIJAMwIAgUQd2F2ZXNBc3NldElkX3N0cgkAzAgCBRBldGhQUEFzc2V0SWRfc3RyBQNuaWwABWNocmlzCQEOZ2V0U3RyaW5nQnlLZXkBAgxjb25mX2FkbWluXzEBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCW9yYWNsZUZlZQUDa2V5Ah9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlAQ9nZXRJbnRlZ2VyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEOY2hlY2tXaGl0ZWxpc3QBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ13aGl0ZWxpc3REYXBwBQNrZXkAAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwAOY29tbWlzc2lvbl9mZWUACAAOZGVmYXVsdExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECFGNvbmZfZGVmYXVsdF9saWNlbmNlABJkZWZhdWx0SGFzaExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECGWNvbmZfZGVmYXVsdF9saWNlbmNlX2hhc2gAC2RhcHBSdW5uaW5nCQELdmFsdWVPckVsc2UCCQCbCAIFCHVzZXJEYXBwAhRjb25mX2RhcHBfaXNfcnVubmluZwYADm1haW50ZW5hbmNlTVNHCQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwAhRjb25mX21haW50ZW5hbmNlX21zZwIAAA11c2VyU3VzcGVuZGVkAglTVVNQRU5ERUQAC3VzZXJSZW1vdmVkAgdSRU1PVkVEABB1c2VyVW5yZWdpc3RlcmVkAgxVTlJFR0lTVEVSRUQAC3VzZXJBbGxvd2VkAgdBTExPV0VEABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEFCmFydEFzc2V0SWQACG1pbnRfZmVlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgIJbWludF9mZWVfCQDYBAEFCmFydEFzc2V0SWQBE2dldEFydHdvcmtSb3lhbHRpZXMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkA6AcBC3ZhbGlkYXRlQ0lEAQNjaWQDCQEIY29udGFpbnMCBQNjaWQCAS8DAwkAZgIATAkAsQIBBQNjaWQJAAACCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAAA7BwkAZgIAEAkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAEHBwEMdmFsaWRhdGVIYXNoAQRoYXNoCQAAAgkAsQIBBQRoYXNoAEABDWtleVVzZXJTdGF0dXMBBmNhbGxlcgkArAICAgx1c2VyX3N0YXR1c18FBmNhbGxlcgEHa2V5RGF0ZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGF0ZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5hbWUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25hbWVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlEZXNjAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kZXNjXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RGlzcGxheUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZGlzcGxheV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlFeHBvcnRIYXNoAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9leHBvcnRfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDGtleUV4cG9ydENpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBCmtleU1heE1pbnQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlTaWduSUQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X3NpZ25pZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleUlzc3VlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfaXNzdWVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5T25TYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyAQ5rZXlMaWNlbmNlSGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhFhcnRfbGljZW5jZV9oYXNoXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5TGljZW5jZUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUYWdzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90YWdzXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VHlwZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdHlwZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5vdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlDcmF3bGVyAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9jcmF3bGVyX2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDGtleVJveWFsdGllcwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUFYXJ0SWQCAV8FBmNhbGxlcgEIa2V5UHJpY2UCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5RW5kU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfZW5kc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBEmtleUFzc2V0SWRBY2NlcHRlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FBWFydElkAgFfBQZjYWxsZXIBB2tleUZsYWcCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2ZsYWdfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBcnRpc3RBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgINYXJ0aXN0X2FnZW50XwUKYXJ0aXN0QWRkcgEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQphcnRpc3RBZGRyARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgIUYXJ0aXN0X3B1YmxpY19hZ2VudF8FCmFydGlzdEFkZHIBGmtleVByaW1hcnlTaGFyZVB1YmxpY0FnZW50AQphcnRpc3RBZGRyCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBEWtleUhhc2hCeVR4aWRBZGRyAgZjYWxsZXIEdHhpZAkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUEdHhpZAIBXwUGY2FsbGVyAQ5rZXlPd25lckJ5SGFzaAEKc2hhMjU2SGFzaAkArAICAhJnZXRfb3duZXJfYnlfaGFzaF8FCnNoYTI1Nkhhc2gBDWtleWlkQnlTaWduaWQCBmNhbGxlcgZzaWduSWQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUGc2lnbklkAgFfBQZjYWxsZXIBDnZhbGlkYXRlQWxsQ0lEAwpjaWREaXNwbGF5CWNpZEV4cG9ydApjaWRMaWNlbmNlAwkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWREaXNwbGF5CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCWNpZEV4cG9ydAkAAgECEFdyb25nIEV4cG9ydCBDSUQDAwkBAiE9AgUKY2lkTGljZW5jZQIACQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZExpY2VuY2UHCQACAQIRV3JvbmcgTGljZW5jZSBDSUQGAQ92YWxpZGF0ZUFsbEhhc2gCDHNoYTI1NkV4cG9ydA1zaGEyNTZMaWNlbmNlAwkBASEBCQEMdmFsaWRhdGVIYXNoAQUMc2hhMjU2RXhwb3J0CQACAQIYRXhwb3J0IEhhc2ggNjQgY2hhci4gbWF4AwkBASEBCQEMdmFsaWRhdGVIYXNoAQUNc2hhMjU2TGljZW5jZQkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkBgkAAAIFCnVzZXJTdGF0dXMFC3VzZXJBbGxvd2VkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFCnVzZXJTdGF0dXMFC3VzZXJSZW1vdmVkAg9BY2NvdW50IHJlbW92ZWQCAAEKc2V0TEljZW5jZQIKY2lkTGljZW5jZQ1zaGEyNTZMaWNlbmNlBANjaWQDCQAAAgkAsQIBBQpjaWRMaWNlbmNlAAAFDmRlZmF1bHRMaWNlbmNlBQpjaWRMaWNlbmNlBARoYXNoAwkAAAIJALECAQUNc2hhMjU2TGljZW5jZQAABRJkZWZhdWx0SGFzaExpY2VuY2UFDXNoYTI1NkxpY2VuY2UJAJQKAgUDY2lkBQRoYXNoARN2YWxpZGF0ZUFydHdvcmtEYXRhCgZjYWxsZXIKY2lkRGlzcGxheQljaWRFeHBvcnQKbGljZW5jZUNJRAxzaGEyNTZFeHBvcnQLbGljZW5jZUhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCXJveWFsdGllcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEPdmFsaWRhdGVQYXltZW50AQFpBA0kdDAxMDE1NjEwMTkyCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwMTU2MTAxOTICXzEEBmFtb3VudAgFDSR0MDEwMTU2MTAxOTICXzIEB2Fzc2V0SWQDAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAACCAUHcGF5bWVudAdhc3NldElkBQphcnRBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECK09ubHkgU0lHTiB0b2tlbiBhY2NlcHRlZCBhcyB0cmFuc2FjdGlvbiBmZWUDCQECIT0CBQZhbW91bnQFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBA0kdDAxMDc3OTEwODE1CQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwNzc5MTA4MTUCXzEEBmFtb3VudAgFDSR0MDEwNzc5MTA4MTUCXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFDHByaWNlQXNzZXRJZAAACQAAAgkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBQxwcmljZUFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFB2Fzc2V0SWQFBHVuaXQJAQIhPQIFDHByaWNlQXNzZXRJZAIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBAhNQYXltZW50IGRvbid0IG1hdGNoCQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFE2FsbF9hY2NlcHRlZF9hc3NldHMFB2Fzc2V0SWQJAAIBAkBPbmx5ICRBUlQsIFVTRFQtUFAsIFVTREMtUFAsIEVBU1QsIFBVWlpMRSwgRVRIIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAQVwcmljZQMJAGcCAAAFBXByaWNlCQACAQIYV3JvbmcgbWluaW11bSBzZWxsIHByaWNlBgENZ2V0QmlkQXNzZXRJZAEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQpiaWREYXRhS2V5BAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQJYmlkQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBApiaWRBc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAAAwkAZwIAAAUJYmlkQW1vdW50CQACAQIMV3JvbmcgYW1vdW50CQCUCgIFCWJpZEFtb3VudAUKYmlkQXNzZXRJZAEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgFpBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQLaXNTcG9uc29yZWQDCQECIT0CBQZwdWJLZXkCAAkBC3ZhbHVlT3JFbHNlAgkBDmNoZWNrV2hpdGVsaXN0AQkArAICCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkCCV9mcmVlX3R4cwAAAAAEBmNhbGxlcgMDCQAAAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQClCAEFBHRoaXMJAGYCBQtpc1Nwb25zb3JlZAAABwkApQgBCQCnCAEJANkEAQUGcHViS2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEE2dldF9zcG9uc29yZWRfd2F2ZXMDAwkBAiE9AgUGcHViS2V5AgAJAGYCBQtpc1Nwb25zb3JlZAAABwkA/AcEBQ13aGl0ZWxpc3REYXBwAgl1c2VGcmVlVHgJAMwIAgkApQgBCQCnCAEJANkEAQUGcHViS2V5BQNuaWwFA25pbAUEdW5pdAMJAAACBRNnZXRfc3BvbnNvcmVkX3dhdmVzBRNnZXRfc3BvbnNvcmVkX3dhdmVzCQCWCgQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUGY2FsbGVyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAZgIFC2lzU3BvbnNvcmVkAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDGlkQ2FsbGVyRGF0ZQEBaQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwkAlQoDCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwgFCWxhc3RCbG9jawl0aW1lc3RhbXABCmdldEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQEHYnV5TWludAYBaQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIGcHViS2V5BA0kdDAxMzQyMDEzNTA5CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDEzNDIwMTM1MDkCXzEEBmNhbGxlcggFDSR0MDEzNDIwMTM1MDkCXzIEBGRhdGUIBQ0kdDAxMzQyMDEzNTA5Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDEzNDIwMTM1MDkCXzQEBWlzQmlkAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHAwMFBWlzQmlkCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIFBmNhbGxlcgUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyBQhtaW50X2ZlZQkBD2dldEludGVnZXJCeUtleQEJAQhrZXlQcmljZQIFBmlzc3VlcgUFYXJ0SWQEDHByaWNlQXNzZXRJZAMFDmNhbGxlcklzSXNzdWVyCQDYBAEFCmFydEFzc2V0SWQJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwMDCQEBIQEFBWlzQmlkCQEBIQEFDmNhbGxlcklzSXNzdWVyBwMDCQBnAgAABQxhcnR3b3JrUHJpY2UGCQEBIQEFCGlzT25TYWxlBgkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFBWlzQmlkBQ5jYWxsZXJJc0lzc3VlcgcJAGcCAAAFCm1heENhblNlbGwHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmlzc3VlcgMDBQVpc0JpZAkBAiE9AgUJY2hlY2tVc2VyAgAHCQACAQUJY2hlY2tVc2VyBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQNJHQwMTUwODYxNTI3OAMFBWlzQmlkCQEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEFCmJpZERhdGFLZXkJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAUMYXJ0d29ya1ByaWNlBAZhbW91bnQIBQ0kdDAxNTA4NjE1Mjc4Al8xBAdhc3NldElkCAUNJHQwMTUwODYxNTI3OAJfMgQFYWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARJrZXlBcnRpc3RBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBAphZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBBQZpc3N1ZXIAAAQLcHVibGljQWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBBBwdWJsaWNBZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEaa2V5UHJpbWFyeVNoYXJlUHVibGljQWdlbnQBBQZpc3N1ZXIAAAQNaXNXaGl0ZWxpc3RlZAkBDmNoZWNrV2hpdGVsaXN0AQUGaXNzdWVyBA1hbW91bnRGb3JTaWduCQBrAwUGYW1vdW50BQ5jb21taXNzaW9uX2ZlZQBkBA5hbW91bnRGb3JBZ2VudAMDAwkBAiE9AgUFYWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUKYWdlbnRTaGFyZQAABwkAZgIFBmhlaWdodAUNaXNXaGl0ZWxpc3RlZAcJAGsDBQZhbW91bnQFCmFnZW50U2hhcmUAkE4AAAQUYW1vdW50Rm9yUHVibGljQWdlbnQDAwMJAQIhPQIFC3B1YmxpY0FnZW50BQtmZWVSZWNlaXZlcgkAZgIFEHB1YmxpY0FnZW50U2hhcmUAAAcJAGYCBQZoZWlnaHQFDWlzV2hpdGVsaXN0ZWQHCQBrAwUGYW1vdW50BRBwdWJsaWNBZ2VudFNoYXJlAJBOAAAEEGFtb3VudEZvckNyZWF0b3IJAGUCBQZhbW91bnQFDWFtb3VudEZvclNpZ24DCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDEFydCBzb2xkIG91dAQNbmV3QW1vdW50U29sZAkAZAIFCmFtb3VudFNvbGQAAQQJaXNzdWVNZXRhCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglDcmVhdG9yOiAFBmlzc3VlcgIKLAogQXJ0SUQ6IAUFYXJ0SWQCESwKIEFydHdvcmsgbmFtZTogBQthcnR3b3JrTmFtZQIKLAogSXNzdWU6IAkApAMBBQ1uZXdBbW91bnRTb2xkAgEvCQCkAwEFCm1heENhblNlbGwECGlzc3VlTkZUCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQh0b3RhbE5GVAABBQlpc3N1ZU1ldGEAAQAABwQFaWRORlQJALgIAQUIaXNzdWVORlQECnNlbGxTdGF0dXMDAwkAAAIFDW5ld0Ftb3VudFNvbGQFCm1heENhblNlbGwGCQEBIQEFCGlzT25TYWxlBwYECnJlY2VpdmVORlQDAwMJAAACBQZjYWxsZXIFBmlzc3VlcgkBAiE9AgUIYmlkT3duZXICAAcJAQIhPQIFBWJpZElkAgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQhiaWRPd25lcggFAWkGY2FsbGVyBAphc3NldElkQmlkAwkBASEBCQEJaXNEZWZpbmVkAQUHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQUHYXNzZXRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgQJYmlkRGVsT2xkCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWRVcGRhdGUJAQtTdHJpbmdFbnRyeQIJAKwCAgUKYmlkRGF0YUtleQIHX0NMT1NFRAkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQQHc29sZEtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhcnRfc29sZF8JAKQDAQUNbmV3QW1vdW50U29sZAIEX29mXwkApAMBBQptYXhDYW5TZWxsAgFfBQVhcnRJZAIBXwUGaXNzdWVyBAlzb2xkVmFsdWUDCQEBIQEFBWlzQmlkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBmNhbGxlcgIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQxhcnR3b3JrUHJpY2UCAV8FDHByaWNlQXNzZXRJZAIBXwkA2AQBBQVpZE5GVAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEFCnJlY2VpdmVORlQCAV8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8JAKQDAQUGYW1vdW50AgFfBQphc3NldElkQmlkAgFfCQDYBAEFBWlkTkZUBAhzb2xkRGF0YQkBC1N0cmluZ0VudHJ5AgUHc29sZEtleQUJc29sZFZhbHVlBCJhbW91bnRfY29tbWlzc2lvbl9mb3Jfc2lnbl90b19zd2FwAwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50BQ1hbW91bnRGb3JTaWduBBFhbW91bnRfYXJ0X2JlZm9yZQkBCmdldEJhbGFuY2UBBQphcnRBc3NldElkAwkAAAIFEWFtb3VudF9hcnRfYmVmb3JlBRFhbW91bnRfYXJ0X2JlZm9yZQQPc3dhcF9mZWVfdG9fYXJ0AwkBAiE9AgUHYXNzZXRJZAUKYXJ0QXNzZXRJZAkA/AcECQEHQWRkcmVzcwEJANkEAQUPcHV6emxlX2FydF9wb29sAgRzd2FwCQDMCAIFDmFydEFzc2V0SWRfc3RyCQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBSJhbW91bnRfY29tbWlzc2lvbl9mb3Jfc2lnbl90b19zd2FwBQNuaWwFBHVuaXQDCQAAAgUPc3dhcF9mZWVfdG9fYXJ0BQ9zd2FwX2ZlZV90b19hcnQEEGFtb3VudF9hcnRfYWZ0ZXIJAQpnZXRCYWxhbmNlAQUKYXJ0QXNzZXRJZAMJAAACBRBhbW91bnRfYXJ0X2FmdGVyBRBhbW91bnRfYXJ0X2FmdGVyBBRjb21taXNzaW9uc1dpdGhBZ2VudAMJAQIhPQIFDmFtb3VudEZvckFnZW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyAwkAAAIFB2Fzc2V0SWQFCmFydEFzc2V0SWQJAGUCBQ1hbW91bnRGb3JTaWduBQ5hbW91bnRGb3JBZ2VudAkAZQIFEGFtb3VudF9hcnRfYWZ0ZXIFEWFtb3VudF9hcnRfYmVmb3JlBQphcnRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQVhZ2VudAUOYW1vdW50Rm9yQWdlbnQFB2Fzc2V0SWQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIFDWFtb3VudEZvclNpZ24FB2Fzc2V0SWQFA25pbAQaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQDCQECIT0CBRRhbW91bnRGb3JQdWJsaWNBZ2VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtwdWJsaWNBZ2VudAUUYW1vdW50Rm9yUHVibGljQWdlbnQFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmlzc3VlcgkAZQIFEGFtb3VudEZvckNyZWF0b3IFFGFtb3VudEZvclB1YmxpY0FnZW50BQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmlzc3VlcgUQYW1vdW50Rm9yQ3JlYXRvcgUHYXNzZXRJZAUDbmlsBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAQGYnV5UmVzCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAUNbmV3QW1vdW50U29sZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICBG5mdF8JANgEAQUFaWRORlQFB3NvbGRLZXkJAMwIAgkBDEludGVnZXJFbnRyeQICEHRvdGFsX25mdF9pc3N1ZWQJAGQCBQh0b3RhbE5GVAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmlzc3VlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgUIaXNzdWVORlQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUKcmVjZWl2ZU5GVAABBQVpZE5GVAUDbmlsBRRjb21taXNzaW9uc1dpdGhBZ2VudAUaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQFCnR4VG9DYWxsZXIDBQVpc0JpZAkAzAgCBQhzb2xkRGF0YQkAzAgCBQliaWRVcGRhdGUJAMwIAgUJYmlkRGVsT2xkBQZidXlSZXMJAMwIAgUIc29sZERhdGEFBmJ1eVJlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEIYXNTdHJpbmcBAmJ2BAckbWF0Y2gwBQJidgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA2J2MAUHJG1hdGNoMAUDYnYwCQACAQIkU3BvbnNvcmVkIFB1YmxpYyBLZXkgU3RyaW5nIGV4cGVjdGVkCgZpbnZva2UBB3NldENvbmYCA2tleQN2YWwEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEIY29udGFpbnMCBQNrZXkCBWNvbmZfCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwJAAIBAiBFbnRyaWVzIHN0YXJ0aW5nIHdpdGggY29uZl8gb25seQkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMBaQEKYWRkQXJ0d29yawwEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQxzaGEyNTZFeHBvcnQJY2lkRXhwb3J0DXNoYTI1NkxpY2VuY2UKY2lkTGljZW5jZQdjcmF3bGVyCXJveWFsdGllcwZwdWJLZXkEDSR0MDIxMDI5MjExMDIJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEBWFydElkCAUNJHQwMjEwMjkyMTEwMgJfMQQGY2FsbGVyCAUNJHQwMjEwMjkyMTEwMgJfMgQEZGF0ZQgFDSR0MDIxMDI5MjExMDICXzMEC2lzU3BvbnNvcmVkCAUNJHQwMjEwMjkyMTEwMgJfNAQNJHQwMjExMTIyMTE4MQkBCnNldExJY2VuY2UCBQpjaWRMaWNlbmNlBQ1zaGEyNTZMaWNlbmNlBApsaWNlbmNlQ0lECAUNJHQwMjExMTIyMTE4MQJfMQQLbGljZW5jZUhhc2gIBQ0kdDAyMTExMjIxMTgxAl8yBA92YWxpZGF0ZUFydHdvcmsJARN2YWxpZGF0ZUFydHdvcmtEYXRhCgUGY2FsbGVyBQpjaWREaXNwbGF5BQljaWRFeHBvcnQFCmxpY2VuY2VDSUQFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gFBG5hbWUFC2Rlc2NyaXB0aW9uBQR0YWdzBQlyb3lhbHRpZXMDCQECIT0CBQ92YWxpZGF0ZUFydHdvcmsCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQQd2hpdGVsaXN0ZWRfZHJvcAkAZgIJAQ5jaGVja1doaXRlbGlzdAEJAKwCAgUGY2FsbGVyAgtfZnJlZV9kcm9wcwAABA0kdDAyMTQ4MDIxNTY4AwUQd2hpdGVsaXN0ZWRfZHJvcAkAlAoCAAAFCmFydEFzc2V0SWQJAQ92YWxpZGF0ZVBheW1lbnQBBQFpBAZhbW91bnQIBQ0kdDAyMTQ4MDIxNTY4Al8xBAdhc3NldElkCAUNJHQwMjE0ODAyMTU2OAJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFBmFtb3VudAkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nBBdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAMFEHdoaXRlbGlzdGVkX2Ryb3AJAPwHBAUNd2hpdGVsaXN0RGFwcAILdXNlRnJlZURyb3AJAMwIAgUGY2FsbGVyBQNuaWwFA25pbAUEdW5pdAMJAAACBRdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQdrZXlEYXRlAgUGY2FsbGVyBQVhcnRJZAUEZGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBWFydElkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV4cG9ydENpZAIFBmNhbGxlcgUFYXJ0SWQFCWNpZEV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RXhwb3J0SGFzaAIFBmNhbGxlcgUFYXJ0SWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBWFydElkBQtsaWNlbmNlSGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmxpY2VuY2VDSUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBWFydElkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQVhcnRJZAUEdGFncwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBwkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5Q3Jhd2xlcgIFBmNhbGxlcgUFYXJ0SWQFB2NyYXdsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlSb3lhbHRpZXMCBQZjYWxsZXIFBWFydElkBQlyb3lhbHRpZXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyBQZhbW91bnQFCmFydEFzc2V0SWQFA25pbAUKdHhUb0NhbGxlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ11cGRhdGVBcnR3b3JrDQR0eGlkBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5AwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBA0kdDAyMzQ4MzIzNTUzCQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDIzNDgzMjM1NTMCXzEEBmNhbGxlcggFDSR0MDIzNDgzMjM1NTMCXzIEBGRhdGUIBQ0kdDAyMzQ4MzIzNTUzAl8zBAtpc1Nwb25zb3JlZAgFDSR0MDIzNDgzMjM1NTMCXzQEDSR0MDIzNTYzMjM2MzIJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDIzNTYzMjM2MzICXzEEC2xpY2VuY2VIYXNoCAUNJHQwMjM1NjMyMzYzMgJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQoFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUJcm95YWx0aWVzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECmVudHJ5RXhpc3QJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkAwkAAAIFCmVudHJ5RXhpc3QCAAkAAgECD0VudHJ5IG5vdCBmb3VuZAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBHR4aWQDCQAAAgUEZmxhZwIHSUxMRUdBTAkAAgECHUNhbm5vdCB1cGRhdGUgSUxMRUdBTCBhcnR3b3JrAwkBASEBCQELaXNBcnRNaW50ZWQCBQZjYWxsZXIFBHR4aWQECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5hbWUCBQZjYWxsZXIFBHR4aWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBHR4aWQFC2Rlc2NyaXB0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlEaXNwbGF5Q2lkAgUGY2FsbGVyBQR0eGlkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFeHBvcnRDaWQCBQZjYWxsZXIFBHR4aWQFCWNpZEV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RXhwb3J0SGFzaAIFBmNhbGxlcgUEdHhpZAUMc2hhMjU2RXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlMaWNlbmNlQ2lkAgUGY2FsbGVyBQR0eGlkBQpsaWNlbmNlQ0lECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlMaWNlbmNlSGFzaAIFBmNhbGxlcgUEdHhpZAULbGljZW5jZUhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVRhZ3MCBQZjYWxsZXIFBHR4aWQFBHRhZ3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBHR4aWQFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUNyYXdsZXICBQZjYWxsZXIFBHR4aWQFB2NyYXdsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlSb3lhbHRpZXMCBQZjYWxsZXIFBHR4aWQFCXJveWFsdGllcwUDbmlsBQp0eFRvQ2FsbGVyCQACAQIOQWxyZWFkeSBtaW50ZWQBaQELZmxhZ0FydHdvcmsEBWFydElkBGFkZHIEZmxhZwRub3RlBA0kdDAyNTI1OTI1MjkzCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNTI1OTI1MjkzAl8xBAZjYWxsZXIIBQ0kdDAyNTI1OTI1MjkzAl8yAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICB0NPTlNFTlQJAMwIAgIACQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5RmxhZwIFBGFkZHIFBWFydElkBQRmbGFnCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOb3RlAgUEYWRkcgUFYXJ0SWQFBG5vdGUFA25pbAkAAgEJAKwCAgIOVW5rbm93IHN0YXR1cyAFBGZsYWcJAAIBAhNZb3UgYXJlIG5vdCBhbGxvd2VkAWkBDWRlbGV0ZUFydHdvcmsCBWFydElkBGFkZHIEDSR0MDI1NzI5MjU3NjMJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDI1NzI5MjU3NjMCXzEEBmNhbGxlcggFDSR0MDI1NzI5MjU3NjMCXzIECWFkZHJUb1VzZQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIFBGFkZHIFBmNhbGxlcgQKZW50cnlFeGlzdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFCWFkZHJUb1VzZQUFYXJ0SWQCIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzAwkAAAIFCmVudHJ5RXhpc3QCAAkAAgECIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBApzaGEyNTZIYXNoCQEOZ2V0U3RyaW5nQnlLZXkBCQERa2V5SGFzaEJ5VHhpZEFkZHICBQlhZGRyVG9Vc2UFBWFydElkBAZzaWduSUQDCQAAAgUKc2hhMjU2SGFzaAIACQEOZ2V0U3RyaW5nQnlLZXkBCQEJa2V5U2lnbklEAgUJYWRkclRvVXNlBQVhcnRJZAIABA1zaWduSURfbGVnYWN5AwkAAAIFBnNpZ25JRAIABQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleWlkQnlTaWduaWQCBQlhZGRyVG9Vc2UFBnNpZ25JRAUDbmlsBAxkYXRhVG9EZWxldGUJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RGF0ZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEZXNjAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RGlzcGxheUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleUV4cG9ydENpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUV4cG9ydEhhc2gCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlMaWNlbmNlSGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUxpY2VuY2VDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUeXBlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5VGFncwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleU1heE1pbnQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlJc3N1ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlPblNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlGbGFnAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEIa2V5UHJpY2UCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlPd25lckJ5SGFzaAEFCnNoYTI1Nkhhc2gJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUVuZFNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOb3RlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5Q3Jhd2xlcgIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleVJveWFsdGllcwIFCWFkZHJUb1VzZQUFYXJ0SWQFA25pbAUNc2lnbklEX2xlZ2FjeQMJAQEhAQkBC2lzQXJ0TWludGVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwUMZGF0YVRvRGVsZXRlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUMZGF0YVRvRGVsZXRlCQACAQIoQXJ0IGFscmVhZHkgbWludGVkLCB5b3UgY2Fubm90IGRlbGV0ZSBpdAFpAQtzZWxsQXJ0d29yawYFYXJ0SWQFcHJpY2UHbWF4TWludAdhc3NldElkCGJsb2NrRW5kBnB1YktleQQNJHQwMjg1NDIyODYxMgkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyODU0MjI4NjEyAl8xBAZjYWxsZXIIBQ0kdDAyODU0MjI4NjEyAl8yBARkYXRlCAUNJHQwMjg1NDIyODYxMgJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyODU0MjI4NjEyAl80BAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAiNUaGlzIGFydCBkb2Vzbid0IG1hdGNoIHlvdXIgYWNjb3VudAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBWFydElkAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQBmAgAABQhibG9ja0VuZAkAAgECDE5lZ2F0aXZlIGVuZAMDCQBmAgUIYmxvY2tFbmQAAAMJAQIhPQIFB21heE1pbnQAAQYJAQIhPQIFBXByaWNlAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQKYmFzZUhlaWdodAMJAAACBQhibG9ja0VuZAAAAAAFBmhlaWdodAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAQUFcHJpY2UJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQDCQBmAgUHbWF4TWludABkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQphbW91bnRTb2xkAAAJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQphbW91bnRTb2xkAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFBmJpZE5icgAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECMUNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSB3aXRoIGFjdGl2ZSBvcmRlcnMECnNlbGxTdGF0dXMDAwkAZgIFBXByaWNlAAAJAGYCBQdtYXhNaW50AAAHBgcECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEIa2V5UHJpY2UCBQZjYWxsZXIFBWFydElkBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkBQdtYXhNaW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZjYWxsZXIFBWFydElkBQdhc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmNhbGxlcgUFYXJ0SWQJAGQCBQpiYXNlSGVpZ2h0BQhibG9ja0VuZAUDbmlsBQp0eFRvQ2FsbGVyAWkBCmJ1eUFydHdvcmsCBWFydElkBmlzc3VlcgkBB2J1eU1pbnQGBQFpBQVhcnRJZAUGaXNzdWVyAgACAAIAAWkBBnNldEJpZAIFYXJ0SWQGaXNzdWVyBA0kdDAzMDk4NTMxMDI1CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMDk4NTMxMDI1Al8xBAZjYWxsZXIIBQ0kdDAzMDk4NTMxMDI1Al8yBARkYXRlCAUNJHQwMzA5ODUzMTAyNQJfMwQNJHQwMzEwMzAzMTA2NgkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQ0kdDAzMTAzMDMxMDY2Al8xBAZhbW91bnQIBQ0kdDAzMTAzMDMxMDY2Al8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQIYmxvY2tFbmQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQACAQILU2FsZSBlbmRlZC4EBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAQUGYW1vdW50CQACAQIOV3JvbmcgbWluIHNlbGwECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMJAGcCAAAFCm1heENhblNlbGwJAAIBAiNObyBtYXggZWRpdGlvbiBzZXQgZm9yIHRoaXMgYXJ0d29yawMJAGcCBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIYU29sZCBvdXQsIHlvdSBjYW5ub3QgYmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FAmlkAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQdhc3NldElkAgFfCQCkAwEFBmFtb3VudAIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGQCBQZiaWROYnIAAQUDbmlsAWkBCWFjY2VwdEJpZAUFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBnB1YktleQkBB2J1eU1pbnQGBQFpBQVhcnRJZAUGaXNzdWVyBQViaWRJZAUIYmlkT3duZXIFBnB1YktleQFpAQljYW5jZWxCaWQEBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMzIzOTAzMjQ1MQkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzIzOTAzMjQ1MQJfMQQGY2FsbGVyCAUNJHQwMzIzOTAzMjQ1MQJfMgQEZGF0ZQgFDSR0MDMyMzkwMzI0NTECXzMDAwkBAiE9AgUGY2FsbGVyBQhiaWRPd25lcgkBAiE9AgUGY2FsbGVyBQZpc3N1ZXIHCQACAQIZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgQNcmV0dXJuTW9uZXlUbwMJAAACBQZjYWxsZXIFBmlzc3VlcgUIYmlkT3duZXIFBmNhbGxlcgQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgMJAAACBQdiaWREYXRhAgAJAAIBAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8EB2Fzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAAECWJpZFN0YXR1cwIIQ0FOQ0VMRUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUKYmlkRGF0YUtleQIBXwUJYmlkU3RhdHVzCQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGUCBQZiaWROYnIAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUNcmV0dXJuTW9uZXlUbwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJpZERhdGFBcnIAAQUHYXNzZXRJZAUDbmlsAQJ0eAEIdmVyaWZpZXIABAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MACwMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAg11cGRhdGVBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAwDAwMDCQAAAggFA2ludghmdW5jdGlvbgILc2VsbEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MABQMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAglhY2NlcHRCaWQJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAMgTAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MABAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleWygD0M=", "height": 2792054, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CCb3p85UyeHGM1ku2o9CmiLVbvBKA5EftNJLJNq535EY Next: 5Vt1ck5h372rkZZygYurNDvsyYTmmU86Mr36M47uwcr9 Diff:
OldNewDifferences
530530 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
531531 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
532532 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
533- if (true)
534- then throw(((toString(amount_art_before) + " toto ") + toString(amount_art_after)))
535- else {
536- let txToCaller = if (isSponsored)
537- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
538- else nil
539- 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(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
540- if (isBid)
541- then [soldData, bidUpdate, bidDelOld] :: buyRes
542- else soldData :: buyRes
543- }
533+ let txToCaller = if (isSponsored)
534+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
535+ else nil
536+ 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(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
537+ if (isBid)
538+ then [soldData, bidUpdate, bidDelOld] :: buyRes
539+ else soldData :: buyRes
544540 }
545541 else throw("Strict value is not equal to itself.")
546542 }
578574
579575 @Callable(i)
580576 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
581- let $t02112821201 = idCallerDateSponsored(i, pubKey)
582- let artId = $t02112821201._1
583- let caller = $t02112821201._2
584- let date = $t02112821201._3
585- let isSponsored = $t02112821201._4
586- let $t02121121280 = setLIcence(cidLicence, sha256Licence)
587- let licenceCID = $t02121121280._1
588- let licenceHash = $t02121121280._2
577+ let $t02102921102 = idCallerDateSponsored(i, pubKey)
578+ let artId = $t02102921102._1
579+ let caller = $t02102921102._2
580+ let date = $t02102921102._3
581+ let isSponsored = $t02102921102._4
582+ let $t02111221181 = setLIcence(cidLicence, sha256Licence)
583+ let licenceCID = $t02111221181._1
584+ let licenceHash = $t02111221181._2
589585 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
590586 if ((validateArtwork != ""))
591587 then throw("Something went wrong!")
592588 else {
593589 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
594- let $t02157921667 = if (whitelisted_drop)
590+ let $t02148021568 = if (whitelisted_drop)
595591 then $Tuple2(0, artAssetId)
596592 else validatePayment(i)
597- let amount = $t02157921667._1
598- let assetId = $t02157921667._2
593+ let amount = $t02148021568._1
594+ let assetId = $t02148021568._2
599595 if (!(isDefined(amount)))
600596 then throw("Something went wrong")
601597 else {
620616 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
621617 then throw(maintenanceMSG)
622618 else {
623- let $t02358223652 = idCallerDateSponsored(i, pubKey)
624- let id = $t02358223652._1
625- let caller = $t02358223652._2
626- let date = $t02358223652._3
627- let isSponsored = $t02358223652._4
628- let $t02366223731 = setLIcence(cidLicence, sha256Licence)
629- let licenceCID = $t02366223731._1
630- let licenceHash = $t02366223731._2
619+ let $t02348323553 = idCallerDateSponsored(i, pubKey)
620+ let id = $t02348323553._1
621+ let caller = $t02348323553._2
622+ let date = $t02348323553._3
623+ let isSponsored = $t02348323553._4
624+ let $t02356323632 = setLIcence(cidLicence, sha256Licence)
625+ let licenceCID = $t02356323632._1
626+ let licenceHash = $t02356323632._2
631627 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
632628 if ((validateArtwork != ""))
633629 then throw("Something went wrong!")
655651
656652 @Callable(i)
657653 func flagArtwork (artId,addr,flag,note) = {
658- let $t02535825392 = idCallerDate(i)
659- let id = $t02535825392._1
660- let caller = $t02535825392._2
654+ let $t02525925293 = idCallerDate(i)
655+ let id = $t02525925293._1
656+ let caller = $t02525925293._2
661657 if (containsElement([chris, toString(this)], caller))
662658 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
663659 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
669665
670666 @Callable(i)
671667 func deleteArtwork (artId,addr) = {
672- let $t02582825862 = idCallerDate(i)
673- let id = $t02582825862._1
674- let caller = $t02582825862._2
668+ let $t02572925763 = idCallerDate(i)
669+ let id = $t02572925763._1
670+ let caller = $t02572925763._2
675671 let addrToUse = if (containsElement([chris, toString(this)], caller))
676672 then addr
677673 else caller
701697
702698 @Callable(i)
703699 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
704- let $t02864128711 = idCallerDateSponsored(i, pubKey)
705- let id = $t02864128711._1
706- let caller = $t02864128711._2
707- let date = $t02864128711._3
708- let isSponsored = $t02864128711._4
700+ let $t02854228612 = idCallerDateSponsored(i, pubKey)
701+ let id = $t02854228612._1
702+ let caller = $t02854228612._2
703+ let date = $t02854228612._3
704+ let isSponsored = $t02854228612._4
709705 let artworkName = getStringByKey(keyName(caller, artId))
710706 if ((artworkName == ""))
711707 then throw("This art doesn't match your account")
779775
780776 @Callable(i)
781777 func setBid (artId,issuer) = {
782- let $t03108431124 = idCallerDate(i)
783- let id = $t03108431124._1
784- let caller = $t03108431124._2
785- let date = $t03108431124._3
786- let $t03112931165 = isPayment(i)
787- let payment = $t03112931165._1
788- let amount = $t03112931165._2
778+ let $t03098531025 = idCallerDate(i)
779+ let id = $t03098531025._1
780+ let caller = $t03098531025._2
781+ let date = $t03098531025._3
782+ let $t03103031066 = isPayment(i)
783+ let payment = $t03103031066._1
784+ let amount = $t03103031066._2
789785 let assetId = if (!(isDefined(payment.assetId)))
790786 then "WAVES"
791787 else toBase58String(value(payment.assetId))
821817
822818 @Callable(i)
823819 func cancelBid (artId,issuer,bidId,bidOwner) = {
824- let $t03248932550 = idCallerDate(i)
825- let id = $t03248932550._1
826- let caller = $t03248932550._2
827- let date = $t03248932550._3
820+ let $t03239032451 = idCallerDate(i)
821+ let id = $t03239032451._1
822+ let caller = $t03239032451._2
823+ let date = $t03239032451._3
828824 if (if ((caller != bidOwner))
829825 then (caller != issuer)
830826 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "2.0.0"
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 puzzle_art_pool = getStringByKey("conf_puzzle_art_pool")
2424
2525 let usdtPPAssetId_str = getStringByKey("conf_accepted_asset_USDT_PP")
2626
2727 let artAssetId_str = getStringByKey("conf_accepted_asset_ART")
2828
2929 let usdcPPAssetId_str = getStringByKey("conf_accepted_asset_USDC_PP")
3030
3131 let eastAssetId_str = getStringByKey("conf_accepted_asset_EAST")
3232
3333 let puzzleAssetId_str = getStringByKey("conf_accepted_asset_PUZZLE")
3434
3535 let ethPPAssetId_str = getStringByKey("conf_accepted_asset_ETH_PP")
3636
3737 let wavesAssetId_str = "WAVES"
3838
3939 let usdtPPAssetId = fromBase58String(usdtPPAssetId_str)
4040
4141 let artAssetId = fromBase58String(artAssetId_str)
4242
4343 let usdcPPAssetId = fromBase58String(usdcPPAssetId_str)
4444
4545 let eastAssetId = fromBase58String(eastAssetId_str)
4646
4747 let puzzleAssetId = fromBase58String(puzzleAssetId_str)
4848
4949 let ethPPAssetId = fromBase58String(ethPPAssetId_str)
5050
5151 let wavesAssetId = base58''
5252
5353 let all_accepted_assets = [usdtPPAssetId_str, artAssetId_str, usdcPPAssetId_str, eastAssetId_str, puzzleAssetId_str, wavesAssetId_str, ethPPAssetId_str]
5454
5555 let chris = getStringByKey("conf_admin_1")
5656
5757 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
5858
5959
6060 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
6161
6262
6363 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
6464
6565
6666 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6767
6868
6969 let commission_fee = 8
7070
7171 let defaultLicence = getStringByKey("conf_default_licence")
7272
7373 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
7474
7575 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
7676
7777 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
7878
7979 let userSuspended = "SUSPENDED"
8080
8181 let userRemoved = "REMOVED"
8282
8383 let userUnregistered = "UNREGISTERED"
8484
8585 let userAllowed = "ALLOWED"
8686
8787 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(artAssetId)))
8888
8989 let mint_fee = getIntegerByKeyFromOracle(("mint_fee_" + toBase58String(artAssetId)))
9090
9191 func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
9292
9393
9494 func validateCID (cid) = if (contains(cid, "/"))
9595 then if (if ((76 > size(cid)))
9696 then (size(split(cid, "/")[0]) == 59)
9797 else false)
9898 then (16 > size(split(cid, "/")[1]))
9999 else false
100100 else false
101101
102102
103103 func validateHash (hash) = (size(hash) == 64)
104104
105105
106106 func keyUserStatus (caller) = ("user_status_" + caller)
107107
108108
109109 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
110110
111111
112112 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
113113
114114
115115 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
116116
117117
118118 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
119119
120120
121121 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
122122
123123
124124 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
125125
126126
127127 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
128128
129129
130130 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
131131
132132
133133 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
134134
135135
136136 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
137137
138138
139139 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
140140
141141
142142 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
143143
144144
145145 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
146146
147147
148148 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
149149
150150
151151 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
152152
153153
154154 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
155155
156156
157157 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
158158
159159
160160 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
161161
162162
163163 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
164164
165165
166166 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
167167
168168
169169 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
170170
171171
172172 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
173173
174174
175175 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
176176
177177
178178 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
179179
180180
181181 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
182182
183183
184184 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
185185
186186
187187 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
188188
189189
190190 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
191191
192192
193193 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
194194 then throw("Wrong Display CID")
195195 else if (!(validateCID(cidExport)))
196196 then throw("Wrong Export CID")
197197 else if (if ((cidLicence != ""))
198198 then !(validateCID(cidLicence))
199199 else false)
200200 then throw("Wrong Licence CID")
201201 else true
202202
203203
204204 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
205205 then throw("Export Hash 64 char. max")
206206 else if (!(validateHash(sha256Licence)))
207207 then throw("Licence Hash 64 char. max")
208208 else true
209209
210210
211211 func validateString (str,max) = if ((size(str) == 0))
212212 then throw("Field cannot be is empty")
213213 else if ((size(str) > max))
214214 then throw((str + " is too long"))
215215 else true
216216
217217
218218 func validateUser (caller) = {
219219 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
220220 if (if ((userStatus == userUnregistered))
221221 then true
222222 else (userStatus == userAllowed))
223223 then "Register this account first with \"Account\" tab"
224224 else if ((userStatus == userSuspended))
225225 then "Account suspended"
226226 else if ((userStatus == userRemoved))
227227 then "Account removed"
228228 else ""
229229 }
230230
231231
232232 func setLIcence (cidLicence,sha256Licence) = {
233233 let cid = if ((size(cidLicence) == 0))
234234 then defaultLicence
235235 else cidLicence
236236 let hash = if ((size(sha256Licence) == 0))
237237 then defaultHashLicence
238238 else sha256Licence
239239 $Tuple2(cid, hash)
240240 }
241241
242242
243243 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
244244 let checkUser = validateUser(caller)
245245 if ((checkUser != ""))
246246 then throw(checkUser)
247247 else if ((size(cidDisplay) == 0))
248248 then throw("Display CID cannot be empty")
249249 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
250250 then throw("Problem with CID")
251251 else if (!(validateAllHash(sha256Export, licenceHash)))
252252 then throw("Problem with Hashes")
253253 else if (!(validateString(name, 100)))
254254 then throw("100 Char. max name")
255255 else if (!(validateString(description, 1000)))
256256 then throw("1000 Char. max description")
257257 else if (if ((0 > royalties))
258258 then true
259259 else (royalties > 1000))
260260 then throw("Royalties cannot be less than 0% or higher than 10%")
261261 else if ((size(split(tags, ",")) > 5))
262262 then throw("5 tags max.")
263263 else ""
264264 }
265265
266266
267267 func isPayment (i) = if ((size(i.payments) == 0))
268268 then throw("No payment attached")
269269 else {
270270 let payment = value(i.payments[0])
271271 let amount = value(payment.amount)
272272 $Tuple2(payment, amount)
273273 }
274274
275275
276276 func validatePayment (i) = {
277277 let $t01015610192 = isPayment(i)
278278 let payment = $t01015610192._1
279279 let amount = $t01015610192._2
280280 let assetId = if (if (isDefined(payment.assetId))
281281 then (payment.assetId == artAssetId)
282282 else false)
283283 then payment.assetId
284284 else throw("Only SIGN token accepted as transaction fee")
285285 if ((amount != currentCertificationPrice))
286286 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
287287 else $Tuple2(amount, assetId)
288288 }
289289
290290
291291 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
292292 case b: Int =>
293293 if ((b != 0))
294294 then true
295295 else false
296296 case _ =>
297297 false
298298 }
299299
300300
301301 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
302302 let $t01077910815 = isPayment(i)
303303 let payment = $t01077910815._1
304304 let amount = $t01077910815._2
305305 let assetId = if (!(isDefined(payment.assetId)))
306306 then unit
307307 else if (if ((size(priceAssetId) > 0))
308308 then (toBase58String(value(payment.assetId)) == priceAssetId)
309309 else false)
310310 then payment.assetId
311311 else throw("Wrong asset id")
312312 if (if ((assetId == unit))
313313 then (priceAssetId != "")
314314 else false)
315315 then throw("Wrong asset id")
316316 else if ((artworkPrice != amount))
317317 then throw("Payment don't match")
318318 else $Tuple2(amount, assetId)
319319 }
320320
321321
322322 func acceptedAssetIds (assetId) = if (!(containsElement(all_accepted_assets, assetId)))
323323 then throw("Only $ART, USDT-PP, USDC-PP, EAST, PUZZLE, ETH or WAVES accepted")
324324 else true
325325
326326
327327 func validateMinSell (price) = if ((0 >= price))
328328 then throw("Wrong minimum sell price")
329329 else true
330330
331331
332332 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
333333 then unit
334334 else fromBase58String(assetId)
335335
336336
337337 func getPriceAssetIdFromBid (bidDataKey) = {
338338 let bidData = getStringByKey((bidDataKey + "_OPEN"))
339339 if ((bidData == ""))
340340 then throw("Bid not found")
341341 else {
342342 let bidDataArr = split(bidData, "_")
343343 let bidAmount = parseIntValue(bidDataArr[1])
344344 let bidAssetId = getBidAssetId(bidDataArr[0])
345345 if ((0 >= bidAmount))
346346 then throw("Wrong amount")
347347 else $Tuple2(bidAmount, bidAssetId)
348348 }
349349 }
350350
351351
352352 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
353353 then throw(maintenanceMSG)
354354 else {
355355 let isSponsored = if ((pubKey != ""))
356356 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
357357 else 0
358358 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
359359 then (isSponsored > 0)
360360 else false)
361361 then toString(addressFromPublicKey(fromBase58String(pubKey)))
362362 else toBase58String(i.caller.bytes)
363363 let get_sponsored_waves = if (if ((pubKey != ""))
364364 then (isSponsored > 0)
365365 else false)
366366 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
367367 else unit
368368 if ((get_sponsored_waves == get_sponsored_waves))
369369 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
370370 else throw("Strict value is not equal to itself.")
371371 }
372372
373373
374374 func idCallerDate (i) = if (!(dappRunning))
375375 then throw(maintenanceMSG)
376376 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
377377
378378
379379 func getBalance (assetId) = match assetId {
380380 case b: ByteVector =>
381381 assetBalance(this, b)
382382 case _ =>
383383 wavesBalance(this).available
384384 }
385385
386386
387387 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
388388 let $t01342013509 = idCallerDateSponsored(i, pubKey)
389389 let id = $t01342013509._1
390390 let caller = $t01342013509._2
391391 let date = $t01342013509._3
392392 let isSponsored = $t01342013509._4
393393 let isBid = if (if (if ((caller == issuer))
394394 then (bidOwner != "")
395395 else false)
396396 then (bidId != "")
397397 else false)
398398 then true
399399 else false
400400 if (if (isBid)
401401 then (caller != issuer)
402402 else false)
403403 then throw("You cannot do this action")
404404 else {
405405 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
406406 if (if (if ((blockEnd != 0))
407407 then (height >= blockEnd)
408408 else false)
409409 then !(isBid)
410410 else false)
411411 then throw("Sale ended.")
412412 else {
413413 let callerIsIssuer = (caller == issuer)
414414 let totalNFT = getIntegerByKey("total_nft_issued")
415415 let artworkName = getStringByKey(keyName(issuer, artId))
416416 if ((artworkName == ""))
417417 then throw("Art doesn't exist")
418418 else {
419419 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
420420 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
421421 let artworkPrice = if (callerIsIssuer)
422422 then mint_fee
423423 else getIntegerByKey(keyPrice(issuer, artId))
424424 let priceAssetId = if (callerIsIssuer)
425425 then toBase58String(artAssetId)
426426 else getStringByKey(keyAssetIdAccepted(issuer, artId))
427427 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
428428 if (if (if (!(isBid))
429429 then !(callerIsIssuer)
430430 else false)
431431 then if (if ((0 >= artworkPrice))
432432 then true
433433 else !(isOnSale))
434434 then true
435435 else (0 >= maxCanSell)
436436 else false)
437437 then throw("Art not for sale")
438438 else if (if (if (!(isBid))
439439 then callerIsIssuer
440440 else false)
441441 then (0 >= maxCanSell)
442442 else false)
443443 then throw("Max issuable not set")
444444 else {
445445 let checkUser = validateUser(issuer)
446446 if (if (isBid)
447447 then (checkUser != "")
448448 else false)
449449 then throw(checkUser)
450450 else {
451451 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
452452 let $t01508615278 = if (isBid)
453453 then getPriceAssetIdFromBid(bidDataKey)
454454 else validatePriceAssetId(i, priceAssetId, artworkPrice)
455455 let amount = $t01508615278._1
456456 let assetId = $t01508615278._2
457457 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
458458 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
459459 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
460460 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
461461 let isWhitelisted = checkWhitelist(issuer)
462462 let amountForSign = fraction(amount, commission_fee, 100)
463463 let amountForAgent = if (if (if ((agent != feeReceiver))
464464 then (agentShare > 0)
465465 else false)
466466 then (height > isWhitelisted)
467467 else false)
468468 then fraction(amount, agentShare, 10000)
469469 else 0
470470 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
471471 then (publicAgentShare > 0)
472472 else false)
473473 then (height > isWhitelisted)
474474 else false)
475475 then fraction(amount, publicAgentShare, 10000)
476476 else 0
477477 let amountForCreator = (amount - amountForSign)
478478 if ((amountSold == maxCanSell))
479479 then throw("Art sold out")
480480 else {
481481 let newAmountSold = (amountSold + 1)
482482 let issueMeta = ((((((((("Creator: " + issuer) + ",
483483 ArtID: ") + artId) + ",
484484 Artwork name: ") + artworkName) + ",
485485 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
486486 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
487487 let idNFT = calculateAssetId(issueNFT)
488488 let sellStatus = if (if ((newAmountSold == maxCanSell))
489489 then true
490490 else !(isOnSale))
491491 then false
492492 else true
493493 let receiveNFT = if (if (if ((caller == issuer))
494494 then (bidOwner != "")
495495 else false)
496496 then (bidId != "")
497497 else false)
498498 then addressFromStringValue(bidOwner)
499499 else i.caller
500500 let assetIdBid = if (!(isDefined(assetId)))
501501 then "WAVES"
502502 else toBase58String(value(assetId))
503503 let bidData = getStringByKey((bidDataKey + "_OPEN"))
504504 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
505505 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
506506 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
507507 let soldValue = if (!(isBid))
508508 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
509509 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
510510 let soldData = StringEntry(soldKey, soldValue)
511511 let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
512512 then (amountForSign - amountForAgent)
513513 else amountForSign
514514 let amount_art_before = getBalance(artAssetId)
515515 if ((amount_art_before == amount_art_before))
516516 then {
517517 let swap_fee_to_art = if ((assetId != artAssetId))
518518 then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
519519 else unit
520520 if ((swap_fee_to_art == swap_fee_to_art))
521521 then {
522522 let amount_art_after = getBalance(artAssetId)
523523 if ((amount_art_after == amount_art_after))
524524 then {
525525 let commissionsWithAgent = if ((amountForAgent != 0))
526526 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
527527 then (amountForSign - amountForAgent)
528528 else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
529529 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
530530 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
531531 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
532532 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
533- if (true)
534- then throw(((toString(amount_art_before) + " toto ") + toString(amount_art_after)))
535- else {
536- let txToCaller = if (isSponsored)
537- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
538- else nil
539- 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(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
540- if (isBid)
541- then [soldData, bidUpdate, bidDelOld] :: buyRes
542- else soldData :: buyRes
543- }
533+ let txToCaller = if (isSponsored)
534+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
535+ else nil
536+ 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(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
537+ if (isBid)
538+ then [soldData, bidUpdate, bidDelOld] :: buyRes
539+ else soldData :: buyRes
544540 }
545541 else throw("Strict value is not equal to itself.")
546542 }
547543 else throw("Strict value is not equal to itself.")
548544 }
549545 else throw("Strict value is not equal to itself.")
550546 }
551547 }
552548 }
553549 }
554550 }
555551 }
556552 }
557553
558554
559555 func asString (bv) = match bv {
560556 case bv0: String =>
561557 bv0
562558 case _ =>
563559 throw("Sponsored Public Key String expected")
564560 }
565561
566562
567563 @Callable(invoke)
568564 func setConf (key,val) = {
569565 let caller = toString(invoke.caller)
570566 if (containsElement([chris, toString(this)], caller))
571567 then if (contains(key, "conf_"))
572568 then [StringEntry(key, val)]
573569 else throw("Entries starting with conf_ only")
574570 else throw("You are not allowed to change this")
575571 }
576572
577573
578574
579575 @Callable(i)
580576 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
581- let $t02112821201 = idCallerDateSponsored(i, pubKey)
582- let artId = $t02112821201._1
583- let caller = $t02112821201._2
584- let date = $t02112821201._3
585- let isSponsored = $t02112821201._4
586- let $t02121121280 = setLIcence(cidLicence, sha256Licence)
587- let licenceCID = $t02121121280._1
588- let licenceHash = $t02121121280._2
577+ let $t02102921102 = idCallerDateSponsored(i, pubKey)
578+ let artId = $t02102921102._1
579+ let caller = $t02102921102._2
580+ let date = $t02102921102._3
581+ let isSponsored = $t02102921102._4
582+ let $t02111221181 = setLIcence(cidLicence, sha256Licence)
583+ let licenceCID = $t02111221181._1
584+ let licenceHash = $t02111221181._2
589585 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
590586 if ((validateArtwork != ""))
591587 then throw("Something went wrong!")
592588 else {
593589 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
594- let $t02157921667 = if (whitelisted_drop)
590+ let $t02148021568 = if (whitelisted_drop)
595591 then $Tuple2(0, artAssetId)
596592 else validatePayment(i)
597- let amount = $t02157921667._1
598- let assetId = $t02157921667._2
593+ let amount = $t02148021568._1
594+ let assetId = $t02148021568._2
599595 if (!(isDefined(amount)))
600596 then throw("Something went wrong")
601597 else {
602598 let decrease_whitelist_drop = if (whitelisted_drop)
603599 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
604600 else unit
605601 if ((decrease_whitelist_drop == decrease_whitelist_drop))
606602 then {
607603 let txToCaller = if (isSponsored)
608604 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
609605 else nil
610606 ([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), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyCrawler(caller, artId), crawler), IntegerEntry(keyRoyalties(caller, artId), royalties), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, artAssetId)] ++ txToCaller)
611607 }
612608 else throw("Strict value is not equal to itself.")
613609 }
614610 }
615611 }
616612
617613
618614
619615 @Callable(i)
620616 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
621617 then throw(maintenanceMSG)
622618 else {
623- let $t02358223652 = idCallerDateSponsored(i, pubKey)
624- let id = $t02358223652._1
625- let caller = $t02358223652._2
626- let date = $t02358223652._3
627- let isSponsored = $t02358223652._4
628- let $t02366223731 = setLIcence(cidLicence, sha256Licence)
629- let licenceCID = $t02366223731._1
630- let licenceHash = $t02366223731._2
619+ let $t02348323553 = idCallerDateSponsored(i, pubKey)
620+ let id = $t02348323553._1
621+ let caller = $t02348323553._2
622+ let date = $t02348323553._3
623+ let isSponsored = $t02348323553._4
624+ let $t02356323632 = setLIcence(cidLicence, sha256Licence)
625+ let licenceCID = $t02356323632._1
626+ let licenceHash = $t02356323632._2
631627 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
632628 if ((validateArtwork != ""))
633629 then throw("Something went wrong!")
634630 else {
635631 let entryExist = getStringByKey(keyName(caller, txid))
636632 if ((entryExist == ""))
637633 then throw("Entry not found")
638634 else {
639635 let flag = getStringByKey(keyFlag(caller, txid))
640636 if ((flag == "ILLEGAL"))
641637 then throw("Cannot update ILLEGAL artwork")
642638 else if (!(isArtMinted(caller, txid)))
643639 then {
644640 let txToCaller = if (isSponsored)
645641 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
646642 else nil
647643 ([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)
648644 }
649645 else throw("Already minted")
650646 }
651647 }
652648 }
653649
654650
655651
656652 @Callable(i)
657653 func flagArtwork (artId,addr,flag,note) = {
658- let $t02535825392 = idCallerDate(i)
659- let id = $t02535825392._1
660- let caller = $t02535825392._2
654+ let $t02525925293 = idCallerDate(i)
655+ let id = $t02525925293._1
656+ let caller = $t02525925293._2
661657 if (containsElement([chris, toString(this)], caller))
662658 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
663659 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
664660 else throw(("Unknow status " + flag))
665661 else throw("You are not allowed")
666662 }
667663
668664
669665
670666 @Callable(i)
671667 func deleteArtwork (artId,addr) = {
672- let $t02582825862 = idCallerDate(i)
673- let id = $t02582825862._1
674- let caller = $t02582825862._2
668+ let $t02572925763 = idCallerDate(i)
669+ let id = $t02572925763._1
670+ let caller = $t02572925763._2
675671 let addrToUse = if (containsElement([chris, toString(this)], caller))
676672 then addr
677673 else caller
678674 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
679675 if ((entryExist == ""))
680676 then throw("No art matching for this address")
681677 else {
682678 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
683679 let signID = if ((sha256Hash == ""))
684680 then getStringByKey(keySignID(addrToUse, artId))
685681 else ""
686682 let signID_legacy = if ((signID == ""))
687683 then nil
688684 else [DeleteEntry(keyidBySignid(addrToUse, signID))]
689685 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(keyEndSale(addrToUse, artId)), DeleteEntry(keyNote(addrToUse, artId)), DeleteEntry(keyCrawler(addrToUse, artId)), DeleteEntry(keyRoyalties(addrToUse, artId))] ++ signID_legacy)
690686 if (!(isArtMinted(addrToUse, artId)))
691687 then if (!(dappRunning))
692688 then throw(maintenanceMSG)
693689 else dataToDelete
694690 else if (containsElement([chris, toString(this)], caller))
695691 then dataToDelete
696692 else throw("Art already minted, you cannot delete it")
697693 }
698694 }
699695
700696
701697
702698 @Callable(i)
703699 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
704- let $t02864128711 = idCallerDateSponsored(i, pubKey)
705- let id = $t02864128711._1
706- let caller = $t02864128711._2
707- let date = $t02864128711._3
708- let isSponsored = $t02864128711._4
700+ let $t02854228612 = idCallerDateSponsored(i, pubKey)
701+ let id = $t02854228612._1
702+ let caller = $t02854228612._2
703+ let date = $t02854228612._3
704+ let isSponsored = $t02854228612._4
709705 let artworkName = getStringByKey(keyName(caller, artId))
710706 if ((artworkName == ""))
711707 then throw("This art doesn't match your account")
712708 else {
713709 let flag = getStringByKey(keyFlag(caller, artId))
714710 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
715711 then throw("Flagged artwork")
716712 else {
717713 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
718714 if ((0 > blockEnd))
719715 then throw("Negative end")
720716 else if (if ((blockEnd > 0))
721717 then if ((maxMint != 1))
722718 then true
723719 else (price != 0)
724720 else false)
725721 then throw("Timed offer only allowed for unique edition and offer only")
726722 else {
727723 let baseHeight = if ((blockEnd == 0))
728724 then 0
729725 else height
730726 if (!(acceptedAssetIds(assetId)))
731727 then throw("Something went wrong!")
732728 else if (!(validateMinSell(price)))
733729 then throw("Something went wrong!")
734730 else {
735731 let checkUser = validateUser(caller)
736732 if ((checkUser != ""))
737733 then throw(checkUser)
738734 else {
739735 let amountSold = getIntegerByKey(keyIssued(caller, artId))
740736 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
741737 if ((maxMint > 100))
742738 then throw("100 editions max per artwork")
743739 else if (if ((amountSold != 0))
744740 then (amountSold == maxCanSell)
745741 else false)
746742 then throw("Max edition reached.")
747743 else if (if ((amountSold > 0))
748744 then (maxCanSell != maxMint)
749745 else false)
750746 then throw("Cannot change maximum issuable anymore")
751747 else if (if ((bidNbr > 0))
752748 then (maxCanSell != maxMint)
753749 else false)
754750 then throw("Cannot change maximum issuable with active orders")
755751 else {
756752 let sellStatus = if (if ((price > 0))
757753 then (maxMint > 0)
758754 else false)
759755 then true
760756 else false
761757 let txToCaller = if (isSponsored)
762758 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
763759 else nil
764760 ([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)
765761 }
766762 }
767763 }
768764 }
769765 }
770766 }
771767 }
772768
773769
774770
775771 @Callable(i)
776772 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
777773
778774
779775
780776 @Callable(i)
781777 func setBid (artId,issuer) = {
782- let $t03108431124 = idCallerDate(i)
783- let id = $t03108431124._1
784- let caller = $t03108431124._2
785- let date = $t03108431124._3
786- let $t03112931165 = isPayment(i)
787- let payment = $t03112931165._1
788- let amount = $t03112931165._2
778+ let $t03098531025 = idCallerDate(i)
779+ let id = $t03098531025._1
780+ let caller = $t03098531025._2
781+ let date = $t03098531025._3
782+ let $t03103031066 = isPayment(i)
783+ let payment = $t03103031066._1
784+ let amount = $t03103031066._2
789785 let assetId = if (!(isDefined(payment.assetId)))
790786 then "WAVES"
791787 else toBase58String(value(payment.assetId))
792788 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
793789 if (if ((blockEnd != 0))
794790 then (height >= blockEnd)
795791 else false)
796792 then throw("Sale ended.")
797793 else {
798794 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
799795 if (!(acceptedAssetIds(assetId)))
800796 then throw("asset not accepted")
801797 else if (!(validateMinSell(amount)))
802798 then throw("Wrong min sell")
803799 else {
804800 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
805801 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
806802 if ((0 >= maxCanSell))
807803 then throw("No max edition set for this artwork")
808804 else if ((amountSold >= maxCanSell))
809805 then throw("Sold out, you cannot bid")
810806 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
811807 }
812808 }
813809 }
814810
815811
816812
817813 @Callable(i)
818814 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
819815
820816
821817
822818 @Callable(i)
823819 func cancelBid (artId,issuer,bidId,bidOwner) = {
824- let $t03248932550 = idCallerDate(i)
825- let id = $t03248932550._1
826- let caller = $t03248932550._2
827- let date = $t03248932550._3
820+ let $t03239032451 = idCallerDate(i)
821+ let id = $t03239032451._1
822+ let caller = $t03239032451._2
823+ let date = $t03239032451._3
828824 if (if ((caller != bidOwner))
829825 then (caller != issuer)
830826 else false)
831827 then throw("You cannot do this action")
832828 else {
833829 let returnMoneyTo = if ((caller == issuer))
834830 then bidOwner
835831 else caller
836832 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
837833 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
838834 let bidData = getStringByKey((bidDataKey + "_OPEN"))
839835 if ((bidData == ""))
840836 then throw("Bid not found")
841837 else {
842838 let bidDataArr = split(bidData, "_")
843839 let assetId = getBidAssetId(bidDataArr[0])
844840 let bidStatus = "CANCELED"
845841 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
846842 }
847843 }
848844 }
849845
850846
851847 @Verifier(tx)
852848 func verifier () = match tx {
853849 case inv: InvokeScriptTransaction =>
854850 if (if (if (if ((inv.function == "addArtwork"))
855851 then (inv.dApp == this)
856852 else false)
857853 then (inv.fee == 500000)
858854 else false)
859855 then (inv.feeAssetId == unit)
860856 else false)
861857 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[11])))
862858 else if (if (if (if ((inv.function == "updateArtwork"))
863859 then (inv.dApp == this)
864860 else false)
865861 then (inv.fee == 500000)
866862 else false)
867863 then (inv.feeAssetId == unit)
868864 else false)
869865 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
870866 else if (if (if (if ((inv.function == "sellArtwork"))
871867 then (inv.dApp == this)
872868 else false)
873869 then (inv.fee == 500000)
874870 else false)
875871 then (inv.feeAssetId == unit)
876872 else false)
877873 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
878874 else if (if (if (if ((inv.function == "acceptBid"))
879875 then (inv.dApp == this)
880876 else false)
881877 then (inv.fee == 500000)
882878 else false)
883879 then (inv.feeAssetId == unit)
884880 else false)
885881 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
886882 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
887883 case _ =>
888884 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
889885 }
890886

github/deemru/w8io/873ac7e 
105.78 ms