tx · 9itf31mXUGDvDQchj4VDHnbWhJ6r6ekgBCtWWPgWjyWD

3N8jKcYWjJn5GjrJV94rxzVk42TPk1rPLeu:  -0.02400000 Waves

2022.07.29 21:08 [2161455] smart account 3N8jKcYWjJn5GjrJV94rxzVk42TPk1rPLeu > SELF 0.00000000 Waves

{ "type": 13, "id": "9itf31mXUGDvDQchj4VDHnbWhJ6r6ekgBCtWWPgWjyWD", "fee": 2400000, "feeAssetId": null, "timestamp": 1659118207655, "version": 2, "chainId": 84, "sender": "3N8jKcYWjJn5GjrJV94rxzVk42TPk1rPLeu", "senderPublicKey": "914UmzBhcoS4onGGVcBRgb4VPV88m9VCFjsj5WWck5vm", "proofs": [ "3qj2k7MoHZbiZTekTvPqiY8Boyki8HnuNk1TmJ4wCjGHsqUcdfFTW2j5xJR9kDThU9sMCY4EayiRi5xpyhUwK66X" ], "script": "base64:BgJeCAISAwoBCBIDCgEIEgUKAwEICBIMCgoICAgICAgICAgIEg4KDAgBAQgIAQgICAEBARIECgIIARIECgIICBIFCgMICAgSAwoBCBIECgIICBIGCgQICAgIEgUKAwgICFMACHVuaXRUZXN0BwAJb3JhY2xlS2V5AglvcmFjbGVLZXkBBmdldFN0cgEDa2V5BAckbWF0Y2gwCQCdCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWIFByRtYXRjaDAFAWICAAAGb3JhY2xlCQEGZ2V0U3RyAQUJb3JhY2xlS2V5AAlvcmFjbGVGZWUJAQV2YWx1ZQEJAKYIAQUGb3JhY2xlAAZvd25lcnMJAMwIAgkAnQgCBQlvcmFjbGVGZWUCBm93bmVyMQkAzAgCCQCdCAIFCW9yYWNsZUZlZQIGb3duZXIyBQNuaWwAD2NvbGxlY3Rpb25zRGFwcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCW9yYWNsZUZlZQIPY29sbGVjdGlvbnNEYXBwAhhjb2xsZWN0aW9uRGFwcCBub3QgZm91bmQAC2ZlZVJlY2VpdmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUJb3JhY2xlRmVlAgtmZWVSZWNlaXZlcgIVZmVlUmVjZWl2ZXIgbm90IGZvdW5kAAhjZXJ0RGFwcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCW9yYWNsZUZlZQIIY2VydERhcHACEmNlcnREYXBwIG5vdCBmb3VuZAAHZmVlRGFwcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCW9yYWNsZUZlZQIHZmVlRGFwcAIRZmVlRGFwcCBub3QgZm91bmQACHVzZXJEYXBwCQEFdmFsdWUBCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQlvcmFjbGVGZWUCCHVzZXJEYXBwAhJ1c2VyZGFwcCBub3QgZm91bmQACXN0YWtlRGFwcAkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUJb3JhY2xlRmVlAglzdGFrZURhcHACFHNjb25leERhcHAgbm90IGZvdW5kAAtVU0ROQXNzZXRJZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQlvcmFjbGVGZWUCC1VTRE5Bc3NldElkAA1TY29uZXhBc3NldElkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFCW9yYWNsZUZlZQINU2NvbmV4QXNzZXRJZAAFdHlwZXMJAMwIAgIFSU1BR0UJAMwIAgIDUERGCQDMCAICBVZJREVPBQNuaWwADFByZXZpZXd0eXBlcwkAzAgCAgNQREYFA25pbAALZGFwcFJ1bm5pbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUIdXNlckRhcHACFGNvbmZfZGFwcF9pc19ydW5uaW5nBgAObWFpbnRlbmFuY2VNU0cJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHACFGNvbmZfbWFpbnRlbmFuY2VfbXNnAgAADXVzZXJTdXNwZW5kZWQCCVNVU1BFTkRFRAALdXNlclJlbW92ZWQCB1JFTU9WRUQAEHVzZXJVbnJlZ2lzdGVyZWQCDFVOUkVHSVNURVJFRAAMYXVjdGlvblR5cGUxAgdCSURUWVBFAAxhdWN0aW9uVHlwZTICC1RSQURJVElPTkFMAAxhdWN0aW9uVHlwZTMCBkRJUkVDVAEXZ2V0U3RyaW5nQnlLZXlGcm9tVXNlcnMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAUDa2V5AgABDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgABFWdldFN0cmluZ0J5S2V5T3JFcnJvcgIDa2V5BWVycm9yCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUDa2V5BQVlcnJvcgEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUJb3JhY2xlRmVlBQNrZXkCH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBD2dldEludGVnZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ9nZXRCb29sZWFuQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQNrZXkHAQx2YWxpZGF0ZUhhc2gBBGhhc2gJAAACCQCxAgEFBGhhc2gAQAENa2V5VXNlclN0YXR1cwEGY2FsbGVyCQCsAgICDHVzZXJfc3RhdHVzXwUGY2FsbGVyAQdrZXlEYXRlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5TmFtZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleURlc2MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlEaXNwbGF5Q2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDWtleVByZXZpZXdDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X3ByZXZpZXdfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5TWF4TWludAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfbWF4bWludF8FBWFydElkAgFfBQZjYWxsZXIBEmtleUhpZ2hlc3RCaWRCaWRJZAEFYXJ0SWQJAKwCAgIUYXJ0X2hpZ2hlc3RCaWRCaWRJZF8FBWFydElkAQhrZXlCaWRJZAEFYmlkSWQJAKwCAgIEYmlkXwUFYmlkSWQBC2tleUR1cmF0aW9uAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDWFydF9kdXJhdGlvbl8FBWFydElkAgFfBQZjYWxsZXIBDGtleUVuZEhlaWdodAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg5hcnRfZW5kaGVpZ2h0XwUFYXJ0SWQCAV8FBmNhbGxlcgEOa2V5QXVjdGlvblR5cGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2F1Y3Rpb250eXBlXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5SXNzdWVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQxLZXlOZnRJc3N1ZXIBBW5mdElkCQCsAgICC25mdF9pc3N1ZWRfBQVuZnRJZAELS2V5TmZ0QXJ0SWQBBW5mdElkCQCsAgICCm5mdF9hcnRJZF8FBW5mdElkAQlrZXlPblNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X29uc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBDmtleUVudGl0bGVtZW50AgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9lbnRpdGxlbWVudF8FBWFydElkAgFfBQZjYWxsZXIBB2tleVRhZ3MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3RhZ3NfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUeXBlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUFYXJ0SWQCAV8FBmNhbGxlcgEIa2V5UHJpY2UCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXNzZXRJZEFjY2VwdGVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEmFydF9hc3NldEFjY2VwdGVkXwUFYXJ0SWQCAV8FBmNhbGxlcgERa2V5SGFzaEJ5VHhpZEFkZHICBmNhbGxlcgR0eGlkCQCsAgIJAKwCAgkArAICAhNnZXRfaGFzaGJ5dHhpZGFkZHJfBQR0eGlkAgFfBQZjYWxsZXIBDmtleU93bmVyQnlIYXNoAQpzaGEyNTZIYXNoCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUKc2hhMjU2SGFzaAESa2V5VHhpZEJ5SGFzaE93bmVyAgpzaGEyNTZIYXNoBmNhbGxlcgkArAICAhdnZXRfdHhpZF9ieV9oYXNoX293bmVyXwkA2AQBCQDUFgEJAJsDAQkArAICBQpzaGEyNTZIYXNoBQZjYWxsZXIBDWtleUNvbGxlY3Rpb24CBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FBWFydElkAgFfBQZjYWxsZXIADG1pblVTRE5QcmljZQkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBCQCsAgICBG1pbl8JANgEAQULVVNETkFzc2V0SWQAEGN1cnJlbnRGZWVTY29uZXgJARlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAQkArAICAgRmZWVfCQDYBAEFDVNjb25leEFzc2V0SWQBEGdldEFtb3VudEJ5QmlkSWQBBWJpZElkCQELdmFsdWVPckVsc2UCCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCGtleUJpZElkAQUFYmlkSWQAAAEaZ2V0QW1vdW50SGlnaGVzdEJpZEJ5QXJ0SWQBBWFydElkBAViaWRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUhpZ2hlc3RCaWRCaWRJZAEFBWFydElkCQEQZ2V0QW1vdW50QnlCaWRJZAEFBWJpZElkAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwkAAAIFCnVzZXJTdGF0dXMFEHVzZXJVbnJlZ2lzdGVyZWQCLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICdBY2NvdW50JyB0YWIDCQAAAgUKdXNlclN0YXR1cwUNdXNlclN1c3BlbmRlZAIRQWNjb3VudCBzdXNwZW5kZWQDCQAAAgUKdXNlclN0YXR1cwULdXNlclJlbW92ZWQCD0FjY291bnQgcmVtb3ZlZAIAARN2YWxpZGF0ZUFydHdvcmtEYXRhBQZjYWxsZXIKY2lkRGlzcGxheQRuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyAwkAAAIJALECAQUKY2lkRGlzcGxheQAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBAiE9AgkAsQIBBQpjaWREaXNwbGF5AC4JAAIBAh5UaGlzIGRvZXNuJ3Qgc2VlbSBhIHZhbGlkIENJRCEDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFBG5hbWUAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgULZGVzY3JpcHRpb24A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMJAGYCCQCQAwEJALUJAgUEdGFncwIBLAAFCQACAQILNSB0YWdzIG1heC4CAAEJaXNQYXltZW50AgFpBWluZGV4AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECE05vIHBheW1lbnQgYXR0YWNoZWQEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4BAZhbW91bnQJAQV2YWx1ZQEIBQdwYXltZW50BmFtb3VudAkAlAoCBQdwYXltZW50BQZhbW91bnQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBAVwRGF0YQkBCWlzUGF5bWVudAIFAWkAAQQHcGF5bWVudAgFBXBEYXRhAl8xBAZhbW91bnQIBQVwRGF0YQJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhdBc3NldCBJZCBpcyBub3QgZGVmaW5lZAMDCQBmAgkAsQIBBQxwcmljZUFzc2V0SWQAAAkAAAIJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAUMcHJpY2VBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBCQCsAgIJAKwCAgkArAICAhRQYXltZW50IGRvbid0IG1hdGNoIAkApAMBBQxhcnR3b3JrUHJpY2UCASAJAKQDAQUGYW1vdW50CQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMJAQIhPQIFB2Fzc2V0SWQJANgEAQULVVNETkFzc2V0SWQJAAIBAhJPbmx5IFVTRE4gYWNjZXB0ZWQGAQ92YWxpZGF0ZU1pblNlbGwCB2Fzc2V0SWQFcHJpY2UEDW1pblNlbGxTY29uZXgFDG1pblVTRE5QcmljZQMDAwkBAiE9AgUFcHJpY2UAAAkAZgIFDW1pblNlbGxTY29uZXgFBXByaWNlBwYJAQIhPQIFB2Fzc2V0SWQJANgEAQULVVNETkFzc2V0SWQJAAIBCQCsAgICGVdyb25nIG1pbmltdW0gc2VsbCBwcmljZSAJAKQDAQUNbWluU2VsbFNjb25leAYBDWdldEJpZEFzc2V0SWQBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMJAAIBAhZPbmx5IFVTRE4gaXMgYWNjZXB0ZWQhCQDZBAEFB2Fzc2V0SWQBFmdldFByaWNlQXNzZXRJZEZyb21CaWQBCmJpZERhdGFLZXkEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAliaWRBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEECmJpZEFzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAADCQBnAgAABQliaWRBbW91bnQJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUJYmlkQW1vdW50BQpiaWRBc3NldElkAQxpZENhbGxlckRhdGUBAWkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQpnZXRBcnREYXRhBAFpBmlzc3VlcgVhcnRJZAVpc0JpZAQOY2FsbGVySXNJc3N1ZXIJAAACCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMFBmlzc3VlcgQIdG90YWxORlQJAQ9nZXRJbnRlZ2VyQnlLZXkBAhB0b3RhbF9uZnRfaXNzdWVkBAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZpc3N1ZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAhFBcnQgZG9lc24ndCBleGlzdAQIaXNPblNhbGUJAQ9nZXRCb29sZWFuQnlLZXkBCQEJa2V5T25TYWxlAgUGaXNzdWVyBQVhcnRJZAQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBAxhcnR3b3JrUHJpY2UJAQt2YWx1ZU9yRWxzZQIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEIa2V5UHJpY2UCBQZpc3N1ZXIFBWFydElkBQxtaW5VU0ROUHJpY2UEDHByaWNlQXNzZXRJZAMFDmNhbGxlcklzSXNzdWVyCQDYBAEFC1VTRE5Bc3NldElkCQEOZ2V0U3RyaW5nQnlLZXkBCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMDAwkBASEBBQVpc0JpZAkBASEBBQ5jYWxsZXJJc0lzc3VlcgcDAwkAZwIAAAUMYXJ0d29ya1ByaWNlBgkBASEBBQhpc09uU2FsZQYJAGcCAAAFCm1heENhblNlbGwHCQACAQIQQXJ0IG5vdCBmb3Igc2FsZQMDAwkBASEBBQVpc0JpZAUOY2FsbGVySXNJc3N1ZXIHCQBnAgAABQptYXhDYW5TZWxsBwkAAgECFE1heCBpc3N1YWJsZSBub3Qgc2V0CQCZCgcFCHRvdGFsTkZUBQthcnR3b3JrTmFtZQUKYW1vdW50U29sZAUMYXJ0d29ya1ByaWNlBQxwcmljZUFzc2V0SWQFCm1heENhblNlbGwFCGlzT25TYWxlAQpnZXRCaWREYXRhCQFpBmNhbGxlcgZpc3N1ZXIFYXJ0SWQIYmlkT3duZXIFYmlkSWQMcHJpY2VBc3NldElkDGFydHdvcmtQcmljZQVpc0JpZAQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGaXNzdWVyAwMFBWlzQmlkCQECIT0CBQljaGVja1VzZXICAAcJAAIBBQljaGVja1VzZXIECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBAx0MDEzNTE5MTM2NDgDBQVpc0JpZAkBFmdldFByaWNlQXNzZXRJZEZyb21CaWQBBQpiaWREYXRhS2V5CQEUdmFsaWRhdGVQcmljZUFzc2V0SWQDBQFpBQxwcmljZUFzc2V0SWQFDGFydHdvcmtQcmljZQQGYW1vdW50CAUMdDAxMzUxOTEzNjQ4Al8xBAdhc3NldElkCAUMdDAxMzUxOTEzNjQ4Al8yCQCVCgMFCmJpZERhdGFLZXkFBmFtb3VudAUHYXNzZXRJZAEMZ2V0SXNzdWVEYXRhCwZpc3N1ZXIFYXJ0SWQLYXJ0d29ya05hbWUNbmV3QW1vdW50U29sZAptYXhDYW5TZWxsCHRvdGFsTkZUBmNhbGxlcghiaWRPd25lcgViaWRJZAFpCGlzT25TYWxlBAlpc3N1ZU1ldGEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUGaXNzdWVyAggsQXJ0SUQ6IAUFYXJ0SWQCDyxBcnR3b3JrIG5hbWU6IAULYXJ0d29ya05hbWUCCCxJc3N1ZTogCQCkAwEFDW5ld0Ftb3VudFNvbGQCAS8JAKQDAQUKbWF4Q2FuU2VsbAQKc2VsbFN0YXR1cwMDCQAAAgUNbmV3QW1vdW50U29sZAUKbWF4Q2FuU2VsbAYJAQEhAQUIaXNPblNhbGUHBgQKcmVjZWl2ZU5GVAMJAQIhPQIFCGJpZE93bmVyAgAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGJpZE93bmVyCAUBaQZjYWxsZXIJAJUKAwUKc2VsbFN0YXR1cwUKcmVjZWl2ZU5GVAUJaXNzdWVNZXRhAQxnZXRCaWRLZXlWYWwDB2Fzc2V0SWQKYmlkRGF0YUtleQRkYXRlBAphc3NldElkQmlkAwkBASEBCQEJaXNEZWZpbmVkAQUHYXNzZXRJZAkAAgECFU9ubHkgVVNETiBpcyBhY2NlcHRlZAkA2AQBCQEFdmFsdWUBBQdhc3NldElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWREZWxPbGQJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZFVwZGF0ZQkBC1N0cmluZ0VudHJ5AgkArAICBQpiaWREYXRhS2V5AgdfQ0xPU0VECQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQCVCgMFCmFzc2V0SWRCaWQFCWJpZERlbE9sZAUJYmlkVXBkYXRlAQdidXlNaW50BgFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgVpc0JpZAQKY2FsbGVyRGF0YQkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUKY2FsbGVyRGF0YQJfMQQGY2FsbGVyCAUKY2FsbGVyRGF0YQJfMgQEZGF0ZQgFCmNhbGxlckRhdGECXzMEB2FydERhdGEJAQpnZXRBcnREYXRhBAUBaQUGaXNzdWVyBQVhcnRJZAUFaXNCaWQECHRvdGFsTkZUCAUHYXJ0RGF0YQJfMQQLYXJ0d29ya05hbWUIBQdhcnREYXRhAl8yBAphbW91bnRTb2xkCAUHYXJ0RGF0YQJfMwQMYXJ0d29ya1ByaWNlCAUHYXJ0RGF0YQJfNAQMcHJpY2VBc3NldElkCAUHYXJ0RGF0YQJfNQQKbWF4Q2FuU2VsbAgFB2FydERhdGECXzYECGlzT25TYWxlCAUHYXJ0RGF0YQJfNwQHYmlkRGF0YQkBCmdldEJpZERhdGEJBQFpBQZjYWxsZXIFBmlzc3VlcgUFYXJ0SWQFCGJpZE93bmVyBQViaWRJZAUMcHJpY2VBc3NldElkBQxhcnR3b3JrUHJpY2UFBWlzQmlkBApiaWREYXRhS2V5CAUHYmlkRGF0YQJfMQQGYW1vdW50CAUHYmlkRGF0YQJfMgQHYXNzZXRJZAgFB2JpZERhdGECXzMEDW5ld0Ftb3VudFNvbGQDCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDk1heCBpdGVtcyBzb2xkCQBkAgUKYW1vdW50U29sZAABBAppc3N1ZXJEYXRhCQEMZ2V0SXNzdWVEYXRhCwUGaXNzdWVyBQVhcnRJZAULYXJ0d29ya05hbWUFDW5ld0Ftb3VudFNvbGQFCm1heENhblNlbGwFCHRvdGFsTkZUBQZjYWxsZXIFCGJpZE93bmVyBQViaWRJZAUBaQUIaXNPblNhbGUECnNlbGxTdGF0dXMIBQppc3N1ZXJEYXRhAl8xBApyZWNlaXZlTkZUCAUKaXNzdWVyRGF0YQJfMgQJaXNzdWVNZXRhCAUKaXNzdWVyRGF0YQJfMwQLaWRORlRJbnZva2UJAPwHBAUEdGhpcwIHbWludE5mdAkAzAgCBQh0b3RhbE5GVAkAzAgCBQlpc3N1ZU1ldGEJAMwIAgkApQgBBQpyZWNlaXZlTkZUBQNuaWwFA25pbAMJAAACBQtpZE5GVEludm9rZQULaWRORlRJbnZva2UEBWlkTkZUBAckbWF0Y2gwBQtpZE5GVEludm9rZQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXIFByRtYXRjaDAFAXIJAAIBAhdJbmNvcnJlY3QgaW52b2tlIHJlc3VsdAQLYmlkS2V5VmFsdWUJAQxnZXRCaWRLZXlWYWwDBQdhc3NldElkBQpiaWREYXRhS2V5BQRkYXRlBAphc3NldElkQmlkCAULYmlkS2V5VmFsdWUCXzEECWJpZERlbE9sZAgFC2JpZEtleVZhbHVlAl8yBAliaWRVcGRhdGUIBQtiaWRLZXlWYWx1ZQJfMwQHc29sZEtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhcnRfc29sZF8JAKQDAQUNbmV3QW1vdW50U29sZAIEX29mXwkApAMBBQptYXhDYW5TZWxsAgFfBQVhcnRJZAIBXwUGaXNzdWVyBAlzb2xkVmFsdWUDCQEBIQEFBWlzQmlkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBmNhbGxlcgIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQxhcnR3b3JrUHJpY2UCAV8FDHByaWNlQXNzZXRJZAIBXwUFaWRORlQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQpyZWNlaXZlTkZUAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFBmFtb3VudAIBXwUKYXNzZXRJZEJpZAIBXwUFaWRORlQEEmludm9rZVRlYW1GZWVTcGxpdAkA/AcECQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUHZmVlRGFwcAkArAICBQdmZWVEYXBwAgogbm90IGZvdW5kAgZwYXlGZWUJAMwIAgUFYXJ0SWQJAMwIAgUGaXNzdWVyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQFBmFtb3VudAUDbmlsAwkAAAIFEmludm9rZVRlYW1GZWVTcGxpdAUSaW52b2tlVGVhbUZlZVNwbGl0BAhzb2xkRGF0YQkBC1N0cmluZ0VudHJ5AgUHc29sZEtleQUJc29sZFZhbHVlBAZidXlSZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBQ1uZXdBbW91bnRTb2xkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIEbmZ0XwUFaWRORlQFB3NvbGRLZXkJAMwIAgkBDEludGVnZXJFbnRyeQICEHRvdGFsX25mdF9pc3N1ZWQJAGQCBQh0b3RhbE5GVAABCQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGaXNzdWVyBQVhcnRJZAUKc2VsbFN0YXR1cwkAzAgCCQELU3RyaW5nRW50cnkCCQEMS2V5TmZ0SXNzdWVyAQUFaWRORlQFBmlzc3VlcgkAzAgCCQELU3RyaW5nRW50cnkCCQELS2V5TmZ0QXJ0SWQBBQVpZE5GVAUFYXJ0SWQFA25pbAQfdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudEludm9rZQkA/AcECQETdmFsdWVPckVycm9yTWVzc2FnZQIFCXN0YWtlRGFwcAIOdGhpcyBub3QgZm91bmQCGXZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnQFA25pbAkAzAgCCQCRAwIIBQFpCHBheW1lbnRzAAAFA25pbAMJAAACBR92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlBR92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlBANyZXMJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUIY2VydERhcHACCmNyZWF0ZUNlcnQJAMwIAgkApQgBBQpyZWNlaXZlTkZUCQDMCAIFBWlkTkZUCQDMCAIFBmlzc3VlcgUDbmlsBQNuaWwDCQAAAgUDcmVzBQNyZXMDBQVpc0JpZAkAzQgCCQDNCAIJAM0IAgUGYnV5UmVzBQhzb2xkRGF0YQUJYmlkVXBkYXRlBQliaWREZWxPbGQJAMwIAgUIc29sZERhdGEFBmJ1eVJlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEUc2V0QmlkTm9uVHJhZGl0aW9uYWwDAWkFYXJ0SWQGaXNzdWVyBAx0MDI3NzA5Mjc3NDcJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDHQwMjc3MDkyNzc0NwJfMQQGY2FsbGVyCAUMdDAyNzcwOTI3NzQ3Al8yBARkYXRlCAUMdDAyNzcwOTI3NzQ3Al8zBAx0MDI3NzUyMjc3ODgJAQlpc1BheW1lbnQCBQFpAAAEB3BheW1lbnQIBQx0MDI3NzUyMjc3ODgCXzEEBmFtb3VudAgFDHQwMjc3NTIyNzc4OAJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhZPbmx5IFVTRE4gaXMgYWNjZXB0ZWQhCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDCQBnAgAABQptYXhDYW5TZWxsCQACAQIjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQBnAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAQfdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudEludm9rZQkA/AcECQETdmFsdWVPckVycm9yTWVzc2FnZQIFCXN0YWtlRGFwcAIOdGhpcyBub3QgZm91bmQCGXZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnQFA25pbAkAzAgCCQCRAwIIBQFpCHBheW1lbnRzAAEFA25pbAMJAAACBR92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlBR92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FAmlkAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQdhc3NldElkAgFfCQCkAwEFBmFtb3VudAIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGQCBQZiaWROYnIAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARFzZXRCaWRUcmFkaXRpb25hbAMBaQVhcnRJZAZpc3N1ZXIECWVuZEhlaWdodAkBD2dldEludGVnZXJCeUtleQEJAQxrZXlFbmRIZWlnaHQCBQZpc3N1ZXIFBWFydElkBApoaWdoZXN0QmlkCQEaZ2V0QW1vdW50SGlnaGVzdEJpZEJ5QXJ0SWQBBQVhcnRJZAMJAGYCBQZoZWlnaHQFCWVuZEhlaWdodAkAAgECIVRoaXMgYXVjdGlvbiBpcyBmaW5pc2hlZCBhbHJlYWR5IQQLY2FsbGRlckRhdGEJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFC2NhbGxkZXJEYXRhAl8xBAZjYWxsZXIIBQtjYWxsZGVyRGF0YQJfMgQEZGF0ZQgFC2NhbGxkZXJEYXRhAl8zBAxpc1BheW1lbnRWYXIJAQlpc1BheW1lbnQCBQFpAAAEB3BheW1lbnQIBQxpc1BheW1lbnRWYXICXzEEBmFtb3VudAgFDGlzUGF5bWVudFZhcgJfMgMJAGcCBQpoaWdoZXN0QmlkBQZhbW91bnQJAAIBCQCsAgICIFBsZWFzZSBwbGFjZSBhIGJpZCBoaWdoZXIgdGhhbjogCQCkAwEFCmhpZ2hlc3RCaWQEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIWT25seSBVU0ROIGlzIGFjY2VwdGVkIQkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQED21pbkFydHdvcmtQcmljZQkBC3ZhbHVlT3JFbHNlAgkBD2dldEludGVnZXJCeUtleQEJAQhrZXlQcmljZQIFBmlzc3VlcgUFYXJ0SWQFDG1pblVTRE5QcmljZQMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkAwkAZgIFD21pbkFydHdvcmtQcmljZQUGYW1vdW50CQACAQIXQmlkIGlzIGJlbG93IG1pbiBwcmljZSEECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMJAGcCAAAFCm1heENhblNlbGwJAAIBAiNObyBtYXggZWRpdGlvbiBzZXQgZm9yIHRoaXMgYXJ0d29yawMJAGcCBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIYU29sZCBvdXQsIHlvdSBjYW5ub3QgYmlkBB92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUJc3Rha2VEYXBwAg50aGlzIG5vdCBmb3VuZAIZdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudAUDbmlsCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAQUDbmlsAwkAAAIFH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UFH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FBmNhbGxlcgIBXwUCaWQCBV9PUEVOCQCsAgIJAKwCAgkArAICCQCsAgIFB2Fzc2V0SWQCAV8JAKQDAQUGYW1vdW50AgFfCQCkAwEFBGRhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAkAZAIFBmJpZE5icgABCQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlIaWdoZXN0QmlkQmlkSWQBBQVhcnRJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEIa2V5QmlkSWQBCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFBmFtb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARdhY2NlcHRCaWROb25UcmFkaXRpb25hbAUBaQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIEBmNhbGxlcgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzAwkBAiE9AgUGY2FsbGVyBQZpc3N1ZXIJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uCQEHYnV5TWludAYFAWkFBWFydElkBQZpc3N1ZXIFBWJpZElkBQhiaWRPd25lcgYBDnJlc3RhcnRBdWN0aW9uAgVhcnRJZAZpc3N1ZXIECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAQMb2xkRW5kSGVpZ2h0CQEPZ2V0SW50ZWdlckJ5S2V5AQkBDGtleUVuZEhlaWdodAIFBmlzc3VlcgUFYXJ0SWQECGR1cmF0aW9uCQEPZ2V0SW50ZWdlckJ5S2V5AQkBC2tleUR1cmF0aW9uAgUGaXNzdWVyBQVhcnRJZAQJZW5kSGVpZ2h0CQBkAgUIZHVyYXRpb24FBmhlaWdodAMJAGcCBQxvbGRFbmRIZWlnaHQFBmhlaWdodAkAAgECJFByZXZpb3VzIGF1Y3Rpb24gaXNuJ3QgY29tcGxldGVkIHlldAMJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQImQ2FuJ3QgcmVzdGFydCBhdWN0aW9uLCBtYXggYW1vdW50IHNvbGQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlFbmRIZWlnaHQCBQZpc3N1ZXIFBWFydElkBQllbmRIZWlnaHQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleUhpZ2hlc3RCaWRCaWRJZAEFBWFydElkBQNuaWwBFGFjY2VwdEJpZFRyYWRpdGlvbmFsBQFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQJZW5kSGVpZ2h0CQEPZ2V0SW50ZWdlckJ5S2V5AQkBDGtleUVuZEhlaWdodAIFBmlzc3VlcgUFYXJ0SWQEDGhpZ2hlc3RCaWRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUhpZ2hlc3RCaWRCaWRJZAEFBWFydElkAwkAZwIFCWVuZEhlaWdodAUGaGVpZ2h0CQACAQIhVGhpcyBhdWN0aW9uIGlzIG5vdCB5ZXQgZmluaXNoZWQhAwkBAiE9AgUFYmlkSWQFDGhpZ2hlc3RCaWRJZAkAAgECHFRoaXMgaXMgbm90IHRoZSB3aW5uaW5nIGJpZCEEC2J1eU1pbnREYXRhCQEHYnV5TWludAYFAWkFBWFydElkBQZpc3N1ZXIFBWJpZElkBQhiaWRPd25lcgYEEnJlc3RhcnRBdWN0aW9uRGF0YQkBDnJlc3RhcnRBdWN0aW9uAgUFYXJ0SWQFBmlzc3VlcgkAzggCBRJyZXN0YXJ0QXVjdGlvbkRhdGEFC2J1eU1pbnREYXRhAQ1jYW5jZWxCaWRJbXBsBAFpBWFydElkBmlzc3VlcgViaWRJZAQMdDAyODk0MjI5MDk0CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQx0MDI4OTQyMjkwOTQCXzEEBmNhbGxlcggFDHQwMjg5NDIyOTA5NAJfMgQEZGF0ZQgFDHQwMjg5NDIyOTA5NAJfMwQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FBmNhbGxlcgIBXwUFYmlkSWQEB2JpZERhdGEJARVnZXRTdHJpbmdCeUtleU9yRXJyb3ICCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8EB2Fzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAAECWJpZFN0YXR1cwIIQ0FOQ0VMRUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUKYmlkRGF0YUtleQIBXwUJYmlkU3RhdHVzCQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGUCBQZiaWROYnIAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBQdhc3NldElkBQNuaWwBGGNhbmNlbEJpZEltcGxUcmFkaXRpb25hbAQBaQVhcnRJZAZpc3N1ZXIFYmlkSWQEDHQwMjg5NDIyOTA5NAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUMdDAyODk0MjI5MDk0Al8xBAZjYWxsZXIIBQx0MDI4OTQyMjkwOTQCXzIEBGRhdGUIBQx0MDI4OTQyMjkwOTQCXzMEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAQKYmlkRGF0YUtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FBWJpZElkBAdiaWREYXRhCQEVZ2V0U3RyaW5nQnlLZXlPckVycm9yAgkArAICBQpiaWREYXRhS2V5AgVfT1BFTgINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAdhc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAABAliaWRTdGF0dXMCCENBTkNFTEVEBAliaWRBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEEDGhpZ2hlc3RCaWRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUhpZ2hlc3RCaWRCaWRJZAEFBWFydElkAwkAAAIFBWJpZElkBQxoaWdoZXN0QmlkSWQJAAIBAiFZb3UgY2FuJ3QgY2FuY2VsIHRoZSBoaWdoZXN0IGJpZCEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUKYmlkRGF0YUtleQIBXwUJYmlkU3RhdHVzCQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGUCBQZiaWROYnIAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyBQliaWRBbW91bnQFB2Fzc2V0SWQFA25pbAwBaQEIaW5pdERhcHABB2RhcHBLZXkDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uAwkBAiE9AgUGb3JhY2xlAgAJAAIBAidvcmFjbGUgYWxyZWFkeSBzZXQsIHlvdSBjYW4ndCBvdmVycmlkZSEJAMwIAgkBC1N0cmluZ0VudHJ5AgUJb3JhY2xlS2V5BQdkYXBwS2V5BQNuaWwBaQEUcmVzdGFydEF1Y3Rpb25NYW51YWwBBWFydElkAwkBAiE9AgkBGmdldEFtb3VudEhpZ2hlc3RCaWRCeUFydElkAQUFYXJ0SWQAAAkAAgECHlBsZWFzZSBhY2NlcHQgdGhlIGhpZ2hlc3QgYmlkIQkBDnJlc3RhcnRBdWN0aW9uAgUFYXJ0SWQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwFpAQdtaW50TmZ0Awh0b3RhbE5GVAlpc3N1ZU1ldGEKcmVjZWl2ZU5GVAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHE9ubHkgdGhlIGRBcHAgY2FuIG1pbnQgTkZUJ3MEDnJlY2VpdmVORlRBZGR5CQEHQWRkcmVzcwEJANkEAQUKcmVjZWl2ZU5GVAQIaXNzdWVORlQJAMIIBQkArAICAgdTQ09ORVhfCQCkAwEJAGQCBQh0b3RhbE5GVAABBQlpc3N1ZU1ldGEAAQAABwQFaWRORlQJALgIAQUIaXNzdWVORlQJAJQKAgkAzAgCBQhpc3N1ZU5GVAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5yZWNlaXZlTkZUQWRkeQABBQVpZE5GVAUDbmlsCQDYBAEFBWlkTkZUAWkBCmFkZEFydHdvcmsKCnNoYTI1Nkhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQtlbnRpdGxlbWVudAdwcmV2aWV3CmNvbGxlY3Rpb24Nc3ViY29sbGVjdGlvbgQMdDAxNzc0MDE3NzgxCQEMaWRDYWxsZXJEYXRlAQUBaQQFYXJ0SWQIBQx0MDE3NzQwMTc3ODECXzEEBmNhbGxlcggFDHQwMTc3NDAxNzc4MQJfMgQEZGF0ZQgFDHQwMTc3NDAxNzc4MQJfMwMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFBXR5cGVzBQR0eXBlCQACAQIMVW5rbm93biB0eXBlBA92YWxpZGF0ZUFydHdvcmsJARN2YWxpZGF0ZUFydHdvcmtEYXRhBQUGY2FsbGVyBQpjaWREaXNwbGF5BQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBB92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUJc3Rha2VEYXBwAg50aGlzIG5vdCBmb3VuZAIZdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudAUDbmlsCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAAUDbmlsAwkAAAIFH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UFH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UEC3ByZXZpZXdEYXRhAwkBD2NvbnRhaW5zRWxlbWVudAIFDFByZXZpZXd0eXBlcwUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5UHJldmlld0NpZAIFBmNhbGxlcgUFYXJ0SWQFB3ByZXZpZXcFA25pbAUDbmlsBBZpbnZva2VDb2xsZWN0aW9uQ3JlYXRlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQ9jb2xsZWN0aW9uc0RhcHAJAKwCAgUPY29sbGVjdGlvbnNEYXBwAgogbm90IGZvdW5kAhFjb2xsZWN0aW9uUHJvY2VzcwkAzAgCBQpjb2xsZWN0aW9uCQDMCAIFDXN1YmNvbGxlY3Rpb24JAMwIAgUGY2FsbGVyBQNuaWwFA25pbAMJAAACBRZpbnZva2VDb2xsZWN0aW9uQ3JlYXRlBRZpbnZva2VDb2xsZWN0aW9uQ3JlYXRlBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQESa2V5VHhpZEJ5SGFzaE93bmVyAgUKc2hhMjU2SGFzaAUGY2FsbGVyAwkBAiE9AgUKZW50cnlFeGlzdAIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQECWhhc2hFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAMJAQIhPQIFCWhhc2hFeGlzdAIACQACAQIfVGhpcyBoYXNoIGlzIGFscmVhZHkgcmVnaXN0ZXJlZAkAzggCBQtwcmV2aWV3RGF0YQkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoBQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEmtleVR4aWRCeUhhc2hPd25lcgIFCnNoYTI1Nkhhc2gFBmNhbGxlcgUFYXJ0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQdrZXlEYXRlAgUGY2FsbGVyBQVhcnRJZAUEZGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBWFydElkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBWFydElkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQVhcnRJZAUEdGFncwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBwkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5SGFzaEJ5VHhpZEFkZHICBQZjYWxsZXIFBWFydElkBQpzaGEyNTZIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlFbnRpdGxlbWVudAIFBmNhbGxlcgUFYXJ0SWQFC2VudGl0bGVtZW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc2VsbEFydHdvcmsMBWFydElkBXByaWNlB21heE1pbnQHYXNzZXRJZAthdWN0aW9uVHlwZQhkdXJhdGlvbgRhZGQxBGFkZDIEYWRkMwZhZGQxU2gGYWRkMlNoBmFkZDNTaAQIY2FsbERhdGEJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFCGNhbGxEYXRhAl8xBAZjYWxsZXIIBQhjYWxsRGF0YQJfMgQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQEH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UJAPwHBAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQlzdGFrZURhcHACDnRoaXMgbm90IGZvdW5kAhl2YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50BQNuaWwJAMwIAgkAkQMCCAUBaQhwYXltZW50cwAABQNuaWwDCQAAAgUfdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudEludm9rZQUfdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudEludm9rZQMDCQBmAgUGYmlkTmJyAAAGCQBmAgUKYW1vdW50U29sZAAACQACAQI4VGhlcmUgYXJlIGJpZHMgb3IgaXRlbXMgc29sZCwgeW91IGNhbiBub3QgZWRpdCBhbnl0aGluZyEEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGF1Y3Rpb25UeXBlMQkAzAgCBQxhdWN0aW9uVHlwZTIJAMwIAgUMYXVjdGlvblR5cGUzBQNuaWwFC2F1Y3Rpb25UeXBlCQACAQIfV2UgZG9uJ3Qga25vdyB0aGlzIGF1Y3Rpb24gdHlwZQMJAAACBQthcnR3b3JrTmFtZQIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAIFB2Fzc2V0SWQFBXByaWNlCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAGYCBQdtYXhNaW50AJBOCQACAQIeMTAwMDAgZWRpdGlvbnMgbWF4IHBlciBhcnR3b3JrBApzZWxsU3RhdHVzAwkAZgIFBXByaWNlAAAJAGYCBQdtYXhNaW50AAAHBAd0ZWFtRmVlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQdmZWVEYXBwCQCsAgIFB2ZlZURhcHACCiBub3QgZm91bmQCDHRlYW1TcGxpdEZlZQkAzAgCBQVhcnRJZAkAzAgCBQtmZWVSZWNlaXZlcgkAzAgCAgAJAMwIAgIACQDMCAIAAwkAzAgCAAAJAMwIAgAABQNuaWwFA25pbAMJAAACBQd0ZWFtRmVlBQd0ZWFtRmVlBApjcmVhdG9yRmVlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQdmZWVEYXBwCQCsAgIFB2ZlZURhcHACCiBub3QgZm91bmQCD2NyZWF0b3JTcGxpdEZlZQkAzAgCBQVhcnRJZAkAzAgCBQRhZGQxCQDMCAIFBGFkZDIJAMwIAgUEYWRkMwkAzAgCBQZhZGQxU2gJAMwIAgUGYWRkMlNoCQDMCAIFBmFkZDNTaAUDbmlsBQNuaWwDCQAAAgUKY3JlYXRvckZlZQUKY3JlYXRvckZlZQQJZW5kSGVpZ2h0CQBkAgUIZHVyYXRpb24FBmhlaWdodAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAQhrZXlQcmljZQIFBmNhbGxlcgUFYXJ0SWQFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQFB21heE1pbnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtrZXlEdXJhdGlvbgIFBmNhbGxlcgUFYXJ0SWQFCGR1cmF0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5RW5kSGVpZ2h0AgUGY2FsbGVyBQVhcnRJZAUJZW5kSGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZjYWxsZXIFBWFydElkBQdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBdWN0aW9uVHlwZQIFBmNhbGxlcgUFYXJ0SWQFC2F1Y3Rpb25UeXBlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY2FuY2VsU2FsZQIFYXJ0SWQJbWF4VG9TZWxsBApjYWxsZXJEYXRhCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQpjYWxsZXJEYXRhAl8xBAZjYWxsZXIIBQpjYWxsZXJEYXRhAl8yBAthdWN0aW9uVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEOa2V5QXVjdGlvblR5cGUCBQZjYWxsZXIFBWFydElkAixEbyBub3QgdHJ5IHRvIGVkaXQgYSBhdWN0aW9uIHlvdSBkbyBub3Qgb3duIQMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUMYXVjdGlvblR5cGUxCQDMCAIFDGF1Y3Rpb25UeXBlMwUDbmlsBQthdWN0aW9uVHlwZQkAAgECJ1lvdSBjYW4gbm90IGNhbmNlbCB0aGlzIHR5cGUgb2YgYXVjdGlvbgQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAwkAZgIFCmFtb3VudFNvbGQFCW1heFRvU2VsbAkAAgEJAKwCAgInWW91IGNhbiBub3QgbG93ZXIgdGhlIG1heENhblNlbGwgYmVsb3cgCQCkAwEFCmFtb3VudFNvbGQDCQBmAgUJbWF4VG9TZWxsBQptYXhDYW5TZWxsCQACAQItWW91IGNhbiBub3QgaW5jcmVhc2UgdGhlIG1heENhblNlbGwgcGFyYW1ldGVyBAlib29sRW50cnkDCQAAAgUJbWF4VG9TZWxsBQphbW91bnRTb2xkCQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGY2FsbGVyBQVhcnRJZAcFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAUJbWF4VG9TZWxsBQNuaWwFCWJvb2xFbnRyeQFpAQpidXlBcnR3b3JrAgVhcnRJZAZpc3N1ZXIEC2F1Y3Rpb25UeXBlCQEOZ2V0U3RyaW5nQnlLZXkBCQEOa2V5QXVjdGlvblR5cGUCBQZpc3N1ZXIFBWFydElkAwkAAAIFC2F1Y3Rpb25UeXBlBQxhdWN0aW9uVHlwZTMJAQdidXlNaW50BgUBaQUFYXJ0SWQFBmlzc3VlcgIAAgAHCQACAQI0RGlyZWN0IGJ1eSBvbmx5IGFsbG93ZWQgd2hlbiBubyBhdWN0aW9uIHR5cGUgaXMgc2V0IQFpAQp1cGRhdGVUYWdzAwZhcnRpc3QFYXJ0SWQEdGFncwQGY2FsbGVyCQClCAEJAKcIAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUGb3duZXJzBQZjYWxsZXIJAAIBAgJubwMJAGYCCQCQAwEJALUJAgUEdGFncwIBLAAFCQACAQILNSB0YWdzIG1heC4EB3RhZ3NPbGQJARVnZXRTdHJpbmdCeUtleU9yRXJyb3ICCQEHa2V5VGFncwIFBmFydGlzdAUFYXJ0SWQCL05vIHRhZ3MgY3JlYXRlZCB3aXRoIHRoaXMga2V5LCBzbyBjYW4ndCB1cGRhdGUhAwkAAAIFBHRhZ3MFB3RhZ3NPbGQJAAIBAh5UYWdzIGFyZSB0aGUgc2FtZSBhcyBvbGQgdGFncyEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVRhZ3MCBQZhcnRpc3QFBWFydElkBQR0YWdzBQNuaWwBaQELZGVsZXRlRW50cnkBBWVudHJ5BAZjYWxsZXIJAKUIAQkApwgBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQZvd25lcnMFBmNhbGxlcgkAAgECAm5vCQDMCAIJAQtEZWxldGVFbnRyeQEFBWVudHJ5BQNuaWwBaQEGc2V0QmlkAgVhcnRJZAZpc3N1ZXIEC2F1Y3Rpb25UeXBlCQEOZ2V0U3RyaW5nQnlLZXkBCQEOa2V5QXVjdGlvblR5cGUCBQZpc3N1ZXIFBWFydElkAwkAAAIFC2F1Y3Rpb25UeXBlBQxhdWN0aW9uVHlwZTEJARRzZXRCaWROb25UcmFkaXRpb25hbAMFAWkFBWFydElkBQZpc3N1ZXIDCQAAAgULYXVjdGlvblR5cGUFDGF1Y3Rpb25UeXBlMgkBEXNldEJpZFRyYWRpdGlvbmFsAwUBaQUFYXJ0SWQFBmlzc3VlcgkAAgEJAKwCAgkArAICAhZVbmtub3duIGF1Y3Rpb24gdHlwZSA6BQthdWN0aW9uVHlwZQIbLCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW5zAWkBCWFjY2VwdEJpZAQFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBAthdWN0aW9uVHlwZQkBDmdldFN0cmluZ0J5S2V5AQkBDmtleUF1Y3Rpb25UeXBlAgUGaXNzdWVyBQVhcnRJZAMJAAACBQthdWN0aW9uVHlwZQUMYXVjdGlvblR5cGUxCQEXYWNjZXB0QmlkTm9uVHJhZGl0aW9uYWwFBQFpBQVhcnRJZAUGaXNzdWVyBQViaWRJZAUIYmlkT3duZXIDCQAAAgULYXVjdGlvblR5cGUFDGF1Y3Rpb25UeXBlMgkBFGFjY2VwdEJpZFRyYWRpdGlvbmFsBQUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQFCGJpZE93bmVyCQACAQkArAICCQCsAgICFlVua25vd24gYXVjdGlvbiB0eXBlIDoFC2F1Y3Rpb25UeXBlAhssIHBsZWFzZSBjb250YWN0IHRoZSBhZG1pbnMBaQEJY2FuY2VsQmlkAwVhcnRJZAZpc3N1ZXIFYmlkSWQEC2F1Y3Rpb25UeXBlCQEOZ2V0U3RyaW5nQnlLZXkBCQEOa2V5QXVjdGlvblR5cGUCBQZpc3N1ZXIFBWFydElkAwkAAAIFC2F1Y3Rpb25UeXBlBQxhdWN0aW9uVHlwZTEJAQ1jYW5jZWxCaWRJbXBsBAUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQJARhjYW5jZWxCaWRJbXBsVHJhZGl0aW9uYWwEBQFpBQVhcnRJZAUGaXNzdWVyBQViaWRJZABjhvL3", "height": 2161455, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3w473HXbrFgnfqQGSeH6AzAL8tq2j1KHiNE4xbd2raF3 Next: GLDpPKi4RNQ3oPnh2uBiTa69SC9qTs6Tcw6GQaU5ZRtd Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let unitTest = false
244244
245245 func validateMinSell (assetId,price) = {
246246 let minSellSconex = minUSDNPrice
247- if (if ((minSellSconex > price))
247+ if (if (if ((price != 0))
248+ then (minSellSconex > price)
249+ else false)
248250 then true
249251 else (assetId != toBase58String(USDNAssetId)))
250252 then throw(("Wrong minimum sell price " + toString(minSellSconex)))
667669 let sellStatus = if ((price > 0))
668670 then (maxMint > 0)
669671 else false
670- let teamFee = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "teamSplitFee", [artId, feeReceiver, "", "", 15, 0, 0], nil)
672+ let teamFee = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "teamSplitFee", [artId, feeReceiver, "", "", 3, 0, 0], nil)
671673 if ((teamFee == teamFee))
672674 then {
673675 let creatorFee = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "creatorSplitFee", [artId, add1, add2, add3, add1Sh, add2Sh, add3Sh], nil)
683685 }
684686 }
685687 else throw("Strict value is not equal to itself.")
688+ }
689+
690+
691+
692+@Callable(i)
693+func cancelSale (artId,maxToSell) = {
694+ let callerData = idCallerDate(i)
695+ let id = callerData._1
696+ let caller = callerData._2
697+ let auctionType = valueOrErrorMessage(keyAuctionType(caller, artId), "Do not try to edit a auction you do not own!")
698+ if (!(containsElement([auctionType1, auctionType3], auctionType)))
699+ then throw("You can not cancel this type of auction")
700+ else {
701+ let amountSold = getIntegerByKey(keyIssued(caller, artId))
702+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
703+ if ((amountSold > maxToSell))
704+ then throw(("You can not lower the maxCanSell below " + toString(amountSold)))
705+ else if ((maxToSell > maxCanSell))
706+ then throw("You can not increase the maxCanSell parameter")
707+ else {
708+ let boolEntry = if ((maxToSell == amountSold))
709+ then [BooleanEntry(keyOnSale(caller, artId), false)]
710+ else nil
711+ ([IntegerEntry(keyMaxMint(caller, artId), maxToSell)] ++ boolEntry)
712+ }
713+ }
686714 }
687715
688716
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let unitTest = false
55
66 let oracleKey = "oracleKey"
77
88 func getStr (key) = match getString(this, key) {
99 case b: String =>
1010 b
1111 case _ =>
1212 ""
1313 }
1414
1515
1616 let oracle = getStr(oracleKey)
1717
1818 let oracleFee = value(addressFromString(oracle))
1919
2020 let owners = [getString(oracleFee, "owner1"), getString(oracleFee, "owner2")]
2121
2222 let collectionsDapp = valueOrErrorMessage(getString(oracleFee, "collectionsDapp"), "collectionDapp not found")
2323
2424 let feeReceiver = valueOrErrorMessage(getString(oracleFee, "feeReceiver"), "feeReceiver not found")
2525
2626 let certDapp = valueOrErrorMessage(getString(oracleFee, "certDapp"), "certDapp not found")
2727
2828 let feeDapp = valueOrErrorMessage(getString(oracleFee, "feeDapp"), "feeDapp not found")
2929
3030 let userDapp = value(addressFromString(valueOrErrorMessage(getString(oracleFee, "userDapp"), "userdapp not found")))
3131
3232 let stakeDapp = addressFromString(valueOrErrorMessage(getString(oracleFee, "stakeDapp"), "sconexDapp not found"))
3333
3434 let USDNAssetId = fromBase58String(getStringValue(oracleFee, "USDNAssetId"))
3535
3636 let SconexAssetId = fromBase58String(getStringValue(oracleFee, "SconexAssetId"))
3737
3838 let types = ["IMAGE", "PDF", "VIDEO"]
3939
4040 let Previewtypes = ["PDF"]
4141
4242 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
4343
4444 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
4545
4646 let userSuspended = "SUSPENDED"
4747
4848 let userRemoved = "REMOVED"
4949
5050 let userUnregistered = "UNREGISTERED"
5151
5252 let auctionType1 = "BIDTYPE"
5353
5454 let auctionType2 = "TRADITIONAL"
5555
5656 let auctionType3 = "DIRECT"
5757
5858 func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
5959
6060
6161 func getStringByKey (key) = valueOrElse(getString(this, key), "")
6262
6363
6464 func getStringByKeyOrError (key,error) = valueOrErrorMessage(getString(this, key), error)
6565
6666
6767 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
6868
6969
7070 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
7171
7272
7373 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
7474
7575
7676 func validateHash (hash) = (size(hash) == 64)
7777
7878
7979 func keyUserStatus (caller) = ("user_status_" + caller)
8080
8181
8282 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
8383
8484
8585 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
8686
8787
8888 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
8989
9090
9191 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
9292
9393
9494 func keyPreviewCid (caller,artId) = ((("art_preview_cid_" + artId) + "_") + caller)
9595
9696
9797 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
9898
9999
100100 func keyHighestBidBidId (artId) = ("art_highestBidBidId_" + artId)
101101
102102
103103 func keyBidId (bidId) = ("bid_" + bidId)
104104
105105
106106 func keyDuration (caller,artId) = ((("art_duration_" + artId) + "_") + caller)
107107
108108
109109 func keyEndHeight (caller,artId) = ((("art_endheight_" + artId) + "_") + caller)
110110
111111
112112 func keyAuctionType (caller,artId) = ((("art_auctiontype_" + artId) + "_") + caller)
113113
114114
115115 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
116116
117117
118118 func KeyNftIssuer (nftId) = ("nft_issued_" + nftId)
119119
120120
121121 func KeyNftArtId (nftId) = ("nft_artId_" + nftId)
122122
123123
124124 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
125125
126126
127127 func keyEntitlement (caller,artId) = ((("art_entitlement_" + artId) + "_") + caller)
128128
129129
130130 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
131131
132132
133133 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
134134
135135
136136 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
137137
138138
139139 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
140140
141141
142142 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
143143
144144
145145 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
146146
147147
148148 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
149149
150150
151151 func keyCollection (caller,artId) = ((("collection_" + artId) + "_") + caller)
152152
153153
154154 let minUSDNPrice = getIntegerByKeyFromOracle(("min_" + toBase58String(USDNAssetId)))
155155
156156 let currentFeeSconex = getIntegerByKeyFromOracle(("fee_" + toBase58String(SconexAssetId)))
157157
158158 func getAmountByBidId (bidId) = valueOrElse(getIntegerByKey(keyBidId(bidId)), 0)
159159
160160
161161 func getAmountHighestBidByArtId (artId) = {
162162 let bidId = getStringByKey(keyHighestBidBidId(artId))
163163 getAmountByBidId(bidId)
164164 }
165165
166166
167167 func validateString (str,max) = if ((size(str) == 0))
168168 then throw("Field cannot be is empty")
169169 else if ((size(str) > max))
170170 then throw((str + " is too long"))
171171 else true
172172
173173
174174 func validateUser (caller) = {
175175 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
176176 if ((userStatus == userUnregistered))
177177 then "Register this account first with 'Account' tab"
178178 else if ((userStatus == userSuspended))
179179 then "Account suspended"
180180 else if ((userStatus == userRemoved))
181181 then "Account removed"
182182 else ""
183183 }
184184
185185
186186 func validateArtworkData (caller,cidDisplay,name,description,tags) = {
187187 let checkUser = validateUser(caller)
188188 if ((checkUser != ""))
189189 then throw(checkUser)
190190 else if ((size(cidDisplay) == 0))
191191 then throw("Display CID cannot be empty")
192192 else if ((size(cidDisplay) != 46))
193193 then throw("This doesn't seem a valid CID!")
194194 else if (!(validateString(name, 100)))
195195 then throw("100 Char. max name")
196196 else if (!(validateString(description, 1000)))
197197 then throw("1000 Char. max description")
198198 else if ((size(split(tags, ",")) > 5))
199199 then throw("5 tags max.")
200200 else ""
201201 }
202202
203203
204204 func isPayment (i,index) = if ((size(i.payments) == 0))
205205 then throw("No payment attached")
206206 else {
207207 let payment = value(i.payments[index])
208208 let amount = value(payment.amount)
209209 $Tuple2(payment, amount)
210210 }
211211
212212
213213 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
214214 case b: Int =>
215215 if ((b != 0))
216216 then true
217217 else false
218218 case _ =>
219219 false
220220 }
221221
222222
223223 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
224224 let pData = isPayment(i, 1)
225225 let payment = pData._1
226226 let amount = pData._2
227227 let assetId = if (!(isDefined(payment.assetId)))
228228 then throw("Asset Id is not defined")
229229 else if (if ((size(priceAssetId) > 0))
230230 then (toBase58String(value(payment.assetId)) == priceAssetId)
231231 else false)
232232 then payment.assetId
233233 else throw("Wrong asset id")
234234 if ((artworkPrice != amount))
235235 then throw(((("Payment don't match " + toString(artworkPrice)) + " ") + toString(amount)))
236236 else $Tuple2(amount, assetId)
237237 }
238238
239239
240240 func acceptedAssetIds (assetId) = if ((assetId != toBase58String(USDNAssetId)))
241241 then throw("Only USDN accepted")
242242 else true
243243
244244
245245 func validateMinSell (assetId,price) = {
246246 let minSellSconex = minUSDNPrice
247- if (if ((minSellSconex > price))
247+ if (if (if ((price != 0))
248+ then (minSellSconex > price)
249+ else false)
248250 then true
249251 else (assetId != toBase58String(USDNAssetId)))
250252 then throw(("Wrong minimum sell price " + toString(minSellSconex)))
251253 else true
252254 }
253255
254256
255257 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
256258 then throw("Only USDN is accepted!")
257259 else fromBase58String(assetId)
258260
259261
260262 func getPriceAssetIdFromBid (bidDataKey) = {
261263 let bidData = getStringByKey((bidDataKey + "_OPEN"))
262264 if ((bidData == ""))
263265 then throw("Bid not found")
264266 else {
265267 let bidDataArr = split(bidData, "_")
266268 let bidAmount = parseIntValue(bidDataArr[1])
267269 let bidAssetId = getBidAssetId(bidDataArr[0])
268270 if ((0 >= bidAmount))
269271 then throw("Wrong amount")
270272 else $Tuple2(bidAmount, bidAssetId)
271273 }
272274 }
273275
274276
275277 func idCallerDate (i) = if (!(dappRunning))
276278 then throw(maintenanceMSG)
277279 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
278280
279281
280282 func getArtData (i,issuer,artId,isBid) = {
281283 let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
282284 let totalNFT = getIntegerByKey("total_nft_issued")
283285 let artworkName = getStringByKey(keyName(issuer, artId))
284286 if ((artworkName == ""))
285287 then throw("Art doesn't exist")
286288 else {
287289 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
288290 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
289291 let artworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), minUSDNPrice)
290292 let priceAssetId = if (callerIsIssuer)
291293 then toBase58String(USDNAssetId)
292294 else getStringByKey(keyAssetIdAccepted(issuer, artId))
293295 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
294296 if (if (if (!(isBid))
295297 then !(callerIsIssuer)
296298 else false)
297299 then if (if ((0 >= artworkPrice))
298300 then true
299301 else !(isOnSale))
300302 then true
301303 else (0 >= maxCanSell)
302304 else false)
303305 then throw("Art not for sale")
304306 else if (if (if (!(isBid))
305307 then callerIsIssuer
306308 else false)
307309 then (0 >= maxCanSell)
308310 else false)
309311 then throw("Max issuable not set")
310312 else $Tuple7(totalNFT, artworkName, amountSold, artworkPrice, priceAssetId, maxCanSell, isOnSale)
311313 }
312314 }
313315
314316
315317 func getBidData (i,caller,issuer,artId,bidOwner,bidId,priceAssetId,artworkPrice,isBid) = {
316318 let checkUser = validateUser(issuer)
317319 if (if (isBid)
318320 then (checkUser != "")
319321 else false)
320322 then throw(checkUser)
321323 else {
322324 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
323325 let t01351913648 = if (isBid)
324326 then getPriceAssetIdFromBid(bidDataKey)
325327 else validatePriceAssetId(i, priceAssetId, artworkPrice)
326328 let amount = t01351913648._1
327329 let assetId = t01351913648._2
328330 $Tuple3(bidDataKey, amount, assetId)
329331 }
330332 }
331333
332334
333335 func getIssueData (issuer,artId,artworkName,newAmountSold,maxCanSell,totalNFT,caller,bidOwner,bidId,i,isOnSale) = {
334336 let issueMeta = ((((((((("Creator: " + issuer) + ",ArtID: ") + artId) + ",Artwork name: ") + artworkName) + ",Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
335337 let sellStatus = if (if ((newAmountSold == maxCanSell))
336338 then true
337339 else !(isOnSale))
338340 then false
339341 else true
340342 let receiveNFT = if ((bidOwner != ""))
341343 then addressFromStringValue(bidOwner)
342344 else i.caller
343345 $Tuple3(sellStatus, receiveNFT, issueMeta)
344346 }
345347
346348
347349 func getBidKeyVal (assetId,bidDataKey,date) = {
348350 let assetIdBid = if (!(isDefined(assetId)))
349351 then throw("Only USDN is accepted")
350352 else toBase58String(value(assetId))
351353 let bidData = getStringByKey((bidDataKey + "_OPEN"))
352354 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
353355 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
354356 $Tuple3(assetIdBid, bidDelOld, bidUpdate)
355357 }
356358
357359
358360 func buyMint (i,artId,issuer,bidId,bidOwner,isBid) = {
359361 let callerData = idCallerDate(i)
360362 let id = callerData._1
361363 let caller = callerData._2
362364 let date = callerData._3
363365 let artData = getArtData(i, issuer, artId, isBid)
364366 let totalNFT = artData._1
365367 let artworkName = artData._2
366368 let amountSold = artData._3
367369 let artworkPrice = artData._4
368370 let priceAssetId = artData._5
369371 let maxCanSell = artData._6
370372 let isOnSale = artData._7
371373 let bidData = getBidData(i, caller, issuer, artId, bidOwner, bidId, priceAssetId, artworkPrice, isBid)
372374 let bidDataKey = bidData._1
373375 let amount = bidData._2
374376 let assetId = bidData._3
375377 let newAmountSold = if ((amountSold == maxCanSell))
376378 then throw("Max items sold")
377379 else (amountSold + 1)
378380 let issuerData = getIssueData(issuer, artId, artworkName, newAmountSold, maxCanSell, totalNFT, caller, bidOwner, bidId, i, isOnSale)
379381 let sellStatus = issuerData._1
380382 let receiveNFT = issuerData._2
381383 let issueMeta = issuerData._3
382384 let idNFTInvoke = invoke(this, "mintNft", [totalNFT, issueMeta, toString(receiveNFT)], nil)
383385 if ((idNFTInvoke == idNFTInvoke))
384386 then {
385387 let idNFT = match idNFTInvoke {
386388 case r: String =>
387389 r
388390 case _ =>
389391 throw("Incorrect invoke result")
390392 }
391393 let bidKeyValue = getBidKeyVal(assetId, bidDataKey, date)
392394 let assetIdBid = bidKeyValue._1
393395 let bidDelOld = bidKeyValue._2
394396 let bidUpdate = bidKeyValue._3
395397 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
396398 let soldValue = if (!(isBid))
397399 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + idNFT)
398400 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + idNFT)
399401 let invokeTeamFeeSplit = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "payFee", [artId, issuer], [AttachedPayment(assetId, amount)])
400402 if ((invokeTeamFeeSplit == invokeTeamFeeSplit))
401403 then {
402404 let soldData = StringEntry(soldKey, soldValue)
403405 let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + idNFT), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyOnSale(issuer, artId), sellStatus), StringEntry(KeyNftIssuer(idNFT), issuer), StringEntry(KeyNftArtId(idNFT), artId)]
404406 let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]])
405407 if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
406408 then {
407409 let res = invoke(addressFromStringValue(certDapp), "createCert", [toString(receiveNFT), idNFT, issuer], nil)
408410 if ((res == res))
409411 then if (isBid)
410412 then (((buyRes :+ soldData) :+ bidUpdate) :+ bidDelOld)
411413 else soldData :: buyRes
412414 else throw("Strict value is not equal to itself.")
413415 }
414416 else throw("Strict value is not equal to itself.")
415417 }
416418 else throw("Strict value is not equal to itself.")
417419 }
418420 else throw("Strict value is not equal to itself.")
419421 }
420422
421423
422424 func setBidNonTraditional (i,artId,issuer) = {
423425 let t02770927747 = idCallerDate(i)
424426 let id = t02770927747._1
425427 let caller = t02770927747._2
426428 let date = t02770927747._3
427429 let t02775227788 = isPayment(i, 0)
428430 let payment = t02775227788._1
429431 let amount = t02775227788._2
430432 let assetId = if (!(isDefined(payment.assetId)))
431433 then throw("Only USDN is accepted!")
432434 else toBase58String(value(payment.assetId))
433435 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
434436 if (!(acceptedAssetIds(assetId)))
435437 then throw("asset not accepted")
436438 else {
437439 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
438440 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
439441 if ((0 >= maxCanSell))
440442 then throw("No max edition set for this artwork")
441443 else if ((amountSold >= maxCanSell))
442444 then throw("Sold out, you cannot bid")
443445 else {
444446 let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[1]])
445447 if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
446448 then [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
447449 else throw("Strict value is not equal to itself.")
448450 }
449451 }
450452 }
451453
452454
453455 func setBidTraditional (i,artId,issuer) = {
454456 let endHeight = getIntegerByKey(keyEndHeight(issuer, artId))
455457 let highestBid = getAmountHighestBidByArtId(artId)
456458 if ((height > endHeight))
457459 then throw("This auction is finished already!")
458460 else {
459461 let callderData = idCallerDate(i)
460462 let id = callderData._1
461463 let caller = callderData._2
462464 let date = callderData._3
463465 let isPaymentVar = isPayment(i, 0)
464466 let payment = isPaymentVar._1
465467 let amount = isPaymentVar._2
466468 if ((highestBid >= amount))
467469 then throw(("Please place a bid higher than: " + toString(highestBid)))
468470 else {
469471 let assetId = if (!(isDefined(payment.assetId)))
470472 then throw("Only USDN is accepted!")
471473 else toBase58String(value(payment.assetId))
472474 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
473475 let minArtworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), minUSDNPrice)
474476 if (!(acceptedAssetIds(assetId)))
475477 then throw("asset not accepted")
476478 else if ((minArtworkPrice > amount))
477479 then throw("Bid is below min price!")
478480 else {
479481 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
480482 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
481483 if ((0 >= maxCanSell))
482484 then throw("No max edition set for this artwork")
483485 else if ((amountSold >= maxCanSell))
484486 then throw("Sold out, you cannot bid")
485487 else {
486488 let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[1]])
487489 if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
488490 then [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1)), StringEntry(keyHighestBidBidId(artId), toBase58String(i.transactionId)), IntegerEntry(keyBidId(toBase58String(i.transactionId)), amount)]
489491 else throw("Strict value is not equal to itself.")
490492 }
491493 }
492494 }
493495 }
494496 }
495497
496498
497499 func acceptBidNonTraditional (i,artId,issuer,bidId,bidOwner) = {
498500 let caller = toBase58String(i.caller.bytes)
499501 if ((caller != issuer))
500502 then throw("You cannot do this action")
501503 else buyMint(i, artId, issuer, bidId, bidOwner, true)
502504 }
503505
504506
505507 func restartAuction (artId,issuer) = {
506508 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
507509 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
508510 let oldEndHeight = getIntegerByKey(keyEndHeight(issuer, artId))
509511 let duration = getIntegerByKey(keyDuration(issuer, artId))
510512 let endHeight = (duration + height)
511513 if ((oldEndHeight >= height))
512514 then throw("Previous auction isn't completed yet")
513515 else if ((amountSold == maxCanSell))
514516 then throw("Can't restart auction, max amount sold")
515517 else [IntegerEntry(keyEndHeight(issuer, artId), endHeight), DeleteEntry(keyHighestBidBidId(artId))]
516518 }
517519
518520
519521 func acceptBidTraditional (i,artId,issuer,bidId,bidOwner) = {
520522 let endHeight = getIntegerByKey(keyEndHeight(issuer, artId))
521523 let highestBidId = getStringByKey(keyHighestBidBidId(artId))
522524 if ((endHeight >= height))
523525 then throw("This auction is not yet finished!")
524526 else if ((bidId != highestBidId))
525527 then throw("This is not the winning bid!")
526528 else {
527529 let buyMintData = buyMint(i, artId, issuer, bidId, bidOwner, true)
528530 let restartAuctionData = restartAuction(artId, issuer)
529531 (restartAuctionData ++ buyMintData)
530532 }
531533 }
532534
533535
534536 func cancelBidImpl (i,artId,issuer,bidId) = {
535537 let t02894229094 = idCallerDate(i)
536538 let id = t02894229094._1
537539 let caller = t02894229094._2
538540 let date = t02894229094._3
539541 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
540542 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
541543 let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found")
542544 let bidDataArr = split(bidData, "_")
543545 let assetId = getBidAssetId(bidDataArr[0])
544546 let bidStatus = "CANCELED"
545547 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
546548 }
547549
548550
549551 func cancelBidImplTraditional (i,artId,issuer,bidId) = {
550552 let t02894229094 = idCallerDate(i)
551553 let id = t02894229094._1
552554 let caller = t02894229094._2
553555 let date = t02894229094._3
554556 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
555557 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
556558 let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found")
557559 let bidDataArr = split(bidData, "_")
558560 let assetId = getBidAssetId(bidDataArr[0])
559561 let bidStatus = "CANCELED"
560562 let bidAmount = parseIntValue(bidDataArr[1])
561563 let highestBidId = getStringByKey(keyHighestBidBidId(artId))
562564 if ((bidId == highestBidId))
563565 then throw("You can't cancel the highest bid!")
564566 else [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), bidAmount, assetId)]
565567 }
566568
567569
568570 @Callable(i)
569571 func initDapp (dappKey) = if ((i.caller != this))
570572 then throw("You cannot do this action")
571573 else if ((oracle != ""))
572574 then throw("oracle already set, you can't override!")
573575 else [StringEntry(oracleKey, dappKey)]
574576
575577
576578
577579 @Callable(i)
578580 func restartAuctionManual (artId) = if ((getAmountHighestBidByArtId(artId) != 0))
579581 then throw("Please accept the highest bid!")
580582 else restartAuction(artId, toBase58String(i.caller.bytes))
581583
582584
583585
584586 @Callable(i)
585587 func mintNft (totalNFT,issueMeta,receiveNFT) = if ((i.caller != this))
586588 then throw("Only the dApp can mint NFT's")
587589 else {
588590 let receiveNFTAddy = Address(fromBase58String(receiveNFT))
589591 let issueNFT = Issue(("SCONEX_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
590592 let idNFT = calculateAssetId(issueNFT)
591593 $Tuple2([issueNFT, ScriptTransfer(receiveNFTAddy, 1, idNFT)], toBase58String(idNFT))
592594 }
593595
594596
595597
596598 @Callable(i)
597599 func addArtwork (sha256Hash,name,description,tags,type,cidDisplay,entitlement,preview,collection,subcollection) = {
598600 let t01774017781 = idCallerDate(i)
599601 let artId = t01774017781._1
600602 let caller = t01774017781._2
601603 let date = t01774017781._3
602604 if (!(containsElement(types, type)))
603605 then throw("Unknown type")
604606 else {
605607 let validateArtwork = validateArtworkData(caller, cidDisplay, name, description, tags)
606608 if ((validateArtwork != ""))
607609 then throw("Something went wrong!")
608610 else {
609611 let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]])
610612 if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
611613 then {
612614 let previewData = if (containsElement(Previewtypes, type))
613615 then [StringEntry(keyPreviewCid(caller, artId), preview)]
614616 else nil
615617 let invokeCollectionCreate = invoke(valueOrErrorMessage(addressFromString(collectionsDapp), (collectionsDapp + " not found")), "collectionProcess", [collection, subcollection, caller], nil)
616618 if ((invokeCollectionCreate == invokeCollectionCreate))
617619 then {
618620 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
619621 if ((entryExist != ""))
620622 then throw("You already added it")
621623 else {
622624 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
623625 if ((hashExist != ""))
624626 then throw("This hash is already registered")
625627 else (previewData ++ [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(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyEntitlement(caller, artId), entitlement)])
626628 }
627629 }
628630 else throw("Strict value is not equal to itself.")
629631 }
630632 else throw("Strict value is not equal to itself.")
631633 }
632634 }
633635 }
634636
635637
636638
637639 @Callable(i)
638640 func sellArtwork (artId,price,maxMint,assetId,auctionType,duration,add1,add2,add3,add1Sh,add2Sh,add3Sh) = {
639641 let callData = idCallerDate(i)
640642 let id = callData._1
641643 let caller = callData._2
642644 let amountSold = getIntegerByKey(keyIssued(caller, artId))
643645 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
644646 let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]])
645647 if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
646648 then if (if ((bidNbr > 0))
647649 then true
648650 else (amountSold > 0))
649651 then throw("There are bids or items sold, you can not edit anything!")
650652 else {
651653 let artworkName = getStringByKey(keyName(caller, artId))
652654 if (!(containsElement([auctionType1, auctionType2, auctionType3], auctionType)))
653655 then throw("We don't know this auction type")
654656 else if ((artworkName == ""))
655657 then throw("This art doesn't match your account")
656658 else if (!(acceptedAssetIds(assetId)))
657659 then throw("Something went wrong!")
658660 else if (!(validateMinSell(assetId, price)))
659661 then throw("Something went wrong!")
660662 else {
661663 let checkUser = validateUser(caller)
662664 if ((checkUser != ""))
663665 then throw(checkUser)
664666 else if ((maxMint > 10000))
665667 then throw("10000 editions max per artwork")
666668 else {
667669 let sellStatus = if ((price > 0))
668670 then (maxMint > 0)
669671 else false
670- let teamFee = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "teamSplitFee", [artId, feeReceiver, "", "", 15, 0, 0], nil)
672+ let teamFee = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "teamSplitFee", [artId, feeReceiver, "", "", 3, 0, 0], nil)
671673 if ((teamFee == teamFee))
672674 then {
673675 let creatorFee = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "creatorSplitFee", [artId, add1, add2, add3, add1Sh, add2Sh, add3Sh], nil)
674676 if ((creatorFee == creatorFee))
675677 then {
676678 let endHeight = (duration + height)
677679 [BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), IntegerEntry(keyDuration(caller, artId), duration), IntegerEntry(keyEndHeight(caller, artId), endHeight), StringEntry(keyAssetIdAccepted(caller, artId), assetId), StringEntry(keyAuctionType(caller, artId), auctionType)]
678680 }
679681 else throw("Strict value is not equal to itself.")
680682 }
681683 else throw("Strict value is not equal to itself.")
682684 }
683685 }
684686 }
685687 else throw("Strict value is not equal to itself.")
688+ }
689+
690+
691+
692+@Callable(i)
693+func cancelSale (artId,maxToSell) = {
694+ let callerData = idCallerDate(i)
695+ let id = callerData._1
696+ let caller = callerData._2
697+ let auctionType = valueOrErrorMessage(keyAuctionType(caller, artId), "Do not try to edit a auction you do not own!")
698+ if (!(containsElement([auctionType1, auctionType3], auctionType)))
699+ then throw("You can not cancel this type of auction")
700+ else {
701+ let amountSold = getIntegerByKey(keyIssued(caller, artId))
702+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
703+ if ((amountSold > maxToSell))
704+ then throw(("You can not lower the maxCanSell below " + toString(amountSold)))
705+ else if ((maxToSell > maxCanSell))
706+ then throw("You can not increase the maxCanSell parameter")
707+ else {
708+ let boolEntry = if ((maxToSell == amountSold))
709+ then [BooleanEntry(keyOnSale(caller, artId), false)]
710+ else nil
711+ ([IntegerEntry(keyMaxMint(caller, artId), maxToSell)] ++ boolEntry)
712+ }
713+ }
686714 }
687715
688716
689717
690718 @Callable(i)
691719 func buyArtwork (artId,issuer) = {
692720 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
693721 if ((auctionType == auctionType3))
694722 then buyMint(i, artId, issuer, "", "", false)
695723 else throw("Direct buy only allowed when no auction type is set!")
696724 }
697725
698726
699727
700728 @Callable(i)
701729 func updateTags (artist,artId,tags) = {
702730 let caller = toString(addressFromPublicKey(i.callerPublicKey))
703731 if (!(containsElement(owners, caller)))
704732 then throw("no")
705733 else if ((size(split(tags, ",")) > 5))
706734 then throw("5 tags max.")
707735 else {
708736 let tagsOld = getStringByKeyOrError(keyTags(artist, artId), "No tags created with this key, so can't update!")
709737 if ((tags == tagsOld))
710738 then throw("Tags are the same as old tags!")
711739 else [StringEntry(keyTags(artist, artId), tags)]
712740 }
713741 }
714742
715743
716744
717745 @Callable(i)
718746 func deleteEntry (entry) = {
719747 let caller = toString(addressFromPublicKey(i.callerPublicKey))
720748 if (!(containsElement(owners, caller)))
721749 then throw("no")
722750 else [DeleteEntry(entry)]
723751 }
724752
725753
726754
727755 @Callable(i)
728756 func setBid (artId,issuer) = {
729757 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
730758 if ((auctionType == auctionType1))
731759 then setBidNonTraditional(i, artId, issuer)
732760 else if ((auctionType == auctionType2))
733761 then setBidTraditional(i, artId, issuer)
734762 else throw((("Unknown auction type :" + auctionType) + ", please contact the admins"))
735763 }
736764
737765
738766
739767 @Callable(i)
740768 func acceptBid (artId,issuer,bidId,bidOwner) = {
741769 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
742770 if ((auctionType == auctionType1))
743771 then acceptBidNonTraditional(i, artId, issuer, bidId, bidOwner)
744772 else if ((auctionType == auctionType2))
745773 then acceptBidTraditional(i, artId, issuer, bidId, bidOwner)
746774 else throw((("Unknown auction type :" + auctionType) + ", please contact the admins"))
747775 }
748776
749777
750778
751779 @Callable(i)
752780 func cancelBid (artId,issuer,bidId) = {
753781 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
754782 if ((auctionType == auctionType1))
755783 then cancelBidImpl(i, artId, issuer, bidId)
756784 else cancelBidImplTraditional(i, artId, issuer, bidId)
757785 }
758786
759787

github/deemru/w8io/169f3d6 
95.74 ms