tx · CDxpDMUEM8Sha7yAfHJjRsMKNbiSv4bnjU9FpGdo4yQb

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02600000 Waves

2023.09.06 09:13 [2743139] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "CDxpDMUEM8Sha7yAfHJjRsMKNbiSv4bnjU9FpGdo4yQb", "fee": 2600000, "feeAssetId": null, "timestamp": 1693980804585, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "5Sqbvo1jnq9at4BRAtBcJs5fc2KsYerE6t4UM6eyRxpKbwPs3bn8QqaL1hpSKBdM4Qq1i5ymtsYn6sMYnmUcr3CJ" ], "script": "base64:BgJgCAISBAoCCAgSEAoOCAgICAgICAgICAgIAQgSDwoNCAgICAgICAgICAgBCBIGCgQICAgIEgQKAggIEggKBggBAQgBCBIECgIICBIECgIICBIHCgUICAgICBIGCgQICAgIUAAHVkVSU0lPTgIFMi4wLjABDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgAACHVuaXRUZXN0BwAJb3JhY2xlRmVlCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECD2NvbmZfb3JhY2xlX2ZlZQAIc2lnbkRhcHAJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9zaWdud2ViX2RhcHAAC2ZlZVJlY2VpdmVyCQEOZ2V0U3RyaW5nQnlLZXkBAhFjb25mX2ZlZV9yZWNlaXZlcgAIdXNlckRhcHADBQh1bml0VGVzdAkBBXZhbHVlAQkApggBAiMzTXQ0UkdNRXlqU1dZQW9jVFBxZDU1d2RIUVFCM1BVMlVDbQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX3VzZXJzX2RhcHAADXdoaXRlbGlzdERhcHAJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQITY29uZl93aGl0ZWxpc3RfZGFwcAALc2lnbkFzc2V0SWQJANkEAQkBDmdldFN0cmluZ0J5S2V5AQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAt1c2RuQXNzZXRJZAkA2QQBCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRE4AC3VzZHRBc3NldElkCQDZBAEJAQ5nZXRTdHJpbmdCeUtleQECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEVAANdXNkdFBQQXNzZXRJZAkA2QQBCQEOZ2V0U3RyaW5nQnlLZXkBAhtjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRFRfUFAADHdhdmVzQXNzZXRJZAEAAAVjaHJpcwkBDmdldFN0cmluZ0J5S2V5AQIMY29uZl9hZG1pbl8xARlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQlvcmFjbGVGZWUFA2tleQIfSW50ZWdlciB1bmRlZmluZSBvciAwIGluIG9yYWNsZQEPZ2V0SW50ZWdlckJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABDmNoZWNrV2hpdGVsaXN0AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNd2hpdGVsaXN0RGFwcAUDa2V5AAABD2dldEJvb2xlYW5CeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFA2tleQcADmNvbW1pc3Npb25fZmVlAAgADmRlZmF1bHRMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhRjb25mX2RlZmF1bHRfbGljZW5jZQASZGVmYXVsdEhhc2hMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAtkYXBwUnVubmluZwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQh1c2VyRGFwcAIUY29uZl9kYXBwX2lzX3J1bm5pbmcGAA5tYWludGVuYW5jZU1TRwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAIUY29uZl9tYWludGVuYW5jZV9tc2cCAAANdXNlclN1c3BlbmRlZAIJU1VTUEVOREVEAAt1c2VyUmVtb3ZlZAIHUkVNT1ZFRAAQdXNlclVucmVnaXN0ZXJlZAIMVU5SRUdJU1RFUkVEAAt1c2VyQWxsb3dlZAIHQUxMT1dFRAAZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQtzaWduQXNzZXRJZAETZ2V0QXJ0d29ya1JveWFsdGllcwEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQDoBwEUY2hlY2tTaWduQ2VydGlmaWNhdGUDBnNpZ25JRAVPd25lcgpzaGEyNTZIYXNoBAckbWF0Y2gwCQCdCAIFCHNpZ25EYXBwCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUGc2lnbklEAgFfBQVPd25lcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQEIY29udGFpbnMCBQFhBQpzaGEyNTZIYXNoBgcHAQt2YWxpZGF0ZUNJRAEDY2lkAwkBCGNvbnRhaW5zAgUDY2lkAgEvAwMJAGYCAEwJALECAQUDY2lkCQAAAgkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFA2NpZAIBLwABBwcBDHZhbGlkYXRlSGFzaAEEaGFzaAkAAAIJALECAQUEaGFzaABAAQ1rZXlVc2VyU3RhdHVzAQZjYWxsZXIJAKwCAgIMdXNlcl9zdGF0dXNfBQZjYWxsZXIBB2tleURhdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2RhdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOYW1lAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9uYW1lXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5RGVzYwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGVzY18FBWFydElkAgFfBQZjYWxsZXIBDWtleURpc3BsYXlDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2Rpc3BsYXlfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RXhwb3J0SGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZXhwb3J0X2hhc2hfBQVhcnRJZAIBXwUGY2FsbGVyAQxrZXlFeHBvcnRDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIPYXJ0X2V4cG9ydF9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlNYXhNaW50AgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDGFydF9tYXhtaW50XwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5U2lnbklEAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlJc3N1ZWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X2lzc3VlZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleU9uU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfb25zYWxlXwUFYXJ0SWQCAV8FBmNhbGxlcgEOa2V5TGljZW5jZUhhc2gCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIRYXJ0X2xpY2VuY2VfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDWtleUxpY2VuY2VDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2xpY2VuY2VfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VGFncwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FBWFydElkAgFfBQZjYWxsZXIBB2tleVR5cGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3R5cGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOb3RlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9ub3RlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5Q3Jhd2xlcgIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQxrZXlSb3lhbHRpZXMCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIOYXJ0X3JveWFsdGllc18FBWFydElkAgFfBQZjYWxsZXIBCGtleVByaWNlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCmFydF9wcmljZV8FBWFydElkAgFfBQZjYWxsZXIBCmtleUVuZFNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBc3NldElkQWNjZXB0ZWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgISYXJ0X2Fzc2V0QWNjZXB0ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlGbGFnAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXJ0aXN0QWdlbnRBZGRyAQphcnRpc3RBZGRyCQCsAgICDWFydGlzdF9hZ2VudF8FCmFydGlzdEFkZHIBFGtleVByaW1hcnlTaGFyZUFnZW50AQphcnRpc3RBZGRyCQCsAgICFWFydGlzdF9hZ2VudF9wcmltYXJ5XwUKYXJ0aXN0QWRkcgEYa2V5QXJ0aXN0UHVibGljQWdlbnRBZGRyAQphcnRpc3RBZGRyCQCsAgICFGFydGlzdF9wdWJsaWNfYWdlbnRfBQphcnRpc3RBZGRyARprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudAEKYXJ0aXN0QWRkcgkArAICAhxhcnRpc3RfcHVibGljX2FnZW50X3ByaW1hcnlfBQphcnRpc3RBZGRyARFrZXlIYXNoQnlUeGlkQWRkcgIGY2FsbGVyBHR4aWQJAKwCAgkArAICCQCsAgICE2dldF9oYXNoYnl0eGlkYWRkcl8FBHR4aWQCAV8FBmNhbGxlcgEOa2V5T3duZXJCeUhhc2gBCnNoYTI1Nkhhc2gJAKwCAgISZ2V0X293bmVyX2J5X2hhc2hfBQpzaGEyNTZIYXNoAQ1rZXlpZEJ5U2lnbmlkAgZjYWxsZXIGc2lnbklkCQCsAgIJAKwCAgkArAICAhJnZXRfYXJ0aWRieXNpZ25pZF8FBnNpZ25JZAIBXwUGY2FsbGVyARJrZXlUeGlkQnlIYXNoT3duZXICCnNoYTI1Nkhhc2gGY2FsbGVyCQCsAgICF2dldF90eGlkX2J5X2hhc2hfb3duZXJfCQDYBAEJANQWAQkAmwMBCQCsAgIFCnNoYTI1Nkhhc2gFBmNhbGxlcgEOdmFsaWRhdGVBbGxDSUQDCmNpZERpc3BsYXkJY2lkRXhwb3J0CmNpZExpY2VuY2UDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZERpc3BsYXkJAAIBAhFXcm9uZyBEaXNwbGF5IENJRAMJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUJY2lkRXhwb3J0CQACAQIQV3JvbmcgRXhwb3J0IENJRAMDCQECIT0CBQpjaWRMaWNlbmNlAgAJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUKY2lkTGljZW5jZQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBD3ZhbGlkYXRlQWxsSGFzaAIMc2hhMjU2RXhwb3J0DXNoYTI1NkxpY2VuY2UDCQEBIQEJAQx2YWxpZGF0ZUhhc2gBBQxzaGEyNTZFeHBvcnQJAAIBAhhFeHBvcnQgSGFzaCA2NCBjaGFyLiBtYXgDCQEBIQEJAQx2YWxpZGF0ZUhhc2gBBQ1zaGEyNTZMaWNlbmNlCQACAQIZTGljZW5jZSBIYXNoIDY0IGNoYXIuIG1heAYBDnZhbGlkYXRlU3RyaW5nAgNzdHIDbWF4AwkAAAIJALECAQUDc3RyAAAJAAIBAhhGaWVsZCBjYW5ub3QgYmUgaXMgZW1wdHkDCQBmAgkAsQIBBQNzdHIFA21heAkAAgEJAKwCAgUDc3RyAgwgaXMgdG9vIGxvbmcGAQx2YWxpZGF0ZVVzZXIBBmNhbGxlcgQKdXNlclN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBDWtleVVzZXJTdGF0dXMBBQZjYWxsZXIFEHVzZXJVbnJlZ2lzdGVyZWQDAwkAAAIFCnVzZXJTdGF0dXMFEHVzZXJVbnJlZ2lzdGVyZWQGCQAAAgUKdXNlclN0YXR1cwULdXNlckFsbG93ZWQCLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUKdXNlclN0YXR1cwUNdXNlclN1c3BlbmRlZAIRQWNjb3VudCBzdXNwZW5kZWQDCQAAAgUKdXNlclN0YXR1cwULdXNlclJlbW92ZWQCD0FjY291bnQgcmVtb3ZlZAIAAQpzZXRMSWNlbmNlAgpjaWRMaWNlbmNlDXNoYTI1NkxpY2VuY2UEA2NpZAMJAAACCQCxAgEFCmNpZExpY2VuY2UAAAUOZGVmYXVsdExpY2VuY2UFCmNpZExpY2VuY2UEBGhhc2gDCQAAAgkAsQIBBQ1zaGEyNTZMaWNlbmNlAAAFEmRlZmF1bHRIYXNoTGljZW5jZQUNc2hhMjU2TGljZW5jZQkAlAoCBQNjaWQFBGhhc2gBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBmNhbGxlcgpjaWREaXNwbGF5CWNpZEV4cG9ydApsaWNlbmNlQ0lEDHNoYTI1NkV4cG9ydAtsaWNlbmNlSGFzaARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MJcm95YWx0aWVzBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAAACCQCxAgEFCmNpZERpc3BsYXkAAAkAAgECG0Rpc3BsYXkgQ0lEIGNhbm5vdCBiZSBlbXB0eQMJAQEhAQkBDnZhbGlkYXRlQWxsQ0lEAwUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lECQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBD3ZhbGlkYXRlQWxsSGFzaAIFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gJAAIBAhNQcm9ibGVtIHdpdGggSGFzaGVzAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQRuYW1lAGQJAAIBAhIxMDAgQ2hhci4gbWF4IG5hbWUDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFC2Rlc2NyaXB0aW9uAOgHCQACAQIaMTAwMCBDaGFyLiBtYXggZGVzY3JpcHRpb24DAwkAZgIAAAUJcm95YWx0aWVzBgkAZgIFCXJveWFsdGllcwDoBwkAAgECM1JveWFsdGllcyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAlIG9yIGhpZ2hlciB0aGFuIDEwJQMJAGYCCQCQAwEJALUJAgUEdGFncwIBLAAFCQACAQILNSB0YWdzIG1heC4CAAEJaXNQYXltZW50AQFpAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECE05vIHBheW1lbnQgYXR0YWNoZWQEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQGYW1vdW50CQEFdmFsdWUBCAUHcGF5bWVudAZhbW91bnQJAJQKAgUHcGF5bWVudAUGYW1vdW50AQ92YWxpZGF0ZVBheW1lbnQBAWkECyR0MDkzNTI5Mzg4CQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFCyR0MDkzNTI5Mzg4Al8xBAZhbW91bnQIBQskdDA5MzUyOTM4OAJfMgQHYXNzZXRJZAMDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkAAAIIBQdwYXltZW50B2Fzc2V0SWQFC3NpZ25Bc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECK09ubHkgU0lHTiB0b2tlbiBhY2NlcHRlZCBhcyB0cmFuc2FjdGlvbiBmZWUDCQECIT0CBQZhbW91bnQFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBAwkdDA5OTc2MTAwMTIJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUMJHQwOTk3NjEwMDEyAl8xBAZhbW91bnQIBQwkdDA5OTc2MTAwMTICXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFDHByaWNlQXNzZXRJZAAACQAAAgkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBQxwcmljZUFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFB2Fzc2V0SWQFBHVuaXQJAQIhPQIFDHByaWNlQXNzZXRJZAIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBAhNQYXltZW50IGRvbid0IG1hdGNoCQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMDAwMDAwkBAiE9AgUHYXNzZXRJZAkA2AQBBQtzaWduQXNzZXRJZAkBAiE9AgUHYXNzZXRJZAkA2AQBBQx3YXZlc0Fzc2V0SWQHCQECIT0CBQdhc3NldElkAgVXQVZFUwcJAQIhPQIFB2Fzc2V0SWQJANgEAQULdXNkbkFzc2V0SWQHCQECIT0CBQdhc3NldElkCQDYBAEFC3VzZHRBc3NldElkBwkBAiE9AgUHYXNzZXRJZAkA2AQBBQ11c2R0UFBBc3NldElkBwkAAgECJk9ubHkgU0lHTiwgVVNETixVU0RUIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAgdhc3NldElkBXByaWNlBAxtaW5TZWxsV2F2ZXMDBQh1bml0VGVzdAAKCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQECDndhdmVzX21pbl9zZWxsBAttaW5TZWxsVXNkbgDAhD0EC21pblNlbGxTaWduAwUIdW5pdFRlc3QAAQkAaAIFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UAAgMDAwMDAwMJAAACBQdhc3NldElkCQDYBAEFC3VzZG5Bc3NldElkCQBmAgULbWluU2VsbFVzZG4FBXByaWNlBwkBAiE9AgUFcHJpY2UAAAcGAwMJAAACBQdhc3NldElkCQDYBAEFC3VzZHRBc3NldElkCQBmAgULbWluU2VsbFVzZG4FBXByaWNlBwkBAiE9AgUFcHJpY2UAAAcGAwMJAAACBQdhc3NldElkCQDYBAEFDXVzZHRQUEFzc2V0SWQJAGYCBQttaW5TZWxsVXNkbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwkAAAIFB2Fzc2V0SWQJANgEAQULc2lnbkFzc2V0SWQJAGYCBQttaW5TZWxsU2lnbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwMJAAACBQdhc3NldElkCQDYBAEFDHdhdmVzQXNzZXRJZAYJAAACBQdhc3NldElkAgVXQVZFUwkAZgIFDG1pblNlbGxXYXZlcwUFcHJpY2UHCQECIT0CBQVwcmljZQAABwkAAgECGFdyb25nIG1pbmltdW0gc2VsbCBwcmljZQYBDWdldEJpZEFzc2V0SWQBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEKYmlkRGF0YUtleQQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgMJAAACBQdiaWREYXRhAgAJAAIBAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8ECWJpZEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJpZERhdGFBcnIAAQQKYmlkQXNzZXRJZAkBDWdldEJpZEFzc2V0SWQBCQCRAwIFCmJpZERhdGFBcnIAAAMJAGcCAAAFCWJpZEFtb3VudAkAAgECDFdyb25nIGFtb3VudAkAlAoCBQliaWRBbW91bnQFCmJpZEFzc2V0SWQBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIBaQZwdWJLZXkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cEC2lzU3BvbnNvcmVkAwkBAiE9AgUGcHViS2V5AgAJAQt2YWx1ZU9yRWxzZQIJAQ5jaGVja1doaXRlbGlzdAEJAKwCAgkApQgBCQCnCAEJANkEAQUGcHViS2V5AglfZnJlZV90eHMAAAAABAZjYWxsZXIDAwkAAAIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkApQgBBQR0aGlzCQBmAgULaXNTcG9uc29yZWQAAAcJAKUIAQkApwgBCQDZBAEFBnB1YktleQkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBNnZXRfc3BvbnNvcmVkX3dhdmVzAwMJAQIhPQIFBnB1YktleQIACQBmAgULaXNTcG9uc29yZWQAAAcJAPwHBAUNd2hpdGVsaXN0RGFwcAIJdXNlRnJlZVR4CQDMCAIJAKUIAQkApwgBCQDZBAEFBnB1YktleQUDbmlsBQNuaWwFBHVuaXQDCQAAAgUTZ2V0X3Nwb25zb3JlZF93YXZlcwUTZ2V0X3Nwb25zb3JlZF93YXZlcwkAlgoECQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFBmNhbGxlcggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAGYCBQtpc1Nwb25zb3JlZAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxpZENhbGxlckRhdGUBAWkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQdidXlNaW50BgFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgZwdWJLZXkEDSR0MDEzMzUwMTM0MzkJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEAmlkCAUNJHQwMTMzNTAxMzQzOQJfMQQGY2FsbGVyCAUNJHQwMTMzNTAxMzQzOQJfMgQEZGF0ZQgFDSR0MDEzMzUwMTM0MzkCXzMEC2lzU3BvbnNvcmVkCAUNJHQwMTMzNTAxMzQzOQJfNAQFaXNCaWQDAwMJAAACBQZjYWxsZXIFBmlzc3VlcgkBAiE9AgUIYmlkT3duZXICAAcJAQIhPQIFBWJpZElkAgAHBgcDAwUFaXNCaWQJAQIhPQIFBmNhbGxlcgUGaXNzdWVyBwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24ECGJsb2NrRW5kCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleUVuZFNhbGUCBQZjYWxsZXIFBWFydElkAwMDCQECIT0CBQhibG9ja0VuZAAACQBnAgUGaGVpZ2h0BQhibG9ja0VuZAcJAQEhAQUFaXNCaWQHCQACAQILU2FsZSBlbmRlZC4EDmNhbGxlcklzSXNzdWVyCQAAAgUGY2FsbGVyBQZpc3N1ZXIECHRvdGFsTkZUCQEPZ2V0SW50ZWdlckJ5S2V5AQIQdG90YWxfbmZ0X2lzc3VlZAQGc2lnbklECQEOZ2V0U3RyaW5nQnlLZXkBCQEJa2V5U2lnbklEAgUGaXNzdWVyBQVhcnRJZAQLYXJ0d29ya05hbWUJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGaXNzdWVyBQVhcnRJZAMJAAACBQthcnR3b3JrTmFtZQIACQACAQIRQXJ0IGRvZXNuJ3QgZXhpc3QECGlzT25TYWxlCQEPZ2V0Qm9vbGVhbkJ5S2V5AQkBCWtleU9uU2FsZQIFBmlzc3VlcgUFYXJ0SWQECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQMYXJ0d29ya1ByaWNlAwUOY2FsbGVySXNJc3N1ZXIJAGgCBRljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlAAIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEIa2V5UHJpY2UCBQZpc3N1ZXIFBWFydElkBAxwcmljZUFzc2V0SWQDBQ5jYWxsZXJJc0lzc3VlcgkA2AQBBQtzaWduQXNzZXRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUFzc2V0SWRBY2NlcHRlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDAwMJAQEhAQUFaXNCaWQJAQEhAQUOY2FsbGVySXNJc3N1ZXIHAwMJAGcCAAAFDGFydHdvcmtQcmljZQYJAQEhAQUIaXNPblNhbGUGCQBnAgAABQptYXhDYW5TZWxsBwkAAgECEEFydCBub3QgZm9yIHNhbGUDAwMJAQEhAQUFaXNCaWQFDmNhbGxlcklzSXNzdWVyBwkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhRNYXggaXNzdWFibGUgbm90IHNldAQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGaXNzdWVyAwMFBWlzQmlkCQECIT0CBQljaGVja1VzZXICAAcJAAIBBQljaGVja1VzZXIECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBA0kdDAxNTAzNzE1MjI5AwUFaXNCaWQJARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQUKYmlkRGF0YUtleQkBFHZhbGlkYXRlUHJpY2VBc3NldElkAwUBaQUMcHJpY2VBc3NldElkBQxhcnR3b3JrUHJpY2UEBmFtb3VudAgFDSR0MDE1MDM3MTUyMjkCXzEEB2Fzc2V0SWQIBQ0kdDAxNTAzNzE1MjI5Al8yBAVhZ2VudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBEmtleUFydGlzdEFnZW50QWRkcgEFBmlzc3VlcgULZmVlUmVjZWl2ZXIECmFnZW50U2hhcmUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUIdXNlckRhcHAJARRrZXlQcmltYXJ5U2hhcmVBZ2VudAEFBmlzc3VlcgAABAtwdWJsaWNBZ2VudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBGGtleUFydGlzdFB1YmxpY0FnZW50QWRkcgEFBmlzc3VlcgULZmVlUmVjZWl2ZXIEEHB1YmxpY0FnZW50U2hhcmUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUIdXNlckRhcHAJARprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudAEFBmlzc3VlcgAABA1pc1doaXRlbGlzdGVkCQEOY2hlY2tXaGl0ZWxpc3QBBQZpc3N1ZXIEDWFtb3VudEZvclNpZ24JAGsDBQZhbW91bnQFDmNvbW1pc3Npb25fZmVlAGQEDmFtb3VudEZvckFnZW50AwMDCQECIT0CBQVhZ2VudAULZmVlUmVjZWl2ZXIJAGYCBQphZ2VudFNoYXJlAAAHCQBmAgUGaGVpZ2h0BQ1pc1doaXRlbGlzdGVkBwkAawMFBmFtb3VudAUKYWdlbnRTaGFyZQCQTgAABBRhbW91bnRGb3JQdWJsaWNBZ2VudAMDAwkBAiE9AgULcHVibGljQWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUQcHVibGljQWdlbnRTaGFyZQAABwkAZgIFBmhlaWdodAUNaXNXaGl0ZWxpc3RlZAcJAGsDBQZhbW91bnQFEHB1YmxpY0FnZW50U2hhcmUAkE4AAAQQYW1vdW50Rm9yQ3JlYXRvcgkAZQIFBmFtb3VudAUNYW1vdW50Rm9yU2lnbgMJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIMQXJ0IHNvbGQgb3V0BA1uZXdBbW91bnRTb2xkCQBkAgUKYW1vdW50U29sZAABBAlpc3N1ZU1ldGEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglDcmVhdG9yOiAFBmlzc3VlcgIKLAogQXJ0SUQ6IAUFYXJ0SWQCCywKIFNpZ25JRDogBQZzaWduSUQCESwKIEFydHdvcmsgbmFtZTogBQthcnR3b3JrTmFtZQIKLAogSXNzdWU6IAkApAMBBQ1uZXdBbW91bnRTb2xkAgEvCQCkAwEFCm1heENhblNlbGwECGlzc3VlTkZUCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQh0b3RhbE5GVAABBQlpc3N1ZU1ldGEAAQAABwQFaWRORlQJALgIAQUIaXNzdWVORlQECnNlbGxTdGF0dXMDAwkAAAIFDW5ld0Ftb3VudFNvbGQFCm1heENhblNlbGwGCQEBIQEFCGlzT25TYWxlBwYECnJlY2VpdmVORlQDAwMJAAACBQZjYWxsZXIFBmlzc3VlcgkBAiE9AgUIYmlkT3duZXICAAcJAQIhPQIFBWJpZElkAgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQhiaWRPd25lcggFAWkGY2FsbGVyBAphc3NldElkQmlkAwkBASEBCQEJaXNEZWZpbmVkAQUHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQUHYXNzZXRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgQJYmlkRGVsT2xkCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWRVcGRhdGUJAQtTdHJpbmdFbnRyeQIJAKwCAgUKYmlkRGF0YUtleQIHX0NMT1NFRAkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQQHc29sZEtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhcnRfc29sZF8JAKQDAQUNbmV3QW1vdW50U29sZAIEX29mXwkApAMBBQptYXhDYW5TZWxsAgFfBQVhcnRJZAIBXwUGaXNzdWVyBAlzb2xkVmFsdWUDCQEBIQEFBWlzQmlkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBmNhbGxlcgIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQxhcnR3b3JrUHJpY2UCAV8FDHByaWNlQXNzZXRJZAIBXwkA2AQBBQVpZE5GVAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEFCnJlY2VpdmVORlQCAV8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8JAKQDAQUGYW1vdW50AgFfBQphc3NldElkQmlkAgFfCQDYBAEFBWlkTkZUBAhzb2xkRGF0YQkBC1N0cmluZ0VudHJ5AgUHc29sZEtleQUJc29sZFZhbHVlBBRjb21taXNzaW9uc1dpdGhBZ2VudAMJAQIhPQIFDmFtb3VudEZvckFnZW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyCQBlAgUNYW1vdW50Rm9yU2lnbgUOYW1vdW50Rm9yQWdlbnQFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBWFnZW50BQ5hbW91bnRGb3JBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgUNYW1vdW50Rm9yU2lnbgUHYXNzZXRJZAUDbmlsBBpjb21taXNzaW9uc1dpdGhQdWJsaWNBZ2VudAMJAQIhPQIFFGFtb3VudEZvclB1YmxpY0FnZW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC3B1YmxpY0FnZW50BRRhbW91bnRGb3JQdWJsaWNBZ2VudAUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGaXNzdWVyCQBlAgUQYW1vdW50Rm9yQ3JlYXRvcgUUYW1vdW50Rm9yUHVibGljQWdlbnQFB2Fzc2V0SWQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGaXNzdWVyBRBhbW91bnRGb3JDcmVhdG9yBQdhc3NldElkBQNuaWwECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsBAZidXlSZXMJAM4IAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBQ1uZXdBbW91bnRTb2xkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIEbmZ0XwkA2AQBBQVpZE5GVAUHc29sZEtleQkAzAgCCQEMSW50ZWdlckVudHJ5AgIQdG90YWxfbmZ0X2lzc3VlZAkAZAIFCHRvdGFsTkZUAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlFbmRTYWxlAgUGaXNzdWVyBQVhcnRJZAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGaXNzdWVyBQVhcnRJZAUKc2VsbFN0YXR1cwkAzAgCBQhpc3N1ZU5GVAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQpyZWNlaXZlTkZUAAEFBWlkTkZUBQNuaWwFFGNvbW1pc3Npb25zV2l0aEFnZW50BRpjb21taXNzaW9uc1dpdGhQdWJsaWNBZ2VudAUKdHhUb0NhbGxlcgMFBWlzQmlkCQDMCAIFCHNvbGREYXRhCQDMCAIFCWJpZFVwZGF0ZQkAzAgCBQliaWREZWxPbGQFBmJ1eVJlcwkAzAgCBQhzb2xkRGF0YQUGYnV5UmVzAQhhc1N0cmluZwECYnYEByRtYXRjaDAFAmJ2AwkAAQIFByRtYXRjaDACBlN0cmluZwQDYnYwBQckbWF0Y2gwBQNidjAJAAIBAiRTcG9uc29yZWQgUHVibGljIEtleSBTdHJpbmcgZXhwZWN0ZWQKBmludm9rZQEHc2V0Q29uZgIDa2V5A3ZhbAQGY2FsbGVyCQClCAEIBQZpbnZva2UGY2FsbGVyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgMJAQhjb250YWlucwIFA2tleQIFY29uZl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUDa2V5BQN2YWwFA25pbAkAAgECIEVudHJpZXMgc3RhcnRpbmcgd2l0aCBjb25mXyBvbmx5CQACAQIiWW91IGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhpcwFpAQphZGRBcnR3b3JrDgpzaGEyNTZIYXNoBnNpZ25JRARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEdHlwZQpjaWREaXNwbGF5DHNoYTI1NkV4cG9ydAljaWRFeHBvcnQNc2hhMjU2TGljZW5jZQpjaWRMaWNlbmNlB2NyYXdsZXIJcm95YWx0aWVzBnB1YktleQQNJHQwMjA0NzIyMDU0NQkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQFYXJ0SWQIBQ0kdDAyMDQ3MjIwNTQ1Al8xBAZjYWxsZXIIBQ0kdDAyMDQ3MjIwNTQ1Al8yBARkYXRlCAUNJHQwMjA0NzIyMDU0NQJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyMDQ3MjIwNTQ1Al80AwkBASEBCQEMdmFsaWRhdGVIYXNoAQUKc2hhMjU2SGFzaAkAAgECJEhhc2ggc2hvdWxkIGJlIDY0IGNoYXJhY3RlcnMgbWF4aW11bQQNJHQwMjA2NDYyMDcxNQkBCnNldExJY2VuY2UCBQpjaWRMaWNlbmNlBQ1zaGEyNTZMaWNlbmNlBApsaWNlbmNlQ0lECAUNJHQwMjA2NDYyMDcxNQJfMQQLbGljZW5jZUhhc2gIBQ0kdDAyMDY0NjIwNzE1Al8yBA92YWxpZGF0ZUFydHdvcmsJARN2YWxpZGF0ZUFydHdvcmtEYXRhCgUGY2FsbGVyBQpjaWREaXNwbGF5BQljaWRFeHBvcnQFCmxpY2VuY2VDSUQFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gFBG5hbWUFC2Rlc2NyaXB0aW9uBQR0YWdzBQlyb3lhbHRpZXMDCQECIT0CBQ92YWxpZGF0ZUFydHdvcmsCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQQd2hpdGVsaXN0ZWRfZHJvcAkAZgIJAQ5jaGVja1doaXRlbGlzdAEJAKwCAgUGY2FsbGVyAgtfZnJlZV9kcm9wcwAABA0kdDAyMTAxNDIxMDk4AwUQd2hpdGVsaXN0ZWRfZHJvcAkAlAoCAAAFBnNpZ25JRAkBD3ZhbGlkYXRlUGF5bWVudAEFAWkEBmFtb3VudAgFDSR0MDIxMDE0MjEwOTgCXzEEB2Fzc2V0SWQIBQ0kdDAyMTAxNDIxMDk4Al8yAwkBASEBCQEJaXNEZWZpbmVkAQUGYW1vdW50CQACAQIUU29tZXRoaW5nIHdlbnQgd3JvbmcECmVudHJ5RXhpc3QJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlUeGlkQnlIYXNoT3duZXICBQpzaGEyNTZIYXNoBQZjYWxsZXIDCQECIT0CBQplbnRyeUV4aXN0AgAJAAIBAhRZb3UgYWxyZWFkeSBhZGRlZCBpdAQJaGFzaEV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoAwkBAiE9AgUJaGFzaEV4aXN0AgAJAAIBAhdIYXNoIGFscmVhZHkgcmVnaXN0ZXJlZAQPaXNTaWduQ2VydGlmaWVkCQEUY2hlY2tTaWduQ2VydGlmaWNhdGUDBQZzaWduSUQFBmNhbGxlcgUKc2hhMjU2SGFzaAMJAQEhAQUPaXNTaWduQ2VydGlmaWVkCQACAQIsU2lnbiBDZXJ0aWZpY2F0ZSBub3QgZm91bmQgZm9yIHRoaXMgYWRkcmVzcy4EF2RlY3JlYXNlX3doaXRlbGlzdF9kcm9wAwUQd2hpdGVsaXN0ZWRfZHJvcAkA/AcEBQ13aGl0ZWxpc3REYXBwAgt1c2VGcmVlRHJvcAkAzAgCBQZjYWxsZXIFA25pbAUDbmlsBQR1bml0AwkAAAIFF2RlY3JlYXNlX3doaXRlbGlzdF9kcm9wBRdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAQKdHhUb0NhbGxlcgMFC2lzU3BvbnNvcmVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZjYWxsZXIAAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoBQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEmtleVR4aWRCeUhhc2hPd25lcgIFCnNoYTI1Nkhhc2gFBmNhbGxlcgUFYXJ0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQdrZXlEYXRlAgUGY2FsbGVyBQVhcnRJZAUEZGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBWFydElkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV4cG9ydENpZAIFBmNhbGxlcgUFYXJ0SWQFCWNpZEV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RXhwb3J0SGFzaAIFBmNhbGxlcgUFYXJ0SWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBWFydElkBQtsaWNlbmNlSGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmxpY2VuY2VDSUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBWFydElkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQVhcnRJZAUEdGFncwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCWtleVNpZ25JRAIFBmNhbGxlcgUFYXJ0SWQFBnNpZ25JRAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlpZEJ5U2lnbmlkAgUGY2FsbGVyBQZzaWduSUQFBWFydElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlIYXNoQnlUeGlkQWRkcgIFBmNhbGxlcgUFYXJ0SWQFCnNoYTI1Nkhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUNyYXdsZXICBQZjYWxsZXIFBWFydElkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQVhcnRJZAUJcm95YWx0aWVzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgUGYW1vdW50BQtzaWduQXNzZXRJZAUDbmlsBQp0eFRvQ2FsbGVyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDXVwZGF0ZUFydHdvcmsNBHR4aWQEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQxzaGEyNTZFeHBvcnQJY2lkRXhwb3J0DXNoYTI1NkxpY2VuY2UKY2lkTGljZW5jZQdjcmF3bGVyCXJveWFsdGllcwZwdWJLZXkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cEDSR0MDI0MTMyMjQyMDIJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEAmlkCAUNJHQwMjQxMzIyNDIwMgJfMQQGY2FsbGVyCAUNJHQwMjQxMzIyNDIwMgJfMgQEZGF0ZQgFDSR0MDI0MTMyMjQyMDICXzMEC2lzU3BvbnNvcmVkCAUNJHQwMjQxMzIyNDIwMgJfNAQNJHQwMjQyMTIyNDI4MQkBCnNldExJY2VuY2UCBQpjaWRMaWNlbmNlBQ1zaGEyNTZMaWNlbmNlBApsaWNlbmNlQ0lECAUNJHQwMjQyMTIyNDI4MQJfMQQLbGljZW5jZUhhc2gIBQ0kdDAyNDIxMjI0MjgxAl8yBA92YWxpZGF0ZUFydHdvcmsJARN2YWxpZGF0ZUFydHdvcmtEYXRhCgUGY2FsbGVyBQpjaWREaXNwbGF5BQljaWRFeHBvcnQFCmxpY2VuY2VDSUQFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gFBG5hbWUFC2Rlc2NyaXB0aW9uBQR0YWdzBQlyb3lhbHRpZXMDCQECIT0CBQ92YWxpZGF0ZUFydHdvcmsCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQKZW50cnlFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZjYWxsZXIFBHR4aWQDCQAAAgUKZW50cnlFeGlzdAIACQACAQIPRW50cnkgbm90IGZvdW5kBARmbGFnCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5RmxhZwIFBmNhbGxlcgUEdHhpZAMJAAACBQRmbGFnAgdJTExFR0FMCQACAQIdQ2Fubm90IHVwZGF0ZSBJTExFR0FMIGFydHdvcmsDCQEBIQEJAQtpc0FydE1pbnRlZAIFBmNhbGxlcgUEdHhpZAQKdHhUb0NhbGxlcgMFC2lzU3BvbnNvcmVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZjYWxsZXIAAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAUEbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5RGVzYwIFBmNhbGxlcgUEdHhpZAULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleURpc3BsYXlDaWQCBQZjYWxsZXIFBHR4aWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV4cG9ydENpZAIFBmNhbGxlcgUEdHhpZAUJY2lkRXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlFeHBvcnRIYXNoAgUGY2FsbGVyBQR0eGlkBQxzaGEyNTZFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUxpY2VuY2VDaWQCBQZjYWxsZXIFBHR4aWQFCmxpY2VuY2VDSUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUxpY2VuY2VIYXNoAgUGY2FsbGVyBQR0eGlkBQtsaWNlbmNlSGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VGFncwIFBmNhbGxlcgUEdHhpZAUEdGFncwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VHlwZQIFBmNhbGxlcgUEdHhpZAUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5Q3Jhd2xlcgIFBmNhbGxlcgUEdHhpZAUHY3Jhd2xlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGtleVJveWFsdGllcwIFBmNhbGxlcgUEdHhpZAUJcm95YWx0aWVzBQNuaWwFCnR4VG9DYWxsZXIJAAIBAg5BbHJlYWR5IG1pbnRlZAFpAQtmbGFnQXJ0d29yawQFYXJ0SWQEYWRkcgRmbGFnBG5vdGUEDSR0MDI1OTA4MjU5NDIJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDI1OTA4MjU5NDICXzEEBmNhbGxlcggFDSR0MDI1OTA4MjU5NDICXzIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIHQ09OU0VOVAkAzAgCAgAJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlGbGFnAgUEYWRkcgUFYXJ0SWQFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5vdGUCBQRhZGRyBQVhcnRJZAUEbm90ZQUDbmlsCQACAQkArAICAg5Vbmtub3cgc3RhdHVzIAUEZmxhZwkAAgECE1lvdSBhcmUgbm90IGFsbG93ZWQBaQENZGVsZXRlQXJ0d29yawIFYXJ0SWQEYWRkcgQNJHQwMjYzNzgyNjQxMgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjYzNzgyNjQxMgJfMQQGY2FsbGVyCAUNJHQwMjYzNzgyNjQxMgJfMgQJYWRkclRvVXNlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUEYWRkcgUGY2FsbGVyBAplbnRyeUV4aXN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUJYWRkclRvVXNlBQVhcnRJZAIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MDCQAAAgUKZW50cnlFeGlzdAIACQACAQIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MECnNoYTI1Nkhhc2gJAQ5nZXRTdHJpbmdCeUtleQEJARFrZXlIYXNoQnlUeGlkQWRkcgIFCWFkZHJUb1VzZQUFYXJ0SWQDCQAAAgUKc2hhMjU2SGFzaAIACQACAQIlTm8gYXJ0IGhhc2ggbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQGc2lnbklECQEOZ2V0U3RyaW5nQnlLZXkBCQEJa2V5U2lnbklEAgUJYWRkclRvVXNlBQVhcnRJZAMJAAACBQZzaWduSUQCAAkAAgECE05vIFNJR04gSUQgbWF0Y2hpbmcEDGRhdGFUb0RlbGV0ZQkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RGF0ZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEZXNjAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RGlzcGxheUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleUV4cG9ydENpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUV4cG9ydEhhc2gCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlMaWNlbmNlSGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUxpY2VuY2VDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUeXBlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5VGFncwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleU1heE1pbnQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlJc3N1ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlPblNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlGbGFnAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEIa2V5UHJpY2UCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlPd25lckJ5SGFzaAEFCnNoYTI1Nkhhc2gJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleWlkQnlTaWduaWQCBQlhZGRyVG9Vc2UFBnNpZ25JRAkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5VHhpZEJ5SGFzaE93bmVyAgUKc2hhMjU2SGFzaAUJYWRkclRvVXNlCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlFbmRTYWxlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5Tm90ZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUNyYXdsZXICBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlSb3lhbHRpZXMCBQlhZGRyVG9Vc2UFBWFydElkBQNuaWwDCQEBIQEJAQtpc0FydE1pbnRlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cFDGRhdGFUb0RlbGV0ZQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIFDGRhdGFUb0RlbGV0ZQkAAgECKEFydCBhbHJlYWR5IG1pbnRlZCwgeW91IGNhbm5vdCBkZWxldGUgaXQBaQELc2VsbEFydHdvcmsGBWFydElkBXByaWNlB21heE1pbnQHYXNzZXRJZAhibG9ja0VuZAZwdWJLZXkEDSR0MDI5MjQ4MjkzMTgJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEAmlkCAUNJHQwMjkyNDgyOTMxOAJfMQQGY2FsbGVyCAUNJHQwMjkyNDgyOTMxOAJfMgQEZGF0ZQgFDSR0MDI5MjQ4MjkzMTgCXzMEC2lzU3BvbnNvcmVkCAUNJHQwMjkyNDgyOTMxOAJfNAQLYXJ0d29ya05hbWUJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGY2FsbGVyBQVhcnRJZAMJAAACBQthcnR3b3JrTmFtZQIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQVhcnRJZAMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUEZmxhZwkAAgECD0ZsYWdnZWQgYXJ0d29yawQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkAwkAZgIAAAUIYmxvY2tFbmQJAAIBAgxOZWdhdGl2ZSBlbmQDAwkAZgIFCGJsb2NrRW5kAAADCQECIT0CBQdtYXhNaW50AAEGCQECIT0CBQVwcmljZQAABwkAAgECOlRpbWVkIG9mZmVyIG9ubHkgYWxsb3dlZCBmb3IgdW5pcXVlIGVkaXRpb24gYW5kIG9mZmVyIG9ubHkECmJhc2VIZWlnaHQDCQAAAgUIYmxvY2tFbmQAAAAABQZoZWlnaHQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAIFB2Fzc2V0SWQFBXByaWNlCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAwkAZgIFB21heE1pbnQAZAkAAgECHDEwMCBlZGl0aW9ucyBtYXggcGVyIGFydHdvcmsDAwkBAiE9AgUKYW1vdW50U29sZAAACQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAcJAAIBAhRNYXggZWRpdGlvbiByZWFjaGVkLgMDCQBmAgUKYW1vdW50U29sZAAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECJkNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSBhbnltb3JlAwMJAGYCBQZiaWROYnIAAAkBAiE9AgUKbWF4Q2FuU2VsbAUHbWF4TWludAcJAAIBAjFDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgd2l0aCBhY3RpdmUgb3JkZXJzBApzZWxsU3RhdHVzAwMJAGYCBQVwcmljZQAACQBmAgUHbWF4TWludAAABwYHBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGY2FsbGVyBQVhcnRJZAUKc2VsbFN0YXR1cwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCGtleVByaWNlAgUGY2FsbGVyBQVhcnRJZAUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAUHbWF4TWludAkAzAgCCQELU3RyaW5nRW50cnkCCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUGY2FsbGVyBQVhcnRJZAUHYXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUVuZFNhbGUCBQZjYWxsZXIFBWFydElkCQBkAgUKYmFzZUhlaWdodAUIYmxvY2tFbmQFA25pbAUKdHhUb0NhbGxlcgFpAQpidXlBcnR3b3JrAgVhcnRJZAZpc3N1ZXIJAQdidXlNaW50BgUBaQUFYXJ0SWQFBmlzc3VlcgIAAgACAAFpAQZzZXRCaWQCBWFydElkBmlzc3VlcgQNJHQwMzE3MDAzMTc0MAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzE3MDAzMTc0MAJfMQQGY2FsbGVyCAUNJHQwMzE3MDAzMTc0MAJfMgQEZGF0ZQgFDSR0MDMxNzAwMzE3NDACXzMEDSR0MDMxNzQ1MzE3ODEJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMzE3NDUzMTc4MQJfMQQGYW1vdW50CAUNJHQwMzE3NDUzMTc4MQJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQECGJsb2NrRW5kCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAwMJAQIhPQIFCGJsb2NrRW5kAAAJAGcCBQZoZWlnaHQFCGJsb2NrRW5kBwkAAgECC1NhbGUgZW5kZWQuBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAIFB2Fzc2V0SWQFBmFtb3VudAkAAgECDldyb25nIG1pbiBzZWxsBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDCQBnAgAABQptYXhDYW5TZWxsCQACAQIjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQBnAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUGY2FsbGVyAgFfBQJpZAIFX09QRU4JAKwCAgkArAICCQCsAgIJAKwCAgUHYXNzZXRJZAIBXwkApAMBBQZhbW91bnQCAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBkAgUGYmlkTmJyAAEFA25pbAFpAQlhY2NlcHRCaWQFBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgZwdWJLZXkJAQdidXlNaW50BgUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQFCGJpZE93bmVyBQZwdWJLZXkBaQEJY2FuY2VsQmlkBAVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIEDSR0MDMzMTE0MzMxNzUJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDMzMTE0MzMxNzUCXzEEBmNhbGxlcggFDSR0MDMzMTE0MzMxNzUCXzIEBGRhdGUIBQ0kdDAzMzExNDMzMTc1Al8zAwMJAQIhPQIFBmNhbGxlcgUIYmlkT3duZXIJAQIhPQIFBmNhbGxlcgUGaXNzdWVyBwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24EDXJldHVybk1vbmV5VG8DCQAAAgUGY2FsbGVyBQZpc3N1ZXIFCGJpZE93bmVyBQZjYWxsZXIEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAQKYmlkRGF0YUtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQhiaWRPd25lcgIBXwUFYmlkSWQEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAdhc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAABAliaWRTdGF0dXMCCENBTkNFTEVECQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIFCmJpZERhdGFLZXkCAV8FCWJpZFN0YXR1cwkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBlAgUGYmlkTmJyAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFDXJldHVybk1vbmV5VG8JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEFB2Fzc2V0SWQFA25pbAECdHgBCHZlcmlmaWVyAAQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAgphZGRBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAA0DAwMDCQAAAggFA2ludghmdW5jdGlvbgINdXBkYXRlQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwAMAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CC3NlbGxBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAUDAwMDCQAAAggFA2ludghmdW5jdGlvbgIJYWNjZXB0QmlkCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQDIEwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAQJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXnV3YUk", "height": 2743139, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BXaP3CSjxv9kNYcLemCMqvCWyrWJhHfRraArKYbQtRWg Next: CmsnHAQ3nK9sECHusTnnVcg34oviHzneKgnVDgW2hPtz Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let VERSION = "2.0.0"
5+
46 func getStringByKey (key) = valueOrElse(getString(this, key), "")
57
68
2426
2527 let usdtAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT"))
2628
29+let usdtPPAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT_PP"))
30+
2731 let wavesAssetId = base58''
2832
2933 let chris = getStringByKey("conf_admin_1")
4044 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
4145
4246
43-let signCut = 7
44-
45-let usdnWaveCut = 10
47+let commission_fee = 8
4648
4749 let defaultLicence = getStringByKey("conf_default_licence")
4850
6163 let userAllowed = "ALLOWED"
6264
6365 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
66+
67+func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
68+
6469
6570 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
6671 case a: String =>
258263
259264
260265 func validatePayment (i) = {
261- let $t091809216 = isPayment(i)
262- let payment = $t091809216._1
263- let amount = $t091809216._2
266+ let $t093529388 = isPayment(i)
267+ let payment = $t093529388._1
268+ let amount = $t093529388._2
264269 let assetId = if (if (isDefined(payment.assetId))
265270 then (payment.assetId == signAssetId)
266271 else false)
283288
284289
285290 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
286- let $t098049840 = isPayment(i)
287- let payment = $t098049840._1
288- let amount = $t098049840._2
291+ let $t0997610012 = isPayment(i)
292+ let payment = $t0997610012._1
293+ let amount = $t0997610012._2
289294 let assetId = if (!(isDefined(payment.assetId)))
290295 then unit
291296 else if (if ((size(priceAssetId) > 0))
303308 }
304309
305310
306-func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
311+func acceptedAssetIds (assetId) = if (if (if (if (if (if ((assetId != toBase58String(signAssetId)))
307312 then (assetId != toBase58String(wavesAssetId))
308313 else false)
309314 then (assetId != "WAVES")
311316 then (assetId != toBase58String(usdnAssetId))
312317 else false)
313318 then (assetId != toBase58String(usdtAssetId))
319+ else false)
320+ then (assetId != toBase58String(usdtPPAssetId))
314321 else false)
315322 then throw("Only SIGN, USDN,USDT or WAVES accepted")
316323 else true
324331 let minSellSign = if (unitTest)
325332 then 1
326333 else (currentCertificationPrice * 2)
327- if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
334+ if (if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
328335 then (minSellUsdn > price)
329336 else false)
330337 then (price != 0)
331338 else false)
332339 then true
333340 else if (if ((assetId == toBase58String(usdtAssetId)))
341+ then (minSellUsdn > price)
342+ else false)
343+ then (price != 0)
344+ else false)
345+ then true
346+ else if (if ((assetId == toBase58String(usdtPPAssetId)))
334347 then (minSellUsdn > price)
335348 else false)
336349 then (price != 0)
402415
403416
404417 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
405- let $t01304113130 = idCallerDateSponsored(i, pubKey)
406- let id = $t01304113130._1
407- let caller = $t01304113130._2
408- let date = $t01304113130._3
409- let isSponsored = $t01304113130._4
418+ let $t01335013439 = idCallerDateSponsored(i, pubKey)
419+ let id = $t01335013439._1
420+ let caller = $t01335013439._2
421+ let date = $t01335013439._3
422+ let isSponsored = $t01335013439._4
410423 let isBid = if (if (if ((caller == issuer))
411424 then (bidOwner != "")
412425 else false)
467480 then throw(checkUser)
468481 else {
469482 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
470- let $t01472814920 = if (isBid)
483+ let $t01503715229 = if (isBid)
471484 then getPriceAssetIdFromBid(bidDataKey)
472485 else validatePriceAssetId(i, priceAssetId, artworkPrice)
473- let amount = $t01472814920._1
474- let assetId = $t01472814920._2
486+ let amount = $t01503715229._1
487+ let assetId = $t01503715229._2
475488 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
476489 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
477490 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
478491 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
479492 let isWhitelisted = checkWhitelist(issuer)
480- let cut = if ((isWhitelisted > height))
481- then 0
482- else if ((assetId == signAssetId))
483- then signCut
484- else usdnWaveCut
485- let amountForSign = fraction(amount, cut, 100)
493+ let amountForSign = fraction(amount, commission_fee, 100)
486494 let amountForAgent = if (if (if ((agent != feeReceiver))
487495 then (agentShare > 0)
488496 else false)
576584
577585 @Callable(i)
578586 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
579- let $t02009620169 = idCallerDateSponsored(i, pubKey)
580- let artId = $t02009620169._1
581- let caller = $t02009620169._2
582- let date = $t02009620169._3
583- let isSponsored = $t02009620169._4
587+ let $t02047220545 = idCallerDateSponsored(i, pubKey)
588+ let artId = $t02047220545._1
589+ let caller = $t02047220545._2
590+ let date = $t02047220545._3
591+ let isSponsored = $t02047220545._4
584592 if (!(validateHash(sha256Hash)))
585593 then throw("Hash should be 64 characters maximum")
586594 else {
587- let $t02027020339 = setLIcence(cidLicence, sha256Licence)
588- let licenceCID = $t02027020339._1
589- let licenceHash = $t02027020339._2
595+ let $t02064620715 = setLIcence(cidLicence, sha256Licence)
596+ let licenceCID = $t02064620715._1
597+ let licenceHash = $t02064620715._2
590598 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
591599 if ((validateArtwork != ""))
592600 then throw("Something went wrong!")
593601 else {
594602 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
595- let $t02063820722 = if (whitelisted_drop)
603+ let $t02101421098 = if (whitelisted_drop)
596604 then $Tuple2(0, signID)
597605 else validatePayment(i)
598- let amount = $t02063820722._1
599- let assetId = $t02063820722._2
606+ let amount = $t02101421098._1
607+ let assetId = $t02101421098._2
600608 if (!(isDefined(amount)))
601609 then throw("Something went wrong")
602610 else {
637645 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
638646 then throw(maintenanceMSG)
639647 else {
640- let $t02375623826 = idCallerDateSponsored(i, pubKey)
641- let id = $t02375623826._1
642- let caller = $t02375623826._2
643- let date = $t02375623826._3
644- let isSponsored = $t02375623826._4
645- let $t02383623905 = setLIcence(cidLicence, sha256Licence)
646- let licenceCID = $t02383623905._1
647- let licenceHash = $t02383623905._2
648+ let $t02413224202 = idCallerDateSponsored(i, pubKey)
649+ let id = $t02413224202._1
650+ let caller = $t02413224202._2
651+ let date = $t02413224202._3
652+ let isSponsored = $t02413224202._4
653+ let $t02421224281 = setLIcence(cidLicence, sha256Licence)
654+ let licenceCID = $t02421224281._1
655+ let licenceHash = $t02421224281._2
648656 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
649657 if ((validateArtwork != ""))
650658 then throw("Something went wrong!")
672680
673681 @Callable(i)
674682 func flagArtwork (artId,addr,flag,note) = {
675- let $t02553225566 = idCallerDate(i)
676- let id = $t02553225566._1
677- let caller = $t02553225566._2
683+ let $t02590825942 = idCallerDate(i)
684+ let id = $t02590825942._1
685+ let caller = $t02590825942._2
678686 if (containsElement([chris, toString(this)], caller))
679687 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
680688 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
686694
687695 @Callable(i)
688696 func deleteArtwork (artId,addr) = {
689- let $t02600226036 = idCallerDate(i)
690- let id = $t02600226036._1
691- let caller = $t02600226036._2
697+ let $t02637826412 = idCallerDate(i)
698+ let id = $t02637826412._1
699+ let caller = $t02637826412._2
692700 let addrToUse = if (containsElement([chris, toString(this)], caller))
693701 then addr
694702 else caller
721729
722730 @Callable(i)
723731 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
724- let $t02887228942 = idCallerDateSponsored(i, pubKey)
725- let id = $t02887228942._1
726- let caller = $t02887228942._2
727- let date = $t02887228942._3
728- let isSponsored = $t02887228942._4
732+ let $t02924829318 = idCallerDateSponsored(i, pubKey)
733+ let id = $t02924829318._1
734+ let caller = $t02924829318._2
735+ let date = $t02924829318._3
736+ let isSponsored = $t02924829318._4
729737 let artworkName = getStringByKey(keyName(caller, artId))
730738 if ((artworkName == ""))
731739 then throw("This art doesn't match your account")
799807
800808 @Callable(i)
801809 func setBid (artId,issuer) = {
802- let $t03132431364 = idCallerDate(i)
803- let id = $t03132431364._1
804- let caller = $t03132431364._2
805- let date = $t03132431364._3
806- let $t03136931405 = isPayment(i)
807- let payment = $t03136931405._1
808- let amount = $t03136931405._2
810+ let $t03170031740 = idCallerDate(i)
811+ let id = $t03170031740._1
812+ let caller = $t03170031740._2
813+ let date = $t03170031740._3
814+ let $t03174531781 = isPayment(i)
815+ let payment = $t03174531781._1
816+ let amount = $t03174531781._2
809817 let assetId = if (!(isDefined(payment.assetId)))
810818 then "WAVES"
811819 else toBase58String(value(payment.assetId))
841849
842850 @Callable(i)
843851 func cancelBid (artId,issuer,bidId,bidOwner) = {
844- let $t03273832799 = idCallerDate(i)
845- let id = $t03273832799._1
846- let caller = $t03273832799._2
847- let date = $t03273832799._3
852+ let $t03311433175 = idCallerDate(i)
853+ let id = $t03311433175._1
854+ let caller = $t03311433175._2
855+ let date = $t03311433175._3
848856 if (if ((caller != bidOwner))
849857 then (caller != issuer)
850858 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let VERSION = "2.0.0"
5+
46 func getStringByKey (key) = valueOrElse(getString(this, key), "")
57
68
79 let unitTest = false
810
911 let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1012
1113 let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1214
1315 let feeReceiver = getStringByKey("conf_fee_receiver")
1416
1517 let userDapp = if (unitTest)
1618 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1719 else value(addressFromString(getStringByKey("conf_users_dapp")))
1820
1921 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2022
2123 let signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
2224
2325 let usdnAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDN"))
2426
2527 let usdtAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT"))
2628
29+let usdtPPAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT_PP"))
30+
2731 let wavesAssetId = base58''
2832
2933 let chris = getStringByKey("conf_admin_1")
3034
3135 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
3236
3337
3438 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
3539
3640
3741 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
3842
3943
4044 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
4145
4246
43-let signCut = 7
44-
45-let usdnWaveCut = 10
47+let commission_fee = 8
4648
4749 let defaultLicence = getStringByKey("conf_default_licence")
4850
4951 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
5052
5153 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
5254
5355 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
5456
5557 let userSuspended = "SUSPENDED"
5658
5759 let userRemoved = "REMOVED"
5860
5961 let userUnregistered = "UNREGISTERED"
6062
6163 let userAllowed = "ALLOWED"
6264
6365 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
66+
67+func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
68+
6469
6570 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
6671 case a: String =>
6772 if (contains(a, sha256Hash))
6873 then true
6974 else false
7075 case _ =>
7176 false
7277 }
7378
7479
7580 func validateCID (cid) = if (contains(cid, "/"))
7681 then if (if ((76 > size(cid)))
7782 then (size(split(cid, "/")[0]) == 59)
7883 else false)
7984 then (16 > size(split(cid, "/")[1]))
8085 else false
8186 else false
8287
8388
8489 func validateHash (hash) = (size(hash) == 64)
8590
8691
8792 func keyUserStatus (caller) = ("user_status_" + caller)
8893
8994
9095 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9196
9297
9398 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9499
95100
96101 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
97102
98103
99104 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
100105
101106
102107 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
103108
104109
105110 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
106111
107112
108113 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
109114
110115
111116 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
112117
113118
114119 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
115120
116121
117122 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
118123
119124
120125 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
121126
122127
123128 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
124129
125130
126131 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
127132
128133
129134 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
130135
131136
132137 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
133138
134139
135140 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
136141
137142
138143 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
139144
140145
141146 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
142147
143148
144149 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
145150
146151
147152 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
148153
149154
150155 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
151156
152157
153158 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
154159
155160
156161 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
157162
158163
159164 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
160165
161166
162167 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
163168
164169
165170 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
166171
167172
168173 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
169174
170175
171176 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
172177
173178
174179 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
175180
176181
177182 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
178183 then throw("Wrong Display CID")
179184 else if (!(validateCID(cidExport)))
180185 then throw("Wrong Export CID")
181186 else if (if ((cidLicence != ""))
182187 then !(validateCID(cidLicence))
183188 else false)
184189 then throw("Wrong Licence CID")
185190 else true
186191
187192
188193 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
189194 then throw("Export Hash 64 char. max")
190195 else if (!(validateHash(sha256Licence)))
191196 then throw("Licence Hash 64 char. max")
192197 else true
193198
194199
195200 func validateString (str,max) = if ((size(str) == 0))
196201 then throw("Field cannot be is empty")
197202 else if ((size(str) > max))
198203 then throw((str + " is too long"))
199204 else true
200205
201206
202207 func validateUser (caller) = {
203208 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
204209 if (if ((userStatus == userUnregistered))
205210 then true
206211 else (userStatus == userAllowed))
207212 then "Register this account first with \"Account\" tab"
208213 else if ((userStatus == userSuspended))
209214 then "Account suspended"
210215 else if ((userStatus == userRemoved))
211216 then "Account removed"
212217 else ""
213218 }
214219
215220
216221 func setLIcence (cidLicence,sha256Licence) = {
217222 let cid = if ((size(cidLicence) == 0))
218223 then defaultLicence
219224 else cidLicence
220225 let hash = if ((size(sha256Licence) == 0))
221226 then defaultHashLicence
222227 else sha256Licence
223228 $Tuple2(cid, hash)
224229 }
225230
226231
227232 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
228233 let checkUser = validateUser(caller)
229234 if ((checkUser != ""))
230235 then throw(checkUser)
231236 else if ((size(cidDisplay) == 0))
232237 then throw("Display CID cannot be empty")
233238 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
234239 then throw("Problem with CID")
235240 else if (!(validateAllHash(sha256Export, licenceHash)))
236241 then throw("Problem with Hashes")
237242 else if (!(validateString(name, 100)))
238243 then throw("100 Char. max name")
239244 else if (!(validateString(description, 1000)))
240245 then throw("1000 Char. max description")
241246 else if (if ((0 > royalties))
242247 then true
243248 else (royalties > 1000))
244249 then throw("Royalties cannot be less than 0% or higher than 10%")
245250 else if ((size(split(tags, ",")) > 5))
246251 then throw("5 tags max.")
247252 else ""
248253 }
249254
250255
251256 func isPayment (i) = if ((size(i.payments) == 0))
252257 then throw("No payment attached")
253258 else {
254259 let payment = value(i.payments[0])
255260 let amount = value(payment.amount)
256261 $Tuple2(payment, amount)
257262 }
258263
259264
260265 func validatePayment (i) = {
261- let $t091809216 = isPayment(i)
262- let payment = $t091809216._1
263- let amount = $t091809216._2
266+ let $t093529388 = isPayment(i)
267+ let payment = $t093529388._1
268+ let amount = $t093529388._2
264269 let assetId = if (if (isDefined(payment.assetId))
265270 then (payment.assetId == signAssetId)
266271 else false)
267272 then payment.assetId
268273 else throw("Only SIGN token accepted as transaction fee")
269274 if ((amount != currentCertificationPrice))
270275 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
271276 else $Tuple2(amount, assetId)
272277 }
273278
274279
275280 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
276281 case b: Int =>
277282 if ((b != 0))
278283 then true
279284 else false
280285 case _ =>
281286 false
282287 }
283288
284289
285290 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
286- let $t098049840 = isPayment(i)
287- let payment = $t098049840._1
288- let amount = $t098049840._2
291+ let $t0997610012 = isPayment(i)
292+ let payment = $t0997610012._1
293+ let amount = $t0997610012._2
289294 let assetId = if (!(isDefined(payment.assetId)))
290295 then unit
291296 else if (if ((size(priceAssetId) > 0))
292297 then (toBase58String(value(payment.assetId)) == priceAssetId)
293298 else false)
294299 then payment.assetId
295300 else throw("Wrong asset id")
296301 if (if ((assetId == unit))
297302 then (priceAssetId != "")
298303 else false)
299304 then throw("Wrong asset id")
300305 else if ((artworkPrice != amount))
301306 then throw("Payment don't match")
302307 else $Tuple2(amount, assetId)
303308 }
304309
305310
306-func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
311+func acceptedAssetIds (assetId) = if (if (if (if (if (if ((assetId != toBase58String(signAssetId)))
307312 then (assetId != toBase58String(wavesAssetId))
308313 else false)
309314 then (assetId != "WAVES")
310315 else false)
311316 then (assetId != toBase58String(usdnAssetId))
312317 else false)
313318 then (assetId != toBase58String(usdtAssetId))
319+ else false)
320+ then (assetId != toBase58String(usdtPPAssetId))
314321 else false)
315322 then throw("Only SIGN, USDN,USDT or WAVES accepted")
316323 else true
317324
318325
319326 func validateMinSell (assetId,price) = {
320327 let minSellWaves = if (unitTest)
321328 then 10
322329 else getIntegerByKeyFromOracle("waves_min_sell")
323330 let minSellUsdn = 1000000
324331 let minSellSign = if (unitTest)
325332 then 1
326333 else (currentCertificationPrice * 2)
327- if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
334+ if (if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
328335 then (minSellUsdn > price)
329336 else false)
330337 then (price != 0)
331338 else false)
332339 then true
333340 else if (if ((assetId == toBase58String(usdtAssetId)))
341+ then (minSellUsdn > price)
342+ else false)
343+ then (price != 0)
344+ else false)
345+ then true
346+ else if (if ((assetId == toBase58String(usdtPPAssetId)))
334347 then (minSellUsdn > price)
335348 else false)
336349 then (price != 0)
337350 else false)
338351 then true
339352 else if (if ((assetId == toBase58String(signAssetId)))
340353 then (minSellSign > price)
341354 else false)
342355 then (price != 0)
343356 else false)
344357 then true
345358 else if (if (if ((assetId == toBase58String(wavesAssetId)))
346359 then true
347360 else (assetId == "WAVES"))
348361 then (minSellWaves > price)
349362 else false)
350363 then (price != 0)
351364 else false)
352365 then throw("Wrong minimum sell price")
353366 else true
354367 }
355368
356369
357370 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
358371 then unit
359372 else fromBase58String(assetId)
360373
361374
362375 func getPriceAssetIdFromBid (bidDataKey) = {
363376 let bidData = getStringByKey((bidDataKey + "_OPEN"))
364377 if ((bidData == ""))
365378 then throw("Bid not found")
366379 else {
367380 let bidDataArr = split(bidData, "_")
368381 let bidAmount = parseIntValue(bidDataArr[1])
369382 let bidAssetId = getBidAssetId(bidDataArr[0])
370383 if ((0 >= bidAmount))
371384 then throw("Wrong amount")
372385 else $Tuple2(bidAmount, bidAssetId)
373386 }
374387 }
375388
376389
377390 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
378391 then throw(maintenanceMSG)
379392 else {
380393 let isSponsored = if ((pubKey != ""))
381394 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
382395 else 0
383396 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
384397 then (isSponsored > 0)
385398 else false)
386399 then toString(addressFromPublicKey(fromBase58String(pubKey)))
387400 else toBase58String(i.caller.bytes)
388401 let get_sponsored_waves = if (if ((pubKey != ""))
389402 then (isSponsored > 0)
390403 else false)
391404 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
392405 else unit
393406 if ((get_sponsored_waves == get_sponsored_waves))
394407 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
395408 else throw("Strict value is not equal to itself.")
396409 }
397410
398411
399412 func idCallerDate (i) = if (!(dappRunning))
400413 then throw(maintenanceMSG)
401414 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
402415
403416
404417 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
405- let $t01304113130 = idCallerDateSponsored(i, pubKey)
406- let id = $t01304113130._1
407- let caller = $t01304113130._2
408- let date = $t01304113130._3
409- let isSponsored = $t01304113130._4
418+ let $t01335013439 = idCallerDateSponsored(i, pubKey)
419+ let id = $t01335013439._1
420+ let caller = $t01335013439._2
421+ let date = $t01335013439._3
422+ let isSponsored = $t01335013439._4
410423 let isBid = if (if (if ((caller == issuer))
411424 then (bidOwner != "")
412425 else false)
413426 then (bidId != "")
414427 else false)
415428 then true
416429 else false
417430 if (if (isBid)
418431 then (caller != issuer)
419432 else false)
420433 then throw("You cannot do this action")
421434 else {
422435 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
423436 if (if (if ((blockEnd != 0))
424437 then (height >= blockEnd)
425438 else false)
426439 then !(isBid)
427440 else false)
428441 then throw("Sale ended.")
429442 else {
430443 let callerIsIssuer = (caller == issuer)
431444 let totalNFT = getIntegerByKey("total_nft_issued")
432445 let signID = getStringByKey(keySignID(issuer, artId))
433446 let artworkName = getStringByKey(keyName(issuer, artId))
434447 if ((artworkName == ""))
435448 then throw("Art doesn't exist")
436449 else {
437450 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
438451 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
439452 let artworkPrice = if (callerIsIssuer)
440453 then (currentCertificationPrice * 2)
441454 else getIntegerByKey(keyPrice(issuer, artId))
442455 let priceAssetId = if (callerIsIssuer)
443456 then toBase58String(signAssetId)
444457 else getStringByKey(keyAssetIdAccepted(issuer, artId))
445458 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
446459 if (if (if (!(isBid))
447460 then !(callerIsIssuer)
448461 else false)
449462 then if (if ((0 >= artworkPrice))
450463 then true
451464 else !(isOnSale))
452465 then true
453466 else (0 >= maxCanSell)
454467 else false)
455468 then throw("Art not for sale")
456469 else if (if (if (!(isBid))
457470 then callerIsIssuer
458471 else false)
459472 then (0 >= maxCanSell)
460473 else false)
461474 then throw("Max issuable not set")
462475 else {
463476 let checkUser = validateUser(issuer)
464477 if (if (isBid)
465478 then (checkUser != "")
466479 else false)
467480 then throw(checkUser)
468481 else {
469482 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
470- let $t01472814920 = if (isBid)
483+ let $t01503715229 = if (isBid)
471484 then getPriceAssetIdFromBid(bidDataKey)
472485 else validatePriceAssetId(i, priceAssetId, artworkPrice)
473- let amount = $t01472814920._1
474- let assetId = $t01472814920._2
486+ let amount = $t01503715229._1
487+ let assetId = $t01503715229._2
475488 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
476489 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
477490 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
478491 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
479492 let isWhitelisted = checkWhitelist(issuer)
480- let cut = if ((isWhitelisted > height))
481- then 0
482- else if ((assetId == signAssetId))
483- then signCut
484- else usdnWaveCut
485- let amountForSign = fraction(amount, cut, 100)
493+ let amountForSign = fraction(amount, commission_fee, 100)
486494 let amountForAgent = if (if (if ((agent != feeReceiver))
487495 then (agentShare > 0)
488496 else false)
489497 then (height > isWhitelisted)
490498 else false)
491499 then fraction(amount, agentShare, 10000)
492500 else 0
493501 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
494502 then (publicAgentShare > 0)
495503 else false)
496504 then (height > isWhitelisted)
497505 else false)
498506 then fraction(amount, publicAgentShare, 10000)
499507 else 0
500508 let amountForCreator = (amount - amountForSign)
501509 if ((amountSold == maxCanSell))
502510 then throw("Art sold out")
503511 else {
504512 let newAmountSold = (amountSold + 1)
505513 let issueMeta = ((((((((((("Creator: " + issuer) + ",
506514 ArtID: ") + artId) + ",
507515 SignID: ") + signID) + ",
508516 Artwork name: ") + artworkName) + ",
509517 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
510518 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
511519 let idNFT = calculateAssetId(issueNFT)
512520 let sellStatus = if (if ((newAmountSold == maxCanSell))
513521 then true
514522 else !(isOnSale))
515523 then false
516524 else true
517525 let receiveNFT = if (if (if ((caller == issuer))
518526 then (bidOwner != "")
519527 else false)
520528 then (bidId != "")
521529 else false)
522530 then addressFromStringValue(bidOwner)
523531 else i.caller
524532 let assetIdBid = if (!(isDefined(assetId)))
525533 then "WAVES"
526534 else toBase58String(value(assetId))
527535 let bidData = getStringByKey((bidDataKey + "_OPEN"))
528536 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
529537 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
530538 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
531539 let soldValue = if (!(isBid))
532540 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
533541 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
534542 let soldData = StringEntry(soldKey, soldValue)
535543 let commissionsWithAgent = if ((amountForAgent != 0))
536544 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
537545 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
538546 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
539547 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
540548 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
541549 let txToCaller = if (isSponsored)
542550 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
543551 else nil
544552 let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
545553 if (isBid)
546554 then [soldData, bidUpdate, bidDelOld] :: buyRes
547555 else soldData :: buyRes
548556 }
549557 }
550558 }
551559 }
552560 }
553561 }
554562 }
555563
556564
557565 func asString (bv) = match bv {
558566 case bv0: String =>
559567 bv0
560568 case _ =>
561569 throw("Sponsored Public Key String expected")
562570 }
563571
564572
565573 @Callable(invoke)
566574 func setConf (key,val) = {
567575 let caller = toString(invoke.caller)
568576 if (containsElement([chris, toString(this)], caller))
569577 then if (contains(key, "conf_"))
570578 then [StringEntry(key, val)]
571579 else throw("Entries starting with conf_ only")
572580 else throw("You are not allowed to change this")
573581 }
574582
575583
576584
577585 @Callable(i)
578586 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
579- let $t02009620169 = idCallerDateSponsored(i, pubKey)
580- let artId = $t02009620169._1
581- let caller = $t02009620169._2
582- let date = $t02009620169._3
583- let isSponsored = $t02009620169._4
587+ let $t02047220545 = idCallerDateSponsored(i, pubKey)
588+ let artId = $t02047220545._1
589+ let caller = $t02047220545._2
590+ let date = $t02047220545._3
591+ let isSponsored = $t02047220545._4
584592 if (!(validateHash(sha256Hash)))
585593 then throw("Hash should be 64 characters maximum")
586594 else {
587- let $t02027020339 = setLIcence(cidLicence, sha256Licence)
588- let licenceCID = $t02027020339._1
589- let licenceHash = $t02027020339._2
595+ let $t02064620715 = setLIcence(cidLicence, sha256Licence)
596+ let licenceCID = $t02064620715._1
597+ let licenceHash = $t02064620715._2
590598 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
591599 if ((validateArtwork != ""))
592600 then throw("Something went wrong!")
593601 else {
594602 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
595- let $t02063820722 = if (whitelisted_drop)
603+ let $t02101421098 = if (whitelisted_drop)
596604 then $Tuple2(0, signID)
597605 else validatePayment(i)
598- let amount = $t02063820722._1
599- let assetId = $t02063820722._2
606+ let amount = $t02101421098._1
607+ let assetId = $t02101421098._2
600608 if (!(isDefined(amount)))
601609 then throw("Something went wrong")
602610 else {
603611 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
604612 if ((entryExist != ""))
605613 then throw("You already added it")
606614 else {
607615 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
608616 if ((hashExist != ""))
609617 then throw("Hash already registered")
610618 else {
611619 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
612620 if (!(isSignCertified))
613621 then throw("Sign Certificate not found for this address.")
614622 else {
615623 let decrease_whitelist_drop = if (whitelisted_drop)
616624 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
617625 else unit
618626 if ((decrease_whitelist_drop == decrease_whitelist_drop))
619627 then {
620628 let txToCaller = if (isSponsored)
621629 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
622630 else nil
623631 ([StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyCrawler(caller, artId), crawler), IntegerEntry(keyRoyalties(caller, artId), royalties), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, signAssetId)] ++ txToCaller)
624632 }
625633 else throw("Strict value is not equal to itself.")
626634 }
627635 }
628636 }
629637 }
630638 }
631639 }
632640 }
633641
634642
635643
636644 @Callable(i)
637645 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
638646 then throw(maintenanceMSG)
639647 else {
640- let $t02375623826 = idCallerDateSponsored(i, pubKey)
641- let id = $t02375623826._1
642- let caller = $t02375623826._2
643- let date = $t02375623826._3
644- let isSponsored = $t02375623826._4
645- let $t02383623905 = setLIcence(cidLicence, sha256Licence)
646- let licenceCID = $t02383623905._1
647- let licenceHash = $t02383623905._2
648+ let $t02413224202 = idCallerDateSponsored(i, pubKey)
649+ let id = $t02413224202._1
650+ let caller = $t02413224202._2
651+ let date = $t02413224202._3
652+ let isSponsored = $t02413224202._4
653+ let $t02421224281 = setLIcence(cidLicence, sha256Licence)
654+ let licenceCID = $t02421224281._1
655+ let licenceHash = $t02421224281._2
648656 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
649657 if ((validateArtwork != ""))
650658 then throw("Something went wrong!")
651659 else {
652660 let entryExist = getStringByKey(keyName(caller, txid))
653661 if ((entryExist == ""))
654662 then throw("Entry not found")
655663 else {
656664 let flag = getStringByKey(keyFlag(caller, txid))
657665 if ((flag == "ILLEGAL"))
658666 then throw("Cannot update ILLEGAL artwork")
659667 else if (!(isArtMinted(caller, txid)))
660668 then {
661669 let txToCaller = if (isSponsored)
662670 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
663671 else nil
664672 ([StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type), StringEntry(keyCrawler(caller, txid), crawler), IntegerEntry(keyRoyalties(caller, txid), royalties)] ++ txToCaller)
665673 }
666674 else throw("Already minted")
667675 }
668676 }
669677 }
670678
671679
672680
673681 @Callable(i)
674682 func flagArtwork (artId,addr,flag,note) = {
675- let $t02553225566 = idCallerDate(i)
676- let id = $t02553225566._1
677- let caller = $t02553225566._2
683+ let $t02590825942 = idCallerDate(i)
684+ let id = $t02590825942._1
685+ let caller = $t02590825942._2
678686 if (containsElement([chris, toString(this)], caller))
679687 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
680688 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
681689 else throw(("Unknow status " + flag))
682690 else throw("You are not allowed")
683691 }
684692
685693
686694
687695 @Callable(i)
688696 func deleteArtwork (artId,addr) = {
689- let $t02600226036 = idCallerDate(i)
690- let id = $t02600226036._1
691- let caller = $t02600226036._2
697+ let $t02637826412 = idCallerDate(i)
698+ let id = $t02637826412._1
699+ let caller = $t02637826412._2
692700 let addrToUse = if (containsElement([chris, toString(this)], caller))
693701 then addr
694702 else caller
695703 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
696704 if ((entryExist == ""))
697705 then throw("No art matching for this address")
698706 else {
699707 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
700708 if ((sha256Hash == ""))
701709 then throw("No art hash matching for this address")
702710 else {
703711 let signID = getStringByKey(keySignID(addrToUse, artId))
704712 if ((signID == ""))
705713 then throw("No SIGN ID matching")
706714 else {
707715 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))]
708716 if (!(isArtMinted(addrToUse, artId)))
709717 then if (!(dappRunning))
710718 then throw(maintenanceMSG)
711719 else dataToDelete
712720 else if (containsElement([chris, toString(this)], caller))
713721 then dataToDelete
714722 else throw("Art already minted, you cannot delete it")
715723 }
716724 }
717725 }
718726 }
719727
720728
721729
722730 @Callable(i)
723731 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
724- let $t02887228942 = idCallerDateSponsored(i, pubKey)
725- let id = $t02887228942._1
726- let caller = $t02887228942._2
727- let date = $t02887228942._3
728- let isSponsored = $t02887228942._4
732+ let $t02924829318 = idCallerDateSponsored(i, pubKey)
733+ let id = $t02924829318._1
734+ let caller = $t02924829318._2
735+ let date = $t02924829318._3
736+ let isSponsored = $t02924829318._4
729737 let artworkName = getStringByKey(keyName(caller, artId))
730738 if ((artworkName == ""))
731739 then throw("This art doesn't match your account")
732740 else {
733741 let flag = getStringByKey(keyFlag(caller, artId))
734742 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
735743 then throw("Flagged artwork")
736744 else {
737745 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
738746 if ((0 > blockEnd))
739747 then throw("Negative end")
740748 else if (if ((blockEnd > 0))
741749 then if ((maxMint != 1))
742750 then true
743751 else (price != 0)
744752 else false)
745753 then throw("Timed offer only allowed for unique edition and offer only")
746754 else {
747755 let baseHeight = if ((blockEnd == 0))
748756 then 0
749757 else height
750758 if (!(acceptedAssetIds(assetId)))
751759 then throw("Something went wrong!")
752760 else if (!(validateMinSell(assetId, price)))
753761 then throw("Something went wrong!")
754762 else {
755763 let checkUser = validateUser(caller)
756764 if ((checkUser != ""))
757765 then throw(checkUser)
758766 else {
759767 let amountSold = getIntegerByKey(keyIssued(caller, artId))
760768 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
761769 if ((maxMint > 100))
762770 then throw("100 editions max per artwork")
763771 else if (if ((amountSold != 0))
764772 then (amountSold == maxCanSell)
765773 else false)
766774 then throw("Max edition reached.")
767775 else if (if ((amountSold > 0))
768776 then (maxCanSell != maxMint)
769777 else false)
770778 then throw("Cannot change maximum issuable anymore")
771779 else if (if ((bidNbr > 0))
772780 then (maxCanSell != maxMint)
773781 else false)
774782 then throw("Cannot change maximum issuable with active orders")
775783 else {
776784 let sellStatus = if (if ((price > 0))
777785 then (maxMint > 0)
778786 else false)
779787 then true
780788 else false
781789 let txToCaller = if (isSponsored)
782790 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
783791 else nil
784792 ([BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId), IntegerEntry(keyEndSale(caller, artId), (baseHeight + blockEnd))] ++ txToCaller)
785793 }
786794 }
787795 }
788796 }
789797 }
790798 }
791799 }
792800
793801
794802
795803 @Callable(i)
796804 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
797805
798806
799807
800808 @Callable(i)
801809 func setBid (artId,issuer) = {
802- let $t03132431364 = idCallerDate(i)
803- let id = $t03132431364._1
804- let caller = $t03132431364._2
805- let date = $t03132431364._3
806- let $t03136931405 = isPayment(i)
807- let payment = $t03136931405._1
808- let amount = $t03136931405._2
810+ let $t03170031740 = idCallerDate(i)
811+ let id = $t03170031740._1
812+ let caller = $t03170031740._2
813+ let date = $t03170031740._3
814+ let $t03174531781 = isPayment(i)
815+ let payment = $t03174531781._1
816+ let amount = $t03174531781._2
809817 let assetId = if (!(isDefined(payment.assetId)))
810818 then "WAVES"
811819 else toBase58String(value(payment.assetId))
812820 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
813821 if (if ((blockEnd != 0))
814822 then (height >= blockEnd)
815823 else false)
816824 then throw("Sale ended.")
817825 else {
818826 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
819827 if (!(acceptedAssetIds(assetId)))
820828 then throw("asset not accepted")
821829 else if (!(validateMinSell(assetId, amount)))
822830 then throw("Wrong min sell")
823831 else {
824832 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
825833 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
826834 if ((0 >= maxCanSell))
827835 then throw("No max edition set for this artwork")
828836 else if ((amountSold >= maxCanSell))
829837 then throw("Sold out, you cannot bid")
830838 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
831839 }
832840 }
833841 }
834842
835843
836844
837845 @Callable(i)
838846 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
839847
840848
841849
842850 @Callable(i)
843851 func cancelBid (artId,issuer,bidId,bidOwner) = {
844- let $t03273832799 = idCallerDate(i)
845- let id = $t03273832799._1
846- let caller = $t03273832799._2
847- let date = $t03273832799._3
852+ let $t03311433175 = idCallerDate(i)
853+ let id = $t03311433175._1
854+ let caller = $t03311433175._2
855+ let date = $t03311433175._3
848856 if (if ((caller != bidOwner))
849857 then (caller != issuer)
850858 else false)
851859 then throw("You cannot do this action")
852860 else {
853861 let returnMoneyTo = if ((caller == issuer))
854862 then bidOwner
855863 else caller
856864 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
857865 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
858866 let bidData = getStringByKey((bidDataKey + "_OPEN"))
859867 if ((bidData == ""))
860868 then throw("Bid not found")
861869 else {
862870 let bidDataArr = split(bidData, "_")
863871 let assetId = getBidAssetId(bidDataArr[0])
864872 let bidStatus = "CANCELED"
865873 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
866874 }
867875 }
868876 }
869877
870878
871879 @Verifier(tx)
872880 func verifier () = match tx {
873881 case inv: InvokeScriptTransaction =>
874882 if (if (if (if ((inv.function == "addArtwork"))
875883 then (inv.dApp == this)
876884 else false)
877885 then (inv.fee == 500000)
878886 else false)
879887 then (inv.feeAssetId == unit)
880888 else false)
881889 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
882890 else if (if (if (if ((inv.function == "updateArtwork"))
883891 then (inv.dApp == this)
884892 else false)
885893 then (inv.fee == 500000)
886894 else false)
887895 then (inv.feeAssetId == unit)
888896 else false)
889897 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
890898 else if (if (if (if ((inv.function == "sellArtwork"))
891899 then (inv.dApp == this)
892900 else false)
893901 then (inv.fee == 500000)
894902 else false)
895903 then (inv.feeAssetId == unit)
896904 else false)
897905 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
898906 else if (if (if (if ((inv.function == "acceptBid"))
899907 then (inv.dApp == this)
900908 else false)
901909 then (inv.fee == 500000)
902910 else false)
903911 then (inv.feeAssetId == unit)
904912 else false)
905913 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
906914 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
907915 case _ =>
908916 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
909917 }
910918

github/deemru/w8io/026f985 
130.15 ms