tx · 8mE9Moh8r8tvc8KXAErLDCj5eDwbRtXNfEfGSgxj3CRA

3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT:  -0.02400000 Waves

2022.10.20 14:10 [3346046] smart account 3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT > SELF 0.00000000 Waves

{ "type": 13, "id": "8mE9Moh8r8tvc8KXAErLDCj5eDwbRtXNfEfGSgxj3CRA", "fee": 2400000, "feeAssetId": null, "timestamp": 1666264142631, "version": 1, "sender": "3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT", "senderPublicKey": "2cFG5wZimjVSeCT8ZCRybx7Mzo5tJF879aw2b31uLRmR", "proofs": [ "2miSFA8qAmUEg5LNBgfaui7vfW3Uhn3D96mjSi8MBEuWqEXHbffdZCBHHMeHSuNznChpVCcxmVLsL7gfrj2P1zqX" ], "script": "base64:BgKRAQgCEgMKAQgSBAoCCAQSBQoDCAQIEgMKAQgSBAoCCAESABIAEgQKAggBEgQKAggBEgMKAQgSBAoCCAESAwoBCBIECgIIARIECgIIARIECgIIARIECgIBBBIFCgMIAQQSBAoCBAQSAwoBCBIECgIBBBIAEgQKAggEEgASBAoCCAESAwoBCBIAEgQKAggIEgMKAQg4AAtmYWN0b3JzQmFzZQDoBwEDZkNpAwV2YWx1ZQludW1lcmF0b3ILZGVub21pbmF0b3IEBGNhbmQJAGsDBQV2YWx1ZQUJbnVtZXJhdG9yBQtkZW5vbWluYXRvcgQBRACz5pOoCwQFZXhhY3QJAAACCQBqAgkAaAIJAGoCBQRjYW5kBQFECQBqAgULZGVub21pbmF0b3IFAUQFAUQJAGoCCQBoAgkAagIFBXZhbHVlBQFECQBqAgUJbnVtZXJhdG9yBQFEBQFEAwUFZXhhY3QFBGNhbmQJAGQCBQRjYW5kAAEBC3B1cmVBc3NldElkAQdhc3NldElkBAFpCQCRAwIJALUJAgUHYXNzZXRJZAIBXwAAAwkAAAIFAWkCBVdBVkVTBQR1bml0CQDZBAEFAWkBEHdyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIDbToxAQZhc0ludDMBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAg8oSW50LCBJbnQsIEludCkEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAgEyARFhc1VzZXJCYWxhbmNlRGF0YQEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACIihJbnQsIEludCwgSW50LCBJbnQsIEludCwgQm9vbGVhbikEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAgEzAAtjb25maWdTdG9yZQIGY29uZmlnAAVhVElkUwIIYVRva2VuSWQABGFJZFMCB2Fzc2V0SWQADWNvbmZpZ0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFC2NvbmZpZ1N0b3JlAAZsb2NrZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIJbHBfbG9ja2VyAh5ubyBscF9sb2NrZXIgYWRkcmVzcyBpbiBjb25maWcCH2JhZCBscF9sb2NrZXIgYWRkcmVzcyBpbiBjb25maWcAC3Jlc2VydmVzU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIQcHJpbWFyeV9yZXNlcnZlcwIWbm8gcmVzZXJ2ZXMgcmVnaXN0ZXJlZAAIcmVzZXJ2ZXMJALwJAgULcmVzZXJ2ZXNTdHICAXwAA2ViUgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCCmViX3Jld2FyZHMCDW5vIGViX3Jld2FyZHMAC3ZpcmVzTWludGVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDHZpcmVzX21pbnRlcgIUbWFpbjogbm8gdmlyZXNNaW50ZXICCmJhZCBtaW50ZXIAB21heWJldlMJAJ0IAgUNY29uZmlnQWRkcmVzcwIMdmlyZXNfc3Rha2VyAAJ2UwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQdtYXliZXZTAg9ubyB2aXJlc19zdGFrZXIAAmRDCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEmRpdmlkZW5kc19jb250cmFjdAIVbm8gZGl2aWRlbmRzX2NvbnRyYWN0AgdiYWQgZGl2AANtVkQEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIRdmlyZXNfZGlzdHJpYnV0b3IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFkBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFkBQR1bml0AAJWRAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQNtVkQCCG5vIGRpc3RyAAdsaW1pdGVyBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCB2xpbWl0ZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFkBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFkBQR1bml0ABFtYXliZVZpcmVzQXNzZXRJZAkAnQgCBQt2aXJlc01pbnRlcgUEYUlkUwAMdmlyZXNBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRFtYXliZVZpcmVzQXNzZXRJZAILbm8gdmlyZXMgaWQCEGludmFsaWQgdmlyZXMgaWQBDHZpcmVzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAAAAMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUMdmlyZXNBc3NldElkCQACAQIJbm90IHZpcmVzCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAEQYXNzZXRJZE9mUmVzZXJ2ZQEDcnNyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUDcnNyBQRhSWRTAhFubyBhc3NldElkIGluIHJzcgEQY29sbGF0ZXJhbEZhY3RvcgEDcnNyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwkArAICCQEQYXNzZXRJZE9mUmVzZXJ2ZQEFA3JzcgIRX0NvbGxhdGVyYWxGYWN0b3ICBG5vIDEBFGxpcXVpZGF0aW9uVGhyZXNob2xkAQNyc3IJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzCQCsAgIJARBhc3NldElkT2ZSZXNlcnZlAQUDcnNyAhVfTGlxdWlkYXRpb25UaHJlc2hvbGQCBG5vIDIAFmFjY291bnRIZWFsdGhUaHJlc2hvbGQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzAhhhY2NvdW50X2hlYWx0aF90aHJlc2hvbGQCBG5vIDQAFGFjY291bnRIZWFsdGhPdmVybGFwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwIWYWNjb3VudF9oZWFsdGhfb3ZlcmxhcAIEbm8gNQALbGlxdWlkYXRvcnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwILbGlxdWlkYXRvcnMCAAEJcmVzZXJ2ZUJ5AgVzdG9yZQV2YWx1ZQoBBGZvbGQCAWEBcgQHJG1hdGNoMAUBYQMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAVmb3VuZAUHJG1hdGNoMAUFZm91bmQEA3JzcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAXICD3JzciBiYWQgYWRkcmVzcwMJAAACCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUDcnNyBQVzdG9yZQkArAICAgtyc3IgaGFzIG5vIAUFc3RvcmUFBXZhbHVlBQNyc3IFBHVuaXQEByRtYXRjaDAKAAIkbAUIcmVzZXJ2ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQR1bml0CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQFZm91bmQFByRtYXRjaDAFBWZvdW5kCQACAQkArAICAgh1bmtub3duIAUFc3RvcmUBA3ZsUgEBcgMJAQhjb250YWlucwIFC3Jlc2VydmVzU3RyBQFyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUBcgINbWFpbjogYmFkIHJzcgkAAgEJAKwCAgIMdW5rbm93biByc3I6BQFyAQt1c2VyQmFsYW5jZQIDcnNyBHVzZXIJARFhc1VzZXJCYWxhbmNlRGF0YQEJAPwHBAUDcnNyAgt1c2VyQmFsYW5jZQkAzAgCBQR1c2VyBQNuaWwFA25pbAAObWF5YmVQcm90ZWN0ZWQEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIRcHJvdGVjdGVkX3Jlc2VydmUDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANwZHMFByRtYXRjaDAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQNwZHMCDWJhZCBwcm90ZWN0ZWQFBHVuaXQAEHByb3RlY3RlZFJlc2VydmUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUObWF5YmVQcm90ZWN0ZWQCEG5vIHByb3RlY3RlZCByc3IAHHByb2hpYml0ZWRDb2xsYXRlcmFsUmVzZXJ2ZXMEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIccHJvaGliaXRlZENvbGxhdGVyYWxSZXNlcnZlcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwIBfAUDbmlsAR1lbnN1cmVOb1Byb2hpYml0ZWRDb2xsYXRlcmFscwEEdXNlcgoBCGZvbGRGdW5jAgFhEXByb2hpYml0ZWRSZXNlcnZlBANhdGIJAQt2YWx1ZU9yRWxzZQIJAJoIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQURcHJvaGliaXRlZFJlc2VydmUJAKwCAgUEdXNlcgIOX2FUb2tlbkJhbGFuY2UAAAMJAGYCBQNhdGIAAQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgImb3BlcmF0aW9uIGRlbmllZDogdXNlciBoYXMgZGVwb3NpdCBpbiAFEXByb2hpYml0ZWRSZXNlcnZlAgI6IAkApAMBBQNhdGICCyhscCB0b2tlbnMpBgoAAiRsBRxwcm9oaWJpdGVkQ29sbGF0ZXJhbFJlc2VydmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwESZW5zdXJlTm9Qcm9oaWJpdGVkAwR1c2VyA2JwdQdyZXNlcnZlAwMJAAACBQNicHUAAAYJAQlpc0RlZmluZWQBCQDPCAIFHHByb2hpYml0ZWRDb2xsYXRlcmFsUmVzZXJ2ZXMFB3Jlc2VydmUGCQEdZW5zdXJlTm9Qcm9oaWJpdGVkQ29sbGF0ZXJhbHMBBQR1c2VyARFlbnN1cmVOb1Byb3RlY3RlZAEEdXNlcgQDaGFzBAckbWF0Y2gwBQ5tYXliZVByb3RlY3RlZAMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAJwYQUHJG1hdGNoMAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJwYQkArAICAhVwcm90ZWN0ZWRfY29sbGF0ZXJhbF8FBHVzZXIHBwMFA2hhcwkAAgECCmRpc2FsbG93ZWQFBHVuaXQBC2Vuc3VyZUxpbWl0BAZhY3Rpb24DcnNyBHVzZXIGYW1vdW50BAckbWF0Y2gwBQdsaW1pdGVyAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWwFByRtYXRjaDAJAQVhc0ludAEJAPwHBAUBbAINdmFsaWRhdGVMaW1pdAkAzAgCBQZhY3Rpb24JAMwIAgkApQgBBQNyc3IJAMwIAgUEdXNlcgkAzAgCBQZhbW91bnQFA25pbAUDbmlsBgEJdXNlclBvd2VyAQR1c2VyBBBwcm90ZWN0ZWREZXBvc2l0BAckbWF0Y2gwBQ5tYXliZVByb3RlY3RlZAMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAJwYQUHJG1hdGNoMAkBBWFzSW50AQkA/AcEBQJwYQILYm9ycm93UG93ZXIJAMwIAgUEdXNlcgUDbmlsBQNuaWwAAAoBBGZvbGQCBnRvdGFscwFyBAskdDA4Nzk4ODg0NAUGdG90YWxzBAZ0b3RhbEQIBQskdDA4Nzk4ODg0NAJfMQQGdG90YWxCCAULJHQwODc5ODg4NDQCXzIED251bWJlck9mQm9ycm93cwgFCyR0MDg3OTg4ODQ0Al8zBANyc3IJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQFyAg9yc3IgYmFkIGFkZHJlc3MEAmNmCQEQY29sbGF0ZXJhbEZhY3RvcgEFA3JzcgQCbHQJARRsaXF1aWRhdGlvblRocmVzaG9sZAEFA3JzcgQLJHQwODk5ODkwODIJAQt1c2VyQmFsYW5jZQIFA3JzcgUEdXNlcgQFdG9rZW4IBQskdDA4OTk4OTA4MgJfMQQFYXNzZXQIBQskdDA4OTk4OTA4MgJfMgQKZGVwb3NpdFVzZAgFCyR0MDg5OTg5MDgyAl8zBARkZWJ0CAULJHQwODk5ODkwODICXzQEB2RlYnRVc2QIBQskdDA4OTk4OTA4MgJfNQQMYXNDb2xsYXRlcmFsCAULJHQwODk5ODkwODICXzYEDHRvdGFsQm9ycm93cwkAZAIFD251bWJlck9mQm9ycm93cwMJAGYCBQRkZWJ0AAAAAQAABBNlZmZlY3RpdmVEZXBvc2l0VXNkAwUMYXNDb2xsYXRlcmFsBQpkZXBvc2l0VXNkAAAECm92ZXJsYXBVc2QJAJcDAQkAzAgCBQdkZWJ0VXNkCQDMCAIFE2VmZmVjdGl2ZURlcG9zaXRVc2QFA25pbAQNb3ZlcmxhcENoYXJnZQkBA2ZDaQMFCm92ZXJsYXBVc2QFFGFjY291bnRIZWFsdGhPdmVybGFwBQtmYWN0b3JzQmFzZQMJAGYCBQdkZWJ0VXNkBRNlZmZlY3RpdmVEZXBvc2l0VXNkCQCVCgMFBnRvdGFsRAkAZAIJAGQCBQZ0b3RhbEIJAGsDCQBlAgUHZGVidFVzZAUTZWZmZWN0aXZlRGVwb3NpdFVzZAULZmFjdG9yc0Jhc2UFAmx0BQ1vdmVybGFwQ2hhcmdlBQx0b3RhbEJvcnJvd3MJAJUKAwkAZAIFBnRvdGFsRAkAawMJAGUCBRNlZmZlY3RpdmVEZXBvc2l0VXNkBQdkZWJ0VXNkBQJjZgULZmFjdG9yc0Jhc2UJAGQCBQZ0b3RhbEIFDW92ZXJsYXBDaGFyZ2UFDHRvdGFsQm9ycm93cwQBcgoAAiRsBQhyZXNlcnZlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUQcHJvdGVjdGVkRGVwb3NpdAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAMDCQBmAgUQcHJvdGVjdGVkRGVwb3NpdAAACQBmAggFAXICXzMABAcJAAIBAh5jYW4ndCBoYXZlIG1vcmUgdGhhbiA0IGJvcnJvd3MFAXIBDWdldFVzZXJIZWFsdGgBB2FjY291bnQECyR0MDk4Mzc5ODg4CQEGYXNJbnQzAQkBCXVzZXJQb3dlcgEFB2FjY291bnQEAmJwCAULJHQwOTgzNzk4ODgCXzEEA2JwdQgFCyR0MDk4Mzc5ODg4Al8yBAZpZ25vcmUIBQskdDA5ODM3OTg4OAJfMwkArAICCQCsAgIJAKwCAgIDYnA6CQCkAwEFAmJwAgYsIGJwdToJAKQDAQUDYnB1AQ12YWxpZGF0ZUFmdGVyAgR1c2VyAm9wBA0kdDAxMDAwMDEwMDMxCQEJdXNlclBvd2VyAQUEdXNlcgQCYnAIBQ0kdDAxMDAwMDEwMDMxAl8xBANicHUIBQ0kdDAxMDAwMDEwMDMxAl8yBAlhY2NIZWFsdGgJAGkCCQBoAgkAZQIFAmJwBQNicHUFC2ZhY3RvcnNCYXNlBQJicAMDCQAAAgUCYnAAAAkAAAIFA2JwdQAABwAAAwMJAAACBQJicAAACQBmAgUDYnB1AAAHCQACAQkArAICCQCsAgIFAm9wAiw6IGJyZWFjaGluZyBsaXF1aWRhdGlvbiB0aHJlc2hvbGQoYnA9MCwgYnB1PQkApAMBBQNicHUDCQBmAgUWYWNjb3VudEhlYWx0aFRocmVzaG9sZAUJYWNjSGVhbHRoCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQJvcAIlOiBicmVhY2hpbmcgbGlxdWlkYXRpb24gdGhyZXNob2xkKGJwPQkApAMBBQJicAIGLCBicHU9CQCkAwEFA2JwdQIJLCBoZWFsdGg9CQCkAwEFCWFjY0hlYWx0aAIBKQUDYnB1AQJ1UwUDcnNyBmFjdGlvbgR1c2VyCnVzZXJDaGFuZ2UMc3RyZWFtQ2hhbmdlBAckbWF0Y2gwBQNtVkQDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAkA/AcEBQFhAghvbkFjdGlvbgkAzAgCBQNyc3IJAMwIAgUGYWN0aW9uCQDMCAIFBHVzZXIJAMwIAgUKdXNlckNoYW5nZQkAzAgCBQxzdHJlYW1DaGFuZ2UFA25pbAUDbmlsBQR1bml0AQptb3ZlU3RyZWFtBQNyc3IGYWN0aW9uBGZyb20Gc3RyaW5nA2FtdAQHJG1hdGNoMAUDbVZEAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAJAPwHBAUBYQIEbW92ZQkAzAgCBQNyc3IJAMwIAgUGYWN0aW9uCQDMCAIFBGZyb20JAMwIAgUGc3RyaW5nCQDMCAIFA2FtdAUDbmlsBQNuaWwFBHVuaXQBAnNSAQNyc3IEByRtYXRjaDAFA21WRAMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwCQD8BwQFAWECCnN5bmNIZWlnaHQJAMwIAgUDcnNyBQNuaWwFA25pbAUEdW5pdAEMbG9ja09yUGF5b3V0AwlyZWNpcGllbnQDYW10BGxvY2sDCQEBIQEFBGxvY2sJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUJcmVjaXBpZW50BQNhbXQFDHZpcmVzQXNzZXRJZAUDbmlsBAZkb0xvY2sJAPwHBAUCZEMCB2xvY2tGb3IJAMwIAgkApQgBBQlyZWNpcGllbnQJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHZpcmVzQXNzZXRJZAUDYW10BQNuaWwDCQAAAgUGZG9Mb2NrBQZkb0xvY2sFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEJZG9EZXBvc2l0AwFpA3JzcgVhc0NvbAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEBmNoZWNrcwkBEWVuc3VyZU5vUHJvdGVjdGVkAQUEdXNlcgMJAAACBQZjaGVja3MFBmNoZWNrcwQCc2gJAQJzUgEFA3JzcgMJAAACBQJzaAUCc2gEBmFjdGlvbgkA/AcECQEDdmxSAQUDcnNyAgpkZXBvc2l0Rm9yCQDMCAIFBHVzZXIJAMwIAgUFYXNDb2wFA25pbAgFAWkIcGF5bWVudHMDCQAAAgUGYWN0aW9uBQZhY3Rpb24EA2FtdAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEA3BSdwkBAnVTBQUDcnNyAgdkZXBvc2l0BQR1c2VyBQNhbXQFA2FtdAMJAAACBQNwUncFA3BSdwQCdmEDCQEBIQEFBWFzQ29sCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICCmRlcG9zaXRpbmcAAAMJAAACBQJ2YQUCdmEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAOcmV3YXJkUmVzZXJ2ZXMJALwJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCE3Jld2FyZGFibGVfcmVzZXJ2ZXMCCW5vIHN0cmluZwIBfAEWY2xhaW1BbGxSZXdhcmRzRm9yVXNlcgEEdXNlcgQJY2xhaW1lZEViCQEFYXNJbnQBCQD8BwQFA2ViUgIQY2xhaW1FYlJld2FyZEZvcgkAzAgCBQR1c2VyCQDMCAIA////////////AQUDbmlsBQNuaWwDCQAAAgUJY2xhaW1lZEViBQljbGFpbWVkRWIKAQRmb2xkAgNhY2MDcnNyBAdjbGFpbWVkCQEFYXNJbnQBCQD8BwQFAlZEAg5jbGFpbVJld2FyZEZvcgkAzAgCBQNyc3IJAMwIAgUEdXNlcgkAzAgCAP///////////wEFA25pbAUDbmlsAwkAAAIFB2NsYWltZWQFB2NsYWltZWQJAGQCBQNhY2MFB2NsYWltZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDGNsYWltZWRUb3RhbAoAAiRsBQ5yZXdhcmRSZXNlcnZlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUCQBkAgUMY2xhaW1lZFRvdGFsBQljbGFpbWVkRWIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BGGNsYWltQWxsTHBSZXdhcmRzRm9yVXNlcgEEdXNlcgoBBGZvbGQCA2FjYwNyc3IECGFUb2tlbklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUDcnNyBQVhVElkUwIWbm8gYVRva2VuSWQgaW4gcmVzZXJ2ZQQHY2xhaW1lZAkBBWFzSW50AQkA/AcEBQZsb2NrZXICEGNsYWltTHBSZXdhcmRGb3IJAMwIAgUEdXNlcgkAzAgCBQhhVG9rZW5JZAkAzAgCAP///////////wEFA25pbAUDbmlsAwkAAAIFB2NsYWltZWQFB2NsYWltZWQJAGQCBQNhY2MFB2NsYWltZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDGNsYWltZWRUb3RhbAoAAiRsBQ5yZXdhcmRSZXNlcnZlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBQxjbGFpbWVkVG90YWwBDm1vdmVDb2xsYXRlcmFsBARhZGRyCGFzc2V0U3RyA3JzcgpyZXNlcnZlU3RyBANhbXQJAQVhc0ludAEJAPwHBAUQcHJvdGVjdGVkUmVzZXJ2ZQIOd2l0aGRyYXdUb01haW4JAMwIAgUEYWRkcgkAzAgCBQhhc3NldFN0cgUDbmlsBQNuaWwDCQAAAgUDYW10BQNhbXQEA2RlcAkA/AcEBQNyc3ICCmRlcG9zaXRGb3IJAMwIAgUEYWRkcgkAzAgCBgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQELcHVyZUFzc2V0SWQBBQhhc3NldFN0cgUDYW10BQNuaWwDCQAAAgUDZGVwBQNkZXAEBHByb3AJAQJ1UwUFCnJlc2VydmVTdHICB2RlcG9zaXQFBGFkZHIFA2FtdAUDYW10AwkAAAIFBHByb3AFBHByb3AFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BBHNwZnIACQD8BwQFAmRDAhdzaGFyZVByb2ZpdEZyb21SZXNlcnZlcwUDbmlsBQNuaWwBCndkSW50ZXJuYWwEBHVzZXIDcnNyA2FtdAJvcAQCc2gJAQJzUgEJAKUIAQUDcnNyAwkAAAIFAnNoBQJzaAQPd2l0aGRyYXduQW1vdW50CQEFYXNJbnQBCQD8BwQFA3JzcgUCb3AJAMwIAgUEdXNlcgkAzAgCBQNhbXQFA25pbAUDbmlsAwkAAAIFD3dpdGhkcmF3bkFtb3VudAUPd2l0aGRyYXduQW1vdW50BANwUncJAQJ1UwUJAKUIAQUDcnNyAgdkZXBvc2l0BQR1c2VyCQEBLQEFD3dpdGhkcmF3bkFtb3VudAkBAS0BBQ93aXRoZHJhd25BbW91bnQDCQAAAgUDcFJ3BQNwUncEAWUJAQtlbnN1cmVMaW1pdAQCCHdpdGhkcmF3BQNyc3IFBHVzZXIFD3dpdGhkcmF3bkFtb3VudAMJAAACBQFlBQFlBQ93aXRoZHJhd25BbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BF3JlcGF5V2l0aEF0b2tlbkludGVybmFsAgR1c2VyB3BheW1lbnQECGFUb2tlbklkCQDYBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFB3BheW1lbnQHYXNzZXRJZAIeYmFkIGFzc2V0SWQ6IHdhdmVzIG5vdCBhbGxvd2VkBAF0CQEJcmVzZXJ2ZUJ5AgUFYVRJZFMFCGFUb2tlbklkBAJzaAkBAnNSAQkApQgBBQF0AwkAAAIFAnNoBQJzaAQDYW10CQEFYXNJbnQBCQD8BwQFAXQCHnJlcGxlbmlzaEZvclJlcGF5V2l0aEF0b2tlbkZvcgkAzAgCBQR1c2VyBQNuaWwJAMwIAgUHcGF5bWVudAUDbmlsAwkAAAIFA2FtdAUDYW10BAFjCQEFYXNJbnQBCQD8BwQFAXQCEWNvbGxhcHNlRm9yQW1vdW50CQDMCAIFBHVzZXIJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQFjBQFjAwkAZgIFA2FtdAUBYwkAAgECEXJlcGF5aW5nIHRvbyBtdWNoBANwUncJAQJ1UwUJAKUIAQUBdAIGYm9ycm93BQR1c2VyCQEBLQEFAWMJAQEtAQUBYwMJAAACBQNwUncFA3BSdwQEcFJ3MgkBAnVTBQkApQgBBQF0AgdkZXBvc2l0BQR1c2VyCQBlAgUDYW10BQFjCQEBLQEFAWMDCQAAAgUEcFJ3MgUEcFJ3MgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuHAFpAQppbml0aWFsaXplAQJjYQkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwIFC2NvbmZpZ1N0b3JlBQJjYQUDbmlsAWkBB2RlcG9zaXQCA3JzcgVhc0NvbAkBCWRvRGVwb3NpdAMFAWkFA3JzcgUFYXNDb2wBaQEKZGVwb3NpdFJlZgMDcnNyBWFzQ29sA3JlZgkBCWRvRGVwb3NpdAMFAWkFA3JzcgUFYXNDb2wBaQEFcmVwYXkBA3JzcgQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAnNoCQECc1IBBQNyc3IDCQAAAgUCc2gFAnNoBAZyZXBhaWQJAQVhc0ludAEJAPwHBAkBA3ZsUgEFA3JzcgIIcmVwYXlGb3IJAMwIAgUEdXNlcgUDbmlsCAUBaQhwYXltZW50cwMJAAACBQZyZXBhaWQFBnJlcGFpZAQDcFJ3CQECdVMFBQNyc3ICBmJvcnJvdwUEdXNlcgkBAS0BBQZyZXBhaWQJAQEtAQUGcmVwYWlkAwkAAAIFA3BSdwUDcFJ3BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKbWludEF0b2tlbgIIYVRva2VuSWQDYW10BAR1c2VyCQClCAEIBQFpBmNhbGxlcgQBdAkBCXJlc2VydmVCeQIFBWFUSWRTBQhhVG9rZW5JZAQCc2gJAQJzUgEJAKUIAQUBdAMJAAACBQJzaAUCc2gEBmFjdHVhbAkBBWFzSW50AQkA/AcEBQF0Ag1taW50QXRva2VuRm9yCQDMCAIFBHVzZXIJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQZhY3R1YWwFBmFjdHVhbAQDcFJ3CQECdVMFCQClCAEFAXQCB2RlcG9zaXQFBHVzZXIJAQEtAQUGYWN0dWFsAAADCQAAAgUDcFJ3BQNwUncEA2JwdQkBBWFzSW50AQkBDXZhbGlkYXRlQWZ0ZXICBQR1c2VyAgdtaW50aW5nAwkAAAIFA2JwdQUDYnB1BAJwYwkBEmVuc3VyZU5vUHJvaGliaXRlZAMFBHVzZXIFA2JwdQkApQgBBQF0AwkAAAIFAnBjBQJwYwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE3JlcGxlbmlzaFdpdGhBdG9rZW4ABAR1c2VyCQClCAEIBQFpBmNhbGxlcgQGY2hlY2tzCQERZW5zdXJlTm9Qcm90ZWN0ZWQBBQR1c2VyAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAhhVG9rZW5JZAkA2AQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIOYmFkIGFzc2V0SWQodykEA3JzcgkBCXJlc2VydmVCeQIFBWFUSWRTBQhhVG9rZW5JZAQCc2gJAQJzUgEJAKUIAQUDcnNyAwkAAAIFAnNoBQJzaAQDYW10CQEFYXNJbnQBCQD8BwQFA3JzcgIWcmVwbGVuaXNoV2l0aEF0b2tlbkZvcgkAzAgCBQR1c2VyBQNuaWwIBQFpCHBheW1lbnRzAwkAAAIFA2FtdAUDYW10BANwUncJAQJ1UwUJAKUIAQUDcnNyAgdkZXBvc2l0BQR1c2VyBQNhbXQAAAMJAAACBQNwUncFA3BSdwQBZQkBC2Vuc3VyZUxpbWl0BAIGaW1wb3J0BQNyc3IFBHVzZXIFA2FtdAMJAAACBQFlBQFlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENcmVkZWVtQXRva2VucwAEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAhhVG9rZW5JZAkA2AQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAISYmFkIGFzc2V0SWQ6IFdBVkVTBANyc3IJAQlyZXNlcnZlQnkCBQVhVElkUwUIYVRva2VuSWQEAnNoCQECc1IBCQClCAEFA3JzcgMJAAACBQJzaAUCc2gEA2FtdAkBBWFzSW50AQkA/AcEBQNyc3ICEHJlZGVlbUF0b2tlbnNGb3IJAMwIAgUEdXNlcgUDbmlsCAUBaQhwYXltZW50cwMJAAACBQNhbXQFA2FtdAQDcFJ3CQECdVMFCQClCAEFA3JzcgIHZGVwb3NpdAUEdXNlcgAACQEBLQEFA2FtdAMJAAACBQNwUncFA3BSdwQBZQkBC2Vuc3VyZUxpbWl0BAIGcmVkZWVtBQNyc3IFBHVzZXIFA2FtdAMJAAACBQFlBQFlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcCB2Fzc2V0SWQDYW10BAR1c2VyCQClCAEIBQFpBmNhbGxlcgQBcgkBCXJlc2VydmVCeQIFBGFJZFMFB2Fzc2V0SWQEBnJlc3VsdAkBBWFzSW50AQkBCndkSW50ZXJuYWwEBQR1c2VyBQFyBQNhbXQCC3dpdGhkcmF3Rm9yAwkAAAIFBnJlc3VsdAUGcmVzdWx0BANicHUJAQVhc0ludAEJAQ12YWxpZGF0ZUFmdGVyAgUEdXNlcgILd2l0aGRyYXdpbmcDCQAAAgUDYnB1BQNicHUEAnBjCQESZW5zdXJlTm9Qcm9oaWJpdGVkAwUEdXNlcgUDYnB1CQClCAEFAXIDCQAAAgUCcGMFAnBjCQCUCgIFA25pbAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXdpdGhkcmF3MgIDcnNyA2FtdAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAnNoCQECc1IBBQNyc3IDCQAAAgUCc2gFAnNoBAdyc3JBZGRyCQEDdmxSAQUDcnNyBAZhY3R1YWwJAQVhc0ludAEJAPwHBAUHcnNyQWRkcgILd2l0aGRyYXdGb3IJAMwIAgUEdXNlcgkAzAgCBQNhbXQFA25pbAUDbmlsAwkAAAIFBmFjdHVhbAUGYWN0dWFsBANwUncJAQJ1UwUFA3JzcgIHZGVwb3NpdAUEdXNlcgkBAS0BBQZhY3R1YWwJAQEtAQUGYWN0dWFsAwkAAAIFA3BSdwUDcFJ3BANicHUDCQEIY29udGFpbnMCBQtsaXF1aWRhdG9ycwUEdXNlcgAABAFlCQELZW5zdXJlTGltaXQEAgh3aXRoZHJhdwUHcnNyQWRkcgUEdXNlcgUGYWN0dWFsAwkAAAIFAWUFAWUJAQVhc0ludAEJAQ12YWxpZGF0ZUFmdGVyAgUEdXNlcgIMd2l0aGRyYXdpbmcyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAJwYwkBEmVuc3VyZU5vUHJvaGliaXRlZAMFBHVzZXIFA2JwdQUDcnNyAwkAAAIFAnBjBQJwYwkAlAoCBQNuaWwFBmFjdHVhbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFwcm90ZWN0Q29sbGF0ZXJhbAEDcnNyBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQBcgkBA3ZsUgEFA3JzcgQDYW10CQEFYXNJbnQBCQEKd2RJbnRlcm5hbAQFBHVzZXIFAXIA////////////AQIOd2l0aGRyYXdUb01haW4DCQAAAgUDYW10BQNhbXQECmFzc2V0SWRTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFAXIFBGFJZFMEAXAJAPwHBAUQcHJvdGVjdGVkUmVzZXJ2ZQIJc3VwcGx5Rm9yCQDMCAIFBHVzZXIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBC3B1cmVBc3NldElkAQUKYXNzZXRJZFN0cgUDYW10BQNuaWwDCQAAAgUBcAUBcAQCcGMJARJlbnN1cmVOb1Byb2hpYml0ZWQDBQR1c2VyCAkBCXVzZXJQb3dlcgEFBHVzZXICXzIFA3JzcgMJAAACBQJwYwUCcGMJAJQKAgUDbmlsBQNhbXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEbd2l0aGRyYXdQcm90ZWN0ZWRDb2xsYXRlcmFsAgdhc3NldElkA2FtdAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAWEJAQVhc0ludAEJAPwHBAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRBwcm90ZWN0ZWRSZXNlcnZlAhNubyBwcm90ZWN0ZWRSZXNlcnZlAgt3aXRoZHJhd0ZvcgkAzAgCBQR1c2VyCQDMCAIFB2Fzc2V0SWQJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQFhBQFhBAJ2YQkBDXZhbGlkYXRlQWZ0ZXICBQR1c2VyAhV3aXRoZHJhd2luZyBwcm90ZWN0ZWQDCQAAAgUCdmEFAnZhBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETbm9ybWFsaXplQ29sbGF0ZXJhbAEDcnNyBARhZGRyCQClCAEIBQFpBmNhbGxlcgQCckEJAQN2bFIBBQNyc3IDCQAAAgUCckEFAnJBBAJzaAkBAnNSAQUDcnNyAwkAAAIFAnNoBQJzaAQKYXNzZXRJZFN0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFAnJBBQRhSWRTCQCsAgICE25vIGFzc2V0SWQgaW4gcnN2OiAFA3JzcgQCbWMJAQ5tb3ZlQ29sbGF0ZXJhbAQFBGFkZHIFCmFzc2V0SWRTdHIFAnJBBQNyc3IDCQAAAgUCbWMFAm1jBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEGYm9ycm93Agdhc3NldElkA2FtdAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEA3JzcgkBCXJlc2VydmVCeQIFBGFJZFMFB2Fzc2V0SWQEAnNoCQECc1IBCQClCAEFA3JzcgMJAAACBQJzaAUCc2gEAWEJAPwHBAUDcnNyAglib3Jyb3dGb3IJAMwIAgUEdXNlcgkAzAgCBQNhbXQFA25pbAUDbmlsAwkAAAIFAWEFAWEEA3BSdwkBAnVTBQkApQgBBQNyc3ICBmJvcnJvdwUEdXNlcgUDYW10BQNhbXQDCQAAAgUDcFJ3BQNwUncEAWUJAQtlbnN1cmVMaW1pdAQCBmJvcnJvdwUDcnNyBQR1c2VyBQNhbXQDCQAAAgUBZQUBZQQDYnB1CQEFYXNJbnQBCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICCWJvcnJvd2luZwMJAAACBQNicHUFA2JwdQQCcGMJAR1lbnN1cmVOb1Byb2hpYml0ZWRDb2xsYXRlcmFscwEFBHVzZXIDCQAAAgUCcGMFAnBjBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHYm9ycm93MgIDcnNyA2FtdAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAXIJAQN2bFIBBQNyc3IEAnNoCQECc1IBBQNyc3IDCQAAAgUCc2gFAnNoBAFhCQD8BwQFAXICCWJvcnJvd0ZvcgkAzAgCBQR1c2VyCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUBYQUBYQQDcFJ3CQECdVMFBQNyc3ICBmJvcnJvdwUEdXNlcgUDYW10BQNhbXQDCQAAAgUDcFJ3BQNwUncEAWUJAQtlbnN1cmVMaW1pdAQCBmJvcnJvdwUBcgUEdXNlcgUDYW10AwkAAAIFAWUFAWUEA2JwdQkBBWFzSW50AQkBDXZhbGlkYXRlQWZ0ZXICBQR1c2VyAglib3Jyb3dpbmcDCQAAAgUDYnB1BQNicHUEAnBjCQEdZW5zdXJlTm9Qcm9oaWJpdGVkQ29sbGF0ZXJhbHMBBQR1c2VyAwkAAAIFAnBjBQJwYwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGNvbGxhcHNlAgNyc3IDYW10BAR1c2VyCQClCAEIBQFpBmNhbGxlcgQCc2gJAQJzUgEFA3JzcgMJAAACBQJzaAUCc2gEAWMJAQVhc0ludAEJAPwHBAkBA3ZsUgEFA3JzcgIRY29sbGFwc2VGb3JBbW91bnQJAMwIAgUEdXNlcgkAzAgCBQNhbXQFA25pbAUDbmlsAwkAAAIFAWMFAWMEA3BSdwkBAnVTBQUDcnNyAgZib3Jyb3cFBHVzZXIJAQEtAQUBYwkBAS0BBQFjAwkAAAIFA3BSdwUDcFJ3BARwUncyCQECdVMFBQNyc3ICB2RlcG9zaXQFBHVzZXIJAQEtAQUBYwkBAS0BBQFjAwkAAAIFBHBSdzIFBHBSdzIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jbGFpbUViUmV3YXJkMgIDYW10BGxvY2sEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAFjCQEFYXNJbnQBCQD8BwQFA2ViUgIQY2xhaW1FYlJld2FyZEZvcgkAzAgCBQR1c2VyCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUBYwUBYwkBDGxvY2tPclBheW91dAMIBQFpBmNhbGxlcgUBYwUEbG9jawkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxjbGFpbVJld2FyZDIDA3JzcgNhbXQEbG9jawQBdgkBA3ZsUgEFA3JzcgMJAAACBQF2BQF2BAR1c2VyCQClCAEIBQFpBmNhbGxlcgQBYwkBBWFzSW50AQkA/AcEBQJWRAIOY2xhaW1SZXdhcmRGb3IJAMwIAgUDcnNyCQDMCAIFBHVzZXIJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQFjBQFjCQEMbG9ja09yUGF5b3V0AwgFAWkGY2FsbGVyBQFjBQRsb2NrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBIWNsYWltQWxsUmV3YXJkc0FuZEFsbEViQXZhaWxhYmxlMgIEbG9jaw11bnN0YWtlTGVnYWN5BAR1c2VyCQClCAEIBQFpBmNhbGxlcgQCY3IJARZjbGFpbUFsbFJld2FyZHNGb3JVc2VyAQUEdXNlcgMJAAACBQJjcgUCY3IEBGNyTHAJARhjbGFpbUFsbExwUmV3YXJkc0ZvclVzZXIBBQR1c2VyAwkAAAIFBGNyTHAFBGNyTHAEAmxBAwUNdW5zdGFrZUxlZ2FjeQkBBWFzSW50AQkA/AcEBQJ2UwITdW5zdGFrZUFsbFZpcmVzRnJvbQkAzAgCBQR1c2VyBQNuaWwFA25pbAAAAwkAAAIFAmxBBQJsQQkBDGxvY2tPclBheW91dAMIBQFpBmNhbGxlcgkAZAIJAGQCBQJjcgUEY3JMcAUCbEEFBGxvY2sJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEWZGlzYWJsZVVzZUFzQ29sbGF0ZXJhbAEDcnNyBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQBZAkA/AcECQEDdmxSAQUDcnNyAhlkaXNhYmxlVXNlQXNDb2xsYXRlcmFsRm9yCQDMCAIFBHVzZXIFA25pbAUDbmlsAwkAAAIFAWQFAWQEAnZhCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICGmNoYW5naW5nIGNvbGxhdGVyYWwgc3RhdHVzAwkAAAIFAnZhBQJ2YQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWxvY2tWaXJlcwIGZmFjdG9yB21pZ3JhdGUEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAFhCQEEc3BmcgADCQAAAgUBYQUBYQQNbWlncmF0ZUFtb3VudAMFB21pZ3JhdGUJAQVhc0ludAEJAPwHBAUCdlMCE3Vuc3Rha2VBbGxWaXJlc0Zyb20JAMwIAgUEdXNlcgUDbmlsBQNuaWwAAAQFdG90YWwJAGQCBQ1taWdyYXRlQW1vdW50CQEMdmlyZXNQYXltZW50AQUBaQQBbAkA/AcEBQJkQwIHbG9ja0ZvcgkAzAgCBQR1c2VyCQDMCAIFBmZhY3RvcgUDbmlsAwkAAAIFBXRvdGFsAAAFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMdmlyZXNBc3NldElkBQV0b3RhbAUDbmlsAwkAAAIFAWwFAWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARh3aXRoZHJhd0FsbFBvc3NpYmxlVmlyZXMABAR1c2VyCQClCAEIBQFpBmNhbGxlcgQBYQkBBHNwZnIAAwkAAAIFAWEFAWEEEXN0YWtlclZpcmVzQW1vdW50CQEFYXNJbnQBCQD8BwQFAnZTAhN1bnN0YWtlQWxsVmlyZXNGcm9tCQDMCAIFBHVzZXIFA25pbAUDbmlsAwkAAAIFEXN0YWtlclZpcmVzQW1vdW50BRFzdGFrZXJWaXJlc0Ftb3VudAQBdQkA/AcEBQJkQwITd2l0aGRyYXdVbmxvY2tlZEZvcgkAzAgCBQR1c2VyBQNuaWwFA25pbAMJAAACBQF1BQF1CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgURc3Rha2VyVmlyZXNBbW91bnQFDHZpcmVzQXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF2NsYWltUHJvdG9jb2xQcm9maXRGcm9tAgRmcm9tBnJlbG9jawQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAWEJAQRzcGZyAAMJAAACBQFhBQFhBAF1CQD8BwQFAmRDAgtjbGFpbVByb2ZpdAkAzAgCBQRmcm9tCQDMCAIFBHVzZXIJAMwIAgUGcmVsb2NrBQNuaWwFA25pbAMJAAACBQF1BQF1BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVd2l0aGRyYXdVbmxvY2tlZFZpcmVzAAQBYQkBBHNwZnIAAwkAAAIFAWEFAWEEAXUJAPwHBAUCZEMCE3dpdGhkcmF3VW5sb2NrZWRGb3IJAMwIAgkApQgBCAUBaQZjYWxsZXIFA25pbAUDbmlsAwkAAAIFAXUFAXUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpsb2NrU3VwcGx5AgdyZXNlcnZlBnBlcmlvZAQDcnNyCQEDdmxSAQUHcmVzZXJ2ZQQEdXNlcgkApQgBCAUBaQZjYWxsZXIEBmNoZWNrcwkBEWVuc3VyZU5vUHJvdGVjdGVkAQUEdXNlcgMJAAACBQZjaGVja3MFBmNoZWNrcwQIYVRva2VuSWQJAQV2YWx1ZQEJAQtwdXJlQXNzZXRJZAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQNyc3ICCGFUb2tlbklkAhZubyBhVG9rZW5JZCBpbiByZXNlcnZlBAltaWdyYXRpb24DCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABQR1bml0AwkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUIYVRva2VuSWQFBHVuaXQDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkCQELcHVyZUFzc2V0SWQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUDcnNyBQRhSWRTAhVubyBhc3NldElkIGluIHJlc2VydmUEAnNoCQECc1IBBQdyZXNlcnZlAwkAAAIFAnNoBQJzaAQGYWN0aW9uCQD8BwQFA3JzcgIKZGVwb3NpdEZvcgkAzAgCBQR1c2VyCQDMCAIGBQNuaWwIBQFpCHBheW1lbnRzAwkAAAIFBmFjdGlvbgUGYWN0aW9uBANhbXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BANwUncJAQJ1UwUFB3Jlc2VydmUCB2RlcG9zaXQFBHVzZXIFA2FtdAUDYW10AwkAAAIFA3BSdwUDcFJ3BQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQISYmFkIGFzc2V0IGF0dGFjaGVkAwkAAAIFCW1pZ3JhdGlvbgUJbWlncmF0aW9uBARtaW50BAJzaAkBAnNSAQUHcmVzZXJ2ZQMJAAACBQJzaAUCc2gEBmFjdHVhbAkBBWFzSW50AQkA/AcEBQNyc3ICD21pbnRBdG9rZW5Gb3JUbwkAzAgCBQR1c2VyCQDMCAIA////////////AQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAAIFBmFjdHVhbAUGYWN0dWFsBANwUncJAQJ1UwUJAKUIAQUDcnNyAgdkZXBvc2l0BQR1c2VyCQEBLQEFBmFjdHVhbAAAAwkAAAIFA3BSdwUDcFJ3BAJ2YQkBDXZhbGlkYXRlQWZ0ZXICBQR1c2VyAgxsb2NrLW1pbnRpbmcDCQAAAgUCdmEFAnZhBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUEbWludAUEbWludAQHYmFsYW5jZQkA8AcCBQR0aGlzBQhhVG9rZW5JZAQBcgkA/AcEBQZsb2NrZXICBmxvY2tMUAkAzAgCBQR1c2VyCQDMCAIFBnBlcmlvZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQhhVG9rZW5JZAUHYmFsYW5jZQUDbmlsAwkAAAIFAXIFAXIJAJQKAgUDbmlsBQdiYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnJlcGF5V2l0aEF0b2tlbkZvcgEEdXNlcgQGY2hlY2tzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQR1c2VyCQACAQIIYmFkIHVzZXIGAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQEXcmVwYXlXaXRoQXRva2VuSW50ZXJuYWwCBQR1c2VyCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEPcmVwYXlXaXRoQXRva2VuAAkBF3JlcGF5V2l0aEF0b2tlbkludGVybmFsAgkApQgBCAUBaQZjYWxsZXIJAJEDAggFAWkIcGF5bWVudHMAAAFpAQhyZXBheUZvcgIDcnNyBHVzZXIEBmNoZWNrcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUEdXNlcgkAAgECCGJhZCB1c2VyBgMJAAACBQZjaGVja3MFBmNoZWNrcwQCc2gJAQJzUgEFA3JzcgMJAAACBQJzaAUCc2gEBnJlcGFpZAkBBWFzSW50AQkA/AcECQEDdmxSAQUDcnNyAghyZXBheUZvcgkAzAgCBQR1c2VyBQNuaWwIBQFpCHBheW1lbnRzAwkAAAIFBnJlcGFpZAUGcmVwYWlkBANwUncJAQJ1UwUFA3JzcgIGYm9ycm93BQR1c2VyCQEBLQEFBnJlcGFpZAkBAS0BBQZyZXBhaWQDCQAAAgUDcFJ3BQNwUncFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhoZWFsdGhPZgEHYWRkcmVzcwQNJHQwMjM2OTcyMzc0OAkBBmFzSW50MwEJAQl1c2VyUG93ZXIBBQdhZGRyZXNzBAJicAgFDSR0MDIzNjk3MjM3NDgCXzEEA2JwdQgFDSR0MDIzNjk3MjM3NDgCXzIEBmlnbm9yZQgFDSR0MDIzNjk3MjM3NDgCXzMJAJQKAgUDbmlsCQCUCgIFAmJwBQNicHUAPrNqPQ==", "chainId": 87, "height": 3346046, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BYjd8roFCLG4PvvpcPxAAAcEKrQz6wD49FxCfEFknPi9 Next: CxRfKXFLXxuujk4SB2D59HhyvCQeXy4WdMeKvNvpuwGo Diff:
OldNewDifferences
174174 func ensureNoProhibitedCollaterals (user) = {
175175 func foldFunc (a,prohibitedReserve) = {
176176 let atb = valueOrElse(getInteger(addressFromStringValue(prohibitedReserve), (user + "_aTokenBalance")), 0)
177- if ((atb > 0))
177+ if ((atb > 1))
178178 then throw((((("operation denied: user has deposit in " + prohibitedReserve) + ": ") + toString(atb)) + "(lp tokens)"))
179179 else true
180180 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let factorsBase = 1000
55
66 func fCi (value,numerator,denominator) = {
77 let cand = fraction(value, numerator, denominator)
88 let D = 3037000499
99 let exact = ((((cand % D) * (denominator % D)) % D) == (((value % D) * (numerator % D)) % D))
1010 if (exact)
1111 then cand
1212 else (cand + 1)
1313 }
1414
1515
1616 func pureAssetId (assetId) = {
1717 let i = split(assetId, "_")[0]
1818 if ((i == "WAVES"))
1919 then unit
2020 else fromBase58String(i)
2121 }
2222
2323
2424 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
2525 then StringEntry(key, value)
2626 else throw(("already initialized: " + key))
2727
2828
2929 func asInt (value) = match value {
3030 case int: Int =>
3131 int
3232 case _ =>
3333 throw("m:1")
3434 }
3535
3636
3737 func asInt3 (value) = match value {
3838 case x: (Int, Int, Int) =>
3939 x
4040 case t =>
4141 throw("2")
4242 }
4343
4444
4545 func asUserBalanceData (value) = match value {
4646 case x: (Int, Int, Int, Int, Int, Boolean) =>
4747 x
4848 case t =>
4949 throw("3")
5050 }
5151
5252
5353 let configStore = "config"
5454
5555 let aTIdS = "aTokenId"
5656
5757 let aIdS = "assetId"
5858
5959 let configAddress = addressFromStringValue(getStringValue(this, configStore))
6060
6161 let locker = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "lp_locker"), "no lp_locker address in config")), "bad lp_locker address in config")
6262
6363 let reservesStr = valueOrErrorMessage(getString(configAddress, "primary_reserves"), "no reserves registered")
6464
6565 let reserves = split_4C(reservesStr, "|")
6666
6767 let ebR = addressFromStringValue(valueOrErrorMessage(getString(configAddress, "eb_rewards"), "no eb_rewards"))
6868
6969 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_minter"), "main: no viresMinter")), "bad minter")
7070
7171 let maybevS = getString(configAddress, "vires_staker")
7272
7373 let vS = addressFromStringValue(valueOrErrorMessage(maybevS, "no vires_staker"))
7474
7575 let dC = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "bad div")
7676
7777 let mVD = match getString(configAddress, "vires_distributor") {
7878 case d: String =>
7979 addressFromStringValue(d)
8080 case _ =>
8181 unit
8282 }
8383
8484 let VD = valueOrErrorMessage(mVD, "no distr")
8585
8686 let limiter = match getString(configAddress, "limiter") {
8787 case d: String =>
8888 addressFromStringValue(d)
8989 case _ =>
9090 unit
9191 }
9292
9393 let maybeViresAssetId = getString(viresMinter, aIdS)
9494
9595 let viresAssetId = valueOrErrorMessage(fromBase58String(valueOrErrorMessage(maybeViresAssetId, "no vires id")), "invalid vires id")
9696
9797 func viresPayment (i) = if ((size(i.payments) == 0))
9898 then 0
9999 else if ((i.payments[0].assetId != viresAssetId))
100100 then throw("not vires")
101101 else i.payments[0].amount
102102
103103
104104 func assetIdOfReserve (rsr) = valueOrErrorMessage(getString(rsr, aIdS), "no assetId in rsr")
105105
106106
107107 func collateralFactor (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_CollateralFactor")), "no 1")
108108
109109
110110 func liquidationThreshold (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_LiquidationThreshold")), "no 2")
111111
112112
113113 let accountHealthThreshold = valueOrErrorMessage(getInteger(configAddress, "account_health_threshold"), "no 4")
114114
115115 let accountHealthOverlap = valueOrErrorMessage(getInteger(configAddress, "account_health_overlap"), "no 5")
116116
117117 let liquidators = valueOrElse(getString(configAddress, "liquidators"), "")
118118
119119 func reserveBy (store,value) = {
120120 func fold (a,r) = match a {
121121 case found: Address =>
122122 found
123123 case _ =>
124124 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
125125 if ((valueOrErrorMessage(getString(rsr, store), ("rsr has no " + store)) == value))
126126 then rsr
127127 else unit
128128 }
129129
130130 match let $l = reserves
131131 let $s = size($l)
132132 let $acc0 = unit
133133 func $f0_1 ($a,$i) = if (($i >= $s))
134134 then $a
135135 else fold($a, $l[$i])
136136
137137 func $f0_2 ($a,$i) = if (($i >= $s))
138138 then $a
139139 else throw("List size exceeds 20")
140140
141141 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20) {
142142 case found: Address =>
143143 found
144144 case _ =>
145145 throw(("unknown " + store))
146146 }
147147 }
148148
149149
150150 func vlR (r) = if (contains(reservesStr, r))
151151 then valueOrErrorMessage(addressFromString(r), "main: bad rsr")
152152 else throw(("unknown rsr:" + r))
153153
154154
155155 func userBalance (rsr,user) = asUserBalanceData(invoke(rsr, "userBalance", [user], nil))
156156
157157
158158 let maybeProtected = match getString(configAddress, "protected_reserve") {
159159 case pds: String =>
160160 valueOrErrorMessage(addressFromString(pds), "bad protected")
161161 case _ =>
162162 unit
163163 }
164164
165165 let protectedReserve = valueOrErrorMessage(maybeProtected, "no protected rsr")
166166
167167 let prohibitedCollateralReserves = match getString(configAddress, "prohibitedCollateralReserves") {
168168 case s: String =>
169169 split(s, "|")
170170 case _ =>
171171 nil
172172 }
173173
174174 func ensureNoProhibitedCollaterals (user) = {
175175 func foldFunc (a,prohibitedReserve) = {
176176 let atb = valueOrElse(getInteger(addressFromStringValue(prohibitedReserve), (user + "_aTokenBalance")), 0)
177- if ((atb > 0))
177+ if ((atb > 1))
178178 then throw((((("operation denied: user has deposit in " + prohibitedReserve) + ": ") + toString(atb)) + "(lp tokens)"))
179179 else true
180180 }
181181
182182 let $l = prohibitedCollateralReserves
183183 let $s = size($l)
184184 let $acc0 = true
185185 func $f0_1 ($a,$i) = if (($i >= $s))
186186 then $a
187187 else foldFunc($a, $l[$i])
188188
189189 func $f0_2 ($a,$i) = if (($i >= $s))
190190 then $a
191191 else throw("List size exceeds 15")
192192
193193 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
194194 }
195195
196196
197197 func ensureNoProhibited (user,bpu,reserve) = if (if ((bpu == 0))
198198 then true
199199 else isDefined(indexOf(prohibitedCollateralReserves, reserve)))
200200 then true
201201 else ensureNoProhibitedCollaterals(user)
202202
203203
204204 func ensureNoProtected (user) = {
205205 let has = match maybeProtected {
206206 case pa: Address =>
207207 valueOrElse(getBoolean(pa, ("protected_collateral_" + user)), false)
208208 case _ =>
209209 false
210210 }
211211 if (has)
212212 then throw("disallowed")
213213 else unit
214214 }
215215
216216
217217 func ensureLimit (action,rsr,user,amount) = match limiter {
218218 case l: Address =>
219219 asInt(invoke(l, "validateLimit", [action, toString(rsr), user, amount], nil))
220220 case _ =>
221221 true
222222 }
223223
224224
225225 func userPower (user) = {
226226 let protectedDeposit = match maybeProtected {
227227 case pa: Address =>
228228 asInt(invoke(pa, "borrowPower", [user], nil))
229229 case _ =>
230230 0
231231 }
232232 func fold (totals,r) = {
233233 let $t087988844 = totals
234234 let totalD = $t087988844._1
235235 let totalB = $t087988844._2
236236 let numberOfBorrows = $t087988844._3
237237 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
238238 let cf = collateralFactor(rsr)
239239 let lt = liquidationThreshold(rsr)
240240 let $t089989082 = userBalance(rsr, user)
241241 let token = $t089989082._1
242242 let asset = $t089989082._2
243243 let depositUsd = $t089989082._3
244244 let debt = $t089989082._4
245245 let debtUsd = $t089989082._5
246246 let asCollateral = $t089989082._6
247247 let totalBorrows = (numberOfBorrows + (if ((debt > 0))
248248 then 1
249249 else 0))
250250 let effectiveDepositUsd = if (asCollateral)
251251 then depositUsd
252252 else 0
253253 let overlapUsd = min([debtUsd, effectiveDepositUsd])
254254 let overlapCharge = fCi(overlapUsd, accountHealthOverlap, factorsBase)
255255 if ((debtUsd > effectiveDepositUsd))
256256 then $Tuple3(totalD, ((totalB + fraction((debtUsd - effectiveDepositUsd), factorsBase, lt)) + overlapCharge), totalBorrows)
257257 else $Tuple3((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge), totalBorrows)
258258 }
259259
260260 let r = {
261261 let $l = reserves
262262 let $s = size($l)
263263 let $acc0 = $Tuple3(protectedDeposit, 0, 0)
264264 func $f0_1 ($a,$i) = if (($i >= $s))
265265 then $a
266266 else fold($a, $l[$i])
267267
268268 func $f0_2 ($a,$i) = if (($i >= $s))
269269 then $a
270270 else throw("List size exceeds 20")
271271
272272 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
273273 }
274274 if (if ((protectedDeposit > 0))
275275 then (r._3 > 4)
276276 else false)
277277 then throw("can't have more than 4 borrows")
278278 else r
279279 }
280280
281281
282282 func getUserHealth (account) = {
283283 let $t098379888 = asInt3(userPower(account))
284284 let bp = $t098379888._1
285285 let bpu = $t098379888._2
286286 let ignore = $t098379888._3
287287 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
288288 }
289289
290290
291291 func validateAfter (user,op) = {
292292 let $t01000010031 = userPower(user)
293293 let bp = $t01000010031._1
294294 let bpu = $t01000010031._2
295295 let accHealth = (((bp - bpu) * factorsBase) / bp)
296296 if (if ((bp == 0))
297297 then (bpu == 0)
298298 else false)
299299 then 0
300300 else if (if ((bp == 0))
301301 then (bpu > 0)
302302 else false)
303303 then throw(((op + ": breaching liquidation threshold(bp=0, bpu=") + toString(bpu)))
304304 else if ((accountHealthThreshold > accHealth))
305305 then throw((((((((op + ": breaching liquidation threshold(bp=") + toString(bp)) + ", bpu=") + toString(bpu)) + ", health=") + toString(accHealth)) + ")"))
306306 else bpu
307307 }
308308
309309
310310 func uS (rsr,action,user,userChange,streamChange) = match mVD {
311311 case a: Address =>
312312 invoke(a, "onAction", [rsr, action, user, userChange, streamChange], nil)
313313 case _ =>
314314 unit
315315 }
316316
317317
318318 func moveStream (rsr,action,from,string,amt) = match mVD {
319319 case a: Address =>
320320 invoke(a, "move", [rsr, action, from, string, amt], nil)
321321 case _ =>
322322 unit
323323 }
324324
325325
326326 func sR (rsr) = match mVD {
327327 case a: Address =>
328328 invoke(a, "syncHeight", [rsr], nil)
329329 case _ =>
330330 unit
331331 }
332332
333333
334334 func lockOrPayout (recipient,amt,lock) = if (!(lock))
335335 then [ScriptTransfer(recipient, amt, viresAssetId)]
336336 else {
337337 let doLock = invoke(dC, "lockFor", [toString(recipient), 1], [AttachedPayment(viresAssetId, amt)])
338338 if ((doLock == doLock))
339339 then nil
340340 else throw("Strict value is not equal to itself.")
341341 }
342342
343343
344344 func doDeposit (i,rsr,asCol) = {
345345 let user = toString(i.caller)
346346 let checks = ensureNoProtected(user)
347347 if ((checks == checks))
348348 then {
349349 let sh = sR(rsr)
350350 if ((sh == sh))
351351 then {
352352 let action = invoke(vlR(rsr), "depositFor", [user, asCol], i.payments)
353353 if ((action == action))
354354 then {
355355 let amt = i.payments[0].amount
356356 let pRw = uS(rsr, "deposit", user, amt, amt)
357357 if ((pRw == pRw))
358358 then {
359359 let va = if (!(asCol))
360360 then validateAfter(user, "depositing")
361361 else 0
362362 if ((va == va))
363363 then nil
364364 else throw("Strict value is not equal to itself.")
365365 }
366366 else throw("Strict value is not equal to itself.")
367367 }
368368 else throw("Strict value is not equal to itself.")
369369 }
370370 else throw("Strict value is not equal to itself.")
371371 }
372372 else throw("Strict value is not equal to itself.")
373373 }
374374
375375
376376 let rewardReserves = split_4C(valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "no string"), "|")
377377
378378 func claimAllRewardsForUser (user) = {
379379 let claimedEb = asInt(invoke(ebR, "claimEbRewardFor", [user, -1], nil))
380380 if ((claimedEb == claimedEb))
381381 then {
382382 func fold (acc,rsr) = {
383383 let claimed = asInt(invoke(VD, "claimRewardFor", [rsr, user, -1], nil))
384384 if ((claimed == claimed))
385385 then (acc + claimed)
386386 else throw("Strict value is not equal to itself.")
387387 }
388388
389389 let claimedTotal = {
390390 let $l = rewardReserves
391391 let $s = size($l)
392392 let $acc0 = 0
393393 func $f0_1 ($a,$i) = if (($i >= $s))
394394 then $a
395395 else fold($a, $l[$i])
396396
397397 func $f0_2 ($a,$i) = if (($i >= $s))
398398 then $a
399399 else throw("List size exceeds 20")
400400
401401 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
402402 }
403403 (claimedTotal + claimedEb)
404404 }
405405 else throw("Strict value is not equal to itself.")
406406 }
407407
408408
409409 func claimAllLpRewardsForUser (user) = {
410410 func fold (acc,rsr) = {
411411 let aTokenId = valueOrErrorMessage(getString(addressFromStringValue(rsr), aTIdS), "no aTokenId in reserve")
412412 let claimed = asInt(invoke(locker, "claimLpRewardFor", [user, aTokenId, -1], nil))
413413 if ((claimed == claimed))
414414 then (acc + claimed)
415415 else throw("Strict value is not equal to itself.")
416416 }
417417
418418 let claimedTotal = {
419419 let $l = rewardReserves
420420 let $s = size($l)
421421 let $acc0 = 0
422422 func $f0_1 ($a,$i) = if (($i >= $s))
423423 then $a
424424 else fold($a, $l[$i])
425425
426426 func $f0_2 ($a,$i) = if (($i >= $s))
427427 then $a
428428 else throw("List size exceeds 20")
429429
430430 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
431431 }
432432 claimedTotal
433433 }
434434
435435
436436 func moveCollateral (addr,assetStr,rsr,reserveStr) = {
437437 let amt = asInt(invoke(protectedReserve, "withdrawToMain", [addr, assetStr], nil))
438438 if ((amt == amt))
439439 then {
440440 let dep = invoke(rsr, "depositFor", [addr, true], [AttachedPayment(pureAssetId(assetStr), amt)])
441441 if ((dep == dep))
442442 then {
443443 let prop = uS(reserveStr, "deposit", addr, amt, amt)
444444 if ((prop == prop))
445445 then unit
446446 else throw("Strict value is not equal to itself.")
447447 }
448448 else throw("Strict value is not equal to itself.")
449449 }
450450 else throw("Strict value is not equal to itself.")
451451 }
452452
453453
454454 func spfr () = invoke(dC, "shareProfitFromReserves", nil, nil)
455455
456456
457457 func wdInternal (user,rsr,amt,op) = {
458458 let sh = sR(toString(rsr))
459459 if ((sh == sh))
460460 then {
461461 let withdrawnAmount = asInt(invoke(rsr, op, [user, amt], nil))
462462 if ((withdrawnAmount == withdrawnAmount))
463463 then {
464464 let pRw = uS(toString(rsr), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
465465 if ((pRw == pRw))
466466 then {
467467 let e = ensureLimit("withdraw", rsr, user, withdrawnAmount)
468468 if ((e == e))
469469 then withdrawnAmount
470470 else throw("Strict value is not equal to itself.")
471471 }
472472 else throw("Strict value is not equal to itself.")
473473 }
474474 else throw("Strict value is not equal to itself.")
475475 }
476476 else throw("Strict value is not equal to itself.")
477477 }
478478
479479
480480 func repayWithAtokenInternal (user,payment) = {
481481 let aTokenId = toBase58String(valueOrErrorMessage(payment.assetId, "bad assetId: waves not allowed"))
482482 let t = reserveBy(aTIdS, aTokenId)
483483 let sh = sR(toString(t))
484484 if ((sh == sh))
485485 then {
486486 let amt = asInt(invoke(t, "replenishForRepayWithAtokenFor", [user], [payment]))
487487 if ((amt == amt))
488488 then {
489489 let c = asInt(invoke(t, "collapseForAmount", [user, amt], nil))
490490 if ((c == c))
491491 then if ((amt > c))
492492 then throw("repaying too much")
493493 else {
494494 let pRw = uS(toString(t), "borrow", user, -(c), -(c))
495495 if ((pRw == pRw))
496496 then {
497497 let pRw2 = uS(toString(t), "deposit", user, (amt - c), -(c))
498498 if ((pRw2 == pRw2))
499499 then nil
500500 else throw("Strict value is not equal to itself.")
501501 }
502502 else throw("Strict value is not equal to itself.")
503503 }
504504 else throw("Strict value is not equal to itself.")
505505 }
506506 else throw("Strict value is not equal to itself.")
507507 }
508508 else throw("Strict value is not equal to itself.")
509509 }
510510
511511
512512 @Callable(i)
513513 func initialize (ca) = [writeConstString(configStore, ca)]
514514
515515
516516
517517 @Callable(i)
518518 func deposit (rsr,asCol) = doDeposit(i, rsr, asCol)
519519
520520
521521
522522 @Callable(i)
523523 func depositRef (rsr,asCol,ref) = doDeposit(i, rsr, asCol)
524524
525525
526526
527527 @Callable(i)
528528 func repay (rsr) = {
529529 let user = toString(i.caller)
530530 let sh = sR(rsr)
531531 if ((sh == sh))
532532 then {
533533 let repaid = asInt(invoke(vlR(rsr), "repayFor", [user], i.payments))
534534 if ((repaid == repaid))
535535 then {
536536 let pRw = uS(rsr, "borrow", user, -(repaid), -(repaid))
537537 if ((pRw == pRw))
538538 then nil
539539 else throw("Strict value is not equal to itself.")
540540 }
541541 else throw("Strict value is not equal to itself.")
542542 }
543543 else throw("Strict value is not equal to itself.")
544544 }
545545
546546
547547
548548 @Callable(i)
549549 func mintAtoken (aTokenId,amt) = {
550550 let user = toString(i.caller)
551551 let t = reserveBy(aTIdS, aTokenId)
552552 let sh = sR(toString(t))
553553 if ((sh == sh))
554554 then {
555555 let actual = asInt(invoke(t, "mintAtokenFor", [user, amt], nil))
556556 if ((actual == actual))
557557 then {
558558 let pRw = uS(toString(t), "deposit", user, -(actual), 0)
559559 if ((pRw == pRw))
560560 then {
561561 let bpu = asInt(validateAfter(user, "minting"))
562562 if ((bpu == bpu))
563563 then {
564564 let pc = ensureNoProhibited(user, bpu, toString(t))
565565 if ((pc == pc))
566566 then nil
567567 else throw("Strict value is not equal to itself.")
568568 }
569569 else throw("Strict value is not equal to itself.")
570570 }
571571 else throw("Strict value is not equal to itself.")
572572 }
573573 else throw("Strict value is not equal to itself.")
574574 }
575575 else throw("Strict value is not equal to itself.")
576576 }
577577
578578
579579
580580 @Callable(i)
581581 func replenishWithAtoken () = {
582582 let user = toString(i.caller)
583583 let checks = ensureNoProtected(user)
584584 if ((checks == checks))
585585 then {
586586 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId(w)"))
587587 let rsr = reserveBy(aTIdS, aTokenId)
588588 let sh = sR(toString(rsr))
589589 if ((sh == sh))
590590 then {
591591 let amt = asInt(invoke(rsr, "replenishWithAtokenFor", [user], i.payments))
592592 if ((amt == amt))
593593 then {
594594 let pRw = uS(toString(rsr), "deposit", user, amt, 0)
595595 if ((pRw == pRw))
596596 then {
597597 let e = ensureLimit("import", rsr, user, amt)
598598 if ((e == e))
599599 then nil
600600 else throw("Strict value is not equal to itself.")
601601 }
602602 else throw("Strict value is not equal to itself.")
603603 }
604604 else throw("Strict value is not equal to itself.")
605605 }
606606 else throw("Strict value is not equal to itself.")
607607 }
608608 else throw("Strict value is not equal to itself.")
609609 }
610610
611611
612612
613613 @Callable(i)
614614 func redeemAtokens () = {
615615 let user = toString(i.caller)
616616 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: WAVES"))
617617 let rsr = reserveBy(aTIdS, aTokenId)
618618 let sh = sR(toString(rsr))
619619 if ((sh == sh))
620620 then {
621621 let amt = asInt(invoke(rsr, "redeemAtokensFor", [user], i.payments))
622622 if ((amt == amt))
623623 then {
624624 let pRw = uS(toString(rsr), "deposit", user, 0, -(amt))
625625 if ((pRw == pRw))
626626 then {
627627 let e = ensureLimit("redeem", rsr, user, amt)
628628 if ((e == e))
629629 then nil
630630 else throw("Strict value is not equal to itself.")
631631 }
632632 else throw("Strict value is not equal to itself.")
633633 }
634634 else throw("Strict value is not equal to itself.")
635635 }
636636 else throw("Strict value is not equal to itself.")
637637 }
638638
639639
640640
641641 @Callable(i)
642642 func withdraw (assetId,amt) = {
643643 let user = toString(i.caller)
644644 let r = reserveBy(aIdS, assetId)
645645 let result = asInt(wdInternal(user, r, amt, "withdrawFor"))
646646 if ((result == result))
647647 then {
648648 let bpu = asInt(validateAfter(user, "withdrawing"))
649649 if ((bpu == bpu))
650650 then {
651651 let pc = ensureNoProhibited(user, bpu, toString(r))
652652 if ((pc == pc))
653653 then $Tuple2(nil, result)
654654 else throw("Strict value is not equal to itself.")
655655 }
656656 else throw("Strict value is not equal to itself.")
657657 }
658658 else throw("Strict value is not equal to itself.")
659659 }
660660
661661
662662
663663 @Callable(i)
664664 func withdraw2 (rsr,amt) = {
665665 let user = toString(i.caller)
666666 let sh = sR(rsr)
667667 if ((sh == sh))
668668 then {
669669 let rsrAddr = vlR(rsr)
670670 let actual = asInt(invoke(rsrAddr, "withdrawFor", [user, amt], nil))
671671 if ((actual == actual))
672672 then {
673673 let pRw = uS(rsr, "deposit", user, -(actual), -(actual))
674674 if ((pRw == pRw))
675675 then {
676676 let bpu = if (contains(liquidators, user))
677677 then 0
678678 else {
679679 let e = ensureLimit("withdraw", rsrAddr, user, actual)
680680 if ((e == e))
681681 then asInt(validateAfter(user, "withdrawing2"))
682682 else throw("Strict value is not equal to itself.")
683683 }
684684 let pc = ensureNoProhibited(user, bpu, rsr)
685685 if ((pc == pc))
686686 then $Tuple2(nil, actual)
687687 else throw("Strict value is not equal to itself.")
688688 }
689689 else throw("Strict value is not equal to itself.")
690690 }
691691 else throw("Strict value is not equal to itself.")
692692 }
693693 else throw("Strict value is not equal to itself.")
694694 }
695695
696696
697697
698698 @Callable(i)
699699 func protectCollateral (rsr) = {
700700 let user = toString(i.caller)
701701 let r = vlR(rsr)
702702 let amt = asInt(wdInternal(user, r, -1, "withdrawToMain"))
703703 if ((amt == amt))
704704 then {
705705 let assetIdStr = getStringValue(r, aIdS)
706706 let p = invoke(protectedReserve, "supplyFor", [user], [AttachedPayment(pureAssetId(assetIdStr), amt)])
707707 if ((p == p))
708708 then {
709709 let pc = ensureNoProhibited(user, userPower(user)._2, rsr)
710710 if ((pc == pc))
711711 then $Tuple2(nil, amt)
712712 else throw("Strict value is not equal to itself.")
713713 }
714714 else throw("Strict value is not equal to itself.")
715715 }
716716 else throw("Strict value is not equal to itself.")
717717 }
718718
719719
720720
721721 @Callable(i)
722722 func withdrawProtectedCollateral (assetId,amt) = {
723723 let user = toString(i.caller)
724724 let a = asInt(invoke(valueOrErrorMessage(protectedReserve, "no protectedReserve"), "withdrawFor", [user, assetId, amt], nil))
725725 if ((a == a))
726726 then {
727727 let va = validateAfter(user, "withdrawing protected")
728728 if ((va == va))
729729 then nil
730730 else throw("Strict value is not equal to itself.")
731731 }
732732 else throw("Strict value is not equal to itself.")
733733 }
734734
735735
736736
737737 @Callable(i)
738738 func normalizeCollateral (rsr) = {
739739 let addr = toString(i.caller)
740740 let rA = vlR(rsr)
741741 if ((rA == rA))
742742 then {
743743 let sh = sR(rsr)
744744 if ((sh == sh))
745745 then {
746746 let assetIdStr = valueOrErrorMessage(getString(rA, aIdS), ("no assetId in rsv: " + rsr))
747747 let mc = moveCollateral(addr, assetIdStr, rA, rsr)
748748 if ((mc == mc))
749749 then nil
750750 else throw("Strict value is not equal to itself.")
751751 }
752752 else throw("Strict value is not equal to itself.")
753753 }
754754 else throw("Strict value is not equal to itself.")
755755 }
756756
757757
758758
759759 @Callable(i)
760760 func borrow (assetId,amt) = {
761761 let user = toString(i.caller)
762762 let rsr = reserveBy(aIdS, assetId)
763763 let sh = sR(toString(rsr))
764764 if ((sh == sh))
765765 then {
766766 let a = invoke(rsr, "borrowFor", [user, amt], nil)
767767 if ((a == a))
768768 then {
769769 let pRw = uS(toString(rsr), "borrow", user, amt, amt)
770770 if ((pRw == pRw))
771771 then {
772772 let e = ensureLimit("borrow", rsr, user, amt)
773773 if ((e == e))
774774 then {
775775 let bpu = asInt(validateAfter(user, "borrowing"))
776776 if ((bpu == bpu))
777777 then {
778778 let pc = ensureNoProhibitedCollaterals(user)
779779 if ((pc == pc))
780780 then nil
781781 else throw("Strict value is not equal to itself.")
782782 }
783783 else throw("Strict value is not equal to itself.")
784784 }
785785 else throw("Strict value is not equal to itself.")
786786 }
787787 else throw("Strict value is not equal to itself.")
788788 }
789789 else throw("Strict value is not equal to itself.")
790790 }
791791 else throw("Strict value is not equal to itself.")
792792 }
793793
794794
795795
796796 @Callable(i)
797797 func borrow2 (rsr,amt) = {
798798 let user = toString(i.caller)
799799 let r = vlR(rsr)
800800 let sh = sR(rsr)
801801 if ((sh == sh))
802802 then {
803803 let a = invoke(r, "borrowFor", [user, amt], nil)
804804 if ((a == a))
805805 then {
806806 let pRw = uS(rsr, "borrow", user, amt, amt)
807807 if ((pRw == pRw))
808808 then {
809809 let e = ensureLimit("borrow", r, user, amt)
810810 if ((e == e))
811811 then {
812812 let bpu = asInt(validateAfter(user, "borrowing"))
813813 if ((bpu == bpu))
814814 then {
815815 let pc = ensureNoProhibitedCollaterals(user)
816816 if ((pc == pc))
817817 then nil
818818 else throw("Strict value is not equal to itself.")
819819 }
820820 else throw("Strict value is not equal to itself.")
821821 }
822822 else throw("Strict value is not equal to itself.")
823823 }
824824 else throw("Strict value is not equal to itself.")
825825 }
826826 else throw("Strict value is not equal to itself.")
827827 }
828828 else throw("Strict value is not equal to itself.")
829829 }
830830
831831
832832
833833 @Callable(i)
834834 func collapse (rsr,amt) = {
835835 let user = toString(i.caller)
836836 let sh = sR(rsr)
837837 if ((sh == sh))
838838 then {
839839 let c = asInt(invoke(vlR(rsr), "collapseForAmount", [user, amt], nil))
840840 if ((c == c))
841841 then {
842842 let pRw = uS(rsr, "borrow", user, -(c), -(c))
843843 if ((pRw == pRw))
844844 then {
845845 let pRw2 = uS(rsr, "deposit", user, -(c), -(c))
846846 if ((pRw2 == pRw2))
847847 then nil
848848 else throw("Strict value is not equal to itself.")
849849 }
850850 else throw("Strict value is not equal to itself.")
851851 }
852852 else throw("Strict value is not equal to itself.")
853853 }
854854 else throw("Strict value is not equal to itself.")
855855 }
856856
857857
858858
859859 @Callable(i)
860860 func claimEbReward2 (amt,lock) = {
861861 let user = toString(i.caller)
862862 let c = asInt(invoke(ebR, "claimEbRewardFor", [user, amt], nil))
863863 if ((c == c))
864864 then lockOrPayout(i.caller, c, lock)
865865 else throw("Strict value is not equal to itself.")
866866 }
867867
868868
869869
870870 @Callable(i)
871871 func claimReward2 (rsr,amt,lock) = {
872872 let v = vlR(rsr)
873873 if ((v == v))
874874 then {
875875 let user = toString(i.caller)
876876 let c = asInt(invoke(VD, "claimRewardFor", [rsr, user, amt], nil))
877877 if ((c == c))
878878 then lockOrPayout(i.caller, c, lock)
879879 else throw("Strict value is not equal to itself.")
880880 }
881881 else throw("Strict value is not equal to itself.")
882882 }
883883
884884
885885
886886 @Callable(i)
887887 func claimAllRewardsAndAllEbAvailable2 (lock,unstakeLegacy) = {
888888 let user = toString(i.caller)
889889 let cr = claimAllRewardsForUser(user)
890890 if ((cr == cr))
891891 then {
892892 let crLp = claimAllLpRewardsForUser(user)
893893 if ((crLp == crLp))
894894 then {
895895 let lA = if (unstakeLegacy)
896896 then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
897897 else 0
898898 if ((lA == lA))
899899 then lockOrPayout(i.caller, ((cr + crLp) + lA), lock)
900900 else throw("Strict value is not equal to itself.")
901901 }
902902 else throw("Strict value is not equal to itself.")
903903 }
904904 else throw("Strict value is not equal to itself.")
905905 }
906906
907907
908908
909909 @Callable(i)
910910 func disableUseAsCollateral (rsr) = {
911911 let user = toString(i.caller)
912912 let d = invoke(vlR(rsr), "disableUseAsCollateralFor", [user], nil)
913913 if ((d == d))
914914 then {
915915 let va = validateAfter(user, "changing collateral status")
916916 if ((va == va))
917917 then nil
918918 else throw("Strict value is not equal to itself.")
919919 }
920920 else throw("Strict value is not equal to itself.")
921921 }
922922
923923
924924
925925 @Callable(i)
926926 func lockVires (factor,migrate) = {
927927 let user = toString(i.caller)
928928 let a = spfr()
929929 if ((a == a))
930930 then {
931931 let migrateAmount = if (migrate)
932932 then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
933933 else 0
934934 let total = (migrateAmount + viresPayment(i))
935935 let l = invoke(dC, "lockFor", [user, factor], if ((total == 0))
936936 then nil
937937 else [AttachedPayment(viresAssetId, total)])
938938 if ((l == l))
939939 then nil
940940 else throw("Strict value is not equal to itself.")
941941 }
942942 else throw("Strict value is not equal to itself.")
943943 }
944944
945945
946946
947947 @Callable(i)
948948 func withdrawAllPossibleVires () = {
949949 let user = toString(i.caller)
950950 let a = spfr()
951951 if ((a == a))
952952 then {
953953 let stakerViresAmount = asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
954954 if ((stakerViresAmount == stakerViresAmount))
955955 then {
956956 let u = invoke(dC, "withdrawUnlockedFor", [user], nil)
957957 if ((u == u))
958958 then [ScriptTransfer(i.caller, stakerViresAmount, viresAssetId)]
959959 else throw("Strict value is not equal to itself.")
960960 }
961961 else throw("Strict value is not equal to itself.")
962962 }
963963 else throw("Strict value is not equal to itself.")
964964 }
965965
966966
967967
968968 @Callable(i)
969969 func claimProtocolProfitFrom (from,relock) = {
970970 let user = toString(i.caller)
971971 let a = spfr()
972972 if ((a == a))
973973 then {
974974 let u = invoke(dC, "claimProfit", [from, user, relock], nil)
975975 if ((u == u))
976976 then nil
977977 else throw("Strict value is not equal to itself.")
978978 }
979979 else throw("Strict value is not equal to itself.")
980980 }
981981
982982
983983
984984 @Callable(i)
985985 func withdrawUnlockedVires () = {
986986 let a = spfr()
987987 if ((a == a))
988988 then {
989989 let u = invoke(dC, "withdrawUnlockedFor", [toString(i.caller)], nil)
990990 if ((u == u))
991991 then nil
992992 else throw("Strict value is not equal to itself.")
993993 }
994994 else throw("Strict value is not equal to itself.")
995995 }
996996
997997
998998
999999 @Callable(i)
10001000 func lockSupply (reserve,period) = {
10011001 let rsr = vlR(reserve)
10021002 let user = toString(i.caller)
10031003 let checks = ensureNoProtected(user)
10041004 if ((checks == checks))
10051005 then {
10061006 let aTokenId = value(pureAssetId(valueOrErrorMessage(getString(rsr, "aTokenId"), "no aTokenId in reserve")))
10071007 let migration = if ((size(i.payments) == 0))
10081008 then unit
10091009 else if ((i.payments[0].assetId == aTokenId))
10101010 then unit
10111011 else if ((i.payments[0].assetId == pureAssetId(valueOrErrorMessage(getString(rsr, aIdS), "no assetId in reserve"))))
10121012 then {
10131013 let sh = sR(reserve)
10141014 if ((sh == sh))
10151015 then {
10161016 let action = invoke(rsr, "depositFor", [user, true], i.payments)
10171017 if ((action == action))
10181018 then {
10191019 let amt = i.payments[0].amount
10201020 let pRw = uS(reserve, "deposit", user, amt, amt)
10211021 if ((pRw == pRw))
10221022 then unit
10231023 else throw("Strict value is not equal to itself.")
10241024 }
10251025 else throw("Strict value is not equal to itself.")
10261026 }
10271027 else throw("Strict value is not equal to itself.")
10281028 }
10291029 else throw("bad asset attached")
10301030 if ((migration == migration))
10311031 then {
10321032 let mint = {
10331033 let sh = sR(reserve)
10341034 if ((sh == sh))
10351035 then {
10361036 let actual = asInt(invoke(rsr, "mintAtokenForTo", [user, -1, toString(this)], nil))
10371037 if ((actual == actual))
10381038 then {
10391039 let pRw = uS(toString(rsr), "deposit", user, -(actual), 0)
10401040 if ((pRw == pRw))
10411041 then {
10421042 let va = validateAfter(user, "lock-minting")
10431043 if ((va == va))
10441044 then nil
10451045 else throw("Strict value is not equal to itself.")
10461046 }
10471047 else throw("Strict value is not equal to itself.")
10481048 }
10491049 else throw("Strict value is not equal to itself.")
10501050 }
10511051 else throw("Strict value is not equal to itself.")
10521052 }
10531053 if ((mint == mint))
10541054 then {
10551055 let balance = assetBalance(this, aTokenId)
10561056 let r = invoke(locker, "lockLP", [user, period], [AttachedPayment(aTokenId, balance)])
10571057 if ((r == r))
10581058 then $Tuple2(nil, balance)
10591059 else throw("Strict value is not equal to itself.")
10601060 }
10611061 else throw("Strict value is not equal to itself.")
10621062 }
10631063 else throw("Strict value is not equal to itself.")
10641064 }
10651065 else throw("Strict value is not equal to itself.")
10661066 }
10671067
10681068
10691069
10701070 @Callable(i)
10711071 func repayWithAtokenFor (user) = {
10721072 let checks = if (!(isDefined(addressFromString(user))))
10731073 then throw("bad user")
10741074 else true
10751075 if ((checks == checks))
10761076 then repayWithAtokenInternal(user, i.payments[0])
10771077 else throw("Strict value is not equal to itself.")
10781078 }
10791079
10801080
10811081
10821082 @Callable(i)
10831083 func repayWithAtoken () = repayWithAtokenInternal(toString(i.caller), i.payments[0])
10841084
10851085
10861086
10871087 @Callable(i)
10881088 func repayFor (rsr,user) = {
10891089 let checks = if (!(isDefined(addressFromString(user))))
10901090 then throw("bad user")
10911091 else true
10921092 if ((checks == checks))
10931093 then {
10941094 let sh = sR(rsr)
10951095 if ((sh == sh))
10961096 then {
10971097 let repaid = asInt(invoke(vlR(rsr), "repayFor", [user], i.payments))
10981098 if ((repaid == repaid))
10991099 then {
11001100 let pRw = uS(rsr, "borrow", user, -(repaid), -(repaid))
11011101 if ((pRw == pRw))
11021102 then nil
11031103 else throw("Strict value is not equal to itself.")
11041104 }
11051105 else throw("Strict value is not equal to itself.")
11061106 }
11071107 else throw("Strict value is not equal to itself.")
11081108 }
11091109 else throw("Strict value is not equal to itself.")
11101110 }
11111111
11121112
11131113
11141114 @Callable(i)
11151115 func healthOf (address) = {
11161116 let $t02369723748 = asInt3(userPower(address))
11171117 let bp = $t02369723748._1
11181118 let bpu = $t02369723748._2
11191119 let ignore = $t02369723748._3
11201120 $Tuple2(nil, $Tuple2(bp, bpu))
11211121 }
11221122
11231123

github/deemru/w8io/6500d08 
97.90 ms