tx · 7RW2MBaXV6wkuesib9NM1U9ECvtxNiryKq5PKg4DrALu

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02400000 Waves

2023.01.19 10:03 [2411481] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "7RW2MBaXV6wkuesib9NM1U9ECvtxNiryKq5PKg4DrALu", "fee": 2400000, "feeAssetId": null, "timestamp": 1674111845471, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "YA78YDEsa1414G2T8Wk9kZ2awJgKRSCB3x3XFR73V9YBHiZpjLqqMEGpPcunf73Nxg59ota651uBmbr4xFxZibf" ], "script": "base64:BgJfCAISBAoCCAgSEAoOCAgICAgICAgICAgIAQgSDwoNCAgICAgICAgICAgBCBIGCgQICAgIEgQKAggIEggKBggBAQgBCBIECgIICBIECgIICBIGCgQICAgIEgYKBAgICAhOAAdWRVJTSU9OAgUxLjEuOQEOZ2V0U3RyaW5nQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAAIdW5pdFRlc3QHAAlvcmFjbGVGZWUJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl9vcmFjbGVfZmVlAAhzaWduRGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAhFjb25mX3NpZ253ZWJfZGFwcAALZmVlUmVjZWl2ZXIJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfZmVlX3JlY2VpdmVyAAh1c2VyRGFwcAMFCHVuaXRUZXN0CQEFdmFsdWUBCQCmCAECIzNNdDRSR01FeWpTV1lBb2NUUHFkNTV3ZEhRUUIzUFUyVUNtCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECD2NvbmZfdXNlcnNfZGFwcAANd2hpdGVsaXN0RGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAhNjb25mX3doaXRlbGlzdF9kYXBwAAtzaWduQXNzZXRJZAkA2QQBCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X1NJR04AC3VzZG5Bc3NldElkCQDZBAEJAQ5nZXRTdHJpbmdCeUtleQECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfVVNETgALdXNkdEFzc2V0SWQJANkEAQkBDmdldFN0cmluZ0J5S2V5AQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAx3YXZlc0Fzc2V0SWQBAAAFY2hyaXMJAQ5nZXRTdHJpbmdCeUtleQECDGNvbmZfYWRtaW5fMQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUJb3JhY2xlRmVlBQNrZXkCH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBD2dldEludGVnZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ5jaGVja1doaXRlbGlzdAEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFDXdoaXRlbGlzdERhcHAFA2tleQAAAQ9nZXRCb29sZWFuQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQNrZXkHAAdzaWduQ3V0AAcAC3VzZG5XYXZlQ3V0AAoADmRlZmF1bHRMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhRjb25mX2RlZmF1bHRfbGljZW5jZQASZGVmYXVsdEhhc2hMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAtkYXBwUnVubmluZwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQh1c2VyRGFwcAIUY29uZl9kYXBwX2lzX3J1bm5pbmcGAA5tYWludGVuYW5jZU1TRwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAIUY29uZl9tYWludGVuYW5jZV9tc2cCAAANdXNlclN1c3BlbmRlZAIJU1VTUEVOREVEAAt1c2VyUmVtb3ZlZAIHUkVNT1ZFRAAQdXNlclVucmVnaXN0ZXJlZAIMVU5SRUdJU1RFUkVEAAt1c2VyQWxsb3dlZAIHQUxMT1dFRAAZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQtzaWduQXNzZXRJZAETZ2V0QXJ0d29ya1JveWFsdGllcwEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQDoBwEUY2hlY2tTaWduQ2VydGlmaWNhdGUDBnNpZ25JRAVPd25lcgpzaGEyNTZIYXNoBAckbWF0Y2gwCQCdCAIFCHNpZ25EYXBwCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUGc2lnbklEAgFfBQVPd25lcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQEIY29udGFpbnMCBQFhBQpzaGEyNTZIYXNoBgcHAQt2YWxpZGF0ZUNJRAEDY2lkAwkBCGNvbnRhaW5zAgUDY2lkAgEvAwMJAGYCAEwJALECAQUDY2lkCQAAAgkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFA2NpZAIBLwABBwcBDHZhbGlkYXRlSGFzaAEEaGFzaAkAAAIJALECAQUEaGFzaABAAQ1rZXlVc2VyU3RhdHVzAQZjYWxsZXIJAKwCAgIMdXNlcl9zdGF0dXNfBQZjYWxsZXIBB2tleURhdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2RhdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOYW1lAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9uYW1lXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5RGVzYwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGVzY18FBWFydElkAgFfBQZjYWxsZXIBDWtleURpc3BsYXlDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2Rpc3BsYXlfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RXhwb3J0SGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZXhwb3J0X2hhc2hfBQVhcnRJZAIBXwUGY2FsbGVyAQxrZXlFeHBvcnRDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIPYXJ0X2V4cG9ydF9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlNYXhNaW50AgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDGFydF9tYXhtaW50XwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5U2lnbklEAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlJc3N1ZWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X2lzc3VlZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleU9uU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfb25zYWxlXwUFYXJ0SWQCAV8FBmNhbGxlcgEOa2V5TGljZW5jZUhhc2gCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIRYXJ0X2xpY2VuY2VfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDWtleUxpY2VuY2VDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2xpY2VuY2VfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VGFncwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FBWFydElkAgFfBQZjYWxsZXIBB2tleVR5cGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3R5cGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOb3RlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9ub3RlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5Q3Jhd2xlcgIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQxrZXlSb3lhbHRpZXMCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIOYXJ0X3JveWFsdGllc18FBWFydElkAgFfBQZjYWxsZXIBCGtleVByaWNlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCmFydF9wcmljZV8FBWFydElkAgFfBQZjYWxsZXIBCmtleUVuZFNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBc3NldElkQWNjZXB0ZWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgISYXJ0X2Fzc2V0QWNjZXB0ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlGbGFnAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXJ0aXN0QWdlbnRBZGRyAQphcnRpc3RBZGRyCQCsAgICDWFydGlzdF9hZ2VudF8FCmFydGlzdEFkZHIBD2tleVByaW1hcnlTaGFyZQEKYXJ0aXN0QWRkcgkArAICAhVhcnRpc3RfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBEWtleUhhc2hCeVR4aWRBZGRyAgZjYWxsZXIEdHhpZAkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUEdHhpZAIBXwUGY2FsbGVyAQ5rZXlPd25lckJ5SGFzaAEKc2hhMjU2SGFzaAkArAICAhJnZXRfb3duZXJfYnlfaGFzaF8FCnNoYTI1Nkhhc2gBDWtleWlkQnlTaWduaWQCBmNhbGxlcgZzaWduSWQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUGc2lnbklkAgFfBQZjYWxsZXIBEmtleVR4aWRCeUhhc2hPd25lcgIKc2hhMjU2SGFzaAZjYWxsZXIJAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUKc2hhMjU2SGFzaAUGY2FsbGVyAQ52YWxpZGF0ZUFsbENJRAMKY2lkRGlzcGxheQljaWRFeHBvcnQKY2lkTGljZW5jZQMJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUKY2lkRGlzcGxheQkAAgECEVdyb25nIERpc3BsYXkgQ0lEAwkBASEBCQELdmFsaWRhdGVDSUQBBQljaWRFeHBvcnQJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFCmNpZExpY2VuY2UCAAkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWRMaWNlbmNlBwkAAgECEVdyb25nIExpY2VuY2UgQ0lEBgEPdmFsaWRhdGVBbGxIYXNoAgxzaGEyNTZFeHBvcnQNc2hhMjU2TGljZW5jZQMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFDHNoYTI1NkV4cG9ydAkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFDXNoYTI1NkxpY2VuY2UJAAIBAhlMaWNlbmNlIEhhc2ggNjQgY2hhci4gbWF4BgEOdmFsaWRhdGVTdHJpbmcCA3N0cgNtYXgDCQAAAgkAsQIBBQNzdHIAAAkAAgECGEZpZWxkIGNhbm5vdCBiZSBpcyBlbXB0eQMJAGYCCQCxAgEFA3N0cgUDbWF4CQACAQkArAICBQNzdHICDCBpcyB0b28gbG9uZwYBDHZhbGlkYXRlVXNlcgEGY2FsbGVyAwYJAAIBBQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkBgkAAAIFCnVzZXJTdGF0dXMFC3VzZXJBbGxvd2VkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFCnVzZXJTdGF0dXMFC3VzZXJSZW1vdmVkAg9BY2NvdW50IHJlbW92ZWQCAAEKc2V0TEljZW5jZQIKY2lkTGljZW5jZQ1zaGEyNTZMaWNlbmNlBANjaWQDCQAAAgkAsQIBBQpjaWRMaWNlbmNlAAAFDmRlZmF1bHRMaWNlbmNlBQpjaWRMaWNlbmNlBARoYXNoAwkAAAIJALECAQUNc2hhMjU2TGljZW5jZQAABRJkZWZhdWx0SGFzaExpY2VuY2UFDXNoYTI1NkxpY2VuY2UJAJQKAgUDY2lkBQRoYXNoARN2YWxpZGF0ZUFydHdvcmtEYXRhCgZjYWxsZXIKY2lkRGlzcGxheQljaWRFeHBvcnQKbGljZW5jZUNJRAxzaGEyNTZFeHBvcnQLbGljZW5jZUhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCXJveWFsdGllcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEPdmFsaWRhdGVQYXltZW50AQFpBAskdDA4OTEwODk0NgkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQskdDA4OTEwODk0NgJfMQQGYW1vdW50CAULJHQwODkxMDg5NDYCXzIEB2Fzc2V0SWQDAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAACCAUHcGF5bWVudAdhc3NldElkBQtzaWduQXNzZXRJZAcIBQdwYXltZW50B2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUGYW1vdW50BRljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQACAQkArAICAhlQYXltZW50IGFtb3VudCBzaG91bGQgYmUgCQCkAwEFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAJQKAgUGYW1vdW50BQdhc3NldElkAQtpc0FydE1pbnRlZAIJYWRkclRvVXNlBWFydElkBAckbWF0Y2gwCQCaCAIFBHRoaXMJAQlrZXlJc3N1ZWQCBQlhZGRyVG9Vc2UFBWFydElkAwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAMJAQIhPQIFAWIAAAYHBwEUdmFsaWRhdGVQcmljZUFzc2V0SWQDAWkMcHJpY2VBc3NldElkDGFydHdvcmtQcmljZQQLJHQwOTUzNDk1NzAJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAULJHQwOTUzNDk1NzACXzEEBmFtb3VudAgFCyR0MDk1MzQ5NTcwAl8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAUEdW5pdAMDCQBmAgkAsQIBBQxwcmljZUFzc2V0SWQAAAkAAAIJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAUMcHJpY2VBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECDldyb25nIGFzc2V0IGlkAwMJAAACBQdhc3NldElkBQR1bml0CQECIT0CBQxwcmljZUFzc2V0SWQCAAcJAAIBAg5Xcm9uZyBhc3NldCBpZAMJAQIhPQIFDGFydHdvcmtQcmljZQUGYW1vdW50CQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBEGFjY2VwdGVkQXNzZXRJZHMBB2Fzc2V0SWQDAwMDAwkBAiE9AgUHYXNzZXRJZAkA2AQBBQtzaWduQXNzZXRJZAkBAiE9AgUHYXNzZXRJZAkA2AQBBQx3YXZlc0Fzc2V0SWQHCQECIT0CBQdhc3NldElkAgVXQVZFUwcJAQIhPQIFB2Fzc2V0SWQJANgEAQULdXNkbkFzc2V0SWQHCQECIT0CBQdhc3NldElkCQDYBAEFC3VzZHRBc3NldElkBwkAAgECJk9ubHkgU0lHTiwgVVNETixVU0RUIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAgdhc3NldElkBXByaWNlBAxtaW5TZWxsV2F2ZXMDBQh1bml0VGVzdAAKCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQECDndhdmVzX21pbl9zZWxsBAttaW5TZWxsVXNkbgDAhD0EC21pblNlbGxTaWduAwUIdW5pdFRlc3QAAQkAaAIFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UAAgMDAwMDAwkAAAIFB2Fzc2V0SWQJANgEAQULdXNkbkFzc2V0SWQJAGYCBQttaW5TZWxsVXNkbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwkAAAIFB2Fzc2V0SWQJANgEAQULdXNkdEFzc2V0SWQJAGYCBQttaW5TZWxsVXNkbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwkAAAIFB2Fzc2V0SWQJANgEAQULc2lnbkFzc2V0SWQJAGYCBQttaW5TZWxsU2lnbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwMJAAACBQdhc3NldElkCQDYBAEFDHdhdmVzQXNzZXRJZAYJAAACBQdhc3NldElkAgVXQVZFUwkAZgIFDG1pblNlbGxXYXZlcwUFcHJpY2UHCQECIT0CBQVwcmljZQAABwkAAgECGFdyb25nIG1pbmltdW0gc2VsbCBwcmljZQYBDWdldEJpZEFzc2V0SWQBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEKYmlkRGF0YUtleQQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgMJAAACBQdiaWREYXRhAgAJAAIBAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8ECWJpZEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJpZERhdGFBcnIAAQQKYmlkQXNzZXRJZAkBDWdldEJpZEFzc2V0SWQBCQCRAwIFCmJpZERhdGFBcnIAAAMJAGcCAAAFCWJpZEFtb3VudAkAAgECDFdyb25nIGFtb3VudAkAlAoCBQliaWRBbW91bnQFCmJpZEFzc2V0SWQBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIBaQZwdWJLZXkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cEBmNhbGxlcgMDCQAAAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQDYBAEIBQR0aGlzBWJ5dGVzCQEBIQEJAQlpc0RlZmluZWQBCAUBaQhwYXltZW50cwcJAKUIAQkApwgBCQDZBAEFBnB1YktleQkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBNnZXRfc3BvbnNvcmVkX3dhdmVzAwkBAiE9AgUGcHViS2V5AgAJAPwHBAUNd2hpdGVsaXN0RGFwcAIJdXNlRnJlZVR4CQDMCAIJAKUIAQkApwgBCQDZBAEFBnB1YktleQUDbmlsBQNuaWwFBHVuaXQDCQAAAgUTZ2V0X3Nwb25zb3JlZF93YXZlcwUTZ2V0X3Nwb25zb3JlZF93YXZlcwkAlQoDCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFBmNhbGxlcggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDGlkQ2FsbGVyRGF0ZQEBaQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwkAlQoDCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwgFCWxhc3RCbG9jawl0aW1lc3RhbXABB2J1eU1pbnQFAWkFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBA0kdDAxMjcwMjEyNzYxCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAxMjcwMjEyNzYxAl8xBAZjYWxsZXIIBQ0kdDAxMjcwMjEyNzYxAl8yBARkYXRlCAUNJHQwMTI3MDIxMjc2MQJfMwQFaXNCaWQDAwMJAAACBQZjYWxsZXIFBmlzc3VlcgkBAiE9AgUIYmlkT3duZXICAAcJAQIhPQIFBWJpZElkAgAHBgcECGJsb2NrRW5kCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleUVuZFNhbGUCBQZjYWxsZXIFBWFydElkAwMDCQECIT0CBQhibG9ja0VuZAAACQBnAgUGaGVpZ2h0BQhibG9ja0VuZAcJAQEhAQUFaXNCaWQHCQACAQILU2FsZSBlbmRlZC4EDmNhbGxlcklzSXNzdWVyCQAAAgUGY2FsbGVyBQZpc3N1ZXIECHRvdGFsTkZUCQEPZ2V0SW50ZWdlckJ5S2V5AQIQdG90YWxfbmZ0X2lzc3VlZAQGc2lnbklECQEOZ2V0U3RyaW5nQnlLZXkBCQEJa2V5U2lnbklEAgUGaXNzdWVyBQVhcnRJZAQLYXJ0d29ya05hbWUJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGaXNzdWVyBQVhcnRJZAMJAAACBQthcnR3b3JrTmFtZQIACQACAQIRQXJ0IGRvZXNuJ3QgZXhpc3QECGlzT25TYWxlCQEPZ2V0Qm9vbGVhbkJ5S2V5AQkBCWtleU9uU2FsZQIFBmlzc3VlcgUFYXJ0SWQECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQMYXJ0d29ya1ByaWNlAwUOY2FsbGVySXNJc3N1ZXIJAGgCBRljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlAAIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEIa2V5UHJpY2UCBQZpc3N1ZXIFBWFydElkBAxwcmljZUFzc2V0SWQDBQ5jYWxsZXJJc0lzc3VlcgkA2AQBBQtzaWduQXNzZXRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUFzc2V0SWRBY2NlcHRlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDAwMJAQEhAQUFaXNCaWQJAQEhAQUOY2FsbGVySXNJc3N1ZXIHAwMJAGcCAAAFDGFydHdvcmtQcmljZQYJAQEhAQUIaXNPblNhbGUGCQBnAgAABQptYXhDYW5TZWxsBwkAAgECEEFydCBub3QgZm9yIHNhbGUDAwMJAQEhAQUFaXNCaWQFDmNhbGxlcklzSXNzdWVyBwkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhRNYXggaXNzdWFibGUgbm90IHNldAQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGaXNzdWVyAwMFBWlzQmlkCQECIT0CBQljaGVja1VzZXICAAcJAAIBBQljaGVja1VzZXIECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBA0kdDAxNDQ2NDE0NjMxAwUFaXNCaWQJARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQUKYmlkRGF0YUtleQkBFHZhbGlkYXRlUHJpY2VBc3NldElkAwUBaQUMcHJpY2VBc3NldElkBQxhcnR3b3JrUHJpY2UEBmFtb3VudAgFDSR0MDE0NDY0MTQ2MzECXzEEB2Fzc2V0SWQIBQ0kdDAxNDQ2NDE0NjMxAl8yBAVhZ2VudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBEmtleUFydGlzdEFnZW50QWRkcgEFBmlzc3VlcgULZmVlUmVjZWl2ZXIECmFnZW50U2hhcmUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUIdXNlckRhcHAJAQ9rZXlQcmltYXJ5U2hhcmUBBQZpc3N1ZXIAAAQNaXNXaGl0ZWxpc3RlZAkBDmNoZWNrV2hpdGVsaXN0AQUGaXNzdWVyBANjdXQDCQBmAgUNaXNXaGl0ZWxpc3RlZAUGaGVpZ2h0AAADCQAAAgUHYXNzZXRJZAULc2lnbkFzc2V0SWQFB3NpZ25DdXQFC3VzZG5XYXZlQ3V0BA1hbW91bnRGb3JTaWduCQBrAwUGYW1vdW50BQNjdXQAZAQOYW1vdW50Rm9yQWdlbnQDAwMJAQIhPQIFBWFnZW50BQtmZWVSZWNlaXZlcgkAZgIFCmFnZW50U2hhcmUAAAcJAGYCBQZoZWlnaHQFDWlzV2hpdGVsaXN0ZWQHCQBrAwUGYW1vdW50BQphZ2VudFNoYXJlAGQAAAQQYW1vdW50Rm9yQ3JlYXRvcgkAZQIFBmFtb3VudAUNYW1vdW50Rm9yU2lnbgMJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIMQXJ0IHNvbGQgb3V0BA1uZXdBbW91bnRTb2xkCQBkAgUKYW1vdW50U29sZAABBAlpc3N1ZU1ldGEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglDcmVhdG9yOiAFBmlzc3VlcgIKLAogQXJ0SUQ6IAUFYXJ0SWQCCywKIFNpZ25JRDogBQZzaWduSUQCESwKIEFydHdvcmsgbmFtZTogBQthcnR3b3JrTmFtZQIKLAogSXNzdWU6IAkApAMBBQ1uZXdBbW91bnRTb2xkAgEvCQCkAwEFCm1heENhblNlbGwECGlzc3VlTkZUCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQh0b3RhbE5GVAABBQlpc3N1ZU1ldGEAAQAABwQFaWRORlQJALgIAQUIaXNzdWVORlQECnNlbGxTdGF0dXMDAwkAAAIFDW5ld0Ftb3VudFNvbGQFCm1heENhblNlbGwGCQEBIQEFCGlzT25TYWxlBwYECnJlY2VpdmVORlQDAwMJAAACBQZjYWxsZXIFBmlzc3VlcgkBAiE9AgUIYmlkT3duZXICAAcJAQIhPQIFBWJpZElkAgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQhiaWRPd25lcggFAWkGY2FsbGVyBAphc3NldElkQmlkAwkBASEBCQEJaXNEZWZpbmVkAQUHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQUHYXNzZXRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgQJYmlkRGVsT2xkCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWRVcGRhdGUJAQtTdHJpbmdFbnRyeQIJAKwCAgUKYmlkRGF0YUtleQIHX0NMT1NFRAkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQQHc29sZEtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhcnRfc29sZF8JAKQDAQUNbmV3QW1vdW50U29sZAIEX29mXwkApAMBBQptYXhDYW5TZWxsAgFfBQVhcnRJZAIBXwUGaXNzdWVyBAlzb2xkVmFsdWUDCQEBIQEFBWlzQmlkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBmNhbGxlcgIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQxhcnR3b3JrUHJpY2UCAV8FDHByaWNlQXNzZXRJZAIBXwkA2AQBBQVpZE5GVAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEFCnJlY2VpdmVORlQCAV8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8JAKQDAQUGYW1vdW50AgFfBQphc3NldElkQmlkAgFfCQDYBAEFBWlkTkZUBAhzb2xkRGF0YQkBC1N0cmluZ0VudHJ5AgUHc29sZEtleQUJc29sZFZhbHVlBAtjb21taXNzaW9ucwMJAQIhPQIFDmFtb3VudEZvckFnZW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyCQBlAgUNYW1vdW50Rm9yU2lnbgUOYW1vdW50Rm9yQWdlbnQFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBWFnZW50BQ5hbW91bnRGb3JBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgUNYW1vdW50Rm9yU2lnbgUHYXNzZXRJZAUDbmlsBAZidXlSZXMJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQFDW5ld0Ftb3VudFNvbGQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgRuZnRfCQDYBAEFBWlkTkZUBQdzb2xkS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUIdG90YWxORlQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIFCGlzc3VlTkZUCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIFEGFtb3VudEZvckNyZWF0b3IFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUKcmVjZWl2ZU5GVAABBQVpZE5GVAUDbmlsBQtjb21taXNzaW9ucwMFBWlzQmlkCQDMCAIFCHNvbGREYXRhCQDMCAIFCWJpZFVwZGF0ZQkAzAgCBQliaWREZWxPbGQFBmJ1eVJlcwkAzAgCBQhzb2xkRGF0YQUGYnV5UmVzAQhhc1N0cmluZwECYnYEByRtYXRjaDAFAmJ2AwkAAQIFByRtYXRjaDACBlN0cmluZwQDYnYwBQckbWF0Y2gwBQNidjAJAAIBAiRTcG9uc29yZWQgUHVibGljIEtleSBTdHJpbmcgZXhwZWN0ZWQKBmludm9rZQEHc2V0Q29uZgIDa2V5A3ZhbAQGY2FsbGVyCQClCAEIBQZpbnZva2UGY2FsbGVyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgMJAQhjb250YWlucwIFA2tleQIFY29uZl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUDa2V5BQN2YWwFA25pbAkAAgECIEVudHJpZXMgc3RhcnRpbmcgd2l0aCBjb25mXyBvbmx5CQACAQIiWW91IGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhpcwFpAQphZGRBcnR3b3JrDgpzaGEyNTZIYXNoBnNpZ25JRARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEdHlwZQpjaWREaXNwbGF5DHNoYTI1NkV4cG9ydAljaWRFeHBvcnQNc2hhMjU2TGljZW5jZQpjaWRMaWNlbmNlB2NyYXdsZXIJcm95YWx0aWVzBnB1YktleQQNJHQwMTg2NjQxODcyNAkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQFYXJ0SWQIBQ0kdDAxODY2NDE4NzI0Al8xBAZjYWxsZXIIBQ0kdDAxODY2NDE4NzI0Al8yBARkYXRlCAUNJHQwMTg2NjQxODcyNAJfMwMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFCnNoYTI1Nkhhc2gJAAIBAiRIYXNoIHNob3VsZCBiZSA2NCBjaGFyYWN0ZXJzIG1heGltdW0EDSR0MDE4ODI1MTg4OTQJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDE4ODI1MTg4OTQCXzEEC2xpY2VuY2VIYXNoCAUNJHQwMTg4MjUxODg5NAJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQoFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUJcm95YWx0aWVzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEEHdoaXRlbGlzdGVkX2Ryb3AJAGYCCQEOY2hlY2tXaGl0ZWxpc3QBCQCsAgIFBmNhbGxlcgILX2ZyZWVfZHJvcHMAAAQNJHQwMTkxOTMxOTI3NwMFEHdoaXRlbGlzdGVkX2Ryb3AJAJQKAgAABQZzaWduSUQJAQ92YWxpZGF0ZVBheW1lbnQBBQFpBAZhbW91bnQIBQ0kdDAxOTE5MzE5Mjc3Al8xBAdhc3NldElkCAUNJHQwMTkxOTMxOTI3NwJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFBmFtb3VudAkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQESa2V5VHhpZEJ5SGFzaE93bmVyAgUKc2hhMjU2SGFzaAUGY2FsbGVyAwkBAiE9AgUKZW50cnlFeGlzdAIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQECWhhc2hFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAMJAQIhPQIFCWhhc2hFeGlzdAIACQACAQIXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQED2lzU2lnbkNlcnRpZmllZAkBFGNoZWNrU2lnbkNlcnRpZmljYXRlAwUGc2lnbklEBQZjYWxsZXIFCnNoYTI1Nkhhc2gDCQEBIQEFD2lzU2lnbkNlcnRpZmllZAkAAgECLFNpZ24gQ2VydGlmaWNhdGUgbm90IGZvdW5kIGZvciB0aGlzIGFkZHJlc3MuBBdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAMFEHdoaXRlbGlzdGVkX2Ryb3AJAPwHBAUNd2hpdGVsaXN0RGFwcAILdXNlRnJlZURyb3AJAMwIAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBQNuaWwFA25pbAUEdW5pdAMJAAACBRdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAUGY2FsbGVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlUeGlkQnlIYXNoT3duZXICBQpzaGEyNTZIYXNoBQZjYWxsZXIFBWFydElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEHa2V5RGF0ZQIFBmNhbGxlcgUFYXJ0SWQFBGRhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQVhcnRJZAULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleURpc3BsYXlDaWQCBQZjYWxsZXIFBWFydElkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFeHBvcnRDaWQCBQZjYWxsZXIFBWFydElkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBWFydElkBQxzaGEyNTZFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUxpY2VuY2VIYXNoAgUGY2FsbGVyBQVhcnRJZAULbGljZW5jZUhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUxpY2VuY2VDaWQCBQZjYWxsZXIFBWFydElkBQpsaWNlbmNlQ0lECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQVhcnRJZAUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VGFncwIFBmNhbGxlcgUFYXJ0SWQFBHRhZ3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAQlrZXlTaWduSUQCBQZjYWxsZXIFBWFydElkBQZzaWduSUQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBwkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5aWRCeVNpZ25pZAIFBmNhbGxlcgUGc2lnbklEBQVhcnRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5SGFzaEJ5VHhpZEFkZHICBQZjYWxsZXIFBWFydElkBQpzaGEyNTZIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQVhcnRJZAUHY3Jhd2xlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGtleVJveWFsdGllcwIFBmNhbGxlcgUFYXJ0SWQFCXJveWFsdGllcwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIFBmFtb3VudAULc2lnbkFzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ11cGRhdGVBcnR3b3JrDQR0eGlkBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5AwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBA0kdDAyMjIxOTIyMjc2CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDIyMjE5MjIyNzYCXzEEBmNhbGxlcggFDSR0MDIyMjE5MjIyNzYCXzIEBGRhdGUIBQ0kdDAyMjIxOTIyMjc2Al8zBA0kdDAyMjI4NjIyMzU1CQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAyMjI4NjIyMzU1Al8xBAtsaWNlbmNlSGFzaAgFDSR0MDIyMjg2MjIzNTUCXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAMJAAACBQplbnRyeUV4aXN0AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQR0eGlkAwkAAAIFBGZsYWcCB0lMTEVHQUwJAAIBAh1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQEhAQkBC2lzQXJ0TWludGVkAgUGY2FsbGVyBQR0eGlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQR0eGlkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUEdHhpZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQR0eGlkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBHR4aWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUEdHhpZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBHR4aWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQR0eGlkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQR0eGlkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQR0eGlkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQR0eGlkBQlyb3lhbHRpZXMFA25pbAkAAgECDkFscmVhZHkgbWludGVkAWkBC2ZsYWdBcnR3b3JrBAVhcnRJZARhZGRyBGZsYWcEbm90ZQQNJHQwMjM4NTYyMzg5MAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjM4NTYyMzg5MAJfMQQGY2FsbGVyCAUNJHQwMjM4NTYyMzg5MAJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgdDT05TRU5UCQDMCAICAAkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleUZsYWcCBQRhZGRyBQVhcnRJZAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5Tm90ZQIFBGFkZHIFBWFydElkBQRub3RlBQNuaWwJAAIBCQCsAgICDlVua25vdyBzdGF0dXMgBQRmbGFnCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAFpAQ1kZWxldGVBcnR3b3JrAgVhcnRJZARhZGRyBA0kdDAyNDMyNjI0MzYwCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNDMyNjI0MzYwAl8xBAZjYWxsZXIIBQ0kdDAyNDMyNjI0MzYwAl8yBAlhZGRyVG9Vc2UDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQRhZGRyBQZjYWxsZXIECmVudHJ5RXhpc3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQplbnRyeUV4aXN0AgAJAAIBAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQKc2hhMjU2SGFzaAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUhhc2hCeVR4aWRBZGRyAgUJYWRkclRvVXNlBQVhcnRJZAMJAAACBQpzaGEyNTZIYXNoAgAJAAIBAiVObyBhcnQgaGFzaCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBAZzaWduSUQJAQ5nZXRTdHJpbmdCeUtleQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkAwkAAAIFBnNpZ25JRAIACQACAQITTm8gU0lHTiBJRCBtYXRjaGluZwQMZGF0YVRvRGVsZXRlCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEYXRlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5TmFtZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleURlc2MCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlEaXNwbGF5Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5RXhwb3J0Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RXhwb3J0SGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleUxpY2VuY2VIYXNoAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5TGljZW5jZUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVR5cGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUYWdzAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5TWF4TWludAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleVNpZ25JRAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleU9uU2FsZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleUZsYWcCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQhrZXlQcmljZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleUFzc2V0SWRBY2NlcHRlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5aWRCeVNpZ25pZAIFCWFkZHJUb1VzZQUGc2lnbklECQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlUeGlkQnlIYXNoT3duZXICBQpzaGEyNTZIYXNoBQlhZGRyVG9Vc2UJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUVuZFNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOb3RlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5Q3Jhd2xlcgIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleVJveWFsdGllcwIFCWFkZHJUb1VzZQUFYXJ0SWQFA25pbAMJAQEhAQkBC2lzQXJ0TWludGVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwUMZGF0YVRvRGVsZXRlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUMZGF0YVRvRGVsZXRlCQACAQIoQXJ0IGFscmVhZHkgbWludGVkLCB5b3UgY2Fubm90IGRlbGV0ZSBpdAFpAQtzZWxsQXJ0d29yawYFYXJ0SWQFcHJpY2UHbWF4TWludAdhc3NldElkCGJsb2NrRW5kBnB1YktleQQNJHQwMjcxOTYyNzI0NwkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyNzE5NjI3MjQ3Al8xBAZjYWxsZXIIBQ0kdDAyNzE5NjI3MjQ3Al8yBAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAiNUaGlzIGFydCBkb2Vzbid0IG1hdGNoIHlvdXIgYWNjb3VudAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBWFydElkAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQBmAgAABQhibG9ja0VuZAkAAgECDE5lZ2F0aXZlIGVuZAMDCQBmAgUIYmxvY2tFbmQAAAMJAQIhPQIFB21heE1pbnQAAQYJAQIhPQIFBXByaWNlAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQKYmFzZUhlaWdodAMJAAACBQhibG9ja0VuZAAAAAAFBmhlaWdodAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAgUHYXNzZXRJZAUFcHJpY2UJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQDCQBmAgUHbWF4TWludABkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQphbW91bnRTb2xkAAAJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQphbW91bnRTb2xkAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFBmJpZE5icgAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECMUNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSB3aXRoIGFjdGl2ZSBvcmRlcnMECnNlbGxTdGF0dXMDAwkAZgIFBXByaWNlAAAJAGYCBQdtYXhNaW50AAAHBgcJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEIa2V5UHJpY2UCBQZjYWxsZXIFBWFydElkBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkBQdtYXhNaW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZjYWxsZXIFBWFydElkBQdhc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmNhbGxlcgUFYXJ0SWQJAGQCBQpiYXNlSGVpZ2h0BQhibG9ja0VuZAUDbmlsAWkBCmJ1eUFydHdvcmsCBWFydElkBmlzc3VlcgkBB2J1eU1pbnQFBQFpBQVhcnRJZAUGaXNzdWVyAgACAAFpAQZzZXRCaWQCBWFydElkBmlzc3VlcgQNJHQwMjk1MDQyOTU0NAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjk1MDQyOTU0NAJfMQQGY2FsbGVyCAUNJHQwMjk1MDQyOTU0NAJfMgQEZGF0ZQgFDSR0MDI5NTA0Mjk1NDQCXzMEDSR0MDI5NTQ5Mjk1ODUJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMjk1NDkyOTU4NQJfMQQGYW1vdW50CAUNJHQwMjk1NDkyOTU4NQJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQECGJsb2NrRW5kCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAwMJAQIhPQIFCGJsb2NrRW5kAAAJAGcCBQZoZWlnaHQFCGJsb2NrRW5kBwkAAgECC1NhbGUgZW5kZWQuBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAIFB2Fzc2V0SWQFBmFtb3VudAkAAgECDldyb25nIG1pbiBzZWxsBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDCQBnAgAABQptYXhDYW5TZWxsCQACAQIjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQBnAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUGY2FsbGVyAgFfBQJpZAIFX09QRU4JAKwCAgkArAICCQCsAgIJAKwCAgUHYXNzZXRJZAIBXwkApAMBBQZhbW91bnQCAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBkAgUGYmlkTmJyAAEFA25pbAFpAQlhY2NlcHRCaWQEBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMzA3NDMzMDc4MwkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzA3NDMzMDc4MwJfMQQGY2FsbGVyCAUNJHQwMzA3NDMzMDc4MwJfMgQEZGF0ZQgFDSR0MDMwNzQzMzA3ODMCXzMDCQECIT0CBQZjYWxsZXIFBmlzc3VlcgkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24JAQdidXlNaW50BQUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQFCGJpZE93bmVyAWkBCWNhbmNlbEJpZAQFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBA0kdDAzMTAwOTMxMDcwCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMTAwOTMxMDcwAl8xBAZjYWxsZXIIBQ0kdDAzMTAwOTMxMDcwAl8yBARkYXRlCAUNJHQwMzEwMDkzMTA3MAJfMwMDCQECIT0CBQZjYWxsZXIFCGJpZE93bmVyCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBA1yZXR1cm5Nb25leVRvAwkAAAIFBmNhbGxlcgUGaXNzdWVyBQhiaWRPd25lcgUGY2FsbGVyBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQHYXNzZXRJZAkBDWdldEJpZEFzc2V0SWQBCQCRAwIFCmJpZERhdGFBcnIAAAQJYmlkU3RhdHVzAghDQU5DRUxFRAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQpiaWREYXRhS2V5AgFfBQliaWRTdGF0dXMJAKwCAgkArAICBQdiaWREYXRhAgFfCQCkAwEFBGRhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAkAZQIFBmJpZE5icgABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQ1yZXR1cm5Nb25leVRvCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBQdhc3NldElkBQNuaWwBAnR4AQh2ZXJpZmllcgAEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDADAwkAAAIIBQNpbnYIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAA0DAwkAAAIIBQNpbnYIZnVuY3Rpb24CDXVwZGF0ZUFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAwDAwkAAAIIBQNpbnYIZnVuY3Rpb24CC3NlbGxBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwAFCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5CQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V51KeOZg==", "height": 2411481, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 136XfSnznEh4239L1vh1wFBU4FofgjHZKXLN1SXCxvE7 Next: 3TZVYwPB8Yj3wX3r6t1xB9e5eUReLbDyCyqSbCusmjoW Diff:
OldNewDifferences
198198 else true
199199
200200
201-func validateUser (caller) = {
202- let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
203- if (if ((userStatus == userUnregistered))
204- then true
205- else (userStatus == userAllowed))
206- then "Register this account first with \"Account\" tab"
207- else if ((userStatus == userSuspended))
208- then "Account suspended"
209- else if ((userStatus == userRemoved))
210- then "Account removed"
211- else ""
212- }
201+func validateUser (caller) = if (true)
202+ then throw(caller)
203+ else {
204+ let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
205+ if (if ((userStatus == userUnregistered))
206+ then true
207+ else (userStatus == userAllowed))
208+ then "Register this account first with \"Account\" tab"
209+ else if ((userStatus == userSuspended))
210+ then "Account suspended"
211+ else if ((userStatus == userRemoved))
212+ then "Account removed"
213+ else ""
214+ }
213215
214216
215217 func setLIcence (cidLicence,sha256Licence) = {
257259
258260
259261 func validatePayment (i) = {
260- let $t088768912 = isPayment(i)
261- let payment = $t088768912._1
262- let amount = $t088768912._2
262+ let $t089108946 = isPayment(i)
263+ let payment = $t089108946._1
264+ let amount = $t089108946._2
263265 let assetId = if (if (isDefined(payment.assetId))
264266 then (payment.assetId == signAssetId)
265267 else false)
282284
283285
284286 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
285- let $t095009536 = isPayment(i)
286- let payment = $t095009536._1
287- let amount = $t095009536._2
287+ let $t095349570 = isPayment(i)
288+ let payment = $t095349570._1
289+ let amount = $t095349570._2
288290 let assetId = if (!(isDefined(payment.assetId)))
289291 then unit
290292 else if (if ((size(priceAssetId) > 0))
396398
397399
398400 func buyMint (i,artId,issuer,bidId,bidOwner) = {
399- let $t01266812727 = idCallerDate(i)
400- let id = $t01266812727._1
401- let caller = $t01266812727._2
402- let date = $t01266812727._3
401+ let $t01270212761 = idCallerDate(i)
402+ let id = $t01270212761._1
403+ let caller = $t01270212761._2
404+ let date = $t01270212761._3
403405 let isBid = if (if (if ((caller == issuer))
404406 then (bidOwner != "")
405407 else false)
455457 then throw(checkUser)
456458 else {
457459 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
458- let $t01443014597 = if (isBid)
460+ let $t01446414631 = if (isBid)
459461 then getPriceAssetIdFromBid(bidDataKey)
460462 else validatePriceAssetId(i, priceAssetId, artworkPrice)
461- let amount = $t01443014597._1
462- let assetId = $t01443014597._2
463+ let amount = $t01446414631._1
464+ let assetId = $t01446414631._2
463465 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
464466 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
465467 let isWhitelisted = checkWhitelist(issuer)
548550
549551 @Callable(i)
550552 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
551- let $t01863018690 = idCallerDateSponsored(i, pubKey)
552- let artId = $t01863018690._1
553- let caller = $t01863018690._2
554- let date = $t01863018690._3
553+ let $t01866418724 = idCallerDateSponsored(i, pubKey)
554+ let artId = $t01866418724._1
555+ let caller = $t01866418724._2
556+ let date = $t01866418724._3
555557 if (!(validateHash(sha256Hash)))
556558 then throw("Hash should be 64 characters maximum")
557559 else {
558- let $t01879118860 = setLIcence(cidLicence, sha256Licence)
559- let licenceCID = $t01879118860._1
560- let licenceHash = $t01879118860._2
561- if (true)
562- then throw(toString(addressFromPublicKey(fromBase58String(pubKey))))
560+ let $t01882518894 = setLIcence(cidLicence, sha256Licence)
561+ let licenceCID = $t01882518894._1
562+ let licenceHash = $t01882518894._2
563+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
564+ if ((validateArtwork != ""))
565+ then throw("Something went wrong!")
563566 else {
564- let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
565- if ((validateArtwork != ""))
566- then throw("Something went wrong!")
567+ let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
568+ let $t01919319277 = if (whitelisted_drop)
569+ then $Tuple2(0, signID)
570+ else validatePayment(i)
571+ let amount = $t01919319277._1
572+ let assetId = $t01919319277._2
573+ if (!(isDefined(amount)))
574+ then throw("Something went wrong")
567575 else {
568- let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
569- let $t01924519329 = if (whitelisted_drop)
570- then $Tuple2(0, signID)
571- else validatePayment(i)
572- let amount = $t01924519329._1
573- let assetId = $t01924519329._2
574- if (!(isDefined(amount)))
575- then throw("Something went wrong")
576+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
577+ if ((entryExist != ""))
578+ then throw("You already added it")
576579 else {
577- let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
578- if ((entryExist != ""))
579- then throw("You already added it")
580+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
581+ if ((hashExist != ""))
582+ then throw("Hash already registered")
580583 else {
581- let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
582- if ((hashExist != ""))
583- then throw("Hash already registered")
584+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
585+ if (!(isSignCertified))
586+ then throw("Sign Certificate not found for this address.")
584587 else {
585- let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
586- if (!(isSignCertified))
587- then throw("Sign Certificate not found for this address.")
588- else {
589- let decrease_whitelist_drop = if (whitelisted_drop)
590- then invoke(whitelistDapp, "useFreeDrop", [toBase58String(i.caller.bytes)], nil)
591- else unit
592- if ((decrease_whitelist_drop == decrease_whitelist_drop))
593- then [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)]
594- else throw("Strict value is not equal to itself.")
595- }
588+ let decrease_whitelist_drop = if (whitelisted_drop)
589+ then invoke(whitelistDapp, "useFreeDrop", [toBase58String(i.caller.bytes)], nil)
590+ else unit
591+ if ((decrease_whitelist_drop == decrease_whitelist_drop))
592+ then [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)]
593+ else throw("Strict value is not equal to itself.")
596594 }
597595 }
598596 }
607605 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
608606 then throw(maintenanceMSG)
609607 else {
610- let $t02227122328 = idCallerDateSponsored(i, pubKey)
611- let id = $t02227122328._1
612- let caller = $t02227122328._2
613- let date = $t02227122328._3
614- let $t02233822407 = setLIcence(cidLicence, sha256Licence)
615- let licenceCID = $t02233822407._1
616- let licenceHash = $t02233822407._2
608+ let $t02221922276 = idCallerDateSponsored(i, pubKey)
609+ let id = $t02221922276._1
610+ let caller = $t02221922276._2
611+ let date = $t02221922276._3
612+ let $t02228622355 = setLIcence(cidLicence, sha256Licence)
613+ let licenceCID = $t02228622355._1
614+ let licenceHash = $t02228622355._2
617615 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
618616 if ((validateArtwork != ""))
619617 then throw("Something went wrong!")
636634
637635 @Callable(i)
638636 func flagArtwork (artId,addr,flag,note) = {
639- let $t02390823942 = idCallerDate(i)
640- let id = $t02390823942._1
641- let caller = $t02390823942._2
637+ let $t02385623890 = idCallerDate(i)
638+ let id = $t02385623890._1
639+ let caller = $t02385623890._2
642640 if (containsElement([chris, toString(this)], caller))
643641 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
644642 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
650648
651649 @Callable(i)
652650 func deleteArtwork (artId,addr) = {
653- let $t02437824412 = idCallerDate(i)
654- let id = $t02437824412._1
655- let caller = $t02437824412._2
651+ let $t02432624360 = idCallerDate(i)
652+ let id = $t02432624360._1
653+ let caller = $t02432624360._2
656654 let addrToUse = if (containsElement([chris, toString(this)], caller))
657655 then addr
658656 else caller
685683
686684 @Callable(i)
687685 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
688- let $t02724827299 = idCallerDateSponsored(i, pubKey)
689- let id = $t02724827299._1
690- let caller = $t02724827299._2
686+ let $t02719627247 = idCallerDateSponsored(i, pubKey)
687+ let id = $t02719627247._1
688+ let caller = $t02719627247._2
691689 let artworkName = getStringByKey(keyName(caller, artId))
692690 if ((artworkName == ""))
693691 then throw("This art doesn't match your account")
758756
759757 @Callable(i)
760758 func setBid (artId,issuer) = {
761- let $t02955629596 = idCallerDate(i)
762- let id = $t02955629596._1
763- let caller = $t02955629596._2
764- let date = $t02955629596._3
765- let $t02960129637 = isPayment(i)
766- let payment = $t02960129637._1
767- let amount = $t02960129637._2
759+ let $t02950429544 = idCallerDate(i)
760+ let id = $t02950429544._1
761+ let caller = $t02950429544._2
762+ let date = $t02950429544._3
763+ let $t02954929585 = isPayment(i)
764+ let payment = $t02954929585._1
765+ let amount = $t02954929585._2
768766 let assetId = if (!(isDefined(payment.assetId)))
769767 then "WAVES"
770768 else toBase58String(value(payment.assetId))
795793
796794 @Callable(i)
797795 func acceptBid (artId,issuer,bidId,bidOwner) = {
798- let $t03079530835 = idCallerDate(i)
799- let id = $t03079530835._1
800- let caller = $t03079530835._2
801- let date = $t03079530835._3
796+ let $t03074330783 = idCallerDate(i)
797+ let id = $t03074330783._1
798+ let caller = $t03074330783._2
799+ let date = $t03074330783._3
802800 if ((caller != issuer))
803801 then throw("You cannot do this action")
804802 else buyMint(i, artId, issuer, bidId, bidOwner)
808806
809807 @Callable(i)
810808 func cancelBid (artId,issuer,bidId,bidOwner) = {
811- let $t03106131122 = idCallerDate(i)
812- let id = $t03106131122._1
813- let caller = $t03106131122._2
814- let date = $t03106131122._3
809+ let $t03100931070 = idCallerDate(i)
810+ let id = $t03100931070._1
811+ let caller = $t03100931070._2
812+ let date = $t03100931070._3
815813 if (if ((caller != bidOwner))
816814 then (caller != issuer)
817815 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "1.1.9"
55
66 func getStringByKey (key) = valueOrElse(getString(this, key), "")
77
88
99 let unitTest = false
1010
1111 let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1212
1313 let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1414
1515 let feeReceiver = getStringByKey("conf_fee_receiver")
1616
1717 let userDapp = if (unitTest)
1818 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1919 else value(addressFromString(getStringByKey("conf_users_dapp")))
2020
2121 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2222
2323 let signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
2424
2525 let usdnAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDN"))
2626
2727 let usdtAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT"))
2828
2929 let wavesAssetId = base58''
3030
3131 let chris = getStringByKey("conf_admin_1")
3232
3333 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
3434
3535
3636 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
3737
3838
3939 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
4040
4141
4242 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
4343
4444
4545 let signCut = 7
4646
4747 let usdnWaveCut = 10
4848
4949 let defaultLicence = getStringByKey("conf_default_licence")
5050
5151 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
5252
5353 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
5454
5555 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
5656
5757 let userSuspended = "SUSPENDED"
5858
5959 let userRemoved = "REMOVED"
6060
6161 let userUnregistered = "UNREGISTERED"
6262
6363 let userAllowed = "ALLOWED"
6464
6565 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
6666
6767 func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
6868
6969
7070 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
7171 case a: String =>
7272 if (contains(a, sha256Hash))
7373 then true
7474 else false
7575 case _ =>
7676 false
7777 }
7878
7979
8080 func validateCID (cid) = if (contains(cid, "/"))
8181 then if (if ((76 > size(cid)))
8282 then (size(split(cid, "/")[0]) == 59)
8383 else false)
8484 then (16 > size(split(cid, "/")[1]))
8585 else false
8686 else false
8787
8888
8989 func validateHash (hash) = (size(hash) == 64)
9090
9191
9292 func keyUserStatus (caller) = ("user_status_" + caller)
9393
9494
9595 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9696
9797
9898 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9999
100100
101101 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
102102
103103
104104 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
105105
106106
107107 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
108108
109109
110110 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
111111
112112
113113 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
114114
115115
116116 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
117117
118118
119119 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
120120
121121
122122 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
123123
124124
125125 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
126126
127127
128128 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
129129
130130
131131 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
132132
133133
134134 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
135135
136136
137137 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
138138
139139
140140 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
141141
142142
143143 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
144144
145145
146146 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
147147
148148
149149 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
150150
151151
152152 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
153153
154154
155155 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
156156
157157
158158 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
159159
160160
161161 func keyPrimaryShare (artistAddr) = ("artist_agent_primary_" + artistAddr)
162162
163163
164164 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
165165
166166
167167 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
168168
169169
170170 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
171171
172172
173173 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
174174
175175
176176 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
177177 then throw("Wrong Display CID")
178178 else if (!(validateCID(cidExport)))
179179 then throw("Wrong Export CID")
180180 else if (if ((cidLicence != ""))
181181 then !(validateCID(cidLicence))
182182 else false)
183183 then throw("Wrong Licence CID")
184184 else true
185185
186186
187187 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
188188 then throw("Export Hash 64 char. max")
189189 else if (!(validateHash(sha256Licence)))
190190 then throw("Licence Hash 64 char. max")
191191 else true
192192
193193
194194 func validateString (str,max) = if ((size(str) == 0))
195195 then throw("Field cannot be is empty")
196196 else if ((size(str) > max))
197197 then throw((str + " is too long"))
198198 else true
199199
200200
201-func validateUser (caller) = {
202- let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
203- if (if ((userStatus == userUnregistered))
204- then true
205- else (userStatus == userAllowed))
206- then "Register this account first with \"Account\" tab"
207- else if ((userStatus == userSuspended))
208- then "Account suspended"
209- else if ((userStatus == userRemoved))
210- then "Account removed"
211- else ""
212- }
201+func validateUser (caller) = if (true)
202+ then throw(caller)
203+ else {
204+ let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
205+ if (if ((userStatus == userUnregistered))
206+ then true
207+ else (userStatus == userAllowed))
208+ then "Register this account first with \"Account\" tab"
209+ else if ((userStatus == userSuspended))
210+ then "Account suspended"
211+ else if ((userStatus == userRemoved))
212+ then "Account removed"
213+ else ""
214+ }
213215
214216
215217 func setLIcence (cidLicence,sha256Licence) = {
216218 let cid = if ((size(cidLicence) == 0))
217219 then defaultLicence
218220 else cidLicence
219221 let hash = if ((size(sha256Licence) == 0))
220222 then defaultHashLicence
221223 else sha256Licence
222224 $Tuple2(cid, hash)
223225 }
224226
225227
226228 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
227229 let checkUser = validateUser(caller)
228230 if ((checkUser != ""))
229231 then throw(checkUser)
230232 else if ((size(cidDisplay) == 0))
231233 then throw("Display CID cannot be empty")
232234 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
233235 then throw("Problem with CID")
234236 else if (!(validateAllHash(sha256Export, licenceHash)))
235237 then throw("Problem with Hashes")
236238 else if (!(validateString(name, 100)))
237239 then throw("100 Char. max name")
238240 else if (!(validateString(description, 1000)))
239241 then throw("1000 Char. max description")
240242 else if (if ((0 > royalties))
241243 then true
242244 else (royalties > 1000))
243245 then throw("Royalties cannot be less than 0% or higher than 10%")
244246 else if ((size(split(tags, ",")) > 5))
245247 then throw("5 tags max.")
246248 else ""
247249 }
248250
249251
250252 func isPayment (i) = if ((size(i.payments) == 0))
251253 then throw("No payment attached")
252254 else {
253255 let payment = value(i.payments[0])
254256 let amount = value(payment.amount)
255257 $Tuple2(payment, amount)
256258 }
257259
258260
259261 func validatePayment (i) = {
260- let $t088768912 = isPayment(i)
261- let payment = $t088768912._1
262- let amount = $t088768912._2
262+ let $t089108946 = isPayment(i)
263+ let payment = $t089108946._1
264+ let amount = $t089108946._2
263265 let assetId = if (if (isDefined(payment.assetId))
264266 then (payment.assetId == signAssetId)
265267 else false)
266268 then payment.assetId
267269 else throw("Only SIGN token accepted as transaction fee")
268270 if ((amount != currentCertificationPrice))
269271 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
270272 else $Tuple2(amount, assetId)
271273 }
272274
273275
274276 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
275277 case b: Int =>
276278 if ((b != 0))
277279 then true
278280 else false
279281 case _ =>
280282 false
281283 }
282284
283285
284286 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
285- let $t095009536 = isPayment(i)
286- let payment = $t095009536._1
287- let amount = $t095009536._2
287+ let $t095349570 = isPayment(i)
288+ let payment = $t095349570._1
289+ let amount = $t095349570._2
288290 let assetId = if (!(isDefined(payment.assetId)))
289291 then unit
290292 else if (if ((size(priceAssetId) > 0))
291293 then (toBase58String(value(payment.assetId)) == priceAssetId)
292294 else false)
293295 then payment.assetId
294296 else throw("Wrong asset id")
295297 if (if ((assetId == unit))
296298 then (priceAssetId != "")
297299 else false)
298300 then throw("Wrong asset id")
299301 else if ((artworkPrice != amount))
300302 then throw("Payment don't match")
301303 else $Tuple2(amount, assetId)
302304 }
303305
304306
305307 func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
306308 then (assetId != toBase58String(wavesAssetId))
307309 else false)
308310 then (assetId != "WAVES")
309311 else false)
310312 then (assetId != toBase58String(usdnAssetId))
311313 else false)
312314 then (assetId != toBase58String(usdtAssetId))
313315 else false)
314316 then throw("Only SIGN, USDN,USDT or WAVES accepted")
315317 else true
316318
317319
318320 func validateMinSell (assetId,price) = {
319321 let minSellWaves = if (unitTest)
320322 then 10
321323 else getIntegerByKeyFromOracle("waves_min_sell")
322324 let minSellUsdn = 1000000
323325 let minSellSign = if (unitTest)
324326 then 1
325327 else (currentCertificationPrice * 2)
326328 if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
327329 then (minSellUsdn > price)
328330 else false)
329331 then (price != 0)
330332 else false)
331333 then true
332334 else if (if ((assetId == toBase58String(usdtAssetId)))
333335 then (minSellUsdn > price)
334336 else false)
335337 then (price != 0)
336338 else false)
337339 then true
338340 else if (if ((assetId == toBase58String(signAssetId)))
339341 then (minSellSign > price)
340342 else false)
341343 then (price != 0)
342344 else false)
343345 then true
344346 else if (if (if ((assetId == toBase58String(wavesAssetId)))
345347 then true
346348 else (assetId == "WAVES"))
347349 then (minSellWaves > price)
348350 else false)
349351 then (price != 0)
350352 else false)
351353 then throw("Wrong minimum sell price")
352354 else true
353355 }
354356
355357
356358 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
357359 then unit
358360 else fromBase58String(assetId)
359361
360362
361363 func getPriceAssetIdFromBid (bidDataKey) = {
362364 let bidData = getStringByKey((bidDataKey + "_OPEN"))
363365 if ((bidData == ""))
364366 then throw("Bid not found")
365367 else {
366368 let bidDataArr = split(bidData, "_")
367369 let bidAmount = parseIntValue(bidDataArr[1])
368370 let bidAssetId = getBidAssetId(bidDataArr[0])
369371 if ((0 >= bidAmount))
370372 then throw("Wrong amount")
371373 else $Tuple2(bidAmount, bidAssetId)
372374 }
373375 }
374376
375377
376378 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
377379 then throw(maintenanceMSG)
378380 else {
379381 let caller = if (if ((toBase58String(i.caller.bytes) == toBase58String(this.bytes)))
380382 then !(isDefined(i.payments))
381383 else false)
382384 then toString(addressFromPublicKey(fromBase58String(pubKey)))
383385 else toBase58String(i.caller.bytes)
384386 let get_sponsored_waves = if ((pubKey != ""))
385387 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
386388 else unit
387389 if ((get_sponsored_waves == get_sponsored_waves))
388390 then $Tuple3(toBase58String(i.transactionId), caller, lastBlock.timestamp)
389391 else throw("Strict value is not equal to itself.")
390392 }
391393
392394
393395 func idCallerDate (i) = if (!(dappRunning))
394396 then throw(maintenanceMSG)
395397 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
396398
397399
398400 func buyMint (i,artId,issuer,bidId,bidOwner) = {
399- let $t01266812727 = idCallerDate(i)
400- let id = $t01266812727._1
401- let caller = $t01266812727._2
402- let date = $t01266812727._3
401+ let $t01270212761 = idCallerDate(i)
402+ let id = $t01270212761._1
403+ let caller = $t01270212761._2
404+ let date = $t01270212761._3
403405 let isBid = if (if (if ((caller == issuer))
404406 then (bidOwner != "")
405407 else false)
406408 then (bidId != "")
407409 else false)
408410 then true
409411 else false
410412 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
411413 if (if (if ((blockEnd != 0))
412414 then (height >= blockEnd)
413415 else false)
414416 then !(isBid)
415417 else false)
416418 then throw("Sale ended.")
417419 else {
418420 let callerIsIssuer = (caller == issuer)
419421 let totalNFT = getIntegerByKey("total_nft_issued")
420422 let signID = getStringByKey(keySignID(issuer, artId))
421423 let artworkName = getStringByKey(keyName(issuer, artId))
422424 if ((artworkName == ""))
423425 then throw("Art doesn't exist")
424426 else {
425427 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
426428 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
427429 let artworkPrice = if (callerIsIssuer)
428430 then (currentCertificationPrice * 2)
429431 else getIntegerByKey(keyPrice(issuer, artId))
430432 let priceAssetId = if (callerIsIssuer)
431433 then toBase58String(signAssetId)
432434 else getStringByKey(keyAssetIdAccepted(issuer, artId))
433435 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
434436 if (if (if (!(isBid))
435437 then !(callerIsIssuer)
436438 else false)
437439 then if (if ((0 >= artworkPrice))
438440 then true
439441 else !(isOnSale))
440442 then true
441443 else (0 >= maxCanSell)
442444 else false)
443445 then throw("Art not for sale")
444446 else if (if (if (!(isBid))
445447 then callerIsIssuer
446448 else false)
447449 then (0 >= maxCanSell)
448450 else false)
449451 then throw("Max issuable not set")
450452 else {
451453 let checkUser = validateUser(issuer)
452454 if (if (isBid)
453455 then (checkUser != "")
454456 else false)
455457 then throw(checkUser)
456458 else {
457459 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
458- let $t01443014597 = if (isBid)
460+ let $t01446414631 = if (isBid)
459461 then getPriceAssetIdFromBid(bidDataKey)
460462 else validatePriceAssetId(i, priceAssetId, artworkPrice)
461- let amount = $t01443014597._1
462- let assetId = $t01443014597._2
463+ let amount = $t01446414631._1
464+ let assetId = $t01446414631._2
463465 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
464466 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
465467 let isWhitelisted = checkWhitelist(issuer)
466468 let cut = if ((isWhitelisted > height))
467469 then 0
468470 else if ((assetId == signAssetId))
469471 then signCut
470472 else usdnWaveCut
471473 let amountForSign = fraction(amount, cut, 100)
472474 let amountForAgent = if (if (if ((agent != feeReceiver))
473475 then (agentShare > 0)
474476 else false)
475477 then (height > isWhitelisted)
476478 else false)
477479 then fraction(amount, agentShare, 100)
478480 else 0
479481 let amountForCreator = (amount - amountForSign)
480482 if ((amountSold == maxCanSell))
481483 then throw("Art sold out")
482484 else {
483485 let newAmountSold = (amountSold + 1)
484486 let issueMeta = ((((((((((("Creator: " + issuer) + ",
485487 ArtID: ") + artId) + ",
486488 SignID: ") + signID) + ",
487489 Artwork name: ") + artworkName) + ",
488490 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
489491 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
490492 let idNFT = calculateAssetId(issueNFT)
491493 let sellStatus = if (if ((newAmountSold == maxCanSell))
492494 then true
493495 else !(isOnSale))
494496 then false
495497 else true
496498 let receiveNFT = if (if (if ((caller == issuer))
497499 then (bidOwner != "")
498500 else false)
499501 then (bidId != "")
500502 else false)
501503 then addressFromStringValue(bidOwner)
502504 else i.caller
503505 let assetIdBid = if (!(isDefined(assetId)))
504506 then "WAVES"
505507 else toBase58String(value(assetId))
506508 let bidData = getStringByKey((bidDataKey + "_OPEN"))
507509 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
508510 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
509511 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
510512 let soldValue = if (!(isBid))
511513 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
512514 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
513515 let soldData = StringEntry(soldKey, soldValue)
514516 let commissions = if ((amountForAgent != 0))
515517 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
516518 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
517519 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)
518520 if (isBid)
519521 then [soldData, bidUpdate, bidDelOld] :: buyRes
520522 else soldData :: buyRes
521523 }
522524 }
523525 }
524526 }
525527 }
526528 }
527529
528530
529531 func asString (bv) = match bv {
530532 case bv0: String =>
531533 bv0
532534 case _ =>
533535 throw("Sponsored Public Key String expected")
534536 }
535537
536538
537539 @Callable(invoke)
538540 func setConf (key,val) = {
539541 let caller = toString(invoke.caller)
540542 if (containsElement([chris, toString(this)], caller))
541543 then if (contains(key, "conf_"))
542544 then [StringEntry(key, val)]
543545 else throw("Entries starting with conf_ only")
544546 else throw("You are not allowed to change this")
545547 }
546548
547549
548550
549551 @Callable(i)
550552 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
551- let $t01863018690 = idCallerDateSponsored(i, pubKey)
552- let artId = $t01863018690._1
553- let caller = $t01863018690._2
554- let date = $t01863018690._3
553+ let $t01866418724 = idCallerDateSponsored(i, pubKey)
554+ let artId = $t01866418724._1
555+ let caller = $t01866418724._2
556+ let date = $t01866418724._3
555557 if (!(validateHash(sha256Hash)))
556558 then throw("Hash should be 64 characters maximum")
557559 else {
558- let $t01879118860 = setLIcence(cidLicence, sha256Licence)
559- let licenceCID = $t01879118860._1
560- let licenceHash = $t01879118860._2
561- if (true)
562- then throw(toString(addressFromPublicKey(fromBase58String(pubKey))))
560+ let $t01882518894 = setLIcence(cidLicence, sha256Licence)
561+ let licenceCID = $t01882518894._1
562+ let licenceHash = $t01882518894._2
563+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
564+ if ((validateArtwork != ""))
565+ then throw("Something went wrong!")
563566 else {
564- let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
565- if ((validateArtwork != ""))
566- then throw("Something went wrong!")
567+ let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
568+ let $t01919319277 = if (whitelisted_drop)
569+ then $Tuple2(0, signID)
570+ else validatePayment(i)
571+ let amount = $t01919319277._1
572+ let assetId = $t01919319277._2
573+ if (!(isDefined(amount)))
574+ then throw("Something went wrong")
567575 else {
568- let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
569- let $t01924519329 = if (whitelisted_drop)
570- then $Tuple2(0, signID)
571- else validatePayment(i)
572- let amount = $t01924519329._1
573- let assetId = $t01924519329._2
574- if (!(isDefined(amount)))
575- then throw("Something went wrong")
576+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
577+ if ((entryExist != ""))
578+ then throw("You already added it")
576579 else {
577- let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
578- if ((entryExist != ""))
579- then throw("You already added it")
580+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
581+ if ((hashExist != ""))
582+ then throw("Hash already registered")
580583 else {
581- let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
582- if ((hashExist != ""))
583- then throw("Hash already registered")
584+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
585+ if (!(isSignCertified))
586+ then throw("Sign Certificate not found for this address.")
584587 else {
585- let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
586- if (!(isSignCertified))
587- then throw("Sign Certificate not found for this address.")
588- else {
589- let decrease_whitelist_drop = if (whitelisted_drop)
590- then invoke(whitelistDapp, "useFreeDrop", [toBase58String(i.caller.bytes)], nil)
591- else unit
592- if ((decrease_whitelist_drop == decrease_whitelist_drop))
593- then [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)]
594- else throw("Strict value is not equal to itself.")
595- }
588+ let decrease_whitelist_drop = if (whitelisted_drop)
589+ then invoke(whitelistDapp, "useFreeDrop", [toBase58String(i.caller.bytes)], nil)
590+ else unit
591+ if ((decrease_whitelist_drop == decrease_whitelist_drop))
592+ then [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)]
593+ else throw("Strict value is not equal to itself.")
596594 }
597595 }
598596 }
599597 }
600598 }
601599 }
602600 }
603601
604602
605603
606604 @Callable(i)
607605 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
608606 then throw(maintenanceMSG)
609607 else {
610- let $t02227122328 = idCallerDateSponsored(i, pubKey)
611- let id = $t02227122328._1
612- let caller = $t02227122328._2
613- let date = $t02227122328._3
614- let $t02233822407 = setLIcence(cidLicence, sha256Licence)
615- let licenceCID = $t02233822407._1
616- let licenceHash = $t02233822407._2
608+ let $t02221922276 = idCallerDateSponsored(i, pubKey)
609+ let id = $t02221922276._1
610+ let caller = $t02221922276._2
611+ let date = $t02221922276._3
612+ let $t02228622355 = setLIcence(cidLicence, sha256Licence)
613+ let licenceCID = $t02228622355._1
614+ let licenceHash = $t02228622355._2
617615 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
618616 if ((validateArtwork != ""))
619617 then throw("Something went wrong!")
620618 else {
621619 let entryExist = getStringByKey(keyName(caller, txid))
622620 if ((entryExist == ""))
623621 then throw("Entry not found")
624622 else {
625623 let flag = getStringByKey(keyFlag(caller, txid))
626624 if ((flag == "ILLEGAL"))
627625 then throw("Cannot update ILLEGAL artwork")
628626 else if (!(isArtMinted(caller, txid)))
629627 then [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)]
630628 else throw("Already minted")
631629 }
632630 }
633631 }
634632
635633
636634
637635 @Callable(i)
638636 func flagArtwork (artId,addr,flag,note) = {
639- let $t02390823942 = idCallerDate(i)
640- let id = $t02390823942._1
641- let caller = $t02390823942._2
637+ let $t02385623890 = idCallerDate(i)
638+ let id = $t02385623890._1
639+ let caller = $t02385623890._2
642640 if (containsElement([chris, toString(this)], caller))
643641 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
644642 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
645643 else throw(("Unknow status " + flag))
646644 else throw("You are not allowed")
647645 }
648646
649647
650648
651649 @Callable(i)
652650 func deleteArtwork (artId,addr) = {
653- let $t02437824412 = idCallerDate(i)
654- let id = $t02437824412._1
655- let caller = $t02437824412._2
651+ let $t02432624360 = idCallerDate(i)
652+ let id = $t02432624360._1
653+ let caller = $t02432624360._2
656654 let addrToUse = if (containsElement([chris, toString(this)], caller))
657655 then addr
658656 else caller
659657 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
660658 if ((entryExist == ""))
661659 then throw("No art matching for this address")
662660 else {
663661 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
664662 if ((sha256Hash == ""))
665663 then throw("No art hash matching for this address")
666664 else {
667665 let signID = getStringByKey(keySignID(addrToUse, artId))
668666 if ((signID == ""))
669667 then throw("No SIGN ID matching")
670668 else {
671669 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))]
672670 if (!(isArtMinted(addrToUse, artId)))
673671 then if (!(dappRunning))
674672 then throw(maintenanceMSG)
675673 else dataToDelete
676674 else if (containsElement([chris, toString(this)], caller))
677675 then dataToDelete
678676 else throw("Art already minted, you cannot delete it")
679677 }
680678 }
681679 }
682680 }
683681
684682
685683
686684 @Callable(i)
687685 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
688- let $t02724827299 = idCallerDateSponsored(i, pubKey)
689- let id = $t02724827299._1
690- let caller = $t02724827299._2
686+ let $t02719627247 = idCallerDateSponsored(i, pubKey)
687+ let id = $t02719627247._1
688+ let caller = $t02719627247._2
691689 let artworkName = getStringByKey(keyName(caller, artId))
692690 if ((artworkName == ""))
693691 then throw("This art doesn't match your account")
694692 else {
695693 let flag = getStringByKey(keyFlag(caller, artId))
696694 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
697695 then throw("Flagged artwork")
698696 else {
699697 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
700698 if ((0 > blockEnd))
701699 then throw("Negative end")
702700 else if (if ((blockEnd > 0))
703701 then if ((maxMint != 1))
704702 then true
705703 else (price != 0)
706704 else false)
707705 then throw("Timed offer only allowed for unique edition and offer only")
708706 else {
709707 let baseHeight = if ((blockEnd == 0))
710708 then 0
711709 else height
712710 if (!(acceptedAssetIds(assetId)))
713711 then throw("Something went wrong!")
714712 else if (!(validateMinSell(assetId, price)))
715713 then throw("Something went wrong!")
716714 else {
717715 let checkUser = validateUser(caller)
718716 if ((checkUser != ""))
719717 then throw(checkUser)
720718 else {
721719 let amountSold = getIntegerByKey(keyIssued(caller, artId))
722720 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
723721 if ((maxMint > 100))
724722 then throw("100 editions max per artwork")
725723 else if (if ((amountSold != 0))
726724 then (amountSold == maxCanSell)
727725 else false)
728726 then throw("Max edition reached.")
729727 else if (if ((amountSold > 0))
730728 then (maxCanSell != maxMint)
731729 else false)
732730 then throw("Cannot change maximum issuable anymore")
733731 else if (if ((bidNbr > 0))
734732 then (maxCanSell != maxMint)
735733 else false)
736734 then throw("Cannot change maximum issuable with active orders")
737735 else {
738736 let sellStatus = if (if ((price > 0))
739737 then (maxMint > 0)
740738 else false)
741739 then true
742740 else false
743741 [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))]
744742 }
745743 }
746744 }
747745 }
748746 }
749747 }
750748 }
751749
752750
753751
754752 @Callable(i)
755753 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
756754
757755
758756
759757 @Callable(i)
760758 func setBid (artId,issuer) = {
761- let $t02955629596 = idCallerDate(i)
762- let id = $t02955629596._1
763- let caller = $t02955629596._2
764- let date = $t02955629596._3
765- let $t02960129637 = isPayment(i)
766- let payment = $t02960129637._1
767- let amount = $t02960129637._2
759+ let $t02950429544 = idCallerDate(i)
760+ let id = $t02950429544._1
761+ let caller = $t02950429544._2
762+ let date = $t02950429544._3
763+ let $t02954929585 = isPayment(i)
764+ let payment = $t02954929585._1
765+ let amount = $t02954929585._2
768766 let assetId = if (!(isDefined(payment.assetId)))
769767 then "WAVES"
770768 else toBase58String(value(payment.assetId))
771769 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
772770 if (if ((blockEnd != 0))
773771 then (height >= blockEnd)
774772 else false)
775773 then throw("Sale ended.")
776774 else {
777775 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
778776 if (!(acceptedAssetIds(assetId)))
779777 then throw("asset not accepted")
780778 else if (!(validateMinSell(assetId, amount)))
781779 then throw("Wrong min sell")
782780 else {
783781 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
784782 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
785783 if ((0 >= maxCanSell))
786784 then throw("No max edition set for this artwork")
787785 else if ((amountSold >= maxCanSell))
788786 then throw("Sold out, you cannot bid")
789787 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
790788 }
791789 }
792790 }
793791
794792
795793
796794 @Callable(i)
797795 func acceptBid (artId,issuer,bidId,bidOwner) = {
798- let $t03079530835 = idCallerDate(i)
799- let id = $t03079530835._1
800- let caller = $t03079530835._2
801- let date = $t03079530835._3
796+ let $t03074330783 = idCallerDate(i)
797+ let id = $t03074330783._1
798+ let caller = $t03074330783._2
799+ let date = $t03074330783._3
802800 if ((caller != issuer))
803801 then throw("You cannot do this action")
804802 else buyMint(i, artId, issuer, bidId, bidOwner)
805803 }
806804
807805
808806
809807 @Callable(i)
810808 func cancelBid (artId,issuer,bidId,bidOwner) = {
811- let $t03106131122 = idCallerDate(i)
812- let id = $t03106131122._1
813- let caller = $t03106131122._2
814- let date = $t03106131122._3
809+ let $t03100931070 = idCallerDate(i)
810+ let id = $t03100931070._1
811+ let caller = $t03100931070._2
812+ let date = $t03100931070._3
815813 if (if ((caller != bidOwner))
816814 then (caller != issuer)
817815 else false)
818816 then throw("You cannot do this action")
819817 else {
820818 let returnMoneyTo = if ((caller == issuer))
821819 then bidOwner
822820 else caller
823821 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
824822 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
825823 let bidData = getStringByKey((bidDataKey + "_OPEN"))
826824 if ((bidData == ""))
827825 then throw("Bid not found")
828826 else {
829827 let bidDataArr = split(bidData, "_")
830828 let assetId = getBidAssetId(bidDataArr[0])
831829 let bidStatus = "CANCELED"
832830 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
833831 }
834832 }
835833 }
836834
837835
838836 @Verifier(tx)
839837 func verifier () = match tx {
840838 case inv: InvokeScriptTransaction =>
841839 if (if ((inv.function == "addArtwork"))
842840 then (inv.dApp == this)
843841 else false)
844842 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
845843 else if (if ((inv.function == "updateArtwork"))
846844 then (inv.dApp == this)
847845 else false)
848846 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
849847 else if (if ((inv.function == "sellArtwork"))
850848 then (inv.dApp == this)
851849 else false)
852850 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
853851 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
854852 case _ =>
855853 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
856854 }
857855

github/deemru/w8io/873ac7e 
129.92 ms