tx · D8LCo4WrxBiYapL9LebP1bjp6x8U265R3NjBiHPeu9zw

3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB:  -0.02500000 Waves

2022.07.16 09:42 [2141948] smart account 3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB > SELF 0.00000000 Waves

{ "type": 13, "id": "D8LCo4WrxBiYapL9LebP1bjp6x8U265R3NjBiHPeu9zw", "fee": 2500000, "feeAssetId": null, "timestamp": 1657953755759, "version": 2, "chainId": 84, "sender": "3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB", "senderPublicKey": "Gd5NihbWQoWuTnSvq25TuV2BYZG4U1e9KDqZn9zBPix7", "proofs": [ "72KX8mNAFmnnycXPwNu5RYNUEeCMJH3M71j6KcPFvcCg5f6FCUCBhD3aHkXrSmcVnVdQxeoN6H28N9awpp1FkCt" ], "script": "base64:BgIsCAISBwoFCAgICAgSBAoCCAgSBgoECAgICBIICgYICAgICAgSBQoDCAgIEgARAA9zdG9yYWdlVmVyaWZpZXIJAQV2YWx1ZQEJAKYIAQIjM04yczVSdGFIUEJlbkNzeDJFQ2NvRlJiWUh4M25vWmhYVzEABGJhbmsCIzNOMUU2dFhkZFJvVmFSZlE5ZFEzdmc1TGFXMmZzZDhIS3ViAA1hY2NlcHRlZFRva2VuASDopWq8yndC8nBhMjVKT0WDubke5ZlnF8Nx6tkLoQSt6wAGdXNkbklEAiwzS0ZYQkdHTENqQTVaMkR1VzREcTlmRERySGpKSlAxWkVrYW9halN6dUtzQwAUc3RvcmFnZUZlZU11bHRpcGxpZXIAAQEKY2hlY2tFbnRyeQIGcHJlZml4BHV1aWQEByRtYXRjaDAJAJ0IAgUEdGhpcwkArAICBQZwcmVmaXgFBHV1aWQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgROT05FAQ9jaGVja0VudHJ5RW1haWwCBHV1aWQGZG9tYWluBAckbWF0Y2gwCQCdCAIFBHRoaXMJAKwCAgkArAICBQR1dWlkAgFABQZkb21haW4DCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgROT05FAQljaGVja1VVSUQBBHV1aWQEByRtYXRjaDAJAJ0IAgUEdGhpcwUEdXVpZAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECBE5PTkUBEmNoZWNrSWZXaGl0ZUxpc3RlZAENY2FsbGVyQWRkcmVzcwQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgICEWFkZHJfV0hJVEVMSVNURURfBQ1jYWxsZXJBZGRyZXNzAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQhpc0FkcmVzcwEEYWRkcgMDAwkAAAIJALECAQUEYWRkcgAjCQAAAgkArwICBQRhZGRyAAICAjNQBwYJAAACCQCvAgIFBGFkZHIAAgICM04GCQAAAgkArwICBQRhZGRyAAICAjNNAQxjb3VudFBhcnRpZXMCC2FjY3VtdWxhdG9yBGFkZHIDCQBmAgkAsQIBBQRhZGRyAAAJAGQCBQthY2N1bXVsYXRvcgABCQBkAgULYWNjdW11bGF0b3IAAAEUY2hlY2tJZlBlbmRpbmdUb1NpZ24BA2tleQQHJG1hdGNoMAkAnQgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAAAIFAWECB1BFTkRJTkcGBwcBDmdldFZhbHVlU3RyaW5nAQRqc29uCQCvAgIJALACAgUEanNvbgABCQEFdmFsdWUBCQCzCQIJALACAgUEanNvbgABAgEiAQhnZXRWYWx1ZQIEanNvbgNrZXkECGtleUluZGV4CQEFdmFsdWUBCQCzCQIFBGpzb24JAKwCAgkArAICAgEiBQNrZXkCAiI6BARkYXRhCQCwAgIFBGpzb24JAGQCCQBkAgUIa2V5SW5kZXgJALECAQUDa2V5AAMECWpzb25WYWx1ZQkBDmdldFZhbHVlU3RyaW5nAQUEZGF0YQUJanNvblZhbHVlARJnZXRKc29uQmVmb3JlVmFsdWUCBGpzb24Da2V5BAhrZXlJbmRleAkBBXZhbHVlAQkAswkCBQRqc29uCQCsAgIJAKwCAgIBIgUDa2V5AgIiOgQEZGF0YQkArwICBQRqc29uCQBkAgkAZAIFCGtleUluZGV4CQCxAgEFA2tleQADBQRkYXRhARFnZXRKc29uQWZ0ZXJWYWx1ZQIEanNvbgNrZXkECGtleUluZGV4CQEFdmFsdWUBCQCzCQIFBGpzb24JAKwCAgkArAICAgEiBQNrZXkCAiI6BARkYXRhCQCyAgIFBGpzb24JAGUCCQCxAgEFBGpzb24JAGQCCQBkAgkAZAIJAGQCBQhrZXlJbmRleAkAsQIBBQNrZXkAAwAAAAIFBGRhdGEBCGFzU3RyaW5nAQJidgQHJG1hdGNoMAUCYnYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANidjAFByRtYXRjaDAFA2J2MAkAAgECJFNwb25zb3JlZCBQdWJsaWMgS2V5IFN0cmluZyBleHBlY3RlZAYGaW52b2tlARFmaWxlQ2VydGlmaWNhdGlvbgUEaGFzaAV0aXRsZQR1dWlkBGlwZnMMc2lnbmVyUHViS2V5BAJpZAkBBXZhbHVlAQgFBmludm9rZQ10cmFuc2FjdGlvbklkBAplbnRyeUV4aXN0CQEKY2hlY2tFbnRyeQIFBGhhc2gFBHV1aWQECXV1aWRFeGlzdAkBCWNoZWNrVVVJRAEFBHV1aWQEDGNhbGxlcklzRGFwcAkAAAIFBHRoaXMIBQZpbnZva2UGY2FsbGVyBA1jYWxsZXJBZGRyZXNzAwUMY2FsbGVySXNEYXBwCQClCAEJAKcIAQkA2QQBBQxzaWduZXJQdWJLZXkJANgEAQgIBQZpbnZva2UGY2FsbGVyBWJ5dGVzBBZjYWxsZXJJc1doaXRlTGlzdGVkTnVtCQESY2hlY2tJZldoaXRlTGlzdGVkAQUNY2FsbGVyQWRkcmVzcwMJAQIhPQIFCmVudHJ5RXhpc3QCBE5PTkUJAAIBAhhUaGlzIGVudHJ5IGFscmVhZHkgZXhpc3QDCQECIT0CBQl1dWlkRXhpc3QCBE5PTkUJAAIBAhdUaGlzIHV1aWQgYWxyZWFkeSBleGlzdAMJAQIhPQIJALECAQUEdXVpZAAkCQACAQIdVXVpZCBzaG91bGQgYmUgMzYgY2hhcmFjdGVycy4DCQECIT0CCQCxAgEFBGhhc2gAQAkAAgECHUhhc2ggc2hvdWxkIGJlIDY0IGNoYXJhY3RlcnMuAwkAZgIJALECAQUFdGl0bGUAZAkAAgECJlRpdGxlIGlzIHRvbyBsb25nLCAxMDAgY2hhcmFjdGVycyBtYXguAwMDCQEIY29udGFpbnMCBQRoYXNoAgEiBgkBCGNvbnRhaW5zAgUFdGl0bGUCASIGCQEIY29udGFpbnMCBQRpcGZzAgEiCQACAQIMTm8gIiBhbGxvd2VkBARkYXRhCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJeyJoYXNoIjoiBQRoYXNoAg4iLCJ0aW1lc3RhbXAiOgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAIKLCJ0aXRsZSI6IgUFdGl0bGUCCiIsImlwZnMiOiIFBGlwZnMCAiJ9AwkAZgIFFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0AAAQKY3JlZGl0Q29zdAMJAQIhPQIJALECAQUEaXBmcwAACQBkAgABBRRzdG9yYWdlRmVlTXVsdGlwbGllcgABAwkAZgIAAAkAZQIFFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0FCmNyZWRpdENvc3QJAAIBAhFOb3QgZW5vdWdoIGNyZWRpdAkAzAgCCQELU3RyaW5nRW50cnkCBQR1dWlkCQDYBAEFAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEaGFzaAUEdXVpZAkA2AQBBQJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBXRpdGxlBQR1dWlkCQDYBAEFAmlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEWFkZHJfV0hJVEVMSVNURURfBQ1jYWxsZXJBZGRyZXNzCQBlAgUWY2FsbGVySXNXaGl0ZUxpc3RlZE51bQUKY3JlZGl0Q29zdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwkA2AQBBQJpZAIBXwUNY2FsbGVyQWRkcmVzcwUEZGF0YQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1jYWxsZXJBZGRyZXNzAAAFDWFjY2VwdGVkVG9rZW4FA25pbAMJAQEhAQUMY2FsbGVySXNEYXBwBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQZpbnZva2UIcGF5bWVudHMAAAQGYW1vdW50CQEFdmFsdWUBCAUHcGF5bWVudAZhbW91bnQEDnBheW1lbnRBc3NldElkAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAiBXYXZlcyBpcyBub3QgYWNjZXB0ZWQgYXMgcGF5bWVudAQMY3VycmVudFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9zdG9yYWdlVmVyaWZpZXIJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEJAQV2YWx1ZQEFDnBheW1lbnRBc3NldElkBAdmZWVDb3N0AwkBAiE9AgkAsQIBBQRpcGZzAAAJAGQCBQxjdXJyZW50UHJpY2UJAGgCBRRzdG9yYWdlRmVlTXVsdGlwbGllcgUMY3VycmVudFByaWNlBQxjdXJyZW50UHJpY2UDCQECIT0CBQ1hY2NlcHRlZFRva2VuBQ5wYXltZW50QXNzZXRJZAkAAgECKFRoaXMgdG9rZW4gaXMgbm90IGFjY2VwdGVkIGF0IHRoZSBtb21lbnQDAwkBAiE9AgUGYW1vdW50BQdmZWVDb3N0CQBnAgAABRZjYWxsZXJJc1doaXRlTGlzdGVkTnVtBwkAAgECElRoZSBwcmljZSBpcyB3cm9uZwkAzAgCCQELU3RyaW5nRW50cnkCBQR1dWlkCQDYBAEFAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUEaGFzaAUEdXVpZAkA2AQBBQJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBXRpdGxlBQR1dWlkCQDYBAEFAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgICCGRhdGFfZmNfCQDYBAEFAmlkAgFfBQ1jYWxsZXJBZGRyZXNzBQRkYXRhCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGJhbmsFB2ZlZUNvc3QIBQdwYXltZW50B2Fzc2V0SWQFA25pbAkAAgECHllvdSBhcmUgbm90IGFsbG93ZWQgdG8gZG8gdGhhdAZpbnZva2UBE3Jldm9rZUNlcnRpZmljYXRpb24CD2NlcnRpZmljYXRpb25JZAxzaWduZXJQdWJLZXkEAmlkCQEFdmFsdWUBCAUGaW52b2tlDXRyYW5zYWN0aW9uSWQEDGNhbGxlcklzRGFwcAkAAAIFBHRoaXMIBQZpbnZva2UGY2FsbGVyBA1jYWxsZXJBZGRyZXNzAwUMY2FsbGVySXNEYXBwCQClCAEJAKcIAQkA2QQBBQxzaWduZXJQdWJLZXkJANgEAQgIBQZpbnZva2UGY2FsbGVyBWJ5dGVzBAplbnRyeUV4aXN0BAckbWF0Y2gwCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgICCGRhdGFfZmNfBQ9jZXJ0aWZpY2F0aW9uSWQCAV8FDWNhbGxlckFkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgROT05FBAlpc1Jldm9rZWQEByRtYXRjaDAJAJ0IAgUEdGhpcwkArAICAgpTVEFUVVNfRkNfBQ9jZXJ0aWZpY2F0aW9uSWQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgROT05FBBZjYWxsZXJJc1doaXRlTGlzdGVkTnVtCQESY2hlY2tJZldoaXRlTGlzdGVkAQUNY2FsbGVyQWRkcmVzcwQHbmV3SnNvbgkArAICCQCsAgIJAKwCAgkAswICBQplbnRyeUV4aXN0AAECEywic3RhdHVzIjoiUkVWT0tFRF8JANgEAQUCaWQCAiJ9AwkBAiE9AgUJaXNSZXZva2VkAgROT05FCQACAQItVGhpcyBjZXJ0aWZpY2F0aW9uIGhhdmUgYWxyZWFkeSBiZWVuIHJldm9rZWQuAwkAAAIFCmVudHJ5RXhpc3QCBE5PTkUJAAIBAjNZb3UgY2Fubm90IGNoYW5nZSB0aGUgc3RhdHVzIG9mIHRoaXMgY2VydGlmaWNhdGlvbi4DCQBmAgUWY2FsbGVySXNXaGl0ZUxpc3RlZE51bQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEWFkZHJfV0hJVEVMSVNURURfBQ1jYWxsZXJBZGRyZXNzCQBlAgUWY2FsbGVySXNXaGl0ZUxpc3RlZE51bQABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIKU1RBVFVTX0ZDXwUPY2VydGlmaWNhdGlvbklkCQCsAgICCFJFVk9LRURfCQDYBAEFAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgICCGRhdGFfZmNfBQ9jZXJ0aWZpY2F0aW9uSWQCAV8FDWNhbGxlckFkZHJlc3MFB25ld0pzb24JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUNY2FsbGVyQWRkcmVzcwAABQ1hY2NlcHRlZFRva2VuBQNuaWwDCQEBIQEFDGNhbGxlcklzRGFwcAQHcGF5bWVudAkBBXZhbHVlAQkAkQMCCAUGaW52b2tlCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50BA5wYXltZW50QXNzZXRJZAMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkCQACAQIgV2F2ZXMgaXMgbm90IGFjY2VwdGVkIGFzIHBheW1lbnQEDGN1cnJlbnRQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPc3RvcmFnZVZlcmlmaWVyCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBCQEFdmFsdWUBBQ5wYXltZW50QXNzZXRJZAMJAQIhPQIFDWFjY2VwdGVkVG9rZW4FDnBheW1lbnRBc3NldElkCQACAQIoVGhpcyB0b2tlbiBpcyBub3QgYWNjZXB0ZWQgYXQgdGhlIG1vbWVudAMDCQECIT0CBQZhbW91bnQFDGN1cnJlbnRQcmljZQkAZwIAAAUWY2FsbGVySXNXaGl0ZUxpc3RlZE51bQcJAAIBAhJUaGUgcHJpY2UgaXMgd3JvbmcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgpTVEFUVVNfRkNfBQ9jZXJ0aWZpY2F0aW9uSWQJAKwCAgIIUkVWT0tFRF8JANgEAQUCaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgIIZGF0YV9mY18FD2NlcnRpZmljYXRpb25JZAIBXwUNY2FsbGVyQWRkcmVzcwUHbmV3SnNvbgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRiYW5rBQZhbW91bnQIBQdwYXltZW50B2Fzc2V0SWQFA25pbAkAAgECHllvdSBhcmUgbm90IGFsbG93ZWQgdG8gZG8gdGhhdAZpbnZva2UBEmVtYWlsQ2VydGlmaWNhdGlvbgQGZG9tYWluBXRpdGxlBHV1aWQMc2lnbmVyUHViS2V5BAJpZAkBBXZhbHVlAQgFBmludm9rZQ10cmFuc2FjdGlvbklkBAplbnRyeUV4aXN0CQEPY2hlY2tFbnRyeUVtYWlsAgUGZG9tYWluBQR1dWlkBAl1dWlkRXhpc3QJAQljaGVja1VVSUQBBQR1dWlkBAxjYWxsZXJJc0RhcHAJAAACBQR0aGlzCAUGaW52b2tlBmNhbGxlcgQNY2FsbGVyQWRkcmVzcwMFDGNhbGxlcklzRGFwcAkApQgBCQCnCAEJANkEAQUMc2lnbmVyUHViS2V5CQDYBAEICAUGaW52b2tlBmNhbGxlcgVieXRlcwQWY2FsbGVySXNXaGl0ZUxpc3RlZE51bQkBEmNoZWNrSWZXaGl0ZUxpc3RlZAEFDWNhbGxlckFkZHJlc3MDCQECIT0CBQplbnRyeUV4aXN0AgROT05FCQACAQIYVGhpcyBlbnRyeSBhbHJlYWR5IGV4aXN0AwkBAiE9AgUJdXVpZEV4aXN0AgROT05FCQACAQIXVGhpcyB1dWlkIGFscmVhZHkgZXhpc3QDCQBmAgkAsQIBBQR1dWlkACQJAAIBAiRVdWlkIGlzIHRvbyBsb25nLCAzNiBjaGFyYWN0ZXJzIG1heC4DCQBmAgkAsQIBBQZkb21haW4AlgEJAAIBAidEb21haW4gaXMgdG9vIGxvbmcsIDE1MCBjaGFyYWN0ZXJzIG1heC4DCQBmAgkAsQIBBQV0aXRsZQBkCQACAQImVGl0bGUgaXMgdG9vIGxvbmcsIDEwMCBjaGFyYWN0ZXJzIG1heC4DAwMJAQhjb250YWlucwIFBHV1aWQCASIGCQEIY29udGFpbnMCBQV0aXRsZQIBIgYJAQhjb250YWlucwIFBmRvbWFpbgIBIgkAAgECDE5vICIgYWxsb3dlZAQEZGF0YQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDnsibWVzc2FnZWlkIjoiBQR1dWlkAgFABQZkb21haW4CDiIsInRpbWVzdGFtcCI6CQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wAg4sInJlZmVyZW5jZSI6IgUFdGl0bGUCAiJ9AwkAZgIFFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0AAAkAzAgCCQELU3RyaW5nRW50cnkCBQR1dWlkCQDYBAEFAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQR1dWlkAgFABQZkb21haW4JANgEAQUCaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQV0aXRsZQUEdXVpZAkA2AQBBQJpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhFhZGRyX1dISVRFTElTVEVEXwUNY2FsbGVyQWRkcmVzcwkAZQIFFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0AAQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICAghkYXRhX2VjXwkA2AQBBQJpZAIBXwUNY2FsbGVyQWRkcmVzcwUEZGF0YQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1jYWxsZXJBZGRyZXNzAAAFDWFjY2VwdGVkVG9rZW4FA25pbAMJAQEhAQUMY2FsbGVySXNEYXBwBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQZpbnZva2UIcGF5bWVudHMAAAQGYW1vdW50CQEFdmFsdWUBCAUHcGF5bWVudAZhbW91bnQEDnBheW1lbnRBc3NldElkAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAiBXYXZlcyBpcyBub3QgYWNjZXB0ZWQgYXMgcGF5bWVudAQMY3VycmVudFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9zdG9yYWdlVmVyaWZpZXIJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEJAQV2YWx1ZQEFDnBheW1lbnRBc3NldElkAwkBAiE9AgUNYWNjZXB0ZWRUb2tlbgUOcGF5bWVudEFzc2V0SWQJAAIBAihUaGlzIHRva2VuIGlzIG5vdCBhY2NlcHRlZCBhdCB0aGUgbW9tZW50AwMJAQIhPQIFBmFtb3VudAUMY3VycmVudFByaWNlCQBnAgAABRZjYWxsZXJJc1doaXRlTGlzdGVkTnVtBwkAAgECElRoZSBwcmljZSBpcyB3cm9uZwkAzAgCCQELU3RyaW5nRW50cnkCBQR1dWlkCQDYBAEFAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQR1dWlkAgFABQZkb21haW4JANgEAQUCaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQV0aXRsZQUEdXVpZAkA2AQBBQJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICAghkYXRhX2VjXwkA2AQBBQJpZAIBXwUNY2FsbGVyQWRkcmVzcwUEZGF0YQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRiYW5rBQZhbW91bnQIBQdwYXltZW50B2Fzc2V0SWQFA25pbAkAAgECHllvdSBhcmUgbm90IGFsbG93ZWQgdG8gZG8gdGhhdAZpbnZva2UBD2NyZWF0ZUFncmVlbWVudAYEaGFzaAV0aXRsZQ9zdHJpbmdpZmllZEpTT04MY291bnRlclBhcnRzDHNpZ25lclB1YktleQR1dWlkBAJpZAkBBXZhbHVlAQgFBmludm9rZQ10cmFuc2FjdGlvbklkBAplbnRyeUV4aXN0CQEKY2hlY2tFbnRyeQIFBGhhc2gFBHV1aWQECXV1aWRFeGlzdAkBCWNoZWNrVVVJRAEFBHV1aWQEDGNhbGxlcklzRGFwcAkAAAIFBHRoaXMIBQZpbnZva2UGY2FsbGVyBA1jYWxsZXJBZGRyZXNzAwUMY2FsbGVySXNEYXBwCQClCAEJAKcIAQkA2QQBBQxzaWduZXJQdWJLZXkJANgEAQgIBQZpbnZva2UGY2FsbGVyBWJ5dGVzBBZjYWxsZXJJc1doaXRlTGlzdGVkTnVtCQESY2hlY2tJZldoaXRlTGlzdGVkAQUNY2FsbGVyQWRkcmVzcwQESlNPTgkArAICCQCsAgIJAKwCAgkArAICCQESZ2V0SnNvbkJlZm9yZVZhbHVlAgUPc3RyaW5naWZpZWRKU09OAgdjcmVhdG9yAgEiBQ1jYWxsZXJBZGRyZXNzAgEiCQERZ2V0SnNvbkFmdGVyVmFsdWUCBQ9zdHJpbmdpZmllZEpTT04CB2NyZWF0b3IEDmFkZHJlc3Nlc0FycmF5CQC1CQIFDGNvdW50ZXJQYXJ0cwIBLAQOdG90YWxBZGRyZXNzZXMJAJADAQUOYWRkcmVzc2VzQXJyYXkED2dsb2JhbERhdGFUaXRsZQkBC1N0cmluZ0VudHJ5AgkArAICBQV0aXRsZQUEdXVpZAkA2AQBBQJpZAQOZ2xvYmFsRGF0YUhhc2gJAQtTdHJpbmdFbnRyeQIJAKwCAgUEaGFzaAUEdXVpZAkA2AQBBQJpZAQOZ2xvYmFsRGF0YUpzb24JAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgICCGRhdGFfTUFfCQDYBAEFAmlkAgFfBQ1jYWxsZXJBZGRyZXNzBQRKU09OBA9nbG9iYWxEYXRhT3duZXIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQ1jYWxsZXJBZGRyZXNzAgRfTUFfCQDYBAEFAmlkCQCsAgICB1NJR05FRF8JANgEAQUCaWQED2RhdGFXaGl0ZUxpc3RlZAkBDEludGVnZXJFbnRyeQIJAKwCAgIRYWRkcl9XSElURUxJU1RFRF8FDWNhbGxlckFkZHJlc3MJAGUCBRZjYWxsZXJJc1doaXRlTGlzdGVkTnVtCQBkAgUOdG90YWxBZGRyZXNzZXMAAQMJAQIhPQIFCmVudHJ5RXhpc3QCBE5PTkUJAAIBAhhUaGlzIGVudHJ5IGFscmVhZHkgZXhpc3QDCQECIT0CBQl1dWlkRXhpc3QCBE5PTkUJAAIBAhdUaGlzIHV1aWQgYWxyZWFkeSBleGlzdAMJAGYCCQCxAgEFBHV1aWQAJAkAAgECJFV1aWQgaXMgdG9vIGxvbmcsIDM2IGNoYXJhY3RlcnMgbWF4LgMJAGYCCQCxAgEFBGhhc2gAQAkAAgECKk1lc3NhZ2UtaWQgaXMgdG9vIGxvbmcsIDY0IGNoYXJhY3RlcnMgbWF4LgMJAGYCCQCxAgEFBXRpdGxlAGQJAAIBAiZUaXRsZSBpcyB0b28gbG9uZywgMTAwIGNoYXJhY3RlcnMgbWF4LgMJAGYCBRZjYWxsZXJJc1doaXRlTGlzdGVkTnVtAAADCQBmAgkAZAIFDnRvdGFsQWRkcmVzc2VzAAEFFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0JAAIBAipZb3UgZG9uJ3QgaGF2ZSBlbm91Z2ggY2VydGlmaWNhdGlvbiBjcmVkaXQDCQAAAgUOdG90YWxBZGRyZXNzZXMABgkAzAgCBQ9nbG9iYWxEYXRhVGl0bGUJAMwIAgUOZ2xvYmFsRGF0YUhhc2gJAMwIAgUOZ2xvYmFsRGF0YUpzb24JAMwIAgUPZ2xvYmFsRGF0YU93bmVyCQDMCAIFD2RhdGFXaGl0ZUxpc3RlZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkAkQMCBQ5hZGRyZXNzZXNBcnJheQAAAgRfTUFfCQDYBAEFAmlkAgdQRU5ESU5HCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAECBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAgIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkAkQMCBQ5hZGRyZXNzZXNBcnJheQADAgRfTUFfCQDYBAEFAmlkAgdQRU5ESU5HCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAQCBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkABQIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1jYWxsZXJBZGRyZXNzAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQAAAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQABAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQACAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQADAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQAEAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQAFAAAFDWFjY2VwdGVkVG9rZW4FA25pbAMJAAACBQ50b3RhbEFkZHJlc3NlcwAFCQDMCAIFD2dsb2JhbERhdGFUaXRsZQkAzAgCBQ5nbG9iYWxEYXRhSGFzaAkAzAgCBQ5nbG9iYWxEYXRhSnNvbgkAzAgCBQ9nbG9iYWxEYXRhT3duZXIJAMwIAgUPZGF0YVdoaXRlTGlzdGVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAACBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAQIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkAkQMCBQ5hZGRyZXNzZXNBcnJheQACAgRfTUFfCQDYBAEFAmlkAgdQRU5ESU5HCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAMCBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkABAIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1jYWxsZXJBZGRyZXNzAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQAAAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQABAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQACAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQADAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQAEAAAFDWFjY2VwdGVkVG9rZW4FA25pbAMJAAACBQ50b3RhbEFkZHJlc3NlcwAECQDMCAIFD2dsb2JhbERhdGFUaXRsZQkAzAgCBQ5nbG9iYWxEYXRhSGFzaAkAzAgCBQ5nbG9iYWxEYXRhSnNvbgkAzAgCBQ9nbG9iYWxEYXRhT3duZXIJAMwIAgUPZGF0YVdoaXRlTGlzdGVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAACBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAQIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkAkQMCBQ5hZGRyZXNzZXNBcnJheQACAgRfTUFfCQDYBAEFAmlkAgdQRU5ESU5HCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAMCBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUNY2FsbGVyQWRkcmVzcwAABQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAAAABQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAQAABQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAgAABQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAwAABQ1hY2NlcHRlZFRva2VuBQNuaWwDCQAAAgUOdG90YWxBZGRyZXNzZXMAAwkAzAgCBQ9nbG9iYWxEYXRhVGl0bGUJAMwIAgUOZ2xvYmFsRGF0YUhhc2gJAMwIAgUOZ2xvYmFsRGF0YUpzb24JAMwIAgUPZ2xvYmFsRGF0YU93bmVyCQDMCAIFD2RhdGFXaGl0ZUxpc3RlZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkAkQMCBQ5hZGRyZXNzZXNBcnJheQAAAgRfTUFfCQDYBAEFAmlkAgdQRU5ESU5HCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAECBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAgIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1jYWxsZXJBZGRyZXNzAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQAAAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQABAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQACAAAFDWFjY2VwdGVkVG9rZW4FA25pbAMJAAACBQ50b3RhbEFkZHJlc3NlcwACCQDMCAIFD2dsb2JhbERhdGFUaXRsZQkAzAgCBQ5nbG9iYWxEYXRhSGFzaAkAzAgCBQ5nbG9iYWxEYXRhSnNvbgkAzAgCBQ9nbG9iYWxEYXRhT3duZXIJAMwIAgUPZGF0YVdoaXRlTGlzdGVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAACBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAQIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1jYWxsZXJBZGRyZXNzAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQAAAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQABAAAFDWFjY2VwdGVkVG9rZW4FA25pbAMJAAACBQ50b3RhbEFkZHJlc3NlcwABCQDMCAIFD2dsb2JhbERhdGFUaXRsZQkAzAgCBQ5nbG9iYWxEYXRhSGFzaAkAzAgCBQ5nbG9iYWxEYXRhSnNvbgkAzAgCBQ9nbG9iYWxEYXRhT3duZXIJAMwIAgUPZGF0YVdoaXRlTGlzdGVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAACBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUNY2FsbGVyQWRkcmVzcwAABQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAAAABQ1hY2NlcHRlZFRva2VuBQNuaWwJAAIBAhxXcm9uZyBudW1iZXIgb2YgcGFydGljaXBhbnRzAwkBASEBBQxjYWxsZXJJc0RhcHAEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFBmludm9rZQhwYXltZW50cwAABAZhbW91bnQDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQGYW1vdW50CQEFdmFsdWUBCAUHcGF5bWVudAZhbW91bnQAAAQOcGF5bWVudEFzc2V0SWQDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAUNYWNjZXB0ZWRUb2tlbgQMY3VycmVudFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9zdG9yYWdlVmVyaWZpZXIJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEJAQV2YWx1ZQEFDnBheW1lbnRBc3NldElkAwkAZgIJAGgCBQxjdXJyZW50UHJpY2UJAGQCBQ50b3RhbEFkZHJlc3NlcwABBQZhbW91bnQJAAIBCQCsAgICIVRoZSBwcmljZSBpcyB3cm9uZywgaXQgc2hvdWxkIGJlIAkApAMBCQBoAgUMY3VycmVudFByaWNlCQBkAgUOdG90YWxBZGRyZXNzZXMAAQMJAAACBQ50b3RhbEFkZHJlc3NlcwAGCQDMCAIFD2dsb2JhbERhdGFUaXRsZQkAzAgCBQ5nbG9iYWxEYXRhSGFzaAkAzAgCBQ5nbG9iYWxEYXRhSnNvbgkAzAgCBQ9nbG9iYWxEYXRhT3duZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAAIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkAkQMCBQ5hZGRyZXNzZXNBcnJheQABAgRfTUFfCQDYBAEFAmlkAgdQRU5ESU5HCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAICBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAwIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkAkQMCBQ5hZGRyZXNzZXNBcnJheQAEAgRfTUFfCQDYBAEFAmlkAgdQRU5ESU5HCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAUCBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUEYmFuawUGYW1vdW50BQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAAAABQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAQAABQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAgAABQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAwAABQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkABAAABQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkABQAABQ1hY2NlcHRlZFRva2VuBQNuaWwDCQAAAgUOdG90YWxBZGRyZXNzZXMABQkAzAgCBQ9nbG9iYWxEYXRhVGl0bGUJAMwIAgUOZ2xvYmFsRGF0YUhhc2gJAMwIAgUOZ2xvYmFsRGF0YUpzb24JAMwIAgUPZ2xvYmFsRGF0YU93bmVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAACBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAQIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkAkQMCBQ5hZGRyZXNzZXNBcnJheQACAgRfTUFfCQDYBAEFAmlkAgdQRU5ESU5HCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAMCBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkABAIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRiYW5rBQZhbW91bnQFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQAAAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQABAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQACAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQADAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQAEAAAFDWFjY2VwdGVkVG9rZW4FA25pbAMJAAACBQ50b3RhbEFkZHJlc3NlcwAECQDMCAIFD2dsb2JhbERhdGFUaXRsZQkAzAgCBQ5nbG9iYWxEYXRhSGFzaAkAzAgCBQ5nbG9iYWxEYXRhSnNvbgkAzAgCBQ9nbG9iYWxEYXRhT3duZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAAIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkAkQMCBQ5hZGRyZXNzZXNBcnJheQABAgRfTUFfCQDYBAEFAmlkAgdQRU5ESU5HCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAICBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAwIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRiYW5rBQZhbW91bnQFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQAAAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQABAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQACAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQADAAAFDWFjY2VwdGVkVG9rZW4FA25pbAMJAAACBQ50b3RhbEFkZHJlc3NlcwADCQDMCAIFD2dsb2JhbERhdGFUaXRsZQkAzAgCBQ5nbG9iYWxEYXRhSGFzaAkAzAgCBQ5nbG9iYWxEYXRhSnNvbgkAzAgCBQ9nbG9iYWxEYXRhT3duZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAAIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkAkQMCBQ5hZGRyZXNzZXNBcnJheQABAgRfTUFfCQDYBAEFAmlkAgdQRU5ESU5HCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAICBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUEYmFuawUGYW1vdW50BQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAAAABQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAQAABQ1hY2NlcHRlZFRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAgAABQ1hY2NlcHRlZFRva2VuBQNuaWwDCQAAAgUOdG90YWxBZGRyZXNzZXMAAgkAzAgCBQ9nbG9iYWxEYXRhVGl0bGUJAMwIAgUOZ2xvYmFsRGF0YUhhc2gJAMwIAgUOZ2xvYmFsRGF0YUpzb24JAMwIAgUPZ2xvYmFsRGF0YU93bmVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCRAwIFDmFkZHJlc3Nlc0FycmF5AAACBF9NQV8JANgEAQUCaWQCB1BFTkRJTkcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAQIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRiYW5rBQZhbW91bnQFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQAAAAAFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQABAAAFDWFjY2VwdGVkVG9rZW4FA25pbAMJAAACBQ50b3RhbEFkZHJlc3NlcwABCQDMCAIFD2dsb2JhbERhdGFUaXRsZQkAzAgCBQ5nbG9iYWxEYXRhSGFzaAkAzAgCBQ5nbG9iYWxEYXRhSnNvbgkAzAgCBQ9nbG9iYWxEYXRhT3duZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAJEDAgUOYWRkcmVzc2VzQXJyYXkAAAIEX01BXwkA2AQBBQJpZAIHUEVORElORwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRiYW5rBQZhbW91bnQFDWFjY2VwdGVkVG9rZW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ5hZGRyZXNzZXNBcnJheQAAAAAFDWFjY2VwdGVkVG9rZW4FA25pbAkAAgEJAKwCAgIyTmVlZHMgMSB0byA2IHJlY2lwaWVudCBhZGRyZXNzZXMsIGN1cnJlbnRseSBzZW50OiAJAKQDAQUOdG90YWxBZGRyZXNzZXMJAAIBAh5Zb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGRvIHRoYXQGaW52b2tlAQ1zaWduQWdyZWVtZW50AwRoYXNoC2FncmVlbWVudElkDHNpZ25lclB1YktleQQHcGF5bWVudAkBBXZhbHVlAQkAkQMCCAUGaW52b2tlCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50BAJpZAkBBXZhbHVlAQgFBmludm9rZQ10cmFuc2FjdGlvbklkBAxjYWxsZXJJc0RhcHAJAAACBQR0aGlzCAUGaW52b2tlBmNhbGxlcgQGc2lnbmVyAwUMY2FsbGVySXNEYXBwCQClCAEJAKcIAQkA2QQBBQxzaWduZXJQdWJLZXkJANgEAQgIBQZpbnZva2UGY2FsbGVyBWJ5dGVzBBNzaWduaW5nUmVxdWVzdEV4aXN0CQEUY2hlY2tJZlBlbmRpbmdUb1NpZ24BCQCsAgIJAKwCAgUGc2lnbmVyAgRfTUFfBQthZ3JlZW1lbnRJZAMJAQEhAQUTc2lnbmluZ1JlcXVlc3RFeGlzdAkAAgECI1NvcnJ5IHRoZXJlIGlzIG5vIHBlbmRpbmcgc2lnbmF0dXJlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQZzaWduZXICBF9NQV8FC2FncmVlbWVudElkCQCsAgICB1NJR05FRF8JANgEAQUCaWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUGc2lnbmVyAAAFDWFjY2VwdGVkVG9rZW4FA25pbAZpbnZva2UBD3VzZG5TaWduQ3JlZGl0cwAEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFBmludm9rZQhwYXltZW50cwAABA1jYWxsZXJBZGRyZXNzCQDYBAEICAUGaW52b2tlBmNhbGxlcgVieXRlcwQHdG9rZW5JZAkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQGYW1vdW50CQEFdmFsdWUBCAUHcGF5bWVudAZhbW91bnQED251bWJlck9mQ3JlZGl0cwkAaQIJAGgCBQZhbW91bnQAAgDAhD0EFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0JARJjaGVja0lmV2hpdGVMaXN0ZWQBBQ1jYWxsZXJBZGRyZXNzAwkBAiE9AgkA2AQBBQd0b2tlbklkBQZ1c2RuSUQJAAIBAhpPbmx5IFVTRE4gY2FuIGJlIGV4Y2hhbmdlZAMDCQECIT0CCQBqAgUGYW1vdW50AMCEPQAACQECIT0CCQBqAgUGYW1vdW50AMCEPQCgwh4HCQACAQkArAICCQCsAgIJAKwCAgIwWW91IGNhbiBvbmx5IGV4Y2hhbmdlIG11bHRpcGxlIG9mIDAuNSwgeW91IHNlbnQ6CQCzAgIJAKQDAQUGYW1vdW50AAYCAS4JALICAgkApAMBBQZhbW91bnQABgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhFhZGRyX1dISVRFTElTVEVEXwUNY2FsbGVyQWRkcmVzcwkAZAIFFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0FD251bWJlck9mQ3JlZGl0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRiYW5rBQZhbW91bnQFB3Rva2VuSWQFA25pbAECdHgBCHZlcmlmaWVyAAQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAMDCQAAAggFA2ludghmdW5jdGlvbgIRZmlsZUNlcnRpZmljYXRpb24GCQAAAggFA2ludghmdW5jdGlvbgIPY3JlYXRlQWdyZWVtZW50CQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAQDCQAAAggFA2ludghmdW5jdGlvbgISZW1haWxDZXJ0aWZpY2F0aW9uCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAMDCQAAAggFA2ludghmdW5jdGlvbgINc2lnbkFncmVlbWVudAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwACAwkAAAIIBQNpbnYIZnVuY3Rpb24CE3Jldm9rZUNlcnRpZmljYXRpb24JAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MAAQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tled/bqR8=", "height": 2141948, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6V2vdkxGFgXr9wFfc7fqV356JWo3s8dBv3YhmEYZG9PV Next: EgWXwdPZ3wgVer7b8GqNk4aCwTFNidQUGMKzvMNHvZH Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let storageVerifier = value(addressFromString("3N2s5RtaHPBenCsx2ECcoFRbYHx3noZhXW1"))
133133 let creditCost = if ((size(ipfs) != 0))
134134 then (1 + storageFeeMultiplier)
135135 else 1
136- if ((0 >= (callerIsWhiteListedNum - creditCost)))
136+ if ((0 > (callerIsWhiteListedNum - creditCost)))
137137 then throw("Not enough credit")
138138 else [StringEntry(uuid, toBase58String(id)), StringEntry((hash + uuid), toBase58String(id)), StringEntry((title + uuid), toBase58String(id)), IntegerEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - creditCost)), StringEntry(((("data_fc_" + toBase58String(id)) + "_") + callerAddress), data), ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken)]
139139 }
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let storageVerifier = value(addressFromString("3N2s5RtaHPBenCsx2ECcoFRbYHx3noZhXW1"))
55
66 let bank = "3N1E6tXddRoVaRfQ9dQ3vg5LaW2fsd8HKub"
77
88 let acceptedToken = base58'Gf9t8FA4H3ssoZPCwrg3KwUFCci8zuUFP9ssRsUY3s6a'
99
1010 let usdnID = "3KFXBGGLCjA5Z2DuW4Dq9fDDrHjJJP1ZEkaoajSzuKsC"
1111
1212 let storageFeeMultiplier = 1
1313
1414 func checkEntry (prefix,uuid) = match getString(this, (prefix + uuid)) {
1515 case a: String =>
1616 a
1717 case _ =>
1818 "NONE"
1919 }
2020
2121
2222 func checkEntryEmail (uuid,domain) = match getString(this, ((uuid + "@") + domain)) {
2323 case a: String =>
2424 a
2525 case _ =>
2626 "NONE"
2727 }
2828
2929
3030 func checkUUID (uuid) = match getString(this, uuid) {
3131 case a: String =>
3232 a
3333 case _ =>
3434 "NONE"
3535 }
3636
3737
3838 func checkIfWhiteListed (callerAddress) = match getInteger(this, ("addr_WHITELISTED_" + callerAddress)) {
3939 case a: Int =>
4040 a
4141 case _ =>
4242 0
4343 }
4444
4545
4646 func isAdress (addr) = if (if (if ((size(addr) == 35))
4747 then (take(addr, 2) == "3P")
4848 else false)
4949 then true
5050 else (take(addr, 2) == "3N"))
5151 then true
5252 else (take(addr, 2) == "3M")
5353
5454
5555 func countParties (accumulator,addr) = if ((size(addr) > 0))
5656 then (accumulator + 1)
5757 else (accumulator + 0)
5858
5959
6060 func checkIfPendingToSign (key) = match getString(this, key) {
6161 case a: String =>
6262 if ((a == "PENDING"))
6363 then true
6464 else false
6565 case _ =>
6666 false
6767 }
6868
6969
7070 func getValueString (json) = take(drop(json, 1), value(indexOf(drop(json, 1), "\"")))
7171
7272
7373 func getValue (json,key) = {
7474 let keyIndex = value(indexOf(json, (("\"" + key) + "\":")))
7575 let data = drop(json, ((keyIndex + size(key)) + 3))
7676 let jsonValue = getValueString(data)
7777 jsonValue
7878 }
7979
8080
8181 func getJsonBeforeValue (json,key) = {
8282 let keyIndex = value(indexOf(json, (("\"" + key) + "\":")))
8383 let data = take(json, ((keyIndex + size(key)) + 3))
8484 data
8585 }
8686
8787
8888 func getJsonAfterValue (json,key) = {
8989 let keyIndex = value(indexOf(json, (("\"" + key) + "\":")))
9090 let data = takeRight(json, (size(json) - ((((keyIndex + size(key)) + 3) + 0) + 2)))
9191 data
9292 }
9393
9494
9595 func asString (bv) = match bv {
9696 case bv0: String =>
9797 bv0
9898 case _ =>
9999 throw("Sponsored Public Key String expected")
100100 }
101101
102102
103103 @Callable(invoke)
104104 func fileCertification (hash,title,uuid,ipfs,signerPubKey) = {
105105 let id = value(invoke.transactionId)
106106 let entryExist = checkEntry(hash, uuid)
107107 let uuidExist = checkUUID(uuid)
108108 let callerIsDapp = (this == invoke.caller)
109109 let callerAddress = if (callerIsDapp)
110110 then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
111111 else toBase58String(invoke.caller.bytes)
112112 let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
113113 if ((entryExist != "NONE"))
114114 then throw("This entry already exist")
115115 else if ((uuidExist != "NONE"))
116116 then throw("This uuid already exist")
117117 else if ((size(uuid) != 36))
118118 then throw("Uuid should be 36 characters.")
119119 else if ((size(hash) != 64))
120120 then throw("Hash should be 64 characters.")
121121 else if ((size(title) > 100))
122122 then throw("Title is too long, 100 characters max.")
123123 else if (if (if (contains(hash, "\""))
124124 then true
125125 else contains(title, "\""))
126126 then true
127127 else contains(ipfs, "\""))
128128 then throw("No \" allowed")
129129 else {
130130 let data = (((((((("{\"hash\":\"" + hash) + "\",\"timestamp\":") + toString(lastBlock.timestamp)) + ",\"title\":\"") + title) + "\",\"ipfs\":\"") + ipfs) + "\"}")
131131 if ((callerIsWhiteListedNum > 0))
132132 then {
133133 let creditCost = if ((size(ipfs) != 0))
134134 then (1 + storageFeeMultiplier)
135135 else 1
136- if ((0 >= (callerIsWhiteListedNum - creditCost)))
136+ if ((0 > (callerIsWhiteListedNum - creditCost)))
137137 then throw("Not enough credit")
138138 else [StringEntry(uuid, toBase58String(id)), StringEntry((hash + uuid), toBase58String(id)), StringEntry((title + uuid), toBase58String(id)), IntegerEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - creditCost)), StringEntry(((("data_fc_" + toBase58String(id)) + "_") + callerAddress), data), ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken)]
139139 }
140140 else if (!(callerIsDapp))
141141 then {
142142 let payment = value(invoke.payments[0])
143143 let amount = value(payment.amount)
144144 let paymentAssetId = if (isDefined(payment.assetId))
145145 then value(payment.assetId)
146146 else throw("Waves is not accepted as payment")
147147 let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(value(paymentAssetId))))
148148 let feeCost = if ((size(ipfs) != 0))
149149 then (currentPrice + (storageFeeMultiplier * currentPrice))
150150 else currentPrice
151151 if ((acceptedToken != paymentAssetId))
152152 then throw("This token is not accepted at the moment")
153153 else if (if ((amount != feeCost))
154154 then (0 >= callerIsWhiteListedNum)
155155 else false)
156156 then throw("The price is wrong")
157157 else [StringEntry(uuid, toBase58String(id)), StringEntry((hash + uuid), toBase58String(id)), StringEntry((title + uuid), toBase58String(id)), StringEntry(((("data_fc_" + toBase58String(id)) + "_") + callerAddress), data), ScriptTransfer(addressFromStringValue(bank), feeCost, payment.assetId)]
158158 }
159159 else throw("You are not allowed to do that")
160160 }
161161 }
162162
163163
164164
165165 @Callable(invoke)
166166 func revokeCertification (certificationId,signerPubKey) = {
167167 let id = value(invoke.transactionId)
168168 let callerIsDapp = (this == invoke.caller)
169169 let callerAddress = if (callerIsDapp)
170170 then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
171171 else toBase58String(invoke.caller.bytes)
172172 let entryExist = match getString(this, ((("data_fc_" + certificationId) + "_") + callerAddress)) {
173173 case a: String =>
174174 a
175175 case _ =>
176176 "NONE"
177177 }
178178 let isRevoked = match getString(this, ("STATUS_FC_" + certificationId)) {
179179 case a: String =>
180180 a
181181 case _ =>
182182 "NONE"
183183 }
184184 let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
185185 let newJson = (((dropRight(entryExist, 1) + ",\"status\":\"REVOKED_") + toBase58String(id)) + "\"}")
186186 if ((isRevoked != "NONE"))
187187 then throw("This certification have already been revoked.")
188188 else if ((entryExist == "NONE"))
189189 then throw("You cannot change the status of this certification.")
190190 else if ((callerIsWhiteListedNum > 0))
191191 then [IntegerEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - 1)), StringEntry(("STATUS_FC_" + certificationId), ("REVOKED_" + toBase58String(id))), StringEntry(((("data_fc_" + certificationId) + "_") + callerAddress), newJson), ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken)]
192192 else if (!(callerIsDapp))
193193 then {
194194 let payment = value(invoke.payments[0])
195195 let amount = value(payment.amount)
196196 let paymentAssetId = if (isDefined(payment.assetId))
197197 then value(payment.assetId)
198198 else throw("Waves is not accepted as payment")
199199 let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(value(paymentAssetId))))
200200 if ((acceptedToken != paymentAssetId))
201201 then throw("This token is not accepted at the moment")
202202 else if (if ((amount != currentPrice))
203203 then (0 >= callerIsWhiteListedNum)
204204 else false)
205205 then throw("The price is wrong")
206206 else [StringEntry(("STATUS_FC_" + certificationId), ("REVOKED_" + toBase58String(id))), StringEntry(((("data_fc_" + certificationId) + "_") + callerAddress), newJson), ScriptTransfer(addressFromStringValue(bank), amount, payment.assetId)]
207207 }
208208 else throw("You are not allowed to do that")
209209 }
210210
211211
212212
213213 @Callable(invoke)
214214 func emailCertification (domain,title,uuid,signerPubKey) = {
215215 let id = value(invoke.transactionId)
216216 let entryExist = checkEntryEmail(domain, uuid)
217217 let uuidExist = checkUUID(uuid)
218218 let callerIsDapp = (this == invoke.caller)
219219 let callerAddress = if (callerIsDapp)
220220 then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
221221 else toBase58String(invoke.caller.bytes)
222222 let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
223223 if ((entryExist != "NONE"))
224224 then throw("This entry already exist")
225225 else if ((uuidExist != "NONE"))
226226 then throw("This uuid already exist")
227227 else if ((size(uuid) > 36))
228228 then throw("Uuid is too long, 36 characters max.")
229229 else if ((size(domain) > 150))
230230 then throw("Domain is too long, 150 characters max.")
231231 else if ((size(title) > 100))
232232 then throw("Title is too long, 100 characters max.")
233233 else if (if (if (contains(uuid, "\""))
234234 then true
235235 else contains(title, "\""))
236236 then true
237237 else contains(domain, "\""))
238238 then throw("No \" allowed")
239239 else {
240240 let data = (((((((("{\"messageid\":\"" + uuid) + "@") + domain) + "\",\"timestamp\":") + toString(lastBlock.timestamp)) + ",\"reference\":\"") + title) + "\"}")
241241 if ((callerIsWhiteListedNum > 0))
242242 then [StringEntry(uuid, toBase58String(id)), StringEntry(((uuid + "@") + domain), toBase58String(id)), StringEntry((title + uuid), toBase58String(id)), IntegerEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - 1)), StringEntry(((("data_ec_" + toBase58String(id)) + "_") + callerAddress), data), ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken)]
243243 else if (!(callerIsDapp))
244244 then {
245245 let payment = value(invoke.payments[0])
246246 let amount = value(payment.amount)
247247 let paymentAssetId = if (isDefined(payment.assetId))
248248 then value(payment.assetId)
249249 else throw("Waves is not accepted as payment")
250250 let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(value(paymentAssetId))))
251251 if ((acceptedToken != paymentAssetId))
252252 then throw("This token is not accepted at the moment")
253253 else if (if ((amount != currentPrice))
254254 then (0 >= callerIsWhiteListedNum)
255255 else false)
256256 then throw("The price is wrong")
257257 else [StringEntry(uuid, toBase58String(id)), StringEntry(((uuid + "@") + domain), toBase58String(id)), StringEntry((title + uuid), toBase58String(id)), StringEntry(((("data_ec_" + toBase58String(id)) + "_") + callerAddress), data), ScriptTransfer(addressFromStringValue(bank), amount, payment.assetId)]
258258 }
259259 else throw("You are not allowed to do that")
260260 }
261261 }
262262
263263
264264
265265 @Callable(invoke)
266266 func createAgreement (hash,title,stringifiedJSON,counterParts,signerPubKey,uuid) = {
267267 let id = value(invoke.transactionId)
268268 let entryExist = checkEntry(hash, uuid)
269269 let uuidExist = checkUUID(uuid)
270270 let callerIsDapp = (this == invoke.caller)
271271 let callerAddress = if (callerIsDapp)
272272 then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
273273 else toBase58String(invoke.caller.bytes)
274274 let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
275275 let JSON = ((((getJsonBeforeValue(stringifiedJSON, "creator") + "\"") + callerAddress) + "\"") + getJsonAfterValue(stringifiedJSON, "creator"))
276276 let addressesArray = split(counterParts, ",")
277277 let totalAddresses = size(addressesArray)
278278 let globalDataTitle = StringEntry((title + uuid), toBase58String(id))
279279 let globalDataHash = StringEntry((hash + uuid), toBase58String(id))
280280 let globalDataJson = StringEntry(((("data_MA_" + toBase58String(id)) + "_") + callerAddress), JSON)
281281 let globalDataOwner = StringEntry(((callerAddress + "_MA_") + toBase58String(id)), ("SIGNED_" + toBase58String(id)))
282282 let dataWhiteListed = IntegerEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - (totalAddresses + 1)))
283283 if ((entryExist != "NONE"))
284284 then throw("This entry already exist")
285285 else if ((uuidExist != "NONE"))
286286 then throw("This uuid already exist")
287287 else if ((size(uuid) > 36))
288288 then throw("Uuid is too long, 36 characters max.")
289289 else if ((size(hash) > 64))
290290 then throw("Message-id is too long, 64 characters max.")
291291 else if ((size(title) > 100))
292292 then throw("Title is too long, 100 characters max.")
293293 else if ((callerIsWhiteListedNum > 0))
294294 then if (((totalAddresses + 1) > callerIsWhiteListedNum))
295295 then throw("You don't have enough certification credit")
296296 else if ((totalAddresses == 6))
297297 then [globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, StringEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[4] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[5] + "_MA_") + toBase58String(id)), "PENDING"), ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[4]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[5]), 0, acceptedToken)]
298298 else if ((totalAddresses == 5))
299299 then [globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, StringEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[4] + "_MA_") + toBase58String(id)), "PENDING"), ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[4]), 0, acceptedToken)]
300300 else if ((totalAddresses == 4))
301301 then [globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, StringEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken)]
302302 else if ((totalAddresses == 3))
303303 then [globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, StringEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken)]
304304 else if ((totalAddresses == 2))
305305 then [globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, StringEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken)]
306306 else if ((totalAddresses == 1))
307307 then [globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, StringEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken)]
308308 else throw("Wrong number of participants")
309309 else if (!(callerIsDapp))
310310 then {
311311 let payment = value(invoke.payments[0])
312312 let amount = if (isDefined(payment.amount))
313313 then value(payment.amount)
314314 else 0
315315 let paymentAssetId = if (isDefined(payment.assetId))
316316 then value(payment.assetId)
317317 else acceptedToken
318318 let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(value(paymentAssetId))))
319319 if (((currentPrice * (totalAddresses + 1)) > amount))
320320 then throw(("The price is wrong, it should be " + toString((currentPrice * (totalAddresses + 1)))))
321321 else if ((totalAddresses == 6))
322322 then [globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, StringEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[4] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[5] + "_MA_") + toBase58String(id)), "PENDING"), ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[4]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[5]), 0, acceptedToken)]
323323 else if ((totalAddresses == 5))
324324 then [globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, StringEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[4] + "_MA_") + toBase58String(id)), "PENDING"), ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[4]), 0, acceptedToken)]
325325 else if ((totalAddresses == 4))
326326 then [globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, StringEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken)]
327327 else if ((totalAddresses == 3))
328328 then [globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, StringEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken)]
329329 else if ((totalAddresses == 2))
330330 then [globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, StringEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), StringEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken)]
331331 else if ((totalAddresses == 1))
332332 then [globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, StringEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken)]
333333 else throw(("Needs 1 to 6 recipient addresses, currently sent: " + toString(totalAddresses)))
334334 }
335335 else throw("You are not allowed to do that")
336336 }
337337
338338
339339
340340 @Callable(invoke)
341341 func signAgreement (hash,agreementId,signerPubKey) = {
342342 let payment = value(invoke.payments[0])
343343 let amount = value(payment.amount)
344344 let id = value(invoke.transactionId)
345345 let callerIsDapp = (this == invoke.caller)
346346 let signer = if (callerIsDapp)
347347 then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
348348 else toBase58String(invoke.caller.bytes)
349349 let signingRequestExist = checkIfPendingToSign(((signer + "_MA_") + agreementId))
350350 if (!(signingRequestExist))
351351 then throw("Sorry there is no pending signature")
352352 else [StringEntry(((signer + "_MA_") + agreementId), ("SIGNED_" + toBase58String(id))), ScriptTransfer(addressFromStringValue(signer), 0, acceptedToken)]
353353 }
354354
355355
356356
357357 @Callable(invoke)
358358 func usdnSignCredits () = {
359359 let payment = value(invoke.payments[0])
360360 let callerAddress = toBase58String(invoke.caller.bytes)
361361 let tokenId = value(payment.assetId)
362362 let amount = value(payment.amount)
363363 let numberOfCredits = ((amount * 2) / 1000000)
364364 let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
365365 if ((toBase58String(tokenId) != usdnID))
366366 then throw("Only USDN can be exchanged")
367367 else if (if (((amount % 1000000) != 0))
368368 then ((amount % 1000000) != 500000)
369369 else false)
370370 then throw(((("You can only exchange multiple of 0.5, you sent:" + dropRight(toString(amount), 6)) + ".") + takeRight(toString(amount), 6)))
371371 else [IntegerEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum + numberOfCredits)), ScriptTransfer(addressFromStringValue(bank), amount, tokenId)]
372372 }
373373
374374
375375 @Verifier(tx)
376376 func verifier () = match tx {
377377 case inv: InvokeScriptTransaction =>
378378 if (if ((inv.function == "fileCertification"))
379379 then true
380380 else (inv.function == "createAgreement"))
381381 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
382382 else if ((inv.function == "emailCertification"))
383383 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[3])))
384384 else if ((inv.function == "signAgreement"))
385385 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[2])))
386386 else if ((inv.function == "revokeCertification"))
387387 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[1])))
388388 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
389389 case _ =>
390390 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
391391 }
392392

github/deemru/w8io/6500d08 
108.51 ms