tx · ExP7TNqQUtay2H9C9LeEK5Vz3RdXraTgz9aoZtuoXT3y

3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy:  -0.04700000 Waves

2023.10.07 15:30 [2788214] smart account 3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy > SELF 0.00000000 Waves

{ "type": 13, "id": "ExP7TNqQUtay2H9C9LeEK5Vz3RdXraTgz9aoZtuoXT3y", "fee": 4700000, "feeAssetId": null, "timestamp": 1696681874318, "version": 2, "chainId": 84, "sender": "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy", "senderPublicKey": "C3PaRKeL8AUKbwUqdniMQtThgcTh5DYHV1777Hkxy7rp", "proofs": [ "3NVqevoMHejvVr5Ks6VYMsjWWw5kba735R4JhJoMQ2Fy3ubQCu79RVArKQearpTA27SKQoRNhbcXyBJYuwsmnKsg" ], "script": "base64:BgJzCAISAwoBGBIDCgEIEgMKAQgSAwoBCBIDCgEYEgMKAQgSAwoBCBIDCgEYEgMKAQgSAwoBGBIDCgEYEgMKARgSAwoBGBIDCgEYEgMKAQgSABIDCgEIEgMKAQESABIECgIBCBIDCgEIEgYKBBgYAQESAwoBCN0BAAJNNgDAhD0AAk04AIDC1y8ACE1JTExJT042AICA6YOx3hYADk1BUktFVElOR1NIQVJFAKCNBgAJVEVBTVNIQVJFAMCaDAANQUNUSVZJVFlTSEFSRQCgjQYAC1BMQVlFUlNIQVJFAIC1GAAKWUVBUk1JTExJUwCAhuvHdQAJREFZTUlMTElTAIC4mSkAEG1hcmtldGluZ0FkZHJLZXkCDW1hcmtldGluZ0FkZHIAC3RlYW1BZGRyS2V5Agh0ZWFtQWRkcgAUbGFzdE1hcmtldGluZ1RpbWVLZXkCGWxhc3RDbGFpbWVkVGltZV9tYXJrZXRpbmcAFm1hcmtldGluZ0Ftb3VudExlZnRLZXkCE21hcmtldGluZ0Ftb3VudExlZnQAD2xhc3RUZWFtVGltZUtleQIUbGFzdENsYWltZWRUaW1lX3RlYW0AEXRlYW1BbW91bnRMZWZ0S2V5Ag50ZWFtQW1vdW50TGVmdAAVbGFzdEFjdGl2aXRpZXNUaW1lS2V5AhpsYXN0Q2xhaW1lZFRpbWVfYWN0aXZpdGllcwAQYWN0QW1vdW50TGVmdEtleQIUYWN0aXZpdGllc0Ftb3VudExlZnQAFHN0YWtlcnNBbW91bnRMZWZ0S2V5AhFzdGFrZXJzQW1vdW50TGVmdAEYa2V5TGFzdENsYWltZWRUaW1lQnlVc2VyAQRhZGRyCQCsAgICFGxhc3RDbGFpbWVkVGltZVVzZXJfBQRhZGRyARRkaXN0cmlidXRpb25CeVBlcmlvZAEGcGVyaW9kCQBrAwUITUlMTElPTjYJAGgCBQtQTEFZRVJTSEFSRQkAZAIFBnBlcmlvZAABCQBoAgAGBQJNNgAPd2xnSXNzdWVUaW1lS2V5Ag13bGdfaXNzdWVUaW1lABJ3bGdJc3N1ZWRBbW91bnRLZXkCEHdsZ19pc3N1ZWRBbW91bnQAEXpiSXNzdWVkQW1vdW50S2V5AhJ6YmlsbF9pc3N1ZWRBbW91bnQBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQRhZGRyCQCsAgICGGFjcmVzU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgATYWNyZXNTdGFrZWRUb3RhbEtleQIWYWNyZXNTdGFrZWRBbW91bnRUb3RhbAAIZGFwcFJlc3QAAAALZGFwcFN0YWtpbmcAAQALZGFwcEVjb25vbXkAAgAHZGFwcFdsZwADAApkYXBwUHV6emxlAAQADmRhcHBJbnZlc3RGdW5kAAUACWRhcHBBY3JlcwAGAQhnZXRMYW5kcwMSdXNlckFkZHJTdHJPckVtcHR5D3N0YWtpbmdDb250cmFjdA1hY3Jlc0NvbnRyYWN0BAVwcm9wcwkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAITcmVzVHlwZXNQcm9wb3J0aW9ucwILMF8wXzBfMF8wXzACAV8KAQVhZGRlcgIDYWNjBGl0ZW0JAGQCBQNhY2MJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQQLdG90YWxQaWVjZXMKAAIkbAUFcHJvcHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWFkZGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGBAp1c2VyUGllY2VzCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkArAICAhRzdGFrZWRQaWVjZXNCeU93bmVyXwUSdXNlckFkZHJTdHJPckVtcHR5AAAECnRvdGFsQWNyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNYWNyZXNDb250cmFjdAUTYWNyZXNTdGFrZWRUb3RhbEtleQAABAl1c2VyQWNyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNYWNyZXNDb250cmFjdAkBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQUSdXNlckFkZHJTdHJPckVtcHR5AAAJAMwIAgULdG90YWxQaWVjZXMJAMwIAgUKdXNlclBpZWNlcwkAzAgCBQp0b3RhbEFjcmVzCQDMCAIFCXVzZXJBY3JlcwUDbmlsAA5pZHhUb3RhbFBpZWNlcwAAAA1pZHhVc2VyUGllY2VzAAEADWlkeFRvdGFsQWNyZXMAAgAMaWR4VXNlckFjcmVzAAMBC2dldFdsZ1N0YXRzBQt1c2VyQWRkck9wdAljb250cmFjdHMGdXNkdElkFXVzZHRCYWxhbmNlQ29ycmVjdGlvbg91c2VyUHJvcG9ydGlvbjYEDGlzc3VlZEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBRJ3bGdJc3N1ZWRBbW91bnRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAQKZWNvbm9teVVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwULZGFwcEVjb25vbXkFBnVzZHRJZAQHcmVzdFVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcFJlc3QFBnVzZHRJZAQGd2xnVXNkCQBlAgkA8AcCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUGdXNkdElkBRV1c2R0QmFsYW5jZUNvcnJlY3Rpb24ECXB1enpsZVVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUKZGFwcFB1enpsZQUGdXNkdElkBBJpbnZlc3RGdW5kQ29udHJhY3QJAJEDAgUJY29udHJhY3RzBQ5kYXBwSW52ZXN0RnVuZAQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRJpbnZlc3RGdW5kQ29udHJhY3QFBnVzZHRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJpbnZlc3RGdW5kQ29udHJhY3QFEXpiSXNzdWVkQW1vdW50S2V5AAAEDXRvdGFsRnVuZHNVc2QJAGQCCQBkAgUKZWNvbm9teVVzZAUGd2xnVXNkBQ9pbnZlc3RGdW5kVG90YWwEBXdsZ0lkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcCC3dsZ19hc3NldElkAhNOb3QgaW5pdGlhbGl6ZWQgeWV0BANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAlpc3N1ZVRpbWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUPd2xnSXNzdWVUaW1lS2V5Ag9Ob3QgaW5pdGlhbGl6ZWQEDm1hcmtldGluZ1RvdGFsCQBrAwUITUlMTElPTjYFDk1BUktFVElOR1NIQVJFBQJNNgQTbWFya2V0aW5nQW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUWbWFya2V0aW5nQW1vdW50TGVmdEtleQUObWFya2V0aW5nVG90YWwEEWxhc3RNYXJrZXRpbmdUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBRRsYXN0TWFya2V0aW5nVGltZUtleQUJaXNzdWVUaW1lBA1tYXJrZXRpbmdBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCdCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBRBtYXJrZXRpbmdBZGRyS2V5BBttYXJrZXRpbmdBbW91bnRBdmFpbGFibGVOb3cJAJcDAQkAzAgCCQBrAwUObWFya2V0aW5nVG90YWwJAGUCBQNub3cFEWxhc3RNYXJrZXRpbmdUaW1lBQpZRUFSTUlMTElTCQDMCAIFE21hcmtldGluZ0Ftb3VudExlZnQFA25pbAQPbWFya2V0aW5nV2xnb2xkCQDwBwIFDW1hcmtldGluZ0FkZHIFBXdsZ0lkBAl0ZWFtVG90YWwJAGsDBQhNSUxMSU9ONgUJVEVBTVNIQVJFBQJNNgQOdGVhbUFtb3VudExlZnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFEXRlYW1BbW91bnRMZWZ0S2V5BQl0ZWFtVG90YWwEDGxhc3RUZWFtVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUPbGFzdFRlYW1UaW1lS2V5BQlpc3N1ZVRpbWUECHRlYW1BZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCdCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBQt0ZWFtQWRkcktleQQWdGVhbUFtb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQl0ZWFtVG90YWwJAGUCBQNub3cFDGxhc3RUZWFtVGltZQkAaAIAAwUKWUVBUk1JTExJUwkAzAgCBQ50ZWFtQW1vdW50TGVmdAUDbmlsBAp0ZWFtV2xnb2xkCQDwBwIFCHRlYW1BZGRyBQV3bGdJZAQIYWN0VG90YWwJAGsDBQhNSUxMSU9ONgUNQUNUSVZJVFlTSEFSRQUCTTYEDWFjdEFtb3VudExlZnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFEGFjdEFtb3VudExlZnRLZXkFCGFjdFRvdGFsBBJsYXN0QWN0aXZpdGllc1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFFWxhc3RBY3Rpdml0aWVzVGltZUtleQUJaXNzdWVUaW1lBBVhY3RBbW91bnRBdmFpbGFibGVOb3cJAJcDAQkAzAgCCQBrAwUIYWN0VG90YWwJAGUCBQNub3cFEmxhc3RBY3Rpdml0aWVzVGltZQkAaAIAAwUKWUVBUk1JTExJUwkAzAgCBQ1hY3RBbW91bnRMZWZ0BQNuaWwECWFjdFdsZ29sZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcFJlc3QFBXdsZ0lkBAxsYXN0VXNlclRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcJARhrZXlMYXN0Q2xhaW1lZFRpbWVCeVVzZXIBBQt1c2VyQWRkck9wdAUJaXNzdWVUaW1lBA5sYXN0VXNlclBlcmlvZAkAaQIJAGUCBQxsYXN0VXNlclRpbWUFCWlzc3VlVGltZQUKWUVBUk1JTExJUwQKbm93TGltaXRlZAkAlwMBCQDMCAIFA25vdwkAzAgCCQBkAgUJaXNzdWVUaW1lCQBoAgADBQpZRUFSTUlMTElTBQNuaWwECWN1clBlcmlvZAkAlwMBCQDMCAIJAGkCCQBlAgUDbm93BQlpc3N1ZVRpbWUFCllFQVJNSUxMSVMJAMwIAgACBQNuaWwEA2VmZgkBCGdldExhbmRzAwULdXNlckFkZHJPcHQJAJEDAgUJY29udHJhY3RzBQtkYXBwU3Rha2luZwkAkQMCBQljb250cmFjdHMFCWRhcHBBY3JlcwQVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQEUZGlzdHJpYnV0aW9uQnlQZXJpb2QBBQljdXJQZXJpb2QECCR0MDc5MTQyAwkAAAIFDmxhc3RVc2VyUGVyaW9kBQljdXJQZXJpb2QEAmEwCQBrAwUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQBlAgUKbm93TGltaXRlZAUMbGFzdFVzZXJUaW1lBQpZRUFSTUlMTElTBAh1c2VyUGFydAkAawMFAmEwBQ91c2VyUHJvcG9ydGlvbjYFAk02BAdlZmZUaW1lCQBkAgUMbGFzdFVzZXJUaW1lCQBrAwkAZQIFCm5vd0xpbWl0ZWQFDGxhc3RVc2VyVGltZQUPdXNlclByb3BvcnRpb242BQJNNgkAlQoDBQh1c2VyUGFydAUCYTAFB2VmZlRpbWUDCQAAAgUObGFzdFVzZXJQZXJpb2QJAGUCBQljdXJQZXJpb2QAAQQCYTEJAGsDCQEUZGlzdHJpYnV0aW9uQnlQZXJpb2QBCQBlAgUJY3VyUGVyaW9kAAEJAGUCCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwUJY3VyUGVyaW9kBQxsYXN0VXNlclRpbWUFCllFQVJNSUxMSVMEAmEwCQBrAwUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQBlAgUKbm93TGltaXRlZAkAZAIFCWlzc3VlVGltZQkAaAIFCllFQVJNSUxMSVMFCWN1clBlcmlvZAUKWUVBUk1JTExJUwQFYXZhaWwJAGQCBQJhMQUCYTAECHVzZXJQYXJ0CQBrAwUFYXZhaWwFD3VzZXJQcm9wb3J0aW9uNgUCTTYEB2VmZlRpbWUDCQBnAgUCYTEFCHVzZXJQYXJ0CQBkAgUMbGFzdFVzZXJUaW1lCQBrAwUKWUVBUk1JTExJUwUIdXNlclBhcnQJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQkAZAIJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTBQljdXJQZXJpb2QJAGsDBQpZRUFSTUlMTElTCQBlAgUIdXNlclBhcnQFAmExBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAJUKAwUIdXNlclBhcnQFBWF2YWlsBQdlZmZUaW1lBAJhMgkAawMJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAgkAZQIJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTCQBlAgUJY3VyUGVyaW9kAAEFDGxhc3RVc2VyVGltZQUKWUVBUk1JTExJUwQCYTEJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQQCYTAJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwUJY3VyUGVyaW9kBQpZRUFSTUlMTElTBAVhdmFpbAkAZAIJAGQCBQJhMgUCYTEFAmEwBAh1c2VyUGFydAkAawMFBWF2YWlsBQ91c2VyUHJvcG9ydGlvbjYFAk02BAdlZmZUaW1lAwkAZwIFAmEyBQh1c2VyUGFydAkAZAIFDGxhc3RVc2VyVGltZQkAawMFCllFQVJNSUxMSVMFCHVzZXJQYXJ0CQEUZGlzdHJpYnV0aW9uQnlQZXJpb2QBCQBlAgUJY3VyUGVyaW9kAAIDCQBnAgkAZAIFAmEyBQJhMQUIdXNlclBhcnQJAGQCCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwkAZQIFCWN1clBlcmlvZAABCQBrAwUKWUVBUk1JTExJUwkAZQIFCHVzZXJQYXJ0BQJhMgkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAABCQBkAgkAZAIFCWlzc3VlVGltZQkAaAIFCllFQVJNSUxMSVMFCWN1clBlcmlvZAkAawMFCllFQVJNSUxMSVMJAGUCCQBlAgUIdXNlclBhcnQFAmEyBQJhMQUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQCVCgMFCHVzZXJQYXJ0BQVhdmFpbAUHZWZmVGltZQQKdXNlckFtb3VudAgFCCR0MDc5MTQyAl8xBA11c2VyQXZhaWxhYmxlCAUIJHQwNzkxNDICXzIEC2VmZkxhc3RUaW1lCAUIJHQwNzkxNDICXzMEEHNMYW5kRGFpbHlBbW91bnQJAGsDCQBrAwUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uBQlEQVlNSUxMSVMFCllFQVJNSUxMSVMAGQkAkQMCBQNlZmYFDmlkeFRvdGFsUGllY2VzBA9hbW91bnRMZWZ0VG90YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFFHN0YWtlcnNBbW91bnRMZWZ0S2V5AAAECnJvYmJlZFVzZXIJAGsDBQp1c2VyQW1vdW50CQBkAgkAaAIJAJEDAgUDZWZmBQ1pZHhVc2VyUGllY2VzBQJNOAkAkQMCBQNlZmYFDGlkeFVzZXJBY3JlcwkAZAIJAGgCCQCRAwIFA2VmZgUOaWR4VG90YWxQaWVjZXMFAk04CQCRAwIFA2VmZgUNaWR4VG90YWxBY3JlcwQMdW5yb2JiZWRVc2VyCQBrAwUNdXNlckF2YWlsYWJsZQkAZAIJAGgCCQCRAwIFA2VmZgUNaWR4VXNlclBpZWNlcwUCTTgJAJEDAgUDZWZmBQxpZHhVc2VyQWNyZXMJAGQCCQBoAgkAkQMCBQNlZmYFDmlkeFRvdGFsUGllY2VzBQJNOAkAkQMCBQNlZmYFDWlkeFRvdGFsQWNyZXMJAMwIAgUMaXNzdWVkQW1vdW50CQDMCAIJAGsDBQ10b3RhbEZ1bmRzVXNkBQJNOAUMaXNzdWVkQW1vdW50CQDMCAIFDXRvdGFsRnVuZHNVc2QJAMwIAgUKZWNvbm9teVVzZAkAzAgCBQdyZXN0VXNkCQDMCAIFBndsZ1VzZAkAzAgCBQlwdXp6bGVVc2QJAMwIAgUJaXNzdWVUaW1lCQDMCAIFEWxhc3RNYXJrZXRpbmdUaW1lCQDMCAIFDm1hcmtldGluZ1RvdGFsCQDMCAIFE21hcmtldGluZ0Ftb3VudExlZnQJAMwIAgUbbWFya2V0aW5nQW1vdW50QXZhaWxhYmxlTm93CQDMCAIFD21hcmtldGluZ1dsZ29sZAkAzAgCBQl0ZWFtVG90YWwJAMwIAgUOdGVhbUFtb3VudExlZnQJAMwIAgUWdGVhbUFtb3VudEF2YWlsYWJsZU5vdwkAzAgCBQp0ZWFtV2xnb2xkCQDMCAIFCGFjdFRvdGFsCQDMCAIFDWFjdEFtb3VudExlZnQJAMwIAgUVYWN0QW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCWFjdFdsZ29sZAkAzAgCBQljdXJQZXJpb2QJAMwIAgUPYW1vdW50TGVmdFRvdGFsCQDMCAIFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAzAgCBQxsYXN0VXNlclRpbWUJAMwIAgUKcm9iYmVkVXNlcgkAzAgCBRBzTGFuZERhaWx5QW1vdW50CQDMCAIFD2ludmVzdEZ1bmRUb3RhbAkAzAgCBQx1bnJvYmJlZFVzZXIJAMwIAgULZWZmTGFzdFRpbWUFA25pbAAGU0NBTEU4AIDC1y8ADnJvYmJlcnlDb3N0TWluAIDC1y8AFHJvYmJlcnlDb29sZG93bkNvZWZmAJADAA1jaGFySW50ZWxsZWN0AAIADWNoYXJFbmR1cmFuY2UAAwANY2hhckRleHRlcml0eQAEAAdzZWdCYWNrAAEAB3NlZ0JlbHQAAgANbGFuZFJvYlN0YXRlcwkAzAgCAgRmcmVlCQDMCAICBmxvY2tlZAkAzAgCAhFhZnRlckxvY2tDb29sZG93bgkAzAgCAg5yb2JiZWRDb29sZG93bgkAzAgCAhBkZWZlbmRlZENvb2xkb3duBQNuaWwADWR1Y2tSb2JTdGF0ZXMJAMwIAgIEZnJlZQkAzAgCAgxwcmVwYXJpbmdSb2IFA25pbAENa2V5RHVja0hlYWx0aAELZHVja0Fzc2V0SWQJAKwCAgILZHVja0hlYWx0aF8FC2R1Y2tBc3NldElkAQxrZXlEdWNrQ2hhcnMBC2R1Y2tBc3NldElkCQCsAgICCmR1Y2tDaGFyc18FC2R1Y2tBc3NldElkAQlrZXlEdWNrWFABC2R1Y2tBc3NldElkCQCsAgICB2R1Y2tYUF8FC2R1Y2tBc3NldElkAQxrZXlEdWNrTGV2ZWwBC2R1Y2tBc3NldElkCQCsAgICCmR1Y2tMZXZlbF8FC2R1Y2tBc3NldElkARFrZXlEdWNrRnJlZVBvaW50cwELZHVja0Fzc2V0SWQJAKwCAgIPZHVja0ZyZWVQb2ludHNfBQtkdWNrQXNzZXRJZAEQa2V5RHVja0VxdWlwbWVudAELZHVja0Fzc2V0SWQJAKwCAgIOZHVja0VxdWlwbWVudF8FC2R1Y2tBc3NldElkAQlrZXlVc2VyWFABBGFkZHIJAKwCAgIHdXNlclhQXwUEYWRkcgEMa2V5VXNlckxldmVsAQRhZGRyCQCsAgICCnVzZXJMZXZlbF8FBGFkZHIBEWtleVVzZXJGcmVlUG9pbnRzAQRhZGRyCQCsAgICD3VzZXJGcmVlUG9pbnRzXwUEYWRkcgEMa2V5RHVja0J1ZmZzAQtkdWNrQXNzZXRJZAkArAICAgpkdWNrQnVmZnNfBQtkdWNrQXNzZXRJZAEYa2V5TGFzdFJvYmJlcnlUaW1lQnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAhBsYXN0Um9iYmVyeVRpbWVfBQtkdWNrQXNzZXRJZAEYa2V5TGFzdFJvYmJlcnlDb3N0QnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAhBsYXN0Um9iYmVyeUNvc3RfBQtkdWNrQXNzZXRJZAETa2V5TGFuZFJvYmJlcnlTdGF0ZQELbGFuZEFzc2V0SWQJAKwCAgIRbGFuZFJvYmJlcnlTdGF0ZV8FC2xhbmRBc3NldElkARJrZXlMYW5kQ29vbGRvd25FVEEBC2xhbmRBc3NldElkCQCsAgICEGxhbmRDb29sZG93bkVUQV8FC2xhbmRBc3NldElkARNrZXlEdWNrUm9iYmVyeVN0YXRlAQtkdWNrQXNzZXRJZAkArAICAhFkdWNrUm9iYmVyeVN0YXRlXwULZHVja0Fzc2V0SWQBE2tleUxvY2tlZExhbmRCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICEWxvY2tlZExhbmRCeUR1Y2tfBQtkdWNrQXNzZXRJZAEJbWF4SGVhbHRoAQVsZXZlbAkAZAIAZAUFbGV2ZWwBDmdldFJvYmJlcnlEYXRhAg9zdGFraW5nQ29udHJhY3QLZHVja0Fzc2V0SWQEC2xhc3RSb2JDb3N0CQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBGGtleUxhc3RSb2JiZXJ5Q29zdEJ5RHVjawEFC2R1Y2tBc3NldElkAAAEC2xhc3RSb2JUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBGGtleUxhc3RSb2JiZXJ5VGltZUJ5RHVjawEFC2R1Y2tBc3NldElkAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEB3JvYkNvc3QJAJYDAQkAzAgCBQ5yb2JiZXJ5Q29zdE1pbgkAzAgCCQBlAgULbGFzdFJvYkNvc3QJAGgCBRRyb2JiZXJ5Q29vbGRvd25Db2VmZgkAZQIFA25vdwULbGFzdFJvYlRpbWUFA25pbAQJZHVja1N0YXRlCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBE2tleUR1Y2tSb2JiZXJ5U3RhdGUBBQtkdWNrQXNzZXRJZAAABApsb2NrZWRMYW5kCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBE2tleUxvY2tlZExhbmRCeUR1Y2sBBQtkdWNrQXNzZXRJZAIABAdsYW5kRVRBCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBEmtleUxhbmRDb29sZG93bkVUQQEFCmxvY2tlZExhbmQAAAkAlwoFBQdyb2JDb3N0BQtsYXN0Um9iVGltZQUJZHVja1N0YXRlBQpsb2NrZWRMYW5kBQdsYW5kRVRBAQR0YW5oAQF2BAZkb3VibGUJAGgCAAIFAXYEBGV4cDIJAGwGANeJz4EBAAgFBmRvdWJsZQAIAAgFBkhBTEZVUAkAbgQJAGUCBQRleHAyBQZTQ0FMRTgFBlNDQUxFOAkAZAIFBGV4cDIFBlNDQUxFOAUGSEFMRlVQARBkb2RnZVByb2JhYmlsaXR5AwVjaGFycwVidWZmcw1lcXVpcG1lbnRQZXJjBAVpbnRlbAkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckludGVsbGVjdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWJ1ZmZzBQ1jaGFySW50ZWxsZWN0BANkZXgJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDWNoYXJEZXh0ZXJpdHkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVidWZmcwUNY2hhckRleHRlcml0eQQGZmlyc3Q4CQBpAgkBBHRhbmgBCQBrAwUDZGV4BQZTQ0FMRTgAyAEABAQHc2Vjb25kOAkAbgQFDWVxdWlwbWVudFBlcmMJAGQCBQZTQ0FMRTgJAG4EAMCfqwMFBWludGVsCQBkAgABBQVpbnRlbAUGSEFMRlVQAGQFBkhBTEZVUAkAZAIFBmZpcnN0OAUHc2Vjb25kOAEQZGFtYWdlQWJzb3JwdGlvbgMFY2hhcnMFYnVmZnMOZXF1aXBtZW50QWJzb3IEBWludGVsCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFySW50ZWxsZWN0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFYnVmZnMFDWNoYXJJbnRlbGxlY3QEBWVuZHVyCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFyRW5kdXJhbmNlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFYnVmZnMFDWNoYXJFbmR1cmFuY2UEA2RleAkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckRleHRlcml0eQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWJ1ZmZzBQ1jaGFyRGV4dGVyaXR5BAZmaXJzdDgJAGgCBQ5lcXVpcG1lbnRBYnNvcgkAZAIFBlNDQUxFOAkAbgQAgL/WBgUFaW50ZWwJAGQCAAEFBWludGVsBQZIQUxGVVAEB3NlY29uZDgJAGkCCQEEc3FydAQFA2RleAAAAAgFBkhBTEZVUAAKBAZ0aGlyZDgJAGgCCQBpAgUGU0NBTEU4AAUFBWVuZHVyCQBkAgkAZAIFBmZpcnN0OAUHc2Vjb25kOAUGdGhpcmQ4AApBUlRQUkVTQUxFAgdQUkVTQUxFAApBUlRPTkJPQVJEAgdPTkJPQVJEAAZOVU1SRVMABgAPREFJTFlSRVNCWVBJRUNFAID40gEADFdITVVMVElQTElFUgCAyK+gJQAQUkVTT1VSQ0VQUklDRU1JTgDVtQIADUVTTUFYUEFDS0FHRVMACgAJRVNCVVlDT0VGAAQACkVTU0VMTENPRUYACgAJQ09FRkYyTUFUAICt4gQAEHByb2R1Y3Rpb25NYXRyaXgJAMwIAgIlOF84XzhfMTdfMTdfNDJfMTJfMF8zMF8wLDAsMCwwLDAsMCwwXwkAzAgCAiU4XzhfOF8xN18xN180Ml8yNF8wXzYwXzAsMCw1LDIsMCwwLDBfCQDMCAICJzhfOF84XzE3XzE3XzQyXzM2XzBfMTIwXzAsMCwxMCw0LDAsMCwwXwkAzAgCAik4XzE5XzE5XzhfMjdfMTlfMjZfMV8yMF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAik4XzE5XzE5XzhfMjdfMTlfNTJfMV80MF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAik4XzE5XzE5XzhfMjdfMTlfNzhfMV84MF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAiU4XzhfOF84XzhfNjBfMTNfMl8yXzAsMCwwLDAsMCwwLDBfMDExCQDMCAICJThfOF84XzhfOF82MF8yNl8yXzRfMCwwLDAsMCwwLDAsMF8wMTEJAMwIAgIlOF84XzhfOF84XzYwXzM5XzJfOF8wLDAsMCwwLDAsMCwwXzAxMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfMzBfM18zMF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfNjBfM181MF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfOTBfM183MF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAisxOF8xOF8xMF8xOF8xOF8xOF8xMV80XzEwXzAsMCwwLDAsMCwwLDBfMjAxCQDMCAICKzE4XzE4XzEwXzE4XzE4XzE4XzIyXzRfMjBfMCwwLDAsMCwwLDAsMF8yMDEJAMwIAgIrMThfMThfMTBfMThfMThfMThfMzNfNF8zMF8wLDAsMCwwLDAsMCwwXzIwMQkAzAgCAio0XzEzXzIyXzRfMzVfMjJfMjNfMF81MCwxLDBfMCwwLDAsMCwwLDAsMF8JAMwIAgIqNF8xM18yMl80XzM1XzIyXzQ2XzBfNTAsMSwxXzAsMiw1LDAsMCwwLDBfCQDMCAICKzRfMTNfMjJfNF8zNV8yMl82OV8wXzUwLDIsMV8wLDUsMTAsMCwwLDAsMF8JAMwIAgIqNV8yNV80MF81XzEwXzE1XzIwXzFfMzAsMSwxXzAsMCwwLDAsMCwwLDBfCQDMCAICKjVfMjVfNDBfNV8xMF8xNV80MF8xXzMwLDEsMl8yLDEsMywwLDAsMCwwXwkAzAgCAio1XzI1XzQwXzVfMTBfMTVfNjBfMV8zMCwxLDNfNSwyLDgsMCwwLDAsMF8FA25pbAAJcklkeENvZWZmAAYACnJJZHhFZmZlY3QACAAOUFJPRFVDVFBLR1NJWkUACgEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQdhc3NldElkCQCsAgICA25vXwUHYXNzZXRJZAEaa2V5TGFuZEFzc2V0SWRUb0N1c3RvbU5hbWUBB2Fzc2V0SWQJAKwCAgIFbGNuYV8FB2Fzc2V0SWQBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBB2Fzc2V0SWQJAKwCAgIDc3RfBQdhc3NldElkASBrZXlMYW5kQXJ0U3RhdHVzQnlUeXBlQW5kQXNzZXRJZAIEdHlwZQdhc3NldElkCQC5CQIJAMwIAgIDbGFzCQDMCAIFBHR5cGUJAMwIAgUHYXNzZXRJZAUDbmlsAgFfARJrZXlXYXJlaG91c2VCeUxhbmQBC2xhbmRBc3NldElkCQCsAgICA3doXwULbGFuZEFzc2V0SWQBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBB2Fzc2V0SWQJAKwCAgILaW5mcmFMZXZlbF8FB2Fzc2V0SWQBF2tleUZvcnRpZmljYXRpb25zQnlMYW5kAQtsYW5kQXNzZXRJZAkArAICAg9mb3J0aWZpY2F0aW9uc18FC2xhbmRBc3NldElkARprZXlEdWNrQXNzZXRJZFRvQ3VzdG9tTmFtZQEHYXNzZXRJZAkArAICAhhkdWNrQ3VzdG9tTmFtZUJ5QXNzZXRJZF8FB2Fzc2V0SWQBFmtleUFkZHJlc3NUb0N1c3RvbU5hbWUBBGFkZHIJAKwCAgIYYWNjb3VudEN1c3RvbU5hbWVCeUFkZHJfBQRhZGRyAQ9rZXlBZGRyZXNzUmVmQnkBBGFkZHIJAKwCAgIJYWNjUmVmQnlfBQRhZGRyARxrZXlPbmJvYXJkQXJ0RHVja0FjdGl2YXRlZEJ5AQRhZGRyCQCsAgICGm9uYm9hcmRBcnRBY3RpdmF0ZWREdWNrQnlfBQRhZGRyARNrZXlBZGRyZXNzUmVmZXJyYWxzAQRhZGRyCQCsAgICDWFjY1JlZmVycmFsc18FBGFkZHIBEGtleUR1Y2tJZFRvT3duZXIBB2Fzc2V0SWQJAKwCAgIKZHVja093bmVyXwUHYXNzZXRJZAEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgEPa2V5RHVja0xvY2F0aW9uAQtkdWNrQXNzZXRJZAkArAICAg1kdWNrTG9jYXRpb25fBQtkdWNrQXNzZXRJZAEOa2V5T3JkZXJCeUxhbmQBC2xhbmRBc3NldElkCQCsAgICCmxhbmRPcmRlcl8FC2xhbmRBc3NldElkAQ5rZXlFc1dhcmVob3VzZQACGmVtZXJnZW5jeVdhcmVob3VzZVByb2R1Y3RzAA1sYXN0VG91cklkS2V5Ag4lc19fbGFzdFRvdXJJZAEVa2V5VG91clN0YXRpY0RhdGFCeUlkAQN0SWQJAKwCAgIWJXMlZF9fdG91clN0YXRpY0RhdGFfXwkApAMBBQN0SWQBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBA3RJZAkArAICAhclcyVkX190b3VyRHluYW1pY0RhdGFfXwkApAMBBQN0SWQBE2tleVNjb3JlQm9hcmRCeVRvdXIBA3RJZAkArAICAhIlcyVkX19zY29yZUJvYXJkX18JAKQDAQUDdElkARxrZXlJc1JlZ2lzdGVyZWRCeVRvdXJBbmREdWNrAgN0SWQLZHVja0Fzc2V0SWQJALkJAgkAzAgCAiElcyVkJXNfX2lzUmVnaXN0ZXJlZEJ5VG91ckFuZER1Y2sJAMwIAgkApAMBBQN0SWQJAMwIAgULZHVja0Fzc2V0SWQFA25pbAICX18BGWtleUlzQXdhcmRlZEJ5VG91ckFuZER1Y2sCA3RJZAtkdWNrQXNzZXRJZAkAuQkCCQDMCAICHiVzJWQlc19faXNBd2FyZGVkQnlUb3VyQW5kRHVjawkAzAgCCQCkAwEFA3RJZAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsAgJfXwEba2V5TGFzdEF0dGVtcHRCeVRvdXJBbmREdWNrAgN0SWQLZHVja0Fzc2V0SWQJALkJAgkAzAgCAiAlcyVkJXNfX2xhc3RBdHRlbXB0QnlUb3VyQW5kRHVjawkAzAgCCQCkAwEFA3RJZAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsAgJfXwEaa2V5QmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sCA3RJZAtkdWNrQXNzZXRJZAkAuQkCCQDMCAICHyVzJWQlc19fYmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sJAMwIAgkApAMBBQN0SWQJAMwIAgULZHVja0Fzc2V0SWQFA25pbAICX18BFmtleUJlc3RUeEJ5VG91ckFuZER1Y2sCA3RJZAtkdWNrQXNzZXRJZAkAuQkCCQDMCAICGyVzJWQlc19fYmVzdFR4QnlUb3VyQW5kRHVjawkAzAgCCQCkAwEFA3RJZAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsAgJfXwAJaWR4U3RhdGljAAAACmlkeER5bmFtaWMAAQATdFN0YXRpY1JlZ2lzdGVyQ29zdAACABJ0U3RhdGljQXR0ZW1wdENvc3QAAwAMdFN0YXRpY1N0YXJ0AAUACnRTdGF0aWNFbmQABgAQdFN0YXRpY051bUdyYW5kcwAHABB0U3RhdGljUHJpemVGdW5kAAgADnREeW5hbWljU3RhdHVzAAEAD3REeW5hbWljTGVhZGVycwACABF0RHluYW1pY1dpblJlc3VsdAADABV0RHluYW1pY1RvdGFsUmVnQ291bnQABAAVdER5bmFtaWNUb3RhbEF0dGVtcHRzAAUBC2dldFRvdXJEYXRhAgx0b3VyQ29udHJhY3QDdElkBAZzdGF0aWMJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDHRvdXJDb250cmFjdAkBFWtleVRvdXJTdGF0aWNEYXRhQnlJZAEFA3RJZAkArAICCQCsAgICGUVycm9yIHJlYWRpbmcgdG91cm5hbWVudCAJAKQDAQUDdElkAgUgZGF0YQICX18EB2R5bmFtaWMJALwJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDHRvdXJDb250cmFjdAkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQN0SWQJAKwCAgkArAICAhlFcnJvciByZWFkaW5nIHRvdXJuYW1lbnQgCQCkAwEFA3RJZAIFIGRhdGECAl9fCQDMCAIFBnN0YXRpYwkAzAgCBQdkeW5hbWljBQNuaWwBEmdldFJlY2lwZU1hdGVyaWFscwEGcmVjaXBlCQBoAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnJlY2lwZQUJcklkeENvZWZmBQlDT0VGRjJNQVQABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgARSW5mcmFVcGdyYWRlQ29zdFMEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAAgMivoCUDCQAAAgEBVAUHJG1hdGNoMACAwtcvCQACAQINVW5rbm93biBjaGFpbgADU0VQAgJfXwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAAVTU0laRQAZAAVNU0laRQBkAAVMU0laRQDhAQAGWExTSVpFAJADAAdYWExTSVpFAPEEAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQARSWR4Q2ZnRWNvbm9teURhcHAAAgANSWR4Q2ZnV2xnRGFwcAAEABRJZHhDZmdQdXp6bGVQb29sRGFwcAAFABRJZHhDZmdJbnZlc3RGdW5kRGFwcAAGABRJZHhDZmdUb3VybmFtZW50RGFwcAAHAA9JZHhDZmdBY3Jlc0RhcHAACAEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAAPZWNvbm9teUNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnRWNvbm9teURhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUNSWR4Q2ZnV2xnRGFwcAAScHV6emxlUG9vbENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUUSWR4Q2ZnUHV6emxlUG9vbERhcHAAEmludmVzdEZ1bmRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ0ludmVzdEZ1bmREYXBwABJ0b3VybmFtZW50Q29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdUb3VybmFtZW50RGFwcAANYWNyZXNDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFD0lkeENmZ0FjcmVzRGFwcAAKcmVjTGFuZE51bQAAAAtyZWNMYW5kU2l6ZQABAAtyZWNUZXJyYWlucwACAAxyZWNDb250aW5lbnQAAwANd2xnQXNzZXRJZEtleQILd2xnX2Fzc2V0SWQACndsZ0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQt3bGdDb250cmFjdAUNd2xnQXNzZXRJZEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0ABRhY3Jlc0lzc3VlZEFtb3VudEtleQIRYWNyZXNJc3N1ZWRBbW91bnQAD2FjcmVzQXNzZXRJZEtleQIMYWNyZXNBc3NldElkAAxhY3Jlc0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQ1hY3Jlc0NvbnRyYWN0BQ9hY3Jlc0Fzc2V0SWRLZXkCF0FDUkVTIGlzIG5vdCBpc3N1ZWQgeWV0AAxpZHhXbGdBbW91bnQAAAALaWR4V2xnUHJpY2UAAQALaWR4V2xnRnVuZHMAAgANaWR4V2xnRWNvbm9teQADAA5pZHhXbGdBY3Rpdml0eQAEAA9pZHhXbGdBcmJpdHJhZ2UABQAKaWR4V2xnUG9vbAAGAA9pZHhXbGdJc3N1ZVRpbWUABwARaWR4V2xnTGFzdE1UQVRpbWUACAAUaWR4V2xnTWFya2V0aW5nVG90YWwACQAVaWR4V2xnTWFya2V0aW5nQW1MZWZ0AAoAGWlkeFdsZ01hcmtldGluZ0FtQXZhaWxOb3cACwAVaWR4V2xnTWFya2V0aW5nV2xnb2xkAAwAD2lkeFdsZ1RlYW1Ub3RhbAANABBpZHhXbGdUZWFtQW1MZWZ0AA4AFGlkeFdsZ1RlYW1BbUF2YWlsTm93AA8AEGlkeFdsZ1RlYW1XbGdvbGQAEAAOaWR4V2xnQWN0VG90YWwAEQAPaWR4V2xnQWN0QW1MZWZ0ABIAE2lkeFdsZ0FjdEFtQXZhaWxOb3cAEwAPaWR4V2xnQWN0V2xnb2xkABQAD2lkeFdsZ0N1clBlcmlvZAAVABFpZHhXbGdBbUxlZnRUb3RhbAAWABtpZHhXbGdDdXJQZXJpb2REaXN0cmlidXRpb24AFwASaWR4V2xnTGFzdFVzZXJUaW1lABgAFGlkeFdsZ1VzZXJBbUF2YWlsTm93ABkAFmlkeFdsZ1NMYW5kRGFpbHlBbW91bnQAGgAWaWR4V2xnSW52ZXN0RnVuZEFtb3VudAAbABRpZHhXbGdVc2VyVG90YWxBdmFpbAAcABFpZHhXbGdFZmZVc2VyVGltZQAdAApJZHhFZmZVc2VyAAEBEWtleVJlc1Byb3BvcnRpb25zAAITcmVzVHlwZXNQcm9wb3J0aW9ucwEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQlvd25lckFkZHIJAKwCAgITc3Rha2VkTGFuZHNCeU93bmVyXwUJb3duZXJBZGRyARZrZXlTdGFrZWRQaWVjZXNCeU93bmVyAQlvd25lckFkZHIJAKwCAgIUc3Rha2VkUGllY2VzQnlPd25lcl8FCW93bmVyQWRkcgEIYXNTdHJpbmcBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBCWFzQW55TGlzdAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAglMaXN0W0FueV0EAWwFByRtYXRjaDAFAWwJAAIBAhtmYWlsIHRvIGNhc3QgaW50byBMaXN0W0FueV0BD251bVBpZWNlc0J5U2l6ZQEIbGFuZFNpemUEByRtYXRjaDAFCGxhbmRTaXplAwkAAAICAVMFByRtYXRjaDAFBVNTSVpFAwkAAAICAU0FByRtYXRjaDAFBU1TSVpFAwkAAAICAUwFByRtYXRjaDAFBUxTSVpFAwkAAAICAlhMBQckbWF0Y2gwBQZYTFNJWkUDCQAAAgIDWFhMBQckbWF0Y2gwBQdYWExTSVpFCQACAQIRVW5rbm93biBsYW5kIHNpemUBCmtleUJsb2NrZWQAAhBjb250cmFjdHNCbG9ja2VkARFrZXlMYXN0VHhJZEJ5VXNlcgEEYWRkcgkArAICAg9sYXN0VHhJZEJ5VXNlcl8FBGFkZHIBDmdldFZvdGluZ1Bvd2VyARJ1c2VyQWRkclN0ck9yRW1wdHkEBXByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQERa2V5UmVzUHJvcG9ydGlvbnMAAgswXzBfMF8wXzBfMAIBXwoBBWFkZGVyAgNhY2MEaXRlbQkAZAIFA2FjYwkBDXBhcnNlSW50VmFsdWUBBQRpdGVtBAp0b3RhbFBvd2VyCgACJGwFBXByb3BzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgQKdXNlcnNQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRQaWVjZXNCeU93bmVyAQUSdXNlckFkZHJTdHJPckVtcHR5AAAJAMwIAgUKdG90YWxQb3dlcgkAzAgCBQp1c2Vyc1Bvd2VyBQNuaWwADVVTRFRQUklaRVBBUlQAoMIeAAphZG1pbnNMaXN0CQDMCAIJAKUIAQUEdGhpcwkAzAgCBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUDY0cUVWenVHekJKdVlmRFhZaXNGdG9rSkNoU1JhOHVqYQMJAAACAQFUBQckbWF0Y2gwAiMzTjNnU0ZyVHdnaUxBRlpITXVKckV0dGh0MW5QaG5rcHZqcwkAAgECDVVua25vd24gY2hhaW4FA25pbAESYXNMaXN0SW50Q29tcGFjdGVkAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAglMaXN0W0FueV0ECnZhbEFueUxpc3QFByRtYXRjaDADCQECIT0CCQCQAwEFCnZhbEFueUxpc3QFBk5VTVJFUwkAAgEJAKwCAgIOQXJyYXkgc2l6ZSBpcyAJAKQDAQkAkAMBBQp2YWxBbnlMaXN0CgEEY29udgIDYWNjBGl0ZW0EByRtYXRjaDEFBGl0ZW0DCQABAgUHJG1hdGNoMQIDSW50BAJpdAUHJG1hdGNoMQkAzQgCBQNhY2MJAKQDAQUCaXQJAAIBAhRMaXN0IHR5cGUgaXMgbm90IEludAQBcgoAAiRsBQp2YWxBbnlMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRjb252AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGCQC5CQIFAXICAV8JAAIBAhZmYWlsIHRvIGNhc3QgaW50byBMaXN0AQ1hc1NwbGl0UmVzdWx0AQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAhYoTGlzdFtBbnldLCBMaXN0W0FueV0pBAJ0MgUHJG1hdGNoMAkAlAoCCQESYXNMaXN0SW50Q29tcGFjdGVkAQgFAnQyAl8xCQESYXNMaXN0SW50Q29tcGFjdGVkAQgFAnQyAl8yCQACAQIeZmFpbCB0byBjYXN0IGludG8gKExpc3QsIExpc3QpARNhc0NhbmNlbE9yZGVyUmVzdWx0AQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAhEoQm9vbGVhbiwgU3RyaW5nKQQCdDIFByRtYXRjaDAFAnQyCQACAQIjZmFpbCB0byBjYXN0IGludG8gKEJvb2xlYW4sIFN0cmluZykBDndhbGxldEludGVybmFsAQ51c2VyQWRkcmVzc09wdAQEYWRkcgkApggBBQ51c2VyQWRkcmVzc09wdAQHYmFsYW5jZQMJAQlpc0RlZmluZWQBBQRhZGRyCQDvBwEJAQV2YWx1ZQEFBGFkZHIJAQ5CYWxhbmNlRGV0YWlscwQAAAAAAAAAAAQLdXNkdEJhbGFuY2UDCQEJaXNEZWZpbmVkAQUEYWRkcgkA8AcCCQEFdmFsdWUBBQRhZGRyBQt1c2R0QXNzZXRJZAAABA13bGdvbGRCYWxhbmNlAwkBCWlzRGVmaW5lZAEFBGFkZHIJAPAHAgkBBXZhbHVlAQUEYWRkcgUKd2xnQXNzZXRJZAAABApjdXN0b21OYW1lCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleUFkZHJlc3NUb0N1c3RvbU5hbWUBBQ51c2VyQWRkcmVzc09wdAUOdXNlckFkZHJlc3NPcHQECHJlZkJ5S2V5CQEPa2V5QWRkcmVzc1JlZkJ5AQUOdXNlckFkZHJlc3NPcHQEBXJlZkJ5CQCdCAIFD3N0YWtpbmdDb250cmFjdAUIcmVmQnlLZXkEBHJlZnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQETa2V5QWRkcmVzc1JlZmVycmFscwEFDnVzZXJBZGRyZXNzT3B0AgAECGxhc3RUeElkCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBEWtleUxhc3RUeElkQnlVc2VyAQUOdXNlckFkZHJlc3NPcHQCAAQGcGllY2VzCQCRAwIJAQ5nZXRWb3RpbmdQb3dlcgEFDnVzZXJBZGRyZXNzT3B0BQpJZHhFZmZVc2VyBAJ4cAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQlrZXlVc2VyWFABBQ51c2VyQWRkcmVzc09wdAAABANsdmwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEMa2V5VXNlckxldmVsAQUOdXNlckFkZHJlc3NPcHQAAAQKZnJlZVBvaW50cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARFrZXlVc2VyRnJlZVBvaW50cwEFDnVzZXJBZGRyZXNzT3B0AAAEC3ZpcnRXbGdEYXRhCgABQAkA/AcEBQt3bGdDb250cmFjdAISY2hlY2tXbGdYcFJFQURPTkxZCQDMCAIFDnVzZXJBZGRyZXNzT3B0BQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0EB29uYm9hcmQDCQEJaXNEZWZpbmVkAQUFcmVmQnkJAKwCAgUKQVJUT05CT0FSRAMDCQEJaXNEZWZpbmVkAQUEYWRkcgkBCWlzRGVmaW5lZAEJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEca2V5T25ib2FyZEFydER1Y2tBY3RpdmF0ZWRCeQEFDnVzZXJBZGRyZXNzT3B0BwICOjECAjowAgAEDGFjcmVzQmFsYW5jZQMJAQlpc0RlZmluZWQBBQRhZGRyCQDwBwIJAQV2YWx1ZQEFBGFkZHIFDGFjcmVzQXNzZXRJZAAABAtzdGFrZWRBY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1hY3Jlc0NvbnRyYWN0CQEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBQ51c2VyQWRkcmVzc09wdAAACQDMCAIJAKwCAgISJXMlc19fY3VzdG9tTmFtZV9fBQpjdXN0b21OYW1lCQDMCAIJAKwCAgISJXMlc19fcmVmZXJyZWRCeV9fCQELdmFsdWVPckVsc2UCBQVyZWZCeQIACQDMCAIJAKwCAgIRJXMlc19fcmVmZXJyYWxzX18FBHJlZnMJAMwIAgkArAICAhAlcyVzX19sYXN0VHhJZF9fBQhsYXN0VHhJZAkAzAgCCQCsAgICFCVzJWRfX3dhdmVzQmFsYW5jZV9fCQCkAwEIBQdiYWxhbmNlCWF2YWlsYWJsZQkAzAgCCQCsAgICFSVzJWRfX3dsZ29sZEJhbGFuY2VfXwkApAMBBQ13bGdvbGRCYWxhbmNlCQDMCAIJAKwCAgITJXMlZF9fdXNkdEJhbGFuY2VfXwkApAMBBQt1c2R0QmFsYW5jZQkAzAgCCQCsAgICFCVzJWRfX3N0YWtlZFBpZWNlc19fCQCkAwEFBnBpZWNlcwkAzAgCCQCsAgICFCVzJWRfX2FjcmVzQmFsYW5jZV9fCQCkAwEFDGFjcmVzQmFsYW5jZQkAzAgCCQCsAgICEyVzJWRfX3N0YWtlZEFjcmVzX18JAKQDAQULc3Rha2VkQWNyZXMJAMwIAgkArAICAhElcyVkX19jdXJyZW50WHBfXwkApAMBBQJ4cAkAzAgCCQCsAgICEiVzJWRfX2N1cnJlbnRMdmxfXwkApAMBBQNsdmwJAMwIAgkArAICAholcyVkX19wb2ludHNUb0Rpc3RyaWJ1dGVfXwkApAMBBQpmcmVlUG9pbnRzCQDMCAIJAKwCAgIXJXMlc19fd2FsbGV0QXJ0ZWZhY3RzX18FB29uYm9hcmQJAMwIAgkArAICAhElcyVkX192aXJ0TGV2ZWxfXwkApAMBCgABQAkAkQMCBQt2aXJ0V2xnRGF0YQAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAzAgCCQCsAgICEiVzJWRfX3ZpcnRQb2ludHNfXwkApAMBCgABQAkAkQMCBQt2aXJ0V2xnRGF0YQABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAzAgCCQCsAgICDiVzJWRfX3ZpcnRYUF9fCQCkAwEKAAFACQCRAwIFC3ZpcnRXbGdEYXRhAAIDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BQNuaWwBDGFwcGx5Qm9udXNlcwILbGFuZEFzc2V0SWQGcGllY2VzBAppbmZyYUxldmVsCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAAABAlhcnRQaWVjZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEga2V5TGFuZEFydFN0YXR1c0J5VHlwZUFuZEFzc2V0SWQCBQpBUlRQUkVTQUxFBQtsYW5kQXNzZXRJZAAABARhZGQ2CQBpAgUKaW5mcmFMZXZlbAAGBARhZGQ3CQBpAgUKaW5mcmFMZXZlbAAHCQCVCgMFCmluZnJhTGV2ZWwFCWFydFBpZWNlcwkAZAIJAGQCBQ9EQUlMWVJFU0JZUElFQ0UJAGsDBQ9EQUlMWVJFU0JZUElFQ0UJAGQCCQBkAgUKaW5mcmFMZXZlbAUEYWRkNgkAaAIAAgUEYWRkNwAFCQBrAwUPREFJTFlSRVNCWVBJRUNFBQlhcnRQaWVjZXMJAGgCBQZwaWVjZXMABQEXZ2V0V2FyZWhvdXNlVG90YWxWb2x1bWUBCXZvbFByZWZpeAQFcGFydHMJALUJAgUJdm9sUHJlZml4AgFfCQBoAgkAaAIFDFdITVVMVElQTElFUgkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwYXJ0cwABAAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwYXJ0cwAAAQxnZXRXYXJlaG91c2UDBXdoS2V5CWxhbmRJbmRleAppbmZyYUxldmVsBAl2b2xQcmVmaXgJAKwCAgkArAICCQCkAwEFCWxhbmRJbmRleAIBXwkApAMBBQppbmZyYUxldmVsBAR0b3RTCQCkAwEJARdnZXRXYXJlaG91c2VUb3RhbFZvbHVtZQEFCXZvbFByZWZpeAQFd2hTdHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQV3aEtleQkArAICCQCsAgIJAKwCAgkArAICBQl2b2xQcmVmaXgCHjowXzBfMF8wXzBfMDowXzBfMF8wXzBfMDo6MF8wXwUEdG90UwIBXwUEdG90UwkAtQkCBQV3aFN0cgIBOgENZHVja0luZm9UdXBsZQELZHVja0Fzc2V0SWQEBW1heEhQCQEJbWF4SGVhbHRoAQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlEdWNrTGV2ZWwBBQtkdWNrQXNzZXRJZAAACQCXCgUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2R1Y2tBc3NldElkAP///////////wEICQEFdmFsdWUBCQDsBwEJANkEAQULZHVja0Fzc2V0SWQEbmFtZQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAIACQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAUFbWF4SFAJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhNnZXRCYWNrcGFja1JFQURPTkxZCQDMCAIFC2R1Y2tBc3NldElkBQNuaWwFA25pbAENZHVja0luZm9BcnJheQMLZHVja0Fzc2V0SWQFb3duZXIHZHVja0luZgQKY3VzdG9tTmFtZQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARprZXlEdWNrQXNzZXRJZFRvQ3VzdG9tTmFtZQEFC2R1Y2tBc3NldElkCAUHZHVja0luZgJfMgQFY2hhcnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEMa2V5RHVja0NoYXJzAQULZHVja0Fzc2V0SWQCCTBfMF8wXzBfMAQCeHAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEJa2V5RHVja1hQAQULZHVja0Fzc2V0SWQAAAQDbHZsCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBDGtleUR1Y2tMZXZlbAEFC2R1Y2tBc3NldElkAAAECmZyZWVQb2ludHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQERa2V5RHVja0ZyZWVQb2ludHMBBQtkdWNrQXNzZXRJZAAABAZlcXVpcG0JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEQa2V5RHVja0VxdWlwbWVudAEFC2R1Y2tBc3NldElkAgs7XztfO187XztfOwQFYnVmZnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEMa2V5RHVja0J1ZmZzAQULZHVja0Fzc2V0SWQCCTBfMF8wXzBfMAQLJHQwNjQxMjY1MTcJAQ5nZXRSb2JiZXJ5RGF0YQIFD3N0YWtpbmdDb250cmFjdAULZHVja0Fzc2V0SWQEB3JvYkNvc3QIBQskdDA2NDEyNjUxNwJfMQQLbGFzdFJvYlRpbWUIBQskdDA2NDEyNjUxNwJfMgQJZHVja1N0YXRlCAULJHQwNjQxMjY1MTcCXzMECmxvY2tlZExhbmQIBQskdDA2NDEyNjUxNwJfNAQHbGFuZEVUQQgFCyR0MDY0MTI2NTE3Al81CQDMCAIJAKwCAgIPJXMlc19fYXNzZXRJZF9fBQtkdWNrQXNzZXRJZAkAzAgCCQCsAgICDSVzJXNfX293bmVyX18FBW93bmVyCQDMCAIJAKwCAgISJXMlc19fY3VzdG9tTmFtZV9fBQpjdXN0b21OYW1lCQDMCAIJAKwCAgISJXMlZF9fc3Rha2VkVGltZV9fCQCkAwEIBQdkdWNrSW5mAl8xCQDMCAIJAKwCAgIMJXMlc19fbmFtZV9fCAUHZHVja0luZgJfMgkAzAgCCQCsAgICECVzJXNfX2xvY2F0aW9uX18IBQdkdWNrSW5mAl8zCQDMCAIJAKwCAgIOJXMlZF9faGVhbHRoX18JAKQDAQgFB2R1Y2tJbmYCXzQJAMwIAgkArAICAhElcyVkX19tYXhIZWFsdGhfXwkApAMBCQEJbWF4SGVhbHRoAQUDbHZsCQDMCAIJAKwCAgIXJXMlc19fY2hhcmFjdGVyaXN0aWNzX18FBWNoYXJzCQDMCAIJAKwCAgIRJXMlZF9fY3VycmVudFhwX18JAKQDAQUCeHAJAMwIAgkArAICAhIlcyVkX19jdXJyZW50THZsX18JAKQDAQUDbHZsCQDMCAIJAKwCAgIaJXMlZF9fcG9pbnRzVG9EaXN0cmlidXRlX18JAKQDAQUKZnJlZVBvaW50cwkAzAgCCQCsAgICECVzJXNfX2JhY2tQYWNrX18IBQdkdWNrSW5mAl81CQDMCAIJAKwCAgIRJXMlc19fZXF1aXBtZW50X18FBmVxdWlwbQkAzAgCCQCsAgICDSVzJXNfX2J1ZmZzX18FBWJ1ZmZzCQDMCAIJAKwCAgITJXMlZF9fcm9iYmVyeUNvc3RfXwkApAMBBQdyb2JDb3N0CQDMCAIJAKwCAgITJXMlZF9fcm9iYmVyeVRpbWVfXwkApAMBBQtsYXN0Um9iVGltZQkAzAgCCQCsAgICFCVzJXNfX3JvYmJlcnlTdGF0ZV9fCQCRAwIFDWR1Y2tSb2JTdGF0ZXMFCWR1Y2tTdGF0ZQkAzAgCCQCsAgICFyVzJXNfX3JvYmJlcnlMYXN0TGFuZF9fBQpsb2NrZWRMYW5kCQDMCAIJAKwCAgIiJXMlZF9fcm9iYmVyeUxhc3RMYW5kUmVsZWFzZVRpbWVfXwkApAMBBQdsYW5kRVRBBQNuaWwBDWxhbmRJbmZvQXJyYXkDC2xhbmRBc3NldElkBW93bmVyCnN0YWtlZFRpbWUDCQAAAgULbGFuZEFzc2V0SWQCAAkAAgECF2xhbmRBc3NldElkIGlzIHJlcXVpcmVkBAFhCQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQEAWQJALUJAggFAWELZGVzY3JpcHRpb24CAV8EB2xhbmROdW0DCQBmAggFAWEIcXVhbnRpdHkAAAkAkQMCBQFkBQpyZWNMYW5kTnVtCQCsAgICAS0JAJEDAgUBZAUKcmVjTGFuZE51bQQGcGllY2VzCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCBQFkBQtyZWNMYW5kU2l6ZQQMcHJvZHVjdGl2aXR5CQEMYXBwbHlCb251c2VzAgULbGFuZEFzc2V0SWQFBnBpZWNlcwQJZGVsdGFUaW1lCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFCnN0YWtlZFRpbWUECGF2YWlsUmVzAwkAZgIFCnN0YWtlZFRpbWUAAAkAawMFCWRlbHRhVGltZQkAaAIIBQxwcm9kdWN0aXZpdHkCXzMFBnBpZWNlcwUJREFZTUlMTElTAAAEB25lZWRNYXQJAGsDBRFJbmZyYVVwZ3JhZGVDb3N0UwkAaAIFBnBpZWNlcwkAZAIIBQxwcm9kdWN0aXZpdHkCXzEAAQUFU1NJWkUEDmdsb2JhbEFuZExvY2FsAwkAZgIFCnN0YWtlZFRpbWUAAAkBDWFzU3BsaXRSZXN1bHQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIkc3BsaXRCeUdsb2JhbEFuZExvY2FsV2VpZ2h0c1JFQURPTkxZCQDMCAIFB25lZWRNYXQJAMwIAgUIYXZhaWxSZXMJAMwIAgkAkQMCBQFkBQtyZWNUZXJyYWlucwUDbmlsBQNuaWwJAJQKAgkBEmFzTGlzdEludENvbXBhY3RlZAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhxzcGxpdEJ5R2xvYmFsV2VpZ2h0c1JFQURPTkxZCQDMCAIFB25lZWRNYXQFA25pbAUDbmlsAgAECmN1c3RvbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEaa2V5TGFuZEFzc2V0SWRUb0N1c3RvbU5hbWUBBQtsYW5kQXNzZXRJZAkArAICCQCsAgIJAJEDAgUBZAUMcmVjQ29udGluZW50AgEtCQCRAwIFAWQFCnJlY0xhbmROdW0EBGZvcnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEXa2V5Rm9ydGlmaWNhdGlvbnNCeUxhbmQBBQtsYW5kQXNzZXRJZAIMOjBfMTU6MF8xODowBAVzdGF0ZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARNrZXlMYW5kUm9iYmVyeVN0YXRlAQULbGFuZEFzc2V0SWQAAAQLY29vbGRvd25FVEEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQESa2V5TGFuZENvb2xkb3duRVRBAQULbGFuZEFzc2V0SWQAAAkAzAgCCQCsAgICDyVzJXNfX2Fzc2V0SWRfXwULbGFuZEFzc2V0SWQJAMwIAgkArAICAg0lcyVzX19vd25lcl9fBQVvd25lcgkAzAgCCQCsAgICEiVzJXNfX2N1c3RvbU5hbWVfXwUKY3VzdG9tTmFtZQkAzAgCCQCsAgICEiVzJWRfX3N0YWtlZFRpbWVfXwkApAMBBQpzdGFrZWRUaW1lCQDMCAIJAKwCAgITJXMlc19fZGVzY3JpcHRpb25fXwkAuQkCCQDMCAIFB2xhbmROdW0JAMwIAgkAkQMCBQFkBQtyZWNMYW5kU2l6ZQkAzAgCCQCRAwIFAWQFC3JlY1RlcnJhaW5zCQDMCAIJAJEDAgUBZAUMcmVjQ29udGluZW50BQNuaWwCAV8JAMwIAgkArAICAhIlcyVkX19pbmZyYUxldmVsX18JAKQDAQgFDHByb2R1Y3Rpdml0eQJfMQkAzAgCCQCsAgICFiVzJXNfX2F2YWlsUmVzQnlUeXBlX18IBQ5nbG9iYWxBbmRMb2NhbAJfMgkAzAgCCQCsAgICFSVzJWRfX2F2YWlsUmVzVG90YWxfXwkApAMBBQhhdmFpbFJlcwkAzAgCCQCsAgICFCVzJXNfX25lZWRNYXRlcmlhbF9fCAUOZ2xvYmFsQW5kTG9jYWwCXzEJAMwIAgkArAICAh0lcyVzX19sYW5kQXJ0ZWZhY3RzX19QUkVTQUxFOgkApAMBCAUMcHJvZHVjdGl2aXR5Al8yCQDMCAIJAKwCAgIRJXMlc19fd2FyZWhvdXNlX18JALkJAgkBDGdldFdhcmVob3VzZQMJARJrZXlXYXJlaG91c2VCeUxhbmQBBQtsYW5kQXNzZXRJZAkAaQIFBnBpZWNlcwUFU1NJWkUIBQxwcm9kdWN0aXZpdHkCXzECAToJAMwIAgkArAICAhElcyVzX19sYW5kT3JkZXJfXwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9lY29ub215Q29udHJhY3QJAQ5rZXlPcmRlckJ5TGFuZAEFC2xhbmRBc3NldElkAjAwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDowQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDoJAMwIAgkArAICAhYlcyVzX19mb3J0aWZpY2F0aW9uc19fBQRmb3J0CQDMCAIJAKwCAgIUJXMlc19fcm9iYmVyeVN0YXRlX18JAJEDAgUNbGFuZFJvYlN0YXRlcwUFc3RhdGUJAMwIAgkArAICAhglcyVkX19jYW5CZVJvYmJlZEFmdGVyX18JAKQDAQULY29vbGRvd25FVEEFA25pbAESbGFuZE9yZGVySW5mb0FycmF5AgtsYW5kQXNzZXRJZAVvd25lcgMJAAACBQtsYW5kQXNzZXRJZAIACQACAQIXbGFuZEFzc2V0SWQgaXMgcmVxdWlyZWQEAWEJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAQBZAkAtQkCCAUBYQtkZXNjcmlwdGlvbgIBXwQGcGllY2VzCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCBQFkBQtyZWNMYW5kU2l6ZQQMcHJvZHVjdGl2aXR5CQEMYXBwbHlCb251c2VzAgULbGFuZEFzc2V0SWQFBnBpZWNlcwkAzAgCCQCsAgICDyVzJXNfX2Fzc2V0SWRfXwULbGFuZEFzc2V0SWQJAMwIAgkArAICAg0lcyVzX19vd25lcl9fBQVvd25lcgkAzAgCCQCsAgICESVzJXNfX3dhcmVob3VzZV9fCQC5CQIJAQxnZXRXYXJlaG91c2UDCQESa2V5V2FyZWhvdXNlQnlMYW5kAQULbGFuZEFzc2V0SWQJAGkCBQZwaWVjZXMFBVNTSVpFCAUMcHJvZHVjdGl2aXR5Al8xAgE6CQDMCAIJAKwCAgIRJXMlc19fbGFuZE9yZGVyX18JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPZWNvbm9teUNvbnRyYWN0CQEOa2V5T3JkZXJCeUxhbmQBBQtsYW5kQXNzZXRJZAIwMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6MEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6BQNuaWwBCnNsb3RFZmZlY3QBBHNsb3QDCQAAAgUEc2xvdAIAAAAEBXNsb3QwCQCRAwIJALUJAgUEc2xvdAIBLAAAAwkAAAIFBXNsb3QwAgAAAAQEcHJvZAkAtQkCBQVzbG90MAIBOgMDCQAAAgkAkQMCBQRwcm9kAAECAAYJAAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcHJvZAABAAAAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcHJvZAAAAgFfBQpySWR4RWZmZWN0FwFpAQ1jb25zdHJ1Y3RvclYxAQljb250cmFjdHMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhJwZXJtaXNzaW9ucyBkZW5pZWQKAQpkZXNjcmlwdG9yAgNhY2MLaWdub3JlZEl0ZW0JAKwCAgUDYWNjAgIlcwQFZGVzY3IKAAIkbAUJY29udHJhY3RzCgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpkZXNjcmlwdG9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlSZXN0Q2ZnAAkAuQkCCQDMCAIFBWRlc2NyBQljb250cmFjdHMFA1NFUAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5UmVzdEFkZHJlc3MACQClCAEFBHRoaXMFA25pbAFpARJ3YWxsZXRJbmZvUkVBRE9OTFkBDnVzZXJBZGRyZXNzT3B0CQCUCgIFA25pbAkBDndhbGxldEludGVybmFsAQUOdXNlckFkZHJlc3NPcHQBaQEXZHVja0J5T3duZXJJbmZvUkVBRE9OTFkBC3VzZXJBZGRyZXNzBApzdGFrZWREdWNrCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQULdXNlckFkZHJlc3MJAJQKAgUDbmlsAwMJAQlpc0RlZmluZWQBCQCmCAEFC3VzZXJBZGRyZXNzCQEJaXNEZWZpbmVkAQUKc3Rha2VkRHVjawcEC2R1Y2tBc3NldElkCQEFdmFsdWUBBQpzdGFrZWREdWNrCQENZHVja0luZm9BcnJheQMFC2R1Y2tBc3NldElkBQt1c2VyQWRkcmVzcwkBDWR1Y2tJbmZvVHVwbGUBBQtkdWNrQXNzZXRJZAkBDWR1Y2tJbmZvQXJyYXkDAgAFC3VzZXJBZGRyZXNzCQCXCgUA////////////AQIAAgAA////////////AQIAAWkBGWR1Y2tCeUFzc2V0SWRJbmZvUkVBRE9OTFkBC2R1Y2tBc3NldElkBAVvd25lcgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARBrZXlEdWNrSWRUb093bmVyAQULZHVja0Fzc2V0SWQJAJQKAgUDbmlsCQENZHVja0luZm9BcnJheQMFC2R1Y2tBc3NldElkAwkBCWlzRGVmaW5lZAEFBW93bmVyCQEFdmFsdWUBBQVvd25lcgIACQENZHVja0luZm9UdXBsZQEFC2R1Y2tBc3NldElkAWkBFmR1Y2tzQnlJZHNJbmZvUkVBRE9OTFkBDGR1Y2tBc3NldElkcwoBB29uZUR1Y2sCA2FjYwtkdWNrQXNzZXRJZAMJAAACBQtkdWNrQXNzZXRJZAIACQACAQIXZHVja0Fzc2V0SWQgaXMgcmVxdWlyZWQECnN0YWtlZFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2R1Y2tBc3NldElkAP///////////wEEBW93bmVyAwkAZgIFCnN0YWtlZFRpbWUAAAkBBXZhbHVlAQkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARBrZXlEdWNrSWRUb093bmVyAQULZHVja0Fzc2V0SWQCAAkAzQgCBQNhY2MJAQ1kdWNrSW5mb0FycmF5AwULZHVja0Fzc2V0SWQFBW93bmVyCQENZHVja0luZm9UdXBsZQEFC2R1Y2tBc3NldElkBAFyCgACJGwFDGR1Y2tBc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHb25lRHVjawIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIVTGlzdCBzaXplIGV4Y2VlZHMgMTAwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAYgBjAGQJAJQKAgUDbmlsBQFyAWkBGWxhbmRCeUFzc2V0SWRJbmZvUkVBRE9OTFkBC2xhbmRBc3NldElkAwkAAAIFC2xhbmRBc3NldElkAgAJAAIBAhdsYW5kQXNzZXRJZCBpcyByZXF1aXJlZAQKc3Rha2VkVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQA////////////AQQFb3duZXIDCQBmAgUKc3Rha2VkVGltZQAACQEFdmFsdWUBCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkAgAJAJQKAgUDbmlsCQENbGFuZEluZm9BcnJheQMFC2xhbmRBc3NldElkBQVvd25lcgUKc3Rha2VkVGltZQFpAR5zdGFrZWRMYW5kc0J5T3duZXJJbmZvUkVBRE9OTFkBEGxhbmRPd25lckFkZHJlc3MDCQAAAgUQbGFuZE93bmVyQWRkcmVzcwIACQACAQIcbGFuZE93bmVyQWRkcmVzcyBpcyByZXF1aXJlZAQIbGFuZHNTdHIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUQbGFuZE93bmVyQWRkcmVzcwQFbGFuZHMDCQEJaXNEZWZpbmVkAQUIbGFuZHNTdHIJAL0JAgkBBXZhbHVlAQUIbGFuZHNTdHICAV8FA25pbAoB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8AcCBQR0aGlzBQt1c2R0QXNzZXRJZAUNVVNEVFBSSVpFUEFSVAUFTVVMVDYJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQt1c2VyQWRkcmVzcwUDYW10BQt1c2R0QXNzZXRJZAUDbmlsBQNhbXQBaQEfZ2V0RW1lcmdlbmN5U2VydmljZURhdGFSRUFET05MWQAECGV4aXN0U3RyCQCdCAIFD2Vjb25vbXlDb250cmFjdAkBDmtleUVzV2FyZWhvdXNlAAQMZXhpc3RBbW91bnRzAwkBCWlzRGVmaW5lZAEFCGV4aXN0U3RyCQC8CQIJAQV2YWx1ZQEFCGV4aXN0U3RyAgFfBQNuaWwKAQpzaW5nbGVQcm9kAgNhY2MJcmVjaXBlU3RyBAFuCAUDYWNjAl8yBAZyZWNpcGUJALUJAgUJcmVjaXBlU3RyAgFfBAltYXhBbW91bnQDCQAAAgUBbgAACQBoAgUNRVNNQVhQQUNLQUdFUwUOUFJPRFVDVFBLR1NJWkUAAAQLZXhpc3RBbW91bnQDCQBmAgkAkAMBBQxleGlzdEFtb3VudHMFAW4JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQxleGlzdEFtb3VudHMFAW4AAAQIdG90YWxNYXQJARJnZXRSZWNpcGVNYXRlcmlhbHMBBQZyZWNpcGUECGJ1eVByaWNlCQBrAwkAaAIFCHRvdGFsTWF0BQlFU0JVWUNPRUYFEFJFU09VUkNFUFJJQ0VNSU4JAGgCBQVNVUxUOAUOUFJPRFVDVFBLR1NJWkUECXNlbGxQcmljZQkAawMJAGgCBQh0b3RhbE1hdAUKRVNTRUxMQ09FRgUQUkVTT1VSQ0VQUklDRU1JTgkAaAIFBU1VTFQ4BQ5QUk9EVUNUUEtHU0laRQQBeQkAuQkCCQDMCAIJAKQDAQUJbWF4QW1vdW50CQDMCAIJAKQDAQULZXhpc3RBbW91bnQJAMwIAgkApAMBBQhidXlQcmljZQkAzAgCCQCkAwEFCXNlbGxQcmljZQUDbmlsAgFfCQCUCgIJAM0IAggFA2FjYwJfMQUBeQkAZAIFAW4AAQQBcwkAugkCCAoAAiRsBRBwcm9kdWN0aW9uTWF0cml4CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKc2luZ2xlUHJvZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyAl8xAgE6BAZyZXN1bHQJAKwCAgIcJXMlc19fZW1lcmdlbmN5U2VydmljZURhdGFfXwUBcwkAlAoCBQNuaWwFBnJlc3VsdAFpARB3bGdTdGF0c1JFQURPTkxZAQt1c2VyQWRkck9wdAQIY3VyU3RhdHMJAQtnZXRXbGdTdGF0cwUFC3VzZXJBZGRyT3B0CQDMCAIFDHJlc3RDb250cmFjdAkAzAgCBQ9zdGFraW5nQ29udHJhY3QJAMwIAgUPZWNvbm9teUNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QJAMwIAgUNYWNyZXNDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAABQVNVUxUNgkAlAoCBQNuaWwJAMwIAgkArAICAhElcyVkX193bGdBbW91bnRfXwkApAMBCQCRAwIFCGN1clN0YXRzBQxpZHhXbGdBbW91bnQJAMwIAgkArAICAhAlcyVkX193bGdQcmljZV9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFC2lkeFdsZ1ByaWNlCQDMCAIJAKwCAgIRJXMlZF9fdXNkdEZ1bmRzX18JAKQDAQkAkQMCBQhjdXJTdGF0cwULaWR4V2xnRnVuZHMJAMwIAgkArAICAhMlcyVkX191c2R0RWNvbm9teV9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFDWlkeFdsZ0Vjb25vbXkJAMwIAgkArAICAhQlcyVkX191c2R0QWN0aXZpdHlfXwkApAMBCQCRAwIFCGN1clN0YXRzBQ5pZHhXbGdBY3Rpdml0eQkAzAgCCQCsAgICFSVzJWRfX3VzZHRBcmJpdHJhZ2VfXwkApAMBCQCRAwIFCGN1clN0YXRzBQ9pZHhXbGdBcmJpdHJhZ2UJAMwIAgkArAICAhAlcyVkX191c2R0UG9vbF9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFCmlkeFdsZ1Bvb2wJAMwIAgkArAICAhQlcyVkX193bGdJc3N1ZVRpbWVfXwkApAMBCQCRAwIFCGN1clN0YXRzBQ9pZHhXbGdJc3N1ZVRpbWUJAMwIAgkArAICAiMlcyVkX193bGdMYXN0TWFya2V0aW5nVGVhbUFjdFRpbWVfXwkApAMBCQCRAwIFCGN1clN0YXRzBRFpZHhXbGdMYXN0TVRBVGltZQkAzAgCCQCsAgICGSVzJWRfX3dsZ01hcmtldGluZ1RvdGFsX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUUaWR4V2xnTWFya2V0aW5nVG90YWwJAMwIAgkArAICAholcyVkX193bGdNYXJrZXRpbmdBbUxlZnRfXwkApAMBCQCRAwIFCGN1clN0YXRzBRVpZHhXbGdNYXJrZXRpbmdBbUxlZnQJAMwIAgkArAICAh4lcyVkX193bGdNYXJrZXRpbmdBbUF2YWlsTm93X18JAKQDAQkAkQMCBQhjdXJTdGF0cwUZaWR4V2xnTWFya2V0aW5nQW1BdmFpbE5vdwkAzAgCCQCsAgICGiVzJWRfX3dsZ01hcmtldGluZ1dsZ29sZF9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFFWlkeFdsZ01hcmtldGluZ1dsZ29sZAkAzAgCCQCsAgICFCVzJWRfX3dsZ1RlYW1Ub3RhbF9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFD2lkeFdsZ1RlYW1Ub3RhbAkAzAgCCQCsAgICFSVzJWRfX3dsZ1RlYW1BbUxlZnRfXwkApAMBCQCRAwIFCGN1clN0YXRzBRBpZHhXbGdUZWFtQW1MZWZ0CQDMCAIJAKwCAgIZJXMlZF9fd2xnVGVhbUFtQXZhaWxOb3dfXwkApAMBCQCRAwIFCGN1clN0YXRzBRRpZHhXbGdUZWFtQW1BdmFpbE5vdwkAzAgCCQCsAgICFSVzJWRfX3dsZ1RlYW1XbGdvbGRfXwkApAMBCQCRAwIFCGN1clN0YXRzBRBpZHhXbGdUZWFtV2xnb2xkCQDMCAIJAKwCAgITJXMlZF9fd2xnQWN0VG90YWxfXwkApAMBCQCRAwIFCGN1clN0YXRzBQ5pZHhXbGdBY3RUb3RhbAkAzAgCCQCsAgICFCVzJWRfX3dsZ0FjdEFtTGVmdF9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFD2lkeFdsZ0FjdEFtTGVmdAkAzAgCCQCsAgICGCVzJWRfX3dsZ0FjdEFtQXZhaWxOb3dfXwkApAMBCQCRAwIFCGN1clN0YXRzBRNpZHhXbGdBY3RBbUF2YWlsTm93CQDMCAIJAKwCAgIUJXMlZF9fd2xnQWN0V2xnb2xkX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUPaWR4V2xnQWN0V2xnb2xkCQDMCAIJAKwCAgIUJXMlZF9fd2xnQ3VyUGVyaW9kX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUPaWR4V2xnQ3VyUGVyaW9kCQDMCAIJAKwCAgIWJXMlZF9fd2xnQW1MZWZ0VG90YWxfXwkApAMBCQCRAwIFCGN1clN0YXRzBRFpZHhXbGdBbUxlZnRUb3RhbAkAzAgCCQCsAgICICVzJWRfX3dsZ0N1clBlcmlvZERpc3RyaWJ1dGlvbl9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFG2lkeFdsZ0N1clBlcmlvZERpc3RyaWJ1dGlvbgkAzAgCCQCsAgICFyVzJWRfX3dsZ0xhc3RVc2VyVGltZV9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFEmlkeFdsZ0xhc3RVc2VyVGltZQkAzAgCCQCsAgICGSVzJWRfX3dsZ1VzZXJBbUF2YWlsTm93X18JAKQDAQkAkQMCBQhjdXJTdGF0cwUUaWR4V2xnVXNlckFtQXZhaWxOb3cJAMwIAgkArAICAholcyVkX193bGdHdWVzdFNMYW5kRGFpbHlfXwkApAMBCQCRAwIFCGN1clN0YXRzBRZpZHhXbGdTTGFuZERhaWx5QW1vdW50CQDMCAIJAKwCAgIaJXMlZF9fd2xnSW52ZXN0RnVuZFRvdGFsX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUWaWR4V2xnSW52ZXN0RnVuZEFtb3VudAkAzAgCCQCsAgICGSVzJWRfX3dsZ1VzZXJUb3RhbEF2YWlsX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUUaWR4V2xnVXNlclRvdGFsQXZhaWwJAMwIAgkArAICAhYlcyVkX193bGdFZmZVc2VyVGltZV9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFEWlkeFdsZ0VmZlVzZXJUaW1lBQNuaWwBaQEXdG91cm5hbWVudFN0YXRzUkVBRE9OTFkBDHRvdXJuYW1lbnRJZAQFdERhdGEJAQtnZXRUb3VyRGF0YQIFEnRvdXJuYW1lbnRDb250cmFjdAUMdG91cm5hbWVudElkBAZzdGF0aWMJAJEDAgUFdERhdGEFCWlkeFN0YXRpYwQHZHluYW1pYwkAkQMCBQV0RGF0YQUKaWR4RHluYW1pYwQHbGVhZGVycwMJAAACCQCRAwIFB2R5bmFtaWMFD3REeW5hbWljTGVhZGVycwIAAgEgCQCRAwIFB2R5bmFtaWMFD3REeW5hbWljTGVhZGVycwQKc2NvcmVCb2FyZAkBC3ZhbHVlT3JFbHNlAgkAnQgCBRJ0b3VybmFtZW50Q29udHJhY3QJARNrZXlTY29yZUJvYXJkQnlUb3VyAQUMdG91cm5hbWVudElkAgAECW51bUdyYW5kcwMJAGYCCQCQAwEFBnN0YXRpYwUQdFN0YXRpY051bUdyYW5kcwkAkQMCBQZzdGF0aWMFEHRTdGF0aWNOdW1HcmFuZHMCATAECXByaXplRnVuZAMJAGYCCQCQAwEFBnN0YXRpYwUQdFN0YXRpY1ByaXplRnVuZAkAkQMCBQZzdGF0aWMFEHRTdGF0aWNQcml6ZUZ1bmQCATAJAJQKAgUDbmlsCQDMCAIJAKwCAgIcJXMlc19fdG91cm5hbWVudFN0YXRpY0RhdGFfXwkAuQkCCQDMCAIJAJEDAgUGc3RhdGljBRN0U3RhdGljUmVnaXN0ZXJDb3N0CQDMCAIJAJEDAgUGc3RhdGljBRJ0U3RhdGljQXR0ZW1wdENvc3QJAMwIAgkAkQMCBQZzdGF0aWMFDHRTdGF0aWNTdGFydAkAzAgCCQCRAwIFBnN0YXRpYwUKdFN0YXRpY0VuZAkAzAgCBQludW1HcmFuZHMJAMwIAgUJcHJpemVGdW5kBQNuaWwCAV8JAMwIAgkArAICAh0lcyVzX190b3VybmFtZW50RHluYW1pY0RhdGFfXwkAugkCCQDMCAIJAJEDAgUHZHluYW1pYwUOdER5bmFtaWNTdGF0dXMJAMwIAgUHbGVhZGVycwkAzAgCCQCRAwIFB2R5bmFtaWMFEXREeW5hbWljV2luUmVzdWx0CQDMCAIJAJEDAgUHZHluYW1pYwUVdER5bmFtaWNUb3RhbFJlZ0NvdW50CQDMCAIJAJEDAgUHZHluYW1pYwUVdER5bmFtaWNUb3RhbEF0dGVtcHRzBQNuaWwCAV8JAMwIAgkArAICAhwlcyVzX190b3VybmFtZW50U2NvcmVCb2FyZF9fBQpzY29yZUJvYXJkBQNuaWwBaQEbbGFzdFRvdXJuYW1lbnRTdGF0c1JFQURPTkxZAAQMdG91cm5hbWVudElkCQELdmFsdWVPckVsc2UCCQCaCAIFEnRvdXJuYW1lbnRDb250cmFjdAUNbGFzdFRvdXJJZEtleQAABAZzdGF0aWMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBRJ0b3VybmFtZW50Q29udHJhY3QJARVrZXlUb3VyU3RhdGljRGF0YUJ5SWQBBQx0b3VybmFtZW50SWQCHCVzJWQlZCVkJWQlZCVkX19fX19fX19fX19fX18FA1NFUAQHZHluYW1pYwkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFEnRvdXJuYW1lbnRDb250cmFjdAkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQx0b3VybmFtZW50SWQCFCVzJXMlZCVkJWRfX19fX19fX19fBQNTRVAEB2xlYWRlcnMDCQAAAgkAkQMCBQdkeW5hbWljBQ90RHluYW1pY0xlYWRlcnMCAAIBIAkAkQMCBQdkeW5hbWljBQ90RHluYW1pY0xlYWRlcnMECnNjb3JlQm9hcmQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUSdG91cm5hbWVudENvbnRyYWN0CQETa2V5U2NvcmVCb2FyZEJ5VG91cgEFDHRvdXJuYW1lbnRJZAIABAludW1HcmFuZHMDCQBmAgkAkAMBBQZzdGF0aWMFEHRTdGF0aWNOdW1HcmFuZHMJAJEDAgUGc3RhdGljBRB0U3RhdGljTnVtR3JhbmRzAgEwBAlwcml6ZUZ1bmQDCQBmAgkAkAMBBQZzdGF0aWMFEHRTdGF0aWNQcml6ZUZ1bmQJAJEDAgUGc3RhdGljBRB0U3RhdGljUHJpemVGdW5kAgEwCQCUCgIFA25pbAkAzAgCCQCsAgICGCVzJXNfX2xhc3RUb3VybmFtZW50SWRfXwkApAMBBQx0b3VybmFtZW50SWQJAMwIAgkArAICAhwlcyVzX190b3VybmFtZW50U3RhdGljRGF0YV9fCQC5CQIJAMwIAgkAkQMCBQZzdGF0aWMFE3RTdGF0aWNSZWdpc3RlckNvc3QJAMwIAgkAkQMCBQZzdGF0aWMFEnRTdGF0aWNBdHRlbXB0Q29zdAkAzAgCCQCRAwIFBnN0YXRpYwUMdFN0YXRpY1N0YXJ0CQDMCAIJAJEDAgUGc3RhdGljBQp0U3RhdGljRW5kCQDMCAIFCW51bUdyYW5kcwkAzAgCBQlwcml6ZUZ1bmQFA25pbAIBXwkAzAgCCQCsAgICHSVzJXNfX3RvdXJuYW1lbnREeW5hbWljRGF0YV9fCQC6CQIJAMwIAgkAkQMCBQdkeW5hbWljBQ50RHluYW1pY1N0YXR1cwkAzAgCBQdsZWFkZXJzCQDMCAIJAJEDAgUHZHluYW1pYwURdER5bmFtaWNXaW5SZXN1bHQJAMwIAgkAkQMCBQdkeW5hbWljBRV0RHluYW1pY1RvdGFsUmVnQ291bnQJAMwIAgkAkQMCBQdkeW5hbWljBRV0RHluYW1pY1RvdGFsQXR0ZW1wdHMFA25pbAIBXwkAzAgCCQCsAgICHCVzJXNfX3RvdXJuYW1lbnRTY29yZUJvYXJkX18FCnNjb3JlQm9hcmQFA25pbAFpARt0b3VybmFtZW50RHVja1N0YXRzUkVBRE9OTFkCA3RJZAtkdWNrQXNzZXRJZAQJaXNEdWNrUmVnCQELdmFsdWVPckVsc2UCCQCbCAIFEnRvdXJuYW1lbnRDb250cmFjdAkBHGtleUlzUmVnaXN0ZXJlZEJ5VG91ckFuZER1Y2sCBQN0SWQFC2R1Y2tBc3NldElkBwQPbGFzdER1Y2tBdHRlbXB0CQELdmFsdWVPckVsc2UCCQCaCAIFEnRvdXJuYW1lbnRDb250cmFjdAkBG2tleUxhc3RBdHRlbXB0QnlUb3VyQW5kRHVjawIFA3RJZAULZHVja0Fzc2V0SWQA////////////AQQOYmVzdER1Y2tSZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSdG91cm5hbWVudENvbnRyYWN0CQEaa2V5QmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sCBQN0SWQFC2R1Y2tBc3NldElkAAAECmJlc3REdWNrVHgJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUSdG91cm5hbWVudENvbnRyYWN0CQEWa2V5QmVzdFR4QnlUb3VyQW5kRHVjawIFA3RJZAULZHVja0Fzc2V0SWQCAAQJaXNBd2FyZGVkCQELdmFsdWVPckVsc2UCCQCbCAIFEnRvdXJuYW1lbnRDb250cmFjdAkBGWtleUlzQXdhcmRlZEJ5VG91ckFuZER1Y2sCBQN0SWQFC2R1Y2tBc3NldElkBwkAlAoCBQNuaWwJAMwIAgkArAICAhslcyVzX190b3VybmFtZW50RHVja1N0YXRzX18JALkJAgkAzAgCCQClAwEFCWlzRHVja1JlZwkAzAgCCQCkAwEFD2xhc3REdWNrQXR0ZW1wdAkAzAgCCQCkAwEFDmJlc3REdWNrUmVzdWx0CQDMCAIFCmJlc3REdWNrVHgJAMwIAgkApQMBBQlpc0F3YXJkZWQFA25pbAIBXwUDbmlsAWkBG2R1Y2tTdGF0c0NhbGN1bGF0b3JSRUFET05MWQELZHVja0Fzc2V0SWQEBWNoYXJzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEMa2V5RHVja0NoYXJzAQULZHVja0Fzc2V0SWQCCTBfMF8wXzBfMAIBXwQFYnVmZnMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlEdWNrQnVmZnMBBQtkdWNrQXNzZXRJZAIJMF8wXzBfMF8wAgFfBAZlcXVpcG0JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARBrZXlEdWNrRXF1aXBtZW50AQULZHVja0Fzc2V0SWQCCztfO187XztfO187AgFfBA1lcXVpcG1lbnRQZXJjCQEKc2xvdEVmZmVjdAEJAJEDAgkAtQkCCQCRAwIFBmVxdWlwbQUHc2VnQmFjawIBOwABBA5lcXVpcG1lbnRBYnNvcgkBCnNsb3RFZmZlY3QBCQCRAwIJALUJAgkAkQMCBQZlcXVpcG0FB3NlZ0JlbHQCATsAAAQFZG9kZ2UJARBkb2RnZVByb2JhYmlsaXR5AwUFY2hhcnMFBWJ1ZmZzBQ1lcXVpcG1lbnRQZXJjBAZhYnNvcmIJARBkYW1hZ2VBYnNvcnB0aW9uAwUFY2hhcnMFBWJ1ZmZzBQ5lcXVpcG1lbnRBYnNvcgkAlAoCBQNuaWwJAMwIAgkArAICAhglcyVkX19kb2RnZVByb2JhYmlsaXR5X18JAKQDAQUFZG9kZ2UJAMwIAgkArAICAhglcyVkX19kYW1hZ2VBYnNvcnB0aW9uX18JAKQDAQUGYWJzb3JiBQNuaWwBaQEhY3VzdG9tRHVja1N0YXRzQ2FsY3VsYXRvclJFQURPTkxZBAVjaGFycwVidWZmcw1lcXVpcG1lbnRQZXJjDmVxdWlwbWVudEFic29yBAVkb2RnZQkBEGRvZGdlUHJvYmFiaWxpdHkDBQVjaGFycwUFYnVmZnMFDWVxdWlwbWVudFBlcmMEBmFic29yYgkBEGRhbWFnZUFic29ycHRpb24DBQVjaGFycwUFYnVmZnMFDmVxdWlwbWVudEFic29yCQCUCgIFA25pbAkAzAgCCQCsAgICGCVzJWRfX2RvZGdlUHJvYmFiaWxpdHlfXwkApAMBBQVkb2RnZQkAzAgCCQCsAgICGCVzJWRfX2RhbWFnZUFic29ycHRpb25fXwkApAMBBQZhYnNvcmIFA25pbAFpARJhY3Jlc1N0YXRzUkVBRE9OTFkBC3VzZXJBZGRyT3B0BAl1c2VyQ2xhaW0JAQlhc0FueUxpc3QBCQD8BwQFDWFjcmVzQ29udHJhY3QCEmNsYWltQWNyZXNSRUFET05MWQkAzAgCBQt1c2VyQWRkck9wdAUDbmlsBQNuaWwEDXVzZXJDbGFpbWFibGUJAQVhc0ludAEJAJEDAgUJdXNlckNsYWltAAAEDHVzZXJMYXN0VGltZQkBBWFzSW50AQkAkQMCBQl1c2VyQ2xhaW0AAQkAlAoCBQNuaWwJAMwIAgkArAICAhglcyVkX19hY3Jlc0lzc3VlZFRvdGFsX18JAKQDAQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1hY3Jlc0NvbnRyYWN0BRRhY3Jlc0lzc3VlZEFtb3VudEtleQAACQDMCAIJAKwCAgITJXMlZF9fYWNyZXNVbnNvbGRfXwkApAMBCQDwBwIFDWFjcmVzQ29udHJhY3QFDGFjcmVzQXNzZXRJZAkAzAgCCQCsAgICGCVzJWRfX2FjcmVzU3Rha2VkVG90YWxfXwkApAMBCQELdmFsdWVPckVsc2UCCQCaCAIFDWFjcmVzQ29udHJhY3QFE2FjcmVzU3Rha2VkVG90YWxLZXkAAAkAzAgCCQCsAgICGSVzJWRfX2FjcmVzU3Rha2VkQnlVc2VyX18JAKQDAQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1hY3Jlc0NvbnRyYWN0CQEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBQt1c2VyQWRkck9wdAAACQDMCAIJAKwCAgIcJXMlZF9fYWNyZXNDbGFpbWFibGVCeVVzZXJfXwkApAMBBQ11c2VyQ2xhaW1hYmxlCQDMCAIJAKwCAgIgJXMlZF9fYWNyZXNMYXN0Q2xhaW1UaW1lQnlVc2VyX18JAKQDAQUMdXNlckxhc3RUaW1lBQNuaWwAa/AyQQ==", "height": 2788214, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: C7y43rDMtyCLrxY581wKb4DihPekA9qVgTZUDcSJuae7 Next: Bk2yXYs9CnR6EekSZu8e61tk1Qfmtuh49wjMeqSAswVY Diff:
OldNewDifferences
759759 let xp = valueOrElse(getInteger(stakingContract, keyUserXP(userAddressOpt)), 0)
760760 let lvl = valueOrElse(getInteger(stakingContract, keyUserLevel(userAddressOpt)), 0)
761761 let freePoints = valueOrElse(getInteger(stakingContract, keyUserFreePoints(userAddressOpt)), 0)
762+ let virtWlgData = {
763+ let @ = invoke(wlgContract, "checkWlgXpREADONLY", [userAddressOpt], nil)
764+ if ($isInstanceOf(@, "List[Any]"))
765+ then @
766+ else throw(($getType(@) + " couldn't be cast to List[Any]"))
767+ }
762768 let onboard = if (isDefined(refBy))
763769 then (ARTONBOARD + (if (if (isDefined(addr))
764770 then isDefined(getString(stakingContract, keyOnboardArtDuckActivatedBy(userAddressOpt)))
770776 then assetBalance(value(addr), acresAssetId)
771777 else 0
772778 let stakedAcres = valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(userAddressOpt)), 0)
773-[("%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)]
779+[("%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__virtLevel__" + toString({
780+ let @ = virtWlgData[0]
781+ if ($isInstanceOf(@, "Int"))
782+ then @
783+ else throw(($getType(@) + " couldn't be cast to Int"))
784+ })), ("%s%d__virtPoints__" + toString({
785+ let @ = virtWlgData[1]
786+ if ($isInstanceOf(@, "Int"))
787+ then @
788+ else throw(($getType(@) + " couldn't be cast to Int"))
789+ })), ("%s%d__virtXP__" + toString({
790+ let @ = virtWlgData[2]
791+ if ($isInstanceOf(@, "Int"))
792+ then @
793+ else throw(($getType(@) + " couldn't be cast to Int"))
794+ }))]
774795 }
775796
776797
811832 let freePoints = valueOrElse(getInteger(stakingContract, keyDuckFreePoints(duckAssetId)), 0)
812833 let equipm = valueOrElse(getString(stakingContract, keyDuckEquipment(duckAssetId)), ";_;_;_;_;_;")
813834 let buffs = valueOrElse(getString(stakingContract, keyDuckBuffs(duckAssetId)), "0_0_0_0_0")
814- let $t060816186 = getRobberyData(stakingContract, duckAssetId)
815- let robCost = $t060816186._1
816- let lastRobTime = $t060816186._2
817- let duckState = $t060816186._3
818- let lockedLand = $t060816186._4
819- let landETA = $t060816186._5
835+ let $t064126517 = getRobberyData(stakingContract, duckAssetId)
836+ let robCost = $t064126517._1
837+ let lastRobTime = $t064126517._2
838+ let duckState = $t064126517._3
839+ let lockedLand = $t064126517._4
840+ let landETA = $t064126517._5
820841 [("%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))]
821842 }
822843
12461267 @Callable(i)
12471268 func wlgStatsREADONLY (userAddrOpt) = {
12481269 let curStats = getWlgStats(userAddrOpt, [restContract, stakingContract, economyContract, wlgContract, puzzlePoolContract, investFundContract, acresContract], usdtAssetId, 0, MULT6)
1249- let virtLevelPoints = {
1250- let @ = invoke(wlgContract, "checkWlgXpREADONLY", [userAddrOpt], nil)
1251- if ($isInstanceOf(@, "List[Any]"))
1252- then @
1253- else throw(($getType(@) + " couldn't be cast to List[Any]"))
1254- }
1255- $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])), ("%s%d__wlgStakeVirtLevel__" + toString({
1256- let @ = virtLevelPoints[0]
1257- if ($isInstanceOf(@, "Int"))
1258- then @
1259- else throw(($getType(@) + " couldn't be cast to Int"))
1260- })), ("%s%d__wlgStakeVirtPoints__" + toString({
1261- let @ = virtLevelPoints[1]
1262- if ($isInstanceOf(@, "Int"))
1263- then @
1264- else throw(($getType(@) + " couldn't be cast to Int"))
1265- }))])
1270+ $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]))])
12661271 }
12671272
12681273
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 let acresStakedTotalKey = "acresStakedAmountTotal"
5656
5757 let dappRest = 0
5858
5959 let dappStaking = 1
6060
6161 let dappEconomy = 2
6262
6363 let dappWlg = 3
6464
6565 let dappPuzzle = 4
6666
6767 let dappInvestFund = 5
6868
6969 let dappAcres = 6
7070
7171 func getLands (userAddrStrOrEmpty,stakingContract,acresContract) = {
7272 let props = split(valueOrElse(getString(stakingContract, "resTypesProportions"), "0_0_0_0_0_0"), "_")
7373 func adder (acc,item) = (acc + parseIntValue(item))
7474
7575 let totalPieces = {
7676 let $l = props
7777 let $s = size($l)
7878 let $acc0 = 0
7979 func $f0_1 ($a,$i) = if (($i >= $s))
8080 then $a
8181 else adder($a, $l[$i])
8282
8383 func $f0_2 ($a,$i) = if (($i >= $s))
8484 then $a
8585 else throw("List size exceeds 6")
8686
8787 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
8888 }
8989 let userPieces = valueOrElse(getInteger(stakingContract, ("stakedPiecesByOwner_" + userAddrStrOrEmpty)), 0)
9090 let totalAcres = valueOrElse(getInteger(acresContract, acresStakedTotalKey), 0)
9191 let userAcres = valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(userAddrStrOrEmpty)), 0)
9292 [totalPieces, userPieces, totalAcres, userAcres]
9393 }
9494
9595
9696 let idxTotalPieces = 0
9797
9898 let idxUserPieces = 1
9999
100100 let idxTotalAcres = 2
101101
102102 let idxUserAcres = 3
103103
104104 func getWlgStats (userAddrOpt,contracts,usdtId,usdtBalanceCorrection,userProportion6) = {
105105 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssuedAmountKey), "WLGOLD is not issued yet")
106106 let economyUsd = assetBalance(contracts[dappEconomy], usdtId)
107107 let restUsd = assetBalance(contracts[dappRest], usdtId)
108108 let wlgUsd = (assetBalance(contracts[dappWlg], usdtId) - usdtBalanceCorrection)
109109 let puzzleUsd = assetBalance(contracts[dappPuzzle], usdtId)
110110 let investFundContract = contracts[dappInvestFund]
111111 let investFundTotal = (assetBalance(investFundContract, usdtId) + valueOrElse(getInteger(investFundContract, zbIssuedAmountKey), 0))
112112 let totalFundsUsd = ((economyUsd + wlgUsd) + investFundTotal)
113113 let wlgId = valueOrErrorMessage(getBinary(contracts[dappWlg], "wlg_assetId"), "Not initialized yet")
114114 let now = lastBlock.timestamp
115115 let issueTime = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssueTimeKey), "Not initialized")
116116 let marketingTotal = fraction(MILLION6, MARKETINGSHARE, M6)
117117 let marketingAmountLeft = valueOrElse(getInteger(contracts[dappWlg], marketingAmountLeftKey), marketingTotal)
118118 let lastMarketingTime = valueOrElse(getInteger(contracts[dappWlg], lastMarketingTimeKey), issueTime)
119119 let marketingAddr = addressFromStringValue(value(getString(contracts[dappWlg], marketingAddrKey)))
120120 let marketingAmountAvailableNow = min([fraction(marketingTotal, (now - lastMarketingTime), YEARMILLIS), marketingAmountLeft])
121121 let marketingWlgold = assetBalance(marketingAddr, wlgId)
122122 let teamTotal = fraction(MILLION6, TEAMSHARE, M6)
123123 let teamAmountLeft = valueOrElse(getInteger(contracts[dappWlg], teamAmountLeftKey), teamTotal)
124124 let lastTeamTime = valueOrElse(getInteger(contracts[dappWlg], lastTeamTimeKey), issueTime)
125125 let teamAddr = addressFromStringValue(value(getString(contracts[dappWlg], teamAddrKey)))
126126 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEARMILLIS)), teamAmountLeft])
127127 let teamWlgold = assetBalance(teamAddr, wlgId)
128128 let actTotal = fraction(MILLION6, ACTIVITYSHARE, M6)
129129 let actAmountLeft = valueOrElse(getInteger(contracts[dappWlg], actAmountLeftKey), actTotal)
130130 let lastActivitiesTime = valueOrElse(getInteger(contracts[dappWlg], lastActivitiesTimeKey), issueTime)
131131 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEARMILLIS)), actAmountLeft])
132132 let actWlgold = assetBalance(contracts[dappRest], wlgId)
133133 let lastUserTime = valueOrElse(getInteger(contracts[dappWlg], keyLastClaimedTimeByUser(userAddrOpt)), issueTime)
134134 let lastUserPeriod = ((lastUserTime - issueTime) / YEARMILLIS)
135135 let nowLimited = min([now, (issueTime + (3 * YEARMILLIS))])
136136 let curPeriod = min([((now - issueTime) / YEARMILLIS), 2])
137137 let eff = getLands(userAddrOpt, contracts[dappStaking], contracts[dappAcres])
138138 let curPeriodDistribution = distributionByPeriod(curPeriod)
139139 let $t079142 = if ((lastUserPeriod == curPeriod))
140140 then {
141141 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEARMILLIS)
142142 let userPart = fraction(a0, userProportion6, M6)
143143 let effTime = (lastUserTime + fraction((nowLimited - lastUserTime), userProportion6, M6))
144144 $Tuple3(userPart, a0, effTime)
145145 }
146146 else if ((lastUserPeriod == (curPeriod - 1)))
147147 then {
148148 let a1 = fraction(distributionByPeriod((curPeriod - 1)), ((issueTime + (YEARMILLIS * curPeriod)) - lastUserTime), YEARMILLIS)
149149 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)
150150 let avail = (a1 + a0)
151151 let userPart = fraction(avail, userProportion6, M6)
152152 let effTime = if ((a1 >= userPart))
153153 then (lastUserTime + fraction(YEARMILLIS, userPart, distributionByPeriod((curPeriod - 1))))
154154 else ((issueTime + (YEARMILLIS * curPeriod)) + fraction(YEARMILLIS, (userPart - a1), curPeriodDistribution))
155155 $Tuple3(userPart, avail, effTime)
156156 }
157157 else {
158158 let a2 = fraction(distributionByPeriod((curPeriod - 2)), ((issueTime + (YEARMILLIS * (curPeriod - 1))) - lastUserTime), YEARMILLIS)
159159 let a1 = distributionByPeriod((curPeriod - 1))
160160 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)
161161 let avail = ((a2 + a1) + a0)
162162 let userPart = fraction(avail, userProportion6, M6)
163163 let effTime = if ((a2 >= userPart))
164164 then (lastUserTime + fraction(YEARMILLIS, userPart, distributionByPeriod((curPeriod - 2))))
165165 else if (((a2 + a1) >= userPart))
166166 then ((issueTime + (YEARMILLIS * (curPeriod - 1))) + fraction(YEARMILLIS, (userPart - a2), distributionByPeriod((curPeriod - 1))))
167167 else ((issueTime + (YEARMILLIS * curPeriod)) + fraction(YEARMILLIS, ((userPart - a2) - a1), curPeriodDistribution))
168168 $Tuple3(userPart, avail, effTime)
169169 }
170170 let userAmount = $t079142._1
171171 let userAvailable = $t079142._2
172172 let effLastTime = $t079142._3
173173 let sLandDailyAmount = fraction(fraction(curPeriodDistribution, DAYMILLIS, YEARMILLIS), 25, eff[idxTotalPieces])
174174 let amountLeftTotal = valueOrElse(getInteger(contracts[dappWlg], stakersAmountLeftKey), 0)
175175 let robbedUser = fraction(userAmount, ((eff[idxUserPieces] * M8) + eff[idxUserAcres]), ((eff[idxTotalPieces] * M8) + eff[idxTotalAcres]))
176176 let unrobbedUser = fraction(userAvailable, ((eff[idxUserPieces] * M8) + eff[idxUserAcres]), ((eff[idxTotalPieces] * M8) + eff[idxTotalAcres]))
177177 [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]
178178 }
179179
180180
181181 let SCALE8 = 100000000
182182
183183 let robberyCostMin = 100000000
184184
185185 let robberyCooldownCoeff = 400
186186
187187 let charIntellect = 2
188188
189189 let charEndurance = 3
190190
191191 let charDexterity = 4
192192
193193 let segBack = 1
194194
195195 let segBelt = 2
196196
197197 let landRobStates = ["free", "locked", "afterLockCooldown", "robbedCooldown", "defendedCooldown"]
198198
199199 let duckRobStates = ["free", "preparingRob"]
200200
201201 func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
202202
203203
204204 func keyDuckChars (duckAssetId) = ("duckChars_" + duckAssetId)
205205
206206
207207 func keyDuckXP (duckAssetId) = ("duckXP_" + duckAssetId)
208208
209209
210210 func keyDuckLevel (duckAssetId) = ("duckLevel_" + duckAssetId)
211211
212212
213213 func keyDuckFreePoints (duckAssetId) = ("duckFreePoints_" + duckAssetId)
214214
215215
216216 func keyDuckEquipment (duckAssetId) = ("duckEquipment_" + duckAssetId)
217217
218218
219219 func keyUserXP (addr) = ("userXP_" + addr)
220220
221221
222222 func keyUserLevel (addr) = ("userLevel_" + addr)
223223
224224
225225 func keyUserFreePoints (addr) = ("userFreePoints_" + addr)
226226
227227
228228 func keyDuckBuffs (duckAssetId) = ("duckBuffs_" + duckAssetId)
229229
230230
231231 func keyLastRobberyTimeByDuck (duckAssetId) = ("lastRobberyTime_" + duckAssetId)
232232
233233
234234 func keyLastRobberyCostByDuck (duckAssetId) = ("lastRobberyCost_" + duckAssetId)
235235
236236
237237 func keyLandRobberyState (landAssetId) = ("landRobberyState_" + landAssetId)
238238
239239
240240 func keyLandCooldownETA (landAssetId) = ("landCooldownETA_" + landAssetId)
241241
242242
243243 func keyDuckRobberyState (duckAssetId) = ("duckRobberyState_" + duckAssetId)
244244
245245
246246 func keyLockedLandByDuck (duckAssetId) = ("lockedLandByDuck_" + duckAssetId)
247247
248248
249249 func maxHealth (level) = (100 + level)
250250
251251
252252 func getRobberyData (stakingContract,duckAssetId) = {
253253 let lastRobCost = valueOrElse(getInteger(stakingContract, keyLastRobberyCostByDuck(duckAssetId)), 0)
254254 let lastRobTime = valueOrElse(getInteger(stakingContract, keyLastRobberyTimeByDuck(duckAssetId)), 0)
255255 let now = lastBlock.timestamp
256256 let robCost = max([robberyCostMin, (lastRobCost - (robberyCooldownCoeff * (now - lastRobTime)))])
257257 let duckState = valueOrElse(getInteger(stakingContract, keyDuckRobberyState(duckAssetId)), 0)
258258 let lockedLand = valueOrElse(getString(stakingContract, keyLockedLandByDuck(duckAssetId)), "")
259259 let landETA = valueOrElse(getInteger(stakingContract, keyLandCooldownETA(lockedLand)), 0)
260260 $Tuple5(robCost, lastRobTime, duckState, lockedLand, landETA)
261261 }
262262
263263
264264 func tanh (v) = {
265265 let double = (2 * v)
266266 let exp2 = pow(271828183, 8, double, 8, 8, HALFUP)
267267 fraction((exp2 - SCALE8), SCALE8, (exp2 + SCALE8), HALFUP)
268268 }
269269
270270
271271 func dodgeProbability (chars,buffs,equipmentPerc) = {
272272 let intel = (parseIntValue(chars[charIntellect]) + parseIntValue(buffs[charIntellect]))
273273 let dex = (parseIntValue(chars[charDexterity]) + parseIntValue(buffs[charDexterity]))
274274 let first8 = (tanh(fraction(dex, SCALE8, 200)) / 4)
275275 let second8 = fraction(equipmentPerc, (SCALE8 + fraction(7000000, intel, (1 + intel), HALFUP)), 100, HALFUP)
276276 (first8 + second8)
277277 }
278278
279279
280280 func damageAbsorption (chars,buffs,equipmentAbsor) = {
281281 let intel = (parseIntValue(chars[charIntellect]) + parseIntValue(buffs[charIntellect]))
282282 let endur = (parseIntValue(chars[charEndurance]) + parseIntValue(buffs[charEndurance]))
283283 let dex = (parseIntValue(chars[charDexterity]) + parseIntValue(buffs[charDexterity]))
284284 let first8 = (equipmentAbsor * (SCALE8 + fraction(14000000, intel, (1 + intel), HALFUP)))
285285 let second8 = (sqrt(dex, 0, 8, HALFUP) / 10)
286286 let third8 = ((SCALE8 / 5) * endur)
287287 ((first8 + second8) + third8)
288288 }
289289
290290
291291 let ARTPRESALE = "PRESALE"
292292
293293 let ARTONBOARD = "ONBOARD"
294294
295295 let NUMRES = 6
296296
297297 let DAILYRESBYPIECE = 3456000
298298
299299 let WHMULTIPLIER = 10000000000
300300
301301 let RESOURCEPRICEMIN = 39637
302302
303303 let ESMAXPACKAGES = 10
304304
305305 let ESBUYCOEF = 4
306306
307307 let ESSELLCOEF = 10
308308
309309 let COEFF2MAT = 10000000
310310
311311 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_"]
312312
313313 let rIdxCoeff = 6
314314
315315 let rIdxEffect = 8
316316
317317 let PRODUCTPKGSIZE = 10
318318
319319 func keyLandAssetIdToOwner (assetId) = ("no_" + assetId)
320320
321321
322322 func keyLandAssetIdToCustomName (assetId) = ("lcna_" + assetId)
323323
324324
325325 func keyStakedTimeByAssetId (assetId) = ("st_" + assetId)
326326
327327
328328 func keyLandArtStatusByTypeAndAssetId (type,assetId) = makeString(["las", type, assetId], "_")
329329
330330
331331 func keyWarehouseByLand (landAssetId) = ("wh_" + landAssetId)
332332
333333
334334 func keyInfraLevelByAssetId (assetId) = ("infraLevel_" + assetId)
335335
336336
337337 func keyFortificationsByLand (landAssetId) = ("fortifications_" + landAssetId)
338338
339339
340340 func keyDuckAssetIdToCustomName (assetId) = ("duckCustomNameByAssetId_" + assetId)
341341
342342
343343 func keyAddressToCustomName (addr) = ("accountCustomNameByAddr_" + addr)
344344
345345
346346 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
347347
348348
349349 func keyOnboardArtDuckActivatedBy (addr) = ("onboardArtActivatedDuckBy_" + addr)
350350
351351
352352 func keyAddressReferrals (addr) = ("accReferrals_" + addr)
353353
354354
355355 func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
356356
357357
358358 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
359359
360360
361361 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
362362
363363
364364 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
365365
366366
367367 func keyEsWarehouse () = "emergencyWarehouseProducts"
368368
369369
370370 let lastTourIdKey = "%s__lastTourId"
371371
372372 func keyTourStaticDataById (tId) = ("%s%d__tourStaticData__" + toString(tId))
373373
374374
375375 func keyTourDynamicDataById (tId) = ("%s%d__tourDynamicData__" + toString(tId))
376376
377377
378378 func keyScoreBoardByTour (tId) = ("%s%d__scoreBoard__" + toString(tId))
379379
380380
381381 func keyIsRegisteredByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__isRegisteredByTourAndDuck", toString(tId), duckAssetId], "__")
382382
383383
384384 func keyIsAwardedByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__isAwardedByTourAndDuck", toString(tId), duckAssetId], "__")
385385
386386
387387 func keyLastAttemptByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__lastAttemptByTourAndDuck", toString(tId), duckAssetId], "__")
388388
389389
390390 func keyBestResultByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__bestResultByTourAndDuck", toString(tId), duckAssetId], "__")
391391
392392
393393 func keyBestTxByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__bestTxByTourAndDuck", toString(tId), duckAssetId], "__")
394394
395395
396396 let idxStatic = 0
397397
398398 let idxDynamic = 1
399399
400400 let tStaticRegisterCost = 2
401401
402402 let tStaticAttemptCost = 3
403403
404404 let tStaticStart = 5
405405
406406 let tStaticEnd = 6
407407
408408 let tStaticNumGrands = 7
409409
410410 let tStaticPrizeFund = 8
411411
412412 let tDynamicStatus = 1
413413
414414 let tDynamicLeaders = 2
415415
416416 let tDynamicWinResult = 3
417417
418418 let tDynamicTotalRegCount = 4
419419
420420 let tDynamicTotalAttempts = 5
421421
422422 func getTourData (tourContract,tId) = {
423423 let static = split(valueOrErrorMessage(getString(tourContract, keyTourStaticDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
424424 let dynamic = split_4C(valueOrErrorMessage(getString(tourContract, keyTourDynamicDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
425425 [static, dynamic]
426426 }
427427
428428
429429 func getRecipeMaterials (recipe) = (parseIntValue(recipe[rIdxCoeff]) * COEFF2MAT)
430430
431431
432432 let chain = take(drop(this.bytes, 1), 1)
433433
434434 let usdtAssetId = match chain {
435435 case _ =>
436436 if ((base58'2W' == $match0))
437437 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
438438 else if ((base58'2T' == $match0))
439439 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
440440 else throw("Unknown chain")
441441 }
442442
443443 let defaultRestAddressStr = match chain {
444444 case _ =>
445445 if ((base58'2W' == $match0))
446446 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
447447 else if ((base58'2T' == $match0))
448448 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
449449 else throw("Unknown chain")
450450 }
451451
452452 let InfraUpgradeCostS = match chain {
453453 case _ =>
454454 if ((base58'2W' == $match0))
455455 then 10000000000
456456 else if ((base58'2T' == $match0))
457457 then 100000000
458458 else throw("Unknown chain")
459459 }
460460
461461 let SEP = "__"
462462
463463 let MULT6 = 1000000
464464
465465 let MULT8 = 100000000
466466
467467 let SSIZE = 25
468468
469469 let MSIZE = 100
470470
471471 let LSIZE = 225
472472
473473 let XLSIZE = 400
474474
475475 let XXLSIZE = 625
476476
477477 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
478478
479479
480480 let IdxCfgStakingDapp = 1
481481
482482 let IdxCfgEconomyDapp = 2
483483
484484 let IdxCfgWlgDapp = 4
485485
486486 let IdxCfgPuzzlePoolDapp = 5
487487
488488 let IdxCfgInvestFundDapp = 6
489489
490490 let IdxCfgTournamentDapp = 7
491491
492492 let IdxCfgAcresDapp = 8
493493
494494 func keyRestCfg () = "%s__restConfig"
495495
496496
497497 func keyRestAddress () = "%s__restAddr"
498498
499499
500500 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
501501
502502
503503 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
504504
505505
506506 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
507507
508508 let restCfg = readRestCfgOrFail(restContract)
509509
510510 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
511511
512512 let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
513513
514514 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
515515
516516 let puzzlePoolContract = getContractAddressOrFail(restCfg, IdxCfgPuzzlePoolDapp)
517517
518518 let investFundContract = getContractAddressOrFail(restCfg, IdxCfgInvestFundDapp)
519519
520520 let tournamentContract = getContractAddressOrFail(restCfg, IdxCfgTournamentDapp)
521521
522522 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
523523
524524 let recLandNum = 0
525525
526526 let recLandSize = 1
527527
528528 let recTerrains = 2
529529
530530 let recContinent = 3
531531
532532 let wlgAssetIdKey = "wlg_assetId"
533533
534534 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
535535
536536 let acresIssuedAmountKey = "acresIssuedAmount"
537537
538538 let acresAssetIdKey = "acresAssetId"
539539
540540 let acresAssetId = valueOrErrorMessage(getBinary(acresContract, acresAssetIdKey), "ACRES is not issued yet")
541541
542542 let idxWlgAmount = 0
543543
544544 let idxWlgPrice = 1
545545
546546 let idxWlgFunds = 2
547547
548548 let idxWlgEconomy = 3
549549
550550 let idxWlgActivity = 4
551551
552552 let idxWlgArbitrage = 5
553553
554554 let idxWlgPool = 6
555555
556556 let idxWlgIssueTime = 7
557557
558558 let idxWlgLastMTATime = 8
559559
560560 let idxWlgMarketingTotal = 9
561561
562562 let idxWlgMarketingAmLeft = 10
563563
564564 let idxWlgMarketingAmAvailNow = 11
565565
566566 let idxWlgMarketingWlgold = 12
567567
568568 let idxWlgTeamTotal = 13
569569
570570 let idxWlgTeamAmLeft = 14
571571
572572 let idxWlgTeamAmAvailNow = 15
573573
574574 let idxWlgTeamWlgold = 16
575575
576576 let idxWlgActTotal = 17
577577
578578 let idxWlgActAmLeft = 18
579579
580580 let idxWlgActAmAvailNow = 19
581581
582582 let idxWlgActWlgold = 20
583583
584584 let idxWlgCurPeriod = 21
585585
586586 let idxWlgAmLeftTotal = 22
587587
588588 let idxWlgCurPeriodDistribution = 23
589589
590590 let idxWlgLastUserTime = 24
591591
592592 let idxWlgUserAmAvailNow = 25
593593
594594 let idxWlgSLandDailyAmount = 26
595595
596596 let idxWlgInvestFundAmount = 27
597597
598598 let idxWlgUserTotalAvail = 28
599599
600600 let idxWlgEffUserTime = 29
601601
602602 let IdxEffUser = 1
603603
604604 func keyResProportions () = "resTypesProportions"
605605
606606
607607 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
608608
609609
610610 func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
611611
612612
613613 func asString (v) = match v {
614614 case s: String =>
615615 s
616616 case _ =>
617617 throw("fail to cast into String")
618618 }
619619
620620
621621 func asInt (v) = match v {
622622 case n: Int =>
623623 n
624624 case _ =>
625625 throw("fail to cast into Int")
626626 }
627627
628628
629629 func asAnyList (v) = match v {
630630 case l: List[Any] =>
631631 l
632632 case _ =>
633633 throw("fail to cast into List[Any]")
634634 }
635635
636636
637637 func numPiecesBySize (landSize) = match landSize {
638638 case _ =>
639639 if (("S" == $match0))
640640 then SSIZE
641641 else if (("M" == $match0))
642642 then MSIZE
643643 else if (("L" == $match0))
644644 then LSIZE
645645 else if (("XL" == $match0))
646646 then XLSIZE
647647 else if (("XXL" == $match0))
648648 then XXLSIZE
649649 else throw("Unknown land size")
650650 }
651651
652652
653653 func keyBlocked () = "contractsBlocked"
654654
655655
656656 func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
657657
658658
659659 func getVotingPower (userAddrStrOrEmpty) = {
660660 let props = split(valueOrElse(getString(stakingContract, keyResProportions()), "0_0_0_0_0_0"), "_")
661661 func adder (acc,item) = (acc + parseIntValue(item))
662662
663663 let totalPower = {
664664 let $l = props
665665 let $s = size($l)
666666 let $acc0 = 0
667667 func $f0_1 ($a,$i) = if (($i >= $s))
668668 then $a
669669 else adder($a, $l[$i])
670670
671671 func $f0_2 ($a,$i) = if (($i >= $s))
672672 then $a
673673 else throw("List size exceeds 6")
674674
675675 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
676676 }
677677 let usersPower = valueOrElse(getInteger(stakingContract, keyStakedPiecesByOwner(userAddrStrOrEmpty)), 0)
678678 [totalPower, usersPower]
679679 }
680680
681681
682682 let USDTPRIZEPART = 500000
683683
684684 let adminsList = [toString(this), match chain {
685685 case _ =>
686686 if ((base58'2W' == $match0))
687687 then "3P64qEVzuGzBJuYfDXYisFtokJChSRa8uja"
688688 else if ((base58'2T' == $match0))
689689 then "3N3gSFrTwgiLAFZHMuJrEttht1nPhnkpvjs"
690690 else throw("Unknown chain")
691691 }]
692692
693693 func asListIntCompacted (val) = match val {
694694 case valAnyList: List[Any] =>
695695 if ((size(valAnyList) != NUMRES))
696696 then throw(("Array size is " + toString(size(valAnyList))))
697697 else {
698698 func conv (acc,item) = match item {
699699 case it: Int =>
700700 (acc :+ toString(it))
701701 case _ =>
702702 throw("List type is not Int")
703703 }
704704
705705 let r = {
706706 let $l = valAnyList
707707 let $s = size($l)
708708 let $acc0 = nil
709709 func $f0_1 ($a,$i) = if (($i >= $s))
710710 then $a
711711 else conv($a, $l[$i])
712712
713713 func $f0_2 ($a,$i) = if (($i >= $s))
714714 then $a
715715 else throw("List size exceeds 6")
716716
717717 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
718718 }
719719 makeString(r, "_")
720720 }
721721 case _ =>
722722 throw("fail to cast into List")
723723 }
724724
725725
726726 func asSplitResult (val) = match val {
727727 case t2: (List[Any], List[Any]) =>
728728 $Tuple2(asListIntCompacted(t2._1), asListIntCompacted(t2._2))
729729 case _ =>
730730 throw("fail to cast into (List, List)")
731731 }
732732
733733
734734 func asCancelOrderResult (val) = match val {
735735 case t2: (Boolean, String) =>
736736 t2
737737 case _ =>
738738 throw("fail to cast into (Boolean, String)")
739739 }
740740
741741
742742 func walletInternal (userAddressOpt) = {
743743 let addr = addressFromString(userAddressOpt)
744744 let balance = if (isDefined(addr))
745745 then wavesBalance(value(addr))
746746 else BalanceDetails(0, 0, 0, 0)
747747 let usdtBalance = if (isDefined(addr))
748748 then assetBalance(value(addr), usdtAssetId)
749749 else 0
750750 let wlgoldBalance = if (isDefined(addr))
751751 then assetBalance(value(addr), wlgAssetId)
752752 else 0
753753 let customName = valueOrElse(getString(stakingContract, keyAddressToCustomName(userAddressOpt)), userAddressOpt)
754754 let refByKey = keyAddressRefBy(userAddressOpt)
755755 let refBy = getString(stakingContract, refByKey)
756756 let refs = valueOrElse(getString(stakingContract, keyAddressReferrals(userAddressOpt)), "")
757757 let lastTxId = valueOrElse(getString(stakingContract, keyLastTxIdByUser(userAddressOpt)), "")
758758 let pieces = getVotingPower(userAddressOpt)[IdxEffUser]
759759 let xp = valueOrElse(getInteger(stakingContract, keyUserXP(userAddressOpt)), 0)
760760 let lvl = valueOrElse(getInteger(stakingContract, keyUserLevel(userAddressOpt)), 0)
761761 let freePoints = valueOrElse(getInteger(stakingContract, keyUserFreePoints(userAddressOpt)), 0)
762+ let virtWlgData = {
763+ let @ = invoke(wlgContract, "checkWlgXpREADONLY", [userAddressOpt], nil)
764+ if ($isInstanceOf(@, "List[Any]"))
765+ then @
766+ else throw(($getType(@) + " couldn't be cast to List[Any]"))
767+ }
762768 let onboard = if (isDefined(refBy))
763769 then (ARTONBOARD + (if (if (isDefined(addr))
764770 then isDefined(getString(stakingContract, keyOnboardArtDuckActivatedBy(userAddressOpt)))
765771 else false)
766772 then ":1"
767773 else ":0"))
768774 else ""
769775 let acresBalance = if (isDefined(addr))
770776 then assetBalance(value(addr), acresAssetId)
771777 else 0
772778 let stakedAcres = valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(userAddressOpt)), 0)
773-[("%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)]
779+[("%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__virtLevel__" + toString({
780+ let @ = virtWlgData[0]
781+ if ($isInstanceOf(@, "Int"))
782+ then @
783+ else throw(($getType(@) + " couldn't be cast to Int"))
784+ })), ("%s%d__virtPoints__" + toString({
785+ let @ = virtWlgData[1]
786+ if ($isInstanceOf(@, "Int"))
787+ then @
788+ else throw(($getType(@) + " couldn't be cast to Int"))
789+ })), ("%s%d__virtXP__" + toString({
790+ let @ = virtWlgData[2]
791+ if ($isInstanceOf(@, "Int"))
792+ then @
793+ else throw(($getType(@) + " couldn't be cast to Int"))
794+ }))]
774795 }
775796
776797
777798 func applyBonuses (landAssetId,pieces) = {
778799 let infraLevel = valueOrElse(getInteger(stakingContract, keyInfraLevelByAssetId(landAssetId)), 0)
779800 let artPieces = valueOrElse(getInteger(stakingContract, keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0)
780801 let add6 = (infraLevel / 6)
781802 let add7 = (infraLevel / 7)
782803 $Tuple3(infraLevel, artPieces, ((DAILYRESBYPIECE + fraction(DAILYRESBYPIECE, ((infraLevel + add6) + (2 * add7)), 5)) + fraction(DAILYRESBYPIECE, artPieces, (pieces * 5))))
783804 }
784805
785806
786807 func getWarehouseTotalVolume (volPrefix) = {
787808 let parts = split(volPrefix, "_")
788809 ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
789810 }
790811
791812
792813 func getWarehouse (whKey,landIndex,infraLevel) = {
793814 let volPrefix = ((toString(landIndex) + "_") + toString(infraLevel))
794815 let totS = toString(getWarehouseTotalVolume(volPrefix))
795816 let whStr = valueOrElse(getString(stakingContract, whKey), ((((volPrefix + ":0_0_0_0_0_0:0_0_0_0_0_0::0_0_") + totS) + "_") + totS))
796817 split(whStr, ":")
797818 }
798819
799820
800821 func duckInfoTuple (duckAssetId) = {
801822 let maxHP = maxHealth(valueOrElse(getInteger(stakingContract, keyDuckLevel(duckAssetId)), 0))
802823 $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)))
803824 }
804825
805826
806827 func duckInfoArray (duckAssetId,owner,duckInf) = {
807828 let customName = valueOrElse(getString(stakingContract, keyDuckAssetIdToCustomName(duckAssetId)), duckInf._2)
808829 let chars = valueOrElse(getString(stakingContract, keyDuckChars(duckAssetId)), "0_0_0_0_0")
809830 let xp = valueOrElse(getInteger(stakingContract, keyDuckXP(duckAssetId)), 0)
810831 let lvl = valueOrElse(getInteger(stakingContract, keyDuckLevel(duckAssetId)), 0)
811832 let freePoints = valueOrElse(getInteger(stakingContract, keyDuckFreePoints(duckAssetId)), 0)
812833 let equipm = valueOrElse(getString(stakingContract, keyDuckEquipment(duckAssetId)), ";_;_;_;_;_;")
813834 let buffs = valueOrElse(getString(stakingContract, keyDuckBuffs(duckAssetId)), "0_0_0_0_0")
814- let $t060816186 = getRobberyData(stakingContract, duckAssetId)
815- let robCost = $t060816186._1
816- let lastRobTime = $t060816186._2
817- let duckState = $t060816186._3
818- let lockedLand = $t060816186._4
819- let landETA = $t060816186._5
835+ let $t064126517 = getRobberyData(stakingContract, duckAssetId)
836+ let robCost = $t064126517._1
837+ let lastRobTime = $t064126517._2
838+ let duckState = $t064126517._3
839+ let lockedLand = $t064126517._4
840+ let landETA = $t064126517._5
820841 [("%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))]
821842 }
822843
823844
824845 func landInfoArray (landAssetId,owner,stakedTime) = if ((landAssetId == ""))
825846 then throw("landAssetId is required")
826847 else {
827848 let a = value(assetInfo(fromBase58String(landAssetId)))
828849 let d = split(a.description, "_")
829850 let landNum = if ((a.quantity > 0))
830851 then d[recLandNum]
831852 else ("-" + d[recLandNum])
832853 let pieces = numPiecesBySize(d[recLandSize])
833854 let productivity = applyBonuses(landAssetId, pieces)
834855 let deltaTime = (lastBlock.timestamp - stakedTime)
835856 let availRes = if ((stakedTime > 0))
836857 then fraction(deltaTime, (productivity._3 * pieces), DAYMILLIS)
837858 else 0
838859 let needMat = fraction(InfraUpgradeCostS, (pieces * (productivity._1 + 1)), SSIZE)
839860 let globalAndLocal = if ((stakedTime > 0))
840861 then asSplitResult(invoke(stakingContract, "splitByGlobalAndLocalWeightsREADONLY", [needMat, availRes, d[recTerrains]], nil))
841862 else $Tuple2(asListIntCompacted(invoke(stakingContract, "splitByGlobalWeightsREADONLY", [needMat], nil)), "")
842863 let customName = valueOrElse(getString(stakingContract, keyLandAssetIdToCustomName(landAssetId)), ((d[recContinent] + "-") + d[recLandNum]))
843864 let fort = valueOrElse(getString(stakingContract, keyFortificationsByLand(landAssetId)), ":0_15:0_18:0")
844865 let state = valueOrElse(getInteger(stakingContract, keyLandRobberyState(landAssetId)), 0)
845866 let cooldownETA = valueOrElse(getInteger(stakingContract, keyLandCooldownETA(landAssetId)), 0)
846867 [("%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))]
847868 }
848869
849870
850871 func landOrderInfoArray (landAssetId,owner) = if ((landAssetId == ""))
851872 then throw("landAssetId is required")
852873 else {
853874 let a = value(assetInfo(fromBase58String(landAssetId)))
854875 let d = split(a.description, "_")
855876 let pieces = numPiecesBySize(d[recLandSize])
856877 let productivity = applyBonuses(landAssetId, pieces)
857878 [("%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:"))]
858879 }
859880
860881
861882 func slotEffect (slot) = if ((slot == ""))
862883 then 0
863884 else {
864885 let slot0 = split(slot, ",")[0]
865886 if ((slot0 == ""))
866887 then 0
867888 else {
868889 let prod = split(slot0, ":")
869890 if (if ((prod[1] == ""))
870891 then true
871892 else (parseIntValue(prod[1]) == 0))
872893 then 0
873894 else parseIntValue(split(productionMatrix[parseIntValue(prod[0])], "_")[rIdxEffect])
874895 }
875896 }
876897
877898
878899 @Callable(i)
879900 func constructorV1 (contracts) = if ((i.caller != this))
880901 then throw("permissions denied")
881902 else {
882903 func descriptor (acc,ignoredItem) = (acc + "%s")
883904
884905 let descr = {
885906 let $l = contracts
886907 let $s = size($l)
887908 let $acc0 = ""
888909 func $f0_1 ($a,$i) = if (($i >= $s))
889910 then $a
890911 else descriptor($a, $l[$i])
891912
892913 func $f0_2 ($a,$i) = if (($i >= $s))
893914 then $a
894915 else throw("List size exceeds 10")
895916
896917 $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)
897918 }
898919 [StringEntry(keyRestCfg(), makeString(descr :: contracts, SEP)), StringEntry(keyRestAddress(), toString(this))]
899920 }
900921
901922
902923
903924 @Callable(i)
904925 func walletInfoREADONLY (userAddressOpt) = $Tuple2(nil, walletInternal(userAddressOpt))
905926
906927
907928
908929 @Callable(i)
909930 func duckByOwnerInfoREADONLY (userAddress) = {
910931 let stakedDuck = getString(stakingContract, keyStakedDuckByOwner(userAddress))
911932 $Tuple2(nil, if (if (isDefined(addressFromString(userAddress)))
912933 then isDefined(stakedDuck)
913934 else false)
914935 then {
915936 let duckAssetId = value(stakedDuck)
916937 duckInfoArray(duckAssetId, userAddress, duckInfoTuple(duckAssetId))
917938 }
918939 else duckInfoArray("", userAddress, $Tuple5(-1, "", "", -1, "")))
919940 }
920941
921942
922943
923944 @Callable(i)
924945 func duckByAssetIdInfoREADONLY (duckAssetId) = {
925946 let owner = getString(stakingContract, keyDuckIdToOwner(duckAssetId))
926947 $Tuple2(nil, duckInfoArray(duckAssetId, if (isDefined(owner))
927948 then value(owner)
928949 else "", duckInfoTuple(duckAssetId)))
929950 }
930951
931952
932953
933954 @Callable(i)
934955 func ducksByIdsInfoREADONLY (duckAssetIds) = {
935956 func oneDuck (acc,duckAssetId) = if ((duckAssetId == ""))
936957 then throw("duckAssetId is required")
937958 else {
938959 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(duckAssetId)), -1)
939960 let owner = if ((stakedTime > 0))
940961 then value(getString(stakingContract, keyDuckIdToOwner(duckAssetId)))
941962 else ""
942963 (acc :+ duckInfoArray(duckAssetId, owner, duckInfoTuple(duckAssetId)))
943964 }
944965
945966 let r = {
946967 let $l = duckAssetIds
947968 let $s = size($l)
948969 let $acc0 = nil
949970 func $f0_1 ($a,$i) = if (($i >= $s))
950971 then $a
951972 else oneDuck($a, $l[$i])
952973
953974 func $f0_2 ($a,$i) = if (($i >= $s))
954975 then $a
955976 else throw("List size exceeds 100")
956977
957978 $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)
958979 }
959980 $Tuple2(nil, r)
960981 }
961982
962983
963984
964985 @Callable(i)
965986 func landByAssetIdInfoREADONLY (landAssetId) = if ((landAssetId == ""))
966987 then throw("landAssetId is required")
967988 else {
968989 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
969990 let owner = if ((stakedTime > 0))
970991 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
971992 else ""
972993 $Tuple2(nil, landInfoArray(landAssetId, owner, stakedTime))
973994 }
974995
975996
976997
977998 @Callable(i)
978999 func stakedLandsByOwnerInfoREADONLY (landOwnerAddress) = if ((landOwnerAddress == ""))
9791000 then throw("landOwnerAddress is required")
9801001 else {
9811002 let landsStr = getString(stakingContract, keyStakedLandsByOwner(landOwnerAddress))
9821003 let lands = if (isDefined(landsStr))
9831004 then split_51C(value(landsStr), "_")
9841005 else nil
9851006 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
9861007 then throw("landAssetId is required")
9871008 else {
9881009 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
9891010 (acc :+ landInfoArray(landAssetId, landOwnerAddress, stakedTime))
9901011 }
9911012
9921013 let r = {
9931014 let $l = lands
9941015 let $s = size($l)
9951016 let $acc0 = nil
9961017 func $f0_1 ($a,$i) = if (($i >= $s))
9971018 then $a
9981019 else oneLand($a, $l[$i])
9991020
10001021 func $f0_2 ($a,$i) = if (($i >= $s))
10011022 then $a
10021023 else throw("List size exceeds 100")
10031024
10041025 $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)
10051026 }
10061027 $Tuple2(nil, r)
10071028 }
10081029
10091030
10101031
10111032 @Callable(i)
10121033 func landsByIdsInfoREADONLY (landAssetIds) = {
10131034 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
10141035 then throw("landAssetId is required")
10151036 else {
10161037 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
10171038 let owner = if ((stakedTime > 0))
10181039 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
10191040 else ""
10201041 (acc :+ landInfoArray(landAssetId, owner, stakedTime))
10211042 }
10221043
10231044 let r = {
10241045 let $l = landAssetIds
10251046 let $s = size($l)
10261047 let $acc0 = nil
10271048 func $f0_1 ($a,$i) = if (($i >= $s))
10281049 then $a
10291050 else oneLand($a, $l[$i])
10301051
10311052 func $f0_2 ($a,$i) = if (($i >= $s))
10321053 then $a
10331054 else throw("List size exceeds 100")
10341055
10351056 $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)
10361057 }
10371058 $Tuple2(nil, r)
10381059 }
10391060
10401061
10411062
10421063 @Callable(i)
10431064 func warehouseOrderByAssetIdInfoREADONLY (landAssetId) = if ((landAssetId == ""))
10441065 then throw("landAssetId is required")
10451066 else {
10461067 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
10471068 let owner = if ((stakedTime > 0))
10481069 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
10491070 else ""
10501071 $Tuple2(nil, landOrderInfoArray(landAssetId, owner))
10511072 }
10521073
10531074
10541075
10551076 @Callable(i)
10561077 func ordersByLandIdsInfoREADONLY (landAssetIds) = {
10571078 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
10581079 then throw("landAssetId is required")
10591080 else {
10601081 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
10611082 let owner = if ((stakedTime > 0))
10621083 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
10631084 else ""
10641085 (acc :+ landOrderInfoArray(landAssetId, owner))
10651086 }
10661087
10671088 let r = {
10681089 let $l = landAssetIds
10691090 let $s = size($l)
10701091 let $acc0 = nil
10711092 func $f0_1 ($a,$i) = if (($i >= $s))
10721093 then $a
10731094 else oneLand($a, $l[$i])
10741095
10751096 func $f0_2 ($a,$i) = if (($i >= $s))
10761097 then $a
10771098 else throw("List size exceeds 40")
10781099
10791100 $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)
10801101 }
10811102 $Tuple2(nil, r)
10821103 }
10831104
10841105
10851106
10861107 @Callable(i)
10871108 func cancelWarehouseOrders (landAssetIds) = if ((i.caller != this))
10881109 then throw("permission denied")
10891110 else {
10901111 let blocked = getBoolean(stakingContract, keyBlocked())
10911112 if (if (!(isDefined(blocked)))
10921113 then true
10931114 else (value(blocked) == false))
10941115 then throw("Contracts should be blocked before canceling orders")
10951116 else {
10961117 func oneLand (a,landAssetId) = if ((landAssetId == ""))
10971118 then throw("landAssetId is required")
10981119 else {
10991120 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
11001121 if (if (a)
11011122 then true
11021123 else c)
11031124 then !(if (a)
11041125 then c
11051126 else false)
11061127 else false
11071128 }
11081129
11091130 let r = {
11101131 let $l = landAssetIds
11111132 let $s = size($l)
11121133 let $acc0 = false
11131134 func $f0_1 ($a,$i) = if (($i >= $s))
11141135 then $a
11151136 else oneLand($a, $l[$i])
11161137
11171138 func $f0_2 ($a,$i) = if (($i >= $s))
11181139 then $a
11191140 else throw("List size exceeds 30")
11201141
11211142 $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)
11221143 }
11231144 $Tuple2(nil, r)
11241145 }
11251146 }
11261147
11271148
11281149
11291150 @Callable(i)
11301151 func fixWarehouseFormats (landAssetIds) = if ((i.caller != this))
11311152 then throw("permission denied")
11321153 else {
11331154 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
11341155 then throw("landAssetId is required")
11351156 else (acc + size(asString(invoke(stakingContract, "fixWarehouseFormat", [landAssetId], nil))))
11361157
11371158 let r = {
11381159 let $l = landAssetIds
11391160 let $s = size($l)
11401161 let $acc0 = 0
11411162 func $f0_1 ($a,$i) = if (($i >= $s))
11421163 then $a
11431164 else oneLand($a, $l[$i])
11441165
11451166 func $f0_2 ($a,$i) = if (($i >= $s))
11461167 then $a
11471168 else throw("List size exceeds 25")
11481169
11491170 $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($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)
11501171 }
11511172 $Tuple2(nil, r)
11521173 }
11531174
11541175
11551176
11561177 @Callable(i)
11571178 func fixStakedPieces (users) = if ((i.caller != this))
11581179 then throw("permission denied")
11591180 else {
11601181 func oneUser (acc,addr) = if ((addr == ""))
11611182 then throw("address is required")
11621183 else (acc + asInt(invoke(stakingContract, "fixStakedPieces", [addr], nil)))
11631184
11641185 let r = {
11651186 let $l = users
11661187 let $s = size($l)
11671188 let $acc0 = 0
11681189 func $f0_1 ($a,$i) = if (($i >= $s))
11691190 then $a
11701191 else oneUser($a, $l[$i])
11711192
11721193 func $f0_2 ($a,$i) = if (($i >= $s))
11731194 then $a
11741195 else throw("List size exceeds 16")
11751196
11761197 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
11771198 }
11781199 $Tuple2(nil, r)
11791200 }
11801201
11811202
11821203
11831204 @Callable(i)
11841205 func fixStakedLands (landAssetIds) = {
11851206 let caller = toString(i.caller)
11861207 if (!(containsElement(adminsList, caller)))
11871208 then throw("Permission denied")
11881209 else {
11891210 let r = asInt(invoke(stakingContract, "fixContinentProportions", [landAssetIds], nil))
11901211 $Tuple2(nil, r)
11911212 }
11921213 }
11931214
11941215
11951216
11961217 @Callable(i)
11971218 func sendUsdtPrize (userAddress) = if ((i.caller != stakingContract))
11981219 then throw("permission denied")
11991220 else {
12001221 let amt = fraction(assetBalance(this, usdtAssetId), USDTPRIZEPART, MULT6)
12011222 $Tuple2([ScriptTransfer(addressFromStringValue(userAddress), amt, usdtAssetId)], amt)
12021223 }
12031224
12041225
12051226
12061227 @Callable(i)
12071228 func getEmergencyServiceDataREADONLY () = {
12081229 let existStr = getString(economyContract, keyEsWarehouse())
12091230 let existAmounts = if (isDefined(existStr))
12101231 then split_4C(value(existStr), "_")
12111232 else nil
12121233 func singleProd (acc,recipeStr) = {
12131234 let n = acc._2
12141235 let recipe = split(recipeStr, "_")
12151236 let maxAmount = if ((n == 0))
12161237 then (ESMAXPACKAGES * PRODUCTPKGSIZE)
12171238 else 0
12181239 let existAmount = if ((size(existAmounts) > n))
12191240 then parseIntValue(existAmounts[n])
12201241 else 0
12211242 let totalMat = getRecipeMaterials(recipe)
12221243 let buyPrice = fraction((totalMat * ESBUYCOEF), RESOURCEPRICEMIN, (MULT8 * PRODUCTPKGSIZE))
12231244 let sellPrice = fraction((totalMat * ESSELLCOEF), RESOURCEPRICEMIN, (MULT8 * PRODUCTPKGSIZE))
12241245 let y = makeString([toString(maxAmount), toString(existAmount), toString(buyPrice), toString(sellPrice)], "_")
12251246 $Tuple2((acc._1 :+ y), (n + 1))
12261247 }
12271248
12281249 let s = makeString_2C(( let $l = productionMatrix
12291250 let $s = size($l)
12301251 let $acc0 = $Tuple2(nil, 0)
12311252 func $f0_1 ($a,$i) = if (($i >= $s))
12321253 then $a
12331254 else singleProd($a, $l[$i])
12341255
12351256 func $f0_2 ($a,$i) = if (($i >= $s))
12361257 then $a
12371258 else throw("List size exceeds 50")
12381259
12391260 $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, ":")
12401261 let result = ("%s%s__emergencyServiceData__" + s)
12411262 $Tuple2(nil, result)
12421263 }
12431264
12441265
12451266
12461267 @Callable(i)
12471268 func wlgStatsREADONLY (userAddrOpt) = {
12481269 let curStats = getWlgStats(userAddrOpt, [restContract, stakingContract, economyContract, wlgContract, puzzlePoolContract, investFundContract, acresContract], usdtAssetId, 0, MULT6)
1249- let virtLevelPoints = {
1250- let @ = invoke(wlgContract, "checkWlgXpREADONLY", [userAddrOpt], nil)
1251- if ($isInstanceOf(@, "List[Any]"))
1252- then @
1253- else throw(($getType(@) + " couldn't be cast to List[Any]"))
1254- }
1255- $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])), ("%s%d__wlgStakeVirtLevel__" + toString({
1256- let @ = virtLevelPoints[0]
1257- if ($isInstanceOf(@, "Int"))
1258- then @
1259- else throw(($getType(@) + " couldn't be cast to Int"))
1260- })), ("%s%d__wlgStakeVirtPoints__" + toString({
1261- let @ = virtLevelPoints[1]
1262- if ($isInstanceOf(@, "Int"))
1263- then @
1264- else throw(($getType(@) + " couldn't be cast to Int"))
1265- }))])
1270+ $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]))])
12661271 }
12671272
12681273
12691274
12701275 @Callable(i)
12711276 func tournamentStatsREADONLY (tournamentId) = {
12721277 let tData = getTourData(tournamentContract, tournamentId)
12731278 let static = tData[idxStatic]
12741279 let dynamic = tData[idxDynamic]
12751280 let leaders = if ((dynamic[tDynamicLeaders] == ""))
12761281 then " "
12771282 else dynamic[tDynamicLeaders]
12781283 let scoreBoard = valueOrElse(getString(tournamentContract, keyScoreBoardByTour(tournamentId)), "")
12791284 let numGrands = if ((size(static) > tStaticNumGrands))
12801285 then static[tStaticNumGrands]
12811286 else "0"
12821287 let prizeFund = if ((size(static) > tStaticPrizeFund))
12831288 then static[tStaticPrizeFund]
12841289 else "0"
12851290 $Tuple2(nil, [("%s%s__tournamentStaticData__" + makeString([static[tStaticRegisterCost], static[tStaticAttemptCost], static[tStaticStart], static[tStaticEnd], numGrands, prizeFund], "_")), ("%s%s__tournamentDynamicData__" + makeString_2C([dynamic[tDynamicStatus], leaders, dynamic[tDynamicWinResult], dynamic[tDynamicTotalRegCount], dynamic[tDynamicTotalAttempts]], "_")), ("%s%s__tournamentScoreBoard__" + scoreBoard)])
12861291 }
12871292
12881293
12891294
12901295 @Callable(i)
12911296 func lastTournamentStatsREADONLY () = {
12921297 let tournamentId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
12931298 let static = split(valueOrElse(getString(tournamentContract, keyTourStaticDataById(tournamentId)), "%s%d%d%d%d%d%d______________"), SEP)
12941299 let dynamic = split(valueOrElse(getString(tournamentContract, keyTourDynamicDataById(tournamentId)), "%s%s%d%d%d__________"), SEP)
12951300 let leaders = if ((dynamic[tDynamicLeaders] == ""))
12961301 then " "
12971302 else dynamic[tDynamicLeaders]
12981303 let scoreBoard = valueOrElse(getString(tournamentContract, keyScoreBoardByTour(tournamentId)), "")
12991304 let numGrands = if ((size(static) > tStaticNumGrands))
13001305 then static[tStaticNumGrands]
13011306 else "0"
13021307 let prizeFund = if ((size(static) > tStaticPrizeFund))
13031308 then static[tStaticPrizeFund]
13041309 else "0"
13051310 $Tuple2(nil, [("%s%s__lastTournamentId__" + toString(tournamentId)), ("%s%s__tournamentStaticData__" + makeString([static[tStaticRegisterCost], static[tStaticAttemptCost], static[tStaticStart], static[tStaticEnd], numGrands, prizeFund], "_")), ("%s%s__tournamentDynamicData__" + makeString_2C([dynamic[tDynamicStatus], leaders, dynamic[tDynamicWinResult], dynamic[tDynamicTotalRegCount], dynamic[tDynamicTotalAttempts]], "_")), ("%s%s__tournamentScoreBoard__" + scoreBoard)])
13061311 }
13071312
13081313
13091314
13101315 @Callable(i)
13111316 func tournamentDuckStatsREADONLY (tId,duckAssetId) = {
13121317 let isDuckReg = valueOrElse(getBoolean(tournamentContract, keyIsRegisteredByTourAndDuck(tId, duckAssetId)), false)
13131318 let lastDuckAttempt = valueOrElse(getInteger(tournamentContract, keyLastAttemptByTourAndDuck(tId, duckAssetId)), -1)
13141319 let bestDuckResult = valueOrElse(getInteger(tournamentContract, keyBestResultByTourAndDuck(tId, duckAssetId)), 0)
13151320 let bestDuckTx = valueOrElse(getString(tournamentContract, keyBestTxByTourAndDuck(tId, duckAssetId)), "")
13161321 let isAwarded = valueOrElse(getBoolean(tournamentContract, keyIsAwardedByTourAndDuck(tId, duckAssetId)), false)
13171322 $Tuple2(nil, [("%s%s__tournamentDuckStats__" + makeString([toString(isDuckReg), toString(lastDuckAttempt), toString(bestDuckResult), bestDuckTx, toString(isAwarded)], "_"))])
13181323 }
13191324
13201325
13211326
13221327 @Callable(i)
13231328 func duckStatsCalculatorREADONLY (duckAssetId) = {
13241329 let chars = split(valueOrElse(getString(stakingContract, keyDuckChars(duckAssetId)), "0_0_0_0_0"), "_")
13251330 let buffs = split(valueOrElse(getString(stakingContract, keyDuckBuffs(duckAssetId)), "0_0_0_0_0"), "_")
13261331 let equipm = split(valueOrElse(getString(stakingContract, keyDuckEquipment(duckAssetId)), ";_;_;_;_;_;"), "_")
13271332 let equipmentPerc = slotEffect(split(equipm[segBack], ";")[1])
13281333 let equipmentAbsor = slotEffect(split(equipm[segBelt], ";")[0])
13291334 let dodge = dodgeProbability(chars, buffs, equipmentPerc)
13301335 let absorb = damageAbsorption(chars, buffs, equipmentAbsor)
13311336 $Tuple2(nil, [("%s%d__dodgeProbability__" + toString(dodge)), ("%s%d__damageAbsorption__" + toString(absorb))])
13321337 }
13331338
13341339
13351340
13361341 @Callable(i)
13371342 func customDuckStatsCalculatorREADONLY (chars,buffs,equipmentPerc,equipmentAbsor) = {
13381343 let dodge = dodgeProbability(chars, buffs, equipmentPerc)
13391344 let absorb = damageAbsorption(chars, buffs, equipmentAbsor)
13401345 $Tuple2(nil, [("%s%d__dodgeProbability__" + toString(dodge)), ("%s%d__damageAbsorption__" + toString(absorb))])
13411346 }
13421347
13431348
13441349
13451350 @Callable(i)
13461351 func acresStatsREADONLY (userAddrOpt) = {
13471352 let userClaim = asAnyList(invoke(acresContract, "claimAcresREADONLY", [userAddrOpt], nil))
13481353 let userClaimable = asInt(userClaim[0])
13491354 let userLastTime = asInt(userClaim[1])
13501355 $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))])
13511356 }
13521357
13531358

github/deemru/w8io/026f985 
204.78 ms