tx · 3KuQPEvX3PEFBAezXhZ8ZaU6S1GegnTJAb9tGKrCBFj8

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02600000 Waves

2023.02.03 07:12 [2432941] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "3KuQPEvX3PEFBAezXhZ8ZaU6S1GegnTJAb9tGKrCBFj8", "fee": 2600000, "feeAssetId": null, "timestamp": 1675396356495, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "5pATMPy5es4Xvis3FQjw9rHG3gCYthqYw97LZWcirJbuvmLK18hCfRJYP8DFxQb6BAdA1p2cSHzW5PB9AuBBHQz6" ], "script": "base64:BgJfCAISBAoCCAgSEAoOCAgICAgICAgICAgIAQgSDwoNCAgICAgICAgICAgBCBIGCgQICAgIEgQKAggIEggKBggBAQgBCBIECgIICBIECgIICBIGCgQICAgIEgYKBAgICAhQAAdWRVJTSU9OAgYxLjEuMTABDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgAACHVuaXRUZXN0BwAJb3JhY2xlRmVlCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECD2NvbmZfb3JhY2xlX2ZlZQAIc2lnbkRhcHAJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9zaWdud2ViX2RhcHAAC2ZlZVJlY2VpdmVyCQEOZ2V0U3RyaW5nQnlLZXkBAhFjb25mX2ZlZV9yZWNlaXZlcgAIdXNlckRhcHADBQh1bml0VGVzdAkBBXZhbHVlAQkApggBAiMzTXQ0UkdNRXlqU1dZQW9jVFBxZDU1d2RIUVFCM1BVMlVDbQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX3VzZXJzX2RhcHAADXdoaXRlbGlzdERhcHAJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQITY29uZl93aGl0ZWxpc3RfZGFwcAALc2lnbkFzc2V0SWQJANkEAQkBDmdldFN0cmluZ0J5S2V5AQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAt1c2RuQXNzZXRJZAkA2QQBCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRE4AC3VzZHRBc3NldElkCQDZBAEJAQ5nZXRTdHJpbmdCeUtleQECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEVAAMd2F2ZXNBc3NldElkAQAABWNocmlzCQEOZ2V0U3RyaW5nQnlLZXkBAgxjb25mX2FkbWluXzEBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCW9yYWNsZUZlZQUDa2V5Ah9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlAQ9nZXRJbnRlZ2VyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEOY2hlY2tXaGl0ZWxpc3QBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ13aGl0ZWxpc3REYXBwBQNrZXkAAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwAHc2lnbkN1dAAHAAt1c2RuV2F2ZUN1dAAKAA5kZWZhdWx0TGljZW5jZQkBDmdldFN0cmluZ0J5S2V5AQIUY29uZl9kZWZhdWx0X2xpY2VuY2UAEmRlZmF1bHRIYXNoTGljZW5jZQkBDmdldFN0cmluZ0J5S2V5AQIZY29uZl9kZWZhdWx0X2xpY2VuY2VfaGFzaAALZGFwcFJ1bm5pbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUIdXNlckRhcHACFGNvbmZfZGFwcF9pc19ydW5uaW5nBgAObWFpbnRlbmFuY2VNU0cJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHACFGNvbmZfbWFpbnRlbmFuY2VfbXNnAgAADXVzZXJTdXNwZW5kZWQCCVNVU1BFTkRFRAALdXNlclJlbW92ZWQCB1JFTU9WRUQAEHVzZXJVbnJlZ2lzdGVyZWQCDFVOUkVHSVNURVJFRAALdXNlckFsbG93ZWQCB0FMTE9XRUQAGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJARlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAQkArAICAhJjZXJ0aWZpY2F0aW9uX2ZlZV8JANgEAQULc2lnbkFzc2V0SWQBE2dldEFydHdvcmtSb3lhbHRpZXMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkA6AcBFGNoZWNrU2lnbkNlcnRpZmljYXRlAwZzaWduSUQFT3duZXIKc2hhMjU2SGFzaAQHJG1hdGNoMAkAnQgCBQhzaWduRGFwcAkArAICCQCsAgIJAKwCAgIIZGF0YV9mY18FBnNpZ25JRAIBXwUFT3duZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkBCGNvbnRhaW5zAgUBYQUKc2hhMjU2SGFzaAYHBwELdmFsaWRhdGVDSUQBA2NpZAMJAQhjb250YWlucwIFA2NpZAIBLwMDCQBmAgBMCQCxAgEFA2NpZAkAAAIJALECAQkAkQMCCQC1CQIFA2NpZAIBLwAAADsHCQBmAgAQCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAQcHAQx2YWxpZGF0ZUhhc2gBBGhhc2gJAAACCQCxAgEFBGhhc2gAQAENa2V5VXNlclN0YXR1cwEGY2FsbGVyCQCsAgICDHVzZXJfc3RhdHVzXwUGY2FsbGVyAQdrZXlEYXRlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5TmFtZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleURlc2MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlEaXNwbGF5Q2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDWtleUV4cG9ydEhhc2gCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUFYXJ0SWQCAV8FBmNhbGxlcgEMa2V5RXhwb3J0Q2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICD2FydF9leHBvcnRfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5TWF4TWludAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfbWF4bWludF8FBWFydElkAgFfBQZjYWxsZXIBCWtleVNpZ25JRAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfc2lnbmlkXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5SXNzdWVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlPblNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X29uc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBDmtleUxpY2VuY2VIYXNoAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlMaWNlbmNlQ2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9saWNlbmNlX2NpZF8FBWFydElkAgFfBQZjYWxsZXIBB2tleVRhZ3MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3RhZ3NfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUeXBlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5Tm90ZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfbm90ZV8FBWFydElkAgFfBQZjYWxsZXIBCmtleUNyYXdsZXICBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2NyYXdsZXJfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEMa2V5Um95YWx0aWVzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDmFydF9yb3lhbHRpZXNfBQVhcnRJZAIBXwUGY2FsbGVyAQhrZXlQcmljZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgphcnRfcHJpY2VfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlFbmRTYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDGFydF9lbmRzYWxlXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXNzZXRJZEFjY2VwdGVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEmFydF9hc3NldEFjY2VwdGVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5RmxhZwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZmxhZ18FBWFydElkAgFfBQZjYWxsZXIBEmtleUFydGlzdEFnZW50QWRkcgEKYXJ0aXN0QWRkcgkArAICAg1hcnRpc3RfYWdlbnRfBQphcnRpc3RBZGRyARRrZXlQcmltYXJ5U2hhcmVBZ2VudAEKYXJ0aXN0QWRkcgkArAICAhVhcnRpc3RfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBGGtleUFydGlzdFB1YmxpY0FnZW50QWRkcgEKYXJ0aXN0QWRkcgkArAICAhRhcnRpc3RfcHVibGljX2FnZW50XwUKYXJ0aXN0QWRkcgEaa2V5UHJpbWFyeVNoYXJlUHVibGljQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIcYXJ0aXN0X3B1YmxpY19hZ2VudF9wcmltYXJ5XwUKYXJ0aXN0QWRkcgERa2V5SGFzaEJ5VHhpZEFkZHICBmNhbGxlcgR0eGlkCQCsAgIJAKwCAgkArAICAhNnZXRfaGFzaGJ5dHhpZGFkZHJfBQR0eGlkAgFfBQZjYWxsZXIBDmtleU93bmVyQnlIYXNoAQpzaGEyNTZIYXNoCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUKc2hhMjU2SGFzaAENa2V5aWRCeVNpZ25pZAIGY2FsbGVyBnNpZ25JZAkArAICCQCsAgIJAKwCAgISZ2V0X2FydGlkYnlzaWduaWRfBQZzaWduSWQCAV8FBmNhbGxlcgESa2V5VHhpZEJ5SGFzaE93bmVyAgpzaGEyNTZIYXNoBmNhbGxlcgkArAICAhdnZXRfdHhpZF9ieV9oYXNoX293bmVyXwkA2AQBCQDUFgEJAJsDAQkArAICBQpzaGEyNTZIYXNoBQZjYWxsZXIBDnZhbGlkYXRlQWxsQ0lEAwpjaWREaXNwbGF5CWNpZEV4cG9ydApjaWRMaWNlbmNlAwkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWREaXNwbGF5CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCWNpZEV4cG9ydAkAAgECEFdyb25nIEV4cG9ydCBDSUQDAwkBAiE9AgUKY2lkTGljZW5jZQIACQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZExpY2VuY2UHCQACAQIRV3JvbmcgTGljZW5jZSBDSUQGAQ92YWxpZGF0ZUFsbEhhc2gCDHNoYTI1NkV4cG9ydA1zaGEyNTZMaWNlbmNlAwkBASEBCQEMdmFsaWRhdGVIYXNoAQUMc2hhMjU2RXhwb3J0CQACAQIYRXhwb3J0IEhhc2ggNjQgY2hhci4gbWF4AwkBASEBCQEMdmFsaWRhdGVIYXNoAQUNc2hhMjU2TGljZW5jZQkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkBgkAAAIFCnVzZXJTdGF0dXMFC3VzZXJBbGxvd2VkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFCnVzZXJTdGF0dXMFC3VzZXJSZW1vdmVkAg9BY2NvdW50IHJlbW92ZWQCAAEKc2V0TEljZW5jZQIKY2lkTGljZW5jZQ1zaGEyNTZMaWNlbmNlBANjaWQDCQAAAgkAsQIBBQpjaWRMaWNlbmNlAAAFDmRlZmF1bHRMaWNlbmNlBQpjaWRMaWNlbmNlBARoYXNoAwkAAAIJALECAQUNc2hhMjU2TGljZW5jZQAABRJkZWZhdWx0SGFzaExpY2VuY2UFDXNoYTI1NkxpY2VuY2UJAJQKAgUDY2lkBQRoYXNoARN2YWxpZGF0ZUFydHdvcmtEYXRhCgZjYWxsZXIKY2lkRGlzcGxheQljaWRFeHBvcnQKbGljZW5jZUNJRAxzaGEyNTZFeHBvcnQLbGljZW5jZUhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCXJveWFsdGllcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEPdmFsaWRhdGVQYXltZW50AQFpBAskdDA5MTgwOTIxNgkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQskdDA5MTgwOTIxNgJfMQQGYW1vdW50CAULJHQwOTE4MDkyMTYCXzIEB2Fzc2V0SWQDAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAACCAUHcGF5bWVudAdhc3NldElkBQtzaWduQXNzZXRJZAcIBQdwYXltZW50B2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUGYW1vdW50BRljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQACAQkArAICAhlQYXltZW50IGFtb3VudCBzaG91bGQgYmUgCQCkAwEFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAJQKAgUGYW1vdW50BQdhc3NldElkAQtpc0FydE1pbnRlZAIJYWRkclRvVXNlBWFydElkBAckbWF0Y2gwCQCaCAIFBHRoaXMJAQlrZXlJc3N1ZWQCBQlhZGRyVG9Vc2UFBWFydElkAwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAMJAQIhPQIFAWIAAAYHBwEUdmFsaWRhdGVQcmljZUFzc2V0SWQDAWkMcHJpY2VBc3NldElkDGFydHdvcmtQcmljZQQLJHQwOTgwNDk4NDAJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAULJHQwOTgwNDk4NDACXzEEBmFtb3VudAgFCyR0MDk4MDQ5ODQwAl8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAUEdW5pdAMDCQBmAgkAsQIBBQxwcmljZUFzc2V0SWQAAAkAAAIJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAUMcHJpY2VBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECDldyb25nIGFzc2V0IGlkAwMJAAACBQdhc3NldElkBQR1bml0CQECIT0CBQxwcmljZUFzc2V0SWQCAAcJAAIBAg5Xcm9uZyBhc3NldCBpZAMJAQIhPQIFDGFydHdvcmtQcmljZQUGYW1vdW50CQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBEGFjY2VwdGVkQXNzZXRJZHMBB2Fzc2V0SWQDAwMDAwkBAiE9AgUHYXNzZXRJZAkA2AQBBQtzaWduQXNzZXRJZAkBAiE9AgUHYXNzZXRJZAkA2AQBBQx3YXZlc0Fzc2V0SWQHCQECIT0CBQdhc3NldElkAgVXQVZFUwcJAQIhPQIFB2Fzc2V0SWQJANgEAQULdXNkbkFzc2V0SWQHCQECIT0CBQdhc3NldElkCQDYBAEFC3VzZHRBc3NldElkBwkAAgECJk9ubHkgU0lHTiwgVVNETixVU0RUIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAgdhc3NldElkBXByaWNlBAxtaW5TZWxsV2F2ZXMDBQh1bml0VGVzdAAKCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQECDndhdmVzX21pbl9zZWxsBAttaW5TZWxsVXNkbgDAhD0EC21pblNlbGxTaWduAwUIdW5pdFRlc3QAAQkAaAIFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UAAgMDAwMDAwkAAAIFB2Fzc2V0SWQJANgEAQULdXNkbkFzc2V0SWQJAGYCBQttaW5TZWxsVXNkbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwkAAAIFB2Fzc2V0SWQJANgEAQULdXNkdEFzc2V0SWQJAGYCBQttaW5TZWxsVXNkbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwkAAAIFB2Fzc2V0SWQJANgEAQULc2lnbkFzc2V0SWQJAGYCBQttaW5TZWxsU2lnbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwMJAAACBQdhc3NldElkCQDYBAEFDHdhdmVzQXNzZXRJZAYJAAACBQdhc3NldElkAgVXQVZFUwkAZgIFDG1pblNlbGxXYXZlcwUFcHJpY2UHCQECIT0CBQVwcmljZQAABwkAAgECGFdyb25nIG1pbmltdW0gc2VsbCBwcmljZQYBDWdldEJpZEFzc2V0SWQBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEKYmlkRGF0YUtleQQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgMJAAACBQdiaWREYXRhAgAJAAIBAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8ECWJpZEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJpZERhdGFBcnIAAQQKYmlkQXNzZXRJZAkBDWdldEJpZEFzc2V0SWQBCQCRAwIFCmJpZERhdGFBcnIAAAMJAGcCAAAFCWJpZEFtb3VudAkAAgECDFdyb25nIGFtb3VudAkAlAoCBQliaWRBbW91bnQFCmJpZEFzc2V0SWQBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIBaQZwdWJLZXkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cEC2lzU3BvbnNvcmVkAwkBAiE9AgUGcHViS2V5AgAJAQt2YWx1ZU9yRWxzZQIJAQ5jaGVja1doaXRlbGlzdAEJAKwCAgkApQgBCQCnCAEJANkEAQUGcHViS2V5AglfZnJlZV90eHMAAAAABAZjYWxsZXIDAwkAAAIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkApQgBBQR0aGlzCQBmAgULaXNTcG9uc29yZWQAAAcJAKUIAQkApwgBCQDZBAEFBnB1YktleQkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBNnZXRfc3BvbnNvcmVkX3dhdmVzAwMJAQIhPQIFBnB1YktleQIACQBmAgULaXNTcG9uc29yZWQAAAcJAPwHBAUNd2hpdGVsaXN0RGFwcAIJdXNlRnJlZVR4CQDMCAIJAKUIAQkApwgBCQDZBAEFBnB1YktleQUDbmlsBQNuaWwFBHVuaXQDCQAAAgUTZ2V0X3Nwb25zb3JlZF93YXZlcwUTZ2V0X3Nwb25zb3JlZF93YXZlcwkAlgoECQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFBmNhbGxlcggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAGYCBQtpc1Nwb25zb3JlZAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxpZENhbGxlckRhdGUBAWkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQdidXlNaW50BQFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMTI5NzcxMzAzNgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMTI5NzcxMzAzNgJfMQQGY2FsbGVyCAUNJHQwMTI5NzcxMzAzNgJfMgQEZGF0ZQgFDSR0MDEyOTc3MTMwMzYCXzMEBWlzQmlkAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIFBmNhbGxlcgUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEBnNpZ25JRAkBDmdldFN0cmluZ0J5S2V5AQkBCWtleVNpZ25JRAIFBmlzc3VlcgUFYXJ0SWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyCQBoAgUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQACCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCGtleVByaWNlAgUGaXNzdWVyBQVhcnRJZAQMcHJpY2VBc3NldElkAwUOY2FsbGVySXNJc3N1ZXIJANgEAQULc2lnbkFzc2V0SWQJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwMDCQEBIQEFBWlzQmlkCQEBIQEFDmNhbGxlcklzSXNzdWVyBwMDCQBnAgAABQxhcnR3b3JrUHJpY2UGCQEBIQEFCGlzT25TYWxlBgkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFBWlzQmlkBQ5jYWxsZXJJc0lzc3VlcgcJAGcCAAAFCm1heENhblNlbGwHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmlzc3VlcgMDBQVpc0JpZAkBAiE9AgUJY2hlY2tVc2VyAgAHCQACAQUJY2hlY2tVc2VyBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQNJHQwMTQ1NTUxNDc0NwMFBWlzQmlkCQEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEFCmJpZERhdGFLZXkJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAUMYXJ0d29ya1ByaWNlBAZhbW91bnQIBQ0kdDAxNDU1NTE0NzQ3Al8xBAdhc3NldElkCAUNJHQwMTQ1NTUxNDc0NwJfMgQFYWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARJrZXlBcnRpc3RBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBAphZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBBQZpc3N1ZXIAAAQLcHVibGljQWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBBBwdWJsaWNBZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEaa2V5UHJpbWFyeVNoYXJlUHVibGljQWdlbnQBBQZpc3N1ZXIAAAQNaXNXaGl0ZWxpc3RlZAkBDmNoZWNrV2hpdGVsaXN0AQUGaXNzdWVyBANjdXQDCQBmAgUNaXNXaGl0ZWxpc3RlZAUGaGVpZ2h0AAADCQAAAgUHYXNzZXRJZAULc2lnbkFzc2V0SWQFB3NpZ25DdXQFC3VzZG5XYXZlQ3V0BA1hbW91bnRGb3JTaWduCQBrAwUGYW1vdW50BQNjdXQAZAQOYW1vdW50Rm9yQWdlbnQDAwMJAQIhPQIFBWFnZW50BQtmZWVSZWNlaXZlcgkAZgIFCmFnZW50U2hhcmUAAAcJAGYCBQZoZWlnaHQFDWlzV2hpdGVsaXN0ZWQHCQBrAwUGYW1vdW50BQphZ2VudFNoYXJlAJBOAAAEFGFtb3VudEZvclB1YmxpY0FnZW50AwMDCQECIT0CBQtwdWJsaWNBZ2VudAULZmVlUmVjZWl2ZXIJAGYCBRBwdWJsaWNBZ2VudFNoYXJlAAAHCQBmAgUGaGVpZ2h0BQ1pc1doaXRlbGlzdGVkBwkAawMFBmFtb3VudAUQcHVibGljQWdlbnRTaGFyZQCQTgAABBBhbW91bnRGb3JDcmVhdG9yCQBlAgUGYW1vdW50BQ1hbW91bnRGb3JTaWduAwkAAAIFCmFtb3VudFNvbGQFCm1heENhblNlbGwJAAIBAgxBcnQgc29sZCBvdXQEDW5ld0Ftb3VudFNvbGQJAGQCBQphbW91bnRTb2xkAAEECWlzc3VlTWV0YQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUGaXNzdWVyAgosCiBBcnRJRDogBQVhcnRJZAILLAogU2lnbklEOiAFBnNpZ25JRAIRLAogQXJ0d29yayBuYW1lOiAFC2FydHdvcmtOYW1lAgosCiBJc3N1ZTogCQCkAwEFDW5ld0Ftb3VudFNvbGQCAS8JAKQDAQUKbWF4Q2FuU2VsbAQIaXNzdWVORlQJAMIIBQkArAICAgNTQV8JAKQDAQkAZAIFCHRvdGFsTkZUAAEFCWlzc3VlTWV0YQABAAAHBAVpZE5GVAkAuAgBBQhpc3N1ZU5GVAQKc2VsbFN0YXR1cwMDCQAAAgUNbmV3QW1vdW50U29sZAUKbWF4Q2FuU2VsbAYJAQEhAQUIaXNPblNhbGUHBgQKcmVjZWl2ZU5GVAMDAwkAAAIFBmNhbGxlcgUGaXNzdWVyCQECIT0CBQhiaWRPd25lcgIABwkBAiE9AgUFYmlkSWQCAAcJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGJpZE93bmVyCAUBaQZjYWxsZXIECmFzc2V0SWRCaWQDCQEBIQEJAQlpc0RlZmluZWQBBQdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBBQdhc3NldElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWREZWxPbGQJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZFVwZGF0ZQkBC1N0cmluZ0VudHJ5AgkArAICBQpiaWREYXRhS2V5AgdfQ0xPU0VECQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlBAdzb2xkS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQ1uZXdBbW91bnRTb2xkAgRfb2ZfCQCkAwEFCm1heENhblNlbGwCAV8FBWFydElkAgFfBQZpc3N1ZXIECXNvbGRWYWx1ZQMJAQEhAQUFaXNCaWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGY2FsbGVyAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFDGFydHdvcmtQcmljZQIBXwUMcHJpY2VBc3NldElkAgFfCQDYBAEFBWlkTkZUCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQUKcmVjZWl2ZU5GVAIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQZhbW91bnQCAV8FCmFzc2V0SWRCaWQCAV8JANgEAQUFaWRORlQECHNvbGREYXRhCQELU3RyaW5nRW50cnkCBQdzb2xkS2V5BQlzb2xkVmFsdWUEFGNvbW1pc3Npb25zV2l0aEFnZW50AwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIJAGUCBQ1hbW91bnRGb3JTaWduBQ5hbW91bnRGb3JBZ2VudAUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUFYWdlbnQFDmFtb3VudEZvckFnZW50BQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyBQ1hbW91bnRGb3JTaWduBQdhc3NldElkBQNuaWwEGmNvbW1pc3Npb25zV2l0aFB1YmxpY0FnZW50AwkBAiE9AgUUYW1vdW50Rm9yUHVibGljQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULcHVibGljQWdlbnQFFGFtb3VudEZvclB1YmxpY0FnZW50BQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIJAGUCBRBhbW91bnRGb3JDcmVhdG9yBRRhbW91bnRGb3JQdWJsaWNBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIFEGFtb3VudEZvckNyZWF0b3IFB2Fzc2V0SWQFA25pbAQGYnV5UmVzCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQFDW5ld0Ftb3VudFNvbGQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgRuZnRfCQDYBAEFBWlkTkZUBQdzb2xkS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUIdG90YWxORlQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIFCGlzc3VlTkZUCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCnJlY2VpdmVORlQAAQUFaWRORlQFA25pbAUUY29tbWlzc2lvbnNXaXRoQWdlbnQFGmNvbW1pc3Npb25zV2l0aFB1YmxpY0FnZW50AwUFaXNCaWQJAMwIAgUIc29sZERhdGEJAMwIAgUJYmlkVXBkYXRlCQDMCAIFCWJpZERlbE9sZAUGYnV5UmVzCQDMCAIFCHNvbGREYXRhBQZidXlSZXMBCGFzU3RyaW5nAQJidgQHJG1hdGNoMAUCYnYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANidjAFByRtYXRjaDAFA2J2MAkAAgECJFNwb25zb3JlZCBQdWJsaWMgS2V5IFN0cmluZyBleHBlY3RlZAoGaW52b2tlAQdzZXRDb25mAgNrZXkDdmFsBAZjYWxsZXIJAKUIAQgFBmludm9rZQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBCGNvbnRhaW5zAgUDa2V5AgVjb25mXwkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsCQACAQIgRW50cmllcyBzdGFydGluZyB3aXRoIGNvbmZfIG9ubHkJAAIBAiJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzAWkBCmFkZEFydHdvcmsOCnNoYTI1Nkhhc2gGc2lnbklEBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5BA0kdDAxOTgwMjE5ODc1CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAVhcnRJZAgFDSR0MDE5ODAyMTk4NzUCXzEEBmNhbGxlcggFDSR0MDE5ODAyMTk4NzUCXzIEBGRhdGUIBQ0kdDAxOTgwMjE5ODc1Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDE5ODAyMTk4NzUCXzQDCQEBIQEJAQx2YWxpZGF0ZUhhc2gBBQpzaGEyNTZIYXNoCQACAQIkSGFzaCBzaG91bGQgYmUgNjQgY2hhcmFjdGVycyBtYXhpbXVtBA0kdDAxOTk3NjIwMDQ1CQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAxOTk3NjIwMDQ1Al8xBAtsaWNlbmNlSGFzaAgFDSR0MDE5OTc2MjAwNDUCXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBBB3aGl0ZWxpc3RlZF9kcm9wCQBmAgkBDmNoZWNrV2hpdGVsaXN0AQkArAICBQZjYWxsZXICC19mcmVlX2Ryb3BzAAAEDSR0MDIwMzQ0MjA0MjgDBRB3aGl0ZWxpc3RlZF9kcm9wCQCUCgIAAAUGc2lnbklECQEPdmFsaWRhdGVQYXltZW50AQUBaQQGYW1vdW50CAUNJHQwMjAzNDQyMDQyOAJfMQQHYXNzZXRJZAgFDSR0MDIwMzQ0MjA0MjgCXzIDCQEBIQEJAQlpc0RlZmluZWQBBQZhbW91bnQJAAIBAhRTb21ldGhpbmcgd2VudCB3cm9uZwQKZW50cnlFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleVR4aWRCeUhhc2hPd25lcgIFCnNoYTI1Nkhhc2gFBmNhbGxlcgMJAQIhPQIFCmVudHJ5RXhpc3QCAAkAAgECFFlvdSBhbHJlYWR5IGFkZGVkIGl0BAloYXNoRXhpc3QJAQ5nZXRTdHJpbmdCeUtleQEJAQ5rZXlPd25lckJ5SGFzaAEFCnNoYTI1Nkhhc2gDCQECIT0CBQloYXNoRXhpc3QCAAkAAgECF0hhc2ggYWxyZWFkeSByZWdpc3RlcmVkBA9pc1NpZ25DZXJ0aWZpZWQJARRjaGVja1NpZ25DZXJ0aWZpY2F0ZQMFBnNpZ25JRAUGY2FsbGVyBQpzaGEyNTZIYXNoAwkBASEBBQ9pc1NpZ25DZXJ0aWZpZWQJAAIBAixTaWduIENlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgdGhpcyBhZGRyZXNzLgQXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3ADBRB3aGl0ZWxpc3RlZF9kcm9wCQD8BwQFDXdoaXRlbGlzdERhcHACC3VzZUZyZWVEcm9wCQDMCAIFBmNhbGxlcgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AFF2RlY3JlYXNlX3doaXRlbGlzdF9kcm9wBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlPd25lckJ5SGFzaAEFCnNoYTI1Nkhhc2gFBmNhbGxlcgkAzAgCCQELU3RyaW5nRW50cnkCCQESa2V5VHhpZEJ5SGFzaE93bmVyAgUKc2hhMjU2SGFzaAUGY2FsbGVyBQVhcnRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBB2tleURhdGUCBQZjYWxsZXIFBWFydElkBQRkYXRlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQVhcnRJZAUEbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5RGVzYwIFBmNhbGxlcgUFYXJ0SWQFC2Rlc2NyaXB0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlEaXNwbGF5Q2lkAgUGY2FsbGVyBQVhcnRJZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQVhcnRJZAUJY2lkRXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlFeHBvcnRIYXNoAgUGY2FsbGVyBQVhcnRJZAUMc2hhMjU2RXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlMaWNlbmNlSGFzaAIFBmNhbGxlcgUFYXJ0SWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlMaWNlbmNlQ2lkAgUGY2FsbGVyBQVhcnRJZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VHlwZQIFBmNhbGxlcgUFYXJ0SWQFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVRhZ3MCBQZjYWxsZXIFBWFydElkBQR0YWdzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQAAAkAzAgCCQELU3RyaW5nRW50cnkCCQEJa2V5U2lnbklEAgUGY2FsbGVyBQVhcnRJZAUGc2lnbklECQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGY2FsbGVyBQVhcnRJZAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleWlkQnlTaWduaWQCBQZjYWxsZXIFBnNpZ25JRAUFYXJ0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUhhc2hCeVR4aWRBZGRyAgUGY2FsbGVyBQVhcnRJZAUKc2hhMjU2SGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5Q3Jhd2xlcgIFBmNhbGxlcgUFYXJ0SWQFB2NyYXdsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlSb3lhbHRpZXMCBQZjYWxsZXIFBWFydElkBQlyb3lhbHRpZXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyBQZhbW91bnQFC3NpZ25Bc3NldElkBQNuaWwFCnR4VG9DYWxsZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENdXBkYXRlQXJ0d29yaw0EdHhpZARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEdHlwZQpjaWREaXNwbGF5DHNoYTI1NkV4cG9ydAljaWRFeHBvcnQNc2hhMjU2TGljZW5jZQpjaWRMaWNlbmNlB2NyYXdsZXIJcm95YWx0aWVzBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQNJHQwMjM0NjIyMzUzMgkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyMzQ2MjIzNTMyAl8xBAZjYWxsZXIIBQ0kdDAyMzQ2MjIzNTMyAl8yBARkYXRlCAUNJHQwMjM0NjIyMzUzMgJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyMzQ2MjIzNTMyAl80BA0kdDAyMzU0MjIzNjExCQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAyMzU0MjIzNjExAl8xBAtsaWNlbmNlSGFzaAgFDSR0MDIzNTQyMjM2MTECXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAMJAAACBQplbnRyeUV4aXN0AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQR0eGlkAwkAAAIFBGZsYWcCB0lMTEVHQUwJAAIBAh1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQEhAQkBC2lzQXJ0TWludGVkAgUGY2FsbGVyBQR0eGlkBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQR0eGlkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUEdHhpZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQR0eGlkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBHR4aWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUEdHhpZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBHR4aWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQR0eGlkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQR0eGlkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQR0eGlkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQR0eGlkBQlyb3lhbHRpZXMFA25pbAUKdHhUb0NhbGxlcgkAAgECDkFscmVhZHkgbWludGVkAWkBC2ZsYWdBcnR3b3JrBAVhcnRJZARhZGRyBGZsYWcEbm90ZQQNJHQwMjUyMzgyNTI3MgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjUyMzgyNTI3MgJfMQQGY2FsbGVyCAUNJHQwMjUyMzgyNTI3MgJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgdDT05TRU5UCQDMCAICAAkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleUZsYWcCBQRhZGRyBQVhcnRJZAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5Tm90ZQIFBGFkZHIFBWFydElkBQRub3RlBQNuaWwJAAIBCQCsAgICDlVua25vdyBzdGF0dXMgBQRmbGFnCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAFpAQ1kZWxldGVBcnR3b3JrAgVhcnRJZARhZGRyBA0kdDAyNTcwODI1NzQyCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNTcwODI1NzQyAl8xBAZjYWxsZXIIBQ0kdDAyNTcwODI1NzQyAl8yBAlhZGRyVG9Vc2UDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQRhZGRyBQZjYWxsZXIECmVudHJ5RXhpc3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQplbnRyeUV4aXN0AgAJAAIBAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQKc2hhMjU2SGFzaAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUhhc2hCeVR4aWRBZGRyAgUJYWRkclRvVXNlBQVhcnRJZAMJAAACBQpzaGEyNTZIYXNoAgAJAAIBAiVObyBhcnQgaGFzaCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBAZzaWduSUQJAQ5nZXRTdHJpbmdCeUtleQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkAwkAAAIFBnNpZ25JRAIACQACAQITTm8gU0lHTiBJRCBtYXRjaGluZwQMZGF0YVRvRGVsZXRlCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEYXRlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5TmFtZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleURlc2MCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlEaXNwbGF5Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5RXhwb3J0Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RXhwb3J0SGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleUxpY2VuY2VIYXNoAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5TGljZW5jZUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVR5cGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUYWdzAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5TWF4TWludAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleVNpZ25JRAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleU9uU2FsZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleUZsYWcCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQhrZXlQcmljZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleUFzc2V0SWRBY2NlcHRlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5aWRCeVNpZ25pZAIFCWFkZHJUb1VzZQUGc2lnbklECQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlUeGlkQnlIYXNoT3duZXICBQpzaGEyNTZIYXNoBQlhZGRyVG9Vc2UJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUVuZFNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOb3RlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5Q3Jhd2xlcgIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleVJveWFsdGllcwIFCWFkZHJUb1VzZQUFYXJ0SWQFA25pbAMJAQEhAQkBC2lzQXJ0TWludGVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwUMZGF0YVRvRGVsZXRlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUMZGF0YVRvRGVsZXRlCQACAQIoQXJ0IGFscmVhZHkgbWludGVkLCB5b3UgY2Fubm90IGRlbGV0ZSBpdAFpAQtzZWxsQXJ0d29yawYFYXJ0SWQFcHJpY2UHbWF4TWludAdhc3NldElkCGJsb2NrRW5kBnB1YktleQQNJHQwMjg1NzgyODY0OAkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyODU3ODI4NjQ4Al8xBAZjYWxsZXIIBQ0kdDAyODU3ODI4NjQ4Al8yBARkYXRlCAUNJHQwMjg1NzgyODY0OAJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyODU3ODI4NjQ4Al80BAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAiNUaGlzIGFydCBkb2Vzbid0IG1hdGNoIHlvdXIgYWNjb3VudAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBWFydElkAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQBmAgAABQhibG9ja0VuZAkAAgECDE5lZ2F0aXZlIGVuZAMDCQBmAgUIYmxvY2tFbmQAAAMJAQIhPQIFB21heE1pbnQAAQYJAQIhPQIFBXByaWNlAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQKYmFzZUhlaWdodAMJAAACBQhibG9ja0VuZAAAAAAFBmhlaWdodAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAgUHYXNzZXRJZAUFcHJpY2UJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQDCQBmAgUHbWF4TWludABkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQphbW91bnRTb2xkAAAJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQphbW91bnRTb2xkAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFBmJpZE5icgAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECMUNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSB3aXRoIGFjdGl2ZSBvcmRlcnMECnNlbGxTdGF0dXMDAwkAZgIFBXByaWNlAAAJAGYCBQdtYXhNaW50AAAHBgcECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEIa2V5UHJpY2UCBQZjYWxsZXIFBWFydElkBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkBQdtYXhNaW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZjYWxsZXIFBWFydElkBQdhc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmNhbGxlcgUFYXJ0SWQJAGQCBQpiYXNlSGVpZ2h0BQhibG9ja0VuZAUDbmlsBQp0eFRvQ2FsbGVyAWkBCmJ1eUFydHdvcmsCBWFydElkBmlzc3VlcgkBB2J1eU1pbnQFBQFpBQVhcnRJZAUGaXNzdWVyAgACAAFpAQZzZXRCaWQCBWFydElkBmlzc3VlcgQNJHQwMzEwMjYzMTA2NgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzEwMjYzMTA2NgJfMQQGY2FsbGVyCAUNJHQwMzEwMjYzMTA2NgJfMgQEZGF0ZQgFDSR0MDMxMDI2MzEwNjYCXzMEDSR0MDMxMDcxMzExMDcJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMzEwNzEzMTEwNwJfMQQGYW1vdW50CAUNJHQwMzEwNzEzMTEwNwJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQECGJsb2NrRW5kCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAwMJAQIhPQIFCGJsb2NrRW5kAAAJAGcCBQZoZWlnaHQFCGJsb2NrRW5kBwkAAgECC1NhbGUgZW5kZWQuBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAIFB2Fzc2V0SWQFBmFtb3VudAkAAgECDldyb25nIG1pbiBzZWxsBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDCQBnAgAABQptYXhDYW5TZWxsCQACAQIjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQBnAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUGY2FsbGVyAgFfBQJpZAIFX09QRU4JAKwCAgkArAICCQCsAgIJAKwCAgUHYXNzZXRJZAIBXwkApAMBBQZhbW91bnQCAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBkAgUGYmlkTmJyAAEFA25pbAFpAQlhY2NlcHRCaWQEBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMzIyNjUzMjMwNQkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzIyNjUzMjMwNQJfMQQGY2FsbGVyCAUNJHQwMzIyNjUzMjMwNQJfMgQEZGF0ZQgFDSR0MDMyMjY1MzIzMDUCXzMDCQECIT0CBQZjYWxsZXIFBmlzc3VlcgkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24JAQdidXlNaW50BQUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQFCGJpZE93bmVyAWkBCWNhbmNlbEJpZAQFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBA0kdDAzMjUzMTMyNTkyCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMjUzMTMyNTkyAl8xBAZjYWxsZXIIBQ0kdDAzMjUzMTMyNTkyAl8yBARkYXRlCAUNJHQwMzI1MzEzMjU5MgJfMwMDCQECIT0CBQZjYWxsZXIFCGJpZE93bmVyCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBA1yZXR1cm5Nb25leVRvAwkAAAIFBmNhbGxlcgUGaXNzdWVyBQhiaWRPd25lcgUGY2FsbGVyBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQHYXNzZXRJZAkBDWdldEJpZEFzc2V0SWQBCQCRAwIFCmJpZERhdGFBcnIAAAQJYmlkU3RhdHVzAghDQU5DRUxFRAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQpiaWREYXRhS2V5AgFfBQliaWRTdGF0dXMJAKwCAgkArAICBQdiaWREYXRhAgFfCQCkAwEFBGRhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAkAZQIFBmJpZE5icgABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQ1yZXR1cm5Nb25leVRvCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBQdhc3NldElkBQNuaWwBAnR4AQh2ZXJpZmllcgAEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDADAwMDCQAAAggFA2ludghmdW5jdGlvbgIKYWRkQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwANAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CDXVwZGF0ZUFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MADAMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAgtzZWxsQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwAFCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5CQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5EKL6Pg==", "height": 2432941, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5vjAnsL7J8xXk5hvPcnWpjerCnWuHxAkaiFGQ9LJN8vF Next: BW71ipLmS71GkHjYi2zbxNroaXp21YwkfoaGfZeM7gUG Diff:
OldNewDifferences
487487 else false)
488488 then (height > isWhitelisted)
489489 else false)
490- then fraction(amount, agentShare, 100)
490+ then fraction(amount, agentShare, 10000)
491491 else 0
492492 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
493493 then (publicAgentShare > 0)
494494 else false)
495495 then (height > isWhitelisted)
496496 else false)
497- then fraction(amount, publicAgentShare, 100)
497+ then fraction(amount, publicAgentShare, 10000)
498498 else 0
499499 let amountForCreator = (amount - amountForSign)
500500 if ((amountSold == maxCanSell))
571571
572572 @Callable(i)
573573 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
574- let $t01965319726 = idCallerDateSponsored(i, pubKey)
575- let artId = $t01965319726._1
576- let caller = $t01965319726._2
577- let date = $t01965319726._3
578- let isSponsored = $t01965319726._4
574+ let $t01980219875 = idCallerDateSponsored(i, pubKey)
575+ let artId = $t01980219875._1
576+ let caller = $t01980219875._2
577+ let date = $t01980219875._3
578+ let isSponsored = $t01980219875._4
579579 if (!(validateHash(sha256Hash)))
580580 then throw("Hash should be 64 characters maximum")
581581 else {
582- let $t01982719896 = setLIcence(cidLicence, sha256Licence)
583- let licenceCID = $t01982719896._1
584- let licenceHash = $t01982719896._2
582+ let $t01997620045 = setLIcence(cidLicence, sha256Licence)
583+ let licenceCID = $t01997620045._1
584+ let licenceHash = $t01997620045._2
585585 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
586586 if ((validateArtwork != ""))
587587 then throw("Something went wrong!")
588588 else {
589589 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
590- let $t02019520279 = if (whitelisted_drop)
590+ let $t02034420428 = if (whitelisted_drop)
591591 then $Tuple2(0, signID)
592592 else validatePayment(i)
593- let amount = $t02019520279._1
594- let assetId = $t02019520279._2
593+ let amount = $t02034420428._1
594+ let assetId = $t02034420428._2
595595 if (!(isDefined(amount)))
596596 then throw("Something went wrong")
597597 else {
632632 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
633633 then throw(maintenanceMSG)
634634 else {
635- let $t02331323383 = idCallerDateSponsored(i, pubKey)
636- let id = $t02331323383._1
637- let caller = $t02331323383._2
638- let date = $t02331323383._3
639- let isSponsored = $t02331323383._4
640- let $t02339323462 = setLIcence(cidLicence, sha256Licence)
641- let licenceCID = $t02339323462._1
642- let licenceHash = $t02339323462._2
635+ let $t02346223532 = idCallerDateSponsored(i, pubKey)
636+ let id = $t02346223532._1
637+ let caller = $t02346223532._2
638+ let date = $t02346223532._3
639+ let isSponsored = $t02346223532._4
640+ let $t02354223611 = setLIcence(cidLicence, sha256Licence)
641+ let licenceCID = $t02354223611._1
642+ let licenceHash = $t02354223611._2
643643 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
644644 if ((validateArtwork != ""))
645645 then throw("Something went wrong!")
667667
668668 @Callable(i)
669669 func flagArtwork (artId,addr,flag,note) = {
670- let $t02508925123 = idCallerDate(i)
671- let id = $t02508925123._1
672- let caller = $t02508925123._2
670+ let $t02523825272 = idCallerDate(i)
671+ let id = $t02523825272._1
672+ let caller = $t02523825272._2
673673 if (containsElement([chris, toString(this)], caller))
674674 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
675675 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
681681
682682 @Callable(i)
683683 func deleteArtwork (artId,addr) = {
684- let $t02555925593 = idCallerDate(i)
685- let id = $t02555925593._1
686- let caller = $t02555925593._2
684+ let $t02570825742 = idCallerDate(i)
685+ let id = $t02570825742._1
686+ let caller = $t02570825742._2
687687 let addrToUse = if (containsElement([chris, toString(this)], caller))
688688 then addr
689689 else caller
716716
717717 @Callable(i)
718718 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
719- let $t02842928499 = idCallerDateSponsored(i, pubKey)
720- let id = $t02842928499._1
721- let caller = $t02842928499._2
722- let date = $t02842928499._3
723- let isSponsored = $t02842928499._4
719+ let $t02857828648 = idCallerDateSponsored(i, pubKey)
720+ let id = $t02857828648._1
721+ let caller = $t02857828648._2
722+ let date = $t02857828648._3
723+ let isSponsored = $t02857828648._4
724724 let artworkName = getStringByKey(keyName(caller, artId))
725725 if ((artworkName == ""))
726726 then throw("This art doesn't match your account")
794794
795795 @Callable(i)
796796 func setBid (artId,issuer) = {
797- let $t03087730917 = idCallerDate(i)
798- let id = $t03087730917._1
799- let caller = $t03087730917._2
800- let date = $t03087730917._3
801- let $t03092230958 = isPayment(i)
802- let payment = $t03092230958._1
803- let amount = $t03092230958._2
797+ let $t03102631066 = idCallerDate(i)
798+ let id = $t03102631066._1
799+ let caller = $t03102631066._2
800+ let date = $t03102631066._3
801+ let $t03107131107 = isPayment(i)
802+ let payment = $t03107131107._1
803+ let amount = $t03107131107._2
804804 let assetId = if (!(isDefined(payment.assetId)))
805805 then "WAVES"
806806 else toBase58String(value(payment.assetId))
831831
832832 @Callable(i)
833833 func acceptBid (artId,issuer,bidId,bidOwner) = {
834- let $t03211632156 = idCallerDate(i)
835- let id = $t03211632156._1
836- let caller = $t03211632156._2
837- let date = $t03211632156._3
834+ let $t03226532305 = idCallerDate(i)
835+ let id = $t03226532305._1
836+ let caller = $t03226532305._2
837+ let date = $t03226532305._3
838838 if ((caller != issuer))
839839 then throw("You cannot do this action")
840840 else buyMint(i, artId, issuer, bidId, bidOwner)
844844
845845 @Callable(i)
846846 func cancelBid (artId,issuer,bidId,bidOwner) = {
847- let $t03238232443 = idCallerDate(i)
848- let id = $t03238232443._1
849- let caller = $t03238232443._2
850- let date = $t03238232443._3
847+ let $t03253132592 = idCallerDate(i)
848+ let id = $t03253132592._1
849+ let caller = $t03253132592._2
850+ let date = $t03253132592._3
851851 if (if ((caller != bidOwner))
852852 then (caller != issuer)
853853 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
161161 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
162162
163163
164164 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
165165
166166
167167 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
168168
169169
170170 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
171171
172172
173173 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
174174
175175
176176 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
177177
178178
179179 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
180180
181181
182182 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
183183 then throw("Wrong Display CID")
184184 else if (!(validateCID(cidExport)))
185185 then throw("Wrong Export CID")
186186 else if (if ((cidLicence != ""))
187187 then !(validateCID(cidLicence))
188188 else false)
189189 then throw("Wrong Licence CID")
190190 else true
191191
192192
193193 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
194194 then throw("Export Hash 64 char. max")
195195 else if (!(validateHash(sha256Licence)))
196196 then throw("Licence Hash 64 char. max")
197197 else true
198198
199199
200200 func validateString (str,max) = if ((size(str) == 0))
201201 then throw("Field cannot be is empty")
202202 else if ((size(str) > max))
203203 then throw((str + " is too long"))
204204 else true
205205
206206
207207 func validateUser (caller) = {
208208 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
209209 if (if ((userStatus == userUnregistered))
210210 then true
211211 else (userStatus == userAllowed))
212212 then "Register this account first with \"Account\" tab"
213213 else if ((userStatus == userSuspended))
214214 then "Account suspended"
215215 else if ((userStatus == userRemoved))
216216 then "Account removed"
217217 else ""
218218 }
219219
220220
221221 func setLIcence (cidLicence,sha256Licence) = {
222222 let cid = if ((size(cidLicence) == 0))
223223 then defaultLicence
224224 else cidLicence
225225 let hash = if ((size(sha256Licence) == 0))
226226 then defaultHashLicence
227227 else sha256Licence
228228 $Tuple2(cid, hash)
229229 }
230230
231231
232232 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
233233 let checkUser = validateUser(caller)
234234 if ((checkUser != ""))
235235 then throw(checkUser)
236236 else if ((size(cidDisplay) == 0))
237237 then throw("Display CID cannot be empty")
238238 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
239239 then throw("Problem with CID")
240240 else if (!(validateAllHash(sha256Export, licenceHash)))
241241 then throw("Problem with Hashes")
242242 else if (!(validateString(name, 100)))
243243 then throw("100 Char. max name")
244244 else if (!(validateString(description, 1000)))
245245 then throw("1000 Char. max description")
246246 else if (if ((0 > royalties))
247247 then true
248248 else (royalties > 1000))
249249 then throw("Royalties cannot be less than 0% or higher than 10%")
250250 else if ((size(split(tags, ",")) > 5))
251251 then throw("5 tags max.")
252252 else ""
253253 }
254254
255255
256256 func isPayment (i) = if ((size(i.payments) == 0))
257257 then throw("No payment attached")
258258 else {
259259 let payment = value(i.payments[0])
260260 let amount = value(payment.amount)
261261 $Tuple2(payment, amount)
262262 }
263263
264264
265265 func validatePayment (i) = {
266266 let $t091809216 = isPayment(i)
267267 let payment = $t091809216._1
268268 let amount = $t091809216._2
269269 let assetId = if (if (isDefined(payment.assetId))
270270 then (payment.assetId == signAssetId)
271271 else false)
272272 then payment.assetId
273273 else throw("Only SIGN token accepted as transaction fee")
274274 if ((amount != currentCertificationPrice))
275275 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
276276 else $Tuple2(amount, assetId)
277277 }
278278
279279
280280 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
281281 case b: Int =>
282282 if ((b != 0))
283283 then true
284284 else false
285285 case _ =>
286286 false
287287 }
288288
289289
290290 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
291291 let $t098049840 = isPayment(i)
292292 let payment = $t098049840._1
293293 let amount = $t098049840._2
294294 let assetId = if (!(isDefined(payment.assetId)))
295295 then unit
296296 else if (if ((size(priceAssetId) > 0))
297297 then (toBase58String(value(payment.assetId)) == priceAssetId)
298298 else false)
299299 then payment.assetId
300300 else throw("Wrong asset id")
301301 if (if ((assetId == unit))
302302 then (priceAssetId != "")
303303 else false)
304304 then throw("Wrong asset id")
305305 else if ((artworkPrice != amount))
306306 then throw("Payment don't match")
307307 else $Tuple2(amount, assetId)
308308 }
309309
310310
311311 func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
312312 then (assetId != toBase58String(wavesAssetId))
313313 else false)
314314 then (assetId != "WAVES")
315315 else false)
316316 then (assetId != toBase58String(usdnAssetId))
317317 else false)
318318 then (assetId != toBase58String(usdtAssetId))
319319 else false)
320320 then throw("Only SIGN, USDN,USDT or WAVES accepted")
321321 else true
322322
323323
324324 func validateMinSell (assetId,price) = {
325325 let minSellWaves = if (unitTest)
326326 then 10
327327 else getIntegerByKeyFromOracle("waves_min_sell")
328328 let minSellUsdn = 1000000
329329 let minSellSign = if (unitTest)
330330 then 1
331331 else (currentCertificationPrice * 2)
332332 if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
333333 then (minSellUsdn > price)
334334 else false)
335335 then (price != 0)
336336 else false)
337337 then true
338338 else if (if ((assetId == toBase58String(usdtAssetId)))
339339 then (minSellUsdn > price)
340340 else false)
341341 then (price != 0)
342342 else false)
343343 then true
344344 else if (if ((assetId == toBase58String(signAssetId)))
345345 then (minSellSign > price)
346346 else false)
347347 then (price != 0)
348348 else false)
349349 then true
350350 else if (if (if ((assetId == toBase58String(wavesAssetId)))
351351 then true
352352 else (assetId == "WAVES"))
353353 then (minSellWaves > price)
354354 else false)
355355 then (price != 0)
356356 else false)
357357 then throw("Wrong minimum sell price")
358358 else true
359359 }
360360
361361
362362 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
363363 then unit
364364 else fromBase58String(assetId)
365365
366366
367367 func getPriceAssetIdFromBid (bidDataKey) = {
368368 let bidData = getStringByKey((bidDataKey + "_OPEN"))
369369 if ((bidData == ""))
370370 then throw("Bid not found")
371371 else {
372372 let bidDataArr = split(bidData, "_")
373373 let bidAmount = parseIntValue(bidDataArr[1])
374374 let bidAssetId = getBidAssetId(bidDataArr[0])
375375 if ((0 >= bidAmount))
376376 then throw("Wrong amount")
377377 else $Tuple2(bidAmount, bidAssetId)
378378 }
379379 }
380380
381381
382382 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
383383 then throw(maintenanceMSG)
384384 else {
385385 let isSponsored = if ((pubKey != ""))
386386 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
387387 else 0
388388 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
389389 then (isSponsored > 0)
390390 else false)
391391 then toString(addressFromPublicKey(fromBase58String(pubKey)))
392392 else toBase58String(i.caller.bytes)
393393 let get_sponsored_waves = if (if ((pubKey != ""))
394394 then (isSponsored > 0)
395395 else false)
396396 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
397397 else unit
398398 if ((get_sponsored_waves == get_sponsored_waves))
399399 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
400400 else throw("Strict value is not equal to itself.")
401401 }
402402
403403
404404 func idCallerDate (i) = if (!(dappRunning))
405405 then throw(maintenanceMSG)
406406 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
407407
408408
409409 func buyMint (i,artId,issuer,bidId,bidOwner) = {
410410 let $t01297713036 = idCallerDate(i)
411411 let id = $t01297713036._1
412412 let caller = $t01297713036._2
413413 let date = $t01297713036._3
414414 let isBid = if (if (if ((caller == issuer))
415415 then (bidOwner != "")
416416 else false)
417417 then (bidId != "")
418418 else false)
419419 then true
420420 else false
421421 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
422422 if (if (if ((blockEnd != 0))
423423 then (height >= blockEnd)
424424 else false)
425425 then !(isBid)
426426 else false)
427427 then throw("Sale ended.")
428428 else {
429429 let callerIsIssuer = (caller == issuer)
430430 let totalNFT = getIntegerByKey("total_nft_issued")
431431 let signID = getStringByKey(keySignID(issuer, artId))
432432 let artworkName = getStringByKey(keyName(issuer, artId))
433433 if ((artworkName == ""))
434434 then throw("Art doesn't exist")
435435 else {
436436 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
437437 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
438438 let artworkPrice = if (callerIsIssuer)
439439 then (currentCertificationPrice * 2)
440440 else getIntegerByKey(keyPrice(issuer, artId))
441441 let priceAssetId = if (callerIsIssuer)
442442 then toBase58String(signAssetId)
443443 else getStringByKey(keyAssetIdAccepted(issuer, artId))
444444 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
445445 if (if (if (!(isBid))
446446 then !(callerIsIssuer)
447447 else false)
448448 then if (if ((0 >= artworkPrice))
449449 then true
450450 else !(isOnSale))
451451 then true
452452 else (0 >= maxCanSell)
453453 else false)
454454 then throw("Art not for sale")
455455 else if (if (if (!(isBid))
456456 then callerIsIssuer
457457 else false)
458458 then (0 >= maxCanSell)
459459 else false)
460460 then throw("Max issuable not set")
461461 else {
462462 let checkUser = validateUser(issuer)
463463 if (if (isBid)
464464 then (checkUser != "")
465465 else false)
466466 then throw(checkUser)
467467 else {
468468 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
469469 let $t01455514747 = if (isBid)
470470 then getPriceAssetIdFromBid(bidDataKey)
471471 else validatePriceAssetId(i, priceAssetId, artworkPrice)
472472 let amount = $t01455514747._1
473473 let assetId = $t01455514747._2
474474 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
475475 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
476476 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
477477 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
478478 let isWhitelisted = checkWhitelist(issuer)
479479 let cut = if ((isWhitelisted > height))
480480 then 0
481481 else if ((assetId == signAssetId))
482482 then signCut
483483 else usdnWaveCut
484484 let amountForSign = fraction(amount, cut, 100)
485485 let amountForAgent = if (if (if ((agent != feeReceiver))
486486 then (agentShare > 0)
487487 else false)
488488 then (height > isWhitelisted)
489489 else false)
490- then fraction(amount, agentShare, 100)
490+ then fraction(amount, agentShare, 10000)
491491 else 0
492492 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
493493 then (publicAgentShare > 0)
494494 else false)
495495 then (height > isWhitelisted)
496496 else false)
497- then fraction(amount, publicAgentShare, 100)
497+ then fraction(amount, publicAgentShare, 10000)
498498 else 0
499499 let amountForCreator = (amount - amountForSign)
500500 if ((amountSold == maxCanSell))
501501 then throw("Art sold out")
502502 else {
503503 let newAmountSold = (amountSold + 1)
504504 let issueMeta = ((((((((((("Creator: " + issuer) + ",
505505 ArtID: ") + artId) + ",
506506 SignID: ") + signID) + ",
507507 Artwork name: ") + artworkName) + ",
508508 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
509509 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
510510 let idNFT = calculateAssetId(issueNFT)
511511 let sellStatus = if (if ((newAmountSold == maxCanSell))
512512 then true
513513 else !(isOnSale))
514514 then false
515515 else true
516516 let receiveNFT = if (if (if ((caller == issuer))
517517 then (bidOwner != "")
518518 else false)
519519 then (bidId != "")
520520 else false)
521521 then addressFromStringValue(bidOwner)
522522 else i.caller
523523 let assetIdBid = if (!(isDefined(assetId)))
524524 then "WAVES"
525525 else toBase58String(value(assetId))
526526 let bidData = getStringByKey((bidDataKey + "_OPEN"))
527527 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
528528 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
529529 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
530530 let soldValue = if (!(isBid))
531531 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
532532 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
533533 let soldData = StringEntry(soldKey, soldValue)
534534 let commissionsWithAgent = if ((amountForAgent != 0))
535535 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
536536 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
537537 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
538538 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
539539 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
540540 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)
541541 if (isBid)
542542 then [soldData, bidUpdate, bidDelOld] :: buyRes
543543 else soldData :: buyRes
544544 }
545545 }
546546 }
547547 }
548548 }
549549 }
550550
551551
552552 func asString (bv) = match bv {
553553 case bv0: String =>
554554 bv0
555555 case _ =>
556556 throw("Sponsored Public Key String expected")
557557 }
558558
559559
560560 @Callable(invoke)
561561 func setConf (key,val) = {
562562 let caller = toString(invoke.caller)
563563 if (containsElement([chris, toString(this)], caller))
564564 then if (contains(key, "conf_"))
565565 then [StringEntry(key, val)]
566566 else throw("Entries starting with conf_ only")
567567 else throw("You are not allowed to change this")
568568 }
569569
570570
571571
572572 @Callable(i)
573573 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
574- let $t01965319726 = idCallerDateSponsored(i, pubKey)
575- let artId = $t01965319726._1
576- let caller = $t01965319726._2
577- let date = $t01965319726._3
578- let isSponsored = $t01965319726._4
574+ let $t01980219875 = idCallerDateSponsored(i, pubKey)
575+ let artId = $t01980219875._1
576+ let caller = $t01980219875._2
577+ let date = $t01980219875._3
578+ let isSponsored = $t01980219875._4
579579 if (!(validateHash(sha256Hash)))
580580 then throw("Hash should be 64 characters maximum")
581581 else {
582- let $t01982719896 = setLIcence(cidLicence, sha256Licence)
583- let licenceCID = $t01982719896._1
584- let licenceHash = $t01982719896._2
582+ let $t01997620045 = setLIcence(cidLicence, sha256Licence)
583+ let licenceCID = $t01997620045._1
584+ let licenceHash = $t01997620045._2
585585 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
586586 if ((validateArtwork != ""))
587587 then throw("Something went wrong!")
588588 else {
589589 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
590- let $t02019520279 = if (whitelisted_drop)
590+ let $t02034420428 = if (whitelisted_drop)
591591 then $Tuple2(0, signID)
592592 else validatePayment(i)
593- let amount = $t02019520279._1
594- let assetId = $t02019520279._2
593+ let amount = $t02034420428._1
594+ let assetId = $t02034420428._2
595595 if (!(isDefined(amount)))
596596 then throw("Something went wrong")
597597 else {
598598 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
599599 if ((entryExist != ""))
600600 then throw("You already added it")
601601 else {
602602 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
603603 if ((hashExist != ""))
604604 then throw("Hash already registered")
605605 else {
606606 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
607607 if (!(isSignCertified))
608608 then throw("Sign Certificate not found for this address.")
609609 else {
610610 let decrease_whitelist_drop = if (whitelisted_drop)
611611 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
612612 else unit
613613 if ((decrease_whitelist_drop == decrease_whitelist_drop))
614614 then {
615615 let txToCaller = if (isSponsored)
616616 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
617617 else nil
618618 ([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)
619619 }
620620 else throw("Strict value is not equal to itself.")
621621 }
622622 }
623623 }
624624 }
625625 }
626626 }
627627 }
628628
629629
630630
631631 @Callable(i)
632632 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
633633 then throw(maintenanceMSG)
634634 else {
635- let $t02331323383 = idCallerDateSponsored(i, pubKey)
636- let id = $t02331323383._1
637- let caller = $t02331323383._2
638- let date = $t02331323383._3
639- let isSponsored = $t02331323383._4
640- let $t02339323462 = setLIcence(cidLicence, sha256Licence)
641- let licenceCID = $t02339323462._1
642- let licenceHash = $t02339323462._2
635+ let $t02346223532 = idCallerDateSponsored(i, pubKey)
636+ let id = $t02346223532._1
637+ let caller = $t02346223532._2
638+ let date = $t02346223532._3
639+ let isSponsored = $t02346223532._4
640+ let $t02354223611 = setLIcence(cidLicence, sha256Licence)
641+ let licenceCID = $t02354223611._1
642+ let licenceHash = $t02354223611._2
643643 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
644644 if ((validateArtwork != ""))
645645 then throw("Something went wrong!")
646646 else {
647647 let entryExist = getStringByKey(keyName(caller, txid))
648648 if ((entryExist == ""))
649649 then throw("Entry not found")
650650 else {
651651 let flag = getStringByKey(keyFlag(caller, txid))
652652 if ((flag == "ILLEGAL"))
653653 then throw("Cannot update ILLEGAL artwork")
654654 else if (!(isArtMinted(caller, txid)))
655655 then {
656656 let txToCaller = if (isSponsored)
657657 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
658658 else nil
659659 ([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)
660660 }
661661 else throw("Already minted")
662662 }
663663 }
664664 }
665665
666666
667667
668668 @Callable(i)
669669 func flagArtwork (artId,addr,flag,note) = {
670- let $t02508925123 = idCallerDate(i)
671- let id = $t02508925123._1
672- let caller = $t02508925123._2
670+ let $t02523825272 = idCallerDate(i)
671+ let id = $t02523825272._1
672+ let caller = $t02523825272._2
673673 if (containsElement([chris, toString(this)], caller))
674674 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
675675 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
676676 else throw(("Unknow status " + flag))
677677 else throw("You are not allowed")
678678 }
679679
680680
681681
682682 @Callable(i)
683683 func deleteArtwork (artId,addr) = {
684- let $t02555925593 = idCallerDate(i)
685- let id = $t02555925593._1
686- let caller = $t02555925593._2
684+ let $t02570825742 = idCallerDate(i)
685+ let id = $t02570825742._1
686+ let caller = $t02570825742._2
687687 let addrToUse = if (containsElement([chris, toString(this)], caller))
688688 then addr
689689 else caller
690690 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
691691 if ((entryExist == ""))
692692 then throw("No art matching for this address")
693693 else {
694694 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
695695 if ((sha256Hash == ""))
696696 then throw("No art hash matching for this address")
697697 else {
698698 let signID = getStringByKey(keySignID(addrToUse, artId))
699699 if ((signID == ""))
700700 then throw("No SIGN ID matching")
701701 else {
702702 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))]
703703 if (!(isArtMinted(addrToUse, artId)))
704704 then if (!(dappRunning))
705705 then throw(maintenanceMSG)
706706 else dataToDelete
707707 else if (containsElement([chris, toString(this)], caller))
708708 then dataToDelete
709709 else throw("Art already minted, you cannot delete it")
710710 }
711711 }
712712 }
713713 }
714714
715715
716716
717717 @Callable(i)
718718 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
719- let $t02842928499 = idCallerDateSponsored(i, pubKey)
720- let id = $t02842928499._1
721- let caller = $t02842928499._2
722- let date = $t02842928499._3
723- let isSponsored = $t02842928499._4
719+ let $t02857828648 = idCallerDateSponsored(i, pubKey)
720+ let id = $t02857828648._1
721+ let caller = $t02857828648._2
722+ let date = $t02857828648._3
723+ let isSponsored = $t02857828648._4
724724 let artworkName = getStringByKey(keyName(caller, artId))
725725 if ((artworkName == ""))
726726 then throw("This art doesn't match your account")
727727 else {
728728 let flag = getStringByKey(keyFlag(caller, artId))
729729 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
730730 then throw("Flagged artwork")
731731 else {
732732 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
733733 if ((0 > blockEnd))
734734 then throw("Negative end")
735735 else if (if ((blockEnd > 0))
736736 then if ((maxMint != 1))
737737 then true
738738 else (price != 0)
739739 else false)
740740 then throw("Timed offer only allowed for unique edition and offer only")
741741 else {
742742 let baseHeight = if ((blockEnd == 0))
743743 then 0
744744 else height
745745 if (!(acceptedAssetIds(assetId)))
746746 then throw("Something went wrong!")
747747 else if (!(validateMinSell(assetId, price)))
748748 then throw("Something went wrong!")
749749 else {
750750 let checkUser = validateUser(caller)
751751 if ((checkUser != ""))
752752 then throw(checkUser)
753753 else {
754754 let amountSold = getIntegerByKey(keyIssued(caller, artId))
755755 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
756756 if ((maxMint > 100))
757757 then throw("100 editions max per artwork")
758758 else if (if ((amountSold != 0))
759759 then (amountSold == maxCanSell)
760760 else false)
761761 then throw("Max edition reached.")
762762 else if (if ((amountSold > 0))
763763 then (maxCanSell != maxMint)
764764 else false)
765765 then throw("Cannot change maximum issuable anymore")
766766 else if (if ((bidNbr > 0))
767767 then (maxCanSell != maxMint)
768768 else false)
769769 then throw("Cannot change maximum issuable with active orders")
770770 else {
771771 let sellStatus = if (if ((price > 0))
772772 then (maxMint > 0)
773773 else false)
774774 then true
775775 else false
776776 let txToCaller = if (isSponsored)
777777 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
778778 else nil
779779 ([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)
780780 }
781781 }
782782 }
783783 }
784784 }
785785 }
786786 }
787787
788788
789789
790790 @Callable(i)
791791 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
792792
793793
794794
795795 @Callable(i)
796796 func setBid (artId,issuer) = {
797- let $t03087730917 = idCallerDate(i)
798- let id = $t03087730917._1
799- let caller = $t03087730917._2
800- let date = $t03087730917._3
801- let $t03092230958 = isPayment(i)
802- let payment = $t03092230958._1
803- let amount = $t03092230958._2
797+ let $t03102631066 = idCallerDate(i)
798+ let id = $t03102631066._1
799+ let caller = $t03102631066._2
800+ let date = $t03102631066._3
801+ let $t03107131107 = isPayment(i)
802+ let payment = $t03107131107._1
803+ let amount = $t03107131107._2
804804 let assetId = if (!(isDefined(payment.assetId)))
805805 then "WAVES"
806806 else toBase58String(value(payment.assetId))
807807 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
808808 if (if ((blockEnd != 0))
809809 then (height >= blockEnd)
810810 else false)
811811 then throw("Sale ended.")
812812 else {
813813 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
814814 if (!(acceptedAssetIds(assetId)))
815815 then throw("asset not accepted")
816816 else if (!(validateMinSell(assetId, amount)))
817817 then throw("Wrong min sell")
818818 else {
819819 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
820820 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
821821 if ((0 >= maxCanSell))
822822 then throw("No max edition set for this artwork")
823823 else if ((amountSold >= maxCanSell))
824824 then throw("Sold out, you cannot bid")
825825 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
826826 }
827827 }
828828 }
829829
830830
831831
832832 @Callable(i)
833833 func acceptBid (artId,issuer,bidId,bidOwner) = {
834- let $t03211632156 = idCallerDate(i)
835- let id = $t03211632156._1
836- let caller = $t03211632156._2
837- let date = $t03211632156._3
834+ let $t03226532305 = idCallerDate(i)
835+ let id = $t03226532305._1
836+ let caller = $t03226532305._2
837+ let date = $t03226532305._3
838838 if ((caller != issuer))
839839 then throw("You cannot do this action")
840840 else buyMint(i, artId, issuer, bidId, bidOwner)
841841 }
842842
843843
844844
845845 @Callable(i)
846846 func cancelBid (artId,issuer,bidId,bidOwner) = {
847- let $t03238232443 = idCallerDate(i)
848- let id = $t03238232443._1
849- let caller = $t03238232443._2
850- let date = $t03238232443._3
847+ let $t03253132592 = idCallerDate(i)
848+ let id = $t03253132592._1
849+ let caller = $t03253132592._2
850+ let date = $t03253132592._3
851851 if (if ((caller != bidOwner))
852852 then (caller != issuer)
853853 else false)
854854 then throw("You cannot do this action")
855855 else {
856856 let returnMoneyTo = if ((caller == issuer))
857857 then bidOwner
858858 else caller
859859 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
860860 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
861861 let bidData = getStringByKey((bidDataKey + "_OPEN"))
862862 if ((bidData == ""))
863863 then throw("Bid not found")
864864 else {
865865 let bidDataArr = split(bidData, "_")
866866 let assetId = getBidAssetId(bidDataArr[0])
867867 let bidStatus = "CANCELED"
868868 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
869869 }
870870 }
871871 }
872872
873873
874874 @Verifier(tx)
875875 func verifier () = match tx {
876876 case inv: InvokeScriptTransaction =>
877877 if (if (if (if ((inv.function == "addArtwork"))
878878 then (inv.dApp == this)
879879 else false)
880880 then (inv.fee == 500000)
881881 else false)
882882 then (inv.feeAssetId == unit)
883883 else false)
884884 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
885885 else if (if (if (if ((inv.function == "updateArtwork"))
886886 then (inv.dApp == this)
887887 else false)
888888 then (inv.fee == 500000)
889889 else false)
890890 then (inv.feeAssetId == unit)
891891 else false)
892892 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
893893 else if (if (if (if ((inv.function == "sellArtwork"))
894894 then (inv.dApp == this)
895895 else false)
896896 then (inv.fee == 500000)
897897 else false)
898898 then (inv.feeAssetId == unit)
899899 else false)
900900 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
901901 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
902902 case _ =>
903903 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
904904 }
905905

github/deemru/w8io/c3f4982 
108.89 ms