tx · 8P1pEmSQqoJ92cFs3UFAwVwkgSo5Yi7fuxCRdpb8p4xK

3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy:  -0.04800000 Waves

2023.11.17 21:21 [2847712] smart account 3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy > SELF 0.00000000 Waves

{ "type": 13, "id": "8P1pEmSQqoJ92cFs3UFAwVwkgSo5Yi7fuxCRdpb8p4xK", "fee": 4800000, "feeAssetId": null, "timestamp": 1700245267633, "version": 2, "chainId": 84, "sender": "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy", "senderPublicKey": "C3PaRKeL8AUKbwUqdniMQtThgcTh5DYHV1777Hkxy7rp", "proofs": [ "4gM3rQMUG7xRGkFhoX1HjaTvawhTMUzzsqodBZ2m2pi8JRrprZC4gmFTW3ZmLUuybkBtoox2QdooU6H8wGacZxw2" ], "script": "base64:BgJtCAISAwoBGBIDCgEIEgMKAQgSAwoBCBIDCgEYEgMKAQgSAwoBCBIDCgEYEgMKAQgSAwoBGBIDCgEYEgUKAxgBARIDCgEIEgASAwoBCBIDCgEBEgASBAoCAQgSAwoBCBIGCgQYGAEBEgMKAQgSAOgBAAJNNgDAhD0AAk04AIDC1y8ACE1JTExJT042AICA6YOx3hYADk1BUktFVElOR1NIQVJFAKCNBgAJVEVBTVNIQVJFAMCaDAANQUNUSVZJVFlTSEFSRQCgjQYAC1BMQVlFUlNIQVJFAIC1GAAKWUVBUk1JTExJUwCAhuvHdQAJREFZTUlMTElTAIC4mSkAEG1hcmtldGluZ0FkZHJLZXkCDW1hcmtldGluZ0FkZHIAC3RlYW1BZGRyS2V5Agh0ZWFtQWRkcgAUbGFzdE1hcmtldGluZ1RpbWVLZXkCGWxhc3RDbGFpbWVkVGltZV9tYXJrZXRpbmcAFm1hcmtldGluZ0Ftb3VudExlZnRLZXkCE21hcmtldGluZ0Ftb3VudExlZnQAD2xhc3RUZWFtVGltZUtleQIUbGFzdENsYWltZWRUaW1lX3RlYW0AEXRlYW1BbW91bnRMZWZ0S2V5Ag50ZWFtQW1vdW50TGVmdAAVbGFzdEFjdGl2aXRpZXNUaW1lS2V5AhpsYXN0Q2xhaW1lZFRpbWVfYWN0aXZpdGllcwAQYWN0QW1vdW50TGVmdEtleQIUYWN0aXZpdGllc0Ftb3VudExlZnQAFHN0YWtlcnNBbW91bnRMZWZ0S2V5AhFzdGFrZXJzQW1vdW50TGVmdAEYa2V5TGFzdENsYWltZWRUaW1lQnlVc2VyAQRhZGRyCQCsAgICFGxhc3RDbGFpbWVkVGltZVVzZXJfBQRhZGRyARRkaXN0cmlidXRpb25CeVBlcmlvZAEGcGVyaW9kCQBrAwUITUlMTElPTjYJAGgCBQtQTEFZRVJTSEFSRQkAZAIFBnBlcmlvZAABCQBoAgAGBQJNNgAPd2xnSXNzdWVUaW1lS2V5Ag13bGdfaXNzdWVUaW1lABJ3bGdJc3N1ZWRBbW91bnRLZXkCEHdsZ19pc3N1ZWRBbW91bnQAEXpiSXNzdWVkQW1vdW50S2V5AhJ6YmlsbF9pc3N1ZWRBbW91bnQBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQRhZGRyCQCsAgICGGFjcmVzU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgEaa2V5QWNyZXNMb2NrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNMb2NrZWRBbW91bnRCeVVzZXJfBQRhZGRyARdrZXlBY3Jlc0xvY2tlZEV0YUJ5VXNlcgEEYWRkcgkArAICAhVhY3Jlc0xvY2tlZEV0YUJ5VXNlcl8FBGFkZHIAE2FjcmVzU3Rha2VkVG90YWxLZXkCFmFjcmVzU3Rha2VkQW1vdW50VG90YWwBGGtleVdsZ1N0YWtlZEFtb3VudEJ5VXNlcgEEYWRkcgkArAICAhZ3bGdTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyAAhkYXBwUmVzdAAAAAtkYXBwU3Rha2luZwABAAtkYXBwRWNvbm9teQACAAdkYXBwV2xnAAMACmRhcHBQdXp6bGUABAAOZGFwcEludmVzdEZ1bmQABQAJZGFwcEFjcmVzAAYBCGdldExhbmRzAxJ1c2VyQWRkclN0ck9yRW1wdHkPc3Rha2luZ0NvbnRyYWN0DWFjcmVzQ29udHJhY3QEBXByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0AhNyZXNUeXBlc1Byb3BvcnRpb25zAgswXzBfMF8wXzBfMAIBXwoBBWFkZGVyAgNhY2MEaXRlbQkAZAIFA2FjYwkBDXBhcnNlSW50VmFsdWUBBQRpdGVtBAt0b3RhbFBpZWNlcwoAAiRsBQVwcm9wcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYECnVzZXJQaWVjZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQCsAgICFHN0YWtlZFBpZWNlc0J5T3duZXJfBRJ1c2VyQWRkclN0ck9yRW1wdHkAAAQKdG90YWxBY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1hY3Jlc0NvbnRyYWN0BRNhY3Jlc1N0YWtlZFRvdGFsS2V5AAAECXVzZXJBY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1hY3Jlc0NvbnRyYWN0CQEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBRJ1c2VyQWRkclN0ck9yRW1wdHkAAAkAzAgCBQt0b3RhbFBpZWNlcwkAzAgCBQp1c2VyUGllY2VzCQDMCAIFCnRvdGFsQWNyZXMJAMwIAgUJdXNlckFjcmVzBQNuaWwADmlkeFRvdGFsUGllY2VzAAAADWlkeFVzZXJQaWVjZXMAAQANaWR4VG90YWxBY3JlcwACAAxpZHhVc2VyQWNyZXMAAwELZ2V0V2xnU3RhdHMFC3VzZXJBZGRyT3B0CWNvbnRyYWN0cwZ1c2R0SWQVdXNkdEJhbGFuY2VDb3JyZWN0aW9uD3VzZXJQcm9wb3J0aW9uNgQMaXNzdWVkQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFEndsZ0lzc3VlZEFtb3VudEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0BAplY29ub215VXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQtkYXBwRWNvbm9teQUGdXNkdElkBAdyZXN0VXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQhkYXBwUmVzdAUGdXNkdElkBAZ3bGdVc2QJAGUCCQDwBwIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBQZ1c2R0SWQFFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQJcHV6emxlVXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQpkYXBwUHV6emxlBQZ1c2R0SWQEEmludmVzdEZ1bmRDb250cmFjdAkAkQMCBQljb250cmFjdHMFDmRhcHBJbnZlc3RGdW5kBA9pbnZlc3RGdW5kVG90YWwJAGQCCQDwBwIFEmludmVzdEZ1bmRDb250cmFjdAUGdXNkdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEmludmVzdEZ1bmRDb250cmFjdAURemJJc3N1ZWRBbW91bnRLZXkAAAQNdG90YWxGdW5kc1VzZAkAZAIJAGQCBQplY29ub215VXNkBQZ3bGdVc2QFD2ludmVzdEZ1bmRUb3RhbAQFd2xnSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwILd2xnX2Fzc2V0SWQCE05vdCBpbml0aWFsaXplZCB5ZXQEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECWlzc3VlVGltZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBQ93bGdJc3N1ZVRpbWVLZXkCD05vdCBpbml0aWFsaXplZAQObWFya2V0aW5nVG90YWwJAGsDBQhNSUxMSU9ONgUOTUFSS0VUSU5HU0hBUkUFAk02BBNtYXJrZXRpbmdBbW91bnRMZWZ0CQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBRZtYXJrZXRpbmdBbW91bnRMZWZ0S2V5BQ5tYXJrZXRpbmdUb3RhbAQRbGFzdE1hcmtldGluZ1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFFGxhc3RNYXJrZXRpbmdUaW1lS2V5BQlpc3N1ZVRpbWUEDW1hcmtldGluZ0FkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAJ0IAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFEG1hcmtldGluZ0FkZHJLZXkEG21hcmtldGluZ0Ftb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQ5tYXJrZXRpbmdUb3RhbAkAZQIFA25vdwURbGFzdE1hcmtldGluZ1RpbWUFCllFQVJNSUxMSVMJAMwIAgUTbWFya2V0aW5nQW1vdW50TGVmdAUDbmlsBA9tYXJrZXRpbmdXbGdvbGQJAPAHAgUNbWFya2V0aW5nQWRkcgUFd2xnSWQECXRlYW1Ub3RhbAkAawMFCE1JTExJT042BQlURUFNU0hBUkUFAk02BA50ZWFtQW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwURdGVhbUFtb3VudExlZnRLZXkFCXRlYW1Ub3RhbAQMbGFzdFRlYW1UaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBQ9sYXN0VGVhbVRpbWVLZXkFCWlzc3VlVGltZQQIdGVhbUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAJ0IAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFC3RlYW1BZGRyS2V5BBZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCXRlYW1Ub3RhbAkAZQIFA25vdwUMbGFzdFRlYW1UaW1lCQBoAgADBQpZRUFSTUlMTElTCQDMCAIFDnRlYW1BbW91bnRMZWZ0BQNuaWwECnRlYW1XbGdvbGQJAPAHAgUIdGVhbUFkZHIFBXdsZ0lkBAhhY3RUb3RhbAkAawMFCE1JTExJT042BQ1BQ1RJVklUWVNIQVJFBQJNNgQNYWN0QW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUQYWN0QW1vdW50TGVmdEtleQUIYWN0VG90YWwEEmxhc3RBY3Rpdml0aWVzVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUVbGFzdEFjdGl2aXRpZXNUaW1lS2V5BQlpc3N1ZVRpbWUEFWFjdEFtb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQhhY3RUb3RhbAkAZQIFA25vdwUSbGFzdEFjdGl2aXRpZXNUaW1lCQBoAgADBQpZRUFSTUlMTElTCQDMCAIFDWFjdEFtb3VudExlZnQFA25pbAQJYWN0V2xnb2xkCQDwBwIJAJEDAgUJY29udHJhY3RzBQhkYXBwUmVzdAUFd2xnSWQEDGxhc3RVc2VyVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwkBGGtleUxhc3RDbGFpbWVkVGltZUJ5VXNlcgEFC3VzZXJBZGRyT3B0BQlpc3N1ZVRpbWUEDmxhc3RVc2VyUGVyaW9kCQBpAgkAZQIFDGxhc3RVc2VyVGltZQUJaXNzdWVUaW1lBQpZRUFSTUlMTElTBApub3dMaW1pdGVkCQCXAwEJAMwIAgUDbm93CQDMCAIJAGQCBQlpc3N1ZVRpbWUJAGgCAAMFCllFQVJNSUxMSVMFA25pbAQJY3VyUGVyaW9kCQCXAwEJAMwIAgkAaQIJAGUCBQNub3cFCWlzc3VlVGltZQUKWUVBUk1JTExJUwkAzAgCAAIFA25pbAQDZWZmCQEIZ2V0TGFuZHMDBQt1c2VyQWRkck9wdAkAkQMCBQljb250cmFjdHMFC2RhcHBTdGFraW5nCQCRAwIFCWNvbnRyYWN0cwUJZGFwcEFjcmVzBBVjdXJQZXJpb2REaXN0cmlidXRpb24JARRkaXN0cmlidXRpb25CeVBlcmlvZAEFCWN1clBlcmlvZAQIJHQwNzkxNDIDCQAAAgUObGFzdFVzZXJQZXJpb2QFCWN1clBlcmlvZAQCYTAJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkBQxsYXN0VXNlclRpbWUFCllFQVJNSUxMSVMECHVzZXJQYXJ0CQBrAwUCYTAFD3VzZXJQcm9wb3J0aW9uNgUCTTYEB2VmZlRpbWUJAGQCBQxsYXN0VXNlclRpbWUJAGsDCQBlAgUKbm93TGltaXRlZAUMbGFzdFVzZXJUaW1lBQ91c2VyUHJvcG9ydGlvbjYFAk02CQCVCgMFCHVzZXJQYXJ0BQJhMAUHZWZmVGltZQMJAAACBQ5sYXN0VXNlclBlcmlvZAkAZQIFCWN1clBlcmlvZAABBAJhMQkAawMJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQkAZQIJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTBQljdXJQZXJpb2QFDGxhc3RVc2VyVGltZQUKWUVBUk1JTExJUwQCYTAJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwUJY3VyUGVyaW9kBQpZRUFSTUlMTElTBAVhdmFpbAkAZAIFAmExBQJhMAQIdXNlclBhcnQJAGsDBQVhdmFpbAUPdXNlclByb3BvcnRpb242BQJNNgQHZWZmVGltZQMJAGcCBQJhMQUIdXNlclBhcnQJAGQCBQxsYXN0VXNlclRpbWUJAGsDBQpZRUFSTUlMTElTBQh1c2VyUGFydAkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAABCQBkAgkAZAIFCWlzc3VlVGltZQkAaAIFCllFQVJNSUxMSVMFCWN1clBlcmlvZAkAawMFCllFQVJNSUxMSVMJAGUCBQh1c2VyUGFydAUCYTEFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAlQoDBQh1c2VyUGFydAUFYXZhaWwFB2VmZlRpbWUEAmEyCQBrAwkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAACCQBlAgkAZAIFCWlzc3VlVGltZQkAaAIFCllFQVJNSUxMSVMJAGUCBQljdXJQZXJpb2QAAQUMbGFzdFVzZXJUaW1lBQpZRUFSTUlMTElTBAJhMQkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAABBAJhMAkAawMFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAZQIFCm5vd0xpbWl0ZWQJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTBQljdXJQZXJpb2QFCllFQVJNSUxMSVMEBWF2YWlsCQBkAgkAZAIFAmEyBQJhMQUCYTAECHVzZXJQYXJ0CQBrAwUFYXZhaWwFD3VzZXJQcm9wb3J0aW9uNgUCTTYEB2VmZlRpbWUDCQBnAgUCYTIFCHVzZXJQYXJ0CQBkAgUMbGFzdFVzZXJUaW1lCQBrAwUKWUVBUk1JTExJUwUIdXNlclBhcnQJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAgMJAGcCCQBkAgUCYTIFAmExBQh1c2VyUGFydAkAZAIJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTCQBlAgUJY3VyUGVyaW9kAAEJAGsDBQpZRUFSTUlMTElTCQBlAgUIdXNlclBhcnQFAmEyCQEUZGlzdHJpYnV0aW9uQnlQZXJpb2QBCQBlAgUJY3VyUGVyaW9kAAEJAGQCCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwUJY3VyUGVyaW9kCQBrAwUKWUVBUk1JTExJUwkAZQIJAGUCBQh1c2VyUGFydAUCYTIFAmExBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAJUKAwUIdXNlclBhcnQFBWF2YWlsBQdlZmZUaW1lBAp1c2VyQW1vdW50CAUIJHQwNzkxNDICXzEEDXVzZXJBdmFpbGFibGUIBQgkdDA3OTE0MgJfMgQLZWZmTGFzdFRpbWUIBQgkdDA3OTE0MgJfMwQQc0xhbmREYWlseUFtb3VudAkAawMJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24FCURBWU1JTExJUwUKWUVBUk1JTExJUwAZCQCRAwIFA2VmZgUOaWR4VG90YWxQaWVjZXMED2Ftb3VudExlZnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUUc3Rha2Vyc0Ftb3VudExlZnRLZXkAAAQKcm9iYmVkVXNlcgkAawMFCnVzZXJBbW91bnQJAGQCCQBoAgkAkQMCBQNlZmYFDWlkeFVzZXJQaWVjZXMFAk04CQCRAwIFA2VmZgUMaWR4VXNlckFjcmVzCQBkAgkAaAIJAJEDAgUDZWZmBQ5pZHhUb3RhbFBpZWNlcwUCTTgJAJEDAgUDZWZmBQ1pZHhUb3RhbEFjcmVzBAx1bnJvYmJlZFVzZXIJAGsDBQ11c2VyQXZhaWxhYmxlCQBkAgkAaAIJAJEDAgUDZWZmBQ1pZHhVc2VyUGllY2VzBQJNOAkAkQMCBQNlZmYFDGlkeFVzZXJBY3JlcwkAZAIJAGgCCQCRAwIFA2VmZgUOaWR4VG90YWxQaWVjZXMFAk04CQCRAwIFA2VmZgUNaWR4VG90YWxBY3JlcwkAzAgCBQxpc3N1ZWRBbW91bnQJAMwIAgkAawMFDXRvdGFsRnVuZHNVc2QFAk04BQxpc3N1ZWRBbW91bnQJAMwIAgUNdG90YWxGdW5kc1VzZAkAzAgCBQplY29ub215VXNkCQDMCAIFB3Jlc3RVc2QJAMwIAgUGd2xnVXNkCQDMCAIFCXB1enpsZVVzZAkAzAgCBQlpc3N1ZVRpbWUJAMwIAgURbGFzdE1hcmtldGluZ1RpbWUJAMwIAgUObWFya2V0aW5nVG90YWwJAMwIAgUTbWFya2V0aW5nQW1vdW50TGVmdAkAzAgCBRttYXJrZXRpbmdBbW91bnRBdmFpbGFibGVOb3cJAMwIAgUPbWFya2V0aW5nV2xnb2xkCQDMCAIFCXRlYW1Ub3RhbAkAzAgCBQ50ZWFtQW1vdW50TGVmdAkAzAgCBRZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCnRlYW1XbGdvbGQJAMwIAgUIYWN0VG90YWwJAMwIAgUNYWN0QW1vdW50TGVmdAkAzAgCBRVhY3RBbW91bnRBdmFpbGFibGVOb3cJAMwIAgUJYWN0V2xnb2xkCQDMCAIFCWN1clBlcmlvZAkAzAgCBQ9hbW91bnRMZWZ0VG90YWwJAMwIAgUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQDMCAIFDGxhc3RVc2VyVGltZQkAzAgCBQpyb2JiZWRVc2VyCQDMCAIFEHNMYW5kRGFpbHlBbW91bnQJAMwIAgUPaW52ZXN0RnVuZFRvdGFsCQDMCAIFDHVucm9iYmVkVXNlcgkAzAgCBQtlZmZMYXN0VGltZQUDbmlsAAZTQ0FMRTgAgMLXLwAOcm9iYmVyeUNvc3RNaW4AgMLXLwAUcm9iYmVyeUNvb2xkb3duQ29lZmYAkAMADWNoYXJJbnRlbGxlY3QAAgANY2hhckVuZHVyYW5jZQADAA1jaGFyRGV4dGVyaXR5AAQAB3NlZ0JhY2sAAQAHc2VnQmVsdAACAA1sYW5kUm9iU3RhdGVzCQDMCAICBGZyZWUJAMwIAgIGbG9ja2VkCQDMCAICEWFmdGVyTG9ja0Nvb2xkb3duCQDMCAICDnJvYmJlZENvb2xkb3duCQDMCAICEGRlZmVuZGVkQ29vbGRvd24FA25pbAANZHVja1JvYlN0YXRlcwkAzAgCAgRmcmVlCQDMCAICDHByZXBhcmluZ1JvYgUDbmlsAQ1rZXlEdWNrSGVhbHRoAQtkdWNrQXNzZXRJZAkArAICAgtkdWNrSGVhbHRoXwULZHVja0Fzc2V0SWQBDGtleUR1Y2tDaGFycwELZHVja0Fzc2V0SWQJAKwCAgIKZHVja0NoYXJzXwULZHVja0Fzc2V0SWQBCWtleUR1Y2tYUAELZHVja0Fzc2V0SWQJAKwCAgIHZHVja1hQXwULZHVja0Fzc2V0SWQBDGtleUR1Y2tMZXZlbAELZHVja0Fzc2V0SWQJAKwCAgIKZHVja0xldmVsXwULZHVja0Fzc2V0SWQBEWtleUR1Y2tGcmVlUG9pbnRzAQtkdWNrQXNzZXRJZAkArAICAg9kdWNrRnJlZVBvaW50c18FC2R1Y2tBc3NldElkARBrZXlEdWNrRXF1aXBtZW50AQtkdWNrQXNzZXRJZAkArAICAg5kdWNrRXF1aXBtZW50XwULZHVja0Fzc2V0SWQBCWtleVVzZXJYUAEEYWRkcgkArAICAgd1c2VyWFBfBQRhZGRyAQxrZXlVc2VyTGV2ZWwBBGFkZHIJAKwCAgIKdXNlckxldmVsXwUEYWRkcgERa2V5VXNlckZyZWVQb2ludHMBBGFkZHIJAKwCAgIPdXNlckZyZWVQb2ludHNfBQRhZGRyAQxrZXlEdWNrQnVmZnMBC2R1Y2tBc3NldElkCQCsAgICCmR1Y2tCdWZmc18FC2R1Y2tBc3NldElkARhrZXlMYXN0Um9iYmVyeVRpbWVCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICEGxhc3RSb2JiZXJ5VGltZV8FC2R1Y2tBc3NldElkARhrZXlMYXN0Um9iYmVyeUNvc3RCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICEGxhc3RSb2JiZXJ5Q29zdF8FC2R1Y2tBc3NldElkARNrZXlMYW5kUm9iYmVyeVN0YXRlAQtsYW5kQXNzZXRJZAkArAICAhFsYW5kUm9iYmVyeVN0YXRlXwULbGFuZEFzc2V0SWQBEmtleUxhbmRDb29sZG93bkVUQQELbGFuZEFzc2V0SWQJAKwCAgIQbGFuZENvb2xkb3duRVRBXwULbGFuZEFzc2V0SWQBE2tleUR1Y2tSb2JiZXJ5U3RhdGUBC2R1Y2tBc3NldElkCQCsAgICEWR1Y2tSb2JiZXJ5U3RhdGVfBQtkdWNrQXNzZXRJZAETa2V5TG9ja2VkTGFuZEJ5RHVjawELZHVja0Fzc2V0SWQJAKwCAgIRbG9ja2VkTGFuZEJ5RHVja18FC2R1Y2tBc3NldElkARZrZXlEZWxpdmVyeURlbGF5QnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAhRkZWxpdmVyeURlbGF5QnlEdWNrXwULZHVja0Fzc2V0SWQBFGtleVVzZXJEZWxpdmVyeUNvdW50AQRhZGRyCQCsAgICEnVzZXJEZWxpdmVyeUNvdW50XwUEYWRkcgEWa2V5VXNlckxhc3REZWxpdmVyeURheQEEYWRkcgkArAICAhR1c2VyTGFzdERlbGl2ZXJ5RGF5XwUEYWRkcgEJbWF4SGVhbHRoAQVsZXZlbAkAZAIAZAUFbGV2ZWwBDmdldFJvYmJlcnlEYXRhAg9zdGFraW5nQ29udHJhY3QLZHVja0Fzc2V0SWQEC2xhc3RSb2JDb3N0CQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBGGtleUxhc3RSb2JiZXJ5Q29zdEJ5RHVjawEFC2R1Y2tBc3NldElkAAAEC2xhc3RSb2JUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBGGtleUxhc3RSb2JiZXJ5VGltZUJ5RHVjawEFC2R1Y2tBc3NldElkAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEB3JvYkNvc3QJAJYDAQkAzAgCBQ5yb2JiZXJ5Q29zdE1pbgkAzAgCCQBlAgULbGFzdFJvYkNvc3QJAGgCBRRyb2JiZXJ5Q29vbGRvd25Db2VmZgkAZQIFA25vdwULbGFzdFJvYlRpbWUFA25pbAQJZHVja1N0YXRlCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBE2tleUR1Y2tSb2JiZXJ5U3RhdGUBBQtkdWNrQXNzZXRJZAAABApsb2NrZWRMYW5kCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBE2tleUxvY2tlZExhbmRCeUR1Y2sBBQtkdWNrQXNzZXRJZAIABAdsYW5kRVRBCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBEmtleUxhbmRDb29sZG93bkVUQQEFCmxvY2tlZExhbmQAAAkAlwoFBQdyb2JDb3N0BQtsYXN0Um9iVGltZQUJZHVja1N0YXRlBQpsb2NrZWRMYW5kBQdsYW5kRVRBAQR0YW5oAQF2BAZkb3VibGUJAGgCAAIFAXYEBGV4cDIJAGwGANeJz4EBAAgFBmRvdWJsZQAIAAgFBkhBTEZVUAkAbgQJAGUCBQRleHAyBQZTQ0FMRTgFBlNDQUxFOAkAZAIFBGV4cDIFBlNDQUxFOAUGSEFMRlVQARBkb2RnZVByb2JhYmlsaXR5AwVjaGFycwVidWZmcw1lcXVpcG1lbnRQZXJjBAVpbnRlbAkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckludGVsbGVjdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWJ1ZmZzBQ1jaGFySW50ZWxsZWN0BANkZXgJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDWNoYXJEZXh0ZXJpdHkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVidWZmcwUNY2hhckRleHRlcml0eQQGZmlyc3Q4CQBpAgkBBHRhbmgBCQBrAwUDZGV4BQZTQ0FMRTgAyAEABAQHc2Vjb25kOAkAbgQFDWVxdWlwbWVudFBlcmMJAGQCBQZTQ0FMRTgJAG4EAMCfqwMFBWludGVsCQBkAgABBQVpbnRlbAUGSEFMRlVQAGQFBkhBTEZVUAkAZAIFBmZpcnN0OAUHc2Vjb25kOAEQZGFtYWdlQWJzb3JwdGlvbgMFY2hhcnMFYnVmZnMOZXF1aXBtZW50QWJzb3IEBWludGVsCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFySW50ZWxsZWN0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFYnVmZnMFDWNoYXJJbnRlbGxlY3QEBWVuZHVyCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFyRW5kdXJhbmNlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFYnVmZnMFDWNoYXJFbmR1cmFuY2UEA2RleAkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckRleHRlcml0eQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWJ1ZmZzBQ1jaGFyRGV4dGVyaXR5BAZmaXJzdDgJAGgCBQ5lcXVpcG1lbnRBYnNvcgkAZAIFBlNDQUxFOAkAbgQAgL/WBgUFaW50ZWwJAGQCAAEFBWludGVsBQZIQUxGVVAEB3NlY29uZDgJAGkCCQEEc3FydAQFA2RleAAAAAgFBkhBTEZVUAAKBAZ0aGlyZDgJAGgCCQBpAgUGU0NBTEU4AAUFBWVuZHVyCQBkAgkAZAIFBmZpcnN0OAUHc2Vjb25kOAUGdGhpcmQ4AApBUlRQUkVTQUxFAgdQUkVTQUxFAApBUlRPTkJPQVJEAgdPTkJPQVJEAAZOVU1SRVMABgAPREFJTFlSRVNCWVBJRUNFAID40gEADFdITVVMVElQTElFUgCAyK+gJQAQUkVTT1VSQ0VQUklDRU1JTgDVtQIADUVTTUFYUEFDS0FHRVMACgAJRVNCVVlDT0VGAAQACkVTU0VMTENPRUYACgAJQ09FRkYyTUFUAICt4gQAEHByb2R1Y3Rpb25NYXRyaXgJAMwIAgIlOF84XzhfMTdfMTdfNDJfMTJfMF8zMF8wLDAsMCwwLDAsMCwwXwkAzAgCAiU4XzhfOF8xN18xN180Ml8yNF8wXzYwXzAsMCw1LDIsMCwwLDBfCQDMCAICJzhfOF84XzE3XzE3XzQyXzM2XzBfMTIwXzAsMCwxMCw0LDAsMCwwXwkAzAgCAik4XzE5XzE5XzhfMjdfMTlfMjZfMV8yMF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAik4XzE5XzE5XzhfMjdfMTlfNTJfMV80MF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAik4XzE5XzE5XzhfMjdfMTlfNzhfMV84MF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAiU4XzhfOF84XzhfNjBfMTNfMl8yXzAsMCwwLDAsMCwwLDBfMDExCQDMCAICJThfOF84XzhfOF82MF8yNl8yXzRfMCwwLDAsMCwwLDAsMF8wMTEJAMwIAgIlOF84XzhfOF84XzYwXzM5XzJfOF8wLDAsMCwwLDAsMCwwXzAxMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfMzBfM18zMF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfNjBfM181MF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfOTBfM183MF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAisxOF8xOF8xMF8xOF8xOF8xOF8xMV80XzEwXzAsMCwwLDAsMCwwLDBfMjAxCQDMCAICKzE4XzE4XzEwXzE4XzE4XzE4XzIyXzRfMjBfMCwwLDAsMCwwLDAsMF8yMDEJAMwIAgIrMThfMThfMTBfMThfMThfMThfMzNfNF8zMF8wLDAsMCwwLDAsMCwwXzIwMQkAzAgCAio0XzEzXzIyXzRfMzVfMjJfMjNfMF81MCwxLDBfMCwwLDAsMCwwLDAsMF8JAMwIAgIqNF8xM18yMl80XzM1XzIyXzQ2XzBfNTAsMSwxXzAsMiw1LDAsMCwwLDBfCQDMCAICKzRfMTNfMjJfNF8zNV8yMl82OV8wXzUwLDIsMV8wLDUsMTAsMCwwLDAsMF8JAMwIAgIqNV8yNV80MF81XzEwXzE1XzIwXzFfMzAsMSwxXzAsMCwwLDAsMCwwLDBfCQDMCAICKjVfMjVfNDBfNV8xMF8xNV80MF8xXzMwLDEsMl8yLDEsMywwLDAsMCwwXwkAzAgCAio1XzI1XzQwXzVfMTBfMTVfNjBfMV8zMCwxLDNfNSwyLDgsMCwwLDAsMF8JAMwIAgIlMjNfMjNfNV8yMF8yM182XzM1XzJfMF8wLDAsMCwwLDAsMCwwXwkAzAgCAiUyM18yM181XzIwXzIzXzZfNzBfMl8wXzAsMCwwLDAsMCwwLDBfCQDMCAICJjIzXzIzXzVfMjBfMjNfNl8xMDVfMl8wXzAsMCwwLDAsMCwwLDBfBQNuaWwACXJJZHhDb2VmZgAGAApySWR4RWZmZWN0AAgADlBST0RVQ1RQS0dTSVpFAAoBFWtleUxhbmRBc3NldElkVG9Pd25lcgEHYXNzZXRJZAkArAICAgNub18FB2Fzc2V0SWQBGmtleUxhbmRBc3NldElkVG9DdXN0b21OYW1lAQdhc3NldElkCQCsAgICBWxjbmFfBQdhc3NldElkARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQdhc3NldElkCQCsAgICA3N0XwUHYXNzZXRJZAEga2V5TGFuZEFydFN0YXR1c0J5VHlwZUFuZEFzc2V0SWQCBHR5cGUHYXNzZXRJZAkAuQkCCQDMCAICA2xhcwkAzAgCBQR0eXBlCQDMCAIFB2Fzc2V0SWQFA25pbAIBXwESa2V5V2FyZWhvdXNlQnlMYW5kAQtsYW5kQXNzZXRJZAkArAICAgN3aF8FC2xhbmRBc3NldElkARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQdhc3NldElkCQCsAgICC2luZnJhTGV2ZWxfBQdhc3NldElkARdrZXlGb3J0aWZpY2F0aW9uc0J5TGFuZAELbGFuZEFzc2V0SWQJAKwCAgIPZm9ydGlmaWNhdGlvbnNfBQtsYW5kQXNzZXRJZAEaa2V5RHVja0Fzc2V0SWRUb0N1c3RvbU5hbWUBB2Fzc2V0SWQJAKwCAgIYZHVja0N1c3RvbU5hbWVCeUFzc2V0SWRfBQdhc3NldElkARZrZXlBZGRyZXNzVG9DdXN0b21OYW1lAQRhZGRyCQCsAgICGGFjY291bnRDdXN0b21OYW1lQnlBZGRyXwUEYWRkcgEPa2V5QWRkcmVzc1JlZkJ5AQRhZGRyCQCsAgICCWFjY1JlZkJ5XwUEYWRkcgEca2V5T25ib2FyZEFydER1Y2tBY3RpdmF0ZWRCeQEEYWRkcgkArAICAhpvbmJvYXJkQXJ0QWN0aXZhdGVkRHVja0J5XwUEYWRkcgETa2V5QWRkcmVzc1JlZmVycmFscwEEYWRkcgkArAICAg1hY2NSZWZlcnJhbHNfBQRhZGRyARBrZXlEdWNrSWRUb093bmVyAQdhc3NldElkCQCsAgICCmR1Y2tPd25lcl8FB2Fzc2V0SWQBFGtleVN0YWtlZER1Y2tCeU93bmVyAQlvd25lckFkZHIJAKwCAgISc3Rha2VkRHVja0J5T3duZXJfBQlvd25lckFkZHIBD2tleUR1Y2tMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgINZHVja0xvY2F0aW9uXwULZHVja0Fzc2V0SWQBDmtleU9yZGVyQnlMYW5kAQtsYW5kQXNzZXRJZAkArAICAgpsYW5kT3JkZXJfBQtsYW5kQXNzZXRJZAEOa2V5RXNXYXJlaG91c2UAAhplbWVyZ2VuY3lXYXJlaG91c2VQcm9kdWN0cwANbGFzdFRvdXJJZEtleQIOJXNfX2xhc3RUb3VySWQBFWtleVRvdXJTdGF0aWNEYXRhQnlJZAEDdElkCQCsAgICFiVzJWRfX3RvdXJTdGF0aWNEYXRhX18JAKQDAQUDdElkARZrZXlUb3VyRHluYW1pY0RhdGFCeUlkAQN0SWQJAKwCAgIXJXMlZF9fdG91ckR5bmFtaWNEYXRhX18JAKQDAQUDdElkARNrZXlTY29yZUJvYXJkQnlUb3VyAQN0SWQJAKwCAgISJXMlZF9fc2NvcmVCb2FyZF9fCQCkAwEFA3RJZAEca2V5SXNSZWdpc3RlcmVkQnlUb3VyQW5kRHVjawIDdElkC2R1Y2tBc3NldElkCQC5CQIJAMwIAgIhJXMlZCVzX19pc1JlZ2lzdGVyZWRCeVRvdXJBbmREdWNrCQDMCAIJAKQDAQUDdElkCQDMCAIFC2R1Y2tBc3NldElkBQNuaWwCAl9fARlrZXlJc0F3YXJkZWRCeVRvdXJBbmREdWNrAgN0SWQLZHVja0Fzc2V0SWQJALkJAgkAzAgCAh4lcyVkJXNfX2lzQXdhcmRlZEJ5VG91ckFuZER1Y2sJAMwIAgkApAMBBQN0SWQJAMwIAgULZHVja0Fzc2V0SWQFA25pbAICX18BG2tleUxhc3RBdHRlbXB0QnlUb3VyQW5kRHVjawIDdElkC2R1Y2tBc3NldElkCQC5CQIJAMwIAgIgJXMlZCVzX19sYXN0QXR0ZW1wdEJ5VG91ckFuZER1Y2sJAMwIAgkApAMBBQN0SWQJAMwIAgULZHVja0Fzc2V0SWQFA25pbAICX18BGmtleUJlc3RSZXN1bHRCeVRvdXJBbmREdWNrAgN0SWQLZHVja0Fzc2V0SWQJALkJAgkAzAgCAh8lcyVkJXNfX2Jlc3RSZXN1bHRCeVRvdXJBbmREdWNrCQDMCAIJAKQDAQUDdElkCQDMCAIFC2R1Y2tBc3NldElkBQNuaWwCAl9fARZrZXlCZXN0VHhCeVRvdXJBbmREdWNrAgN0SWQLZHVja0Fzc2V0SWQJALkJAgkAzAgCAhslcyVkJXNfX2Jlc3RUeEJ5VG91ckFuZER1Y2sJAMwIAgkApAMBBQN0SWQJAMwIAgULZHVja0Fzc2V0SWQFA25pbAICX18ACWlkeFN0YXRpYwAAAAppZHhEeW5hbWljAAEAE3RTdGF0aWNSZWdpc3RlckNvc3QAAgASdFN0YXRpY0F0dGVtcHRDb3N0AAMADHRTdGF0aWNTdGFydAAFAAp0U3RhdGljRW5kAAYAEHRTdGF0aWNOdW1HcmFuZHMABwAQdFN0YXRpY1ByaXplRnVuZAAIAAx0U3RhdGljQXNzZXQACQAOdER5bmFtaWNTdGF0dXMAAQAPdER5bmFtaWNMZWFkZXJzAAIAEXREeW5hbWljV2luUmVzdWx0AAMAFXREeW5hbWljVG90YWxSZWdDb3VudAAEABV0RHluYW1pY1RvdGFsQXR0ZW1wdHMABQELZ2V0VG91ckRhdGECDHRvdXJDb250cmFjdAN0SWQEBnN0YXRpYwkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMdG91ckNvbnRyYWN0CQEVa2V5VG91clN0YXRpY0RhdGFCeUlkAQUDdElkCQCsAgIJAKwCAgIZRXJyb3IgcmVhZGluZyB0b3VybmFtZW50IAkApAMBBQN0SWQCBSBkYXRhAgJfXwQHZHluYW1pYwkAvAkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMdG91ckNvbnRyYWN0CQEWa2V5VG91ckR5bmFtaWNEYXRhQnlJZAEFA3RJZAkArAICCQCsAgICGUVycm9yIHJlYWRpbmcgdG91cm5hbWVudCAJAKQDAQUDdElkAgUgZGF0YQICX18JAMwIAgUGc3RhdGljCQDMCAIFB2R5bmFtaWMFA25pbAESZ2V0UmVjaXBlTWF0ZXJpYWxzAQZyZWNpcGUJAGgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlBQlySWR4Q29lZmYFCUNPRUZGMk1BVAAWS1NfU0VQQVJBVEVfUFVCTElDX0tFWQcABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAANwdWIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDADBRZLU19TRVBBUkFURV9QVUJMSUNfS0VZASCrF1ePFWfjWVRBsNZy62abxKPTZl7VmYZQ35g3H7IJCAEgT1PiGj9UqNadUk4THUYnVb2zU/Mse8lUVLD/Q8G0FCgDCQAAAgEBVAUHJG1hdGNoMAEgT1PiGj9UqNadUk4THUYnVb2zU/Mse8lUVLD/Q8G0FCgJAAIBAg1Vbmtub3duIGNoYWluAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgARSW5mcmFVcGdyYWRlQ29zdFMEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAAgMivoCUDCQAAAgEBVAUHJG1hdGNoMACAwtcvCQACAQINVW5rbm93biBjaGFpbgADU0VQAgJfXwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAAVTU0laRQAZAAVNU0laRQBkAAVMU0laRQDhAQAGWExTSVpFAJADAAdYWExTSVpFAPEEAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQARSWR4Q2ZnRWNvbm9teURhcHAAAgANSWR4Q2ZnV2xnRGFwcAAEABRJZHhDZmdQdXp6bGVQb29sRGFwcAAFABRJZHhDZmdJbnZlc3RGdW5kRGFwcAAGABRJZHhDZmdUb3VybmFtZW50RGFwcAAHAA9JZHhDZmdBY3Jlc0RhcHAACAEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAAPZWNvbm9teUNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnRWNvbm9teURhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUNSWR4Q2ZnV2xnRGFwcAAScHV6emxlUG9vbENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUUSWR4Q2ZnUHV6emxlUG9vbERhcHAAEmludmVzdEZ1bmRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ0ludmVzdEZ1bmREYXBwABJ0b3VybmFtZW50Q29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdUb3VybmFtZW50RGFwcAANYWNyZXNDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFD0lkeENmZ0FjcmVzRGFwcAAKcmVjTGFuZE51bQAAAAtyZWNMYW5kU2l6ZQABAAtyZWNUZXJyYWlucwACAAxyZWNDb250aW5lbnQAAwANd2xnQXNzZXRJZEtleQILd2xnX2Fzc2V0SWQACndsZ0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQt3bGdDb250cmFjdAUNd2xnQXNzZXRJZEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0ABRhY3Jlc0lzc3VlZEFtb3VudEtleQIRYWNyZXNJc3N1ZWRBbW91bnQAD2FjcmVzQXNzZXRJZEtleQIMYWNyZXNBc3NldElkAAxhY3Jlc0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQ1hY3Jlc0NvbnRyYWN0BQ9hY3Jlc0Fzc2V0SWRLZXkCF0FDUkVTIGlzIG5vdCBpc3N1ZWQgeWV0AAxpZHhXbGdBbW91bnQAAAALaWR4V2xnUHJpY2UAAQALaWR4V2xnRnVuZHMAAgANaWR4V2xnRWNvbm9teQADAA5pZHhXbGdBY3Rpdml0eQAEAA9pZHhXbGdBcmJpdHJhZ2UABQAKaWR4V2xnUG9vbAAGAA9pZHhXbGdJc3N1ZVRpbWUABwARaWR4V2xnTGFzdE1UQVRpbWUACAAUaWR4V2xnTWFya2V0aW5nVG90YWwACQAVaWR4V2xnTWFya2V0aW5nQW1MZWZ0AAoAGWlkeFdsZ01hcmtldGluZ0FtQXZhaWxOb3cACwAVaWR4V2xnTWFya2V0aW5nV2xnb2xkAAwAD2lkeFdsZ1RlYW1Ub3RhbAANABBpZHhXbGdUZWFtQW1MZWZ0AA4AFGlkeFdsZ1RlYW1BbUF2YWlsTm93AA8AEGlkeFdsZ1RlYW1XbGdvbGQAEAAOaWR4V2xnQWN0VG90YWwAEQAPaWR4V2xnQWN0QW1MZWZ0ABIAE2lkeFdsZ0FjdEFtQXZhaWxOb3cAEwAPaWR4V2xnQWN0V2xnb2xkABQAD2lkeFdsZ0N1clBlcmlvZAAVABFpZHhXbGdBbUxlZnRUb3RhbAAWABtpZHhXbGdDdXJQZXJpb2REaXN0cmlidXRpb24AFwASaWR4V2xnTGFzdFVzZXJUaW1lABgAFGlkeFdsZ1VzZXJBbUF2YWlsTm93ABkAFmlkeFdsZ1NMYW5kRGFpbHlBbW91bnQAGgAWaWR4V2xnSW52ZXN0RnVuZEFtb3VudAAbABRpZHhXbGdVc2VyVG90YWxBdmFpbAAcABFpZHhXbGdFZmZVc2VyVGltZQAdAApJZHhFZmZVc2VyAAEBEWtleVJlc1Byb3BvcnRpb25zAAITcmVzVHlwZXNQcm9wb3J0aW9ucwEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQlvd25lckFkZHIJAKwCAgITc3Rha2VkTGFuZHNCeU93bmVyXwUJb3duZXJBZGRyARZrZXlTdGFrZWRQaWVjZXNCeU93bmVyAQlvd25lckFkZHIJAKwCAgIUc3Rha2VkUGllY2VzQnlPd25lcl8FCW93bmVyQWRkcgEIYXNTdHJpbmcBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBCWFzQW55TGlzdAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAglMaXN0W0FueV0EAWwFByRtYXRjaDAFAWwJAAIBAhtmYWlsIHRvIGNhc3QgaW50byBMaXN0W0FueV0BD251bVBpZWNlc0J5U2l6ZQEIbGFuZFNpemUEByRtYXRjaDAFCGxhbmRTaXplAwkAAAICAVMFByRtYXRjaDAFBVNTSVpFAwkAAAICAU0FByRtYXRjaDAFBU1TSVpFAwkAAAICAUwFByRtYXRjaDAFBUxTSVpFAwkAAAICAlhMBQckbWF0Y2gwBQZYTFNJWkUDCQAAAgIDWFhMBQckbWF0Y2gwBQdYWExTSVpFCQACAQIRVW5rbm93biBsYW5kIHNpemUBCmtleUJsb2NrZWQAAhBjb250cmFjdHNCbG9ja2VkARFrZXlMYXN0VHhJZEJ5VXNlcgEEYWRkcgkArAICAg9sYXN0VHhJZEJ5VXNlcl8FBGFkZHIBDmdldFZvdGluZ1Bvd2VyARJ1c2VyQWRkclN0ck9yRW1wdHkEBXByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQERa2V5UmVzUHJvcG9ydGlvbnMAAgswXzBfMF8wXzBfMAIBXwoBBWFkZGVyAgNhY2MEaXRlbQkAZAIFA2FjYwkBDXBhcnNlSW50VmFsdWUBBQRpdGVtBAp0b3RhbFBvd2VyCgACJGwFBXByb3BzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgQKdXNlcnNQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRQaWVjZXNCeU93bmVyAQUSdXNlckFkZHJTdHJPckVtcHR5AAAJAMwIAgUKdG90YWxQb3dlcgkAzAgCBQp1c2Vyc1Bvd2VyBQNuaWwADVVTRFRQUklaRVBBUlQAoMIeARJhc0xpc3RJbnRDb21wYWN0ZWQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACCUxpc3RbQW55XQQKdmFsQW55TGlzdAUHJG1hdGNoMAMJAQIhPQIJAJADAQUKdmFsQW55TGlzdAUGTlVNUkVTCQACAQkArAICAg5BcnJheSBzaXplIGlzIAkApAMBCQCQAwEFCnZhbEFueUxpc3QKAQRjb252AgNhY2MEaXRlbQQHJG1hdGNoMQUEaXRlbQMJAAECBQckbWF0Y2gxAgNJbnQEAml0BQckbWF0Y2gxCQDNCAIFA2FjYwkApAMBBQJpdAkAAgECFExpc3QgdHlwZSBpcyBub3QgSW50BAFyCgACJGwFCnZhbEFueUxpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGNvbnYCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYJALkJAgUBcgIBXwkAAgECFmZhaWwgdG8gY2FzdCBpbnRvIExpc3QBDWFzU3BsaXRSZXN1bHQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACFihMaXN0W0FueV0sIExpc3RbQW55XSkEAnQyBQckbWF0Y2gwCQCUCgIJARJhc0xpc3RJbnRDb21wYWN0ZWQBCAUCdDICXzEJARJhc0xpc3RJbnRDb21wYWN0ZWQBCAUCdDICXzIJAAIBAh5mYWlsIHRvIGNhc3QgaW50byAoTGlzdCwgTGlzdCkBE2FzQ2FuY2VsT3JkZXJSZXN1bHQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACEShCb29sZWFuLCBTdHJpbmcpBAJ0MgUHJG1hdGNoMAUCdDIJAAIBAiNmYWlsIHRvIGNhc3QgaW50byAoQm9vbGVhbiwgU3RyaW5nKQEOd2FsbGV0SW50ZXJuYWwBDnVzZXJBZGRyZXNzT3B0BARhZGRyCQCmCAEFDnVzZXJBZGRyZXNzT3B0BAdiYWxhbmNlAwkBCWlzRGVmaW5lZAEFBGFkZHIJAO8HAQkBBXZhbHVlAQUEYWRkcgkBDkJhbGFuY2VEZXRhaWxzBAAAAAAAAAAABAt1c2R0QmFsYW5jZQMJAQlpc0RlZmluZWQBBQRhZGRyCQDwBwIJAQV2YWx1ZQEFBGFkZHIFC3VzZHRBc3NldElkAAAEDXdsZ29sZEJhbGFuY2UDCQEJaXNEZWZpbmVkAQUEYWRkcgkA8AcCCQEFdmFsdWUBBQRhZGRyBQp3bGdBc3NldElkAAAECmN1c3RvbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5QWRkcmVzc1RvQ3VzdG9tTmFtZQEFDnVzZXJBZGRyZXNzT3B0BQ51c2VyQWRkcmVzc09wdAQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQ51c2VyQWRkcmVzc09wdAQFcmVmQnkJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQhyZWZCeUtleQQEcmVmcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARNrZXlBZGRyZXNzUmVmZXJyYWxzAQUOdXNlckFkZHJlc3NPcHQCAAQIbGFzdFR4SWQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQERa2V5TGFzdFR4SWRCeVVzZXIBBQ51c2VyQWRkcmVzc09wdAIABAZwaWVjZXMJAJEDAgkBDmdldFZvdGluZ1Bvd2VyAQUOdXNlckFkZHJlc3NPcHQFCklkeEVmZlVzZXIEAnhwCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBCWtleVVzZXJYUAEFDnVzZXJBZGRyZXNzT3B0AAAEA2x2bAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlVc2VyTGV2ZWwBBQ51c2VyQWRkcmVzc09wdAAABApmcmVlUG9pbnRzCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBEWtleVVzZXJGcmVlUG9pbnRzAQUOdXNlckFkZHJlc3NPcHQAAAQLdmlydFdsZ0RhdGEKAAFACQD8BwQFC3dsZ0NvbnRyYWN0AhJjaGVja1dsZ1hwUkVBRE9OTFkJAMwIAgUOdXNlckFkZHJlc3NPcHQFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQQMc3Rha2VkV2xnb2xkCQELdmFsdWVPckVsc2UCCQCaCAIFC3dsZ0NvbnRyYWN0CQEYa2V5V2xnU3Rha2VkQW1vdW50QnlVc2VyAQUOdXNlckFkZHJlc3NPcHQAAAQHb25ib2FyZAMJAQlpc0RlZmluZWQBBQVyZWZCeQkArAICBQpBUlRPTkJPQVJEAwMJAQlpc0RlZmluZWQBBQRhZGRyCQEJaXNEZWZpbmVkAQkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARxrZXlPbmJvYXJkQXJ0RHVja0FjdGl2YXRlZEJ5AQUOdXNlckFkZHJlc3NPcHQHAgI6MQICOjACAAQMYWNyZXNCYWxhbmNlAwkBCWlzRGVmaW5lZAEFBGFkZHIJAPAHAgkBBXZhbHVlAQUEYWRkcgUMYWNyZXNBc3NldElkAAAEC3N0YWtlZEFjcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFDWFjcmVzQ29udHJhY3QJARprZXlBY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcgEFDnVzZXJBZGRyZXNzT3B0AAAECmRlbGl2Q291bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5VXNlckRlbGl2ZXJ5Q291bnQBBQ51c2VyQWRkcmVzc09wdAAABAxsYXN0RGVsaXZEYXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5VXNlckxhc3REZWxpdmVyeURheQEFDnVzZXJBZGRyZXNzT3B0AAAJAMwIAgkArAICAhIlcyVzX19jdXN0b21OYW1lX18FCmN1c3RvbU5hbWUJAMwIAgkArAICAhIlcyVzX19yZWZlcnJlZEJ5X18JAQt2YWx1ZU9yRWxzZQIFBXJlZkJ5AgAJAMwIAgkArAICAhElcyVzX19yZWZlcnJhbHNfXwUEcmVmcwkAzAgCCQCsAgICECVzJXNfX2xhc3RUeElkX18FCGxhc3RUeElkCQDMCAIJAKwCAgIUJXMlZF9fd2F2ZXNCYWxhbmNlX18JAKQDAQgFB2JhbGFuY2UJYXZhaWxhYmxlCQDMCAIJAKwCAgIVJXMlZF9fd2xnb2xkQmFsYW5jZV9fCQCkAwEFDXdsZ29sZEJhbGFuY2UJAMwIAgkArAICAhMlcyVkX191c2R0QmFsYW5jZV9fCQCkAwEFC3VzZHRCYWxhbmNlCQDMCAIJAKwCAgIUJXMlZF9fc3Rha2VkUGllY2VzX18JAKQDAQUGcGllY2VzCQDMCAIJAKwCAgIUJXMlZF9fYWNyZXNCYWxhbmNlX18JAKQDAQUMYWNyZXNCYWxhbmNlCQDMCAIJAKwCAgITJXMlZF9fc3Rha2VkQWNyZXNfXwkApAMBBQtzdGFrZWRBY3JlcwkAzAgCCQCsAgICESVzJWRfX2N1cnJlbnRYcF9fCQCkAwEFAnhwCQDMCAIJAKwCAgISJXMlZF9fY3VycmVudEx2bF9fCQCkAwEFA2x2bAkAzAgCCQCsAgICGiVzJWRfX3BvaW50c1RvRGlzdHJpYnV0ZV9fCQCkAwEFCmZyZWVQb2ludHMJAMwIAgkArAICAhclcyVzX193YWxsZXRBcnRlZmFjdHNfXwUHb25ib2FyZAkAzAgCCQCsAgICFCVzJWRfX3N0YWtlZFdsZ29sZF9fCQCkAwEFDHN0YWtlZFdsZ29sZAkAzAgCCQCsAgICESVzJWRfX3ZpcnRMZXZlbF9fCQCkAwEKAAFACQCRAwIFC3ZpcnRXbGdEYXRhAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQDMCAIJAKwCAgISJXMlZF9fdmlydFBvaW50c19fCQCkAwEKAAFACQCRAwIFC3ZpcnRXbGdEYXRhAAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQDMCAIJAKwCAgIOJXMlZF9fdmlydFhQX18JAKQDAQoAAUAJAJEDAgULdmlydFdsZ0RhdGEAAgMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAMwIAgkArAICAhklcyVkX191c2VyRGVsaXZlcnlDb3VudF9fCQCkAwEFCmRlbGl2Q291bnQJAMwIAgkArAICAhslcyVkX191c2VyTGFzdERlbGl2ZXJ5RGF5X18JAKQDAQUMbGFzdERlbGl2RGF5CQDMCAIJAKwCAgITJXMlZF9fbG9ja2VkQWNyZXNfXwkApAMBCQELdmFsdWVPckVsc2UCCQCaCAIFDWFjcmVzQ29udHJhY3QJARprZXlBY3Jlc0xvY2tlZEFtb3VudEJ5VXNlcgEFDnVzZXJBZGRyZXNzT3B0AAAJAMwIAgkArAICAhYlcyVkX19FVEFMb2NrZWRBY3Jlc19fCQCkAwEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNYWNyZXNDb250cmFjdAkBF2tleUFjcmVzTG9ja2VkRXRhQnlVc2VyAQUOdXNlckFkZHJlc3NPcHQAAAUDbmlsAQxhcHBseUJvbnVzZXMCC2xhbmRBc3NldElkBnBpZWNlcwQKaW5mcmFMZXZlbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQULbGFuZEFzc2V0SWQAAAQJYXJ0UGllY2VzCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgUKQVJUUFJFU0FMRQULbGFuZEFzc2V0SWQAAAQEYWRkNgkAaQIFCmluZnJhTGV2ZWwABgQEYWRkNwkAaQIFCmluZnJhTGV2ZWwABwkAlQoDBQppbmZyYUxldmVsBQlhcnRQaWVjZXMJAGQCCQBkAgUPREFJTFlSRVNCWVBJRUNFCQBrAwUPREFJTFlSRVNCWVBJRUNFCQBkAgkAZAIFCmluZnJhTGV2ZWwFBGFkZDYJAGgCAAIFBGFkZDcABQkAawMFD0RBSUxZUkVTQllQSUVDRQUJYXJ0UGllY2VzCQBoAgUGcGllY2VzAAUBF2dldFdhcmVob3VzZVRvdGFsVm9sdW1lAQl2b2xQcmVmaXgEBXBhcnRzCQC1CQIFCXZvbFByZWZpeAIBXwkAaAIJAGgCBQxXSE1VTFRJUExJRVIJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAQABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAAEMZ2V0V2FyZWhvdXNlAwV3aEtleQlsYW5kSW5kZXgKaW5mcmFMZXZlbAQJdm9sUHJlZml4CQCsAgIJAKwCAgkApAMBBQlsYW5kSW5kZXgCAV8JAKQDAQUKaW5mcmFMZXZlbAQEdG90UwkApAMBCQEXZ2V0V2FyZWhvdXNlVG90YWxWb2x1bWUBBQl2b2xQcmVmaXgEBXdoU3RyCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAUFd2hLZXkJAKwCAgkArAICCQCsAgIJAKwCAgUJdm9sUHJlZml4Ah46MF8wXzBfMF8wXzA6MF8wXzBfMF8wXzA6OjBfMF8FBHRvdFMCAV8FBHRvdFMJALUJAgUFd2hTdHICAToBDWR1Y2tJbmZvVHVwbGUBC2R1Y2tBc3NldElkBAVtYXhIUAkBCW1heEhlYWx0aAEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEMa2V5RHVja0xldmVsAQULZHVja0Fzc2V0SWQAAAkAlwoFCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtkdWNrQXNzZXRJZAD///////////8BCAkBBXZhbHVlAQkA7AcBCQDZBAEFC2R1Y2tBc3NldElkBG5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQCAAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQFBW1heEhQCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAITZ2V0QmFja3BhY2tSRUFET05MWQkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsBQNuaWwBDWR1Y2tJbmZvQXJyYXkDC2R1Y2tBc3NldElkBW93bmVyB2R1Y2tJbmYECmN1c3RvbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEaa2V5RHVja0Fzc2V0SWRUb0N1c3RvbU5hbWUBBQtkdWNrQXNzZXRJZAgFB2R1Y2tJbmYCXzIEBWNoYXJzCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBDGtleUR1Y2tDaGFycwEFC2R1Y2tBc3NldElkAgkwXzBfMF8wXzAEAnhwCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBCWtleUR1Y2tYUAEFC2R1Y2tBc3NldElkAAAEA2x2bAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlEdWNrTGV2ZWwBBQtkdWNrQXNzZXRJZAAABApmcmVlUG9pbnRzCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBEWtleUR1Y2tGcmVlUG9pbnRzAQULZHVja0Fzc2V0SWQAAAQGZXF1aXBtCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBEGtleUR1Y2tFcXVpcG1lbnQBBQtkdWNrQXNzZXRJZAILO187XztfO187XzsEBWJ1ZmZzCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBDGtleUR1Y2tCdWZmcwEFC2R1Y2tBc3NldElkAgkwXzBfMF8wXzAECyR0MDcxMzY3MjQxCQEOZ2V0Um9iYmVyeURhdGECBQ9zdGFraW5nQ29udHJhY3QFC2R1Y2tBc3NldElkBAdyb2JDb3N0CAULJHQwNzEzNjcyNDECXzEEC2xhc3RSb2JUaW1lCAULJHQwNzEzNjcyNDECXzIECWR1Y2tTdGF0ZQgFCyR0MDcxMzY3MjQxAl8zBApsb2NrZWRMYW5kCAULJHQwNzEzNjcyNDECXzQEB2xhbmRFVEEIBQskdDA3MTM2NzI0MQJfNQQQZGVsaXZlcnlEZWxheUVUQQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlEZWxpdmVyeURlbGF5QnlEdWNrAQULZHVja0Fzc2V0SWQAAAkAzAgCCQCsAgICDyVzJXNfX2Fzc2V0SWRfXwULZHVja0Fzc2V0SWQJAMwIAgkArAICAg0lcyVzX19vd25lcl9fBQVvd25lcgkAzAgCCQCsAgICEiVzJXNfX2N1c3RvbU5hbWVfXwUKY3VzdG9tTmFtZQkAzAgCCQCsAgICEiVzJWRfX3N0YWtlZFRpbWVfXwkApAMBCAUHZHVja0luZgJfMQkAzAgCCQCsAgICDCVzJXNfX25hbWVfXwgFB2R1Y2tJbmYCXzIJAMwIAgkArAICAhAlcyVzX19sb2NhdGlvbl9fCAUHZHVja0luZgJfMwkAzAgCCQCsAgICDiVzJWRfX2hlYWx0aF9fCQCkAwEIBQdkdWNrSW5mAl80CQDMCAIJAKwCAgIRJXMlZF9fbWF4SGVhbHRoX18JAKQDAQkBCW1heEhlYWx0aAEFA2x2bAkAzAgCCQCsAgICFyVzJXNfX2NoYXJhY3RlcmlzdGljc19fBQVjaGFycwkAzAgCCQCsAgICESVzJWRfX2N1cnJlbnRYcF9fCQCkAwEFAnhwCQDMCAIJAKwCAgISJXMlZF9fY3VycmVudEx2bF9fCQCkAwEFA2x2bAkAzAgCCQCsAgICGiVzJWRfX3BvaW50c1RvRGlzdHJpYnV0ZV9fCQCkAwEFCmZyZWVQb2ludHMJAMwIAgkArAICAhAlcyVzX19iYWNrUGFja19fCAUHZHVja0luZgJfNQkAzAgCCQCsAgICESVzJXNfX2VxdWlwbWVudF9fBQZlcXVpcG0JAMwIAgkArAICAg0lcyVzX19idWZmc19fBQVidWZmcwkAzAgCCQCsAgICEyVzJWRfX3JvYmJlcnlDb3N0X18JAKQDAQUHcm9iQ29zdAkAzAgCCQCsAgICEyVzJWRfX3JvYmJlcnlUaW1lX18JAKQDAQULbGFzdFJvYlRpbWUJAMwIAgkArAICAhQlcyVzX19yb2JiZXJ5U3RhdGVfXwkAkQMCBQ1kdWNrUm9iU3RhdGVzBQlkdWNrU3RhdGUJAMwIAgkArAICAhclcyVzX19yb2JiZXJ5TGFzdExhbmRfXwUKbG9ja2VkTGFuZAkAzAgCCQCsAgICIiVzJWRfX3JvYmJlcnlMYXN0TGFuZFJlbGVhc2VUaW1lX18JAKQDAQUHbGFuZEVUQQkAzAgCCQCsAgICFSVzJWRfX2RlbGl2ZXJ5RGVsYXlfXwkApAMBBRBkZWxpdmVyeURlbGF5RVRBBQNuaWwBDWxhbmRJbmZvQXJyYXkDC2xhbmRBc3NldElkBW93bmVyCnN0YWtlZFRpbWUDCQAAAgULbGFuZEFzc2V0SWQCAAkAAgECF2xhbmRBc3NldElkIGlzIHJlcXVpcmVkBAFhCQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQEAWQJALUJAggFAWELZGVzY3JpcHRpb24CAV8EB2xhbmROdW0DCQBmAggFAWEIcXVhbnRpdHkAAAkAkQMCBQFkBQpyZWNMYW5kTnVtCQCsAgICAS0JAJEDAgUBZAUKcmVjTGFuZE51bQQGcGllY2VzCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCBQFkBQtyZWNMYW5kU2l6ZQQMcHJvZHVjdGl2aXR5CQEMYXBwbHlCb251c2VzAgULbGFuZEFzc2V0SWQFBnBpZWNlcwQJZGVsdGFUaW1lCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFCnN0YWtlZFRpbWUECGF2YWlsUmVzAwkAZgIFCnN0YWtlZFRpbWUAAAkAawMFCWRlbHRhVGltZQkAaAIIBQxwcm9kdWN0aXZpdHkCXzMFBnBpZWNlcwUJREFZTUlMTElTAAAEB25lZWRNYXQJAGsDBRFJbmZyYVVwZ3JhZGVDb3N0UwkAaAIFBnBpZWNlcwkAZAIIBQxwcm9kdWN0aXZpdHkCXzEAAQUFU1NJWkUEDmdsb2JhbEFuZExvY2FsAwkAZgIFCnN0YWtlZFRpbWUAAAkBDWFzU3BsaXRSZXN1bHQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIkc3BsaXRCeUdsb2JhbEFuZExvY2FsV2VpZ2h0c1JFQURPTkxZCQDMCAIFB25lZWRNYXQJAMwIAgUIYXZhaWxSZXMJAMwIAgkAkQMCBQFkBQtyZWNUZXJyYWlucwUDbmlsBQNuaWwJAJQKAgkBEmFzTGlzdEludENvbXBhY3RlZAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhxzcGxpdEJ5R2xvYmFsV2VpZ2h0c1JFQURPTkxZCQDMCAIFB25lZWRNYXQFA25pbAUDbmlsAgAECmN1c3RvbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEaa2V5TGFuZEFzc2V0SWRUb0N1c3RvbU5hbWUBBQtsYW5kQXNzZXRJZAkArAICCQCsAgIJAJEDAgUBZAUMcmVjQ29udGluZW50AgEtCQCRAwIFAWQFCnJlY0xhbmROdW0EBGZvcnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEXa2V5Rm9ydGlmaWNhdGlvbnNCeUxhbmQBBQtsYW5kQXNzZXRJZAIMOjBfMTU6MF8xODowBAVzdGF0ZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARNrZXlMYW5kUm9iYmVyeVN0YXRlAQULbGFuZEFzc2V0SWQAAAQLY29vbGRvd25FVEEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQESa2V5TGFuZENvb2xkb3duRVRBAQULbGFuZEFzc2V0SWQAAAkAzAgCCQCsAgICDyVzJXNfX2Fzc2V0SWRfXwULbGFuZEFzc2V0SWQJAMwIAgkArAICAg0lcyVzX19vd25lcl9fBQVvd25lcgkAzAgCCQCsAgICEiVzJXNfX2N1c3RvbU5hbWVfXwUKY3VzdG9tTmFtZQkAzAgCCQCsAgICEiVzJWRfX3N0YWtlZFRpbWVfXwkApAMBBQpzdGFrZWRUaW1lCQDMCAIJAKwCAgITJXMlc19fZGVzY3JpcHRpb25fXwkAuQkCCQDMCAIFB2xhbmROdW0JAMwIAgkAkQMCBQFkBQtyZWNMYW5kU2l6ZQkAzAgCCQCRAwIFAWQFC3JlY1RlcnJhaW5zCQDMCAIJAJEDAgUBZAUMcmVjQ29udGluZW50BQNuaWwCAV8JAMwIAgkArAICAhIlcyVkX19pbmZyYUxldmVsX18JAKQDAQgFDHByb2R1Y3Rpdml0eQJfMQkAzAgCCQCsAgICFiVzJXNfX2F2YWlsUmVzQnlUeXBlX18IBQ5nbG9iYWxBbmRMb2NhbAJfMgkAzAgCCQCsAgICFSVzJWRfX2F2YWlsUmVzVG90YWxfXwkApAMBBQhhdmFpbFJlcwkAzAgCCQCsAgICFCVzJXNfX25lZWRNYXRlcmlhbF9fCAUOZ2xvYmFsQW5kTG9jYWwCXzEJAMwIAgkArAICAh0lcyVzX19sYW5kQXJ0ZWZhY3RzX19QUkVTQUxFOgkApAMBCAUMcHJvZHVjdGl2aXR5Al8yCQDMCAIJAKwCAgIRJXMlc19fd2FyZWhvdXNlX18JALkJAgkBDGdldFdhcmVob3VzZQMJARJrZXlXYXJlaG91c2VCeUxhbmQBBQtsYW5kQXNzZXRJZAkAaQIFBnBpZWNlcwUFU1NJWkUIBQxwcm9kdWN0aXZpdHkCXzECAToJAMwIAgkArAICAhElcyVzX19sYW5kT3JkZXJfXwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9lY29ub215Q29udHJhY3QJAQ5rZXlPcmRlckJ5TGFuZAEFC2xhbmRBc3NldElkAjAwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDowQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDoJAMwIAgkArAICAhYlcyVzX19mb3J0aWZpY2F0aW9uc19fBQRmb3J0CQDMCAIJAKwCAgIUJXMlc19fcm9iYmVyeVN0YXRlX18JAJEDAgUNbGFuZFJvYlN0YXRlcwUFc3RhdGUJAMwIAgkArAICAhglcyVkX19jYW5CZVJvYmJlZEFmdGVyX18JAKQDAQULY29vbGRvd25FVEEFA25pbAESbGFuZE9yZGVySW5mb0FycmF5AgtsYW5kQXNzZXRJZAVvd25lcgMJAAACBQtsYW5kQXNzZXRJZAIACQACAQIXbGFuZEFzc2V0SWQgaXMgcmVxdWlyZWQEAWEJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAQBZAkAtQkCCAUBYQtkZXNjcmlwdGlvbgIBXwQGcGllY2VzCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCBQFkBQtyZWNMYW5kU2l6ZQQMcHJvZHVjdGl2aXR5CQEMYXBwbHlCb251c2VzAgULbGFuZEFzc2V0SWQFBnBpZWNlcwkAzAgCCQCsAgICDyVzJXNfX2Fzc2V0SWRfXwULbGFuZEFzc2V0SWQJAMwIAgkArAICAg0lcyVzX19vd25lcl9fBQVvd25lcgkAzAgCCQCsAgICESVzJXNfX3dhcmVob3VzZV9fCQC5CQIJAQxnZXRXYXJlaG91c2UDCQESa2V5V2FyZWhvdXNlQnlMYW5kAQULbGFuZEFzc2V0SWQJAGkCBQZwaWVjZXMFBVNTSVpFCAUMcHJvZHVjdGl2aXR5Al8xAgE6CQDMCAIJAKwCAgIRJXMlc19fbGFuZE9yZGVyX18JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPZWNvbm9teUNvbnRyYWN0CQEOa2V5T3JkZXJCeUxhbmQBBQtsYW5kQXNzZXRJZAIwMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6MEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6BQNuaWwBCnNsb3RFZmZlY3QBBHNsb3QDCQAAAgUEc2xvdAIAAAAEBXNsb3QwCQCRAwIJALUJAgUEc2xvdAIBLAAAAwkAAAIFBXNsb3QwAgAAAAQEcHJvZAkAtQkCBQVzbG90MAIBOgMDCQAAAgkAkQMCBQRwcm9kAAECAAYJAAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcHJvZAABAAAAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcHJvZAAAAgFfBQpySWR4RWZmZWN0AQ90b3VyU3RhdHNDb21tb24BDHRvdXJuYW1lbnRJZAQFdERhdGEJAQtnZXRUb3VyRGF0YQIFEnRvdXJuYW1lbnRDb250cmFjdAUMdG91cm5hbWVudElkBAZzdGF0aWMJAJEDAgUFdERhdGEFCWlkeFN0YXRpYwQHZHluYW1pYwkAkQMCBQV0RGF0YQUKaWR4RHluYW1pYwQHbGVhZGVycwMJAAACCQCRAwIFB2R5bmFtaWMFD3REeW5hbWljTGVhZGVycwIAAgEgCQCRAwIFB2R5bmFtaWMFD3REeW5hbWljTGVhZGVycwQKc2NvcmVCb2FyZAkBC3ZhbHVlT3JFbHNlAgkAnQgCBRJ0b3VybmFtZW50Q29udHJhY3QJARNrZXlTY29yZUJvYXJkQnlUb3VyAQUMdG91cm5hbWVudElkAgAECW51bUdyYW5kcwMJAGYCCQCQAwEFBnN0YXRpYwUQdFN0YXRpY051bUdyYW5kcwkAkQMCBQZzdGF0aWMFEHRTdGF0aWNOdW1HcmFuZHMCATAECXByaXplRnVuZAMJAGYCCQCQAwEFBnN0YXRpYwUQdFN0YXRpY1ByaXplRnVuZAkAkQMCBQZzdGF0aWMFEHRTdGF0aWNQcml6ZUZ1bmQCATAEB2Fzc2V0SWQDCQBmAgkAkAMBBQZzdGF0aWMFDHRTdGF0aWNBc3NldAkA2QQBCQCRAwIFBnN0YXRpYwUMdFN0YXRpY0Fzc2V0BQp3bGdBc3NldElkBAlhc3NldE5hbWUICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUHYXNzZXRJZAIWTm8gYXNzZXRJbmZvIGF2YWlsYWJsZQRuYW1lCQDMCAIJAKwCAgIcJXMlc19fdG91cm5hbWVudFN0YXRpY0RhdGFfXwkAuQkCCQDMCAIJAJEDAgUGc3RhdGljBRN0U3RhdGljUmVnaXN0ZXJDb3N0CQDMCAIJAJEDAgUGc3RhdGljBRJ0U3RhdGljQXR0ZW1wdENvc3QJAMwIAgkAkQMCBQZzdGF0aWMFDHRTdGF0aWNTdGFydAkAzAgCCQCRAwIFBnN0YXRpYwUKdFN0YXRpY0VuZAkAzAgCBQludW1HcmFuZHMJAMwIAgUJcHJpemVGdW5kCQDMCAIFCWFzc2V0TmFtZQUDbmlsAgFfCQDMCAIJAKwCAgIdJXMlc19fdG91cm5hbWVudER5bmFtaWNEYXRhX18JALoJAgkAzAgCCQCRAwIFB2R5bmFtaWMFDnREeW5hbWljU3RhdHVzCQDMCAIFB2xlYWRlcnMJAMwIAgkAkQMCBQdkeW5hbWljBRF0RHluYW1pY1dpblJlc3VsdAkAzAgCCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxSZWdDb3VudAkAzAgCCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxBdHRlbXB0cwUDbmlsAgFfCQDMCAIJAKwCAgIcJXMlc19fdG91cm5hbWVudFNjb3JlQm9hcmRfXwUKc2NvcmVCb2FyZAUDbmlsAQpnZXRBbnlEYXRhAgRhZGRyA2tleQQEYm9vbAkAmwgCBQRhZGRyBQNrZXkDCQEJaXNEZWZpbmVkAQUEYm9vbAkBBXZhbHVlAQUEYm9vbAQDYmluCQCcCAIFBGFkZHIFA2tleQMJAQlpc0RlZmluZWQBBQNiaW4JAQV2YWx1ZQEFA2JpbgQDaW50CQCaCAIFBGFkZHIFA2tleQMJAQlpc0RlZmluZWQBBQNpbnQJAQV2YWx1ZQEFA2ludAkAnQgCBQRhZGRyBQNrZXkBD2dlbmVyaWNSRUFET05MWQEHcXVlcmllcwoBBGNhbGwCA2FjYwVxdWVyeQQEYWRkcgkBB0FkZHJlc3MBCQDZBAEIBQVxdWVyeQJfMQQJZnVuY09yS2V5CAUFcXVlcnkCXzIEBnJlc3VsdAQHJG1hdGNoMAUFcXVlcnkDCQABAgUHJG1hdGNoMAIbKFN0cmluZywgU3RyaW5nLCBMaXN0W0FueV0pBANpbnYFByRtYXRjaDAJAPwHBAUEYWRkcgUJZnVuY09yS2V5CAUDaW52Al8zBQNuaWwJAQpnZXRBbnlEYXRhAgUEYWRkcgUJZnVuY09yS2V5CQDNCAIFA2FjYwUGcmVzdWx0CgACJGwFB3F1ZXJpZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGNhbGwCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoWAWkBDWNvbnN0cnVjdG9yVjEBCWNvbnRyYWN0cwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEnBlcm1pc3Npb25zIGRlbmllZAoBCmRlc2NyaXB0b3ICA2FjYwtpZ25vcmVkSXRlbQkArAICBQNhY2MCAiVzBAVkZXNjcgoAAiRsBQljb250cmFjdHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCmRlc2NyaXB0b3ICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleVJlc3RDZmcACQC5CQIJAMwIAgUFZGVzY3IFCWNvbnRyYWN0cwUDU0VQCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAJAKUIAQUEdGhpcwUDbmlsAWkBEndhbGxldEluZm9SRUFET05MWQEOdXNlckFkZHJlc3NPcHQJAJQKAgUDbmlsCQEOd2FsbGV0SW50ZXJuYWwBBQ51c2VyQWRkcmVzc09wdAFpARdkdWNrQnlPd25lckluZm9SRUFET05MWQELdXNlckFkZHJlc3MECnN0YWtlZER1Y2sJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQt1c2VyQWRkcmVzcwkAlAoCBQNuaWwDAwkBCWlzRGVmaW5lZAEJAKYIAQULdXNlckFkZHJlc3MJAQlpc0RlZmluZWQBBQpzdGFrZWREdWNrBwQLZHVja0Fzc2V0SWQJAQV2YWx1ZQEFCnN0YWtlZER1Y2sJAQ1kdWNrSW5mb0FycmF5AwULZHVja0Fzc2V0SWQFC3VzZXJBZGRyZXNzCQENZHVja0luZm9UdXBsZQEFC2R1Y2tBc3NldElkCQENZHVja0luZm9BcnJheQMCAAULdXNlckFkZHJlc3MJAJcKBQD///////////8BAgACAAD///////////8BAgABaQEZZHVja0J5QXNzZXRJZEluZm9SRUFET05MWQELZHVja0Fzc2V0SWQEBW93bmVyCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBEGtleUR1Y2tJZFRvT3duZXIBBQtkdWNrQXNzZXRJZAkAlAoCBQNuaWwJAQ1kdWNrSW5mb0FycmF5AwULZHVja0Fzc2V0SWQDCQEJaXNEZWZpbmVkAQUFb3duZXIJAQV2YWx1ZQEFBW93bmVyAgAJAQ1kdWNrSW5mb1R1cGxlAQULZHVja0Fzc2V0SWQBaQEWZHVja3NCeUlkc0luZm9SRUFET05MWQEMZHVja0Fzc2V0SWRzCgEHb25lRHVjawIDYWNjC2R1Y2tBc3NldElkAwkAAAIFC2R1Y2tBc3NldElkAgAJAAIBAhdkdWNrQXNzZXRJZCBpcyByZXF1aXJlZAQKc3Rha2VkVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULZHVja0Fzc2V0SWQA////////////AQQFb3duZXIDCQBmAgUKc3Rha2VkVGltZQAACQEFdmFsdWUBCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBEGtleUR1Y2tJZFRvT3duZXIBBQtkdWNrQXNzZXRJZAIACQDNCAIFA2FjYwkBDWR1Y2tJbmZvQXJyYXkDBQtkdWNrQXNzZXRJZAUFb3duZXIJAQ1kdWNrSW5mb1R1cGxlAQULZHVja0Fzc2V0SWQEAXIKAAIkbAUMZHVja0Fzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdvbmVEdWNrAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhVMaXN0IHNpemUgZXhjZWVkcyAxMDAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZAkAlAoCBQNuaWwFAXIBaQEZbGFuZEJ5QXNzZXRJZEluZm9SRUFET05MWQELbGFuZEFzc2V0SWQDCQAAAgULbGFuZEFzc2V0SWQCAAkAAgECF2xhbmRBc3NldElkIGlzIHJlcXVpcmVkBApzdGFrZWRUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAD///////////8BBAVvd25lcgMJAGYCBQpzdGFrZWRUaW1lAAAJAQV2YWx1ZQEJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQCAAkAlAoCBQNuaWwJAQ1sYW5kSW5mb0FycmF5AwULbGFuZEFzc2V0SWQFBW93bmVyBQpzdGFrZWRUaW1lAWkBHnN0YWtlZExhbmRzQnlPd25lckluZm9SRUFET05MWQEQbGFuZE93bmVyQWRkcmVzcwMJAAACBRBsYW5kT3duZXJBZGRyZXNzAgAJAAIBAhxsYW5kT3duZXJBZGRyZXNzIGlzIHJlcXVpcmVkBAhsYW5kc1N0cgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlTdGFrZWRMYW5kc0J5T3duZXIBBRBsYW5kT3duZXJBZGRyZXNzBAVsYW5kcwMJAQlpc0RlZmluZWQBBQhsYW5kc1N0cgkAvQkCCQEFdmFsdWUBBQhsYW5kc1N0cgIBXwUDbmlsCgEHb25lTGFuZAIDYWNjC2xhbmRBc3NldElkAwkAAAIFC2xhbmRBc3NldElkAgAJAAIBAhdsYW5kQXNzZXRJZCBpcyByZXF1aXJlZAQKc3Rha2VkVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQA////////////AQkAzQgCBQNhY2MJAQ1sYW5kSW5mb0FycmF5AwULbGFuZEFzc2V0SWQFEGxhbmRPd25lckFkZHJlc3MFCnN0YWtlZFRpbWUEAXIKAAIkbAUFbGFu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dCBzaXplIGV4Y2VlZHMgMTAwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAYgBjAGQJAJQKAgUDbmlsBQFyAWkBI3dhcmVob3VzZU9yZGVyQnlBc3NldElkSW5mb1JFQURPTkxZAQtsYW5kQXNzZXRJZAMJAAACBQtsYW5kQXNzZXRJZAIACQACAQIXbGFuZEFzc2V0SWQgaXMgcmVxdWlyZWQECnN0YWtlZFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAP///////////wEEBW93bmVyAwkAZgIFCnN0YWtlZFRpbWUAAAkBBXZhbHVlAQkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAIACQCUCgIFA25pbAkBEmxhbmRPcmRlckluZm9BcnJheQIFC2xhbmRBc3NldElkBQVvd25lcgFpARtvcmRlcnNCeUxhbmRJZHNJbmZvUkVBRE9OTFkBDGxhbmRBc3NldElkcwoBB29uZUxhbmQCA2FjYwtsYW5kQXNzZXRJZAMJAAACBQtsYW5kQXNzZXRJZAIACQACAQIXbGFuZEFzc2V0SWQgaXMgcmVxdWlyZWQECnN0YWtlZFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAP///////////wEEBW93bmVyAwkAZgIFCnN0YWtlZFRpbWUAAAkBBXZhbHVlAQkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIB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cmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3VzZXJBZGRyZXNzBQNhbXQFC3VzZHRBc3NldElkBQNuaWwFA2FtdAFpAR9nZXRFbWVyZ2VuY3lTZXJ2aWNlRGF0YVJFQURPTkxZAAQIZXhpc3RTdHIJAJ0IAgUPZWNvbm9teUNvbnRyYWN0CQEOa2V5RXNXYXJlaG91c2UABAxleGlzdEFtb3VudHMDCQEJaXNEZWZpbmVkAQUIZXhpc3RTdHIJALwJAgkBBXZhbHVlAQUIZXhpc3RTdHICAV8FA25pbAoBCnNpbmdsZVByb2QCA2FjYwlyZWNpcGVTdHIEAW4IBQNhY2MCXzIEBnJlY2lwZQkAtQkCBQlyZWNpcGVTdHICAV8ECW1heEFtb3VudAMJAAACBQFuAAAJAGgCBQ1FU01BWFBBQ0tBR0VTBQ5QUk9EVUNUUEtHU0laRQAABAtleGlzdEFtb3VudAMJAGYCCQCQAwEFDGV4aXN0QW1vdW50cwUBbgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGV4aXN0QW1vdW50cwUBbgAABAh0b3RhbE1hdAkBEmdldFJlY2lwZU1hdGVyaWFscwEFBnJlY2lwZQQIYnV5UHJpY2UJAGsDCQBoAgUIdG90YWxNYXQFCUVTQlVZQ09FRgUQUkVTT1VSQ0VQUklDRU1JTgkAaAIFBU1VTFQ4BQ5QUk9EVUNUUEtHU0laRQQJc2VsbFByaWNlCQBrAwkAaAIFCHRvdGFsTWF0BQpFU1NFTExDT0VGBRBSRVNPVVJDRVBSSUNFTUlOCQBoAgUFTVVMVDgFDlBST0RVQ1RQS0dTSVpFBAF5CQC5CQIJAMwIAgkApAMBBQltYXhBbW91bnQJAMwIAgkApAMBBQtleGlzdEFtb3VudAkAzAgCCQCkAwEFCGJ1eVByaWNlCQDMCAIJAKQDAQUJc2VsbFByaWNlBQNuaWwCAV8JAJQKAgkAzQgCCAUDYWNjAl8xBQF5CQBkAgUBbgABBAFzCQC6CQIICgACJGwFEHByb2R1Y3Rpb25NYXRyaXgKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpzaW5nbGVQcm9kAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADICXzECAToEBnJlc3VsdAkArAICAhwlcyVzX19lbWVyZ2VuY3lTZXJ2aWNlRGF0YV9fBQFzCQCUCgIFA25pbAUGcmVzdWx0AWkBEHdsZ1N0YXRzUkVBRE9OTFkBC3VzZXJBZGRyT3B0BAhjdXJTdGF0cwkBC2dldFdsZ1N0YXRzBQULdXNlckFkZHJPcHQJAMwIAgUMcmVzdENvbnRyYWN0CQDMCAIFD3N0YWtpbmdDb250cmFjdAkAzAgCBQ9lY29ub215Q29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAkAzAgCBQ1hY3Jlc0NvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAAFBU1VTFQ2CQCUCgIFA25pbAkAzAgCCQCsAgICESVzJWRfX3dsZ0Ftb3VudF9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFDGlkeFdsZ0Ftb3VudAkAzAgCCQCsAgICECVzJWRfX3dsZ1ByaWNlX18JAKQDAQkAkQMCBQhjdXJTdGF0cwULaWR4V2xnUHJpY2UJAMwIAgkArAICAhElcyVkX191c2R0RnVuZHNfXwkApAMBCQCRAwIFCGN1clN0YXRzBQtpZHhXbGdGdW5kcwkAzAgCCQCsAgICEyVzJWRfX3VzZHRFY29ub215X18JAKQDAQkAkQMCBQhjdXJTdGF0cwUNaWR4V2xnRWNvbm9teQkAzAgCCQCsAgICFCVzJWRfX3VzZHRBY3Rpdml0eV9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFDmlkeFdsZ0FjdGl2aXR5CQDMCAIJAKwCAgIVJXMlZF9fdXNkdEFyYml0cmFnZV9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFD2lkeFdsZ0FyYml0cmFnZQkAzAgCCQCsAgICECVzJWRfX3VzZHRQb29sX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUKaWR4V2xnUG9vbAkAzAgCCQCsAgICFCVzJWRfX3dsZ0lzc3VlVGltZV9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFD2lkeFdsZ0lzc3VlVGltZQkAzAgCCQCsAgICIyVzJWRfX3dsZ0xhc3RNYXJrZXRpbmdUZWFtQWN0VGltZV9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFEWlkeFdsZ0xhc3RNVEFUaW1lCQDMCAIJAKwCAgIZJXMlZF9fd2xnTWFya2V0aW5nVG90YWxfXwkApAMBCQCRAwIFCGN1clN0YXRzBRRpZHhXbGdNYXJrZXRpbmdUb3RhbAkAzAgCCQCsAgICGiVzJWRfX3dsZ01hcmtldGluZ0FtTGVmdF9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFFWlkeFdsZ01hcmtldGluZ0FtTGVmdAkAzAgCCQCsAgICHiVzJWRfX3dsZ01hcmtldGluZ0FtQXZhaWxOb3dfXwkApAMBCQCRAwIFCGN1clN0YXRzBRlpZHhXbGdNYXJrZXRpbmdBbUF2YWlsTm93CQDMCAIJAKwCAgIaJXMlZF9fd2xnTWFya2V0aW5nV2xnb2xkX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUVaWR4V2xnTWFya2V0aW5nV2xnb2xkCQDMCAIJAKwCAgIUJXMlZF9fd2xnVGVhbVRvdGFsX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUPaWR4V2xnVGVhbVRvdGFsCQDMCAIJAKwCAgIVJXMlZF9fd2xnVGVhbUFtTGVmdF9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFEGlkeFdsZ1RlYW1BbUxlZnQJAMwIAgkArAICAhklcyVkX193bGdUZWFtQW1BdmFpbE5vd19fCQCkAwEJAJEDAgUIY3VyU3RhdHMFFGlkeFdsZ1RlYW1BbUF2YWlsTm93CQDMCAIJAKwCAgIVJXMlZF9fd2xnVGVhbVdsZ29sZF9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFEGlkeFdsZ1RlYW1XbGdvbGQJAMwIAgkArAICAhMlcyVkX193bGdBY3RUb3RhbF9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFDmlkeFdsZ0FjdFRvdGFsCQDMCAIJAKwCAgIUJXMlZF9fd2xnQWN0QW1MZWZ0X18JAKQDAQkAkQMCBQhjdXJTdGF0cwUPaWR4V2xnQWN0QW1MZWZ0CQDMCAIJAKwCAgIYJXMlZF9fd2xnQWN0QW1BdmFpbE5vd19fCQCkAwEJAJEDAgUIY3VyU3RhdHMFE2lkeFdsZ0FjdEFtQXZhaWxOb3cJAMwIAgkArAICAhQlcyVkX193bGdBY3RXbGdvbGRfXwkApAMBCQCRAwIFCGN1clN0YXRzBQ9pZHhXbGdBY3RXbGdvbGQJAMwIAgkArAICAhQlcyVkX193bGdDdXJQZXJpb2RfXwkApAMBCQCRAwIFCGN1clN0YXRzBQ9pZHhXbGdDdXJQZXJpb2QJAMwIAgkArAICAhYlcyVkX193bGdBbUxlZnRUb3RhbF9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFEWlkeFdsZ0FtTGVmdFRvdGFsCQDMCAIJAKwCAgIgJXMlZF9fd2xnQ3VyUGVyaW9kRGlzdHJpYnV0aW9uX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUbaWR4V2xnQ3VyUGVyaW9kRGlzdHJpYnV0aW9uCQDMCAIJAKwCAgIXJXMlZF9fd2xnTGFzdFVzZXJUaW1lX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUSaWR4V2xnTGFzdFVzZXJUaW1lCQDMCAIJAKwCAgIZJXMlZF9fd2xnVXNlckFtQXZhaWxOb3dfXwkApAMBCQCRAwIFCGN1clN0YXRzBRRpZHhXbGdVc2VyQW1BdmFpbE5vdwkAzAgCCQCsAgICGiVzJWRfX3dsZ0d1ZXN0U0xhbmREYWlseV9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFFmlkeFdsZ1NMYW5kRGFpbHlBbW91bnQJAMwIAgkArAICAholcyVkX193bGdJbnZlc3RGdW5kVG90YWxfXwkApAMBCQCRAwIFCGN1clN0YXRzBRZpZHhXbGdJbnZlc3RGdW5kQW1vdW50CQDMCAIJAKwCAgIZJXMlZF9fd2xnVXNlclRvdGFsQXZhaWxfXwkApAMBCQCRAwIFCGN1clN0YXRzBRRpZHhXbGdVc2VyVG90YWxBdmFpbAkAzAgCCQCsAgICFiVzJWRfX3dsZ0VmZlVzZXJUaW1lX18JAKQDAQkAkQMCBQhjdXJTdGF0cwURaWR4V2xnRWZmVXNlclRpbWUFA25pbAFpARd0b3VybmFtZW50U3RhdHNSRUFET05MWQEMdG91cm5hbWVudElkCQCUCgIFA25pbAkBD3RvdXJTdGF0c0NvbW1vbgEFDHRvdXJuYW1lbnRJZAFpARtsYXN0VG91cm5hbWVudFN0YXRzUkVBRE9OTFkABAx0b3VybmFtZW50SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSdG91cm5hbWVudENvbnRyYWN0BQ1sYXN0VG91cklkS2V5AAAJAJQKAgUDbmlsCQDMCAIJAKwCAgIYJXMlc19fbGFzdFRvdXJuYW1lbnRJZF9fCQCkAwEFDHRvdXJuYW1lbnRJZAkBD3RvdXJTdGF0c0NvbW1vbgEFDHRvdXJuYW1lbnRJZAFpARt0b3VybmFtZW50RHVja1N0YXRzUkVBRE9OTFkCA3RJZAtkdWNrQXNzZXRJZAQJaXNEdWNrUmVnCQELdmFsdWVPckVsc2UCCQCbCAIFEnRvdXJuYW1lbnRDb250cmFjdAkBHGtleUlzUmVnaXN0ZXJlZEJ5VG91ckFuZER1Y2sCBQN0SWQFC2R1Y2tBc3NldElkBwQPbGFzdER1Y2tBdHRlbXB0CQELdmFsdWVPckVsc2UCCQCaCAIFEnRvdXJuYW1lbnRDb250cmFjdAkBG2tleUxhc3RBdHRlbXB0QnlUb3VyQW5kRHVjawIFA3RJZAULZHVja0Fzc2V0SWQA////////////AQQOYmVzdER1Y2tSZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSdG91cm5hbWVudENvbnRyYWN0CQEaa2V5QmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sCBQN0SWQFC2R1Y2tBc3NldElkAAAECmJlc3REdWNrVHgJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUSdG91cm5hbWVudENvbnRyYWN0CQEWa2V5QmVzdFR4QnlUb3VyQW5kRHVjawIFA3RJZAULZHVja0Fzc2V0SWQCAAQJaXNBd2FyZGVkCQELdmFsdWVPckVsc2UCCQCbCAIFEnRvdXJuYW1lbnRDb250cmFjdAkBGWtleUlzQXdhcmRlZEJ5VG91ckFuZER1Y2sCBQN0SWQFC2R1Y2tBc3NldElkBwkAlAoCBQNuaWwJAMwIAgkArAICAhslcyVzX190b3VybmFtZW50RHVja1N0YXRzX18JALkJAgkAzAgCCQClAwEFCWlzRHVja1JlZwkAzAgCCQCkAwEFD2xhc3REdWNrQXR0ZW1wdAkAzAgCCQCkAwEFDmJlc3REdWNrUmVzdWx0CQDMCAIFCmJlc3REdWNrVHgJAMwIAgkApQMBBQlpc0F3YXJkZWQFA25pbAIBXwUDbmlsAWkBG2R1Y2tTdGF0c0NhbGN1bGF0b3JSRUFET05MWQELZHVja0Fzc2V0SWQEBWNoYXJzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEMa2V5RHVja0NoYXJzAQULZHVja0Fzc2V0SWQCCTBfMF8wXzBfMAIBXwQFYnVmZnMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlEdWNrQnVmZnMBBQtkdWNrQXNzZXRJZAIJMF8wXzBfMF8wAgFfBAZlcXVpcG0JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARBrZXlEdWNrRXF1aXBtZW50AQULZHVja0Fzc2V0SWQCCztfO187XztfO187AgFfBA1lcXVpcG1lbnRQZXJjCQEKc2xvdEVmZmVjdAEJAJEDAgkAtQkCCQCRAwIFBmVxdWlwbQUHc2VnQmFjawIBOwABBA5lcXVpcG1lbnRBYnNvcgkBCnNsb3RFZmZlY3QBCQCRAwIJALUJAgkAkQMCBQZlcXVpcG0FB3NlZ0JlbHQCATsAAAQFZG9kZ2UJARBkb2RnZVByb2JhYmlsaXR5AwUFY2hhcnMFBWJ1ZmZzBQ1lcXVpcG1lbnRQZXJjBAZhYnNvcmIJARBkYW1hZ2VBYnNvcnB0aW9uAwUFY2hhcnMFBWJ1ZmZzBQ5lcXVpcG1lbnRBYnNvcgkAlAoCBQNuaWwJAMwIAgkArAICAhglcyVkX19kb2RnZVByb2JhYmlsaXR5X18JAKQDAQUFZG9kZ2UJAMwIAgkArAICAhglcyVkX19kYW1hZ2VBYnNvcnB0aW9uX18JAKQDAQUGYWJzb3JiBQNuaWwBaQEhY3VzdG9tRHVja1N0YXRzQ2FsY3VsYXRvclJFQURPTkxZBAVjaGFycwVidWZmcw1lcXVpcG1lbnRQZXJjDmVxdWlwbWVudEFic29yBAVkb2RnZQkBEGRvZGdlUHJvYmFiaWxpdHkDBQVjaGFycwUFYnVmZnMFDWVxdWlwbWVudFBlcmMEBmFic29yYgkBEGRhbWFnZUFic29ycHRpb24DBQVjaGFycwUFYnVmZnMFDmVxdWlwbWVudEFic29yCQCUCgIFA25pbAkAzAgCCQCsAgICGCVzJWRfX2RvZGdlUHJvYmFiaWxpdHlfXwkApAMBBQVkb2RnZQkAzAgCCQCsAgICGCVzJWRfX2RhbWFnZUFic29ycHRpb25fXwkApAMBBQZhYnNvcmIFA25pbAFpARJhY3Jlc1N0YXRzUkVBRE9OTFkBC3VzZXJBZGRyT3B0BAl1c2VyQ2xhaW0JAQlhc0FueUxpc3QBCQD8BwQFDWFjcmVzQ29udHJhY3QCEmNsYWltQWNyZXNSRUFET05MWQkAzAgCBQt1c2VyQWRkck9wdAUDbmlsBQNuaWwEDXVzZXJDbGFpbWFibGUJAQVhc0ludAEJAJEDAgUJdXNlckNsYWltAAAEDHVzZXJMYXN0VGltZQkBBWFzSW50AQkAkQMCBQl1c2VyQ2xhaW0AAQkAlAoCBQNuaWwJAMwIAgkArAICAhglcyVkX19hY3Jlc0lzc3VlZFRvdGFsX18JAKQDAQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1hY3Jlc0NvbnRyYWN0BRRhY3Jlc0lzc3VlZEFtb3VudEtleQAACQDMCAIJAKwCAgITJXMlZF9fYWNyZXNVbnNvbGRfXwkApAMBCQDwBwIFDWFjcmVzQ29udHJhY3QFDGFjcmVzQXNzZXRJZAkAzAgCCQCsAgICGCVzJWRfX2FjcmVzU3Rha2VkVG90YWxfXwkApAMBCQELdmFsdWVPckVsc2UCCQCaCAIFDWFjcmVzQ29udHJhY3QFE2FjcmVzU3Rha2VkVG90YWxLZXkAAAkAzAgCCQCsAgICGSVzJWRfX2FjcmVzU3Rha2VkQnlVc2VyX18JAKQDAQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1hY3Jlc0NvbnRyYWN0CQEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBQt1c2VyQWRkck9wdAAACQDMCAIJAKwCAgIcJXMlZF9fYWNyZXNDbGFpbWFibGVCeVVzZXJfXwkApAMBBQ11c2VyQ2xhaW1hYmxlCQDMCAIJAKwCAgIgJXMlZF9fYWNyZXNMYXN0Q2xhaW1UaW1lQnlVc2VyX18JAKQDAQUMdXNlckxhc3RUaW1lCQDMCAIJAKwCAgIZJXMlZF9fYWNyZXNMb2NrZWRCeVVzZXJfXwkApAMBCQELdmFsdWVPckVsc2UCCQCaCAIFDWFjcmVzQ29udHJhY3QJARprZXlBY3Jlc0xvY2tlZEFtb3VudEJ5VXNlcgEFC3VzZXJBZGRyT3B0AAAJAMwIAgkArAICAhwlcyVkX19hY3Jlc0xvY2tlZEV0YUJ5VXNlcl9fCQCkAwEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNYWNyZXNDb250cmFjdAkBF2tleUFjcmVzTG9ja2VkRXRhQnlVc2VyAQULdXNlckFkZHJPcHQAAAUDbmlsAWkBBnRlc3RWNAAJAJQKAgUDbmlsCQEPZ2VuZXJpY1JFQURPTkxZAQUDbmlsAAtSk2E=", "height": 2847712, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 93nT4XMn6yUeFjoenyCCLCYHP5vNKtAW2NU6cesUwC5V Next: 55YbUCouTszX1LiXfh85bC3hGEaFxNdy5vr6R1DXViW2 Diff:
OldNewDifferences
449449 func getRecipeMaterials (recipe) = (parseIntValue(recipe[rIdxCoeff]) * COEFF2MAT)
450450
451451
452+let KS_SEPARATE_PUBLIC_KEY = false
453+
452454 let chain = take(drop(this.bytes, 1), 1)
455+
456+let pub = match chain {
457+ case _ =>
458+ if ((base58'2W' == $match0))
459+ then if (KS_SEPARATE_PUBLIC_KEY)
460+ then base58'CWsMtTZC5BjjoL4Q1ayW4Wwb1ehGACQB6DrKyPgotKfm'
461+ else base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
462+ else if ((base58'2T' == $match0))
463+ then base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
464+ else throw("Unknown chain")
465+}
453466
454467 let usdtAssetId = match chain {
455468 case _ =>
12311244
12321245
12331246 @Callable(i)
1247+func distributeLockedAcres (users,amount,lockDays) = if (if ((i.caller != this))
1248+ then (i.callerPublicKey != pub)
1249+ else false)
1250+ then throw("Permission denied")
1251+ else if ((0 >= amount))
1252+ then throw("amount should be positive")
1253+ else if ((0 > lockDays))
1254+ then throw("lockDays should be non-negative")
1255+ else {
1256+ func oneUser (acc,addr) = if ((addr == ""))
1257+ then throw("address is required")
1258+ else (acc + asInt(invoke(acresContract, "sendLockedAcres", [addr, amount, lockDays], nil)))
1259+
1260+ let totalAcres = {
1261+ let $l = users
1262+ let $s = size($l)
1263+ let $acc0 = 0
1264+ func $f0_1 ($a,$i) = if (($i >= $s))
1265+ then $a
1266+ else oneUser($a, $l[$i])
1267+
1268+ func $f0_2 ($a,$i) = if (($i >= $s))
1269+ then $a
1270+ else throw("List size exceeds 20")
1271+
1272+ $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)
1273+ }
1274+ $Tuple2(nil, totalAcres)
1275+ }
1276+
1277+
1278+
1279+@Callable(i)
12341280 func sendUsdtPrize (userAddress) = if ((i.caller != stakingContract))
12351281 then throw("permission denied")
12361282 else {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let M6 = 1000000
55
66 let M8 = 100000000
77
88 let MILLION6 = 100000000000000
99
1010 let MARKETINGSHARE = 100000
1111
1212 let TEAMSHARE = 200000
1313
1414 let ACTIVITYSHARE = 100000
1515
1616 let PLAYERSHARE = 400000
1717
1818 let YEARMILLIS = 31557600000
1919
2020 let DAYMILLIS = 86400000
2121
2222 let marketingAddrKey = "marketingAddr"
2323
2424 let teamAddrKey = "teamAddr"
2525
2626 let lastMarketingTimeKey = "lastClaimedTime_marketing"
2727
2828 let marketingAmountLeftKey = "marketingAmountLeft"
2929
3030 let lastTeamTimeKey = "lastClaimedTime_team"
3131
3232 let teamAmountLeftKey = "teamAmountLeft"
3333
3434 let lastActivitiesTimeKey = "lastClaimedTime_activities"
3535
3636 let actAmountLeftKey = "activitiesAmountLeft"
3737
3838 let stakersAmountLeftKey = "stakersAmountLeft"
3939
4040 func keyLastClaimedTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
4141
4242
4343 func distributionByPeriod (period) = fraction(MILLION6, (PLAYERSHARE * (period + 1)), (6 * M6))
4444
4545
4646 let wlgIssueTimeKey = "wlg_issueTime"
4747
4848 let wlgIssuedAmountKey = "wlg_issuedAmount"
4949
5050 let zbIssuedAmountKey = "zbill_issuedAmount"
5151
5252 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
5353
5454
5555 func keyAcresLockedAmountByUser (addr) = ("acresLockedAmountByUser_" + addr)
5656
5757
5858 func keyAcresLockedEtaByUser (addr) = ("acresLockedEtaByUser_" + addr)
5959
6060
6161 let acresStakedTotalKey = "acresStakedAmountTotal"
6262
6363 func keyWlgStakedAmountByUser (addr) = ("wlgStakedAmountByUser_" + addr)
6464
6565
6666 let dappRest = 0
6767
6868 let dappStaking = 1
6969
7070 let dappEconomy = 2
7171
7272 let dappWlg = 3
7373
7474 let dappPuzzle = 4
7575
7676 let dappInvestFund = 5
7777
7878 let dappAcres = 6
7979
8080 func getLands (userAddrStrOrEmpty,stakingContract,acresContract) = {
8181 let props = split(valueOrElse(getString(stakingContract, "resTypesProportions"), "0_0_0_0_0_0"), "_")
8282 func adder (acc,item) = (acc + parseIntValue(item))
8383
8484 let totalPieces = {
8585 let $l = props
8686 let $s = size($l)
8787 let $acc0 = 0
8888 func $f0_1 ($a,$i) = if (($i >= $s))
8989 then $a
9090 else adder($a, $l[$i])
9191
9292 func $f0_2 ($a,$i) = if (($i >= $s))
9393 then $a
9494 else throw("List size exceeds 6")
9595
9696 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
9797 }
9898 let userPieces = valueOrElse(getInteger(stakingContract, ("stakedPiecesByOwner_" + userAddrStrOrEmpty)), 0)
9999 let totalAcres = valueOrElse(getInteger(acresContract, acresStakedTotalKey), 0)
100100 let userAcres = valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(userAddrStrOrEmpty)), 0)
101101 [totalPieces, userPieces, totalAcres, userAcres]
102102 }
103103
104104
105105 let idxTotalPieces = 0
106106
107107 let idxUserPieces = 1
108108
109109 let idxTotalAcres = 2
110110
111111 let idxUserAcres = 3
112112
113113 func getWlgStats (userAddrOpt,contracts,usdtId,usdtBalanceCorrection,userProportion6) = {
114114 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssuedAmountKey), "WLGOLD is not issued yet")
115115 let economyUsd = assetBalance(contracts[dappEconomy], usdtId)
116116 let restUsd = assetBalance(contracts[dappRest], usdtId)
117117 let wlgUsd = (assetBalance(contracts[dappWlg], usdtId) - usdtBalanceCorrection)
118118 let puzzleUsd = assetBalance(contracts[dappPuzzle], usdtId)
119119 let investFundContract = contracts[dappInvestFund]
120120 let investFundTotal = (assetBalance(investFundContract, usdtId) + valueOrElse(getInteger(investFundContract, zbIssuedAmountKey), 0))
121121 let totalFundsUsd = ((economyUsd + wlgUsd) + investFundTotal)
122122 let wlgId = valueOrErrorMessage(getBinary(contracts[dappWlg], "wlg_assetId"), "Not initialized yet")
123123 let now = lastBlock.timestamp
124124 let issueTime = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssueTimeKey), "Not initialized")
125125 let marketingTotal = fraction(MILLION6, MARKETINGSHARE, M6)
126126 let marketingAmountLeft = valueOrElse(getInteger(contracts[dappWlg], marketingAmountLeftKey), marketingTotal)
127127 let lastMarketingTime = valueOrElse(getInteger(contracts[dappWlg], lastMarketingTimeKey), issueTime)
128128 let marketingAddr = addressFromStringValue(value(getString(contracts[dappWlg], marketingAddrKey)))
129129 let marketingAmountAvailableNow = min([fraction(marketingTotal, (now - lastMarketingTime), YEARMILLIS), marketingAmountLeft])
130130 let marketingWlgold = assetBalance(marketingAddr, wlgId)
131131 let teamTotal = fraction(MILLION6, TEAMSHARE, M6)
132132 let teamAmountLeft = valueOrElse(getInteger(contracts[dappWlg], teamAmountLeftKey), teamTotal)
133133 let lastTeamTime = valueOrElse(getInteger(contracts[dappWlg], lastTeamTimeKey), issueTime)
134134 let teamAddr = addressFromStringValue(value(getString(contracts[dappWlg], teamAddrKey)))
135135 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEARMILLIS)), teamAmountLeft])
136136 let teamWlgold = assetBalance(teamAddr, wlgId)
137137 let actTotal = fraction(MILLION6, ACTIVITYSHARE, M6)
138138 let actAmountLeft = valueOrElse(getInteger(contracts[dappWlg], actAmountLeftKey), actTotal)
139139 let lastActivitiesTime = valueOrElse(getInteger(contracts[dappWlg], lastActivitiesTimeKey), issueTime)
140140 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEARMILLIS)), actAmountLeft])
141141 let actWlgold = assetBalance(contracts[dappRest], wlgId)
142142 let lastUserTime = valueOrElse(getInteger(contracts[dappWlg], keyLastClaimedTimeByUser(userAddrOpt)), issueTime)
143143 let lastUserPeriod = ((lastUserTime - issueTime) / YEARMILLIS)
144144 let nowLimited = min([now, (issueTime + (3 * YEARMILLIS))])
145145 let curPeriod = min([((now - issueTime) / YEARMILLIS), 2])
146146 let eff = getLands(userAddrOpt, contracts[dappStaking], contracts[dappAcres])
147147 let curPeriodDistribution = distributionByPeriod(curPeriod)
148148 let $t079142 = if ((lastUserPeriod == curPeriod))
149149 then {
150150 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEARMILLIS)
151151 let userPart = fraction(a0, userProportion6, M6)
152152 let effTime = (lastUserTime + fraction((nowLimited - lastUserTime), userProportion6, M6))
153153 $Tuple3(userPart, a0, effTime)
154154 }
155155 else if ((lastUserPeriod == (curPeriod - 1)))
156156 then {
157157 let a1 = fraction(distributionByPeriod((curPeriod - 1)), ((issueTime + (YEARMILLIS * curPeriod)) - lastUserTime), YEARMILLIS)
158158 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)
159159 let avail = (a1 + a0)
160160 let userPart = fraction(avail, userProportion6, M6)
161161 let effTime = if ((a1 >= userPart))
162162 then (lastUserTime + fraction(YEARMILLIS, userPart, distributionByPeriod((curPeriod - 1))))
163163 else ((issueTime + (YEARMILLIS * curPeriod)) + fraction(YEARMILLIS, (userPart - a1), curPeriodDistribution))
164164 $Tuple3(userPart, avail, effTime)
165165 }
166166 else {
167167 let a2 = fraction(distributionByPeriod((curPeriod - 2)), ((issueTime + (YEARMILLIS * (curPeriod - 1))) - lastUserTime), YEARMILLIS)
168168 let a1 = distributionByPeriod((curPeriod - 1))
169169 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)
170170 let avail = ((a2 + a1) + a0)
171171 let userPart = fraction(avail, userProportion6, M6)
172172 let effTime = if ((a2 >= userPart))
173173 then (lastUserTime + fraction(YEARMILLIS, userPart, distributionByPeriod((curPeriod - 2))))
174174 else if (((a2 + a1) >= userPart))
175175 then ((issueTime + (YEARMILLIS * (curPeriod - 1))) + fraction(YEARMILLIS, (userPart - a2), distributionByPeriod((curPeriod - 1))))
176176 else ((issueTime + (YEARMILLIS * curPeriod)) + fraction(YEARMILLIS, ((userPart - a2) - a1), curPeriodDistribution))
177177 $Tuple3(userPart, avail, effTime)
178178 }
179179 let userAmount = $t079142._1
180180 let userAvailable = $t079142._2
181181 let effLastTime = $t079142._3
182182 let sLandDailyAmount = fraction(fraction(curPeriodDistribution, DAYMILLIS, YEARMILLIS), 25, eff[idxTotalPieces])
183183 let amountLeftTotal = valueOrElse(getInteger(contracts[dappWlg], stakersAmountLeftKey), 0)
184184 let robbedUser = fraction(userAmount, ((eff[idxUserPieces] * M8) + eff[idxUserAcres]), ((eff[idxTotalPieces] * M8) + eff[idxTotalAcres]))
185185 let unrobbedUser = fraction(userAvailable, ((eff[idxUserPieces] * M8) + eff[idxUserAcres]), ((eff[idxTotalPieces] * M8) + eff[idxTotalAcres]))
186186 [issuedAmount, fraction(totalFundsUsd, M8, issuedAmount), totalFundsUsd, economyUsd, restUsd, wlgUsd, puzzleUsd, issueTime, lastMarketingTime, marketingTotal, marketingAmountLeft, marketingAmountAvailableNow, marketingWlgold, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, robbedUser, sLandDailyAmount, investFundTotal, unrobbedUser, effLastTime]
187187 }
188188
189189
190190 let SCALE8 = 100000000
191191
192192 let robberyCostMin = 100000000
193193
194194 let robberyCooldownCoeff = 400
195195
196196 let charIntellect = 2
197197
198198 let charEndurance = 3
199199
200200 let charDexterity = 4
201201
202202 let segBack = 1
203203
204204 let segBelt = 2
205205
206206 let landRobStates = ["free", "locked", "afterLockCooldown", "robbedCooldown", "defendedCooldown"]
207207
208208 let duckRobStates = ["free", "preparingRob"]
209209
210210 func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
211211
212212
213213 func keyDuckChars (duckAssetId) = ("duckChars_" + duckAssetId)
214214
215215
216216 func keyDuckXP (duckAssetId) = ("duckXP_" + duckAssetId)
217217
218218
219219 func keyDuckLevel (duckAssetId) = ("duckLevel_" + duckAssetId)
220220
221221
222222 func keyDuckFreePoints (duckAssetId) = ("duckFreePoints_" + duckAssetId)
223223
224224
225225 func keyDuckEquipment (duckAssetId) = ("duckEquipment_" + duckAssetId)
226226
227227
228228 func keyUserXP (addr) = ("userXP_" + addr)
229229
230230
231231 func keyUserLevel (addr) = ("userLevel_" + addr)
232232
233233
234234 func keyUserFreePoints (addr) = ("userFreePoints_" + addr)
235235
236236
237237 func keyDuckBuffs (duckAssetId) = ("duckBuffs_" + duckAssetId)
238238
239239
240240 func keyLastRobberyTimeByDuck (duckAssetId) = ("lastRobberyTime_" + duckAssetId)
241241
242242
243243 func keyLastRobberyCostByDuck (duckAssetId) = ("lastRobberyCost_" + duckAssetId)
244244
245245
246246 func keyLandRobberyState (landAssetId) = ("landRobberyState_" + landAssetId)
247247
248248
249249 func keyLandCooldownETA (landAssetId) = ("landCooldownETA_" + landAssetId)
250250
251251
252252 func keyDuckRobberyState (duckAssetId) = ("duckRobberyState_" + duckAssetId)
253253
254254
255255 func keyLockedLandByDuck (duckAssetId) = ("lockedLandByDuck_" + duckAssetId)
256256
257257
258258 func keyDeliveryDelayByDuck (duckAssetId) = ("deliveryDelayByDuck_" + duckAssetId)
259259
260260
261261 func keyUserDeliveryCount (addr) = ("userDeliveryCount_" + addr)
262262
263263
264264 func keyUserLastDeliveryDay (addr) = ("userLastDeliveryDay_" + addr)
265265
266266
267267 func maxHealth (level) = (100 + level)
268268
269269
270270 func getRobberyData (stakingContract,duckAssetId) = {
271271 let lastRobCost = valueOrElse(getInteger(stakingContract, keyLastRobberyCostByDuck(duckAssetId)), 0)
272272 let lastRobTime = valueOrElse(getInteger(stakingContract, keyLastRobberyTimeByDuck(duckAssetId)), 0)
273273 let now = lastBlock.timestamp
274274 let robCost = max([robberyCostMin, (lastRobCost - (robberyCooldownCoeff * (now - lastRobTime)))])
275275 let duckState = valueOrElse(getInteger(stakingContract, keyDuckRobberyState(duckAssetId)), 0)
276276 let lockedLand = valueOrElse(getString(stakingContract, keyLockedLandByDuck(duckAssetId)), "")
277277 let landETA = valueOrElse(getInteger(stakingContract, keyLandCooldownETA(lockedLand)), 0)
278278 $Tuple5(robCost, lastRobTime, duckState, lockedLand, landETA)
279279 }
280280
281281
282282 func tanh (v) = {
283283 let double = (2 * v)
284284 let exp2 = pow(271828183, 8, double, 8, 8, HALFUP)
285285 fraction((exp2 - SCALE8), SCALE8, (exp2 + SCALE8), HALFUP)
286286 }
287287
288288
289289 func dodgeProbability (chars,buffs,equipmentPerc) = {
290290 let intel = (parseIntValue(chars[charIntellect]) + parseIntValue(buffs[charIntellect]))
291291 let dex = (parseIntValue(chars[charDexterity]) + parseIntValue(buffs[charDexterity]))
292292 let first8 = (tanh(fraction(dex, SCALE8, 200)) / 4)
293293 let second8 = fraction(equipmentPerc, (SCALE8 + fraction(7000000, intel, (1 + intel), HALFUP)), 100, HALFUP)
294294 (first8 + second8)
295295 }
296296
297297
298298 func damageAbsorption (chars,buffs,equipmentAbsor) = {
299299 let intel = (parseIntValue(chars[charIntellect]) + parseIntValue(buffs[charIntellect]))
300300 let endur = (parseIntValue(chars[charEndurance]) + parseIntValue(buffs[charEndurance]))
301301 let dex = (parseIntValue(chars[charDexterity]) + parseIntValue(buffs[charDexterity]))
302302 let first8 = (equipmentAbsor * (SCALE8 + fraction(14000000, intel, (1 + intel), HALFUP)))
303303 let second8 = (sqrt(dex, 0, 8, HALFUP) / 10)
304304 let third8 = ((SCALE8 / 5) * endur)
305305 ((first8 + second8) + third8)
306306 }
307307
308308
309309 let ARTPRESALE = "PRESALE"
310310
311311 let ARTONBOARD = "ONBOARD"
312312
313313 let NUMRES = 6
314314
315315 let DAILYRESBYPIECE = 3456000
316316
317317 let WHMULTIPLIER = 10000000000
318318
319319 let RESOURCEPRICEMIN = 39637
320320
321321 let ESMAXPACKAGES = 10
322322
323323 let ESBUYCOEF = 4
324324
325325 let ESSELLCOEF = 10
326326
327327 let COEFF2MAT = 10000000
328328
329329 let productionMatrix = ["8_8_8_17_17_42_12_0_30_0,0,0,0,0,0,0_", "8_8_8_17_17_42_24_0_60_0,0,5,2,0,0,0_", "8_8_8_17_17_42_36_0_120_0,0,10,4,0,0,0_", "8_19_19_8_27_19_26_1_20_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_52_1_40_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_78_1_80_0,0,0,0,0,0,0_001", "8_8_8_8_8_60_13_2_2_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_26_2_4_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_39_2_8_0,0,0,0,0,0,0_011", "30_30_3_17_17_3_30_3_30_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_60_3_50_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_90_3_70_0,0,0,0,0,0,0_111", "18_18_10_18_18_18_11_4_10_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_22_4_20_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_33_4_30_0,0,0,0,0,0,0_201", "4_13_22_4_35_22_23_0_50,1,0_0,0,0,0,0,0,0_", "4_13_22_4_35_22_46_0_50,1,1_0,2,5,0,0,0,0_", "4_13_22_4_35_22_69_0_50,2,1_0,5,10,0,0,0,0_", "5_25_40_5_10_15_20_1_30,1,1_0,0,0,0,0,0,0_", "5_25_40_5_10_15_40_1_30,1,2_2,1,3,0,0,0,0_", "5_25_40_5_10_15_60_1_30,1,3_5,2,8,0,0,0,0_", "23_23_5_20_23_6_35_2_0_0,0,0,0,0,0,0_", "23_23_5_20_23_6_70_2_0_0,0,0,0,0,0,0_", "23_23_5_20_23_6_105_2_0_0,0,0,0,0,0,0_"]
330330
331331 let rIdxCoeff = 6
332332
333333 let rIdxEffect = 8
334334
335335 let PRODUCTPKGSIZE = 10
336336
337337 func keyLandAssetIdToOwner (assetId) = ("no_" + assetId)
338338
339339
340340 func keyLandAssetIdToCustomName (assetId) = ("lcna_" + assetId)
341341
342342
343343 func keyStakedTimeByAssetId (assetId) = ("st_" + assetId)
344344
345345
346346 func keyLandArtStatusByTypeAndAssetId (type,assetId) = makeString(["las", type, assetId], "_")
347347
348348
349349 func keyWarehouseByLand (landAssetId) = ("wh_" + landAssetId)
350350
351351
352352 func keyInfraLevelByAssetId (assetId) = ("infraLevel_" + assetId)
353353
354354
355355 func keyFortificationsByLand (landAssetId) = ("fortifications_" + landAssetId)
356356
357357
358358 func keyDuckAssetIdToCustomName (assetId) = ("duckCustomNameByAssetId_" + assetId)
359359
360360
361361 func keyAddressToCustomName (addr) = ("accountCustomNameByAddr_" + addr)
362362
363363
364364 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
365365
366366
367367 func keyOnboardArtDuckActivatedBy (addr) = ("onboardArtActivatedDuckBy_" + addr)
368368
369369
370370 func keyAddressReferrals (addr) = ("accReferrals_" + addr)
371371
372372
373373 func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
374374
375375
376376 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
377377
378378
379379 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
380380
381381
382382 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
383383
384384
385385 func keyEsWarehouse () = "emergencyWarehouseProducts"
386386
387387
388388 let lastTourIdKey = "%s__lastTourId"
389389
390390 func keyTourStaticDataById (tId) = ("%s%d__tourStaticData__" + toString(tId))
391391
392392
393393 func keyTourDynamicDataById (tId) = ("%s%d__tourDynamicData__" + toString(tId))
394394
395395
396396 func keyScoreBoardByTour (tId) = ("%s%d__scoreBoard__" + toString(tId))
397397
398398
399399 func keyIsRegisteredByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__isRegisteredByTourAndDuck", toString(tId), duckAssetId], "__")
400400
401401
402402 func keyIsAwardedByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__isAwardedByTourAndDuck", toString(tId), duckAssetId], "__")
403403
404404
405405 func keyLastAttemptByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__lastAttemptByTourAndDuck", toString(tId), duckAssetId], "__")
406406
407407
408408 func keyBestResultByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__bestResultByTourAndDuck", toString(tId), duckAssetId], "__")
409409
410410
411411 func keyBestTxByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__bestTxByTourAndDuck", toString(tId), duckAssetId], "__")
412412
413413
414414 let idxStatic = 0
415415
416416 let idxDynamic = 1
417417
418418 let tStaticRegisterCost = 2
419419
420420 let tStaticAttemptCost = 3
421421
422422 let tStaticStart = 5
423423
424424 let tStaticEnd = 6
425425
426426 let tStaticNumGrands = 7
427427
428428 let tStaticPrizeFund = 8
429429
430430 let tStaticAsset = 9
431431
432432 let tDynamicStatus = 1
433433
434434 let tDynamicLeaders = 2
435435
436436 let tDynamicWinResult = 3
437437
438438 let tDynamicTotalRegCount = 4
439439
440440 let tDynamicTotalAttempts = 5
441441
442442 func getTourData (tourContract,tId) = {
443443 let static = split(valueOrErrorMessage(getString(tourContract, keyTourStaticDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
444444 let dynamic = split_4C(valueOrErrorMessage(getString(tourContract, keyTourDynamicDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
445445 [static, dynamic]
446446 }
447447
448448
449449 func getRecipeMaterials (recipe) = (parseIntValue(recipe[rIdxCoeff]) * COEFF2MAT)
450450
451451
452+let KS_SEPARATE_PUBLIC_KEY = false
453+
452454 let chain = take(drop(this.bytes, 1), 1)
455+
456+let pub = match chain {
457+ case _ =>
458+ if ((base58'2W' == $match0))
459+ then if (KS_SEPARATE_PUBLIC_KEY)
460+ then base58'CWsMtTZC5BjjoL4Q1ayW4Wwb1ehGACQB6DrKyPgotKfm'
461+ else base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
462+ else if ((base58'2T' == $match0))
463+ then base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
464+ else throw("Unknown chain")
465+}
453466
454467 let usdtAssetId = match chain {
455468 case _ =>
456469 if ((base58'2W' == $match0))
457470 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
458471 else if ((base58'2T' == $match0))
459472 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
460473 else throw("Unknown chain")
461474 }
462475
463476 let defaultRestAddressStr = match chain {
464477 case _ =>
465478 if ((base58'2W' == $match0))
466479 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
467480 else if ((base58'2T' == $match0))
468481 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
469482 else throw("Unknown chain")
470483 }
471484
472485 let InfraUpgradeCostS = match chain {
473486 case _ =>
474487 if ((base58'2W' == $match0))
475488 then 10000000000
476489 else if ((base58'2T' == $match0))
477490 then 100000000
478491 else throw("Unknown chain")
479492 }
480493
481494 let SEP = "__"
482495
483496 let MULT6 = 1000000
484497
485498 let MULT8 = 100000000
486499
487500 let SSIZE = 25
488501
489502 let MSIZE = 100
490503
491504 let LSIZE = 225
492505
493506 let XLSIZE = 400
494507
495508 let XXLSIZE = 625
496509
497510 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
498511
499512
500513 let IdxCfgStakingDapp = 1
501514
502515 let IdxCfgEconomyDapp = 2
503516
504517 let IdxCfgWlgDapp = 4
505518
506519 let IdxCfgPuzzlePoolDapp = 5
507520
508521 let IdxCfgInvestFundDapp = 6
509522
510523 let IdxCfgTournamentDapp = 7
511524
512525 let IdxCfgAcresDapp = 8
513526
514527 func keyRestCfg () = "%s__restConfig"
515528
516529
517530 func keyRestAddress () = "%s__restAddr"
518531
519532
520533 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
521534
522535
523536 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
524537
525538
526539 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
527540
528541 let restCfg = readRestCfgOrFail(restContract)
529542
530543 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
531544
532545 let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
533546
534547 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
535548
536549 let puzzlePoolContract = getContractAddressOrFail(restCfg, IdxCfgPuzzlePoolDapp)
537550
538551 let investFundContract = getContractAddressOrFail(restCfg, IdxCfgInvestFundDapp)
539552
540553 let tournamentContract = getContractAddressOrFail(restCfg, IdxCfgTournamentDapp)
541554
542555 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
543556
544557 let recLandNum = 0
545558
546559 let recLandSize = 1
547560
548561 let recTerrains = 2
549562
550563 let recContinent = 3
551564
552565 let wlgAssetIdKey = "wlg_assetId"
553566
554567 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
555568
556569 let acresIssuedAmountKey = "acresIssuedAmount"
557570
558571 let acresAssetIdKey = "acresAssetId"
559572
560573 let acresAssetId = valueOrErrorMessage(getBinary(acresContract, acresAssetIdKey), "ACRES is not issued yet")
561574
562575 let idxWlgAmount = 0
563576
564577 let idxWlgPrice = 1
565578
566579 let idxWlgFunds = 2
567580
568581 let idxWlgEconomy = 3
569582
570583 let idxWlgActivity = 4
571584
572585 let idxWlgArbitrage = 5
573586
574587 let idxWlgPool = 6
575588
576589 let idxWlgIssueTime = 7
577590
578591 let idxWlgLastMTATime = 8
579592
580593 let idxWlgMarketingTotal = 9
581594
582595 let idxWlgMarketingAmLeft = 10
583596
584597 let idxWlgMarketingAmAvailNow = 11
585598
586599 let idxWlgMarketingWlgold = 12
587600
588601 let idxWlgTeamTotal = 13
589602
590603 let idxWlgTeamAmLeft = 14
591604
592605 let idxWlgTeamAmAvailNow = 15
593606
594607 let idxWlgTeamWlgold = 16
595608
596609 let idxWlgActTotal = 17
597610
598611 let idxWlgActAmLeft = 18
599612
600613 let idxWlgActAmAvailNow = 19
601614
602615 let idxWlgActWlgold = 20
603616
604617 let idxWlgCurPeriod = 21
605618
606619 let idxWlgAmLeftTotal = 22
607620
608621 let idxWlgCurPeriodDistribution = 23
609622
610623 let idxWlgLastUserTime = 24
611624
612625 let idxWlgUserAmAvailNow = 25
613626
614627 let idxWlgSLandDailyAmount = 26
615628
616629 let idxWlgInvestFundAmount = 27
617630
618631 let idxWlgUserTotalAvail = 28
619632
620633 let idxWlgEffUserTime = 29
621634
622635 let IdxEffUser = 1
623636
624637 func keyResProportions () = "resTypesProportions"
625638
626639
627640 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
628641
629642
630643 func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
631644
632645
633646 func asString (v) = match v {
634647 case s: String =>
635648 s
636649 case _ =>
637650 throw("fail to cast into String")
638651 }
639652
640653
641654 func asInt (v) = match v {
642655 case n: Int =>
643656 n
644657 case _ =>
645658 throw("fail to cast into Int")
646659 }
647660
648661
649662 func asAnyList (v) = match v {
650663 case l: List[Any] =>
651664 l
652665 case _ =>
653666 throw("fail to cast into List[Any]")
654667 }
655668
656669
657670 func numPiecesBySize (landSize) = match landSize {
658671 case _ =>
659672 if (("S" == $match0))
660673 then SSIZE
661674 else if (("M" == $match0))
662675 then MSIZE
663676 else if (("L" == $match0))
664677 then LSIZE
665678 else if (("XL" == $match0))
666679 then XLSIZE
667680 else if (("XXL" == $match0))
668681 then XXLSIZE
669682 else throw("Unknown land size")
670683 }
671684
672685
673686 func keyBlocked () = "contractsBlocked"
674687
675688
676689 func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
677690
678691
679692 func getVotingPower (userAddrStrOrEmpty) = {
680693 let props = split(valueOrElse(getString(stakingContract, keyResProportions()), "0_0_0_0_0_0"), "_")
681694 func adder (acc,item) = (acc + parseIntValue(item))
682695
683696 let totalPower = {
684697 let $l = props
685698 let $s = size($l)
686699 let $acc0 = 0
687700 func $f0_1 ($a,$i) = if (($i >= $s))
688701 then $a
689702 else adder($a, $l[$i])
690703
691704 func $f0_2 ($a,$i) = if (($i >= $s))
692705 then $a
693706 else throw("List size exceeds 6")
694707
695708 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
696709 }
697710 let usersPower = valueOrElse(getInteger(stakingContract, keyStakedPiecesByOwner(userAddrStrOrEmpty)), 0)
698711 [totalPower, usersPower]
699712 }
700713
701714
702715 let USDTPRIZEPART = 500000
703716
704717 func asListIntCompacted (val) = match val {
705718 case valAnyList: List[Any] =>
706719 if ((size(valAnyList) != NUMRES))
707720 then throw(("Array size is " + toString(size(valAnyList))))
708721 else {
709722 func conv (acc,item) = match item {
710723 case it: Int =>
711724 (acc :+ toString(it))
712725 case _ =>
713726 throw("List type is not Int")
714727 }
715728
716729 let r = {
717730 let $l = valAnyList
718731 let $s = size($l)
719732 let $acc0 = nil
720733 func $f0_1 ($a,$i) = if (($i >= $s))
721734 then $a
722735 else conv($a, $l[$i])
723736
724737 func $f0_2 ($a,$i) = if (($i >= $s))
725738 then $a
726739 else throw("List size exceeds 6")
727740
728741 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
729742 }
730743 makeString(r, "_")
731744 }
732745 case _ =>
733746 throw("fail to cast into List")
734747 }
735748
736749
737750 func asSplitResult (val) = match val {
738751 case t2: (List[Any], List[Any]) =>
739752 $Tuple2(asListIntCompacted(t2._1), asListIntCompacted(t2._2))
740753 case _ =>
741754 throw("fail to cast into (List, List)")
742755 }
743756
744757
745758 func asCancelOrderResult (val) = match val {
746759 case t2: (Boolean, String) =>
747760 t2
748761 case _ =>
749762 throw("fail to cast into (Boolean, String)")
750763 }
751764
752765
753766 func walletInternal (userAddressOpt) = {
754767 let addr = addressFromString(userAddressOpt)
755768 let balance = if (isDefined(addr))
756769 then wavesBalance(value(addr))
757770 else BalanceDetails(0, 0, 0, 0)
758771 let usdtBalance = if (isDefined(addr))
759772 then assetBalance(value(addr), usdtAssetId)
760773 else 0
761774 let wlgoldBalance = if (isDefined(addr))
762775 then assetBalance(value(addr), wlgAssetId)
763776 else 0
764777 let customName = valueOrElse(getString(stakingContract, keyAddressToCustomName(userAddressOpt)), userAddressOpt)
765778 let refByKey = keyAddressRefBy(userAddressOpt)
766779 let refBy = getString(stakingContract, refByKey)
767780 let refs = valueOrElse(getString(stakingContract, keyAddressReferrals(userAddressOpt)), "")
768781 let lastTxId = valueOrElse(getString(stakingContract, keyLastTxIdByUser(userAddressOpt)), "")
769782 let pieces = getVotingPower(userAddressOpt)[IdxEffUser]
770783 let xp = valueOrElse(getInteger(stakingContract, keyUserXP(userAddressOpt)), 0)
771784 let lvl = valueOrElse(getInteger(stakingContract, keyUserLevel(userAddressOpt)), 0)
772785 let freePoints = valueOrElse(getInteger(stakingContract, keyUserFreePoints(userAddressOpt)), 0)
773786 let virtWlgData = {
774787 let @ = invoke(wlgContract, "checkWlgXpREADONLY", [userAddressOpt], nil)
775788 if ($isInstanceOf(@, "List[Any]"))
776789 then @
777790 else throw(($getType(@) + " couldn't be cast to List[Any]"))
778791 }
779792 let stakedWlgold = valueOrElse(getInteger(wlgContract, keyWlgStakedAmountByUser(userAddressOpt)), 0)
780793 let onboard = if (isDefined(refBy))
781794 then (ARTONBOARD + (if (if (isDefined(addr))
782795 then isDefined(getString(stakingContract, keyOnboardArtDuckActivatedBy(userAddressOpt)))
783796 else false)
784797 then ":1"
785798 else ":0"))
786799 else ""
787800 let acresBalance = if (isDefined(addr))
788801 then assetBalance(value(addr), acresAssetId)
789802 else 0
790803 let stakedAcres = valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(userAddressOpt)), 0)
791804 let delivCount = valueOrElse(getInteger(stakingContract, keyUserDeliveryCount(userAddressOpt)), 0)
792805 let lastDelivDay = valueOrElse(getInteger(stakingContract, keyUserLastDeliveryDay(userAddressOpt)), 0)
793806 [("%s%s__customName__" + customName), ("%s%s__referredBy__" + valueOrElse(refBy, "")), ("%s%s__referrals__" + refs), ("%s%s__lastTxId__" + lastTxId), ("%s%d__wavesBalance__" + toString(balance.available)), ("%s%d__wlgoldBalance__" + toString(wlgoldBalance)), ("%s%d__usdtBalance__" + toString(usdtBalance)), ("%s%d__stakedPieces__" + toString(pieces)), ("%s%d__acresBalance__" + toString(acresBalance)), ("%s%d__stakedAcres__" + toString(stakedAcres)), ("%s%d__currentXp__" + toString(xp)), ("%s%d__currentLvl__" + toString(lvl)), ("%s%d__pointsToDistribute__" + toString(freePoints)), ("%s%s__walletArtefacts__" + onboard), ("%s%d__stakedWlgold__" + toString(stakedWlgold)), ("%s%d__virtLevel__" + toString({
794807 let @ = virtWlgData[0]
795808 if ($isInstanceOf(@, "Int"))
796809 then @
797810 else throw(($getType(@) + " couldn't be cast to Int"))
798811 })), ("%s%d__virtPoints__" + toString({
799812 let @ = virtWlgData[1]
800813 if ($isInstanceOf(@, "Int"))
801814 then @
802815 else throw(($getType(@) + " couldn't be cast to Int"))
803816 })), ("%s%d__virtXP__" + toString({
804817 let @ = virtWlgData[2]
805818 if ($isInstanceOf(@, "Int"))
806819 then @
807820 else throw(($getType(@) + " couldn't be cast to Int"))
808821 })), ("%s%d__userDeliveryCount__" + toString(delivCount)), ("%s%d__userLastDeliveryDay__" + toString(lastDelivDay)), ("%s%d__lockedAcres__" + toString(valueOrElse(getInteger(acresContract, keyAcresLockedAmountByUser(userAddressOpt)), 0))), ("%s%d__ETALockedAcres__" + toString(valueOrElse(getInteger(acresContract, keyAcresLockedEtaByUser(userAddressOpt)), 0)))]
809822 }
810823
811824
812825 func applyBonuses (landAssetId,pieces) = {
813826 let infraLevel = valueOrElse(getInteger(stakingContract, keyInfraLevelByAssetId(landAssetId)), 0)
814827 let artPieces = valueOrElse(getInteger(stakingContract, keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0)
815828 let add6 = (infraLevel / 6)
816829 let add7 = (infraLevel / 7)
817830 $Tuple3(infraLevel, artPieces, ((DAILYRESBYPIECE + fraction(DAILYRESBYPIECE, ((infraLevel + add6) + (2 * add7)), 5)) + fraction(DAILYRESBYPIECE, artPieces, (pieces * 5))))
818831 }
819832
820833
821834 func getWarehouseTotalVolume (volPrefix) = {
822835 let parts = split(volPrefix, "_")
823836 ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
824837 }
825838
826839
827840 func getWarehouse (whKey,landIndex,infraLevel) = {
828841 let volPrefix = ((toString(landIndex) + "_") + toString(infraLevel))
829842 let totS = toString(getWarehouseTotalVolume(volPrefix))
830843 let whStr = valueOrElse(getString(stakingContract, whKey), ((((volPrefix + ":0_0_0_0_0_0:0_0_0_0_0_0::0_0_") + totS) + "_") + totS))
831844 split(whStr, ":")
832845 }
833846
834847
835848 func duckInfoTuple (duckAssetId) = {
836849 let maxHP = maxHealth(valueOrElse(getInteger(stakingContract, keyDuckLevel(duckAssetId)), 0))
837850 $Tuple5(valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(duckAssetId)), -1), value(assetInfo(fromBase58String(duckAssetId))).name, valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), ""), valueOrElse(getInteger(stakingContract, keyDuckHealth(duckAssetId)), maxHP), asString(invoke(stakingContract, "getBackpackREADONLY", [duckAssetId], nil)))
838851 }
839852
840853
841854 func duckInfoArray (duckAssetId,owner,duckInf) = {
842855 let customName = valueOrElse(getString(stakingContract, keyDuckAssetIdToCustomName(duckAssetId)), duckInf._2)
843856 let chars = valueOrElse(getString(stakingContract, keyDuckChars(duckAssetId)), "0_0_0_0_0")
844857 let xp = valueOrElse(getInteger(stakingContract, keyDuckXP(duckAssetId)), 0)
845858 let lvl = valueOrElse(getInteger(stakingContract, keyDuckLevel(duckAssetId)), 0)
846859 let freePoints = valueOrElse(getInteger(stakingContract, keyDuckFreePoints(duckAssetId)), 0)
847860 let equipm = valueOrElse(getString(stakingContract, keyDuckEquipment(duckAssetId)), ";_;_;_;_;_;")
848861 let buffs = valueOrElse(getString(stakingContract, keyDuckBuffs(duckAssetId)), "0_0_0_0_0")
849862 let $t071367241 = getRobberyData(stakingContract, duckAssetId)
850863 let robCost = $t071367241._1
851864 let lastRobTime = $t071367241._2
852865 let duckState = $t071367241._3
853866 let lockedLand = $t071367241._4
854867 let landETA = $t071367241._5
855868 let deliveryDelayETA = valueOrElse(getInteger(stakingContract, keyDeliveryDelayByDuck(duckAssetId)), 0)
856869 [("%s%s__assetId__" + duckAssetId), ("%s%s__owner__" + owner), ("%s%s__customName__" + customName), ("%s%d__stakedTime__" + toString(duckInf._1)), ("%s%s__name__" + duckInf._2), ("%s%s__location__" + duckInf._3), ("%s%d__health__" + toString(duckInf._4)), ("%s%d__maxHealth__" + toString(maxHealth(lvl))), ("%s%s__characteristics__" + chars), ("%s%d__currentXp__" + toString(xp)), ("%s%d__currentLvl__" + toString(lvl)), ("%s%d__pointsToDistribute__" + toString(freePoints)), ("%s%s__backPack__" + duckInf._5), ("%s%s__equipment__" + equipm), ("%s%s__buffs__" + buffs), ("%s%d__robberyCost__" + toString(robCost)), ("%s%d__robberyTime__" + toString(lastRobTime)), ("%s%s__robberyState__" + duckRobStates[duckState]), ("%s%s__robberyLastLand__" + lockedLand), ("%s%d__robberyLastLandReleaseTime__" + toString(landETA)), ("%s%d__deliveryDelay__" + toString(deliveryDelayETA))]
857870 }
858871
859872
860873 func landInfoArray (landAssetId,owner,stakedTime) = if ((landAssetId == ""))
861874 then throw("landAssetId is required")
862875 else {
863876 let a = value(assetInfo(fromBase58String(landAssetId)))
864877 let d = split(a.description, "_")
865878 let landNum = if ((a.quantity > 0))
866879 then d[recLandNum]
867880 else ("-" + d[recLandNum])
868881 let pieces = numPiecesBySize(d[recLandSize])
869882 let productivity = applyBonuses(landAssetId, pieces)
870883 let deltaTime = (lastBlock.timestamp - stakedTime)
871884 let availRes = if ((stakedTime > 0))
872885 then fraction(deltaTime, (productivity._3 * pieces), DAYMILLIS)
873886 else 0
874887 let needMat = fraction(InfraUpgradeCostS, (pieces * (productivity._1 + 1)), SSIZE)
875888 let globalAndLocal = if ((stakedTime > 0))
876889 then asSplitResult(invoke(stakingContract, "splitByGlobalAndLocalWeightsREADONLY", [needMat, availRes, d[recTerrains]], nil))
877890 else $Tuple2(asListIntCompacted(invoke(stakingContract, "splitByGlobalWeightsREADONLY", [needMat], nil)), "")
878891 let customName = valueOrElse(getString(stakingContract, keyLandAssetIdToCustomName(landAssetId)), ((d[recContinent] + "-") + d[recLandNum]))
879892 let fort = valueOrElse(getString(stakingContract, keyFortificationsByLand(landAssetId)), ":0_15:0_18:0")
880893 let state = valueOrElse(getInteger(stakingContract, keyLandRobberyState(landAssetId)), 0)
881894 let cooldownETA = valueOrElse(getInteger(stakingContract, keyLandCooldownETA(landAssetId)), 0)
882895 [("%s%s__assetId__" + landAssetId), ("%s%s__owner__" + owner), ("%s%s__customName__" + customName), ("%s%d__stakedTime__" + toString(stakedTime)), ("%s%s__description__" + makeString([landNum, d[recLandSize], d[recTerrains], d[recContinent]], "_")), ("%s%d__infraLevel__" + toString(productivity._1)), ("%s%s__availResByType__" + globalAndLocal._2), ("%s%d__availResTotal__" + toString(availRes)), ("%s%s__needMaterial__" + globalAndLocal._1), ("%s%s__landArtefacts__PRESALE:" + toString(productivity._2)), ("%s%s__warehouse__" + makeString(getWarehouse(keyWarehouseByLand(landAssetId), (pieces / SSIZE), productivity._1), ":")), ("%s%s__landOrder__" + valueOrElse(getString(economyContract, keyOrderByLand(landAssetId)), "0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:")), ("%s%s__fortifications__" + fort), ("%s%s__robberyState__" + landRobStates[state]), ("%s%d__canBeRobbedAfter__" + toString(cooldownETA))]
883896 }
884897
885898
886899 func landOrderInfoArray (landAssetId,owner) = if ((landAssetId == ""))
887900 then throw("landAssetId is required")
888901 else {
889902 let a = value(assetInfo(fromBase58String(landAssetId)))
890903 let d = split(a.description, "_")
891904 let pieces = numPiecesBySize(d[recLandSize])
892905 let productivity = applyBonuses(landAssetId, pieces)
893906 [("%s%s__assetId__" + landAssetId), ("%s%s__owner__" + owner), ("%s%s__warehouse__" + makeString(getWarehouse(keyWarehouseByLand(landAssetId), (pieces / SSIZE), productivity._1), ":")), ("%s%s__landOrder__" + valueOrElse(getString(economyContract, keyOrderByLand(landAssetId)), "0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:"))]
894907 }
895908
896909
897910 func slotEffect (slot) = if ((slot == ""))
898911 then 0
899912 else {
900913 let slot0 = split(slot, ",")[0]
901914 if ((slot0 == ""))
902915 then 0
903916 else {
904917 let prod = split(slot0, ":")
905918 if (if ((prod[1] == ""))
906919 then true
907920 else (parseIntValue(prod[1]) == 0))
908921 then 0
909922 else parseIntValue(split(productionMatrix[parseIntValue(prod[0])], "_")[rIdxEffect])
910923 }
911924 }
912925
913926
914927 func tourStatsCommon (tournamentId) = {
915928 let tData = getTourData(tournamentContract, tournamentId)
916929 let static = tData[idxStatic]
917930 let dynamic = tData[idxDynamic]
918931 let leaders = if ((dynamic[tDynamicLeaders] == ""))
919932 then " "
920933 else dynamic[tDynamicLeaders]
921934 let scoreBoard = valueOrElse(getString(tournamentContract, keyScoreBoardByTour(tournamentId)), "")
922935 let numGrands = if ((size(static) > tStaticNumGrands))
923936 then static[tStaticNumGrands]
924937 else "0"
925938 let prizeFund = if ((size(static) > tStaticPrizeFund))
926939 then static[tStaticPrizeFund]
927940 else "0"
928941 let assetId = if ((size(static) > tStaticAsset))
929942 then fromBase58String(static[tStaticAsset])
930943 else wlgAssetId
931944 let assetName = valueOrErrorMessage(assetInfo(assetId), "No assetInfo available").name
932945 [("%s%s__tournamentStaticData__" + makeString([static[tStaticRegisterCost], static[tStaticAttemptCost], static[tStaticStart], static[tStaticEnd], numGrands, prizeFund, assetName], "_")), ("%s%s__tournamentDynamicData__" + makeString_2C([dynamic[tDynamicStatus], leaders, dynamic[tDynamicWinResult], dynamic[tDynamicTotalRegCount], dynamic[tDynamicTotalAttempts]], "_")), ("%s%s__tournamentScoreBoard__" + scoreBoard)]
933946 }
934947
935948
936949 func getAnyData (addr,key) = {
937950 let bool = getBoolean(addr, key)
938951 if (isDefined(bool))
939952 then value(bool)
940953 else {
941954 let bin = getBinary(addr, key)
942955 if (isDefined(bin))
943956 then value(bin)
944957 else {
945958 let int = getInteger(addr, key)
946959 if (isDefined(int))
947960 then value(int)
948961 else getString(addr, key)
949962 }
950963 }
951964 }
952965
953966
954967 func genericREADONLY (queries) = {
955968 func call (acc,query) = {
956969 let addr = Address(fromBase58String(query._1))
957970 let funcOrKey = query._2
958971 let result = match query {
959972 case inv: (String, String, List[Any]) =>
960973 invoke(addr, funcOrKey, inv._3, nil)
961974 case _ =>
962975 getAnyData(addr, funcOrKey)
963976 }
964977 (acc :+ result)
965978 }
966979
967980 let $l = queries
968981 let $s = size($l)
969982 let $acc0 = nil
970983 func $f0_1 ($a,$i) = if (($i >= $s))
971984 then $a
972985 else call($a, $l[$i])
973986
974987 func $f0_2 ($a,$i) = if (($i >= $s))
975988 then $a
976989 else throw("List size exceeds 10")
977990
978991 $f0_2($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)
979992 }
980993
981994
982995 @Callable(i)
983996 func constructorV1 (contracts) = if ((i.caller != this))
984997 then throw("permissions denied")
985998 else {
986999 func descriptor (acc,ignoredItem) = (acc + "%s")
9871000
9881001 let descr = {
9891002 let $l = contracts
9901003 let $s = size($l)
9911004 let $acc0 = ""
9921005 func $f0_1 ($a,$i) = if (($i >= $s))
9931006 then $a
9941007 else descriptor($a, $l[$i])
9951008
9961009 func $f0_2 ($a,$i) = if (($i >= $s))
9971010 then $a
9981011 else throw("List size exceeds 10")
9991012
10001013 $f0_2($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)
10011014 }
10021015 [StringEntry(keyRestCfg(), makeString(descr :: contracts, SEP)), StringEntry(keyRestAddress(), toString(this))]
10031016 }
10041017
10051018
10061019
10071020 @Callable(i)
10081021 func walletInfoREADONLY (userAddressOpt) = $Tuple2(nil, walletInternal(userAddressOpt))
10091022
10101023
10111024
10121025 @Callable(i)
10131026 func duckByOwnerInfoREADONLY (userAddress) = {
10141027 let stakedDuck = getString(stakingContract, keyStakedDuckByOwner(userAddress))
10151028 $Tuple2(nil, if (if (isDefined(addressFromString(userAddress)))
10161029 then isDefined(stakedDuck)
10171030 else false)
10181031 then {
10191032 let duckAssetId = value(stakedDuck)
10201033 duckInfoArray(duckAssetId, userAddress, duckInfoTuple(duckAssetId))
10211034 }
10221035 else duckInfoArray("", userAddress, $Tuple5(-1, "", "", -1, "")))
10231036 }
10241037
10251038
10261039
10271040 @Callable(i)
10281041 func duckByAssetIdInfoREADONLY (duckAssetId) = {
10291042 let owner = getString(stakingContract, keyDuckIdToOwner(duckAssetId))
10301043 $Tuple2(nil, duckInfoArray(duckAssetId, if (isDefined(owner))
10311044 then value(owner)
10321045 else "", duckInfoTuple(duckAssetId)))
10331046 }
10341047
10351048
10361049
10371050 @Callable(i)
10381051 func ducksByIdsInfoREADONLY (duckAssetIds) = {
10391052 func oneDuck (acc,duckAssetId) = if ((duckAssetId == ""))
10401053 then throw("duckAssetId is required")
10411054 else {
10421055 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(duckAssetId)), -1)
10431056 let owner = if ((stakedTime > 0))
10441057 then value(getString(stakingContract, keyDuckIdToOwner(duckAssetId)))
10451058 else ""
10461059 (acc :+ duckInfoArray(duckAssetId, owner, duckInfoTuple(duckAssetId)))
10471060 }
10481061
10491062 let r = {
10501063 let $l = duckAssetIds
10511064 let $s = size($l)
10521065 let $acc0 = nil
10531066 func $f0_1 ($a,$i) = if (($i >= $s))
10541067 then $a
10551068 else oneDuck($a, $l[$i])
10561069
10571070 func $f0_2 ($a,$i) = if (($i >= $s))
10581071 then $a
10591072 else throw("List size exceeds 100")
10601073
10611074 $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($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($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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
10621075 }
10631076 $Tuple2(nil, r)
10641077 }
10651078
10661079
10671080
10681081 @Callable(i)
10691082 func landByAssetIdInfoREADONLY (landAssetId) = if ((landAssetId == ""))
10701083 then throw("landAssetId is required")
10711084 else {
10721085 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
10731086 let owner = if ((stakedTime > 0))
10741087 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
10751088 else ""
10761089 $Tuple2(nil, landInfoArray(landAssetId, owner, stakedTime))
10771090 }
10781091
10791092
10801093
10811094 @Callable(i)
10821095 func stakedLandsByOwnerInfoREADONLY (landOwnerAddress) = if ((landOwnerAddress == ""))
10831096 then throw("landOwnerAddress is required")
10841097 else {
10851098 let landsStr = getString(stakingContract, keyStakedLandsByOwner(landOwnerAddress))
10861099 let lands = if (isDefined(landsStr))
10871100 then split_51C(value(landsStr), "_")
10881101 else nil
10891102 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
10901103 then throw("landAssetId is required")
10911104 else {
10921105 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
10931106 (acc :+ landInfoArray(landAssetId, landOwnerAddress, stakedTime))
10941107 }
10951108
10961109 let r = {
10971110 let $l = lands
10981111 let $s = size($l)
10991112 let $acc0 = nil
11001113 func $f0_1 ($a,$i) = if (($i >= $s))
11011114 then $a
11021115 else oneLand($a, $l[$i])
11031116
11041117 func $f0_2 ($a,$i) = if (($i >= $s))
11051118 then $a
11061119 else throw("List size exceeds 100")
11071120
11081121 $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($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($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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
11091122 }
11101123 $Tuple2(nil, r)
11111124 }
11121125
11131126
11141127
11151128 @Callable(i)
11161129 func landsByIdsInfoREADONLY (landAssetIds) = {
11171130 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
11181131 then throw("landAssetId is required")
11191132 else {
11201133 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
11211134 let owner = if ((stakedTime > 0))
11221135 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
11231136 else ""
11241137 (acc :+ landInfoArray(landAssetId, owner, stakedTime))
11251138 }
11261139
11271140 let r = {
11281141 let $l = landAssetIds
11291142 let $s = size($l)
11301143 let $acc0 = nil
11311144 func $f0_1 ($a,$i) = if (($i >= $s))
11321145 then $a
11331146 else oneLand($a, $l[$i])
11341147
11351148 func $f0_2 ($a,$i) = if (($i >= $s))
11361149 then $a
11371150 else throw("List size exceeds 100")
11381151
11391152 $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($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($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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
11401153 }
11411154 $Tuple2(nil, r)
11421155 }
11431156
11441157
11451158
11461159 @Callable(i)
11471160 func warehouseOrderByAssetIdInfoREADONLY (landAssetId) = if ((landAssetId == ""))
11481161 then throw("landAssetId is required")
11491162 else {
11501163 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
11511164 let owner = if ((stakedTime > 0))
11521165 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
11531166 else ""
11541167 $Tuple2(nil, landOrderInfoArray(landAssetId, owner))
11551168 }
11561169
11571170
11581171
11591172 @Callable(i)
11601173 func ordersByLandIdsInfoREADONLY (landAssetIds) = {
11611174 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
11621175 then throw("landAssetId is required")
11631176 else {
11641177 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
11651178 let owner = if ((stakedTime > 0))
11661179 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
11671180 else ""
11681181 (acc :+ landOrderInfoArray(landAssetId, owner))
11691182 }
11701183
11711184 let r = {
11721185 let $l = landAssetIds
11731186 let $s = size($l)
11741187 let $acc0 = nil
11751188 func $f0_1 ($a,$i) = if (($i >= $s))
11761189 then $a
11771190 else oneLand($a, $l[$i])
11781191
11791192 func $f0_2 ($a,$i) = if (($i >= $s))
11801193 then $a
11811194 else throw("List size exceeds 40")
11821195
11831196 $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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40)
11841197 }
11851198 $Tuple2(nil, r)
11861199 }
11871200
11881201
11891202
11901203 @Callable(i)
11911204 func cancelWarehouseOrders (landAssetIds) = if ((i.caller != this))
11921205 then throw("permission denied")
11931206 else {
11941207 let blocked = getBoolean(stakingContract, keyBlocked())
11951208 if (if (!(isDefined(blocked)))
11961209 then true
11971210 else (value(blocked) == false))
11981211 then throw("Contracts should be blocked before canceling orders")
11991212 else {
12001213 func oneLand (a,landAssetId) = if ((landAssetId == ""))
12011214 then throw("landAssetId is required")
12021215 else {
12031216 let c = asCancelOrderResult(invoke(economyContract, "setWarehouseOrder", ["0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:", landAssetId], nil))._1
12041217 if (if (a)
12051218 then true
12061219 else c)
12071220 then !(if (a)
12081221 then c
12091222 else false)
12101223 else false
12111224 }
12121225
12131226 let r = {
12141227 let $l = landAssetIds
12151228 let $s = size($l)
12161229 let $acc0 = false
12171230 func $f0_1 ($a,$i) = if (($i >= $s))
12181231 then $a
12191232 else oneLand($a, $l[$i])
12201233
12211234 func $f0_2 ($a,$i) = if (($i >= $s))
12221235 then $a
12231236 else throw("List size exceeds 30")
12241237
12251238 $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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
12261239 }
12271240 $Tuple2(nil, r)
12281241 }
12291242 }
12301243
12311244
12321245
12331246 @Callable(i)
1247+func distributeLockedAcres (users,amount,lockDays) = if (if ((i.caller != this))
1248+ then (i.callerPublicKey != pub)
1249+ else false)
1250+ then throw("Permission denied")
1251+ else if ((0 >= amount))
1252+ then throw("amount should be positive")
1253+ else if ((0 > lockDays))
1254+ then throw("lockDays should be non-negative")
1255+ else {
1256+ func oneUser (acc,addr) = if ((addr == ""))
1257+ then throw("address is required")
1258+ else (acc + asInt(invoke(acresContract, "sendLockedAcres", [addr, amount, lockDays], nil)))
1259+
1260+ let totalAcres = {
1261+ let $l = users
1262+ let $s = size($l)
1263+ let $acc0 = 0
1264+ func $f0_1 ($a,$i) = if (($i >= $s))
1265+ then $a
1266+ else oneUser($a, $l[$i])
1267+
1268+ func $f0_2 ($a,$i) = if (($i >= $s))
1269+ then $a
1270+ else throw("List size exceeds 20")
1271+
1272+ $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)
1273+ }
1274+ $Tuple2(nil, totalAcres)
1275+ }
1276+
1277+
1278+
1279+@Callable(i)
12341280 func sendUsdtPrize (userAddress) = if ((i.caller != stakingContract))
12351281 then throw("permission denied")
12361282 else {
12371283 let amt = fraction(assetBalance(this, usdtAssetId), USDTPRIZEPART, MULT6)
12381284 $Tuple2([ScriptTransfer(addressFromStringValue(userAddress), amt, usdtAssetId)], amt)
12391285 }
12401286
12411287
12421288
12431289 @Callable(i)
12441290 func getEmergencyServiceDataREADONLY () = {
12451291 let existStr = getString(economyContract, keyEsWarehouse())
12461292 let existAmounts = if (isDefined(existStr))
12471293 then split_4C(value(existStr), "_")
12481294 else nil
12491295 func singleProd (acc,recipeStr) = {
12501296 let n = acc._2
12511297 let recipe = split(recipeStr, "_")
12521298 let maxAmount = if ((n == 0))
12531299 then (ESMAXPACKAGES * PRODUCTPKGSIZE)
12541300 else 0
12551301 let existAmount = if ((size(existAmounts) > n))
12561302 then parseIntValue(existAmounts[n])
12571303 else 0
12581304 let totalMat = getRecipeMaterials(recipe)
12591305 let buyPrice = fraction((totalMat * ESBUYCOEF), RESOURCEPRICEMIN, (MULT8 * PRODUCTPKGSIZE))
12601306 let sellPrice = fraction((totalMat * ESSELLCOEF), RESOURCEPRICEMIN, (MULT8 * PRODUCTPKGSIZE))
12611307 let y = makeString([toString(maxAmount), toString(existAmount), toString(buyPrice), toString(sellPrice)], "_")
12621308 $Tuple2((acc._1 :+ y), (n + 1))
12631309 }
12641310
12651311 let s = makeString_2C(( let $l = productionMatrix
12661312 let $s = size($l)
12671313 let $acc0 = $Tuple2(nil, 0)
12681314 func $f0_1 ($a,$i) = if (($i >= $s))
12691315 then $a
12701316 else singleProd($a, $l[$i])
12711317
12721318 func $f0_2 ($a,$i) = if (($i >= $s))
12731319 then $a
12741320 else throw("List size exceeds 50")
12751321
12761322 $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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._1, ":")
12771323 let result = ("%s%s__emergencyServiceData__" + s)
12781324 $Tuple2(nil, result)
12791325 }
12801326
12811327
12821328
12831329 @Callable(i)
12841330 func wlgStatsREADONLY (userAddrOpt) = {
12851331 let curStats = getWlgStats(userAddrOpt, [restContract, stakingContract, economyContract, wlgContract, puzzlePoolContract, investFundContract, acresContract], usdtAssetId, 0, MULT6)
12861332 $Tuple2(nil, [("%s%d__wlgAmount__" + toString(curStats[idxWlgAmount])), ("%s%d__wlgPrice__" + toString(curStats[idxWlgPrice])), ("%s%d__usdtFunds__" + toString(curStats[idxWlgFunds])), ("%s%d__usdtEconomy__" + toString(curStats[idxWlgEconomy])), ("%s%d__usdtActivity__" + toString(curStats[idxWlgActivity])), ("%s%d__usdtArbitrage__" + toString(curStats[idxWlgArbitrage])), ("%s%d__usdtPool__" + toString(curStats[idxWlgPool])), ("%s%d__wlgIssueTime__" + toString(curStats[idxWlgIssueTime])), ("%s%d__wlgLastMarketingTeamActTime__" + toString(curStats[idxWlgLastMTATime])), ("%s%d__wlgMarketingTotal__" + toString(curStats[idxWlgMarketingTotal])), ("%s%d__wlgMarketingAmLeft__" + toString(curStats[idxWlgMarketingAmLeft])), ("%s%d__wlgMarketingAmAvailNow__" + toString(curStats[idxWlgMarketingAmAvailNow])), ("%s%d__wlgMarketingWlgold__" + toString(curStats[idxWlgMarketingWlgold])), ("%s%d__wlgTeamTotal__" + toString(curStats[idxWlgTeamTotal])), ("%s%d__wlgTeamAmLeft__" + toString(curStats[idxWlgTeamAmLeft])), ("%s%d__wlgTeamAmAvailNow__" + toString(curStats[idxWlgTeamAmAvailNow])), ("%s%d__wlgTeamWlgold__" + toString(curStats[idxWlgTeamWlgold])), ("%s%d__wlgActTotal__" + toString(curStats[idxWlgActTotal])), ("%s%d__wlgActAmLeft__" + toString(curStats[idxWlgActAmLeft])), ("%s%d__wlgActAmAvailNow__" + toString(curStats[idxWlgActAmAvailNow])), ("%s%d__wlgActWlgold__" + toString(curStats[idxWlgActWlgold])), ("%s%d__wlgCurPeriod__" + toString(curStats[idxWlgCurPeriod])), ("%s%d__wlgAmLeftTotal__" + toString(curStats[idxWlgAmLeftTotal])), ("%s%d__wlgCurPeriodDistribution__" + toString(curStats[idxWlgCurPeriodDistribution])), ("%s%d__wlgLastUserTime__" + toString(curStats[idxWlgLastUserTime])), ("%s%d__wlgUserAmAvailNow__" + toString(curStats[idxWlgUserAmAvailNow])), ("%s%d__wlgGuestSLandDaily__" + toString(curStats[idxWlgSLandDailyAmount])), ("%s%d__wlgInvestFundTotal__" + toString(curStats[idxWlgInvestFundAmount])), ("%s%d__wlgUserTotalAvail__" + toString(curStats[idxWlgUserTotalAvail])), ("%s%d__wlgEffUserTime__" + toString(curStats[idxWlgEffUserTime]))])
12871333 }
12881334
12891335
12901336
12911337 @Callable(i)
12921338 func tournamentStatsREADONLY (tournamentId) = $Tuple2(nil, tourStatsCommon(tournamentId))
12931339
12941340
12951341
12961342 @Callable(i)
12971343 func lastTournamentStatsREADONLY () = {
12981344 let tournamentId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
12991345 $Tuple2(nil, [("%s%s__lastTournamentId__" + toString(tournamentId)), tourStatsCommon(tournamentId)])
13001346 }
13011347
13021348
13031349
13041350 @Callable(i)
13051351 func tournamentDuckStatsREADONLY (tId,duckAssetId) = {
13061352 let isDuckReg = valueOrElse(getBoolean(tournamentContract, keyIsRegisteredByTourAndDuck(tId, duckAssetId)), false)
13071353 let lastDuckAttempt = valueOrElse(getInteger(tournamentContract, keyLastAttemptByTourAndDuck(tId, duckAssetId)), -1)
13081354 let bestDuckResult = valueOrElse(getInteger(tournamentContract, keyBestResultByTourAndDuck(tId, duckAssetId)), 0)
13091355 let bestDuckTx = valueOrElse(getString(tournamentContract, keyBestTxByTourAndDuck(tId, duckAssetId)), "")
13101356 let isAwarded = valueOrElse(getBoolean(tournamentContract, keyIsAwardedByTourAndDuck(tId, duckAssetId)), false)
13111357 $Tuple2(nil, [("%s%s__tournamentDuckStats__" + makeString([toString(isDuckReg), toString(lastDuckAttempt), toString(bestDuckResult), bestDuckTx, toString(isAwarded)], "_"))])
13121358 }
13131359
13141360
13151361
13161362 @Callable(i)
13171363 func duckStatsCalculatorREADONLY (duckAssetId) = {
13181364 let chars = split(valueOrElse(getString(stakingContract, keyDuckChars(duckAssetId)), "0_0_0_0_0"), "_")
13191365 let buffs = split(valueOrElse(getString(stakingContract, keyDuckBuffs(duckAssetId)), "0_0_0_0_0"), "_")
13201366 let equipm = split(valueOrElse(getString(stakingContract, keyDuckEquipment(duckAssetId)), ";_;_;_;_;_;"), "_")
13211367 let equipmentPerc = slotEffect(split(equipm[segBack], ";")[1])
13221368 let equipmentAbsor = slotEffect(split(equipm[segBelt], ";")[0])
13231369 let dodge = dodgeProbability(chars, buffs, equipmentPerc)
13241370 let absorb = damageAbsorption(chars, buffs, equipmentAbsor)
13251371 $Tuple2(nil, [("%s%d__dodgeProbability__" + toString(dodge)), ("%s%d__damageAbsorption__" + toString(absorb))])
13261372 }
13271373
13281374
13291375
13301376 @Callable(i)
13311377 func customDuckStatsCalculatorREADONLY (chars,buffs,equipmentPerc,equipmentAbsor) = {
13321378 let dodge = dodgeProbability(chars, buffs, equipmentPerc)
13331379 let absorb = damageAbsorption(chars, buffs, equipmentAbsor)
13341380 $Tuple2(nil, [("%s%d__dodgeProbability__" + toString(dodge)), ("%s%d__damageAbsorption__" + toString(absorb))])
13351381 }
13361382
13371383
13381384
13391385 @Callable(i)
13401386 func acresStatsREADONLY (userAddrOpt) = {
13411387 let userClaim = asAnyList(invoke(acresContract, "claimAcresREADONLY", [userAddrOpt], nil))
13421388 let userClaimable = asInt(userClaim[0])
13431389 let userLastTime = asInt(userClaim[1])
13441390 $Tuple2(nil, [("%s%d__acresIssuedTotal__" + toString(valueOrElse(getInteger(acresContract, acresIssuedAmountKey), 0))), ("%s%d__acresUnsold__" + toString(assetBalance(acresContract, acresAssetId))), ("%s%d__acresStakedTotal__" + toString(valueOrElse(getInteger(acresContract, acresStakedTotalKey), 0))), ("%s%d__acresStakedByUser__" + toString(valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(userAddrOpt)), 0))), ("%s%d__acresClaimableByUser__" + toString(userClaimable)), ("%s%d__acresLastClaimTimeByUser__" + toString(userLastTime)), ("%s%d__acresLockedByUser__" + toString(valueOrElse(getInteger(acresContract, keyAcresLockedAmountByUser(userAddrOpt)), 0))), ("%s%d__acresLockedEtaByUser__" + toString(valueOrElse(getInteger(acresContract, keyAcresLockedEtaByUser(userAddrOpt)), 0)))])
13451391 }
13461392
13471393
13481394
13491395 @Callable(i)
13501396 func testV4 () = $Tuple2(nil, genericREADONLY(nil))
13511397
13521398

github/deemru/w8io/169f3d6 
163.56 ms