tx · Hmjh4UhnrxPUBCgF1D96MBPZBfQ1Qo2ihWgUm5N8XAgY

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02400000 Waves

2023.01.19 10:13 [2411493] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "Hmjh4UhnrxPUBCgF1D96MBPZBfQ1Qo2ihWgUm5N8XAgY", "fee": 2400000, "feeAssetId": null, "timestamp": 1674112419509, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "n5d9rbQt122ZiPjb6xFXUVpU5FvsRUp4Nn3jsRcgkbRFjM2rm3XtqDY3DkxSm189kpKoUWEnMDzRsXFroe5uZqd" ], "script": "base64:BgJfCAISBAoCCAgSEAoOCAgICAgICAgICAgIAQgSDwoNCAgICAgICAgICAgBCBIGCgQICAgIEgQKAggIEggKBggBAQgBCBIECgIICBIECgIICBIGCgQICAgIEgYKBAgICAhOAAdWRVJTSU9OAgUxLjEuOQEOZ2V0U3RyaW5nQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAAIdW5pdFRlc3QHAAlvcmFjbGVGZWUJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl9vcmFjbGVfZmVlAAhzaWduRGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAhFjb25mX3NpZ253ZWJfZGFwcAALZmVlUmVjZWl2ZXIJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfZmVlX3JlY2VpdmVyAAh1c2VyRGFwcAMFCHVuaXRUZXN0CQEFdmFsdWUBCQCmCAECIzNNdDRSR01FeWpTV1lBb2NUUHFkNTV3ZEhRUUIzUFUyVUNtCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECD2NvbmZfdXNlcnNfZGFwcAANd2hpdGVsaXN0RGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAhNjb25mX3doaXRlbGlzdF9kYXBwAAtzaWduQXNzZXRJZAkA2QQBCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X1NJR04AC3VzZG5Bc3NldElkCQDZBAEJAQ5nZXRTdHJpbmdCeUtleQECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfVVNETgALdXNkdEFzc2V0SWQJANkEAQkBDmdldFN0cmluZ0J5S2V5AQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAx3YXZlc0Fzc2V0SWQBAAAFY2hyaXMJAQ5nZXRTdHJpbmdCeUtleQECDGNvbmZfYWRtaW5fMQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUJb3JhY2xlRmVlBQNrZXkCH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBD2dldEludGVnZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ5jaGVja1doaXRlbGlzdAEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFDXdoaXRlbGlzdERhcHAFA2tleQAAAQ9nZXRCb29sZWFuQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQNrZXkHAAdzaWduQ3V0AAcAC3VzZG5XYXZlQ3V0AAoADmRlZmF1bHRMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhRjb25mX2RlZmF1bHRfbGljZW5jZQASZGVmYXVsdEhhc2hMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAtkYXBwUnVubmluZwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQh1c2VyRGFwcAIUY29uZl9kYXBwX2lzX3J1bm5pbmcGAA5tYWludGVuYW5jZU1TRwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAIUY29uZl9tYWludGVuYW5jZV9tc2cCAAANdXNlclN1c3BlbmRlZAIJU1VTUEVOREVEAAt1c2VyUmVtb3ZlZAIHUkVNT1ZFRAAQdXNlclVucmVnaXN0ZXJlZAIMVU5SRUdJU1RFUkVEAAt1c2VyQWxsb3dlZAIHQUxMT1dFRAAZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQtzaWduQXNzZXRJZAETZ2V0QXJ0d29ya1JveWFsdGllcwEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQDoBwEUY2hlY2tTaWduQ2VydGlmaWNhdGUDBnNpZ25JRAVPd25lcgpzaGEyNTZIYXNoBAckbWF0Y2gwCQCdCAIFCHNpZ25EYXBwCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUGc2lnbklEAgFfBQVPd25lcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQEIY29udGFpbnMCBQFhBQpzaGEyNTZIYXNoBgcHAQt2YWxpZGF0ZUNJRAEDY2lkAwkBCGNvbnRhaW5zAgUDY2lkAgEvAwMJAGYCAEwJALECAQUDY2lkCQAAAgkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFA2NpZAIBLwABBwcBDHZhbGlkYXRlSGFzaAEEaGFzaAkAAAIJALECAQUEaGFzaABAAQ1rZXlVc2VyU3RhdHVzAQZjYWxsZXIJAKwCAgIMdXNlcl9zdGF0dXNfBQZjYWxsZXIBB2tleURhdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2RhdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOYW1lAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9uYW1lXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5RGVzYwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGVzY18FBWFydElkAgFfBQZjYWxsZXIBDWtleURpc3BsYXlDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2Rpc3BsYXlfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RXhwb3J0SGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZXhwb3J0X2hhc2hfBQVhcnRJZAIBXwUGY2FsbGVyAQxrZXlFeHBvcnRDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIPYXJ0X2V4cG9ydF9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlNYXhNaW50AgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDGFydF9tYXhtaW50XwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5U2lnbklEAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlJc3N1ZWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X2lzc3VlZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleU9uU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfb25zYWxlXwUFYXJ0SWQCAV8FBmNhbGxlcgEOa2V5TGljZW5jZUhhc2gCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIRYXJ0X2xpY2VuY2VfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDWtleUxpY2VuY2VDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2xpY2VuY2VfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VGFncwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FBWFydElkAgFfBQZjYWxsZXIBB2tleVR5cGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3R5cGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOb3RlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9ub3RlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5Q3Jhd2xlcgIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQxrZXlSb3lhbHRpZXMCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIOYXJ0X3JveWFsdGllc18FBWFydElkAgFfBQZjYWxsZXIBCGtleVByaWNlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCmFydF9wcmljZV8FBWFydElkAgFfBQZjYWxsZXIBCmtleUVuZFNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBc3NldElkQWNjZXB0ZWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgISYXJ0X2Fzc2V0QWNjZXB0ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlGbGFnAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXJ0aXN0QWdlbnRBZGRyAQphcnRpc3RBZGRyCQCsAgICDWFydGlzdF9hZ2VudF8FCmFydGlzdEFkZHIBD2tleVByaW1hcnlTaGFyZQEKYXJ0aXN0QWRkcgkArAICAhVhcnRpc3RfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBEWtleUhhc2hCeVR4aWRBZGRyAgZjYWxsZXIEdHhpZAkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUEdHhpZAIBXwUGY2FsbGVyAQ5rZXlPd25lckJ5SGFzaAEKc2hhMjU2SGFzaAkArAICAhJnZXRfb3duZXJfYnlfaGFzaF8FCnNoYTI1Nkhhc2gBDWtleWlkQnlTaWduaWQCBmNhbGxlcgZzaWduSWQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUGc2lnbklkAgFfBQZjYWxsZXIBEmtleVR4aWRCeUhhc2hPd25lcgIKc2hhMjU2SGFzaAZjYWxsZXIJAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUKc2hhMjU2SGFzaAUGY2FsbGVyAQ52YWxpZGF0ZUFsbENJRAMKY2lkRGlzcGxheQljaWRFeHBvcnQKY2lkTGljZW5jZQMJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUKY2lkRGlzcGxheQkAAgECEVdyb25nIERpc3BsYXkgQ0lEAwkBASEBCQELdmFsaWRhdGVDSUQBBQljaWRFeHBvcnQJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFCmNpZExpY2VuY2UCAAkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWRMaWNlbmNlBwkAAgECEVdyb25nIExpY2VuY2UgQ0lEBgEPdmFsaWRhdGVBbGxIYXNoAgxzaGEyNTZFeHBvcnQNc2hhMjU2TGljZW5jZQMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFDHNoYTI1NkV4cG9ydAkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFDXNoYTI1NkxpY2VuY2UJAAIBAhlMaWNlbmNlIEhhc2ggNjQgY2hhci4gbWF4BgEOdmFsaWRhdGVTdHJpbmcCA3N0cgNtYXgDCQAAAgkAsQIBBQNzdHIAAAkAAgECGEZpZWxkIGNhbm5vdCBiZSBpcyBlbXB0eQMJAGYCCQCxAgEFA3N0cgUDbWF4CQACAQkArAICBQNzdHICDCBpcyB0b28gbG9uZwYBDHZhbGlkYXRlVXNlcgEGY2FsbGVyAwYJAAIBBQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkBgkAAAIFCnVzZXJTdGF0dXMFC3VzZXJBbGxvd2VkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFCnVzZXJTdGF0dXMFC3VzZXJSZW1vdmVkAg9BY2NvdW50IHJlbW92ZWQCAAEKc2V0TEljZW5jZQIKY2lkTGljZW5jZQ1zaGEyNTZMaWNlbmNlBANjaWQDCQAAAgkAsQIBBQpjaWRMaWNlbmNlAAAFDmRlZmF1bHRMaWNlbmNlBQpjaWRMaWNlbmNlBARoYXNoAwkAAAIJALECAQUNc2hhMjU2TGljZW5jZQAABRJkZWZhdWx0SGFzaExpY2VuY2UFDXNoYTI1NkxpY2VuY2UJAJQKAgUDY2lkBQRoYXNoARN2YWxpZGF0ZUFydHdvcmtEYXRhCgZjYWxsZXIKY2lkRGlzcGxheQljaWRFeHBvcnQKbGljZW5jZUNJRAxzaGEyNTZFeHBvcnQLbGljZW5jZUhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCXJveWFsdGllcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEPdmFsaWRhdGVQYXltZW50AQFpBAskdDA4OTEwODk0NgkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQskdDA4OTEwODk0NgJfMQQGYW1vdW50CAULJHQwODkxMDg5NDYCXzIEB2Fzc2V0SWQDAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAACCAUHcGF5bWVudAdhc3NldElkBQtzaWduQXNzZXRJZAcIBQdwYXltZW50B2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUGYW1vdW50BRljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQACAQkArAICAhlQYXltZW50IGFtb3VudCBzaG91bGQgYmUgCQCkAwEFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAJQKAgUGYW1vdW50BQdhc3NldElkAQtpc0FydE1pbnRlZAIJYWRkclRvVXNlBWFydElkBAckbWF0Y2gwCQCaCAIFBHRoaXMJAQlrZXlJc3N1ZWQCBQlhZGRyVG9Vc2UFBWFydElkAwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAMJAQIhPQIFAWIAAAYHBwEUdmFsaWRhdGVQcmljZUFzc2V0SWQDAWkMcHJpY2VBc3NldElkDGFydHdvcmtQcmljZQQLJHQwOTUzNDk1NzAJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAULJHQwOTUzNDk1NzACXzEEBmFtb3VudAgFCyR0MDk1MzQ5NTcwAl8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAUEdW5pdAMDCQBmAgkAsQIBBQxwcmljZUFzc2V0SWQAAAkAAAIJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAUMcHJpY2VBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECDldyb25nIGFzc2V0IGlkAwMJAAACBQdhc3NldElkBQR1bml0CQECIT0CBQxwcmljZUFzc2V0SWQCAAcJAAIBAg5Xcm9uZyBhc3NldCBpZAMJAQIhPQIFDGFydHdvcmtQcmljZQUGYW1vdW50CQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBEGFjY2VwdGVkQXNzZXRJZHMBB2Fzc2V0SWQDAwMDAwkBAiE9AgUHYXNzZXRJZAkA2AQBBQtzaWduQXNzZXRJZAkBAiE9AgUHYXNzZXRJZAkA2AQBBQx3YXZlc0Fzc2V0SWQHCQECIT0CBQdhc3NldElkAgVXQVZFUwcJAQIhPQIFB2Fzc2V0SWQJANgEAQULdXNkbkFzc2V0SWQHCQECIT0CBQdhc3NldElkCQDYBAEFC3VzZHRBc3NldElkBwkAAgECJk9ubHkgU0lHTiwgVVNETixVU0RUIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAgdhc3NldElkBXByaWNlBAxtaW5TZWxsV2F2ZXMDBQh1bml0VGVzdAAKCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQECDndhdmVzX21pbl9zZWxsBAttaW5TZWxsVXNkbgDAhD0EC21pblNlbGxTaWduAwUIdW5pdFRlc3QAAQkAaAIFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UAAgMDAwMDAwkAAAIFB2Fzc2V0SWQJANgEAQULdXNkbkFzc2V0SWQJAGYCBQttaW5TZWxsVXNkbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwkAAAIFB2Fzc2V0SWQJANgEAQULdXNkdEFzc2V0SWQJAGYCBQttaW5TZWxsVXNkbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwkAAAIFB2Fzc2V0SWQJANgEAQULc2lnbkFzc2V0SWQJAGYCBQttaW5TZWxsU2lnbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwMJAAACBQdhc3NldElkCQDYBAEFDHdhdmVzQXNzZXRJZAYJAAACBQdhc3NldElkAgVXQVZFUwkAZgIFDG1pblNlbGxXYXZlcwUFcHJpY2UHCQECIT0CBQVwcmljZQAABwkAAgECGFdyb25nIG1pbmltdW0gc2VsbCBwcmljZQYBDWdldEJpZEFzc2V0SWQBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEKYmlkRGF0YUtleQQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgMJAAACBQdiaWREYXRhAgAJAAIBAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8ECWJpZEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJpZERhdGFBcnIAAQQKYmlkQXNzZXRJZAkBDWdldEJpZEFzc2V0SWQBCQCRAwIFCmJpZERhdGFBcnIAAAMJAGcCAAAFCWJpZEFtb3VudAkAAgECDFdyb25nIGFtb3VudAkAlAoCBQliaWRBbW91bnQFCmJpZEFzc2V0SWQBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIBaQZwdWJLZXkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cEBmNhbGxlcgMDCQAAAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQClCAEFBHRoaXMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAHCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQTZ2V0X3Nwb25zb3JlZF93YXZlcwMJAQIhPQIFBnB1YktleQIACQD8BwQFDXdoaXRlbGlzdERhcHACCXVzZUZyZWVUeAkAzAgCCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkFA25pbAUDbmlsBQR1bml0AwkAAAIFE2dldF9zcG9uc29yZWRfd2F2ZXMFE2dldF9zcG9uc29yZWRfd2F2ZXMJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBQZjYWxsZXIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxpZENhbGxlckRhdGUBAWkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQdidXlNaW50BQFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMTI2OTAxMjc0OQkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMTI2OTAxMjc0OQJfMQQGY2FsbGVyCAUNJHQwMTI2OTAxMjc0OQJfMgQEZGF0ZQgFDSR0MDEyNjkwMTI3NDkCXzMEBWlzQmlkAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIFBmNhbGxlcgUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEBnNpZ25JRAkBDmdldFN0cmluZ0J5S2V5AQkBCWtleVNpZ25JRAIFBmlzc3VlcgUFYXJ0SWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyCQBoAgUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQACCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCGtleVByaWNlAgUGaXNzdWVyBQVhcnRJZAQMcHJpY2VBc3NldElkAwUOY2FsbGVySXNJc3N1ZXIJANgEAQULc2lnbkFzc2V0SWQJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwMDCQEBIQEFBWlzQmlkCQEBIQEFDmNhbGxlcklzSXNzdWVyBwMDCQBnAgAABQxhcnR3b3JrUHJpY2UGCQEBIQEFCGlzT25TYWxlBgkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFBWlzQmlkBQ5jYWxsZXJJc0lzc3VlcgcJAGcCAAAFCm1heENhblNlbGwHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmlzc3VlcgMDBQVpc0JpZAkBAiE9AgUJY2hlY2tVc2VyAgAHCQACAQUJY2hlY2tVc2VyBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQNJHQwMTQ0NTIxNDYxOQMFBWlzQmlkCQEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEFCmJpZERhdGFLZXkJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAUMYXJ0d29ya1ByaWNlBAZhbW91bnQIBQ0kdDAxNDQ1MjE0NjE5Al8xBAdhc3NldElkCAUNJHQwMTQ0NTIxNDYxOQJfMgQFYWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARJrZXlBcnRpc3RBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBAphZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEPa2V5UHJpbWFyeVNoYXJlAQUGaXNzdWVyAAAEDWlzV2hpdGVsaXN0ZWQJAQ5jaGVja1doaXRlbGlzdAEFBmlzc3VlcgQDY3V0AwkAZgIFDWlzV2hpdGVsaXN0ZWQFBmhlaWdodAAAAwkAAAIFB2Fzc2V0SWQFC3NpZ25Bc3NldElkBQdzaWduQ3V0BQt1c2RuV2F2ZUN1dAQNYW1vdW50Rm9yU2lnbgkAawMFBmFtb3VudAUDY3V0AGQEDmFtb3VudEZvckFnZW50AwMDCQECIT0CBQVhZ2VudAULZmVlUmVjZWl2ZXIJAGYCBQphZ2VudFNoYXJlAAAHCQBmAgUGaGVpZ2h0BQ1pc1doaXRlbGlzdGVkBwkAawMFBmFtb3VudAUKYWdlbnRTaGFyZQBkAAAEEGFtb3VudEZvckNyZWF0b3IJAGUCBQZhbW91bnQFDWFtb3VudEZvclNpZ24DCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDEFydCBzb2xkIG91dAQNbmV3QW1vdW50U29sZAkAZAIFCmFtb3VudFNvbGQAAQQJaXNzdWVNZXRhCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJQ3JlYXRvcjogBQZpc3N1ZXICCiwKIEFydElEOiAFBWFydElkAgssCiBTaWduSUQ6IAUGc2lnbklEAhEsCiBBcnR3b3JrIG5hbWU6IAULYXJ0d29ya05hbWUCCiwKIElzc3VlOiAJAKQDAQUNbmV3QW1vdW50U29sZAIBLwkApAMBBQptYXhDYW5TZWxsBAhpc3N1ZU5GVAkAwggFCQCsAgICA1NBXwkApAMBCQBkAgUIdG90YWxORlQAAQUJaXNzdWVNZXRhAAEAAAcEBWlkTkZUCQC4CAEFCGlzc3VlTkZUBApzZWxsU3RhdHVzAwMJAAACBQ1uZXdBbW91bnRTb2xkBQptYXhDYW5TZWxsBgkBASEBBQhpc09uU2FsZQcGBApyZWNlaXZlTkZUAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYmlkT3duZXIIBQFpBmNhbGxlcgQKYXNzZXRJZEJpZAMJAQEhAQkBCWlzRGVmaW5lZAEFB2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFB2Fzc2V0SWQEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZERlbE9sZAkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgQJYmlkVXBkYXRlCQELU3RyaW5nRW50cnkCCQCsAgIFCmJpZERhdGFLZXkCB19DTE9TRUQJAKwCAgkArAICBQdiaWREYXRhAgFfCQCkAwEFBGRhdGUEB3NvbGRLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJYXJ0X3NvbGRfCQCkAwEFDW5ld0Ftb3VudFNvbGQCBF9vZl8JAKQDAQUKbWF4Q2FuU2VsbAIBXwUFYXJ0SWQCAV8FBmlzc3VlcgQJc29sZFZhbHVlAwkBASEBBQVpc0JpZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZjYWxsZXICAV8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8JAKQDAQUMYXJ0d29ya1ByaWNlAgFfBQxwcmljZUFzc2V0SWQCAV8JANgEAQUFaWRORlQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQpyZWNlaXZlTkZUAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFBmFtb3VudAIBXwUKYXNzZXRJZEJpZAIBXwkA2AQBBQVpZE5GVAQIc29sZERhdGEJAQtTdHJpbmdFbnRyeQIFB3NvbGRLZXkFCXNvbGRWYWx1ZQQLY29tbWlzc2lvbnMDCQECIT0CBQ5hbW91bnRGb3JBZ2VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50BQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQVhZ2VudAUOYW1vdW50Rm9yQWdlbnQFB2Fzc2V0SWQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIFDWFtb3VudEZvclNpZ24FB2Fzc2V0SWQFA25pbAQGYnV5UmVzCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBQ1uZXdBbW91bnRTb2xkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIEbmZ0XwkA2AQBBQVpZE5GVAUHc29sZEtleQkAzAgCCQEMSW50ZWdlckVudHJ5AgIQdG90YWxfbmZ0X2lzc3VlZAkAZAIFCHRvdGFsTkZUAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlFbmRTYWxlAgUGaXNzdWVyBQVhcnRJZAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGaXNzdWVyBQVhcnRJZAUKc2VsbFN0YXR1cwkAzAgCBQhpc3N1ZU5GVAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGaXNzdWVyBRBhbW91bnRGb3JDcmVhdG9yBQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCnJlY2VpdmVORlQAAQUFaWRORlQFA25pbAULY29tbWlzc2lvbnMDBQVpc0JpZAkAzAgCBQhzb2xkRGF0YQkAzAgCBQliaWRVcGRhdGUJAMwIAgUJYmlkRGVsT2xkBQZidXlSZXMJAMwIAgUIc29sZERhdGEFBmJ1eVJlcwEIYXNTdHJpbmcBAmJ2BAckbWF0Y2gwBQJidgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA2J2MAUHJG1hdGNoMAUDYnYwCQACAQIkU3BvbnNvcmVkIFB1YmxpYyBLZXkgU3RyaW5nIGV4cGVjdGVkCgZpbnZva2UBB3NldENvbmYCA2tleQN2YWwEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEIY29udGFpbnMCBQNrZXkCBWNvbmZfCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwJAAIBAiBFbnRyaWVzIHN0YXJ0aW5nIHdpdGggY29uZl8gb25seQkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMBaQEKYWRkQXJ0d29yaw4Kc2hhMjU2SGFzaAZzaWduSUQEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQxzaGEyNTZFeHBvcnQJY2lkRXhwb3J0DXNoYTI1NkxpY2VuY2UKY2lkTGljZW5jZQdjcmF3bGVyCXJveWFsdGllcwZwdWJLZXkEDSR0MDE4NjUyMTg3MTIJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEBWFydElkCAUNJHQwMTg2NTIxODcxMgJfMQQGY2FsbGVyCAUNJHQwMTg2NTIxODcxMgJfMgQEZGF0ZQgFDSR0MDE4NjUyMTg3MTICXzMDBgkAAgEFBmNhbGxlcgMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFCnNoYTI1Nkhhc2gJAAIBAiRIYXNoIHNob3VsZCBiZSA2NCBjaGFyYWN0ZXJzIG1heGltdW0EDSR0MDE4ODQ0MTg5MTMJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDE4ODQ0MTg5MTMCXzEEC2xpY2VuY2VIYXNoCAUNJHQwMTg4NDQxODkxMwJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQoFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUJcm95YWx0aWVzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEEHdoaXRlbGlzdGVkX2Ryb3AJAGYCCQEOY2hlY2tXaGl0ZWxpc3QBCQCsAgIFBmNhbGxlcgILX2ZyZWVfZHJvcHMAAAQNJHQwMTkyMTIxOTI5NgMFEHdoaXRlbGlzdGVkX2Ryb3AJAJQKAgAABQZzaWduSUQJAQ92YWxpZGF0ZVBheW1lbnQBBQFpBAZhbW91bnQIBQ0kdDAxOTIxMjE5Mjk2Al8xBAdhc3NldElkCAUNJHQwMTkyMTIxOTI5NgJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFBmFtb3VudAkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQESa2V5VHhpZEJ5SGFzaE93bmVyAgUKc2hhMjU2SGFzaAUGY2FsbGVyAwkBAiE9AgUKZW50cnlFeGlzdAIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQECWhhc2hFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAMJAQIhPQIFCWhhc2hFeGlzdAIACQACAQIXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQED2lzU2lnbkNlcnRpZmllZAkBFGNoZWNrU2lnbkNlcnRpZmljYXRlAwUGc2lnbklEBQZjYWxsZXIFCnNoYTI1Nkhhc2gDCQEBIQEFD2lzU2lnbkNlcnRpZmllZAkAAgECLFNpZ24gQ2VydGlmaWNhdGUgbm90IGZvdW5kIGZvciB0aGlzIGFkZHJlc3MuBBdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAMFEHdoaXRlbGlzdGVkX2Ryb3AJAPwHBAUNd2hpdGVsaXN0RGFwcAILdXNlRnJlZURyb3AJAMwIAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBQNuaWwFA25pbAUEdW5pdAMJAAACBRdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAUGY2FsbGVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlUeGlkQnlIYXNoT3duZXICBQpzaGEyNTZIYXNoBQZjYWxsZXIFBWFydElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEHa2V5RGF0ZQIFBmNhbGxlcgUFYXJ0SWQFBGRhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQVhcnRJZAULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleURpc3BsYXlDaWQCBQZjYWxsZXIFBWFydElkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFeHBvcnRDaWQCBQZjYWxsZXIFBWFydElkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBWFydElkBQxzaGEyNTZFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUxpY2VuY2VIYXNoAgUGY2FsbGVyBQVhcnRJZAULbGljZW5jZUhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUxpY2VuY2VDaWQCBQZjYWxsZXIFBWFydElkBQpsaWNlbmNlQ0lECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQVhcnRJZAUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VGFncwIFBmNhbGxlcgUFYXJ0SWQFBHRhZ3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAQlrZXlTaWduSUQCBQZjYWxsZXIFBWFydElkBQZzaWduSUQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBwkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5aWRCeVNpZ25pZAIFBmNhbGxlcgUGc2lnbklEBQVhcnRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5SGFzaEJ5VHhpZEFkZHICBQZjYWxsZXIFBWFydElkBQpzaGEyNTZIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQVhcnRJZAUHY3Jhd2xlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGtleVJveWFsdGllcwIFBmNhbGxlcgUFYXJ0SWQFCXJveWFsdGllcwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIFBmFtb3VudAULc2lnbkFzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ11cGRhdGVBcnR3b3JrDQR0eGlkBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5AwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBA0kdDAyMjIzODIyMjk1CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDIyMjM4MjIyOTUCXzEEBmNhbGxlcggFDSR0MDIyMjM4MjIyOTUCXzIEBGRhdGUIBQ0kdDAyMjIzODIyMjk1Al8zBA0kdDAyMjMwNTIyMzc0CQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAyMjMwNTIyMzc0Al8xBAtsaWNlbmNlSGFzaAgFDSR0MDIyMzA1MjIzNzQCXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAMJAAACBQplbnRyeUV4aXN0AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQR0eGlkAwkAAAIFBGZsYWcCB0lMTEVHQUwJAAIBAh1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQEhAQkBC2lzQXJ0TWludGVkAgUGY2FsbGVyBQR0eGlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQR0eGlkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUEdHhpZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQR0eGlkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBHR4aWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUEdHhpZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBHR4aWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQR0eGlkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQR0eGlkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQR0eGlkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQR0eGlkBQlyb3lhbHRpZXMFA25pbAkAAgECDkFscmVhZHkgbWludGVkAWkBC2ZsYWdBcnR3b3JrBAVhcnRJZARhZGRyBGZsYWcEbm90ZQQNJHQwMjM4NzUyMzkwOQkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjM4NzUyMzkwOQJfMQQGY2FsbGVyCAUNJHQwMjM4NzUyMzkwOQJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgdDT05TRU5UCQDMCAICAAkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleUZsYWcCBQRhZGRyBQVhcnRJZAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5Tm90ZQIFBGFkZHIFBWFydElkBQRub3RlBQNuaWwJAAIBCQCsAgICDlVua25vdyBzdGF0dXMgBQRmbGFnCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAFpAQ1kZWxldGVBcnR3b3JrAgVhcnRJZARhZGRyBA0kdDAyNDM0NTI0Mzc5CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNDM0NTI0Mzc5Al8xBAZjYWxsZXIIBQ0kdDAyNDM0NTI0Mzc5Al8yBAlhZGRyVG9Vc2UDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQRhZGRyBQZjYWxsZXIECmVudHJ5RXhpc3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQplbnRyeUV4aXN0AgAJAAIBAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQKc2hhMjU2SGFzaAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUhhc2hCeVR4aWRBZGRyAgUJYWRkclRvVXNlBQVhcnRJZAMJAAACBQpzaGEyNTZIYXNoAgAJAAIBAiVObyBhcnQgaGFzaCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBAZzaWduSUQJAQ5nZXRTdHJpbmdCeUtleQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkAwkAAAIFBnNpZ25JRAIACQACAQITTm8gU0lHTiBJRCBtYXRjaGluZwQMZGF0YVRvRGVsZXRlCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEYXRlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5TmFtZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleURlc2MCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlEaXNwbGF5Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5RXhwb3J0Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RXhwb3J0SGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleUxpY2VuY2VIYXNoAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5TGljZW5jZUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVR5cGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUYWdzAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5TWF4TWludAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleVNpZ25JRAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleU9uU2FsZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleUZsYWcCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQhrZXlQcmljZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleUFzc2V0SWRBY2NlcHRlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5aWRCeVNpZ25pZAIFCWFkZHJUb1VzZQUGc2lnbklECQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlUeGlkQnlIYXNoT3duZXICBQpzaGEyNTZIYXNoBQlhZGRyVG9Vc2UJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUVuZFNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOb3RlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5Q3Jhd2xlcgIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleVJveWFsdGllcwIFCWFkZHJUb1VzZQUFYXJ0SWQFA25pbAMJAQEhAQkBC2lzQXJ0TWludGVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwUMZGF0YVRvRGVsZXRlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUMZGF0YVRvRGVsZXRlCQACAQIoQXJ0IGFscmVhZHkgbWludGVkLCB5b3UgY2Fubm90IGRlbGV0ZSBpdAFpAQtzZWxsQXJ0d29yawYFYXJ0SWQFcHJpY2UHbWF4TWludAdhc3NldElkCGJsb2NrRW5kBnB1YktleQQNJHQwMjcyMTUyNzI2NgkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyNzIxNTI3MjY2Al8xBAZjYWxsZXIIBQ0kdDAyNzIxNTI3MjY2Al8yBAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAiNUaGlzIGFydCBkb2Vzbid0IG1hdGNoIHlvdXIgYWNjb3VudAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBWFydElkAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQBmAgAABQhibG9ja0VuZAkAAgECDE5lZ2F0aXZlIGVuZAMDCQBmAgUIYmxvY2tFbmQAAAMJAQIhPQIFB21heE1pbnQAAQYJAQIhPQIFBXByaWNlAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQKYmFzZUhlaWdodAMJAAACBQhibG9ja0VuZAAAAAAFBmhlaWdodAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAgUHYXNzZXRJZAUFcHJpY2UJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQDCQBmAgUHbWF4TWludABkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQphbW91bnRTb2xkAAAJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQphbW91bnRTb2xkAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFBmJpZE5icgAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECMUNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSB3aXRoIGFjdGl2ZSBvcmRlcnMECnNlbGxTdGF0dXMDAwkAZgIFBXByaWNlAAAJAGYCBQdtYXhNaW50AAAHBgcJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEIa2V5UHJpY2UCBQZjYWxsZXIFBWFydElkBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkBQdtYXhNaW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZjYWxsZXIFBWFydElkBQdhc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmNhbGxlcgUFYXJ0SWQJAGQCBQpiYXNlSGVpZ2h0BQhibG9ja0VuZAUDbmlsAWkBCmJ1eUFydHdvcmsCBWFydElkBmlzc3VlcgkBB2J1eU1pbnQFBQFpBQVhcnRJZAUGaXNzdWVyAgACAAFpAQZzZXRCaWQCBWFydElkBmlzc3VlcgQNJHQwMjk1MjMyOTU2MwkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjk1MjMyOTU2MwJfMQQGY2FsbGVyCAUNJHQwMjk1MjMyOTU2MwJfMgQEZGF0ZQgFDSR0MDI5NTIzMjk1NjMCXzMEDSR0MDI5NTY4Mjk2MDQJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMjk1NjgyOTYwNAJfMQQGYW1vdW50CAUNJHQwMjk1NjgyOTYwNAJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQECGJsb2NrRW5kCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAwMJAQIhPQIFCGJsb2NrRW5kAAAJAGcCBQZoZWlnaHQFCGJsb2NrRW5kBwkAAgECC1NhbGUgZW5kZWQuBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAIFB2Fzc2V0SWQFBmFtb3VudAkAAgECDldyb25nIG1pbiBzZWxsBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDCQBnAgAABQptYXhDYW5TZWxsCQACAQIjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQBnAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUGY2FsbGVyAgFfBQJpZAIFX09QRU4JAKwCAgkArAICCQCsAgIJAKwCAgUHYXNzZXRJZAIBXwkApAMBBQZhbW91bnQCAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBkAgUGYmlkTmJyAAEFA25pbAFpAQlhY2NlcHRCaWQEBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMzA3NjIzMDgwMgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzA3NjIzMDgwMgJfMQQGY2FsbGVyCAUNJHQwMzA3NjIzMDgwMgJfMgQEZGF0ZQgFDSR0MDMwNzYyMzA4MDICXzMDCQECIT0CBQZjYWxsZXIFBmlzc3VlcgkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24JAQdidXlNaW50BQUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQFCGJpZE93bmVyAWkBCWNhbmNlbEJpZAQFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBA0kdDAzMTAyODMxMDg5CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMTAyODMxMDg5Al8xBAZjYWxsZXIIBQ0kdDAzMTAyODMxMDg5Al8yBARkYXRlCAUNJHQwMzEwMjgzMTA4OQJfMwMDCQECIT0CBQZjYWxsZXIFCGJpZE93bmVyCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBA1yZXR1cm5Nb25leVRvAwkAAAIFBmNhbGxlcgUGaXNzdWVyBQhiaWRPd25lcgUGY2FsbGVyBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQHYXNzZXRJZAkBDWdldEJpZEFzc2V0SWQBCQCRAwIFCmJpZERhdGFBcnIAAAQJYmlkU3RhdHVzAghDQU5DRUxFRAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQpiaWREYXRhS2V5AgFfBQliaWRTdGF0dXMJAKwCAgkArAICBQdiaWREYXRhAgFfCQCkAwEFBGRhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAkAZQIFBmJpZE5icgABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQ1yZXR1cm5Nb25leVRvCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBQdhc3NldElkBQNuaWwBAnR4AQh2ZXJpZmllcgAEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDADAwkAAAIIBQNpbnYIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAA0DAwkAAAIIBQNpbnYIZnVuY3Rpb24CDXVwZGF0ZUFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAwDAwkAAAIIBQNpbnYIZnVuY3Rpb24CC3NlbGxBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwAFCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5CQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5Hww4lA==", "height": 2411493, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FEDWZ8CvQW1rjLrLEo9hdENiybMkqn9DKqTZSySELvYp Next: 3Qvtgv2zhZm1XgKLCga3564CwQZtibtMJziJZAJo1GMb Diff:
OldNewDifferences
377377
378378 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
379379 then throw(maintenanceMSG)
380- else if (!(isDefined(i.payments)))
381- then throw("toto")
382- else {
383- let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
384- then !(isDefined(i.payments))
385- else false)
386- then toString(addressFromPublicKey(fromBase58String(pubKey)))
387- else toBase58String(i.caller.bytes)
388- let get_sponsored_waves = if ((pubKey != ""))
389- then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
390- else unit
391- if ((get_sponsored_waves == get_sponsored_waves))
392- then $Tuple3(toBase58String(i.transactionId), caller, lastBlock.timestamp)
393- else throw("Strict value is not equal to itself.")
394- }
380+ else {
381+ let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
382+ then (size(i.payments) == 0)
383+ else false)
384+ then toString(addressFromPublicKey(fromBase58String(pubKey)))
385+ else toBase58String(i.caller.bytes)
386+ let get_sponsored_waves = if ((pubKey != ""))
387+ then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
388+ else unit
389+ if ((get_sponsored_waves == get_sponsored_waves))
390+ then $Tuple3(toBase58String(i.transactionId), caller, lastBlock.timestamp)
391+ else throw("Strict value is not equal to itself.")
392+ }
395393
396394
397395 func idCallerDate (i) = if (!(dappRunning))
400398
401399
402400 func buyMint (i,artId,issuer,bidId,bidOwner) = {
403- let $t01274512804 = idCallerDate(i)
404- let id = $t01274512804._1
405- let caller = $t01274512804._2
406- let date = $t01274512804._3
401+ let $t01269012749 = idCallerDate(i)
402+ let id = $t01269012749._1
403+ let caller = $t01269012749._2
404+ let date = $t01269012749._3
407405 let isBid = if (if (if ((caller == issuer))
408406 then (bidOwner != "")
409407 else false)
459457 then throw(checkUser)
460458 else {
461459 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
462- let $t01450714674 = if (isBid)
460+ let $t01445214619 = if (isBid)
463461 then getPriceAssetIdFromBid(bidDataKey)
464462 else validatePriceAssetId(i, priceAssetId, artworkPrice)
465- let amount = $t01450714674._1
466- let assetId = $t01450714674._2
463+ let amount = $t01445214619._1
464+ let assetId = $t01445214619._2
467465 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
468466 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
469467 let isWhitelisted = checkWhitelist(issuer)
552550
553551 @Callable(i)
554552 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
555- let $t01870718767 = idCallerDateSponsored(i, pubKey)
556- let artId = $t01870718767._1
557- let caller = $t01870718767._2
558- let date = $t01870718767._3
553+ let $t01865218712 = idCallerDateSponsored(i, pubKey)
554+ let artId = $t01865218712._1
555+ let caller = $t01865218712._2
556+ let date = $t01865218712._3
559557 if (true)
560558 then throw(caller)
561559 else if (!(validateHash(sha256Hash)))
562560 then throw("Hash should be 64 characters maximum")
563561 else {
564- let $t01889918968 = setLIcence(cidLicence, sha256Licence)
565- let licenceCID = $t01889918968._1
566- let licenceHash = $t01889918968._2
562+ let $t01884418913 = setLIcence(cidLicence, sha256Licence)
563+ let licenceCID = $t01884418913._1
564+ let licenceHash = $t01884418913._2
567565 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
568566 if ((validateArtwork != ""))
569567 then throw("Something went wrong!")
570568 else {
571569 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
572- let $t01926719351 = if (whitelisted_drop)
570+ let $t01921219296 = if (whitelisted_drop)
573571 then $Tuple2(0, signID)
574572 else validatePayment(i)
575- let amount = $t01926719351._1
576- let assetId = $t01926719351._2
573+ let amount = $t01921219296._1
574+ let assetId = $t01921219296._2
577575 if (!(isDefined(amount)))
578576 then throw("Something went wrong")
579577 else {
609607 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
610608 then throw(maintenanceMSG)
611609 else {
612- let $t02229322350 = idCallerDateSponsored(i, pubKey)
613- let id = $t02229322350._1
614- let caller = $t02229322350._2
615- let date = $t02229322350._3
616- let $t02236022429 = setLIcence(cidLicence, sha256Licence)
617- let licenceCID = $t02236022429._1
618- let licenceHash = $t02236022429._2
610+ let $t02223822295 = idCallerDateSponsored(i, pubKey)
611+ let id = $t02223822295._1
612+ let caller = $t02223822295._2
613+ let date = $t02223822295._3
614+ let $t02230522374 = setLIcence(cidLicence, sha256Licence)
615+ let licenceCID = $t02230522374._1
616+ let licenceHash = $t02230522374._2
619617 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
620618 if ((validateArtwork != ""))
621619 then throw("Something went wrong!")
638636
639637 @Callable(i)
640638 func flagArtwork (artId,addr,flag,note) = {
641- let $t02393023964 = idCallerDate(i)
642- let id = $t02393023964._1
643- let caller = $t02393023964._2
639+ let $t02387523909 = idCallerDate(i)
640+ let id = $t02387523909._1
641+ let caller = $t02387523909._2
644642 if (containsElement([chris, toString(this)], caller))
645643 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
646644 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
652650
653651 @Callable(i)
654652 func deleteArtwork (artId,addr) = {
655- let $t02440024434 = idCallerDate(i)
656- let id = $t02440024434._1
657- let caller = $t02440024434._2
653+ let $t02434524379 = idCallerDate(i)
654+ let id = $t02434524379._1
655+ let caller = $t02434524379._2
658656 let addrToUse = if (containsElement([chris, toString(this)], caller))
659657 then addr
660658 else caller
687685
688686 @Callable(i)
689687 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
690- let $t02727027321 = idCallerDateSponsored(i, pubKey)
691- let id = $t02727027321._1
692- let caller = $t02727027321._2
688+ let $t02721527266 = idCallerDateSponsored(i, pubKey)
689+ let id = $t02721527266._1
690+ let caller = $t02721527266._2
693691 let artworkName = getStringByKey(keyName(caller, artId))
694692 if ((artworkName == ""))
695693 then throw("This art doesn't match your account")
760758
761759 @Callable(i)
762760 func setBid (artId,issuer) = {
763- let $t02957829618 = idCallerDate(i)
764- let id = $t02957829618._1
765- let caller = $t02957829618._2
766- let date = $t02957829618._3
767- let $t02962329659 = isPayment(i)
768- let payment = $t02962329659._1
769- let amount = $t02962329659._2
761+ let $t02952329563 = idCallerDate(i)
762+ let id = $t02952329563._1
763+ let caller = $t02952329563._2
764+ let date = $t02952329563._3
765+ let $t02956829604 = isPayment(i)
766+ let payment = $t02956829604._1
767+ let amount = $t02956829604._2
770768 let assetId = if (!(isDefined(payment.assetId)))
771769 then "WAVES"
772770 else toBase58String(value(payment.assetId))
797795
798796 @Callable(i)
799797 func acceptBid (artId,issuer,bidId,bidOwner) = {
800- let $t03081730857 = idCallerDate(i)
801- let id = $t03081730857._1
802- let caller = $t03081730857._2
803- let date = $t03081730857._3
798+ let $t03076230802 = idCallerDate(i)
799+ let id = $t03076230802._1
800+ let caller = $t03076230802._2
801+ let date = $t03076230802._3
804802 if ((caller != issuer))
805803 then throw("You cannot do this action")
806804 else buyMint(i, artId, issuer, bidId, bidOwner)
810808
811809 @Callable(i)
812810 func cancelBid (artId,issuer,bidId,bidOwner) = {
813- let $t03108331144 = idCallerDate(i)
814- let id = $t03108331144._1
815- let caller = $t03108331144._2
816- let date = $t03108331144._3
811+ let $t03102831089 = idCallerDate(i)
812+ let id = $t03102831089._1
813+ let caller = $t03102831089._2
814+ let date = $t03102831089._3
817815 if (if ((caller != bidOwner))
818816 then (caller != issuer)
819817 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
201201 func validateUser (caller) = if (true)
202202 then throw(caller)
203203 else {
204204 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
205205 if (if ((userStatus == userUnregistered))
206206 then true
207207 else (userStatus == userAllowed))
208208 then "Register this account first with \"Account\" tab"
209209 else if ((userStatus == userSuspended))
210210 then "Account suspended"
211211 else if ((userStatus == userRemoved))
212212 then "Account removed"
213213 else ""
214214 }
215215
216216
217217 func setLIcence (cidLicence,sha256Licence) = {
218218 let cid = if ((size(cidLicence) == 0))
219219 then defaultLicence
220220 else cidLicence
221221 let hash = if ((size(sha256Licence) == 0))
222222 then defaultHashLicence
223223 else sha256Licence
224224 $Tuple2(cid, hash)
225225 }
226226
227227
228228 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
229229 let checkUser = validateUser(caller)
230230 if ((checkUser != ""))
231231 then throw(checkUser)
232232 else if ((size(cidDisplay) == 0))
233233 then throw("Display CID cannot be empty")
234234 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
235235 then throw("Problem with CID")
236236 else if (!(validateAllHash(sha256Export, licenceHash)))
237237 then throw("Problem with Hashes")
238238 else if (!(validateString(name, 100)))
239239 then throw("100 Char. max name")
240240 else if (!(validateString(description, 1000)))
241241 then throw("1000 Char. max description")
242242 else if (if ((0 > royalties))
243243 then true
244244 else (royalties > 1000))
245245 then throw("Royalties cannot be less than 0% or higher than 10%")
246246 else if ((size(split(tags, ",")) > 5))
247247 then throw("5 tags max.")
248248 else ""
249249 }
250250
251251
252252 func isPayment (i) = if ((size(i.payments) == 0))
253253 then throw("No payment attached")
254254 else {
255255 let payment = value(i.payments[0])
256256 let amount = value(payment.amount)
257257 $Tuple2(payment, amount)
258258 }
259259
260260
261261 func validatePayment (i) = {
262262 let $t089108946 = isPayment(i)
263263 let payment = $t089108946._1
264264 let amount = $t089108946._2
265265 let assetId = if (if (isDefined(payment.assetId))
266266 then (payment.assetId == signAssetId)
267267 else false)
268268 then payment.assetId
269269 else throw("Only SIGN token accepted as transaction fee")
270270 if ((amount != currentCertificationPrice))
271271 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
272272 else $Tuple2(amount, assetId)
273273 }
274274
275275
276276 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
277277 case b: Int =>
278278 if ((b != 0))
279279 then true
280280 else false
281281 case _ =>
282282 false
283283 }
284284
285285
286286 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
287287 let $t095349570 = isPayment(i)
288288 let payment = $t095349570._1
289289 let amount = $t095349570._2
290290 let assetId = if (!(isDefined(payment.assetId)))
291291 then unit
292292 else if (if ((size(priceAssetId) > 0))
293293 then (toBase58String(value(payment.assetId)) == priceAssetId)
294294 else false)
295295 then payment.assetId
296296 else throw("Wrong asset id")
297297 if (if ((assetId == unit))
298298 then (priceAssetId != "")
299299 else false)
300300 then throw("Wrong asset id")
301301 else if ((artworkPrice != amount))
302302 then throw("Payment don't match")
303303 else $Tuple2(amount, assetId)
304304 }
305305
306306
307307 func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
308308 then (assetId != toBase58String(wavesAssetId))
309309 else false)
310310 then (assetId != "WAVES")
311311 else false)
312312 then (assetId != toBase58String(usdnAssetId))
313313 else false)
314314 then (assetId != toBase58String(usdtAssetId))
315315 else false)
316316 then throw("Only SIGN, USDN,USDT or WAVES accepted")
317317 else true
318318
319319
320320 func validateMinSell (assetId,price) = {
321321 let minSellWaves = if (unitTest)
322322 then 10
323323 else getIntegerByKeyFromOracle("waves_min_sell")
324324 let minSellUsdn = 1000000
325325 let minSellSign = if (unitTest)
326326 then 1
327327 else (currentCertificationPrice * 2)
328328 if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
329329 then (minSellUsdn > price)
330330 else false)
331331 then (price != 0)
332332 else false)
333333 then true
334334 else if (if ((assetId == toBase58String(usdtAssetId)))
335335 then (minSellUsdn > price)
336336 else false)
337337 then (price != 0)
338338 else false)
339339 then true
340340 else if (if ((assetId == toBase58String(signAssetId)))
341341 then (minSellSign > price)
342342 else false)
343343 then (price != 0)
344344 else false)
345345 then true
346346 else if (if (if ((assetId == toBase58String(wavesAssetId)))
347347 then true
348348 else (assetId == "WAVES"))
349349 then (minSellWaves > price)
350350 else false)
351351 then (price != 0)
352352 else false)
353353 then throw("Wrong minimum sell price")
354354 else true
355355 }
356356
357357
358358 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
359359 then unit
360360 else fromBase58String(assetId)
361361
362362
363363 func getPriceAssetIdFromBid (bidDataKey) = {
364364 let bidData = getStringByKey((bidDataKey + "_OPEN"))
365365 if ((bidData == ""))
366366 then throw("Bid not found")
367367 else {
368368 let bidDataArr = split(bidData, "_")
369369 let bidAmount = parseIntValue(bidDataArr[1])
370370 let bidAssetId = getBidAssetId(bidDataArr[0])
371371 if ((0 >= bidAmount))
372372 then throw("Wrong amount")
373373 else $Tuple2(bidAmount, bidAssetId)
374374 }
375375 }
376376
377377
378378 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
379379 then throw(maintenanceMSG)
380- else if (!(isDefined(i.payments)))
381- then throw("toto")
382- else {
383- let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
384- then !(isDefined(i.payments))
385- else false)
386- then toString(addressFromPublicKey(fromBase58String(pubKey)))
387- else toBase58String(i.caller.bytes)
388- let get_sponsored_waves = if ((pubKey != ""))
389- then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
390- else unit
391- if ((get_sponsored_waves == get_sponsored_waves))
392- then $Tuple3(toBase58String(i.transactionId), caller, lastBlock.timestamp)
393- else throw("Strict value is not equal to itself.")
394- }
380+ else {
381+ let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
382+ then (size(i.payments) == 0)
383+ else false)
384+ then toString(addressFromPublicKey(fromBase58String(pubKey)))
385+ else toBase58String(i.caller.bytes)
386+ let get_sponsored_waves = if ((pubKey != ""))
387+ then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
388+ else unit
389+ if ((get_sponsored_waves == get_sponsored_waves))
390+ then $Tuple3(toBase58String(i.transactionId), caller, lastBlock.timestamp)
391+ else throw("Strict value is not equal to itself.")
392+ }
395393
396394
397395 func idCallerDate (i) = if (!(dappRunning))
398396 then throw(maintenanceMSG)
399397 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
400398
401399
402400 func buyMint (i,artId,issuer,bidId,bidOwner) = {
403- let $t01274512804 = idCallerDate(i)
404- let id = $t01274512804._1
405- let caller = $t01274512804._2
406- let date = $t01274512804._3
401+ let $t01269012749 = idCallerDate(i)
402+ let id = $t01269012749._1
403+ let caller = $t01269012749._2
404+ let date = $t01269012749._3
407405 let isBid = if (if (if ((caller == issuer))
408406 then (bidOwner != "")
409407 else false)
410408 then (bidId != "")
411409 else false)
412410 then true
413411 else false
414412 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
415413 if (if (if ((blockEnd != 0))
416414 then (height >= blockEnd)
417415 else false)
418416 then !(isBid)
419417 else false)
420418 then throw("Sale ended.")
421419 else {
422420 let callerIsIssuer = (caller == issuer)
423421 let totalNFT = getIntegerByKey("total_nft_issued")
424422 let signID = getStringByKey(keySignID(issuer, artId))
425423 let artworkName = getStringByKey(keyName(issuer, artId))
426424 if ((artworkName == ""))
427425 then throw("Art doesn't exist")
428426 else {
429427 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
430428 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
431429 let artworkPrice = if (callerIsIssuer)
432430 then (currentCertificationPrice * 2)
433431 else getIntegerByKey(keyPrice(issuer, artId))
434432 let priceAssetId = if (callerIsIssuer)
435433 then toBase58String(signAssetId)
436434 else getStringByKey(keyAssetIdAccepted(issuer, artId))
437435 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
438436 if (if (if (!(isBid))
439437 then !(callerIsIssuer)
440438 else false)
441439 then if (if ((0 >= artworkPrice))
442440 then true
443441 else !(isOnSale))
444442 then true
445443 else (0 >= maxCanSell)
446444 else false)
447445 then throw("Art not for sale")
448446 else if (if (if (!(isBid))
449447 then callerIsIssuer
450448 else false)
451449 then (0 >= maxCanSell)
452450 else false)
453451 then throw("Max issuable not set")
454452 else {
455453 let checkUser = validateUser(issuer)
456454 if (if (isBid)
457455 then (checkUser != "")
458456 else false)
459457 then throw(checkUser)
460458 else {
461459 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
462- let $t01450714674 = if (isBid)
460+ let $t01445214619 = if (isBid)
463461 then getPriceAssetIdFromBid(bidDataKey)
464462 else validatePriceAssetId(i, priceAssetId, artworkPrice)
465- let amount = $t01450714674._1
466- let assetId = $t01450714674._2
463+ let amount = $t01445214619._1
464+ let assetId = $t01445214619._2
467465 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
468466 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
469467 let isWhitelisted = checkWhitelist(issuer)
470468 let cut = if ((isWhitelisted > height))
471469 then 0
472470 else if ((assetId == signAssetId))
473471 then signCut
474472 else usdnWaveCut
475473 let amountForSign = fraction(amount, cut, 100)
476474 let amountForAgent = if (if (if ((agent != feeReceiver))
477475 then (agentShare > 0)
478476 else false)
479477 then (height > isWhitelisted)
480478 else false)
481479 then fraction(amount, agentShare, 100)
482480 else 0
483481 let amountForCreator = (amount - amountForSign)
484482 if ((amountSold == maxCanSell))
485483 then throw("Art sold out")
486484 else {
487485 let newAmountSold = (amountSold + 1)
488486 let issueMeta = ((((((((((("Creator: " + issuer) + ",
489487 ArtID: ") + artId) + ",
490488 SignID: ") + signID) + ",
491489 Artwork name: ") + artworkName) + ",
492490 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
493491 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
494492 let idNFT = calculateAssetId(issueNFT)
495493 let sellStatus = if (if ((newAmountSold == maxCanSell))
496494 then true
497495 else !(isOnSale))
498496 then false
499497 else true
500498 let receiveNFT = if (if (if ((caller == issuer))
501499 then (bidOwner != "")
502500 else false)
503501 then (bidId != "")
504502 else false)
505503 then addressFromStringValue(bidOwner)
506504 else i.caller
507505 let assetIdBid = if (!(isDefined(assetId)))
508506 then "WAVES"
509507 else toBase58String(value(assetId))
510508 let bidData = getStringByKey((bidDataKey + "_OPEN"))
511509 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
512510 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
513511 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
514512 let soldValue = if (!(isBid))
515513 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
516514 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
517515 let soldData = StringEntry(soldKey, soldValue)
518516 let commissions = if ((amountForAgent != 0))
519517 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
520518 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
521519 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)
522520 if (isBid)
523521 then [soldData, bidUpdate, bidDelOld] :: buyRes
524522 else soldData :: buyRes
525523 }
526524 }
527525 }
528526 }
529527 }
530528 }
531529
532530
533531 func asString (bv) = match bv {
534532 case bv0: String =>
535533 bv0
536534 case _ =>
537535 throw("Sponsored Public Key String expected")
538536 }
539537
540538
541539 @Callable(invoke)
542540 func setConf (key,val) = {
543541 let caller = toString(invoke.caller)
544542 if (containsElement([chris, toString(this)], caller))
545543 then if (contains(key, "conf_"))
546544 then [StringEntry(key, val)]
547545 else throw("Entries starting with conf_ only")
548546 else throw("You are not allowed to change this")
549547 }
550548
551549
552550
553551 @Callable(i)
554552 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
555- let $t01870718767 = idCallerDateSponsored(i, pubKey)
556- let artId = $t01870718767._1
557- let caller = $t01870718767._2
558- let date = $t01870718767._3
553+ let $t01865218712 = idCallerDateSponsored(i, pubKey)
554+ let artId = $t01865218712._1
555+ let caller = $t01865218712._2
556+ let date = $t01865218712._3
559557 if (true)
560558 then throw(caller)
561559 else if (!(validateHash(sha256Hash)))
562560 then throw("Hash should be 64 characters maximum")
563561 else {
564- let $t01889918968 = setLIcence(cidLicence, sha256Licence)
565- let licenceCID = $t01889918968._1
566- let licenceHash = $t01889918968._2
562+ let $t01884418913 = setLIcence(cidLicence, sha256Licence)
563+ let licenceCID = $t01884418913._1
564+ let licenceHash = $t01884418913._2
567565 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
568566 if ((validateArtwork != ""))
569567 then throw("Something went wrong!")
570568 else {
571569 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
572- let $t01926719351 = if (whitelisted_drop)
570+ let $t01921219296 = if (whitelisted_drop)
573571 then $Tuple2(0, signID)
574572 else validatePayment(i)
575- let amount = $t01926719351._1
576- let assetId = $t01926719351._2
573+ let amount = $t01921219296._1
574+ let assetId = $t01921219296._2
577575 if (!(isDefined(amount)))
578576 then throw("Something went wrong")
579577 else {
580578 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
581579 if ((entryExist != ""))
582580 then throw("You already added it")
583581 else {
584582 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
585583 if ((hashExist != ""))
586584 then throw("Hash already registered")
587585 else {
588586 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
589587 if (!(isSignCertified))
590588 then throw("Sign Certificate not found for this address.")
591589 else {
592590 let decrease_whitelist_drop = if (whitelisted_drop)
593591 then invoke(whitelistDapp, "useFreeDrop", [toBase58String(i.caller.bytes)], nil)
594592 else unit
595593 if ((decrease_whitelist_drop == decrease_whitelist_drop))
596594 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)]
597595 else throw("Strict value is not equal to itself.")
598596 }
599597 }
600598 }
601599 }
602600 }
603601 }
604602 }
605603
606604
607605
608606 @Callable(i)
609607 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
610608 then throw(maintenanceMSG)
611609 else {
612- let $t02229322350 = idCallerDateSponsored(i, pubKey)
613- let id = $t02229322350._1
614- let caller = $t02229322350._2
615- let date = $t02229322350._3
616- let $t02236022429 = setLIcence(cidLicence, sha256Licence)
617- let licenceCID = $t02236022429._1
618- let licenceHash = $t02236022429._2
610+ let $t02223822295 = idCallerDateSponsored(i, pubKey)
611+ let id = $t02223822295._1
612+ let caller = $t02223822295._2
613+ let date = $t02223822295._3
614+ let $t02230522374 = setLIcence(cidLicence, sha256Licence)
615+ let licenceCID = $t02230522374._1
616+ let licenceHash = $t02230522374._2
619617 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
620618 if ((validateArtwork != ""))
621619 then throw("Something went wrong!")
622620 else {
623621 let entryExist = getStringByKey(keyName(caller, txid))
624622 if ((entryExist == ""))
625623 then throw("Entry not found")
626624 else {
627625 let flag = getStringByKey(keyFlag(caller, txid))
628626 if ((flag == "ILLEGAL"))
629627 then throw("Cannot update ILLEGAL artwork")
630628 else if (!(isArtMinted(caller, txid)))
631629 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)]
632630 else throw("Already minted")
633631 }
634632 }
635633 }
636634
637635
638636
639637 @Callable(i)
640638 func flagArtwork (artId,addr,flag,note) = {
641- let $t02393023964 = idCallerDate(i)
642- let id = $t02393023964._1
643- let caller = $t02393023964._2
639+ let $t02387523909 = idCallerDate(i)
640+ let id = $t02387523909._1
641+ let caller = $t02387523909._2
644642 if (containsElement([chris, toString(this)], caller))
645643 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
646644 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
647645 else throw(("Unknow status " + flag))
648646 else throw("You are not allowed")
649647 }
650648
651649
652650
653651 @Callable(i)
654652 func deleteArtwork (artId,addr) = {
655- let $t02440024434 = idCallerDate(i)
656- let id = $t02440024434._1
657- let caller = $t02440024434._2
653+ let $t02434524379 = idCallerDate(i)
654+ let id = $t02434524379._1
655+ let caller = $t02434524379._2
658656 let addrToUse = if (containsElement([chris, toString(this)], caller))
659657 then addr
660658 else caller
661659 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
662660 if ((entryExist == ""))
663661 then throw("No art matching for this address")
664662 else {
665663 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
666664 if ((sha256Hash == ""))
667665 then throw("No art hash matching for this address")
668666 else {
669667 let signID = getStringByKey(keySignID(addrToUse, artId))
670668 if ((signID == ""))
671669 then throw("No SIGN ID matching")
672670 else {
673671 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))]
674672 if (!(isArtMinted(addrToUse, artId)))
675673 then if (!(dappRunning))
676674 then throw(maintenanceMSG)
677675 else dataToDelete
678676 else if (containsElement([chris, toString(this)], caller))
679677 then dataToDelete
680678 else throw("Art already minted, you cannot delete it")
681679 }
682680 }
683681 }
684682 }
685683
686684
687685
688686 @Callable(i)
689687 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
690- let $t02727027321 = idCallerDateSponsored(i, pubKey)
691- let id = $t02727027321._1
692- let caller = $t02727027321._2
688+ let $t02721527266 = idCallerDateSponsored(i, pubKey)
689+ let id = $t02721527266._1
690+ let caller = $t02721527266._2
693691 let artworkName = getStringByKey(keyName(caller, artId))
694692 if ((artworkName == ""))
695693 then throw("This art doesn't match your account")
696694 else {
697695 let flag = getStringByKey(keyFlag(caller, artId))
698696 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
699697 then throw("Flagged artwork")
700698 else {
701699 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
702700 if ((0 > blockEnd))
703701 then throw("Negative end")
704702 else if (if ((blockEnd > 0))
705703 then if ((maxMint != 1))
706704 then true
707705 else (price != 0)
708706 else false)
709707 then throw("Timed offer only allowed for unique edition and offer only")
710708 else {
711709 let baseHeight = if ((blockEnd == 0))
712710 then 0
713711 else height
714712 if (!(acceptedAssetIds(assetId)))
715713 then throw("Something went wrong!")
716714 else if (!(validateMinSell(assetId, price)))
717715 then throw("Something went wrong!")
718716 else {
719717 let checkUser = validateUser(caller)
720718 if ((checkUser != ""))
721719 then throw(checkUser)
722720 else {
723721 let amountSold = getIntegerByKey(keyIssued(caller, artId))
724722 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
725723 if ((maxMint > 100))
726724 then throw("100 editions max per artwork")
727725 else if (if ((amountSold != 0))
728726 then (amountSold == maxCanSell)
729727 else false)
730728 then throw("Max edition reached.")
731729 else if (if ((amountSold > 0))
732730 then (maxCanSell != maxMint)
733731 else false)
734732 then throw("Cannot change maximum issuable anymore")
735733 else if (if ((bidNbr > 0))
736734 then (maxCanSell != maxMint)
737735 else false)
738736 then throw("Cannot change maximum issuable with active orders")
739737 else {
740738 let sellStatus = if (if ((price > 0))
741739 then (maxMint > 0)
742740 else false)
743741 then true
744742 else false
745743 [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))]
746744 }
747745 }
748746 }
749747 }
750748 }
751749 }
752750 }
753751
754752
755753
756754 @Callable(i)
757755 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
758756
759757
760758
761759 @Callable(i)
762760 func setBid (artId,issuer) = {
763- let $t02957829618 = idCallerDate(i)
764- let id = $t02957829618._1
765- let caller = $t02957829618._2
766- let date = $t02957829618._3
767- let $t02962329659 = isPayment(i)
768- let payment = $t02962329659._1
769- let amount = $t02962329659._2
761+ let $t02952329563 = idCallerDate(i)
762+ let id = $t02952329563._1
763+ let caller = $t02952329563._2
764+ let date = $t02952329563._3
765+ let $t02956829604 = isPayment(i)
766+ let payment = $t02956829604._1
767+ let amount = $t02956829604._2
770768 let assetId = if (!(isDefined(payment.assetId)))
771769 then "WAVES"
772770 else toBase58String(value(payment.assetId))
773771 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
774772 if (if ((blockEnd != 0))
775773 then (height >= blockEnd)
776774 else false)
777775 then throw("Sale ended.")
778776 else {
779777 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
780778 if (!(acceptedAssetIds(assetId)))
781779 then throw("asset not accepted")
782780 else if (!(validateMinSell(assetId, amount)))
783781 then throw("Wrong min sell")
784782 else {
785783 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
786784 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
787785 if ((0 >= maxCanSell))
788786 then throw("No max edition set for this artwork")
789787 else if ((amountSold >= maxCanSell))
790788 then throw("Sold out, you cannot bid")
791789 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
792790 }
793791 }
794792 }
795793
796794
797795
798796 @Callable(i)
799797 func acceptBid (artId,issuer,bidId,bidOwner) = {
800- let $t03081730857 = idCallerDate(i)
801- let id = $t03081730857._1
802- let caller = $t03081730857._2
803- let date = $t03081730857._3
798+ let $t03076230802 = idCallerDate(i)
799+ let id = $t03076230802._1
800+ let caller = $t03076230802._2
801+ let date = $t03076230802._3
804802 if ((caller != issuer))
805803 then throw("You cannot do this action")
806804 else buyMint(i, artId, issuer, bidId, bidOwner)
807805 }
808806
809807
810808
811809 @Callable(i)
812810 func cancelBid (artId,issuer,bidId,bidOwner) = {
813- let $t03108331144 = idCallerDate(i)
814- let id = $t03108331144._1
815- let caller = $t03108331144._2
816- let date = $t03108331144._3
811+ let $t03102831089 = idCallerDate(i)
812+ let id = $t03102831089._1
813+ let caller = $t03102831089._2
814+ let date = $t03102831089._3
817815 if (if ((caller != bidOwner))
818816 then (caller != issuer)
819817 else false)
820818 then throw("You cannot do this action")
821819 else {
822820 let returnMoneyTo = if ((caller == issuer))
823821 then bidOwner
824822 else caller
825823 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
826824 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
827825 let bidData = getStringByKey((bidDataKey + "_OPEN"))
828826 if ((bidData == ""))
829827 then throw("Bid not found")
830828 else {
831829 let bidDataArr = split(bidData, "_")
832830 let assetId = getBidAssetId(bidDataArr[0])
833831 let bidStatus = "CANCELED"
834832 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
835833 }
836834 }
837835 }
838836
839837
840838 @Verifier(tx)
841839 func verifier () = match tx {
842840 case inv: InvokeScriptTransaction =>
843841 if (if ((inv.function == "addArtwork"))
844842 then (inv.dApp == this)
845843 else false)
846844 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
847845 else if (if ((inv.function == "updateArtwork"))
848846 then (inv.dApp == this)
849847 else false)
850848 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
851849 else if (if ((inv.function == "sellArtwork"))
852850 then (inv.dApp == this)
853851 else false)
854852 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
855853 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
856854 case _ =>
857855 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
858856 }
859857

github/deemru/w8io/169f3d6 
105.98 ms