tx · 9KMituUYfXsn6htFApR24AaByNniYKNSNfPgGJXNoBnx

3P2dNLAf9SGKqmeYDQ7btHeDot7mj13nAHr:  -0.01000000 Waves

2021.09.17 09:06 [2771580] smart account 3P2dNLAf9SGKqmeYDQ7btHeDot7mj13nAHr > SELF 0.00000000 Waves

{ "type": 13, "id": "9KMituUYfXsn6htFApR24AaByNniYKNSNfPgGJXNoBnx", "fee": 1000000, "feeAssetId": null, "timestamp": 1631858795891, "version": 2, "chainId": 87, "sender": "3P2dNLAf9SGKqmeYDQ7btHeDot7mj13nAHr", "senderPublicKey": "J3RgBo1V9KDT8g4zRrYW2JqSVrJfR4CJePWznFw2Kyb7", "proofs": [ "5Yi6fZXdbFTbKb6s8Kw5Tp8pVTMRm1vG81YNf4mcauid9kGUc2Dr3vc2SXvA6nsGw5UTxSnb8ZFTuPaqoiRzQqg9" ], "script": "base64:AAIFAAAAAAAAACkIAhIECgIBBBIAEgQKAggIEgASBQoDAQEIEgUKAwEBCBIFCgMIAQgSAAAAADgAAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAB0FkZHJlc3MAAAABAQAAABoBV0wTJrgH4EiUrEwO/qJZES8cp3nZ0FA+jAAAAAAKbFBkZWNpbWFscwAAAAAAAAAACAAAAAAGc2NhbGU4AAAAAAAF9eEAAAAAAAdzY2FsZTE4CQABNgAAAAEADeC2s6dkAAAAAAAAA1NFUAIAAAACX18AAAAAClBvb2xBY3RpdmUAAAAAAAAAAAEAAAAAD1Bvb2xQdXREaXNhYmxlZAAAAAAAAAAAAgAAAAATUG9vbE1hdGNoZXJEaXNhYmxlZAAAAAAAAAAAAwAAAAAMUG9vbFNodXRkb3duAAAAAAAAAAAEAAAAAA5pZHhQb29sQWRkcmVzcwAAAAAAAAAAAQAAAAANaWR4UG9vbFN0YXR1cwAAAAAAAAAAAgAAAAAQaWR4UG9vbExQQXNzZXRJZAAAAAAAAAAAAwAAAAAQaWR4QW1vdW50QXNzZXRJZAAAAAAAAAAABAAAAAAPaWR4UHJpY2VBc3NldElkAAAAAAAAAAAFAAAAABZpZHhBbW91bnRBc3NldERlY2ltYWxzAAAAAAAAAAAGAAAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMAAAAAAAAAAAcAAAAAGGlkeEFtb3VudEFzc2V0SW50ZXJuYWxJZAAAAAAAAAAACAAAAAAXaWR4UHJpY2VBc3NldEludGVybmFsSWQAAAAAAAAAAAkAAAAAEmlkeExQQXNzZXREZWNpbWFscwAAAAAAAAAACgAAAAATaWR4TWF0Y2hlclB1YmxpY0tleQAAAAAAAAAACwAAAAAVaWR4UG9vbEFtb3VudEFzc2V0QW10AAAAAAAAAAABAAAAABRpZHhQb29sUHJpY2VBc3NldEFtdAAAAAAAAAAAAgAAAAARaWR4UG9vbExQQXNzZXRBbXQAAAAAAAAAAAMAAAAAGWlkeEZhY3RvcnlTdGFraW5nQ29udHJhY3QAAAAAAAAAAAEAAAAAGGlkeEZhY3RvcnlCb29zdGluZ0NvbmZpZwAAAAAAAAAAAgEAAAAMa2V5UHJpY2VMYXN0AAAAAAIAAAARJXMlc19fcHJpY2VfX2xhc3QBAAAAD2tleVByaWNlSGlzdG9yeQAAAAIAAAABaAAAAAl0aW1lc3RhbXAJAAS5AAAAAgkABEwAAAACAgAAABglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAARMAAAAAgkAAaQAAAABBQAAAAFoCQAETAAAAAIJAAGkAAAAAQUAAAAJdGltZXN0YW1wBQAAAANuaWwFAAAAA1NFUAEAAAAQa2V5UG9vbExpcXVpZGl0eQAAAAIAAAATaW50ZXJuYWxBbW91bnRBc3NldAAAABJpbnRlcm5hbFByaWNlQXNzZXQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIJWQlZCVzX18FAAAAE2ludGVybmFsQW1vdW50QXNzZXQCAAAAAl9fBQAAABJpbnRlcm5hbFByaWNlQXNzZXQCAAAACF9fbG9ja2VkAQAAABZrZXlQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwAAABNpbnRlcm5hbEFtb3VudEFzc2V0AAAAEmludGVybmFsUHJpY2VBc3NldAAAAAt1c2VyQWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAKJWQlZCVzJXNfXwUAAAATaW50ZXJuYWxBbW91bnRBc3NldAIAAAACX18FAAAAEmludGVybmFsUHJpY2VBc3NldAIAAAACX18FAAAAC3VzZXJBZGRyZXNzAgAAAAhfX2xvY2tlZAEAAAASa2V5UHV0QWN0aW9uQnlVc2VyAAAAAgAAAAt1c2VyQWRkcmVzcwAAAAR0eElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAslcyVzJXNfX1BfXwUAAAALdXNlckFkZHJlc3MCAAAAAl9fBQAAAAR0eElkAQAAABJrZXlHZXRBY3Rpb25CeVVzZXIAAAACAAAAC3VzZXJBZGRyZXNzAAAABHR4SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACyVzJXMlc19fR19fBQAAAAt1c2VyQWRkcmVzcwIAAAACX18FAAAABHR4SWQBAAAADmtleUFtb3VudEFzc2V0AAAAAAIAAAAPJXNfX2Ftb3VudEFzc2V0AQAAAA1rZXlQcmljZUFzc2V0AAAAAAIAAAAOJXNfX3ByaWNlQXNzZXQBAAAAEGtleUZhY3RvcnlDb25maWcAAAAAAgAAABElc19fZmFjdG9yeUNvbmZpZwEAAAApa2V5TWFwcGluZ1Bvb2xDb250cmFjdEFkZHJlc3NUb1Bvb2xBc3NldHMAAAABAAAAE3Bvb2xDb250cmFjdEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAAAglcyVzJXNfXwUAAAATcG9vbENvbnRyYWN0QWRkcmVzcwIAAAAgX19tYXBwaW5nc19fcG9vbENvbnRyYWN0MkxwQXNzZXQBAAAADWtleVBvb2xDb25maWcAAAACAAAAE2Ftb3VudEFzc2V0SW50ZXJuYWwAAAAScHJpY2VBc3NldEludGVybmFsCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACCVkJWQlc19fBQAAABNhbW91bnRBc3NldEludGVybmFsAgAAAAJfXwUAAAAScHJpY2VBc3NldEludGVybmFsAgAAAAhfX2NvbmZpZwEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEAAAAMYmFzZUFzc2V0U3RyCQABLAAAAAICAAAAKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAAAADGJhc2VBc3NldFN0cgEAAAATa2V5QWxsUG9vbHNTaHV0ZG93bgAAAAACAAAADCVzX19zaHV0ZG93bgEAAAANa2V5UG9vbFdlaWdodAAAAAEAAAAPY29udHJhY3RBZGRyZXNzCQABLAAAAAICAAAAEiVzJXNfX3Bvb2xXZWlnaHRfXwUAAAAPY29udHJhY3RBZGRyZXNzAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABNrZXlBbGxQb29sc1NodXRkb3duAAAAAAcBAAAADWdldFBvb2xDb25maWcAAAAABAAAAA9wb29sQW1vdW50QXNzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAAOa2V5QW1vdW50QXNzZXQAAAAAAgAAACBObyBjb25maWcgZm9yIGFtb3VudCBhc3NldCBmb3VuZAQAAAAOcG9vbFByaWNlQXNzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAANa2V5UHJpY2VBc3NldAAAAAACAAAAH05vIGNvbmZpZyBmb3IgcHJpY2UgYXNzZXQgZm91bmQEAAAAFnBvb2xQcmljZUFzc2V0SW50ZXJuYWwJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAAB9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkAAAAAQUAAAAOcG9vbFByaWNlQXNzZXQCAAAAKE5vIGNvbmZpZyBmb3IgaW50ZXJuYWwgcHJpY2UgYXNzZXQgZm91bmQEAAAAF3Bvb2xBbW91bnRBc3NldEludGVybmFsCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEFAAAAD3Bvb2xBbW91bnRBc3NldAIAAAApTm8gY29uZmlnIGZvciBpbnRlcm5hbCBhbW91bnQgYXNzZXQgZm91bmQJAAS1AAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAADWtleVBvb2xDb25maWcAAAACCQABpAAAAAEFAAAAF3Bvb2xBbW91bnRBc3NldEludGVybmFsCQABpAAAAAEFAAAAFnBvb2xQcmljZUFzc2V0SW50ZXJuYWwCAAAAKE5vIGZhY3RvcnkgY29uZmlnIGZvdW5kIGZvciBwb29sIGFzc2V0cy4FAAAAA1NFUAEAAAAQZ2V0RmFjdG9yeUNvbmZpZwAAAAAJAAS1AAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAEGtleUZhY3RvcnlDb25maWcAAAAAAgAAABhObyBmYWN0b3J5IGNvbmZpZyBmb3VuZC4FAAAAA1NFUAEAAAAQZ2V0UG9vbExpcXVpZGl0eQAAAAIAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBAAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlCQAEHQAAAAIFAAAABHRoaXMJAQAAABBrZXlQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAMJAQAAAAlpc0RlZmluZWQAAAABBQAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlCQAEtQAAAAIJAQAAAAV2YWx1ZQAAAAEFAAAAGWN1cnJlbnRQb29sTGlxdWlkaXR5VmFsdWUFAAAAA1NFUAkABEwAAAACAgAAAAAJAARMAAAAAgIAAAABMAkABEwAAAACAgAAAAEwCQAETAAAAAICAAAAATAFAAAAA25pbAEAAAAWZ2V0UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkAAAAC3VzZXJBZGRyZXNzBAAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlCQAEHQAAAAIFAAAABHRoaXMJAQAAABZrZXlQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAUAAAALdXNlckFkZHJlc3MDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAAZY3VycmVudFBvb2xMaXF1aWRpdHlWYWx1ZQkABLUAAAACCQEAAAAFdmFsdWUAAAABBQAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlBQAAAANTRVAJAARMAAAAAgIAAAAACQAETAAAAAICAAAAATAJAARMAAAAAgIAAAABMAkABEwAAAACAgAAAAEwCQAETAAAAAICAAAAATAFAAAAA25pbAEAAAARZGF0YVBvb2xMaXF1aWRpdHkAAAADAAAAEWFtb3VudEFzc2V0TG9ja2VkAAAAEHByaWNlQXNzZXRMb2NrZWQAAAANbHBUb2tlbkxvY2tlZAkABLkAAAACCQAETAAAAAICAAAABiVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAEWFtb3VudEFzc2V0TG9ja2VkCQAETAAAAAIJAAGkAAAAAQUAAAAQcHJpY2VBc3NldExvY2tlZAkABEwAAAACCQABpAAAAAEFAAAADWxwVG9rZW5Mb2NrZWQFAAAAA25pbAUAAAADU0VQAQAAABdkYXRhUG9vbExpcXVpZGl0eUJ5VXNlcgAAAAQAAAARYW1vdW50QXNzZXRMb2NrZWQAAAAQcHJpY2VBc3NldExvY2tlZAAAAA1scFRva2VuTG9ja2VkAAAAC3VzZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAGJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAARYW1vdW50QXNzZXRMb2NrZWQJAARMAAAAAgkAAaQAAAABBQAAABBwcmljZUFzc2V0TG9ja2VkCQAETAAAAAIJAAGkAAAAAQUAAAANbHBUb2tlbkxvY2tlZAUAAAADbmlsBQAAAANTRVABAAAAEWRhdGFQdXRBY3Rpb25JbmZvAAAACAAAABBpbkFtb3VudEFzc2V0QW10AAAAD2luUHJpY2VBc3NldEFtdAAAAAhvdXRMcEFtdAAAAAVwcmljZQAAAB1zbGlwcGFnZVRvbGVyYW5jZVBhc3NlZEJ5VXNlcgAAABVzbGlwcGFnZVRvbGVyYW5jZVJlYWwAAAAIdHhIZWlnaHQAAAALdHhUaW1lc3RhbXAJAAS5AAAAAgkABEwAAAACAgAAAA4lZCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAEGluQW1vdW50QXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAAA9pblByaWNlQXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAAAhvdXRMcEFtdAkABEwAAAACCQABpAAAAAEFAAAABXByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAdc2xpcHBhZ2VUb2xlcmFuY2VQYXNzZWRCeVVzZXIJAARMAAAAAgkAAaQAAAABBQAAABVzbGlwcGFnZVRvbGVyYW5jZVJlYWwJAARMAAAAAgkAAaQAAAABBQAAAAh0eEhlaWdodAkABEwAAAACCQABpAAAAAEFAAAAC3R4VGltZXN0YW1wBQAAAANuaWwFAAAAA1NFUAEAAAARZGF0YUdldEFjdGlvbkluZm8AAAAGAAAAEW91dEFtb3VudEFzc2V0QW10AAAAEG91dFByaWNlQXNzZXRBbXQAAAAHaW5McEFtdAAAAAVwcmljZQAAAAh0eEhlaWdodAAAAAt0eFRpbWVzdGFtcAkABLkAAAACCQAETAAAAAICAAAADCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAEW91dEFtb3VudEFzc2V0QW10CQAETAAAAAIJAAGkAAAAAQUAAAAQb3V0UHJpY2VBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAB2luTHBBbXQJAARMAAAAAgkAAaQAAAABBQAAAAVwcmljZQkABEwAAAACCQABpAAAAAEFAAAACHR4SGVpZ2h0CQAETAAAAAIJAAGkAAAAAQUAAAALdHhUaW1lc3RhbXAFAAAAA25pbAUAAAADU0VQAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMAAAAGYW1vdW50AAAAC3Jlc3VsdFNjYWxlAAAADGN1cnJlbnRTY2FsZQkAAGsAAAADBQAAAAZhbW91bnQFAAAAC3Jlc3VsdFNjYWxlBQAAAAxjdXJyZW50U2NhbGUBAAAADmNhbGN1bGF0ZVByaWNlAAAAAgAAABNwcmljZUFzc2V0TG9ja2VkQW10AAAAFWFtb3VudEFzc2V0bExvY2tlZEFtdAkAAGsAAAADBQAAABNwcmljZUFzc2V0TG9ja2VkQW10BQAAAAZzY2FsZTgFAAAAFWFtb3VudEFzc2V0bExvY2tlZEFtdAEAAAAVcHJpdmF0ZUNhbGN1bGF0ZVByaWNlAAAABAAAABJhbW91dEFzc2V0RGVjaW1hbHMAAAAScHJpY2VBc3NldERlY2ltYWxzAAAADmFtb3VudEFzc2V0QW10AAAADXByaWNlQXNzZXRBbXQEAAAAFGFtb3VudEFzc2V0QW10Q2FzdGVkCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAAA5hbW91bnRBc3NldEFtdAUAAAAGc2NhbGU4BQAAABJhbW91dEFzc2V0RGVjaW1hbHMEAAAAE3ByaWNlQXNzZXRBbXRDYXN0ZWQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAADXByaWNlQXNzZXRBbXQFAAAABnNjYWxlOAUAAAAScHJpY2VBc3NldERlY2ltYWxzCQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABNwcmljZUFzc2V0QW10Q2FzdGVkBQAAABRhbW91bnRBc3NldEFtdENhc3RlZAEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQAAAAdhc3NldElkAwkAAAAAAAACBQAAAAdhc3NldElkAgAAAAVXQVZFUwgJAAPvAAAAAQUAAAAEdGhpcwAAAAlhdmFpbGFibGUJAAPwAAAAAgUAAAAEdGhpcwkAAlkAAAABBQAAAAdhc3NldElkAQAAAA9jYWxjdWxhdGVQcmljZXMAAAADAAAADmFtb3VudEFzc2V0QW10AAAADXByaWNlQXNzZXRBbXQAAAAIbHBBbW91bnQEAAAAEnBvb2xDb25maWdEYXRhTGlzdAkBAAAADWdldFBvb2xDb25maWcAAAAABAAAABJhbW91dEFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzBAAAAAlwb29sUHJpY2UJAQAAABVwcml2YXRlQ2FsY3VsYXRlUHJpY2UAAAAEBQAAABJhbW91dEFzc2V0RGVjaW1hbHMFAAAAEnByaWNlQXNzZXREZWNpbWFscwUAAAAOYW1vdW50QXNzZXRBbXQFAAAADXByaWNlQXNzZXRBbXQEAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAOYW1vdW50QXNzZXRBbXQFAAAABnNjYWxlOAUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAANcHJpY2VBc3NldEFtdAUAAAAGc2NhbGU4BQAAABJwcmljZUFzc2V0RGVjaW1hbHMEAAAAFGxwUHJpY2VJbkFtb3VudEFzc2V0CQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQFAAAACGxwQW1vdW50BAAAABNscFByaWNlSW5QcmljZUFzc2V0CQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAUAAAAIbHBBbW91bnQJAARMAAAAAgUAAAAJcG9vbFByaWNlCQAETAAAAAIFAAAAFGxwUHJpY2VJbkFtb3VudEFzc2V0CQAETAAAAAIFAAAAE2xwUHJpY2VJblByaWNlQXNzZXQFAAAAA25pbAEAAAAbcHJpdmF0ZUVzdGltYXRlR2V0T3BlcmF0aW9uAAAAAwAAABBwYXltZW50THBBc3NldElkAAAAD3BheW1lbnRMcEFtb3VudAAAAAt1c2VyQWRkcmVzcwQAAAAOcG9vbENvbmZpZ0xpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABBpZHhQb29sTFBBc3NldElkBAAAAA1hbW91bnRBc3NldElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABBpZHhBbW91bnRBc3NldElkBAAAAAxwcmljZUFzc2V0SWQJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABdpZHhQcmljZUFzc2V0SW50ZXJuYWxJZAQAAAASYW1vdXRBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMEAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAADWlkeFBvb2xTdGF0dXMEAAAAEXVzZXJMaXF1aWRpdHlMaXN0CQEAAAAWZ2V0UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQFAAAAC3VzZXJBZGRyZXNzBAAAAA11c2VyTFBCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARdXNlckxpcXVpZGl0eUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10BAAAABZ1c2VyQW1vdW50QXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARdXNlckxpcXVpZGl0eUxpc3QFAAAAFWlkeFBvb2xBbW91bnRBc3NldEFtdAQAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARdXNlckxpcXVpZGl0eUxpc3QFAAAAFGlkeFBvb2xQcmljZUFzc2V0QW10BAAAABFwb29sTGlxdWlkaXR5TGlzdAkBAAAAEGdldFBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBAAAAA1wb29sTFBCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARcG9vbExpcXVpZGl0eUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10BAAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARcG9vbExpcXVpZGl0eUxpc3QFAAAAFWlkeFBvb2xBbW91bnRBc3NldEFtdAQAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARcG9vbExpcXVpZGl0eUxpc3QFAAAAFGlkeFBvb2xQcmljZUFzc2V0QW10AwkBAAAAAiE9AAAAAgUAAAAJbHBBc3NldElkBQAAABBwYXltZW50THBBc3NldElkCQAAAgAAAAECAAAAFUludmFsaWQgYXNzZXQgcGFzc2VkLgQAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADWFtb3VudEFzc2V0SWQEAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADHByaWNlQXNzZXRJZAQAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10CQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlBQAAAAZzY2FsZTgFAAAAEmFtb3V0QXNzZXREZWNpbWFscwQAAAAXcHJpY2VBc3NldFBvb2xMb2NrZWRBbXQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQUAAAAGc2NhbGU4BQAAABJwcmljZUFzc2V0RGVjaW1hbHMEAAAAEW91dEFtb3VudEFzc2V0QW10CQAAawAAAAMFAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAUAAAAPcGF5bWVudExwQW1vdW50BQAAAA1wb29sTFBCYWxhbmNlBAAAABBvdXRQcmljZUFzc2V0QW10CQAAawAAAAMFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10BQAAAA9wYXltZW50THBBbW91bnQFAAAADXBvb2xMUEJhbGFuY2UEAAAAFm91dEFtb3VudEFzc2V0QW10RmluYWwJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAEW91dEFtb3VudEFzc2V0QW10BQAAABJhbW91dEFzc2V0RGVjaW1hbHMFAAAABnNjYWxlOAQAAAAVb3V0UHJpY2VBc3NldEFtdEZpbmFsCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABBvdXRQcmljZUFzc2V0QW10BQAAABJwcmljZUFzc2V0RGVjaW1hbHMFAAAABnNjYWxlOAQAAAAMY3VycmVudFByaWNlCQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAUAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10CQAFIAAAAA4FAAAAFm91dEFtb3VudEFzc2V0QW10RmluYWwFAAAAFW91dFByaWNlQXNzZXRBbXRGaW5hbAUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAUAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQUAAAANYW1vdW50QXNzZXRJZAUAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlBQAAAAxwcmljZUFzc2V0SWQFAAAADXVzZXJMUEJhbGFuY2UFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQUAAAANcG9vbExQQmFsYW5jZQUAAAAMY3VycmVudFByaWNlBQAAAApwb29sU3RhdHVzAQAAABtwcml2YXRlRXN0aW1hdGVQdXRPcGVyYXRpb24AAAAHAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAEGluQW1vdW50QXNzZXRBbXQAAAAPaW5BbW91bnRBc3NldElkAAAAD2luUHJpY2VBc3NldEFtdAAAAA5pblByaWNlQXNzZXRJZAAAAAt1c2VyQWRkcmVzcwAAAAppc0V2YWx1YXRlBAAAABJwb29sQ29uZmlnRGF0YUxpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhQb29sTFBBc3NldElkBAAAAA1hbW91bnRBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4QW1vdW50QXNzZXRJZAQAAAAMcHJpY2VBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAPaWR4UHJpY2VBc3NldElkBAAAABVhbW91bnRBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAXaWR4UHJpY2VBc3NldEludGVybmFsSWQEAAAAEmFtb3V0QXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAWaWR4QW1vdW50QXNzZXREZWNpbWFscwQAAAAScHJpY2VBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMEAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAAA1pZHhQb29sU3RhdHVzBAAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QJAQAAABBnZXRQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAQAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAUAAAAVaWR4UG9vbEFtb3VudEFzc2V0QW10BAAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QFAAAAFGlkeFBvb2xQcmljZUFzc2V0QW10BAAAAA1wb29sTFBCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0BQAAABFpZHhQb29sTFBBc3NldEFtdAQAAAAVdXNlckxpcXVpZGl0eURhdGFMaXN0CQEAAAAWZ2V0UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQFAAAAC3VzZXJBZGRyZXNzBAAAABZ1c2VyQW1vdW50QXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVdXNlckxpcXVpZGl0eURhdGFMaXN0BQAAABVpZHhQb29sQW1vdW50QXNzZXRBbXQEAAAAFXVzZXJQcmljZUFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXVzZXJMaXF1aWRpdHlEYXRhTGlzdAUAAAAUaWR4UG9vbFByaWNlQXNzZXRBbXQEAAAADXVzZXJMUEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABV1c2VyTGlxdWlkaXR5RGF0YUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10AwMJAQAAAAIhPQAAAAIFAAAADWFtb3VudEFzc2V0SWQFAAAAD2luQW1vdW50QXNzZXRJZAYJAQAAAAIhPQAAAAIFAAAADHByaWNlQXNzZXRJZAUAAAAOaW5QcmljZUFzc2V0SWQJAAACAAAAAQIAAAAlSW52YWxpZCBhbW91bnQgb3IgcHJpY2UgYXNzZXQgcGFzc2VkLgQAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQMFAAAACmlzRXZhbHVhdGUJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAA1hbW91bnRBc3NldElkCQAAZQAAAAIJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAA1hbW91bnRBc3NldElkBQAAABBpbkFtb3VudEFzc2V0QW10BAAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UDBQAAAAppc0V2YWx1YXRlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAAMcHJpY2VBc3NldElkCQAAZQAAAAIJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAAxwcmljZUFzc2V0SWQFAAAAD2luUHJpY2VBc3NldEFtdAQAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAEGluQW1vdW50QXNzZXRBbXQFAAAABnNjYWxlOAUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAAA9pblByaWNlQXNzZXRBbXQFAAAABnNjYWxlOAUAAAAScHJpY2VBc3NldERlY2ltYWxzBAAAAAl1c2VyUHJpY2UJAQAAAA5jYWxjdWxhdGVQcmljZQAAAAIFAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQFAAAAGmluQW1vdW50QXNzZXRBbXRDYWxjdWxhdGVkBAAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UFAAAABnNjYWxlOAUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlBQAAAAZzY2FsZTgFAAAAEnByaWNlQXNzZXREZWNpbWFscwQAAAALY3VyZW50UHJpY2UDCQAAAAAAAAIFAAAADXBvb2xMUEJhbGFuY2UAAAAAAAAAAAAAAAAAAAAAAAAJAQAAAA5jYWxjdWxhdGVQcmljZQAAAAIFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10BQAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQEAAAACHNsaXBwYWdlAwkAAAAAAAACBQAAAAtjdXJlbnRQcmljZQAAAAAAAAAAAAAAAAAAAAAAAAMJAABmAAAAAgUAAAALY3VyZW50UHJpY2UFAAAACXVzZXJQcmljZQkAAGsAAAADCQAAZQAAAAIFAAAAC2N1cmVudFByaWNlBQAAAAl1c2VyUHJpY2UAAAAAAAAAAGQFAAAAC2N1cmVudFByaWNlCQAAawAAAAMJAABlAAAAAgUAAAAJdXNlclByaWNlBQAAAAtjdXJlbnRQcmljZQAAAAAAAAAAZAUAAAALY3VyZW50UHJpY2UDAwkBAAAAAiE9AAAAAgUAAAALY3VyZW50UHJpY2UAAAAAAAAAAAAJAABmAAAAAgkAAGgAAAACBQAAAAhzbGlwcGFnZQUAAAAGc2NhbGU4BQAAABFzbGlwcGFnZVRvbGVyYW5jZQcJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAPUHJpY2Ugc2xpcHBhZ2UgCQABpAAAAAEJAABoAAAAAgUAAAAIc2xpcHBhZ2UFAAAABnNjYWxlOAIAAAAeIGV4Y2VlZGVkIHRoZSBwYXNzZWQgbGltaXQgb2YgCQABpAAAAAEFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAAApmaW5hbFByaWNlCQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACCQAAZAAAAAIFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10BQAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkCQAAZAAAAAIFAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAUAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQEAAAAC291dExwQW1vdW50AwkAAAAAAAACBQAAAA1wb29sTFBCYWxhbmNlAAAAAAAAAAAABAAAAAVwYXJ0QQkAAGwAAAAGBQAAABppbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAQAAAAAAAAAAAAUAAAAERE9XTgQAAAAFcGFydEIJAABsAAAABgUAAAAZaW5QcmljZUFzc2V0QW10Q2FsY3VsYXRlZAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAQAAAAAAAAAAAAUAAAAERE9XTgkAAGgAAAACBQAAAAVwYXJ0QQUAAAAFcGFydEIEAAAAEmxwQW10QnlBbW91bnRBc3NldAkAAGsAAAADBQAAAA1wb29sTFBCYWxhbmNlBQAAABppbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZAUAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10BAAAABFscEFtdEJ5UHJpY2VBc3NldAkAAGsAAAADBQAAAA1wb29sTFBCYWxhbmNlBQAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAMJAABmAAAAAgUAAAARbHBBbXRCeVByaWNlQXNzZXQFAAAAEmxwQW10QnlBbW91bnRBc3NldAUAAAASbHBBbXRCeUFtb3VudEFzc2V0BQAAABFscEFtdEJ5UHJpY2VBc3NldAMJAABnAAAAAgAAAAAAAAAAAAUAAAALb3V0THBBbW91bnQJAQAAAAV0aHJvdwAAAAAJAAUfAAAADQUAAAALb3V0THBBbW91bnQFAAAACmZpbmFsUHJpY2UFAAAAFnVzZXJBbW91bnRBc3NldEJhbGFuY2UFAAAAFXVzZXJQcmljZUFzc2V0QmFsYW5jZQUAAAANdXNlckxQQmFsYW5jZQUAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQUAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlBQAAAA1wb29sTFBCYWxhbmNlBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBQAAAAlscEFzc2V0SWQFAAAACHNsaXBwYWdlBQAAAApwb29sU3RhdHVzAQAAABt2YWxpZGF0ZU1hdGNoZXJPcmRlckFsbG93ZWQAAAABAAAABW9yZGVyBAAAABJwb29sQ29uZmlnRGF0YUxpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAANYW1vdW50QXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAEGlkeEFtb3VudEFzc2V0SWQEAAAADHByaWNlQXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAKcG9vbFN0YXR1cwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAANaWR4UG9vbFN0YXR1cwQAAAATbWF0Y2hlclB1YmxpY0tleVN0cgkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAE2lkeE1hdGNoZXJQdWJsaWNLZXkEAAAAE2Ftb3VudEFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzBAAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAANYW1vdW50QXNzZXRJZAQAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAAMcHJpY2VBc3NldElkBAAAAAxjdXJyZW50UHJpY2UDCQAAAAAAAAIIBQAAAAVvcmRlcgAAAAlvcmRlclR5cGUFAAAAA0J1eQkBAAAAFXByaXZhdGVDYWxjdWxhdGVQcmljZQAAAAQFAAAAE2Ftb3VudEFzc2V0RGVjaW1hbHMFAAAAEnByaWNlQXNzZXREZWNpbWFscwkAAGQAAAACBQAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlCAUAAAAFb3JkZXIAAAAGYW1vdW50BQAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UJAQAAABVwcml2YXRlQ2FsY3VsYXRlUHJpY2UAAAAEBQAAABNhbW91bnRBc3NldERlY2ltYWxzBQAAABJwcmljZUFzc2V0RGVjaW1hbHMJAABkAAAAAgUAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQgFAAAABW9yZGVyAAAABmFtb3VudAUAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlBAAAABFpc1Bvb2xTdGF0dXNWYWxpZAMDAwkBAAAAEGlzR2xvYmFsU2h1dGRvd24AAAAABgkAAAAAAAACBQAAAApwb29sU3RhdHVzBQAAABNQb29sTWF0Y2hlckRpc2FibGVkBgkAAAAAAAACBQAAAApwb29sU3RhdHVzBQAAAAxQb29sU2h1dGRvd24HBgQAAAASaXNWYWxpZE1hdGNoZXJTaWduBgQAAAAQb3JkZXJBbW91bnRBc3NldAgIBQAAAAVvcmRlcgAAAAlhc3NldFBhaXIAAAALYW1vdW50QXNzZXQEAAAAE29yZGVyQW1vdW50QXNzZXRTdHIDCQAAAAAAAAIFAAAAEG9yZGVyQW1vdW50QXNzZXQFAAAABHVuaXQCAAAABVdBVkVTCQACWAAAAAEJAQAAAAV2YWx1ZQAAAAEFAAAAEG9yZGVyQW1vdW50QXNzZXQEAAAAD29yZGVyUHJpY2VBc3NldAgIBQAAAAVvcmRlcgAAAAlhc3NldFBhaXIAAAAKcHJpY2VBc3NldAQAAAASb3JkZXJQcmljZUFzc2V0U3RyAwkAAAAAAAACBQAAAA9vcmRlclByaWNlQXNzZXQFAAAABHVuaXQCAAAABVdBVkVTCQACWAAAAAEJAQAAAAV2YWx1ZQAAAAEFAAAAD29yZGVyUHJpY2VBc3NldAQAAAAQaXNWYWxpZEFzc2V0UGFpcgMDCQEAAAACIT0AAAACBQAAABNvcmRlckFtb3VudEFzc2V0U3RyBQAAAA1hbW91bnRBc3NldElkBgkBAAAAAiE9AAAAAgUAAAASb3JkZXJQcmljZUFzc2V0U3RyBQAAAAxwcmljZUFzc2V0SWQHBgQAAAAKb3JkZXJQcmljZQgFAAAABW9yZGVyAAAABXByaWNlBAAAAA1wcmljZURlY2ltYWxzCQAAawAAAAMFAAAABnNjYWxlOAUAAAAScHJpY2VBc3NldERlY2ltYWxzBQAAABNhbW91bnRBc3NldERlY2ltYWxzBAAAABBjYXN0ZWRPcmRlclByaWNlCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAAApvcmRlclByaWNlBQAAAAZzY2FsZTgFAAAADXByaWNlRGVjaW1hbHMEAAAAEWlzT3JkZXJQcmljZVZhbGlkAwkAAAAAAAACCAUAAAAFb3JkZXIAAAAJb3JkZXJUeXBlBQAAAANCdXkJAABnAAAAAgUAAAAMY3VycmVudFByaWNlBQAAABBjYXN0ZWRPcmRlclByaWNlCQAAZwAAAAIFAAAAEGNhc3RlZE9yZGVyUHJpY2UFAAAADGN1cnJlbnRQcmljZQMDAwUAAAAQaXNWYWxpZEFzc2V0UGFpcgUAAAASaXNWYWxpZE1hdGNoZXJTaWduBwUAAAARaXNQb29sU3RhdHVzVmFsaWQHBQAAABFpc09yZGVyUHJpY2VWYWxpZAcAAAAIAAAAAWkBAAAAA3B1dAAAAAIAAAARc2xpcHBhZ2VUb2xlcmFuY2UAAAAPc2hvdWxkQXV0b1N0YWtlBAAAABFmYWN0b3J5Q29uZmlnTGlzdAkBAAAAEGdldEZhY3RvcnlDb25maWcAAAAABAAAAA9zdGFraW5nQ29udHJhY3QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQABkQAAAAIFAAAAEWZhY3RvcnlDb25maWdMaXN0BQAAABlpZHhGYWN0b3J5U3Rha2luZ0NvbnRyYWN0AgAAACFFcnJvci4gSW5jb3JyZWN0IHN0YWtpbmcgYWRkcmVzcy4EAAAADnBtdEFtb3VudEFzc2V0CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAABBpbkFtb3VudEFzc2V0QW10CAUAAAAOcG10QW1vdW50QXNzZXQAAAAGYW1vdW50BAAAAA9pbkFtb3VudEFzc2V0SWQDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCAUAAAAOcG10QW1vdW50QXNzZXQAAAAHYXNzZXRJZAkAAlkAAAABAgAAAAVXQVZFUwkBAAAABXZhbHVlAAAAAQgFAAAADnBtdEFtb3VudEFzc2V0AAAAB2Fzc2V0SWQEAAAADXBtdFByaWNlQXNzZXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEEAAAAD2luUHJpY2VBc3NldEFtdAgFAAAADXBtdFByaWNlQXNzZXQAAAAGYW1vdW50BAAAAA5pblByaWNlQXNzZXRJZAMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAA1wbXRQcmljZUFzc2V0AAAAB2Fzc2V0SWQJAAJZAAAAAQIAAAAFV0FWRVMJAQAAAAV2YWx1ZQAAAAEIBQAAAA1wbXRQcmljZUFzc2V0AAAAB2Fzc2V0SWQEAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMJAQAAABtwcml2YXRlRXN0aW1hdGVQdXRPcGVyYXRpb24AAAAHBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAQaW5BbW91bnRBc3NldEFtdAkAAlgAAAABBQAAAA9pbkFtb3VudEFzc2V0SWQFAAAAD2luUHJpY2VBc3NldEFtdAkAAlgAAAABBQAAAA5pblByaWNlQXNzZXRJZAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIHBAAAAAtvdXRMcEFtb3VudAgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzEEAAAAC2N1cmVudFByaWNlCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfMgQAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzMEAAAAFXVzZXJQcmljZUFzc2V0QmFsYW5jZQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzQEAAAADXVzZXJMUEJhbGFuY2UIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl81BAAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfNgQAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfNwQAAAANcG9vbExQQmFsYW5jZQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzgEAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzkEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAANfMTAEAAAACWxwQXNzZXRJZAgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAADXzExBAAAABJzbGlwcGFnZUNhbGN1bGF0ZWQIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAA18xMgQAAAAKcG9vbFN0YXR1cwkBAAAADXBhcnNlSW50VmFsdWUAAAABCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAANfMTMDAwMJAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAAPUG9vbFB1dERpc2FibGVkBgkAAAAAAAACBQAAAApwb29sU3RhdHVzBQAAAAxQb29sU2h1dGRvd24JAAACAAAAAQkAASwAAAACAgAAACxQdXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4uIFN0YXR1cyA9IAkAAaQAAAABBQAAAApwb29sU3RhdHVzBAAAABRlbWl0TFBBc3NldE9uRmFjdG9yeQkAA/wAAAAEBQAAAA9mYWN0b3J5Q29udHJhY3QCAAAABGVtaXQJAARMAAAAAgUAAAALb3V0THBBbW91bnQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAABRlbWl0TFBBc3NldE9uRmFjdG9yeQUAAAAUZW1pdExQQXNzZXRPbkZhY3RvcnkDCQEAAAACIT0AAAACBQAAABRlbWl0TFBBc3NldE9uRmFjdG9yeQIAAAAHc3VjY2VzcwkAAAIAAAABAgAAADRMUCBhc3NldCByZWlzc3VlIGZhaWxlZCBkdXJpbmcgZW1pdCBjYWxsIG9uIGZhY3RvcnkuBAAAAAdyZXN1bHRzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxrZXlQcmljZUxhc3QAAAAACQABLAAAAAICAAAABCVzX18JAAGkAAAAAQUAAAALY3VyZW50UHJpY2UJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2tleVByaWNlSGlzdG9yeQAAAAIFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAAEsAAAAAgIAAAAEJXNfXwkAAaQAAAABBQAAAAtjdXJlbnRQcmljZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5UHV0QWN0aW9uQnlVc2VyAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAkBAAAAEWRhdGFQdXRBY3Rpb25JbmZvAAAACAUAAAAQaW5BbW91bnRBc3NldEFtdAUAAAAPaW5QcmljZUFzc2V0QW10BQAAAAtvdXRMcEFtb3VudAUAAAALY3VyZW50UHJpY2UFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAABJzbGlwcGFnZUNhbGN1bGF0ZWQFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAFmtleVBvb2xMaXF1aWRpdHlCeVVzZXIAAAADBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkBAAAAEWRhdGFQb29sTGlxdWlkaXR5AAAAAwkAAGQAAAACBQAAABZ1c2VyQW1vdW50QXNzZXRCYWxhbmNlBQAAABBpbkFtb3VudEFzc2V0QW10CQAAZAAAAAIFAAAAFXVzZXJQcmljZUFzc2V0QmFsYW5jZQUAAAAPaW5QcmljZUFzc2V0QW10CQAAZAAAAAIFAAAADXVzZXJMUEJhbGFuY2UFAAAAC291dExwQW1vdW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkBAAAAEWRhdGFQb29sTGlxdWlkaXR5AAAAAwkAAGQAAAACBQAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlBQAAABBpbkFtb3VudEFzc2V0QW10CQAAZAAAAAIFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQUAAAAPaW5QcmljZUFzc2V0QW10CQAAZAAAAAIFAAAADXBvb2xMUEJhbGFuY2UFAAAAC291dExwQW1vdW50BQAAAANuaWwDBQAAAA9zaG91bGRBdXRvU3Rha2UEAAAABXN0YWtlCQAD/AAAAAQFAAAAD3N0YWtpbmdDb250cmFjdAIAAAAFc3Rha2UFAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgUAAAAJbHBBc3NldElkBQAAAAtvdXRMcEFtb3VudAUAAAADbmlsAwkAAAAAAAACBQAAAAVzdGFrZQUAAAAFc3Rha2UFAAAAB3Jlc3VsdHMJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAETQAAAAIFAAAAB3Jlc3VsdHMJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAALb3V0THBBbW91bnQFAAAACWxwQXNzZXRJZAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAADZ2V0AAAAAAQAAAAOcG10QW1vdW50QXNzZXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACnBtdEFzc2V0SWQJAQAAAAV2YWx1ZQAAAAEIBQAAAA5wbXRBbW91bnRBc3NldAAAAAdhc3NldElkBAAAAA5wbXRBc3NldEFtb3VudAgFAAAADnBtdEFtb3VudEFzc2V0AAAABmFtb3VudAQAAAAHcmVzdWx0cwkBAAAAG3ByaXZhdGVFc3RpbWF0ZUdldE9wZXJhdGlvbgAAAAMJAAJYAAAAAQUAAAAKcG10QXNzZXRJZAUAAAAOcG10QXNzZXRBbW91bnQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAABFvdXRBbW91bnRBc3NldEFtdAgFAAAAB3Jlc3VsdHMAAAACXzEEAAAAEG91dFByaWNlQXNzZXRBbXQIBQAAAAdyZXN1bHRzAAAAAl8yBAAAABVhbW91bnRBc3NldEludGVybmFsSWQIBQAAAAdyZXN1bHRzAAAAAl8zBAAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAgFAAAAB3Jlc3VsdHMAAAACXzQEAAAAFnVzZXJBbW91bnRBc3NldEJhbGFuY2UIBQAAAAdyZXN1bHRzAAAAAl81BAAAAA1hbW91bnRBc3NldElkCAUAAAAHcmVzdWx0cwAAAAJfNgQAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlCAUAAAAHcmVzdWx0cwAAAAJfNwQAAAAMcHJpY2VBc3NldElkCAUAAAAHcmVzdWx0cwAAAAJfOAQAAAANdXNlckxQQmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAACXzkEAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UIBQAAAAdyZXN1bHRzAAAAA18xMAQAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlCAUAAAAHcmVzdWx0cwAAAANfMTEEAAAADXBvb2xMUEJhbGFuY2UIBQAAAAdyZXN1bHRzAAAAA18xMgQAAAAMY3VycmVudFByaWNlCAUAAAAHcmVzdWx0cwAAAANfMTMEAAAACnBvb2xTdGF0dXMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQgFAAAAB3Jlc3VsdHMAAAADXzE0AwMJAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAAMUG9vbFNodXRkb3duCQAAAgAAAAEJAAEsAAAAAgIAAAAsR2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluLiBTdGF0dXMgPSAJAAGkAAAAAQUAAAAKcG9vbFN0YXR1cwQAAAAUYnVybkxQQXNzZXRPbkZhY3RvcnkJAAP8AAAABAUAAAAPZmFjdG9yeUNvbnRyYWN0AgAAAARidXJuCQAETAAAAAIFAAAADnBtdEFzc2V0QW1vdW50BQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIFAAAACnBtdEFzc2V0SWQFAAAADnBtdEFzc2V0QW1vdW50BQAAAANuaWwDCQAAAAAAAAIFAAAAFGJ1cm5MUEFzc2V0T25GYWN0b3J5BQAAABRidXJuTFBBc3NldE9uRmFjdG9yeQMJAQAAAAIhPQAAAAIFAAAAFGJ1cm5MUEFzc2V0T25GYWN0b3J5AgAAAAdzdWNjZXNzCQAAAgAAAAECAAAAMUxQIGFzc2V0IGJ1cm4gZmFpbGVkIGR1cmluZyBlbWl0IGNhbGwgb24gZmFjdG9yeS4JAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABFvdXRBbW91bnRBc3NldEFtdAMJAAAAAAAAAgUAAAANYW1vdW50QXNzZXRJZAIAAAAFV0FWRVMFAAAABHVuaXQJAAJZAAAAAQUAAAANYW1vdW50QXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAEG91dFByaWNlQXNzZXRBbXQJAAJZAAAAAQUAAAAMcHJpY2VBc3NldElkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABZrZXlQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAQAAABFkYXRhUG9vbExpcXVpZGl0eQAAAAMJAABlAAAAAgUAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQUAAAARb3V0QW1vdW50QXNzZXRBbXQJAABlAAAAAgUAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlBQAAABBvdXRQcmljZUFzc2V0QW10CQAAZQAAAAIFAAAADXVzZXJMUEJhbGFuY2UFAAAADnBtdEFzc2V0QW1vdW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkBAAAAEWRhdGFQb29sTGlxdWlkaXR5AAAAAwkAAGUAAAACBQAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlBQAAABFvdXRBbW91bnRBc3NldEFtdAkAAGUAAAACBQAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UFAAAAEG91dFByaWNlQXNzZXRBbXQJAABlAAAAAgUAAAANcG9vbExQQmFsYW5jZQUAAAAOcG10QXNzZXRBbW91bnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleUdldEFjdGlvbkJ5VXNlcgAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQJAQAAABFkYXRhR2V0QWN0aW9uSW5mbwAAAAYFAAAAEW91dEFtb3VudEFzc2V0QW10BQAAABBvdXRQcmljZUFzc2V0QW10BQAAAA5wbXRBc3NldEFtb3VudAUAAAAMY3VycmVudFByaWNlBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxrZXlQcmljZUxhc3QAAAAACQABLAAAAAICAAAABCVzX18JAAGkAAAAAQUAAAAMY3VycmVudFByaWNlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9rZXlQcmljZUhpc3RvcnkAAAACBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQABLAAAAAICAAAABCVzX18JAAGkAAAAAQUAAAAMY3VycmVudFByaWNlBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACGFjdGl2YXRlAAAAAgAAAA5hbW91bnRBc3NldFN0cgAAAA1wcmljZUFzc2V0U3RyAwkBAAAAAiE9AAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAAQlAAAAAQUAAAAPZmFjdG9yeUNvbnRyYWN0CQAAAgAAAAECAAAAEnBlcm1pc3Npb25zIGRlbmllZAkABRQAAAACCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA5rZXlBbW91bnRBc3NldAAAAAAFAAAADmFtb3VudEFzc2V0U3RyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA1rZXlQcmljZUFzc2V0AAAAAAUAAAANcHJpY2VBc3NldFN0cgUAAAADbmlsAgAAAAdzdWNjZXNzAAAAAWkBAAAADXN0YXRzUkVBRE9OTFkAAAAABAAAABJwb29sQ29uZmlnRGF0YUxpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhQb29sTFBBc3NldElkBAAAAA1hbW91bnRBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4QW1vdW50QXNzZXRJZAQAAAAMcHJpY2VBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAPaWR4UHJpY2VBc3NldElkBAAAABVhbW91bnRBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAXaWR4UHJpY2VBc3NldEludGVybmFsSWQEAAAAEmFtb3V0QXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAWaWR4QW1vdW50QXNzZXREZWNpbWFscwQAAAAScHJpY2VBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMEAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAkBAAAAEGdldFBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBAAAAA1wb29sTFBCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0BQAAABFpZHhQb29sTFBBc3NldEFtdAQAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADWFtb3VudEFzc2V0SWQEAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADHByaWNlQXNzZXRJZAQAAAAKcHJpY2VzTGlzdAkBAAAAD2NhbGN1bGF0ZVByaWNlcwAAAAMFAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UFAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQUAAAANcG9vbExQQmFsYW5jZQQAAAAMY3VycmVudFByaWNlCQABkQAAAAIFAAAACnByaWNlc0xpc3QAAAAAAAAAAAAEAAAAFGxwUHJpY2VJbkFtb3VudEFzc2V0CQABkQAAAAIFAAAACnByaWNlc0xpc3QAAAAAAAAAAAEEAAAAE2xwUHJpY2VJblByaWNlQXNzZXQJAAGRAAAAAgUAAAAKcHJpY2VzTGlzdAAAAAAAAAAAAgQAAAAKcG9vbFdlaWdodAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAADWtleVBvb2xXZWlnaHQAAAABCQAEJQAAAAEFAAAABHRoaXMCAAAAGVBvb2wgZG9lc24ndCBoYXZlIHdlaWdodC4JAAUUAAAAAgUAAAADbmlsCQAEuQAAAAIJAARMAAAAAgIAAAAOJWQlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlCQAETAAAAAIJAAGkAAAAAQUAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlCQAETAAAAAIJAAGkAAAAAQUAAAANcG9vbExQQmFsYW5jZQkABEwAAAACCQABpAAAAAEFAAAADGN1cnJlbnRQcmljZQkABEwAAAACCQABpAAAAAEFAAAAFGxwUHJpY2VJbkFtb3VudEFzc2V0CQAETAAAAAIJAAGkAAAAAQUAAAATbHBQcmljZUluUHJpY2VBc3NldAkABEwAAAACCQABpAAAAAEFAAAACnBvb2xXZWlnaHQFAAAAA25pbAUAAAADU0VQAAAAAWkBAAAAIGV2YWx1YXRlUHV0QnlBbW91bnRBc3NldFJFQURPTkxZAAAAAwAAABFzbGlwcGFnZVRvbGVyYW5jZQAAABBpbkFtb3VudEFzc2V0QW10AAAAC3VzZXJBZGRyZXNzBAAAABJwb29sQ29uZmlnRGF0YUxpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhQb29sTFBBc3NldElkBAAAAA1hbW91bnRBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4QW1vdW50QXNzZXRJZAQAAAAMcHJpY2VBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAPaWR4UHJpY2VBc3NldElkBAAAABVhbW91bnRBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAXaWR4UHJpY2VBc3NldEludGVybmFsSWQEAAAAEmFtb3V0QXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAWaWR4QW1vdW50QXNzZXREZWNpbWFscwQAAAAScHJpY2VBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMEAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAAA1pZHhQb29sU3RhdHVzBAAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QJAQAAABBnZXRQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAQAAAANcG9vbExQQmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAUAAAARaWR4UG9vbExQQXNzZXRBbXQEAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAA1hbW91bnRBc3NldElkBAAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAAxwcmljZUFzc2V0SWQEAAAAH2FjY291bnRBbW91bnRBc3NldEJhbGFuY2VDYXN0ZWQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UFAAAABnNjYWxlOAUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAAB5hY2NvdW50UHJpY2VBc3NldEJhbGFuY2VDYXN0ZWQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQUAAAAGc2NhbGU4BQAAABJwcmljZUFzc2V0RGVjaW1hbHMEAAAAC2N1cmVudFByaWNlAwkAAAAAAAACBQAAAA1wb29sTFBCYWxhbmNlAAAAAAAAAAAAAAAAAAAAAAAACQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAAB5hY2NvdW50UHJpY2VBc3NldEJhbGFuY2VDYXN0ZWQFAAAAH2FjY291bnRBbW91bnRBc3NldEJhbGFuY2VDYXN0ZWQEAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQJAABrAAAAAwUAAAAQaW5BbW91bnRBc3NldEFtdAUAAAALY3VyZW50UHJpY2UFAAAABnNjYWxlOAQAAAAPaW5QcmljZUFzc2V0QW10CQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkBQAAABJwcmljZUFzc2V0RGVjaW1hbHMFAAAABnNjYWxlOAQAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwkBAAAAG3ByaXZhdGVFc3RpbWF0ZVB1dE9wZXJhdGlvbgAAAAcFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAABBpbkFtb3VudEFzc2V0QW10BQAAAA1hbW91bnRBc3NldElkBQAAAA9pblByaWNlQXNzZXRBbXQFAAAADHByaWNlQXNzZXRJZAUAAAALdXNlckFkZHJlc3MGBAAAAA9vdXRMcEFtb3VudENhbGMIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl8xBAAAAA9jdXJlbnRQcmljZUNhbGMIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl8yBAAAABpwb29sQW1vdW50QXNzZXRCYWxhbmNlQ2FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzYEAAAAGXBvb2xQcmljZUFzc2V0QmFsYW5jZUNBbGMIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl83BAAAABFwb29sTFBCYWxhbmNlQ2FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzgEAAAADnBvb2xTdGF0dXNDYWxjCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAA18xMwkABRQAAAACBQAAAANuaWwJAAS5AAAAAgkABEwAAAACAgAAAAwlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAAA9vdXRMcEFtb3VudENhbGMJAARMAAAAAgkAAaQAAAABBQAAAAtjdXJlbnRQcmljZQkABEwAAAACCQABpAAAAAEFAAAAGnBvb2xBbW91bnRBc3NldEJhbGFuY2VDYWxjCQAETAAAAAIJAAGkAAAAAQUAAAAZcG9vbFByaWNlQXNzZXRCYWxhbmNlQ0FsYwkABEwAAAACCQABpAAAAAEFAAAAEXBvb2xMUEJhbGFuY2VDYWxjCQAETAAAAAIJAAGkAAAAAQUAAAAOcG9vbFN0YXR1c0NhbGMFAAAAA25pbAUAAAADU0VQAAAAAWkBAAAAH2V2YWx1YXRlUHV0QnlQcmljZUFzc2V0UkVBRE9OTFkAAAADAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAD2luUHJpY2VBc3NldEFtdAAAAAt1c2VyQWRkcmVzcwQAAAAScG9vbENvbmZpZ0RhdGFMaXN0CQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAACWxwQXNzZXRJZAkAAlkAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4UG9vbExQQXNzZXRJZAQAAAANYW1vdW50QXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAEGlkeEFtb3VudEFzc2V0SWQEAAAADHByaWNlQXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAYaWR4QW1vdW50QXNzZXRJbnRlcm5hbElkBAAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAF2lkeFByaWNlQXNzZXRJbnRlcm5hbElkBAAAABJhbW91dEFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzBAAAAApwb29sU3RhdHVzCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAANaWR4UG9vbFN0YXR1cwQAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0CQEAAAAQZ2V0UG9vbExpcXVpZGl0eQAAAAIFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQEAAAADXBvb2xMUEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10BAAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAANYW1vdW50QXNzZXRJZAQAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAAMcHJpY2VBc3NldElkBAAAAB9hY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlQ2FzdGVkCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlBQAAAAZzY2FsZTgFAAAAEmFtb3V0QXNzZXREZWNpbWFscwQAAAAeYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlQ2FzdGVkCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UFAAAABnNjYWxlOAUAAAAScHJpY2VBc3NldERlY2ltYWxzBAAAAB5pblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkVHVwbGUJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAD2luUHJpY2VBc3NldEFtdAUAAAAGc2NhbGU4BQAAABJwcmljZUFzc2V0RGVjaW1hbHMEAAAAC2N1cmVudFByaWNlAwkAAAAAAAACBQAAAA1wb29sTFBCYWxhbmNlAAAAAAAAAAAAAAAAAAAAAAAACQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAAB5hY2NvdW50UHJpY2VBc3NldEJhbGFuY2VDYXN0ZWQFAAAAH2FjY291bnRBbW91bnRBc3NldEJhbGFuY2VDYXN0ZWQEAAAAGmluQW1vdW50QXNzZXRBbXRDYWxjdWxhdGVkCQAAawAAAAMFAAAAHmluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWRUdXBsZQUAAAAGc2NhbGU4BQAAAAtjdXJlbnRQcmljZQQAAAAQaW5BbW91bnRBc3NldEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQFAAAAEmFtb3V0QXNzZXREZWNpbWFscwUAAAAGc2NhbGU4BAAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzCQEAAAAbcHJpdmF0ZUVzdGltYXRlUHV0T3BlcmF0aW9uAAAABwUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAEGluQW1vdW50QXNzZXRBbXQFAAAADWFtb3VudEFzc2V0SWQFAAAAD2luUHJpY2VBc3NldEFtdAUAAAAMcHJpY2VBc3NldElkBQAAAAt1c2VyQWRkcmVzcwYEAAAAD291dExwQW1vdW50Q2FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzEEAAAAD2N1cmVudFByaWNlQ2FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzIEAAAAGnBvb2xBbW91bnRBc3NldEJhbGFuY2VDYWxjCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfNgQAAAAZcG9vbFByaWNlQXNzZXRCYWxhbmNlQ0FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzcEAAAAEXBvb2xMUEJhbGFuY2VDYWxjCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfOAQAAAAOcG9vbFN0YXR1c0NhbGMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAADXzEzCQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAADCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAD291dExwQW1vdW50Q2FsYwkABEwAAAACCQABpAAAAAEFAAAAC2N1cmVudFByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAacG9vbEFtb3VudEFzc2V0QmFsYW5jZUNhbGMJAARMAAAAAgkAAaQAAAABBQAAABlwb29sUHJpY2VBc3NldEJhbGFuY2VDQWxjCQAETAAAAAIJAAGkAAAAAQUAAAARcG9vbExQQmFsYW5jZUNhbGMJAARMAAAAAgkAAaQAAAABBQAAAA5wb29sU3RhdHVzQ2FsYwUAAAADbmlsBQAAAANTRVAAAAABaQEAAAATZXZhbHVhdGVHZXRSRUFET05MWQAAAAMAAAAQcGF5bWVudExwQXNzZXRJZAAAAA9wYXltZW50THBBbW91bnQAAAALdXNlckFkZHJlc3MEAAAAB3Jlc3VsdHMJAQAAABtwcml2YXRlRXN0aW1hdGVHZXRPcGVyYXRpb24AAAADBQAAABBwYXltZW50THBBc3NldElkBQAAAA9wYXltZW50THBBbW91bnQFAAAAC3VzZXJBZGRyZXNzBAAAABFvdXRBbW91bnRBc3NldEFtdAgFAAAAB3Jlc3VsdHMAAAACXzEEAAAAEG91dFByaWNlQXNzZXRBbXQIBQAAAAdyZXN1bHRzAAAAAl8yBAAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlCAUAAAAHcmVzdWx0cwAAAANfMTAEAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAADXzExBAAAAA1wb29sTFBCYWxhbmNlCAUAAAAHcmVzdWx0cwAAAANfMTIEAAAADGN1cnJlbnRQcmljZQgFAAAAB3Jlc3VsdHMAAAADXzEzBAAAAApwb29sU3RhdHVzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEIBQAAAAdyZXN1bHRzAAAAA18xNAkABRQAAAACBQAAAANuaWwJAAS5AAAAAgkABEwAAAACAgAAAA4lZCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAEW91dEFtb3VudEFzc2V0QW10CQAETAAAAAIJAAGkAAAAAQUAAAAQb3V0UHJpY2VBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAAA1wb29sTFBCYWxhbmNlCQAETAAAAAIJAAGkAAAAAQUAAAAMY3VycmVudFByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAKcG9vbFN0YXR1cwUAAAADbmlsBQAAAANTRVAAAAABaQEAAAAMaGFzaFJFQURPTkxZAAAAAAkABRQAAAACBQAAAANuaWwJAAJaAAAAAQkBAAAABXZhbHVlAAAAAQkAA/EAAAABBQAAAAR0aGlzAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAAHJG1hdGNoMAUAAAACdHgDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABU9yZGVyBAAAAAVvcmRlcgUAAAAHJG1hdGNoMAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5v9prRQ==", "height": 2771580, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let factoryContract = Address(base58'3P8s92Udr7jNWMv6WctM9Hnc9EytXitmym5')
5+
6+let lPdecimals = 8
7+
8+let scale8 = 100000000
9+
10+let scale18 = toBigInt(1000000000000000000)
11+
12+let SEP = "__"
13+
14+let PoolActive = 1
15+
16+let PoolPutDisabled = 2
17+
18+let PoolMatcherDisabled = 3
19+
20+let PoolShutdown = 4
21+
22+let idxPoolAddress = 1
23+
24+let idxPoolStatus = 2
25+
26+let idxPoolLPAssetId = 3
27+
28+let idxAmountAssetId = 4
29+
30+let idxPriceAssetId = 5
31+
32+let idxAmountAssetDecimals = 6
33+
34+let idxPriceAssetDecimals = 7
35+
36+let idxAmountAssetInternalId = 8
37+
38+let idxPriceAssetInternalId = 9
39+
40+let idxLPAssetDecimals = 10
41+
42+let idxMatcherPublicKey = 11
43+
44+let idxPoolAmountAssetAmt = 1
45+
46+let idxPoolPriceAssetAmt = 2
47+
48+let idxPoolLPAssetAmt = 3
49+
50+let idxFactoryStakingContract = 1
51+
52+let idxFactoryBoostingConfig = 2
53+
54+func keyPriceLast () = "%s%s__price__last"
55+
56+
57+func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
58+
59+
60+func keyPoolLiquidity (internalAmountAsset,internalPriceAsset) = (((("%d%d%s__" + internalAmountAsset) + "__") + internalPriceAsset) + "__locked")
61+
62+
63+func keyPoolLiquidityByUser (internalAmountAsset,internalPriceAsset,userAddress) = (((((("%d%d%s%s__" + internalAmountAsset) + "__") + internalPriceAsset) + "__") + userAddress) + "__locked")
64+
65+
66+func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
67+
68+
69+func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
70+
71+
72+func keyAmountAsset () = "%s__amountAsset"
73+
74+
75+func keyPriceAsset () = "%s__priceAsset"
76+
77+
78+func keyFactoryConfig () = "%s__factoryConfig"
79+
80+
81+func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
82+
83+
84+func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config")
85+
86+
87+func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
88+
89+
90+func keyAllPoolsShutdown () = "%s__shutdown"
91+
92+
93+func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress)
94+
95+
96+func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false)
97+
98+
99+func getPoolConfig () = {
100+ let poolAmountAsset = valueOrErrorMessage(getString(this, keyAmountAsset()), "No config for amount asset found")
101+ let poolPriceAsset = valueOrErrorMessage(getString(this, keyPriceAsset()), "No config for price asset found")
102+ let poolPriceAssetInternal = valueOrErrorMessage(getInteger(factoryContract, keyMappingsBaseAsset2internalId(poolPriceAsset)), "No config for internal price asset found")
103+ let poolAmountAssetInternal = valueOrErrorMessage(getInteger(factoryContract, keyMappingsBaseAsset2internalId(poolAmountAsset)), "No config for internal amount asset found")
104+ split(valueOrErrorMessage(getString(factoryContract, keyPoolConfig(toString(poolAmountAssetInternal), toString(poolPriceAssetInternal))), "No factory config found for pool assets."), SEP)
105+ }
106+
107+
108+func getFactoryConfig () = split(valueOrErrorMessage(getString(factoryContract, keyFactoryConfig()), "No factory config found."), SEP)
109+
110+
111+func getPoolLiquidity (amountAssetInternalId,priceAssetInternalId) = {
112+ let currentPoolLiquidityValue = getString(this, keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId))
113+ if (isDefined(currentPoolLiquidityValue))
114+ then split(value(currentPoolLiquidityValue), SEP)
115+ else ["", "0", "0", "0"]
116+ }
117+
118+
119+func getPoolLiquidityByUser (amountAssetInternalId,priceAssetInternalId,userAddress) = {
120+ let currentPoolLiquidityValue = getString(this, keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress))
121+ if (isDefined(currentPoolLiquidityValue))
122+ then split(value(currentPoolLiquidityValue), SEP)
123+ else ["", "0", "0", "0", "0"]
124+ }
125+
126+
127+func dataPoolLiquidity (amountAssetLocked,priceAssetLocked,lpTokenLocked) = makeString(["%d%d%d", toString(amountAssetLocked), toString(priceAssetLocked), toString(lpTokenLocked)], SEP)
128+
129+
130+func dataPoolLiquidityByUser (amountAssetLocked,priceAssetLocked,lpTokenLocked,userAddress) = makeString(["%d%d%d", toString(amountAssetLocked), toString(priceAssetLocked), toString(lpTokenLocked)], SEP)
131+
132+
133+func dataPutActionInfo (inAmountAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageTolerancePassedByUser,slippageToleranceReal,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d%d", toString(inAmountAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slippageTolerancePassedByUser), toString(slippageToleranceReal), toString(txHeight), toString(txTimestamp)], SEP)
134+
135+
136+func dataGetActionInfo (outAmountAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmountAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
137+
138+
139+func privateCastToScaleOf (amount,resultScale,currentScale) = fraction(amount, resultScale, currentScale)
140+
141+
142+func calculatePrice (priceAssetLockedAmt,amountAssetlLockedAmt) = fraction(priceAssetLockedAmt, scale8, amountAssetlLockedAmt)
143+
144+
145+func privateCalculatePrice (amoutAssetDecimals,priceAssetDecimals,amountAssetAmt,priceAssetAmt) = {
146+ let amountAssetAmtCasted = privateCastToScaleOf(amountAssetAmt, scale8, amoutAssetDecimals)
147+ let priceAssetAmtCasted = privateCastToScaleOf(priceAssetAmt, scale8, priceAssetDecimals)
148+ calculatePrice(priceAssetAmtCasted, amountAssetAmtCasted)
149+ }
150+
151+
152+func privateGetAccountBalance (assetId) = if ((assetId == "WAVES"))
153+ then wavesBalance(this).available
154+ else assetBalance(this, fromBase58String(assetId))
155+
156+
157+func calculatePrices (amountAssetAmt,priceAssetAmt,lpAmount) = {
158+ let poolConfigDataList = getPoolConfig()
159+ let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
160+ let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
161+ let poolPrice = privateCalculatePrice(amoutAssetDecimals, priceAssetDecimals, amountAssetAmt, priceAssetAmt)
162+ let amountAssetPoolLockedAmt = privateCastToScaleOf(amountAssetAmt, scale8, amoutAssetDecimals)
163+ let priceAssetPoolLockedAmt = privateCastToScaleOf(priceAssetAmt, scale8, priceAssetDecimals)
164+ let lpPriceInAmountAsset = calculatePrice(amountAssetPoolLockedAmt, lpAmount)
165+ let lpPriceInPriceAsset = calculatePrice(priceAssetPoolLockedAmt, lpAmount)
166+[poolPrice, lpPriceInAmountAsset, lpPriceInPriceAsset]
167+ }
168+
169+
170+func privateEstimateGetOperation (paymentLpAssetId,paymentLpAmount,userAddress) = {
171+ let poolConfigList = getPoolConfig()
172+ let lpAssetId = poolConfigList[idxPoolLPAssetId]
173+ let amountAssetId = poolConfigList[idxAmountAssetId]
174+ let priceAssetId = poolConfigList[idxPriceAssetId]
175+ let amountAssetInternalId = poolConfigList[idxAmountAssetInternalId]
176+ let priceAssetInternalId = poolConfigList[idxPriceAssetInternalId]
177+ let amoutAssetDecimals = parseIntValue(poolConfigList[idxAmountAssetDecimals])
178+ let priceAssetDecimals = parseIntValue(poolConfigList[idxPriceAssetDecimals])
179+ let poolStatus = poolConfigList[idxPoolStatus]
180+ let userLiquidityList = getPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress)
181+ let userLPBalance = parseIntValue(userLiquidityList[idxPoolLPAssetAmt])
182+ let userAmountAssetBalance = parseIntValue(userLiquidityList[idxPoolAmountAssetAmt])
183+ let userPriceAssetBalance = parseIntValue(userLiquidityList[idxPoolPriceAssetAmt])
184+ let poolLiquidityList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
185+ let poolLPBalance = parseIntValue(poolLiquidityList[idxPoolLPAssetAmt])
186+ let poolAmountAssetBalance = parseIntValue(poolLiquidityList[idxPoolAmountAssetAmt])
187+ let poolPriceAssetBalance = parseIntValue(poolLiquidityList[idxPoolPriceAssetAmt])
188+ if ((lpAssetId != paymentLpAssetId))
189+ then throw("Invalid asset passed.")
190+ else {
191+ let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId)
192+ let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId)
193+ let amountAssetPoolLockedAmt = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals)
194+ let priceAssetPoolLockedAmt = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals)
195+ let outAmountAssetAmt = fraction(amountAssetPoolLockedAmt, paymentLpAmount, poolLPBalance)
196+ let outPriceAssetAmt = fraction(priceAssetPoolLockedAmt, paymentLpAmount, poolLPBalance)
197+ let outAmountAssetAmtFinal = privateCastToScaleOf(outAmountAssetAmt, amoutAssetDecimals, scale8)
198+ let outPriceAssetAmtFinal = privateCastToScaleOf(outPriceAssetAmt, priceAssetDecimals, scale8)
199+ let currentPrice = calculatePrice(priceAssetPoolLockedAmt, amountAssetPoolLockedAmt)
200+ $Tuple14(outAmountAssetAmtFinal, outPriceAssetAmtFinal, amountAssetInternalId, priceAssetInternalId, userAmountAssetBalance, amountAssetId, userPriceAssetBalance, priceAssetId, userLPBalance, poolAmountAssetBalance, poolPriceAssetBalance, poolLPBalance, currentPrice, poolStatus)
201+ }
202+ }
203+
204+
205+func privateEstimatePutOperation (slippageTolerance,inAmountAssetAmt,inAmountAssetId,inPriceAssetAmt,inPriceAssetId,userAddress,isEvaluate) = {
206+ let poolConfigDataList = getPoolConfig()
207+ let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId])
208+ let amountAssetId = poolConfigDataList[idxAmountAssetId]
209+ let priceAssetId = poolConfigDataList[idxPriceAssetId]
210+ let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId]
211+ let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId]
212+ let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
213+ let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
214+ let poolStatus = poolConfigDataList[idxPoolStatus]
215+ let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
216+ let poolAmountAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolAmountAssetAmt])
217+ let poolPriceAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolPriceAssetAmt])
218+ let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt])
219+ let userLiquidityDataList = getPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress)
220+ let userAmountAssetBalance = parseIntValue(userLiquidityDataList[idxPoolAmountAssetAmt])
221+ let userPriceAssetBalance = parseIntValue(userLiquidityDataList[idxPoolPriceAssetAmt])
222+ let userLPBalance = parseIntValue(userLiquidityDataList[idxPoolLPAssetAmt])
223+ if (if ((amountAssetId != inAmountAssetId))
224+ then true
225+ else (priceAssetId != inPriceAssetId))
226+ then throw("Invalid amount or price asset passed.")
227+ else {
228+ let accountAmountAssetBalance = if (isEvaluate)
229+ then privateGetAccountBalance(amountAssetId)
230+ else (privateGetAccountBalance(amountAssetId) - inAmountAssetAmt)
231+ let accountPriceAssetBalance = if (isEvaluate)
232+ then privateGetAccountBalance(priceAssetId)
233+ else (privateGetAccountBalance(priceAssetId) - inPriceAssetAmt)
234+ let inAmountAssetAmtCalculated = privateCastToScaleOf(inAmountAssetAmt, scale8, amoutAssetDecimals)
235+ let inPriceAssetAmtCalculated = privateCastToScaleOf(inPriceAssetAmt, scale8, priceAssetDecimals)
236+ let userPrice = calculatePrice(inPriceAssetAmtCalculated, inAmountAssetAmtCalculated)
237+ let amountAssetPoolLockedAmt = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals)
238+ let priceAssetPoolLockedAmt = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals)
239+ let curentPrice = if ((poolLPBalance == 0))
240+ then 0
241+ else calculatePrice(priceAssetPoolLockedAmt, amountAssetPoolLockedAmt)
242+ let slippage = if ((curentPrice == 0))
243+ then 0
244+ else if ((curentPrice > userPrice))
245+ then fraction((curentPrice - userPrice), 100, curentPrice)
246+ else fraction((userPrice - curentPrice), 100, curentPrice)
247+ if (if ((curentPrice != 0))
248+ then ((slippage * scale8) > slippageTolerance)
249+ else false)
250+ then throw(((("Price slippage " + toString((slippage * scale8))) + " exceeded the passed limit of ") + toString(slippageTolerance)))
251+ else {
252+ let finalPrice = calculatePrice((priceAssetPoolLockedAmt + inPriceAssetAmtCalculated), (amountAssetPoolLockedAmt + inAmountAssetAmtCalculated))
253+ let outLpAmount = if ((poolLPBalance == 0))
254+ then {
255+ let partA = pow(inAmountAssetAmtCalculated, 0, 5, 1, 0, DOWN)
256+ let partB = pow(inPriceAssetAmtCalculated, 0, 5, 1, 0, DOWN)
257+ (partA * partB)
258+ }
259+ else {
260+ let lpAmtByAmountAsset = fraction(poolLPBalance, inAmountAssetAmtCalculated, amountAssetPoolLockedAmt)
261+ let lpAmtByPriceAsset = fraction(poolLPBalance, inPriceAssetAmtCalculated, priceAssetPoolLockedAmt)
262+ if ((lpAmtByPriceAsset > lpAmtByAmountAsset))
263+ then lpAmtByAmountAsset
264+ else lpAmtByPriceAsset
265+ }
266+ if ((0 >= outLpAmount))
267+ then throw()
268+ else $Tuple13(outLpAmount, finalPrice, userAmountAssetBalance, userPriceAssetBalance, userLPBalance, poolAmountAssetBalance, poolPriceAssetBalance, poolLPBalance, amountAssetInternalId, priceAssetInternalId, lpAssetId, slippage, poolStatus)
269+ }
270+ }
271+ }
272+
273+
274+func validateMatcherOrderAllowed (order) = {
275+ let poolConfigDataList = getPoolConfig()
276+ let amountAssetId = poolConfigDataList[idxAmountAssetId]
277+ let priceAssetId = poolConfigDataList[idxPriceAssetId]
278+ let poolStatus = parseIntValue(poolConfigDataList[idxPoolStatus])
279+ let matcherPublicKeyStr = poolConfigDataList[idxMatcherPublicKey]
280+ let amountAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
281+ let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
282+ let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId)
283+ let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId)
284+ let currentPrice = if ((order.orderType == Buy))
285+ then privateCalculatePrice(amountAssetDecimals, priceAssetDecimals, (accountAmountAssetBalance + order.amount), accountPriceAssetBalance)
286+ else privateCalculatePrice(amountAssetDecimals, priceAssetDecimals, (accountAmountAssetBalance + order.amount), accountPriceAssetBalance)
287+ let isPoolStatusValid = if (if (if (isGlobalShutdown())
288+ then true
289+ else (poolStatus == PoolMatcherDisabled))
290+ then true
291+ else (poolStatus == PoolShutdown))
292+ then false
293+ else true
294+ let isValidMatcherSign = true
295+ let orderAmountAsset = order.assetPair.amountAsset
296+ let orderAmountAssetStr = if ((orderAmountAsset == unit))
297+ then "WAVES"
298+ else toBase58String(value(orderAmountAsset))
299+ let orderPriceAsset = order.assetPair.priceAsset
300+ let orderPriceAssetStr = if ((orderPriceAsset == unit))
301+ then "WAVES"
302+ else toBase58String(value(orderPriceAsset))
303+ let isValidAssetPair = if (if ((orderAmountAssetStr != amountAssetId))
304+ then true
305+ else (orderPriceAssetStr != priceAssetId))
306+ then false
307+ else true
308+ let orderPrice = order.price
309+ let priceDecimals = fraction(scale8, priceAssetDecimals, amountAssetDecimals)
310+ let castedOrderPrice = privateCastToScaleOf(orderPrice, scale8, priceDecimals)
311+ let isOrderPriceValid = if ((order.orderType == Buy))
312+ then (currentPrice >= castedOrderPrice)
313+ else (castedOrderPrice >= currentPrice)
314+ if (if (if (isValidAssetPair)
315+ then isValidMatcherSign
316+ else false)
317+ then isPoolStatusValid
318+ else false)
319+ then isOrderPriceValid
320+ else false
321+ }
322+
323+
324+@Callable(i)
325+func put (slippageTolerance,shouldAutoStake) = {
326+ let factoryConfigList = getFactoryConfig()
327+ let stakingContract = valueOrErrorMessage(addressFromString(factoryConfigList[idxFactoryStakingContract]), "Error. Incorrect staking address.")
328+ let pmtAmountAsset = value(i.payments[0])
329+ let inAmountAssetAmt = pmtAmountAsset.amount
330+ let inAmountAssetId = if (!(isDefined(pmtAmountAsset.assetId)))
331+ then fromBase58String("WAVES")
332+ else value(pmtAmountAsset.assetId)
333+ let pmtPriceAsset = value(i.payments[1])
334+ let inPriceAssetAmt = pmtPriceAsset.amount
335+ let inPriceAssetId = if (!(isDefined(pmtPriceAsset.assetId)))
336+ then fromBase58String("WAVES")
337+ else value(pmtPriceAsset.assetId)
338+ let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, toBase58String(inAmountAssetId), inPriceAssetAmt, toBase58String(inPriceAssetId), toString(i.caller), false)
339+ let outLpAmount = estimatedPutResults._1
340+ let curentPrice = estimatedPutResults._2
341+ let userAmountAssetBalance = estimatedPutResults._3
342+ let userPriceAssetBalance = estimatedPutResults._4
343+ let userLPBalance = estimatedPutResults._5
344+ let poolAmountAssetBalance = estimatedPutResults._6
345+ let poolPriceAssetBalance = estimatedPutResults._7
346+ let poolLPBalance = estimatedPutResults._8
347+ let amountAssetInternalId = estimatedPutResults._9
348+ let priceAssetInternalId = estimatedPutResults._10
349+ let lpAssetId = estimatedPutResults._11
350+ let slippageCalculated = estimatedPutResults._12
351+ let poolStatus = parseIntValue(estimatedPutResults._13)
352+ if (if (if (isGlobalShutdown())
353+ then true
354+ else (poolStatus == PoolPutDisabled))
355+ then true
356+ else (poolStatus == PoolShutdown))
357+ then throw(("Put operation is blocked by admin. Status = " + toString(poolStatus)))
358+ else {
359+ let emitLPAssetOnFactory = invoke(factoryContract, "emit", [outLpAmount], nil)
360+ if ((emitLPAssetOnFactory == emitLPAssetOnFactory))
361+ then if ((emitLPAssetOnFactory != "success"))
362+ then throw("LP asset reissue failed during emit call on factory.")
363+ else {
364+ let results = [StringEntry(keyPriceLast(), ("%s__" + toString(curentPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(curentPrice))), StringEntry(keyPutActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataPutActionInfo(inAmountAssetAmt, inPriceAssetAmt, outLpAmount, curentPrice, slippageTolerance, slippageCalculated, height, lastBlock.timestamp)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity((userAmountAssetBalance + inAmountAssetAmt), (userPriceAssetBalance + inPriceAssetAmt), (userLPBalance + outLpAmount))), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity((poolAmountAssetBalance + inAmountAssetAmt), (poolPriceAssetBalance + inPriceAssetAmt), (poolLPBalance + outLpAmount)))]
365+ if (shouldAutoStake)
366+ then {
367+ let stake = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, outLpAmount)])
368+ if ((stake == stake))
369+ then results
370+ else throw("Strict value is not equal to itself.")
371+ }
372+ else (results :+ ScriptTransfer(i.caller, outLpAmount, lpAssetId))
373+ }
374+ else throw("Strict value is not equal to itself.")
375+ }
376+ }
377+
378+
379+
380+@Callable(i)
381+func get () = {
382+ let pmtAmountAsset = value(i.payments[0])
383+ let pmtAssetId = value(pmtAmountAsset.assetId)
384+ let pmtAssetAmount = pmtAmountAsset.amount
385+ let results = privateEstimateGetOperation(toBase58String(pmtAssetId), pmtAssetAmount, toString(i.caller))
386+ let outAmountAssetAmt = results._1
387+ let outPriceAssetAmt = results._2
388+ let amountAssetInternalId = results._3
389+ let priceAssetInternalId = results._4
390+ let userAmountAssetBalance = results._5
391+ let amountAssetId = results._6
392+ let userPriceAssetBalance = results._7
393+ let priceAssetId = results._8
394+ let userLPBalance = results._9
395+ let poolAmountAssetBalance = results._10
396+ let poolPriceAssetBalance = results._11
397+ let poolLPBalance = results._12
398+ let currentPrice = results._13
399+ let poolStatus = parseIntValue(results._14)
400+ if (if (isGlobalShutdown())
401+ then true
402+ else (poolStatus == PoolShutdown))
403+ then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
404+ else {
405+ let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAssetAmount], [AttachedPayment(pmtAssetId, pmtAssetAmount)])
406+ if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
407+ then if ((burnLPAssetOnFactory != "success"))
408+ then throw("LP asset burn failed during emit call on factory.")
409+ else [ScriptTransfer(i.caller, outAmountAssetAmt, if ((amountAssetId == "WAVES"))
410+ then unit
411+ else fromBase58String(amountAssetId)), ScriptTransfer(i.caller, outPriceAssetAmt, fromBase58String(priceAssetId)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity((userAmountAssetBalance - outAmountAssetAmt), (userPriceAssetBalance - outPriceAssetAmt), (userLPBalance - pmtAssetAmount))), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity((poolAmountAssetBalance - outAmountAssetAmt), (poolPriceAssetBalance - outPriceAssetAmt), (poolLPBalance - pmtAssetAmount))), StringEntry(keyGetActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataGetActionInfo(outAmountAssetAmt, outPriceAssetAmt, pmtAssetAmount, currentPrice, height, lastBlock.timestamp)), StringEntry(keyPriceLast(), ("%s__" + toString(currentPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(currentPrice)))]
412+ else throw("Strict value is not equal to itself.")
413+ }
414+ }
415+
416+
417+
418+@Callable(i)
419+func activate (amountAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
420+ then throw("permissions denied")
421+ else $Tuple2([StringEntry(keyAmountAsset(), amountAssetStr), StringEntry(keyPriceAsset(), priceAssetStr)], "success")
422+
423+
424+
425+@Callable(i)
426+func statsREADONLY () = {
427+ let poolConfigDataList = getPoolConfig()
428+ let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId])
429+ let amountAssetId = poolConfigDataList[idxAmountAssetId]
430+ let priceAssetId = poolConfigDataList[idxPriceAssetId]
431+ let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId]
432+ let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId]
433+ let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
434+ let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
435+ let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
436+ let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt])
437+ let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId)
438+ let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId)
439+ let pricesList = calculatePrices(accountAmountAssetBalance, accountPriceAssetBalance, poolLPBalance)
440+ let currentPrice = pricesList[0]
441+ let lpPriceInAmountAsset = pricesList[1]
442+ let lpPriceInPriceAsset = pricesList[2]
443+ let poolWeight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeight(toString(this))), "Pool doesn't have weight.")
444+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(accountAmountAssetBalance), toString(accountPriceAssetBalance), toString(poolLPBalance), toString(currentPrice), toString(lpPriceInAmountAsset), toString(lpPriceInPriceAsset), toString(poolWeight)], SEP))
445+ }
446+
447+
448+
449+@Callable(i)
450+func evaluatePutByAmountAssetREADONLY (slippageTolerance,inAmountAssetAmt,userAddress) = {
451+ let poolConfigDataList = getPoolConfig()
452+ let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId])
453+ let amountAssetId = poolConfigDataList[idxAmountAssetId]
454+ let priceAssetId = poolConfigDataList[idxPriceAssetId]
455+ let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId]
456+ let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId]
457+ let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
458+ let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
459+ let poolStatus = poolConfigDataList[idxPoolStatus]
460+ let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
461+ let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt])
462+ let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId)
463+ let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId)
464+ let accountAmountAssetBalanceCasted = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals)
465+ let accountPriceAssetBalanceCasted = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals)
466+ let curentPrice = if ((poolLPBalance == 0))
467+ then 0
468+ else calculatePrice(accountPriceAssetBalanceCasted, accountAmountAssetBalanceCasted)
469+ let inPriceAssetAmtCalculated = fraction(inAmountAssetAmt, curentPrice, scale8)
470+ let inPriceAssetAmt = privateCastToScaleOf(inPriceAssetAmtCalculated, priceAssetDecimals, scale8)
471+ let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress, true)
472+ let outLpAmountCalc = estimatedPutResults._1
473+ let curentPriceCalc = estimatedPutResults._2
474+ let poolAmountAssetBalanceCalc = estimatedPutResults._6
475+ let poolPriceAssetBalanceCAlc = estimatedPutResults._7
476+ let poolLPBalanceCalc = estimatedPutResults._8
477+ let poolStatusCalc = parseIntValue(estimatedPutResults._13)
478+ $Tuple2(nil, makeString(["%d%d%d%d%d%d", toString(outLpAmountCalc), toString(curentPrice), toString(poolAmountAssetBalanceCalc), toString(poolPriceAssetBalanceCAlc), toString(poolLPBalanceCalc), toString(poolStatusCalc)], SEP))
479+ }
480+
481+
482+
483+@Callable(i)
484+func evaluatePutByPriceAssetREADONLY (slippageTolerance,inPriceAssetAmt,userAddress) = {
485+ let poolConfigDataList = getPoolConfig()
486+ let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId])
487+ let amountAssetId = poolConfigDataList[idxAmountAssetId]
488+ let priceAssetId = poolConfigDataList[idxPriceAssetId]
489+ let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId]
490+ let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId]
491+ let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
492+ let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
493+ let poolStatus = poolConfigDataList[idxPoolStatus]
494+ let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
495+ let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt])
496+ let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId)
497+ let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId)
498+ let accountAmountAssetBalanceCasted = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals)
499+ let accountPriceAssetBalanceCasted = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals)
500+ let inPriceAssetAmtCalculatedTuple = privateCastToScaleOf(inPriceAssetAmt, scale8, priceAssetDecimals)
501+ let curentPrice = if ((poolLPBalance == 0))
502+ then 0
503+ else calculatePrice(accountPriceAssetBalanceCasted, accountAmountAssetBalanceCasted)
504+ let inAmountAssetAmtCalculated = fraction(inPriceAssetAmtCalculatedTuple, scale8, curentPrice)
505+ let inAmountAssetAmt = privateCastToScaleOf(inAmountAssetAmtCalculated, amoutAssetDecimals, scale8)
506+ let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress, true)
507+ let outLpAmountCalc = estimatedPutResults._1
508+ let curentPriceCalc = estimatedPutResults._2
509+ let poolAmountAssetBalanceCalc = estimatedPutResults._6
510+ let poolPriceAssetBalanceCAlc = estimatedPutResults._7
511+ let poolLPBalanceCalc = estimatedPutResults._8
512+ let poolStatusCalc = parseIntValue(estimatedPutResults._13)
513+ $Tuple2(nil, makeString(["%d%d%d%d%d%d", toString(outLpAmountCalc), toString(curentPrice), toString(poolAmountAssetBalanceCalc), toString(poolPriceAssetBalanceCAlc), toString(poolLPBalanceCalc), toString(poolStatusCalc)], SEP))
514+ }
515+
516+
517+
518+@Callable(i)
519+func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmount,userAddress) = {
520+ let results = privateEstimateGetOperation(paymentLpAssetId, paymentLpAmount, userAddress)
521+ let outAmountAssetAmt = results._1
522+ let outPriceAssetAmt = results._2
523+ let poolAmountAssetBalance = results._10
524+ let poolPriceAssetBalance = results._11
525+ let poolLPBalance = results._12
526+ let currentPrice = results._13
527+ let poolStatus = parseIntValue(results._14)
528+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmountAssetAmt), toString(outPriceAssetAmt), toString(poolAmountAssetBalance), toString(poolPriceAssetBalance), toString(poolLPBalance), toString(currentPrice), toString(poolStatus)], SEP))
529+ }
530+
531+
532+
533+@Callable(i)
534+func hashREADONLY () = $Tuple2(nil, toBase64String(value(scriptHash(this))))
535+
536+
537+@Verifier(tx)
538+func verify () = match tx {
539+ case order: Order =>
540+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
541+ case _ =>
542+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
543+}
544+

github/deemru/w8io/6500d08 
129.28 ms