tx · 9VSHrRNTXcDKkqhrprMjNGh8puKBGagDp9Vd8KrtwQyN

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02600000 Waves

2023.02.03 05:55 [2432865] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "9VSHrRNTXcDKkqhrprMjNGh8puKBGagDp9Vd8KrtwQyN", "fee": 2600000, "feeAssetId": null, "timestamp": 1675391756015, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "3TZsW5QfFhrGh6r2fiXvpdnrENRW1L7o7LgJiFUiUW3cyX7S8chWANRwW9AxuoJHSosqaJRi6EWgCAUznq1fgwVf" ], "script": "base64:BgJfCAISBAoCCAgSEAoOCAgICAgICAgICAgIAQgSDwoNCAgICAgICAgICAgBCBIGCgQICAgIEgQKAggIEggKBggBAQgBCBIECgIICBIECgIICBIGCgQICAgIEgYKBAgICAhQAAdWRVJTSU9OAgYxLjEuMTABDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgAACHVuaXRUZXN0BwAJb3JhY2xlRmVlCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECD2NvbmZfb3JhY2xlX2ZlZQAIc2lnbkRhcHAJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9zaWdud2ViX2RhcHAAC2ZlZVJlY2VpdmVyCQEOZ2V0U3RyaW5nQnlLZXkBAhFjb25mX2ZlZV9yZWNlaXZlcgAIdXNlckRhcHADBQh1bml0VGVzdAkBBXZhbHVlAQkApggBAiMzTXQ0UkdNRXlqU1dZQW9jVFBxZDU1d2RIUVFCM1BVMlVDbQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX3VzZXJzX2RhcHAADXdoaXRlbGlzdERhcHAJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQITY29uZl93aGl0ZWxpc3RfZGFwcAALc2lnbkFzc2V0SWQJANkEAQkBDmdldFN0cmluZ0J5S2V5AQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAt1c2RuQXNzZXRJZAkA2QQBCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRE4AC3VzZHRBc3NldElkCQDZBAEJAQ5nZXRTdHJpbmdCeUtleQECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEVAAMd2F2ZXNBc3NldElkAQAABWNocmlzCQEOZ2V0U3RyaW5nQnlLZXkBAgxjb25mX2FkbWluXzEBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCW9yYWNsZUZlZQUDa2V5Ah9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlAQ9nZXRJbnRlZ2VyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEOY2hlY2tXaGl0ZWxpc3QBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ13aGl0ZWxpc3REYXBwBQNrZXkAAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwAHc2lnbkN1dAAHAAt1c2RuV2F2ZUN1dAAKAA5kZWZhdWx0TGljZW5jZQkBDmdldFN0cmluZ0J5S2V5AQIUY29uZl9kZWZhdWx0X2xpY2VuY2UAEmRlZmF1bHRIYXNoTGljZW5jZQkBDmdldFN0cmluZ0J5S2V5AQIZY29uZl9kZWZhdWx0X2xpY2VuY2VfaGFzaAALZGFwcFJ1bm5pbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUIdXNlckRhcHACFGNvbmZfZGFwcF9pc19ydW5uaW5nBgAObWFpbnRlbmFuY2VNU0cJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHACFGNvbmZfbWFpbnRlbmFuY2VfbXNnAgAADXVzZXJTdXNwZW5kZWQCCVNVU1BFTkRFRAALdXNlclJlbW92ZWQCB1JFTU9WRUQAEHVzZXJVbnJlZ2lzdGVyZWQCDFVOUkVHSVNURVJFRAALdXNlckFsbG93ZWQCB0FMTE9XRUQAGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJARlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAQkArAICAhJjZXJ0aWZpY2F0aW9uX2ZlZV8JANgEAQULc2lnbkFzc2V0SWQBE2dldEFydHdvcmtSb3lhbHRpZXMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkA6AcBFGNoZWNrU2lnbkNlcnRpZmljYXRlAwZzaWduSUQFT3duZXIKc2hhMjU2SGFzaAQHJG1hdGNoMAkAnQgCBQhzaWduRGFwcAkArAICCQCsAgIJAKwCAgIIZGF0YV9mY18FBnNpZ25JRAIBXwUFT3duZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkBCGNvbnRhaW5zAgUBYQUKc2hhMjU2SGFzaAYHBwELdmFsaWRhdGVDSUQBA2NpZAMJAQhjb250YWlucwIFA2NpZAIBLwMDCQBmAgBMCQCxAgEFA2NpZAkAAAIJALECAQkAkQMCCQC1CQIFA2NpZAIBLwAAADsHCQBmAgAQCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAQcHAQx2YWxpZGF0ZUhhc2gBBGhhc2gJAAACCQCxAgEFBGhhc2gAQAENa2V5VXNlclN0YXR1cwEGY2FsbGVyCQCsAgICDHVzZXJfc3RhdHVzXwUGY2FsbGVyAQdrZXlEYXRlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5TmFtZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleURlc2MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlEaXNwbGF5Q2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDWtleUV4cG9ydEhhc2gCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUFYXJ0SWQCAV8FBmNhbGxlcgEMa2V5RXhwb3J0Q2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICD2FydF9leHBvcnRfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5TWF4TWludAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfbWF4bWludF8FBWFydElkAgFfBQZjYWxsZXIBCWtleVNpZ25JRAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfc2lnbmlkXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5SXNzdWVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlPblNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X29uc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBDmtleUxpY2VuY2VIYXNoAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlMaWNlbmNlQ2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9saWNlbmNlX2NpZF8FBWFydElkAgFfBQZjYWxsZXIBB2tleVRhZ3MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3RhZ3NfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUeXBlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5Tm90ZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfbm90ZV8FBWFydElkAgFfBQZjYWxsZXIBCmtleUNyYXdsZXICBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2NyYXdsZXJfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEMa2V5Um95YWx0aWVzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDmFydF9yb3lhbHRpZXNfBQVhcnRJZAIBXwUGY2FsbGVyAQhrZXlQcmljZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgphcnRfcHJpY2VfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlFbmRTYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDGFydF9lbmRzYWxlXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXNzZXRJZEFjY2VwdGVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEmFydF9hc3NldEFjY2VwdGVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5RmxhZwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZmxhZ18FBWFydElkAgFfBQZjYWxsZXIBEmtleUFydGlzdEFnZW50QWRkcgEKYXJ0aXN0QWRkcgkArAICAg1hcnRpc3RfYWdlbnRfBQphcnRpc3RBZGRyARRrZXlQcmltYXJ5U2hhcmVBZ2VudAEKYXJ0aXN0QWRkcgkArAICAhVhcnRpc3RfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBGGtleUFydGlzdFB1YmxpY0FnZW50QWRkcgEKYXJ0aXN0QWRkcgkArAICAhRhcnRpc3RfcHVibGljX2FnZW50XwUKYXJ0aXN0QWRkcgEaa2V5UHJpbWFyeVNoYXJlUHVibGljQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIcYXJ0aXN0X3B1YmxpY19hZ2VudF9wcmltYXJ5XwUKYXJ0aXN0QWRkcgERa2V5SGFzaEJ5VHhpZEFkZHICBmNhbGxlcgR0eGlkCQCsAgIJAKwCAgkArAICAhNnZXRfaGFzaGJ5dHhpZGFkZHJfBQR0eGlkAgFfBQZjYWxsZXIBDmtleU93bmVyQnlIYXNoAQpzaGEyNTZIYXNoCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUKc2hhMjU2SGFzaAENa2V5aWRCeVNpZ25pZAIGY2FsbGVyBnNpZ25JZAkArAICCQCsAgIJAKwCAgISZ2V0X2FydGlkYnlzaWduaWRfBQZzaWduSWQCAV8FBmNhbGxlcgESa2V5VHhpZEJ5SGFzaE93bmVyAgpzaGEyNTZIYXNoBmNhbGxlcgkArAICAhdnZXRfdHhpZF9ieV9oYXNoX293bmVyXwkA2AQBCQDUFgEJAJsDAQkArAICBQpzaGEyNTZIYXNoBQZjYWxsZXIBDnZhbGlkYXRlQWxsQ0lEAwpjaWREaXNwbGF5CWNpZEV4cG9ydApjaWRMaWNlbmNlAwkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWREaXNwbGF5CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCWNpZEV4cG9ydAkAAgECEFdyb25nIEV4cG9ydCBDSUQDAwkBAiE9AgUKY2lkTGljZW5jZQIACQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZExpY2VuY2UHCQACAQIRV3JvbmcgTGljZW5jZSBDSUQGAQ92YWxpZGF0ZUFsbEhhc2gCDHNoYTI1NkV4cG9ydA1zaGEyNTZMaWNlbmNlAwkBASEBCQEMdmFsaWRhdGVIYXNoAQUMc2hhMjU2RXhwb3J0CQACAQIYRXhwb3J0IEhhc2ggNjQgY2hhci4gbWF4AwkBASEBCQEMdmFsaWRhdGVIYXNoAQUNc2hhMjU2TGljZW5jZQkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkBgkAAAIFCnVzZXJTdGF0dXMFC3VzZXJBbGxvd2VkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFCnVzZXJTdGF0dXMFC3VzZXJSZW1vdmVkAg9BY2NvdW50IHJlbW92ZWQCAAEKc2V0TEljZW5jZQIKY2lkTGljZW5jZQ1zaGEyNTZMaWNlbmNlBANjaWQDCQAAAgkAsQIBBQpjaWRMaWNlbmNlAAAFDmRlZmF1bHRMaWNlbmNlBQpjaWRMaWNlbmNlBARoYXNoAwkAAAIJALECAQUNc2hhMjU2TGljZW5jZQAABRJkZWZhdWx0SGFzaExpY2VuY2UFDXNoYTI1NkxpY2VuY2UJAJQKAgUDY2lkBQRoYXNoARN2YWxpZGF0ZUFydHdvcmtEYXRhCgZjYWxsZXIKY2lkRGlzcGxheQljaWRFeHBvcnQKbGljZW5jZUNJRAxzaGEyNTZFeHBvcnQLbGljZW5jZUhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCXJveWFsdGllcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEPdmFsaWRhdGVQYXltZW50AQFpBAskdDA5MTgwOTIxNgkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQskdDA5MTgwOTIxNgJfMQQGYW1vdW50CAULJHQwOTE4MDkyMTYCXzIEB2Fzc2V0SWQDAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAACCAUHcGF5bWVudAdhc3NldElkBQtzaWduQXNzZXRJZAcIBQdwYXltZW50B2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUGYW1vdW50BRljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQACAQkArAICAhlQYXltZW50IGFtb3VudCBzaG91bGQgYmUgCQCkAwEFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAJQKAgUGYW1vdW50BQdhc3NldElkAQtpc0FydE1pbnRlZAIJYWRkclRvVXNlBWFydElkBAckbWF0Y2gwCQCaCAIFBHRoaXMJAQlrZXlJc3N1ZWQCBQlhZGRyVG9Vc2UFBWFydElkAwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAMJAQIhPQIFAWIAAAYHBwEUdmFsaWRhdGVQcmljZUFzc2V0SWQDAWkMcHJpY2VBc3NldElkDGFydHdvcmtQcmljZQQLJHQwOTgwNDk4NDAJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAULJHQwOTgwNDk4NDACXzEEBmFtb3VudAgFCyR0MDk4MDQ5ODQwAl8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAUEdW5pdAMDCQBmAgkAsQIBBQxwcmljZUFzc2V0SWQAAAkAAAIJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAUMcHJpY2VBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECDldyb25nIGFzc2V0IGlkAwMJAAACBQdhc3NldElkBQR1bml0CQECIT0CBQxwcmljZUFzc2V0SWQCAAcJAAIBAg5Xcm9uZyBhc3NldCBpZAMJAQIhPQIFDGFydHdvcmtQcmljZQUGYW1vdW50CQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBEGFjY2VwdGVkQXNzZXRJZHMBB2Fzc2V0SWQDAwMDAwkBAiE9AgUHYXNzZXRJZAkA2AQBBQtzaWduQXNzZXRJZAkBAiE9AgUHYXNzZXRJZAkA2AQBBQx3YXZlc0Fzc2V0SWQHCQECIT0CBQdhc3NldElkAgVXQVZFUwcJAQIhPQIFB2Fzc2V0SWQJANgEAQULdXNkbkFzc2V0SWQHCQECIT0CBQdhc3NldElkCQDYBAEFC3VzZHRBc3NldElkBwkAAgECJk9ubHkgU0lHTiwgVVNETixVU0RUIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAgdhc3NldElkBXByaWNlBAxtaW5TZWxsV2F2ZXMDBQh1bml0VGVzdAAKCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQECDndhdmVzX21pbl9zZWxsBAttaW5TZWxsVXNkbgDAhD0EC21pblNlbGxTaWduAwUIdW5pdFRlc3QAAQkAaAIFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UAAgMDAwMDAwkAAAIFB2Fzc2V0SWQJANgEAQULdXNkbkFzc2V0SWQJAGYCBQttaW5TZWxsVXNkbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwkAAAIFB2Fzc2V0SWQJANgEAQULdXNkdEFzc2V0SWQJAGYCBQttaW5TZWxsVXNkbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwkAAAIFB2Fzc2V0SWQJANgEAQULc2lnbkFzc2V0SWQJAGYCBQttaW5TZWxsU2lnbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwMJAAACBQdhc3NldElkCQDYBAEFDHdhdmVzQXNzZXRJZAYJAAACBQdhc3NldElkAgVXQVZFUwkAZgIFDG1pblNlbGxXYXZlcwUFcHJpY2UHCQECIT0CBQVwcmljZQAABwkAAgECGFdyb25nIG1pbmltdW0gc2VsbCBwcmljZQYBDWdldEJpZEFzc2V0SWQBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEKYmlkRGF0YUtleQQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgMJAAACBQdiaWREYXRhAgAJAAIBAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8ECWJpZEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJpZERhdGFBcnIAAQQKYmlkQXNzZXRJZAkBDWdldEJpZEFzc2V0SWQBCQCRAwIFCmJpZERhdGFBcnIAAAMJAGcCAAAFCWJpZEFtb3VudAkAAgECDFdyb25nIGFtb3VudAkAlAoCBQliaWRBbW91bnQFCmJpZEFzc2V0SWQBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIBaQZwdWJLZXkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cEC2lzU3BvbnNvcmVkAwkBAiE9AgUGcHViS2V5AgAJAQt2YWx1ZU9yRWxzZQIJAQ5jaGVja1doaXRlbGlzdAEJAKwCAgkApQgBCQCnCAEJANkEAQUGcHViS2V5AglfZnJlZV90eHMAAAAABAZjYWxsZXIDAwkAAAIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkApQgBBQR0aGlzCQBmAgULaXNTcG9uc29yZWQAAAcJAKUIAQkApwgBCQDZBAEFBnB1YktleQkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBNnZXRfc3BvbnNvcmVkX3dhdmVzAwMJAQIhPQIFBnB1YktleQIACQBmAgULaXNTcG9uc29yZWQAAAcJAPwHBAUNd2hpdGVsaXN0RGFwcAIJdXNlRnJlZVR4CQDMCAIJAKUIAQkApwgBCQDZBAEFBnB1YktleQUDbmlsBQNuaWwFBHVuaXQDCQAAAgUTZ2V0X3Nwb25zb3JlZF93YXZlcwUTZ2V0X3Nwb25zb3JlZF93YXZlcwkAlgoECQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFBmNhbGxlcggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAGYCBQtpc1Nwb25zb3JlZAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxpZENhbGxlckRhdGUBAWkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQdidXlNaW50BQFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMTI5NzcxMzAzNgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMTI5NzcxMzAzNgJfMQQGY2FsbGVyCAUNJHQwMTI5NzcxMzAzNgJfMgQEZGF0ZQgFDSR0MDEyOTc3MTMwMzYCXzMEBWlzQmlkAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIFBmNhbGxlcgUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEBnNpZ25JRAkBDmdldFN0cmluZ0J5S2V5AQkBCWtleVNpZ25JRAIFBmlzc3VlcgUFYXJ0SWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyCQBoAgUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQACCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCGtleVByaWNlAgUGaXNzdWVyBQVhcnRJZAQMcHJpY2VBc3NldElkAwUOY2FsbGVySXNJc3N1ZXIJANgEAQULc2lnbkFzc2V0SWQJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwMDCQEBIQEFBWlzQmlkCQEBIQEFDmNhbGxlcklzSXNzdWVyBwMDCQBnAgAABQxhcnR3b3JrUHJpY2UGCQEBIQEFCGlzT25TYWxlBgkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFBWlzQmlkBQ5jYWxsZXJJc0lzc3VlcgcJAGcCAAAFCm1heENhblNlbGwHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmlzc3VlcgMDBQVpc0JpZAkBAiE9AgUJY2hlY2tVc2VyAgAHCQACAQUJY2hlY2tVc2VyBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQNJHQwMTQ1NTUxNDc0NwMFBWlzQmlkCQEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEFCmJpZERhdGFLZXkJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAUMYXJ0d29ya1ByaWNlBAZhbW91bnQIBQ0kdDAxNDU1NTE0NzQ3Al8xBAdhc3NldElkCAUNJHQwMTQ1NTUxNDc0NwJfMgQFYWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARJrZXlBcnRpc3RBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBAphZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBBQZpc3N1ZXIAAAQLcHVibGljQWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBBBwdWJsaWNBZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEaa2V5UHJpbWFyeVNoYXJlUHVibGljQWdlbnQBBQZpc3N1ZXIAAAQNaXNXaGl0ZWxpc3RlZAkBDmNoZWNrV2hpdGVsaXN0AQUGaXNzdWVyBANjdXQDCQBmAgUNaXNXaGl0ZWxpc3RlZAUGaGVpZ2h0AAADCQAAAgUHYXNzZXRJZAULc2lnbkFzc2V0SWQFB3NpZ25DdXQFC3VzZG5XYXZlQ3V0BA1hbW91bnRGb3JTaWduCQBrAwUGYW1vdW50BQNjdXQAZAQOYW1vdW50Rm9yQWdlbnQDAwMJAQIhPQIFBWFnZW50BQtmZWVSZWNlaXZlcgkAZgIFCmFnZW50U2hhcmUAAAcJAGYCBQZoZWlnaHQFDWlzV2hpdGVsaXN0ZWQHCQBrAwUGYW1vdW50BQphZ2VudFNoYXJlAGQAAAQUYW1vdW50Rm9yUHVibGljQWdlbnQDAwMJAQIhPQIFC3B1YmxpY0FnZW50BQtmZWVSZWNlaXZlcgkAZgIFEHB1YmxpY0FnZW50U2hhcmUAAAcJAGYCBQZoZWlnaHQFDWlzV2hpdGVsaXN0ZWQHCQBrAwUGYW1vdW50BRBwdWJsaWNBZ2VudFNoYXJlAGQAAAQQYW1vdW50Rm9yQ3JlYXRvcgkAZQIJAGUCBQZhbW91bnQFDWFtb3VudEZvclNpZ24FFGFtb3VudEZvclB1YmxpY0FnZW50AwkAAAIFCmFtb3VudFNvbGQFCm1heENhblNlbGwJAAIBAgxBcnQgc29sZCBvdXQEDW5ld0Ftb3VudFNvbGQJAGQCBQphbW91bnRTb2xkAAEECWlzc3VlTWV0YQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUGaXNzdWVyAgosCiBBcnRJRDogBQVhcnRJZAILLAogU2lnbklEOiAFBnNpZ25JRAIRLAogQXJ0d29yayBuYW1lOiAFC2FydHdvcmtOYW1lAgosCiBJc3N1ZTogCQCkAwEFDW5ld0Ftb3VudFNvbGQCAS8JAKQDAQUKbWF4Q2FuU2VsbAQIaXNzdWVORlQJAMIIBQkArAICAgNTQV8JAKQDAQkAZAIFCHRvdGFsTkZUAAEFCWlzc3VlTWV0YQABAAAHBAVpZE5GVAkAuAgBBQhpc3N1ZU5GVAQKc2VsbFN0YXR1cwMDCQAAAgUNbmV3QW1vdW50U29sZAUKbWF4Q2FuU2VsbAYJAQEhAQUIaXNPblNhbGUHBgQKcmVjZWl2ZU5GVAMDAwkAAAIFBmNhbGxlcgUGaXNzdWVyCQECIT0CBQhiaWRPd25lcgIABwkBAiE9AgUFYmlkSWQCAAcJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGJpZE93bmVyCAUBaQZjYWxsZXIECmFzc2V0SWRCaWQDCQEBIQEJAQlpc0RlZmluZWQBBQdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBBQdhc3NldElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWREZWxPbGQJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZFVwZGF0ZQkBC1N0cmluZ0VudHJ5AgkArAICBQpiaWREYXRhS2V5AgdfQ0xPU0VECQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlBAdzb2xkS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQ1uZXdBbW91bnRTb2xkAgRfb2ZfCQCkAwEFCm1heENhblNlbGwCAV8FBWFydElkAgFfBQZpc3N1ZXIECXNvbGRWYWx1ZQMJAQEhAQUFaXNCaWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGY2FsbGVyAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFDGFydHdvcmtQcmljZQIBXwUMcHJpY2VBc3NldElkAgFfCQDYBAEFBWlkTkZUCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQUKcmVjZWl2ZU5GVAIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQZhbW91bnQCAV8FCmFzc2V0SWRCaWQCAV8JANgEAQUFaWRORlQECHNvbGREYXRhCQELU3RyaW5nRW50cnkCBQdzb2xkS2V5BQlzb2xkVmFsdWUEFGNvbW1pc3Npb25zV2l0aEFnZW50AwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIJAGUCBQ1hbW91bnRGb3JTaWduBQ5hbW91bnRGb3JBZ2VudAUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUFYWdlbnQFDmFtb3VudEZvckFnZW50BQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyBQ1hbW91bnRGb3JTaWduBQdhc3NldElkBQNuaWwEGmNvbW1pc3Npb25zV2l0aFB1YmxpY0FnZW50AwkBAiE9AgUUYW1vdW50Rm9yUHVibGljQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULcHVibGljQWdlbnQFFGFtb3VudEZvclB1YmxpY0FnZW50BQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIJAGUCBRBhbW91bnRGb3JDcmVhdG9yBRRhbW91bnRGb3JQdWJsaWNBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIFEGFtb3VudEZvckNyZWF0b3IFB2Fzc2V0SWQFA25pbAQGYnV5UmVzCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQFDW5ld0Ftb3VudFNvbGQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgRuZnRfCQDYBAEFBWlkTkZUBQdzb2xkS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUIdG90YWxORlQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIFCGlzc3VlTkZUCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCnJlY2VpdmVORlQAAQUFaWRORlQFA25pbAUUY29tbWlzc2lvbnNXaXRoQWdlbnQFGmNvbW1pc3Npb25zV2l0aFB1YmxpY0FnZW50AwUFaXNCaWQJAMwIAgUIc29sZERhdGEJAMwIAgUJYmlkVXBkYXRlCQDMCAIFCWJpZERlbE9sZAUGYnV5UmVzCQDMCAIFCHNvbGREYXRhBQZidXlSZXMBCGFzU3RyaW5nAQJidgQHJG1hdGNoMAUCYnYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANidjAFByRtYXRjaDAFA2J2MAkAAgECJFNwb25zb3JlZCBQdWJsaWMgS2V5IFN0cmluZyBleHBlY3RlZAoGaW52b2tlAQdzZXRDb25mAgNrZXkDdmFsBAZjYWxsZXIJAKUIAQgFBmludm9rZQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBCGNvbnRhaW5zAgUDa2V5AgVjb25mXwkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsCQACAQIgRW50cmllcyBzdGFydGluZyB3aXRoIGNvbmZfIG9ubHkJAAIBAiJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzAWkBCmFkZEFydHdvcmsOCnNoYTI1Nkhhc2gGc2lnbklEBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5BA0kdDAxOTY3NjE5NzQ5CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAVhcnRJZAgFDSR0MDE5Njc2MTk3NDkCXzEEBmNhbGxlcggFDSR0MDE5Njc2MTk3NDkCXzIEBGRhdGUIBQ0kdDAxOTY3NjE5NzQ5Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDE5Njc2MTk3NDkCXzQDCQEBIQEJAQx2YWxpZGF0ZUhhc2gBBQpzaGEyNTZIYXNoCQACAQIkSGFzaCBzaG91bGQgYmUgNjQgY2hhcmFjdGVycyBtYXhpbXVtBA0kdDAxOTg1MDE5OTE5CQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAxOTg1MDE5OTE5Al8xBAtsaWNlbmNlSGFzaAgFDSR0MDE5ODUwMTk5MTkCXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBBB3aGl0ZWxpc3RlZF9kcm9wCQBmAgkBDmNoZWNrV2hpdGVsaXN0AQkArAICBQZjYWxsZXICC19mcmVlX2Ryb3BzAAAEDSR0MDIwMjE4MjAzMDIDBRB3aGl0ZWxpc3RlZF9kcm9wCQCUCgIAAAUGc2lnbklECQEPdmFsaWRhdGVQYXltZW50AQUBaQQGYW1vdW50CAUNJHQwMjAyMTgyMDMwMgJfMQQHYXNzZXRJZAgFDSR0MDIwMjE4MjAzMDICXzIDCQEBIQEJAQlpc0RlZmluZWQBBQZhbW91bnQJAAIBAhRTb21ldGhpbmcgd2VudCB3cm9uZwQKZW50cnlFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleVR4aWRCeUhhc2hPd25lcgIFCnNoYTI1Nkhhc2gFBmNhbGxlcgMJAQIhPQIFCmVudHJ5RXhpc3QCAAkAAgECFFlvdSBhbHJlYWR5IGFkZGVkIGl0BAloYXNoRXhpc3QJAQ5nZXRTdHJpbmdCeUtleQEJAQ5rZXlPd25lckJ5SGFzaAEFCnNoYTI1Nkhhc2gDCQECIT0CBQloYXNoRXhpc3QCAAkAAgECF0hhc2ggYWxyZWFkeSByZWdpc3RlcmVkBA9pc1NpZ25DZXJ0aWZpZWQJARRjaGVja1NpZ25DZXJ0aWZpY2F0ZQMFBnNpZ25JRAUGY2FsbGVyBQpzaGEyNTZIYXNoAwkBASEBBQ9pc1NpZ25DZXJ0aWZpZWQJAAIBAixTaWduIENlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgdGhpcyBhZGRyZXNzLgQXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3ADBRB3aGl0ZWxpc3RlZF9kcm9wCQD8BwQFDXdoaXRlbGlzdERhcHACC3VzZUZyZWVEcm9wCQDMCAIFBmNhbGxlcgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AFF2RlY3JlYXNlX3doaXRlbGlzdF9kcm9wBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlPd25lckJ5SGFzaAEFCnNoYTI1Nkhhc2gFBmNhbGxlcgkAzAgCCQELU3RyaW5nRW50cnkCCQESa2V5VHhpZEJ5SGFzaE93bmVyAgUKc2hhMjU2SGFzaAUGY2FsbGVyBQVhcnRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBB2tleURhdGUCBQZjYWxsZXIFBWFydElkBQRkYXRlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQVhcnRJZAUEbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5RGVzYwIFBmNhbGxlcgUFYXJ0SWQFC2Rlc2NyaXB0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlEaXNwbGF5Q2lkAgUGY2FsbGVyBQVhcnRJZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQVhcnRJZAUJY2lkRXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlFeHBvcnRIYXNoAgUGY2FsbGVyBQVhcnRJZAUMc2hhMjU2RXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlMaWNlbmNlSGFzaAIFBmNhbGxlcgUFYXJ0SWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlMaWNlbmNlQ2lkAgUGY2FsbGVyBQVhcnRJZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VHlwZQIFBmNhbGxlcgUFYXJ0SWQFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVRhZ3MCBQZjYWxsZXIFBWFydElkBQR0YWdzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQAAAkAzAgCCQELU3RyaW5nRW50cnkCCQEJa2V5U2lnbklEAgUGY2FsbGVyBQVhcnRJZAUGc2lnbklECQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGY2FsbGVyBQVhcnRJZAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleWlkQnlTaWduaWQCBQZjYWxsZXIFBnNpZ25JRAUFYXJ0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUhhc2hCeVR4aWRBZGRyAgUGY2FsbGVyBQVhcnRJZAUKc2hhMjU2SGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5Q3Jhd2xlcgIFBmNhbGxlcgUFYXJ0SWQFB2NyYXdsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlSb3lhbHRpZXMCBQZjYWxsZXIFBWFydElkBQlyb3lhbHRpZXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyBQZhbW91bnQFC3NpZ25Bc3NldElkBQNuaWwFCnR4VG9DYWxsZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENdXBkYXRlQXJ0d29yaw0EdHhpZARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEdHlwZQpjaWREaXNwbGF5DHNoYTI1NkV4cG9ydAljaWRFeHBvcnQNc2hhMjU2TGljZW5jZQpjaWRMaWNlbmNlB2NyYXdsZXIJcm95YWx0aWVzBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQNJHQwMjMzMzYyMzQwNgkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyMzMzNjIzNDA2Al8xBAZjYWxsZXIIBQ0kdDAyMzMzNjIzNDA2Al8yBARkYXRlCAUNJHQwMjMzMzYyMzQwNgJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyMzMzNjIzNDA2Al80BA0kdDAyMzQxNjIzNDg1CQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAyMzQxNjIzNDg1Al8xBAtsaWNlbmNlSGFzaAgFDSR0MDIzNDE2MjM0ODUCXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAMJAAACBQplbnRyeUV4aXN0AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQR0eGlkAwkAAAIFBGZsYWcCB0lMTEVHQUwJAAIBAh1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQEhAQkBC2lzQXJ0TWludGVkAgUGY2FsbGVyBQR0eGlkBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQR0eGlkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUEdHhpZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQR0eGlkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBHR4aWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUEdHhpZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBHR4aWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQR0eGlkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQR0eGlkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQR0eGlkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQR0eGlkBQlyb3lhbHRpZXMFA25pbAUKdHhUb0NhbGxlcgkAAgECDkFscmVhZHkgbWludGVkAWkBC2ZsYWdBcnR3b3JrBAVhcnRJZARhZGRyBGZsYWcEbm90ZQQNJHQwMjUxMTIyNTE0NgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjUxMTIyNTE0NgJfMQQGY2FsbGVyCAUNJHQwMjUxMTIyNTE0NgJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgdDT05TRU5UCQDMCAICAAkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleUZsYWcCBQRhZGRyBQVhcnRJZAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5Tm90ZQIFBGFkZHIFBWFydElkBQRub3RlBQNuaWwJAAIBCQCsAgICDlVua25vdyBzdGF0dXMgBQRmbGFnCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAFpAQ1kZWxldGVBcnR3b3JrAgVhcnRJZARhZGRyBA0kdDAyNTU4MjI1NjE2CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNTU4MjI1NjE2Al8xBAZjYWxsZXIIBQ0kdDAyNTU4MjI1NjE2Al8yBAlhZGRyVG9Vc2UDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQRhZGRyBQZjYWxsZXIECmVudHJ5RXhpc3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQplbnRyeUV4aXN0AgAJAAIBAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQKc2hhMjU2SGFzaAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUhhc2hCeVR4aWRBZGRyAgUJYWRkclRvVXNlBQVhcnRJZAMJAAACBQpzaGEyNTZIYXNoAgAJAAIBAiVObyBhcnQgaGFzaCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBAZzaWduSUQJAQ5nZXRTdHJpbmdCeUtleQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkAwkAAAIFBnNpZ25JRAIACQACAQITTm8gU0lHTiBJRCBtYXRjaGluZwQMZGF0YVRvRGVsZXRlCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEYXRlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5TmFtZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleURlc2MCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlEaXNwbGF5Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5RXhwb3J0Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RXhwb3J0SGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleUxpY2VuY2VIYXNoAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5TGljZW5jZUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVR5cGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUYWdzAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5TWF4TWludAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleVNpZ25JRAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleU9uU2FsZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleUZsYWcCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQhrZXlQcmljZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleUFzc2V0SWRBY2NlcHRlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5aWRCeVNpZ25pZAIFCWFkZHJUb1VzZQUGc2lnbklECQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlUeGlkQnlIYXNoT3duZXICBQpzaGEyNTZIYXNoBQlhZGRyVG9Vc2UJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUVuZFNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOb3RlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5Q3Jhd2xlcgIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleVJveWFsdGllcwIFCWFkZHJUb1VzZQUFYXJ0SWQFA25pbAMJAQEhAQkBC2lzQXJ0TWludGVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwUMZGF0YVRvRGVsZXRlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUMZGF0YVRvRGVsZXRlCQACAQIoQXJ0IGFscmVhZHkgbWludGVkLCB5b3UgY2Fubm90IGRlbGV0ZSBpdAFpAQtzZWxsQXJ0d29yawYFYXJ0SWQFcHJpY2UHbWF4TWludAdhc3NldElkCGJsb2NrRW5kBnB1YktleQQNJHQwMjg0NTIyODUyMgkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyODQ1MjI4NTIyAl8xBAZjYWxsZXIIBQ0kdDAyODQ1MjI4NTIyAl8yBARkYXRlCAUNJHQwMjg0NTIyODUyMgJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyODQ1MjI4NTIyAl80BAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAiNUaGlzIGFydCBkb2Vzbid0IG1hdGNoIHlvdXIgYWNjb3VudAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBWFydElkAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQBmAgAABQhibG9ja0VuZAkAAgECDE5lZ2F0aXZlIGVuZAMDCQBmAgUIYmxvY2tFbmQAAAMJAQIhPQIFB21heE1pbnQAAQYJAQIhPQIFBXByaWNlAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQKYmFzZUhlaWdodAMJAAACBQhibG9ja0VuZAAAAAAFBmhlaWdodAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAgUHYXNzZXRJZAUFcHJpY2UJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQDCQBmAgUHbWF4TWludABkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQphbW91bnRTb2xkAAAJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQphbW91bnRTb2xkAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFBmJpZE5icgAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECMUNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSB3aXRoIGFjdGl2ZSBvcmRlcnMECnNlbGxTdGF0dXMDAwkAZgIFBXByaWNlAAAJAGYCBQdtYXhNaW50AAAHBgcECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEIa2V5UHJpY2UCBQZjYWxsZXIFBWFydElkBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkBQdtYXhNaW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZjYWxsZXIFBWFydElkBQdhc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmNhbGxlcgUFYXJ0SWQJAGQCBQpiYXNlSGVpZ2h0BQhibG9ja0VuZAUDbmlsBQp0eFRvQ2FsbGVyAWkBCmJ1eUFydHdvcmsCBWFydElkBmlzc3VlcgkBB2J1eU1pbnQFBQFpBQVhcnRJZAUGaXNzdWVyAgACAAFpAQZzZXRCaWQCBWFydElkBmlzc3VlcgQNJHQwMzA5MDAzMDk0MAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzA5MDAzMDk0MAJfMQQGY2FsbGVyCAUNJHQwMzA5MDAzMDk0MAJfMgQEZGF0ZQgFDSR0MDMwOTAwMzA5NDACXzMEDSR0MDMwOTQ1MzA5ODEJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMzA5NDUzMDk4MQJfMQQGYW1vdW50CAUNJHQwMzA5NDUzMDk4MQJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQECGJsb2NrRW5kCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAwMJAQIhPQIFCGJsb2NrRW5kAAAJAGcCBQZoZWlnaHQFCGJsb2NrRW5kBwkAAgECC1NhbGUgZW5kZWQuBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAIFB2Fzc2V0SWQFBmFtb3VudAkAAgECDldyb25nIG1pbiBzZWxsBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDCQBnAgAABQptYXhDYW5TZWxsCQACAQIjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQBnAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUGY2FsbGVyAgFfBQJpZAIFX09QRU4JAKwCAgkArAICCQCsAgIJAKwCAgUHYXNzZXRJZAIBXwkApAMBBQZhbW91bnQCAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBkAgUGYmlkTmJyAAEFA25pbAFpAQlhY2NlcHRCaWQEBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMzIxMzkzMjE3OQkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzIxMzkzMjE3OQJfMQQGY2FsbGVyCAUNJHQwMzIxMzkzMjE3OQJfMgQEZGF0ZQgFDSR0MDMyMTM5MzIxNzkCXzMDCQECIT0CBQZjYWxsZXIFBmlzc3VlcgkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24JAQdidXlNaW50BQUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQFCGJpZE93bmVyAWkBCWNhbmNlbEJpZAQFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBA0kdDAzMjQwNTMyNDY2CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMjQwNTMyNDY2Al8xBAZjYWxsZXIIBQ0kdDAzMjQwNTMyNDY2Al8yBARkYXRlCAUNJHQwMzI0MDUzMjQ2NgJfMwMDCQECIT0CBQZjYWxsZXIFCGJpZE93bmVyCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBA1yZXR1cm5Nb25leVRvAwkAAAIFBmNhbGxlcgUGaXNzdWVyBQhiaWRPd25lcgUGY2FsbGVyBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQHYXNzZXRJZAkBDWdldEJpZEFzc2V0SWQBCQCRAwIFCmJpZERhdGFBcnIAAAQJYmlkU3RhdHVzAghDQU5DRUxFRAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQpiaWREYXRhS2V5AgFfBQliaWRTdGF0dXMJAKwCAgkArAICBQdiaWREYXRhAgFfCQCkAwEFBGRhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAkAZQIFBmJpZE5icgABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQ1yZXR1cm5Nb25leVRvCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBQdhc3NldElkBQNuaWwBAnR4AQh2ZXJpZmllcgAEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDADAwMDCQAAAggFA2ludghmdW5jdGlvbgIKYWRkQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwANAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CDXVwZGF0ZUFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MADAMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAgtzZWxsQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwAFCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5CQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5OnQiMQ==", "height": 2432865, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DXnmo71TY1882JhgNw62Xx3aiYWPCEjVtcK4fTuDCF4F Next: 5vjAnsL7J8xXk5hvPcnWpjerCnWuHxAkaiFGQ9LJN8vF Diff:
OldNewDifferences
158158 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
159159
160160
161-func keyPrimaryShare (artistAddr) = ("artist_agent_primary_" + artistAddr)
161+func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
162+
163+
164+func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
165+
166+
167+func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
162168
163169
164170 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
257263
258264
259265 func validatePayment (i) = {
260- let $t089078943 = isPayment(i)
261- let payment = $t089078943._1
262- let amount = $t089078943._2
266+ let $t091809216 = isPayment(i)
267+ let payment = $t091809216._1
268+ let amount = $t091809216._2
263269 let assetId = if (if (isDefined(payment.assetId))
264270 then (payment.assetId == signAssetId)
265271 else false)
282288
283289
284290 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
285- let $t095319567 = isPayment(i)
286- let payment = $t095319567._1
287- let amount = $t095319567._2
291+ let $t098049840 = isPayment(i)
292+ let payment = $t098049840._1
293+ let amount = $t098049840._2
288294 let assetId = if (!(isDefined(payment.assetId)))
289295 then unit
290296 else if (if ((size(priceAssetId) > 0))
401407
402408
403409 func buyMint (i,artId,issuer,bidId,bidOwner) = {
404- let $t01270412763 = idCallerDate(i)
405- let id = $t01270412763._1
406- let caller = $t01270412763._2
407- let date = $t01270412763._3
410+ let $t01297713036 = idCallerDate(i)
411+ let id = $t01297713036._1
412+ let caller = $t01297713036._2
413+ let date = $t01297713036._3
408414 let isBid = if (if (if ((caller == issuer))
409415 then (bidOwner != "")
410416 else false)
460466 then throw(checkUser)
461467 else {
462468 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
463- let $t01428214433 = if (isBid)
469+ let $t01455514747 = if (isBid)
464470 then getPriceAssetIdFromBid(bidDataKey)
465471 else validatePriceAssetId(i, priceAssetId, artworkPrice)
466- let amount = $t01428214433._1
467- let assetId = $t01428214433._2
472+ let amount = $t01455514747._1
473+ let assetId = $t01455514747._2
468474 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
469- let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
475+ let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
476+ let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
477+ let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
470478 let isWhitelisted = checkWhitelist(issuer)
471479 let cut = if ((isWhitelisted > height))
472480 then 0
481489 else false)
482490 then fraction(amount, agentShare, 100)
483491 else 0
484- let amountForCreator = (amount - amountForSign)
492+ let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
493+ then (publicAgentShare > 0)
494+ else false)
495+ then (height > isWhitelisted)
496+ else false)
497+ then fraction(amount, publicAgentShare, 100)
498+ else 0
499+ let amountForCreator = ((amount - amountForSign) - amountForPublicAgent)
485500 if ((amountSold == maxCanSell))
486501 then throw("Art sold out")
487502 else {
516531 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
517532 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
518533 let soldData = StringEntry(soldKey, soldValue)
519- let commissions = if ((amountForAgent != 0))
534+ let commissionsWithAgent = if ((amountForAgent != 0))
520535 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
521536 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
522- 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)
537+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
538+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
539+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
540+ 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)
523541 if (isBid)
524542 then [soldData, bidUpdate, bidDelOld] :: buyRes
525543 else soldData :: buyRes
553571
554572 @Callable(i)
555573 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
556- let $t01841918492 = idCallerDateSponsored(i, pubKey)
557- let artId = $t01841918492._1
558- let caller = $t01841918492._2
559- let date = $t01841918492._3
560- let isSponsored = $t01841918492._4
574+ let $t01967619749 = idCallerDateSponsored(i, pubKey)
575+ let artId = $t01967619749._1
576+ let caller = $t01967619749._2
577+ let date = $t01967619749._3
578+ let isSponsored = $t01967619749._4
561579 if (!(validateHash(sha256Hash)))
562580 then throw("Hash should be 64 characters maximum")
563581 else {
564- let $t01859318662 = setLIcence(cidLicence, sha256Licence)
565- let licenceCID = $t01859318662._1
566- let licenceHash = $t01859318662._2
582+ let $t01985019919 = setLIcence(cidLicence, sha256Licence)
583+ let licenceCID = $t01985019919._1
584+ let licenceHash = $t01985019919._2
567585 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
568586 if ((validateArtwork != ""))
569587 then throw("Something went wrong!")
570588 else {
571589 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
572- let $t01896119045 = if (whitelisted_drop)
590+ let $t02021820302 = if (whitelisted_drop)
573591 then $Tuple2(0, signID)
574592 else validatePayment(i)
575- let amount = $t01896119045._1
576- let assetId = $t01896119045._2
593+ let amount = $t02021820302._1
594+ let assetId = $t02021820302._2
577595 if (!(isDefined(amount)))
578596 then throw("Something went wrong")
579597 else {
614632 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
615633 then throw(maintenanceMSG)
616634 else {
617- let $t02207922149 = idCallerDateSponsored(i, pubKey)
618- let id = $t02207922149._1
619- let caller = $t02207922149._2
620- let date = $t02207922149._3
621- let isSponsored = $t02207922149._4
622- let $t02215922228 = setLIcence(cidLicence, sha256Licence)
623- let licenceCID = $t02215922228._1
624- let licenceHash = $t02215922228._2
635+ let $t02333623406 = idCallerDateSponsored(i, pubKey)
636+ let id = $t02333623406._1
637+ let caller = $t02333623406._2
638+ let date = $t02333623406._3
639+ let isSponsored = $t02333623406._4
640+ let $t02341623485 = setLIcence(cidLicence, sha256Licence)
641+ let licenceCID = $t02341623485._1
642+ let licenceHash = $t02341623485._2
625643 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
626644 if ((validateArtwork != ""))
627645 then throw("Something went wrong!")
649667
650668 @Callable(i)
651669 func flagArtwork (artId,addr,flag,note) = {
652- let $t02385523889 = idCallerDate(i)
653- let id = $t02385523889._1
654- let caller = $t02385523889._2
670+ let $t02511225146 = idCallerDate(i)
671+ let id = $t02511225146._1
672+ let caller = $t02511225146._2
655673 if (containsElement([chris, toString(this)], caller))
656674 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
657675 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
663681
664682 @Callable(i)
665683 func deleteArtwork (artId,addr) = {
666- let $t02432524359 = idCallerDate(i)
667- let id = $t02432524359._1
668- let caller = $t02432524359._2
684+ let $t02558225616 = idCallerDate(i)
685+ let id = $t02558225616._1
686+ let caller = $t02558225616._2
669687 let addrToUse = if (containsElement([chris, toString(this)], caller))
670688 then addr
671689 else caller
698716
699717 @Callable(i)
700718 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
701- let $t02719527265 = idCallerDateSponsored(i, pubKey)
702- let id = $t02719527265._1
703- let caller = $t02719527265._2
704- let date = $t02719527265._3
705- let isSponsored = $t02719527265._4
719+ let $t02845228522 = idCallerDateSponsored(i, pubKey)
720+ let id = $t02845228522._1
721+ let caller = $t02845228522._2
722+ let date = $t02845228522._3
723+ let isSponsored = $t02845228522._4
706724 let artworkName = getStringByKey(keyName(caller, artId))
707725 if ((artworkName == ""))
708726 then throw("This art doesn't match your account")
776794
777795 @Callable(i)
778796 func setBid (artId,issuer) = {
779- let $t02964329683 = idCallerDate(i)
780- let id = $t02964329683._1
781- let caller = $t02964329683._2
782- let date = $t02964329683._3
783- let $t02968829724 = isPayment(i)
784- let payment = $t02968829724._1
785- let amount = $t02968829724._2
797+ let $t03090030940 = idCallerDate(i)
798+ let id = $t03090030940._1
799+ let caller = $t03090030940._2
800+ let date = $t03090030940._3
801+ let $t03094530981 = isPayment(i)
802+ let payment = $t03094530981._1
803+ let amount = $t03094530981._2
786804 let assetId = if (!(isDefined(payment.assetId)))
787805 then "WAVES"
788806 else toBase58String(value(payment.assetId))
813831
814832 @Callable(i)
815833 func acceptBid (artId,issuer,bidId,bidOwner) = {
816- let $t03088230922 = idCallerDate(i)
817- let id = $t03088230922._1
818- let caller = $t03088230922._2
819- let date = $t03088230922._3
834+ let $t03213932179 = idCallerDate(i)
835+ let id = $t03213932179._1
836+ let caller = $t03213932179._2
837+ let date = $t03213932179._3
820838 if ((caller != issuer))
821839 then throw("You cannot do this action")
822840 else buyMint(i, artId, issuer, bidId, bidOwner)
826844
827845 @Callable(i)
828846 func cancelBid (artId,issuer,bidId,bidOwner) = {
829- let $t03114831209 = idCallerDate(i)
830- let id = $t03114831209._1
831- let caller = $t03114831209._2
832- let date = $t03114831209._3
847+ let $t03240532466 = idCallerDate(i)
848+ let id = $t03240532466._1
849+ let caller = $t03240532466._2
850+ let date = $t03240532466._3
833851 if (if ((caller != bidOwner))
834852 then (caller != issuer)
835853 else false)
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
161-func keyPrimaryShare (artistAddr) = ("artist_agent_primary_" + artistAddr)
161+func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
162+
163+
164+func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
165+
166+
167+func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
162168
163169
164170 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
165171
166172
167173 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
168174
169175
170176 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
171177
172178
173179 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
174180
175181
176182 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
177183 then throw("Wrong Display CID")
178184 else if (!(validateCID(cidExport)))
179185 then throw("Wrong Export CID")
180186 else if (if ((cidLicence != ""))
181187 then !(validateCID(cidLicence))
182188 else false)
183189 then throw("Wrong Licence CID")
184190 else true
185191
186192
187193 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
188194 then throw("Export Hash 64 char. max")
189195 else if (!(validateHash(sha256Licence)))
190196 then throw("Licence Hash 64 char. max")
191197 else true
192198
193199
194200 func validateString (str,max) = if ((size(str) == 0))
195201 then throw("Field cannot be is empty")
196202 else if ((size(str) > max))
197203 then throw((str + " is too long"))
198204 else true
199205
200206
201207 func validateUser (caller) = {
202208 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
203209 if (if ((userStatus == userUnregistered))
204210 then true
205211 else (userStatus == userAllowed))
206212 then "Register this account first with \"Account\" tab"
207213 else if ((userStatus == userSuspended))
208214 then "Account suspended"
209215 else if ((userStatus == userRemoved))
210216 then "Account removed"
211217 else ""
212218 }
213219
214220
215221 func setLIcence (cidLicence,sha256Licence) = {
216222 let cid = if ((size(cidLicence) == 0))
217223 then defaultLicence
218224 else cidLicence
219225 let hash = if ((size(sha256Licence) == 0))
220226 then defaultHashLicence
221227 else sha256Licence
222228 $Tuple2(cid, hash)
223229 }
224230
225231
226232 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
227233 let checkUser = validateUser(caller)
228234 if ((checkUser != ""))
229235 then throw(checkUser)
230236 else if ((size(cidDisplay) == 0))
231237 then throw("Display CID cannot be empty")
232238 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
233239 then throw("Problem with CID")
234240 else if (!(validateAllHash(sha256Export, licenceHash)))
235241 then throw("Problem with Hashes")
236242 else if (!(validateString(name, 100)))
237243 then throw("100 Char. max name")
238244 else if (!(validateString(description, 1000)))
239245 then throw("1000 Char. max description")
240246 else if (if ((0 > royalties))
241247 then true
242248 else (royalties > 1000))
243249 then throw("Royalties cannot be less than 0% or higher than 10%")
244250 else if ((size(split(tags, ",")) > 5))
245251 then throw("5 tags max.")
246252 else ""
247253 }
248254
249255
250256 func isPayment (i) = if ((size(i.payments) == 0))
251257 then throw("No payment attached")
252258 else {
253259 let payment = value(i.payments[0])
254260 let amount = value(payment.amount)
255261 $Tuple2(payment, amount)
256262 }
257263
258264
259265 func validatePayment (i) = {
260- let $t089078943 = isPayment(i)
261- let payment = $t089078943._1
262- let amount = $t089078943._2
266+ let $t091809216 = isPayment(i)
267+ let payment = $t091809216._1
268+ let amount = $t091809216._2
263269 let assetId = if (if (isDefined(payment.assetId))
264270 then (payment.assetId == signAssetId)
265271 else false)
266272 then payment.assetId
267273 else throw("Only SIGN token accepted as transaction fee")
268274 if ((amount != currentCertificationPrice))
269275 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
270276 else $Tuple2(amount, assetId)
271277 }
272278
273279
274280 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
275281 case b: Int =>
276282 if ((b != 0))
277283 then true
278284 else false
279285 case _ =>
280286 false
281287 }
282288
283289
284290 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
285- let $t095319567 = isPayment(i)
286- let payment = $t095319567._1
287- let amount = $t095319567._2
291+ let $t098049840 = isPayment(i)
292+ let payment = $t098049840._1
293+ let amount = $t098049840._2
288294 let assetId = if (!(isDefined(payment.assetId)))
289295 then unit
290296 else if (if ((size(priceAssetId) > 0))
291297 then (toBase58String(value(payment.assetId)) == priceAssetId)
292298 else false)
293299 then payment.assetId
294300 else throw("Wrong asset id")
295301 if (if ((assetId == unit))
296302 then (priceAssetId != "")
297303 else false)
298304 then throw("Wrong asset id")
299305 else if ((artworkPrice != amount))
300306 then throw("Payment don't match")
301307 else $Tuple2(amount, assetId)
302308 }
303309
304310
305311 func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
306312 then (assetId != toBase58String(wavesAssetId))
307313 else false)
308314 then (assetId != "WAVES")
309315 else false)
310316 then (assetId != toBase58String(usdnAssetId))
311317 else false)
312318 then (assetId != toBase58String(usdtAssetId))
313319 else false)
314320 then throw("Only SIGN, USDN,USDT or WAVES accepted")
315321 else true
316322
317323
318324 func validateMinSell (assetId,price) = {
319325 let minSellWaves = if (unitTest)
320326 then 10
321327 else getIntegerByKeyFromOracle("waves_min_sell")
322328 let minSellUsdn = 1000000
323329 let minSellSign = if (unitTest)
324330 then 1
325331 else (currentCertificationPrice * 2)
326332 if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
327333 then (minSellUsdn > price)
328334 else false)
329335 then (price != 0)
330336 else false)
331337 then true
332338 else if (if ((assetId == toBase58String(usdtAssetId)))
333339 then (minSellUsdn > price)
334340 else false)
335341 then (price != 0)
336342 else false)
337343 then true
338344 else if (if ((assetId == toBase58String(signAssetId)))
339345 then (minSellSign > price)
340346 else false)
341347 then (price != 0)
342348 else false)
343349 then true
344350 else if (if (if ((assetId == toBase58String(wavesAssetId)))
345351 then true
346352 else (assetId == "WAVES"))
347353 then (minSellWaves > price)
348354 else false)
349355 then (price != 0)
350356 else false)
351357 then throw("Wrong minimum sell price")
352358 else true
353359 }
354360
355361
356362 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
357363 then unit
358364 else fromBase58String(assetId)
359365
360366
361367 func getPriceAssetIdFromBid (bidDataKey) = {
362368 let bidData = getStringByKey((bidDataKey + "_OPEN"))
363369 if ((bidData == ""))
364370 then throw("Bid not found")
365371 else {
366372 let bidDataArr = split(bidData, "_")
367373 let bidAmount = parseIntValue(bidDataArr[1])
368374 let bidAssetId = getBidAssetId(bidDataArr[0])
369375 if ((0 >= bidAmount))
370376 then throw("Wrong amount")
371377 else $Tuple2(bidAmount, bidAssetId)
372378 }
373379 }
374380
375381
376382 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
377383 then throw(maintenanceMSG)
378384 else {
379385 let isSponsored = if ((pubKey != ""))
380386 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
381387 else 0
382388 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
383389 then (isSponsored > 0)
384390 else false)
385391 then toString(addressFromPublicKey(fromBase58String(pubKey)))
386392 else toBase58String(i.caller.bytes)
387393 let get_sponsored_waves = if (if ((pubKey != ""))
388394 then (isSponsored > 0)
389395 else false)
390396 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
391397 else unit
392398 if ((get_sponsored_waves == get_sponsored_waves))
393399 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
394400 else throw("Strict value is not equal to itself.")
395401 }
396402
397403
398404 func idCallerDate (i) = if (!(dappRunning))
399405 then throw(maintenanceMSG)
400406 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
401407
402408
403409 func buyMint (i,artId,issuer,bidId,bidOwner) = {
404- let $t01270412763 = idCallerDate(i)
405- let id = $t01270412763._1
406- let caller = $t01270412763._2
407- let date = $t01270412763._3
410+ let $t01297713036 = idCallerDate(i)
411+ let id = $t01297713036._1
412+ let caller = $t01297713036._2
413+ let date = $t01297713036._3
408414 let isBid = if (if (if ((caller == issuer))
409415 then (bidOwner != "")
410416 else false)
411417 then (bidId != "")
412418 else false)
413419 then true
414420 else false
415421 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
416422 if (if (if ((blockEnd != 0))
417423 then (height >= blockEnd)
418424 else false)
419425 then !(isBid)
420426 else false)
421427 then throw("Sale ended.")
422428 else {
423429 let callerIsIssuer = (caller == issuer)
424430 let totalNFT = getIntegerByKey("total_nft_issued")
425431 let signID = getStringByKey(keySignID(issuer, artId))
426432 let artworkName = getStringByKey(keyName(issuer, artId))
427433 if ((artworkName == ""))
428434 then throw("Art doesn't exist")
429435 else {
430436 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
431437 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
432438 let artworkPrice = if (callerIsIssuer)
433439 then (currentCertificationPrice * 2)
434440 else getIntegerByKey(keyPrice(issuer, artId))
435441 let priceAssetId = if (callerIsIssuer)
436442 then toBase58String(signAssetId)
437443 else getStringByKey(keyAssetIdAccepted(issuer, artId))
438444 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
439445 if (if (if (!(isBid))
440446 then !(callerIsIssuer)
441447 else false)
442448 then if (if ((0 >= artworkPrice))
443449 then true
444450 else !(isOnSale))
445451 then true
446452 else (0 >= maxCanSell)
447453 else false)
448454 then throw("Art not for sale")
449455 else if (if (if (!(isBid))
450456 then callerIsIssuer
451457 else false)
452458 then (0 >= maxCanSell)
453459 else false)
454460 then throw("Max issuable not set")
455461 else {
456462 let checkUser = validateUser(issuer)
457463 if (if (isBid)
458464 then (checkUser != "")
459465 else false)
460466 then throw(checkUser)
461467 else {
462468 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
463- let $t01428214433 = if (isBid)
469+ let $t01455514747 = if (isBid)
464470 then getPriceAssetIdFromBid(bidDataKey)
465471 else validatePriceAssetId(i, priceAssetId, artworkPrice)
466- let amount = $t01428214433._1
467- let assetId = $t01428214433._2
472+ let amount = $t01455514747._1
473+ let assetId = $t01455514747._2
468474 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
469- let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
475+ let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
476+ let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
477+ let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
470478 let isWhitelisted = checkWhitelist(issuer)
471479 let cut = if ((isWhitelisted > height))
472480 then 0
473481 else if ((assetId == signAssetId))
474482 then signCut
475483 else usdnWaveCut
476484 let amountForSign = fraction(amount, cut, 100)
477485 let amountForAgent = if (if (if ((agent != feeReceiver))
478486 then (agentShare > 0)
479487 else false)
480488 then (height > isWhitelisted)
481489 else false)
482490 then fraction(amount, agentShare, 100)
483491 else 0
484- let amountForCreator = (amount - amountForSign)
492+ let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
493+ then (publicAgentShare > 0)
494+ else false)
495+ then (height > isWhitelisted)
496+ else false)
497+ then fraction(amount, publicAgentShare, 100)
498+ else 0
499+ let amountForCreator = ((amount - amountForSign) - amountForPublicAgent)
485500 if ((amountSold == maxCanSell))
486501 then throw("Art sold out")
487502 else {
488503 let newAmountSold = (amountSold + 1)
489504 let issueMeta = ((((((((((("Creator: " + issuer) + ",
490505 ArtID: ") + artId) + ",
491506 SignID: ") + signID) + ",
492507 Artwork name: ") + artworkName) + ",
493508 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
494509 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
495510 let idNFT = calculateAssetId(issueNFT)
496511 let sellStatus = if (if ((newAmountSold == maxCanSell))
497512 then true
498513 else !(isOnSale))
499514 then false
500515 else true
501516 let receiveNFT = if (if (if ((caller == issuer))
502517 then (bidOwner != "")
503518 else false)
504519 then (bidId != "")
505520 else false)
506521 then addressFromStringValue(bidOwner)
507522 else i.caller
508523 let assetIdBid = if (!(isDefined(assetId)))
509524 then "WAVES"
510525 else toBase58String(value(assetId))
511526 let bidData = getStringByKey((bidDataKey + "_OPEN"))
512527 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
513528 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
514529 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
515530 let soldValue = if (!(isBid))
516531 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
517532 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
518533 let soldData = StringEntry(soldKey, soldValue)
519- let commissions = if ((amountForAgent != 0))
534+ let commissionsWithAgent = if ((amountForAgent != 0))
520535 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
521536 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
522- 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)
537+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
538+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
539+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
540+ 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)
523541 if (isBid)
524542 then [soldData, bidUpdate, bidDelOld] :: buyRes
525543 else soldData :: buyRes
526544 }
527545 }
528546 }
529547 }
530548 }
531549 }
532550
533551
534552 func asString (bv) = match bv {
535553 case bv0: String =>
536554 bv0
537555 case _ =>
538556 throw("Sponsored Public Key String expected")
539557 }
540558
541559
542560 @Callable(invoke)
543561 func setConf (key,val) = {
544562 let caller = toString(invoke.caller)
545563 if (containsElement([chris, toString(this)], caller))
546564 then if (contains(key, "conf_"))
547565 then [StringEntry(key, val)]
548566 else throw("Entries starting with conf_ only")
549567 else throw("You are not allowed to change this")
550568 }
551569
552570
553571
554572 @Callable(i)
555573 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
556- let $t01841918492 = idCallerDateSponsored(i, pubKey)
557- let artId = $t01841918492._1
558- let caller = $t01841918492._2
559- let date = $t01841918492._3
560- let isSponsored = $t01841918492._4
574+ let $t01967619749 = idCallerDateSponsored(i, pubKey)
575+ let artId = $t01967619749._1
576+ let caller = $t01967619749._2
577+ let date = $t01967619749._3
578+ let isSponsored = $t01967619749._4
561579 if (!(validateHash(sha256Hash)))
562580 then throw("Hash should be 64 characters maximum")
563581 else {
564- let $t01859318662 = setLIcence(cidLicence, sha256Licence)
565- let licenceCID = $t01859318662._1
566- let licenceHash = $t01859318662._2
582+ let $t01985019919 = setLIcence(cidLicence, sha256Licence)
583+ let licenceCID = $t01985019919._1
584+ let licenceHash = $t01985019919._2
567585 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
568586 if ((validateArtwork != ""))
569587 then throw("Something went wrong!")
570588 else {
571589 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
572- let $t01896119045 = if (whitelisted_drop)
590+ let $t02021820302 = if (whitelisted_drop)
573591 then $Tuple2(0, signID)
574592 else validatePayment(i)
575- let amount = $t01896119045._1
576- let assetId = $t01896119045._2
593+ let amount = $t02021820302._1
594+ let assetId = $t02021820302._2
577595 if (!(isDefined(amount)))
578596 then throw("Something went wrong")
579597 else {
580598 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
581599 if ((entryExist != ""))
582600 then throw("You already added it")
583601 else {
584602 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
585603 if ((hashExist != ""))
586604 then throw("Hash already registered")
587605 else {
588606 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
589607 if (!(isSignCertified))
590608 then throw("Sign Certificate not found for this address.")
591609 else {
592610 let decrease_whitelist_drop = if (whitelisted_drop)
593611 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
594612 else unit
595613 if ((decrease_whitelist_drop == decrease_whitelist_drop))
596614 then {
597615 let txToCaller = if (isSponsored)
598616 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
599617 else nil
600618 ([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)
601619 }
602620 else throw("Strict value is not equal to itself.")
603621 }
604622 }
605623 }
606624 }
607625 }
608626 }
609627 }
610628
611629
612630
613631 @Callable(i)
614632 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
615633 then throw(maintenanceMSG)
616634 else {
617- let $t02207922149 = idCallerDateSponsored(i, pubKey)
618- let id = $t02207922149._1
619- let caller = $t02207922149._2
620- let date = $t02207922149._3
621- let isSponsored = $t02207922149._4
622- let $t02215922228 = setLIcence(cidLicence, sha256Licence)
623- let licenceCID = $t02215922228._1
624- let licenceHash = $t02215922228._2
635+ let $t02333623406 = idCallerDateSponsored(i, pubKey)
636+ let id = $t02333623406._1
637+ let caller = $t02333623406._2
638+ let date = $t02333623406._3
639+ let isSponsored = $t02333623406._4
640+ let $t02341623485 = setLIcence(cidLicence, sha256Licence)
641+ let licenceCID = $t02341623485._1
642+ let licenceHash = $t02341623485._2
625643 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
626644 if ((validateArtwork != ""))
627645 then throw("Something went wrong!")
628646 else {
629647 let entryExist = getStringByKey(keyName(caller, txid))
630648 if ((entryExist == ""))
631649 then throw("Entry not found")
632650 else {
633651 let flag = getStringByKey(keyFlag(caller, txid))
634652 if ((flag == "ILLEGAL"))
635653 then throw("Cannot update ILLEGAL artwork")
636654 else if (!(isArtMinted(caller, txid)))
637655 then {
638656 let txToCaller = if (isSponsored)
639657 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
640658 else nil
641659 ([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)
642660 }
643661 else throw("Already minted")
644662 }
645663 }
646664 }
647665
648666
649667
650668 @Callable(i)
651669 func flagArtwork (artId,addr,flag,note) = {
652- let $t02385523889 = idCallerDate(i)
653- let id = $t02385523889._1
654- let caller = $t02385523889._2
670+ let $t02511225146 = idCallerDate(i)
671+ let id = $t02511225146._1
672+ let caller = $t02511225146._2
655673 if (containsElement([chris, toString(this)], caller))
656674 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
657675 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
658676 else throw(("Unknow status " + flag))
659677 else throw("You are not allowed")
660678 }
661679
662680
663681
664682 @Callable(i)
665683 func deleteArtwork (artId,addr) = {
666- let $t02432524359 = idCallerDate(i)
667- let id = $t02432524359._1
668- let caller = $t02432524359._2
684+ let $t02558225616 = idCallerDate(i)
685+ let id = $t02558225616._1
686+ let caller = $t02558225616._2
669687 let addrToUse = if (containsElement([chris, toString(this)], caller))
670688 then addr
671689 else caller
672690 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
673691 if ((entryExist == ""))
674692 then throw("No art matching for this address")
675693 else {
676694 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
677695 if ((sha256Hash == ""))
678696 then throw("No art hash matching for this address")
679697 else {
680698 let signID = getStringByKey(keySignID(addrToUse, artId))
681699 if ((signID == ""))
682700 then throw("No SIGN ID matching")
683701 else {
684702 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))]
685703 if (!(isArtMinted(addrToUse, artId)))
686704 then if (!(dappRunning))
687705 then throw(maintenanceMSG)
688706 else dataToDelete
689707 else if (containsElement([chris, toString(this)], caller))
690708 then dataToDelete
691709 else throw("Art already minted, you cannot delete it")
692710 }
693711 }
694712 }
695713 }
696714
697715
698716
699717 @Callable(i)
700718 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
701- let $t02719527265 = idCallerDateSponsored(i, pubKey)
702- let id = $t02719527265._1
703- let caller = $t02719527265._2
704- let date = $t02719527265._3
705- let isSponsored = $t02719527265._4
719+ let $t02845228522 = idCallerDateSponsored(i, pubKey)
720+ let id = $t02845228522._1
721+ let caller = $t02845228522._2
722+ let date = $t02845228522._3
723+ let isSponsored = $t02845228522._4
706724 let artworkName = getStringByKey(keyName(caller, artId))
707725 if ((artworkName == ""))
708726 then throw("This art doesn't match your account")
709727 else {
710728 let flag = getStringByKey(keyFlag(caller, artId))
711729 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
712730 then throw("Flagged artwork")
713731 else {
714732 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
715733 if ((0 > blockEnd))
716734 then throw("Negative end")
717735 else if (if ((blockEnd > 0))
718736 then if ((maxMint != 1))
719737 then true
720738 else (price != 0)
721739 else false)
722740 then throw("Timed offer only allowed for unique edition and offer only")
723741 else {
724742 let baseHeight = if ((blockEnd == 0))
725743 then 0
726744 else height
727745 if (!(acceptedAssetIds(assetId)))
728746 then throw("Something went wrong!")
729747 else if (!(validateMinSell(assetId, price)))
730748 then throw("Something went wrong!")
731749 else {
732750 let checkUser = validateUser(caller)
733751 if ((checkUser != ""))
734752 then throw(checkUser)
735753 else {
736754 let amountSold = getIntegerByKey(keyIssued(caller, artId))
737755 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
738756 if ((maxMint > 100))
739757 then throw("100 editions max per artwork")
740758 else if (if ((amountSold != 0))
741759 then (amountSold == maxCanSell)
742760 else false)
743761 then throw("Max edition reached.")
744762 else if (if ((amountSold > 0))
745763 then (maxCanSell != maxMint)
746764 else false)
747765 then throw("Cannot change maximum issuable anymore")
748766 else if (if ((bidNbr > 0))
749767 then (maxCanSell != maxMint)
750768 else false)
751769 then throw("Cannot change maximum issuable with active orders")
752770 else {
753771 let sellStatus = if (if ((price > 0))
754772 then (maxMint > 0)
755773 else false)
756774 then true
757775 else false
758776 let txToCaller = if (isSponsored)
759777 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
760778 else nil
761779 ([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)
762780 }
763781 }
764782 }
765783 }
766784 }
767785 }
768786 }
769787
770788
771789
772790 @Callable(i)
773791 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
774792
775793
776794
777795 @Callable(i)
778796 func setBid (artId,issuer) = {
779- let $t02964329683 = idCallerDate(i)
780- let id = $t02964329683._1
781- let caller = $t02964329683._2
782- let date = $t02964329683._3
783- let $t02968829724 = isPayment(i)
784- let payment = $t02968829724._1
785- let amount = $t02968829724._2
797+ let $t03090030940 = idCallerDate(i)
798+ let id = $t03090030940._1
799+ let caller = $t03090030940._2
800+ let date = $t03090030940._3
801+ let $t03094530981 = isPayment(i)
802+ let payment = $t03094530981._1
803+ let amount = $t03094530981._2
786804 let assetId = if (!(isDefined(payment.assetId)))
787805 then "WAVES"
788806 else toBase58String(value(payment.assetId))
789807 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
790808 if (if ((blockEnd != 0))
791809 then (height >= blockEnd)
792810 else false)
793811 then throw("Sale ended.")
794812 else {
795813 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
796814 if (!(acceptedAssetIds(assetId)))
797815 then throw("asset not accepted")
798816 else if (!(validateMinSell(assetId, amount)))
799817 then throw("Wrong min sell")
800818 else {
801819 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
802820 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
803821 if ((0 >= maxCanSell))
804822 then throw("No max edition set for this artwork")
805823 else if ((amountSold >= maxCanSell))
806824 then throw("Sold out, you cannot bid")
807825 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
808826 }
809827 }
810828 }
811829
812830
813831
814832 @Callable(i)
815833 func acceptBid (artId,issuer,bidId,bidOwner) = {
816- let $t03088230922 = idCallerDate(i)
817- let id = $t03088230922._1
818- let caller = $t03088230922._2
819- let date = $t03088230922._3
834+ let $t03213932179 = idCallerDate(i)
835+ let id = $t03213932179._1
836+ let caller = $t03213932179._2
837+ let date = $t03213932179._3
820838 if ((caller != issuer))
821839 then throw("You cannot do this action")
822840 else buyMint(i, artId, issuer, bidId, bidOwner)
823841 }
824842
825843
826844
827845 @Callable(i)
828846 func cancelBid (artId,issuer,bidId,bidOwner) = {
829- let $t03114831209 = idCallerDate(i)
830- let id = $t03114831209._1
831- let caller = $t03114831209._2
832- let date = $t03114831209._3
847+ let $t03240532466 = idCallerDate(i)
848+ let id = $t03240532466._1
849+ let caller = $t03240532466._2
850+ let date = $t03240532466._3
833851 if (if ((caller != bidOwner))
834852 then (caller != issuer)
835853 else false)
836854 then throw("You cannot do this action")
837855 else {
838856 let returnMoneyTo = if ((caller == issuer))
839857 then bidOwner
840858 else caller
841859 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
842860 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
843861 let bidData = getStringByKey((bidDataKey + "_OPEN"))
844862 if ((bidData == ""))
845863 then throw("Bid not found")
846864 else {
847865 let bidDataArr = split(bidData, "_")
848866 let assetId = getBidAssetId(bidDataArr[0])
849867 let bidStatus = "CANCELED"
850868 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
851869 }
852870 }
853871 }
854872
855873
856874 @Verifier(tx)
857875 func verifier () = match tx {
858876 case inv: InvokeScriptTransaction =>
859877 if (if (if (if ((inv.function == "addArtwork"))
860878 then (inv.dApp == this)
861879 else false)
862880 then (inv.fee == 500000)
863881 else false)
864882 then (inv.feeAssetId == unit)
865883 else false)
866884 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
867885 else if (if (if (if ((inv.function == "updateArtwork"))
868886 then (inv.dApp == this)
869887 else false)
870888 then (inv.fee == 500000)
871889 else false)
872890 then (inv.feeAssetId == unit)
873891 else false)
874892 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
875893 else if (if (if (if ((inv.function == "sellArtwork"))
876894 then (inv.dApp == this)
877895 else false)
878896 then (inv.fee == 500000)
879897 else false)
880898 then (inv.feeAssetId == unit)
881899 else false)
882900 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
883901 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
884902 case _ =>
885903 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
886904 }
887905

github/deemru/w8io/873ac7e 
124.51 ms