tx · 7Bs8n6C5b71WcSHyYMrBiiEMZ8Ja2z8zZJZNsaVyQLAZ

3MvAHqu1rNkAZSWSj3A5LR5YAn221vbiFjL:  -0.01000000 Waves

2021.03.24 10:30 [1451532] smart account 3MvAHqu1rNkAZSWSj3A5LR5YAn221vbiFjL > SELF 0.00000000 Waves

{ "type": 13, "id": "7Bs8n6C5b71WcSHyYMrBiiEMZ8Ja2z8zZJZNsaVyQLAZ", "fee": 1000000, "feeAssetId": null, "timestamp": 1616571039142, "version": 1, "sender": "3MvAHqu1rNkAZSWSj3A5LR5YAn221vbiFjL", "senderPublicKey": "7rwfc8ZnW1L9eD8E6WekqUcRSisre6h15z2HKop2raKJ", "proofs": [ "2EgxG2j4xGqADYA4dcTjHwBCBcVCLNb6rmTqj6pV5wzEf62RryYaqSn2GUnj79GRyWNk53M6jqeyTScrHGWqYQYJ" ], "script": "base64:AAIEAAAAAAAAADUIAhIPCg0ICAgBCAEBAQgBAQEBEgMKAQESABIAEgUKAwgICBIFCgMICAgSBAoCCAESAwoBCAAAAEUAAAAAA1NFUAIAAAACX18BAAAAD2dldFN0cmluZ09yRmFpbAAAAAEAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5CQABLAAAAAICAAAAFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUAAAADa2V5AQAAABBnZXRCb29sZWFuT3JGYWlsAAAAAQAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBsAAAACBQAAAAR0aGlzBQAAAANrZXkJAAEsAAAAAgIAAAAVTm8gZGF0YSBmb3IgdGhpcy5rZXk9BQAAAANrZXkBAAAADGdldEludE9yRmFpbAAAAAEAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5CQABLAAAAAICAAAAFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUAAAADa2V5AQAAAA5mYWlsRXhlY3V0ZUdldAAAAAUAAAADbXNnAAAADGJhc2VBc3NldFN0cgAAAA51c2VyQWRkcmVzc1N0cgAAAA1zdWJtaXRUeElkU3RyAAAADW9wZXJhdGlvblR5cGUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAAA21zZwIAAAAPOiBiYXNlQXNzZXRTdHI9BQAAAAxiYXNlQXNzZXRTdHICAAAAECB1c2VyQWRkcmVzc1N0cj0FAAAADnVzZXJBZGRyZXNzU3RyAgAAAA8gc3VibWl0VHhJZFN0cj0FAAAADXN1Ym1pdFR4SWRTdHICAAAADyBvcGVyYXRpb25UeXBlPQUAAAANb3BlcmF0aW9uVHlwZQEAAAAXZmFpbFN1Ym1pdExpbWl0c0V4Y2VlZHMAAAAEAAAADXJlbWFpbmluZ0Jhc2UAAAAOcmVtYWluaW5nU2hhcmUAAAAQbmV3UmVtYWluaW5nQmFzZQAAABFuZXdSZW1haW5pbmdTaGFyZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAArc3VibWl0IG9wZXJhdGlvbiBsaW1pdHMgaGF2ZSBiZWVuIHJlYWNoZWQ6IAIAAAAPIHJlbWFpbmluZ0Jhc2U9CQABpAAAAAEFAAAADXJlbWFpbmluZ0Jhc2UCAAAAECByZW1haW5pbmdTaGFyZT0JAAGkAAAAAQUAAAAOcmVtYWluaW5nU2hhcmUCAAAAEiBuZXdSZW1haW5pbmdCYXNlPQkAAaQAAAABBQAAABBuZXdSZW1haW5pbmdCYXNlAgAAABMgbmV3UmVtYWluaW5nU2hhcmU9CQABpAAAAAEFAAAAEW5ld1JlbWFpbmluZ1NoYXJlAQAAABFjb252ZXJ0U2hhcmUyQmFzZQAAAAMAAAALc2hhcmVBbW91bnQAAAAFcHJpY2UAAAAJcHJpY2VNdWx0CQAAawAAAAMFAAAAC3NoYXJlQW1vdW50BQAAAAVwcmljZQUAAAAJcHJpY2VNdWx0AQAAABFjb252ZXJ0QmFzZTJTaGFyZQAAAAMAAAAKYmFzZUFtb3VudAAAAAVwcmljZQAAAAlwcmljZU11bHQJAABrAAAAAwUAAAAKYmFzZUFtb3VudAUAAAAJcHJpY2VNdWx0BQAAAAVwcmljZQEAAAALa2V5QXNzZXRDZmcAAAABAAAADGJhc2VBc3NldFN0cgkAASwAAAACAgAAABclcyVzJXNfX2NvbmZpZ19fYXNzZXRfXwUAAAAMYmFzZUFzc2V0U3RyAQAAABZrZXlOZXh0SW50ZXJuYWxBc3NldElkAAAAAAIAAAAXJXNfX25leHRJbnRlcm5hbEFzc2V0SWQBAAAADGtleVByaWNlTGFzdAAAAAEAAAAVaW50ZXJuYWxCYXNldEFzc2V0U3RyCQABLAAAAAICAAAAFSVzJXMlZF9fcHJpY2VfX2xhc3RfXwUAAAAVaW50ZXJuYWxCYXNldEFzc2V0U3RyAQAAAAtrZXlQcmljZUFUSAAAAAEAAAAVaW50ZXJuYWxCYXNldEFzc2V0U3RyCQABLAAAAAICAAAAFCVzJXMlZF9fcHJpY2VfX2F0aF9fBQAAABVpbnRlcm5hbEJhc2V0QXNzZXRTdHIBAAAAEmtleVByaWNlQnlUb3BVcElkeAAAAAIAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIAAAAIdG9wVXBJZHgJAAS5AAAAAgkABEwAAAACAgAAABslcyVzJWQlZF9fcHJpY2VfX2J5VG9wVXBJZHgJAARMAAAAAgUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIJAARMAAAAAgkAAaQAAAABBQAAAAh0b3BVcElkeAUAAAADbmlsBQAAAANTRVABAAAAD2tleVByaWNlSGlzdG9yeQAAAAMAAAAVaW50ZXJuYWxCYXNldEFzc2V0U3RyAAAAAWgAAAAJdGltZXN0YW1wCQAEuQAAAAIJAARMAAAAAgIAAAAaJXMlcyVkJWQlZF9fcHJpY2VfX2hpc3RvcnkJAARMAAAAAgUAAAAVaW50ZXJuYWxCYXNldEFzc2V0U3RyCQAETAAAAAIJAAGkAAAAAQUAAAABaAkABEwAAAACCQABpAAAAAEFAAAACXRpbWVzdGFtcAUAAAADbmlsBQAAAANTRVABAAAADmtleVRvdGFsTG9ja2VkAAAAAQAAABVpbnRlcm5hbEJhc2V0QXNzZXRTdHIJAAEsAAAAAgIAAAAXJXMlcyVkX190b3RhbF9fbG9ja2VkX18FAAAAFWludGVybmFsQmFzZXRBc3NldFN0cgEAAAAUa2V5VG90YWxMb2NrZWRCeVVzZXIAAAACAAAAFGludGVybmFsQmFzZUFzc2V0U3RyAAAADnVzZXJBZGRyZXNzU3RyCQAEuQAAAAIJAARMAAAAAgIAAAAXJXMlcyVkJXNfX3RvdGFsX19sb2NrZWQJAARMAAAAAgUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIJAARMAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIFAAAAA25pbAUAAAADU0VQAQAAAB9rZXlNYXBwaW5nc0ludGVybmFsMmJhc2VBc3NldElkAAAAAQAAABFpbnRlcm5hbEJhc2VBc3NldAkAASwAAAACAgAAACglcyVzJWRfX21hcHBpbmdzX19pbnRlcm5hbDJiYXNlQXNzZXRJZF9fCQABpAAAAAEFAAAAEWludGVybmFsQmFzZUFzc2V0AQAAAB9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkAAAAAQAAAAxiYXNlQXNzZXRTdHIJAAEsAAAAAgIAAAAoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUAAAAMYmFzZUFzc2V0U3RyAQAAABxrZXlNYXBwaW5nc1NoYXJlMmJhc2VBc3NldElkAAAAAQAAAA1zaGFyZUFzc2V0U3RyCQABLAAAAAICAAAAJSVzJXMlc19fbWFwcGluZ3NfX3NoYXJlMmJhc2VBc3NldElkX18FAAAADXNoYXJlQXNzZXRTdHIBAAAAHGtleU1hcHBpbmdzQmFzZUFzc2V0MnNoYXJlSWQAAAABAAAADGJhc2VBc3NldFN0cgkAASwAAAACAgAAACUlcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyc2hhcmVJZF9fBQAAAAxiYXNlQXNzZXRTdHIBAAAAF2tleVNodXRkb3duUHV0T3BlcmF0aW9uAAAAAQAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgkAASwAAAACAgAAABclcyVzJWRfX3NodXRkb3duX19wdXRfXwUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIBAAAAEmtleVNodXRkb3duTWFuYWdlcgAAAAEAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIJAAEsAAAAAgIAAAAbJXMlcyVkX19zaHV0ZG93bl9fbWFuYWdlcl9fBQAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgEAAAASa2V5VG9wVXBDdXJyZW50SWR4AAAAAQAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgkAASwAAAACAgAAABslcyVzJWRfX3RvcHVwX19jdXJyZW50SWR4X18FAAAAFGludGVybmFsQmFzZUFzc2V0U3RyAQAAABJrZXlUb3BVcExhc3RIZWlnaHQAAAACAAAAFWludGVybmFsQmFzZXRBc3NldFN0cgAAAAZzZW5kZXIJAAS5AAAAAgkABEwAAAACAgAAAB8lcyVzJXMlZCVzX190b3B1cF9fbGFzdF9faGVpZ2h0CQAETAAAAAIFAAAAFWludGVybmFsQmFzZXRBc3NldFN0cgkABEwAAAACBQAAAAZzZW5kZXIFAAAAA25pbAUAAAADU0VQAQAAABJrZXlMaW1pdHNSZW1haW5pbmcAAAABAAAAFWludGVybmFsQmFzZXRBc3NldFN0cgkAASwAAAACAgAAABklcyVzX19saW1pdHNfX3JlbWFpbmluZ19fBQAAABVpbnRlcm5hbEJhc2V0QXNzZXRTdHIAAAAAEklkeENmZ1NoYXJlQXNzZXRJZAAAAAAAAAAAAQAAAAAXSWR4Q2ZnSW50ZXJuYWxCYXNlQXNzZXQAAAAAAAAAAAIAAAAAHElkeENmZ0RlY2ltYWxzTXVsdEJvdGhBc3NldHMAAAAAAAAAAAMAAAAAF0lkeENmZ0RlY2ltYWxzTXVsdFByaWNlAAAAAAAAAAAEAAAAABRJZHhDZmdHZXREZWxheUJsb2NrcwAAAAAAAAAABQAAAAAbSWR4Q2ZnVG9wdXBJbnRlcnZhbEluQmxvY2tzAAAAAAAAAAAGAAAAABpJZHhDZmdUb3B1cE1heE5lZ2F0aXZlUGFydAAAAAAAAAAABwAAAAAZSWR4Q2ZnVG9wdXBNYW5hZ2VyQWRkcmVzcwAAAAAAAAAACAAAAAAZSWR4Q2ZnU3VibWl0TGltaXRzQmFzZU1heAAAAAAAAAAACQAAAAAbSWR4Q2ZnU3VibWl0TGltaXRzQmFzZVJlc2V0AAAAAAAAAAAKAAAAABpJZHhDZmdTdWJtaXRMaW1pdHNTaGFyZU1heAAAAAAAAAAACwAAAAAcSWR4Q2ZnU3VibWl0TGltaXRzU2hhcmVSZXNldAAAAAAAAAAADAEAAAAMZGF0YUFzc2V0Q2ZnAAAADAAAAA1zaGFyZUFzc2V0U3RyAAAAFGludGVybmFsQmFzZUFzc2V0U3RyAAAAFmRlY2ltYWxzTXVsdEJvdGhBc3NldHMAAAARZGVjaW1hbHNNdWx0UHJpY2UAAAAQZ2V0RGVsYXlJbkJsb2NrcwAAABV0b3B1cEludGVydmFsSW5CbG9ja3MAAAAUdG9wdXBNYXhOZWdhdGl2ZVBhcnQAAAATdG9wdXBNYW5hZ2VyQWRkcmVzcwAAABNzdWJtaXRMaW1pdHNCYXNlTWF4AAAAFXN1Ym1pdExpbWl0c0Jhc2VSZXNldAAAABRzdWJtaXRMaW1pdHNTaGFyZU1heAAAABZzdWJtaXRMaW1pdHNTaGFyZVJlc2V0CQAEuQAAAAIJAARMAAAAAgIAAAAYJXMlZCVkJWQlZCVkJWQlcyVkJWQlZCVkCQAETAAAAAIFAAAADXNoYXJlQXNzZXRTdHIJAARMAAAAAgUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIJAARMAAAAAgkAAaQAAAABBQAAABZkZWNpbWFsc011bHRCb3RoQXNzZXRzCQAETAAAAAIJAAGkAAAAAQUAAAARZGVjaW1hbHNNdWx0UHJpY2UJAARMAAAAAgkAAaQAAAABBQAAABBnZXREZWxheUluQmxvY2tzCQAETAAAAAIJAAGkAAAAAQUAAAAVdG9wdXBJbnRlcnZhbEluQmxvY2tzCQAETAAAAAIJAAGkAAAAAQUAAAAUdG9wdXBNYXhOZWdhdGl2ZVBhcnQJAARMAAAAAgUAAAATdG9wdXBNYW5hZ2VyQWRkcmVzcwkABEwAAAACCQABpAAAAAEFAAAAE3N1Ym1pdExpbWl0c0Jhc2VNYXgJAARMAAAAAgkAAaQAAAABBQAAABVzdWJtaXRMaW1pdHNCYXNlUmVzZXQJAARMAAAAAgkAAaQAAAABBQAAABRzdWJtaXRMaW1pdHNTaGFyZU1heAkABEwAAAACCQABpAAAAAEFAAAAFnN1Ym1pdExpbWl0c1NoYXJlUmVzZXQFAAAAA25pbAUAAAADU0VQAAAAABVJZHhUb3RhbExvY2tlZEluU2hhcmUAAAAAAAAAAAEAAAAAFUlkeFRvdGFsTG9ja2VkT3V0QmFzZQAAAAAAAAAAAgAAAAAUSWR4VG90YWxMb2NrZWRJbkJhc2UAAAAAAAAAAAMAAAAAFklkeFRvdGFsTG9ja2VkT3V0U2hhcmUAAAAAAAAAAAQBAAAAD2RhdGFUb3RhbExvY2tlZAAAAAQAAAANaW5TaGFyZUFtb3VudAAAAA1vdXRCYXNlQW1vdW50AAAADGluQmFzZUFtb3VudAAAAA5vdXRTaGFyZUFtb3VudAkABLkAAAACCQAETAAAAAICAAAACCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAANaW5TaGFyZUFtb3VudAkABEwAAAACCQABpAAAAAEFAAAADW91dEJhc2VBbW91bnQJAARMAAAAAgkAAaQAAAABBQAAAAxpbkJhc2VBbW91bnQJAARMAAAAAgkAAaQAAAABBQAAAA5vdXRTaGFyZUFtb3VudAUAAAADbmlsBQAAAANTRVABAAAAEmRhdGFUb3RhbExvY2tlZEludAAAAAQAAAANaW5TaGFyZUFtb3VudAAAAA1vdXRCYXNlQW1vdW50AAAADGluQmFzZUFtb3VudAAAAA5vdXRTaGFyZUFtb3VudAkABEwAAAACAP//////////CQAETAAAAAIFAAAADWluU2hhcmVBbW91bnQJAARMAAAAAgUAAAANb3V0QmFzZUFtb3VudAkABEwAAAACBQAAAAxpbkJhc2VBbW91bnQJAARMAAAAAgUAAAAOb3V0U2hhcmVBbW91bnQFAAAAA25pbAEAAAAPcmVhZFRvdGFsTG9ja2VkAAAAAQAAAANrZXkEAAAAEHRvdGFsTG9ja2VkQXJyYXkJAAS1AAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkJAQAAAA9kYXRhVG90YWxMb2NrZWQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAANTRVAJAQAAABJkYXRhVG90YWxMb2NrZWRJbnQAAAAECQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAQdG90YWxMb2NrZWRBcnJheQUAAAAVSWR4VG90YWxMb2NrZWRJblNoYXJlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAQdG90YWxMb2NrZWRBcnJheQUAAAAVSWR4VG90YWxMb2NrZWRPdXRCYXNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAQdG90YWxMb2NrZWRBcnJheQUAAAAUSWR4VG90YWxMb2NrZWRJbkJhc2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABB0b3RhbExvY2tlZEFycmF5BQAAABZJZHhUb3RhbExvY2tlZE91dFNoYXJlAQAAABNjYWxjVG90YWxMb2NrZWREaWZmAAAACAAAAAlkaXJlY3Rpb24AAAANb3BlcmF0aW9uVHlwZQAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgAAAAVwcmljZQAAAAlwcmljZU11bHQAAAAIaW5BbW91bnQAAAALYmFzZUFzc2V0SWQAAAAMc2hhcmVBc3NldElkBAAAAAF0CQABLAAAAAIFAAAACWRpcmVjdGlvbgUAAAANb3BlcmF0aW9uVHlwZQMJAAAAAAAAAgUAAAABdAIAAAAHc3VibWl0UAQAAAAJdG90YWxEaWZmCQEAAAASZGF0YVRvdGFsTG9ja2VkSW50AAAABAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAIaW5BbW91bnQAAAAAAAAAAAAEAAAACHVzZXJEaWZmBQAAAAl0b3RhbERpZmYJAAUWAAAABAUAAAAJdG90YWxEaWZmBQAAAAh1c2VyRGlmZgAAAAAAAAAAAAkAAlkAAAABAgAAAAADCQAAAAAAAAIFAAAAAXQCAAAAB3N1Ym1pdEcEAAAACXRvdGFsRGlmZgkBAAAAEmRhdGFUb3RhbExvY2tlZEludAAAAAQFAAAACGluQW1vdW50AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAh1c2VyRGlmZgUAAAAJdG90YWxEaWZmCQAFFgAAAAQFAAAACXRvdGFsRGlmZgUAAAAIdXNlckRpZmYAAAAAAAAAAAAJAAJZAAAAAQIAAAAAAwkAAAAAAAACBQAAAAF0AgAAAAhleGVjdXRlUAQAAAAJb3V0QW1vdW50CQEAAAARY29udmVydEJhc2UyU2hhcmUAAAADBQAAAAhpbkFtb3VudAUAAAAFcHJpY2UFAAAACXByaWNlTXVsdAQAAAAJdG90YWxEaWZmCQEAAAASZGF0YVRvdGFsTG9ja2VkSW50AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAJb3V0QW1vdW50BAAAAAh1c2VyRGlmZgkBAAAAEmRhdGFUb3RhbExvY2tlZEludAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAFAAAACGluQW1vdW50AAAAAAAAAAAACQAFFgAAAAQFAAAACXRvdGFsRGlmZgUAAAAIdXNlckRpZmYFAAAACW91dEFtb3VudAUAAAAMc2hhcmVBc3NldElkAwkAAAAAAAACBQAAAAF0AgAAAAhleGVjdXRlRwQAAAAJb3V0QW1vdW50CQEAAAARY29udmVydFNoYXJlMkJhc2UAAAADBQAAAAhpbkFtb3VudAUAAAAFcHJpY2UFAAAACXByaWNlTXVsdAQAAAAJdG90YWxEaWZmCQEAAAASZGF0YVRvdGFsTG9ja2VkSW50AAAABAAAAAAAAAAAAAUAAAAJb3V0QW1vdW50AAAAAAAAAAAAAAAAAAAAAAAABAAAAAh1c2VyRGlmZgkBAAAAEmRhdGFUb3RhbExvY2tlZEludAAAAAQFAAAACGluQW1vdW50AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAFFgAAAAQFAAAACXRvdGFsRGlmZgUAAAAIdXNlckRpZmYFAAAACW91dEFtb3VudAUAAAALYmFzZUFzc2V0SWQDCQAAAAAAAAIFAAAAAXQCAAAABXRvcHVwBAAAABB0b3RhbExvY2tlZEFycmF5CQEAAAAPcmVhZFRvdGFsTG9ja2VkAAAAAQkBAAAADmtleVRvdGFsTG9ja2VkAAAAAQUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIEAAAAF3RvdGFsTG9ja2VkSW5CYXNlQW1vdW50CQABkQAAAAIFAAAAEHRvdGFsTG9ja2VkQXJyYXkFAAAAFElkeFRvdGFsTG9ja2VkSW5CYXNlBAAAABh0b3RhbExvY2tlZEluU2hhcmVBbW91bnQJAAGRAAAAAgUAAAAQdG90YWxMb2NrZWRBcnJheQUAAAAVSWR4VG90YWxMb2NrZWRJblNoYXJlBAAAAAl0b3RhbERpZmYJAQAAABJkYXRhVG90YWxMb2NrZWRJbnQAAAAEBQAAABh0b3RhbExvY2tlZEluU2hhcmVBbW91bnQJAABoAAAAAgD//////////wkBAAAAEWNvbnZlcnRTaGFyZTJCYXNlAAAAAwUAAAAYdG90YWxMb2NrZWRJblNoYXJlQW1vdW50BQAAAAVwcmljZQUAAAAJcHJpY2VNdWx0BQAAABd0b3RhbExvY2tlZEluQmFzZUFtb3VudAkAAGgAAAACAP//////////CQEAAAARY29udmVydEJhc2UyU2hhcmUAAAADBQAAABd0b3RhbExvY2tlZEluQmFzZUFtb3VudAUAAAAFcHJpY2UFAAAACXByaWNlTXVsdAkABRYAAAAEBQAAAAl0b3RhbERpZmYFAAAAA25pbAAAAAAAAAAAAAkAAlkAAAABAgAAAAAJAAACAAAAAQkAASwAAAACAgAAABFVbnN1cHBvcnRlZCBUeXBlIAUAAAABdAEAAAAWVG90YWxMb2NrZWRTdHJpbmdFbnRyeQAAAAMAAAAGYWN0aW9uAAAAA2tleQAAAARkaWZmCgEAAAAGVVBEQVRFAAAAAgAAAAFhAAAAAWIDCQAAAAAAAAIFAAAABmFjdGlvbgIAAAAJSU5DUkVNRU5UCQAAZAAAAAIFAAAAAWEFAAAAAWIDCQAAAAAAAAIFAAAABmFjdGlvbgIAAAAJREVDUkVNRU5UCQAAZQAAAAIFAAAAAWEFAAAAAWIJAAACAAAAAQkAASwAAAACAgAAABNVbnN1cHBvcnRlZCBhY3Rpb24gBQAAAAZhY3Rpb24EAAAACWRhdGFBcnJheQkBAAAAD3JlYWRUb3RhbExvY2tlZAAAAAEFAAAAA2tleQkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAADa2V5CQEAAAAPZGF0YVRvdGFsTG9ja2VkAAAABAkBAAAABlVQREFURQAAAAIJAAGRAAAAAgUAAAAJZGF0YUFycmF5BQAAABVJZHhUb3RhbExvY2tlZEluU2hhcmUJAAGRAAAAAgUAAAAEZGlmZgUAAAAVSWR4VG90YWxMb2NrZWRJblNoYXJlCQEAAAAGVVBEQVRFAAAAAgkAAZEAAAACBQAAAAlkYXRhQXJyYXkFAAAAFUlkeFRvdGFsTG9ja2VkT3V0QmFzZQkAAZEAAAACBQAAAARkaWZmBQAAABVJZHhUb3RhbExvY2tlZE91dEJhc2UJAQAAAAZVUERBVEUAAAACCQABkQAAAAIFAAAACWRhdGFBcnJheQUAAAAUSWR4VG90YWxMb2NrZWRJbkJhc2UJAAGRAAAAAgUAAAAEZGlmZgUAAAAUSWR4VG90YWxMb2NrZWRJbkJhc2UJAQAAAAZVUERBVEUAAAACCQABkQAAAAIFAAAACWRhdGFBcnJheQUAAAAWSWR4VG90YWxMb2NrZWRPdXRTaGFyZQkAAZEAAAACBQAAAARkaWZmBQAAABZJZHhUb3RhbExvY2tlZE91dFNoYXJlAQAAAAxrZXlPcGVyYXRpb24AAAAEAAAADW9wZXJhdGlvblR5cGUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIAAAALdXNlckFkZHJlc3MAAAAEdHhJZAkABLkAAAACCQAETAAAAAICAAAACCVzJWQlcyVzCQAETAAAAAIFAAAADW9wZXJhdGlvblR5cGUJAARMAAAAAgUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIJAARMAAAAAgUAAAALdXNlckFkZHJlc3MJAARMAAAAAgUAAAAEdHhJZAUAAAADbmlsBQAAAANTRVAAAAAADUlkeE9wZXJTdGF0dXMAAAAAAAAAAAEAAAAAD0lkeE9wZXJJbkFtb3VudAAAAAAAAAAAAgAAAAAMSWR4T3BlclByaWNlAAAAAAAAAAADAAAAABBJZHhPcGVyT3V0QW1vdW50AAAAAAAAAAAEAAAAABJJZHhPcGVyU3RhcnRIZWlnaHQAAAAAAAAAAAUAAAAAFUlkeE9wZXJTdGFydFRpbWVzdGFtcAAAAAAAAAAABgAAAAAQSWR4T3BlckVuZEhlaWdodAAAAAAAAAAABwAAAAATSWR4T3BlckVuZFRpbWVzdGFtcAAAAAAAAAAACAAAAAALSWR4T3BlckxvY2sAAAAAAAAAAAkBAAAAHnByaXZhdGVEYXRhT3BlcmF0aW9uQWxsU3RyaW5ncwAAAAkAAAAGc3RhdHVzAAAADWluQXNzZXRBbW91bnQAAAAFcHJpY2UAAAAOb3V0QXNzZXRBbW91bnQAAAALc3RhcnRIZWlnaHQAAAAOc3RhcnRUaW1lc3RhbXAAAAAJZW5kSGVpZ2h0AAAADGVuZFRpbWVzdGFtcAAAAARsb2NrCQAEuQAAAAIJAARMAAAAAgIAAAASJXMlZCVkJWQlZCVkJWQlZCVkCQAETAAAAAIFAAAABnN0YXR1cwkABEwAAAACBQAAAA1pbkFzc2V0QW1vdW50CQAETAAAAAIFAAAABXByaWNlCQAETAAAAAIFAAAADm91dEFzc2V0QW1vdW50CQAETAAAAAIFAAAAC3N0YXJ0SGVpZ2h0CQAETAAAAAIFAAAADnN0YXJ0VGltZXN0YW1wCQAETAAAAAIFAAAACWVuZEhlaWdodAkABEwAAAACBQAAAAxlbmRUaW1lc3RhbXAJAARMAAAAAgUAAAAEbG9jawUAAAADbmlsBQAAAANTRVABAAAADWRhdGFPcGVyYXRpb24AAAAJAAAABnN0YXR1cwAAAA1pbkFzc2V0QW1vdW50AAAABXByaWNlAAAADm91dEFzc2V0QW1vdW50AAAAC3N0YXJ0SGVpZ2h0AAAADnN0YXJ0VGltZXN0YW1wAAAACWVuZEhlaWdodAAAAAxlbmRUaW1lc3RhbXAAAAAEbG9jawkBAAAAHnByaXZhdGVEYXRhT3BlcmF0aW9uQWxsU3RyaW5ncwAAAAkFAAAABnN0YXR1cwkAAaQAAAABBQAAAA1pbkFzc2V0QW1vdW50CQABpAAAAAEFAAAABXByaWNlCQABpAAAAAEFAAAADm91dEFzc2V0QW1vdW50CQABpAAAAAEFAAAAC3N0YXJ0SGVpZ2h0CQABpAAAAAEFAAAADnN0YXJ0VGltZXN0YW1wCQABpAAAAAEFAAAACWVuZEhlaWdodAkAAaQAAAABBQAAAAxlbmRUaW1lc3RhbXAJAAGkAAAAAQUAAAAEbG9jawEAAAAcZGF0YU9wZXJhdGlvbkV4ZWN1dGlvblVwZGF0ZQAAAAQAAAANY3Vyck9wZXJBcnJheQAAAAluZXdTdGF0dXMAAAAIbmV3UHJpY2UAAAAMbmV3T3V0QW1vdW50CQEAAAAecHJpdmF0ZURhdGFPcGVyYXRpb25BbGxTdHJpbmdzAAAACQUAAAAJbmV3U3RhdHVzCQABkQAAAAIFAAAADWN1cnJPcGVyQXJyYXkFAAAAD0lkeE9wZXJJbkFtb3VudAkAAaQAAAABBQAAAAhuZXdQcmljZQkAAaQAAAABBQAAAAxuZXdPdXRBbW91bnQJAAGRAAAAAgUAAAANY3Vyck9wZXJBcnJheQUAAAASSWR4T3BlclN0YXJ0SGVpZ2h0CQABkQAAAAIFAAAADWN1cnJPcGVyQXJyYXkFAAAAFUlkeE9wZXJTdGFydFRpbWVzdGFtcAkAAaQAAAABBQAAAAZoZWlnaHQJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAAGRAAAAAgUAAAANY3Vyck9wZXJBcnJheQUAAAALSWR4T3BlckxvY2sBAAAAEnJlYWRBc3NldENmZ09yRmFpbAAAAAEAAAAMYmFzZUFzc2V0U3RyBAAAAANrZXkJAQAAAAtrZXlBc3NldENmZwAAAAEFAAAADGJhc2VBc3NldFN0cgkABLUAAAACCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQUAAAADa2V5BQAAAANTRVAAAAAAFklkeExpbWl0c1JlbWFpbmluZ0Jhc2UAAAAAAAAAAAEAAAAAF0lkeExpbWl0c1JlbWFpbmluZ1NoYXJlAAAAAAAAAAACAQAAABpSZW1haW5pbmdMaW1pdHNTdHJpbmdFbnRyeQAAAAMAAAADa2V5AAAAEmJhc2VSZW1haW5pbmdMaW1pdAAAABNzaGFyZVJlbWFpbmluZ0xpbWl0CQEAAAALU3RyaW5nRW50cnkAAAACBQAAAANrZXkJAAS5AAAAAgkABEwAAAACAgAAAAQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAASYmFzZVJlbWFpbmluZ0xpbWl0CQAETAAAAAIJAAGkAAAAAQUAAAATc2hhcmVSZW1haW5pbmdMaW1pdAUAAAADbmlsBQAAAANTRVABAAAAEGdlbmVyaWNDYWxjUHJpY2UAAAAFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyAAAAC2Jhc2VBc3NldElkAAAAD3RvcFVwQmFzZUFtb3VudAAAAAxzaGFyZUFzc2V0SWQAAAARZGVjaW1hbHNNdWx0UHJpY2UEAAAAEHRvdGFsTG9ja2VkQXJyYXkJAQAAAA9yZWFkVG90YWxMb2NrZWQAAAABCQEAAAAOa2V5VG90YWxMb2NrZWQAAAABBQAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgQAAAAYdG90YWxMb2NrZWRPdXRCYXNlQW1vdW50CQABkQAAAAIFAAAAEHRvdGFsTG9ja2VkQXJyYXkFAAAAFUlkeFRvdGFsTG9ja2VkT3V0QmFzZQQAAAAXdG90YWxMb2NrZWRJbkJhc2VBbW91bnQJAAGRAAAAAgUAAAAQdG90YWxMb2NrZWRBcnJheQUAAAAUSWR4VG90YWxMb2NrZWRJbkJhc2UEAAAAEGJhc2VBc3NldEJhbGFuY2UJAAPwAAAAAgUAAAAEdGhpcwUAAAALYmFzZUFzc2V0SWQEAAAAFGJhc2VBc3NldEJhbGFuY2VDQUxDCQAAZQAAAAIJAABlAAAAAgkAAGQAAAACBQAAABBiYXNlQXNzZXRCYWxhbmNlBQAAAA90b3BVcEJhc2VBbW91bnQFAAAAF3RvdGFsTG9ja2VkSW5CYXNlQW1vdW50BQAAABh0b3RhbExvY2tlZE91dEJhc2VBbW91bnQEAAAAGXRvdGFsTG9ja2VkT3V0U2hhcmVBbW91bnQJAAGRAAAAAgUAAAAQdG90YWxMb2NrZWRBcnJheQUAAAAWSWR4VG90YWxMb2NrZWRPdXRTaGFyZQQAAAAYdG90YWxMb2NrZWRJblNoYXJlQW1vdW50CQABkQAAAAIFAAAAEHRvdGFsTG9ja2VkQXJyYXkFAAAAFUlkeFRvdGFsTG9ja2VkSW5TaGFyZQQAAAANc2hhcmVFbWlzc2lvbggJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQUAAAAMc2hhcmVBc3NldElkAAAACHF1YW50aXR5BAAAABFzaGFyZUVtaXNzaW9uQ0FMQwkAAGQAAAACBQAAAA1zaGFyZUVtaXNzaW9uBQAAABl0b3RhbExvY2tlZE91dFNoYXJlQW1vdW50AwkAAGYAAAACAAAAAAAAAAAABQAAABRiYXNlQXNzZXRCYWxhbmNlQ0FMQwkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACtiYXNlQXNzZXRCYWxhbmNlQ0FMQyA8IDA6IGJhc2VBc3NldEJhbGFuY2U9CQABpAAAAAEFAAAAEGJhc2VBc3NldEJhbGFuY2UCAAAAFiBiYXNlQXNzZXRCYWxhbmNlQ0FMQz0JAAGkAAAAAQUAAAAUYmFzZUFzc2V0QmFsYW5jZUNBTEMEAAAABXByaWNlAwkAAAAAAAACBQAAAA1zaGFyZUVtaXNzaW9uAAAAAAAAAAAACQAAaAAAAAIAAAAAAAAAAAIFAAAAEWRlY2ltYWxzTXVsdFByaWNlCQAAawAAAAMFAAAAFGJhc2VBc3NldEJhbGFuY2VDQUxDBQAAABFkZWNpbWFsc011bHRQcmljZQUAAAARc2hhcmVFbWlzc2lvbkNBTEMJAAUXAAAABQUAAAAFcHJpY2UFAAAAEGJhc2VBc3NldEJhbGFuY2UFAAAAGHRvdGFsTG9ja2VkT3V0QmFzZUFtb3VudAUAAAAUYmFzZUFzc2V0QmFsYW5jZUNBTEMFAAAADXNoYXJlRW1pc3Npb24BAAAACWNhbGNQcmljZQAAAAQAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIAAAALYmFzZUFzc2V0SWQAAAAMc2hhcmVBc3NldElkAAAAEWRlY2ltYWxzTXVsdFByaWNlCQEAAAAQZ2VuZXJpY0NhbGNQcmljZQAAAAUFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyBQAAAAtiYXNlQXNzZXRJZAAAAAAAAAAAAAUAAAAMc2hhcmVBc3NldElkBQAAABFkZWNpbWFsc011bHRQcmljZQEAAAAGc3VibWl0AAAABQAAAA1vcGVyYXRpb25UeXBlAAAAAWkAAAAIaW5BbW91bnQAAAAJaW5Bc3NldElkAAAADGJhc2VBc3NldFN0cgQAAAAKaW5Bc3NldFN0cgkAAlgAAAABBQAAAAlpbkFzc2V0SWQEAAAADnVzZXJBZGRyZXNzU3RyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAALYmFzZUFzc2V0SWQJAAJZAAAAAQUAAAAMYmFzZUFzc2V0U3RyBAAAAAhjZmdBcnJheQkBAAAAEnJlYWRBc3NldENmZ09yRmFpbAAAAAEFAAAADGJhc2VBc3NldFN0cgQAAAANc2hhcmVBc3NldFN0cgkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAASSWR4Q2ZnU2hhcmVBc3NldElkBAAAAAxzaGFyZUFzc2V0SWQJAAJZAAAAAQUAAAANc2hhcmVBc3NldFN0cgQAAAAWZGVjaW1hbHNNdWx0Qm90aEFzc2V0cwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABxJZHhDZmdEZWNpbWFsc011bHRCb3RoQXNzZXRzBAAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAXSWR4Q2ZnSW50ZXJuYWxCYXNlQXNzZXQEAAAACWxpbWl0c0tFWQkBAAAAEmtleUxpbWl0c1JlbWFpbmluZwAAAAEFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyBAAAAA5saW1pdHNDZmdBcnJheQkABLUAAAACCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQUAAAAJbGltaXRzS0VZBQAAAANTRVAEAAAAE2xpbWl0c1JlbWFpbmluZ0Jhc2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA5saW1pdHNDZmdBcnJheQUAAAAWSWR4TGltaXRzUmVtYWluaW5nQmFzZQQAAAAUbGltaXRzUmVtYWluaW5nU2hhcmUJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA5saW1pdHNDZmdBcnJheQUAAAAXSWR4TGltaXRzUmVtYWluaW5nU2hhcmUEAAAADGlzUHV0QmxvY2tlZAkBAAAAEGdldEJvb2xlYW5PckZhaWwAAAABCQEAAAAXa2V5U2h1dGRvd25QdXRPcGVyYXRpb24AAAABBQAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgMFAAAADGlzUHV0QmxvY2tlZAkAAAIAAAABAgAAABhwdXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQEAAAACWRpZmZUdXBsZQkBAAAAE2NhbGNUb3RhbExvY2tlZERpZmYAAAAIAgAAAAZzdWJtaXQFAAAADW9wZXJhdGlvblR5cGUFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyAAAAAAAAAAAAAAAAAAAAAAAABQAAAAhpbkFtb3VudAUAAAALYmFzZUFzc2V0SWQFAAAADHNoYXJlQXNzZXRJZAQAAAAWbGltaXRzUmVtYWluaW5nQmFzZU5ldwkAAGUAAAACBQAAABNsaW1pdHNSZW1haW5pbmdCYXNlCQABkQAAAAIIBQAAAAlkaWZmVHVwbGUAAAACXzIFAAAAFElkeFRvdGFsTG9ja2VkSW5CYXNlBAAAABdsaW1pdHNSZW1haW5pbmdTaGFyZU5ldwkAAGUAAAACBQAAABRsaW1pdHNSZW1haW5pbmdTaGFyZQkAAZEAAAACCAUAAAAJZGlmZlR1cGxlAAAAAl8yBQAAABVJZHhUb3RhbExvY2tlZEluU2hhcmUDAwkAAGYAAAACAAAAAAAAAAAABQAAABZsaW1pdHNSZW1haW5pbmdCYXNlTmV3BgkAAGYAAAACAAAAAAAAAAAABQAAABdsaW1pdHNSZW1haW5pbmdTaGFyZU5ldwkBAAAAF2ZhaWxTdWJtaXRMaW1pdHNFeGNlZWRzAAAABAUAAAATbGltaXRzUmVtYWluaW5nQmFzZQUAAAAUbGltaXRzUmVtYWluaW5nU2hhcmUFAAAAFmxpbWl0c1JlbWFpbmluZ0Jhc2VOZXcFAAAAF2xpbWl0c1JlbWFpbmluZ1NoYXJlTmV3BAAAAA90b3BVcEN1cnJlbnRJZHgJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAASa2V5VG9wVXBDdXJyZW50SWR4AAAAAQUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIJAARNAAAAAgkABE0AAAACCQAETQAAAAIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADGtleU9wZXJhdGlvbgAAAAQFAAAADW9wZXJhdGlvblR5cGUFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyBQAAAA51c2VyQWRkcmVzc1N0cgkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkCQEAAAANZGF0YU9wZXJhdGlvbgAAAAkCAAAAB1BFTkRJTkcFAAAACGluQW1vdW50AAAAAAAAAAAAAAAAAAAAAAAABQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wAAAAAAAAAAAAAAAAAAAAAAAACQAAZAAAAAIFAAAAD3RvcFVwQ3VycmVudElkeAAAAAAAAAAAAQUAAAADbmlsCQEAAAAWVG90YWxMb2NrZWRTdHJpbmdFbnRyeQAAAAMCAAAACUlOQ1JFTUVOVAkBAAAADmtleVRvdGFsTG9ja2VkAAAAAQUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIIBQAAAAlkaWZmVHVwbGUAAAACXzEJAQAAABZUb3RhbExvY2tlZFN0cmluZ0VudHJ5AAAAAwIAAAAJSU5DUkVNRU5UCQEAAAAUa2V5VG90YWxMb2NrZWRCeVVzZXIAAAACBQAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgUAAAAOdXNlckFkZHJlc3NTdHIIBQAAAAlkaWZmVHVwbGUAAAACXzIJAQAAABpSZW1haW5pbmdMaW1pdHNTdHJpbmdFbnRyeQAAAAMFAAAACWxpbWl0c0tFWQUAAAAWbGltaXRzUmVtYWluaW5nQmFzZU5ldwUAAAAXbGltaXRzUmVtYWluaW5nU2hhcmVOZXcBAAAAB2V4ZWN1dGUAAAAEAAAADW9wZXJhdGlvblR5cGUAAAAMYmFzZUFzc2V0U3RyAAAADnVzZXJBZGRyZXNzU3RyAAAADXN1Ym1pdFR4SWRTdHIEAAAAC3VzZXJBZGRyZXNzCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAA51c2VyQWRkcmVzc1N0cgQAAAANYXNzZXRDZmdBcnJheQkBAAAAEnJlYWRBc3NldENmZ09yRmFpbAAAAAEFAAAADGJhc2VBc3NldFN0cgQAAAAMc2hhcmVBc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAANYXNzZXRDZmdBcnJheQUAAAASSWR4Q2ZnU2hhcmVBc3NldElkBAAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgkAAZEAAAACBQAAAA1hc3NldENmZ0FycmF5BQAAABdJZHhDZmdJbnRlcm5hbEJhc2VBc3NldAQAAAARZGVjaW1hbHNNdWx0UHJpY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA1hc3NldENmZ0FycmF5BQAAABdJZHhDZmdEZWNpbWFsc011bHRQcmljZQQAAAALYmFzZUFzc2V0SWQJAAJZAAAAAQUAAAAMYmFzZUFzc2V0U3RyBAAAAAxvcGVyYXRpb25LZXkJAQAAAAxrZXlPcGVyYXRpb24AAAAEBQAAAA1vcGVyYXRpb25UeXBlBQAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADXN1Ym1pdFR4SWRTdHIEAAAADm9wZXJhdGlvbkFycmF5CQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABBQAAAAxvcGVyYXRpb25LZXkFAAAAA1NFUAQAAAAGc3RhdHVzCQABkQAAAAIFAAAADm9wZXJhdGlvbkFycmF5BQAAAA1JZHhPcGVyU3RhdHVzBAAAAAhpbkFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADm9wZXJhdGlvbkFycmF5BQAAAA9JZHhPcGVySW5BbW91bnQEAAAACG9wZXJMb2NrCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAOb3BlcmF0aW9uQXJyYXkFAAAAC0lkeE9wZXJMb2NrBAAAAAxjdXJyVG9wVXBJZHgJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAASa2V5VG9wVXBDdXJyZW50SWR4AAAAAQUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIEAAAADnByaWNlQnlUb3BVcElkCQEAAAAMZ2V0SW50T3JGYWlsAAAAAQkBAAAAEmtleVByaWNlQnlUb3BVcElkeAAAAAIFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyBQAAAAxjdXJyVG9wVXBJZHgDCQEAAAACIT0AAAACBQAAAAZzdGF0dXMCAAAAB1BFTkRJTkcJAQAAAA5mYWlsRXhlY3V0ZUdldAAAAAUCAAAAFVN0YXR1cyBpcyBub3QgUEVORElORwUAAAAMYmFzZUFzc2V0U3RyBQAAAA51c2VyQWRkcmVzc1N0cgUAAAANc3VibWl0VHhJZFN0cgUAAAANb3BlcmF0aW9uVHlwZQMJAABmAAAAAgUAAAAIb3BlckxvY2sFAAAADGN1cnJUb3BVcElkeAkBAAAADmZhaWxFeGVjdXRlR2V0AAAABQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJT3BlckxvY2tbCQABpAAAAAEFAAAACG9wZXJMb2NrAgAAAARdID4gCQABpAAAAAEFAAAADGN1cnJUb3BVcElkeAUAAAAMYmFzZUFzc2V0U3RyBQAAAA51c2VyQWRkcmVzc1N0cgUAAAANc3VibWl0VHhJZFN0cgUAAAANb3BlcmF0aW9uVHlwZQQAAAAJZGlmZlR1cGxlCQEAAAATY2FsY1RvdGFsTG9ja2VkRGlmZgAAAAgCAAAAB2V4ZWN1dGUFAAAADW9wZXJhdGlvblR5cGUFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyBQAAAA5wcmljZUJ5VG9wVXBJZAUAAAARZGVjaW1hbHNNdWx0UHJpY2UFAAAACGluQW1vdW50BQAAAAtiYXNlQXNzZXRJZAUAAAAMc2hhcmVBc3NldElkBAAAAAlvdXRBbW91bnQIBQAAAAlkaWZmVHVwbGUAAAACXzMEAAAAD291dFRyYW5zZmVyRGF0YQMJAAAAAAAAAggFAAAACWRpZmZUdXBsZQAAAAJfNAUAAAALYmFzZUFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALdXNlckFkZHJlc3MFAAAACW91dEFtb3VudAUAAAALYmFzZUFzc2V0SWQFAAAAA25pbAkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAADHNoYXJlQXNzZXRJZAUAAAAJb3V0QW1vdW50BgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAt1c2VyQWRkcmVzcwUAAAAJb3V0QW1vdW50BQAAAAxzaGFyZUFzc2V0SWQFAAAAA25pbAkABE0AAAACCQAETQAAAAIJAARNAAAAAgUAAAAPb3V0VHJhbnNmZXJEYXRhCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAxvcGVyYXRpb25LZXkJAQAAABxkYXRhT3BlcmF0aW9uRXhlY3V0aW9uVXBkYXRlAAAABAUAAAAOb3BlcmF0aW9uQXJyYXkCAAAACEZJTklTSEVEBQAAAA5wcmljZUJ5VG9wVXBJZAUAAAAJb3V0QW1vdW50CQEAAAAWVG90YWxMb2NrZWRTdHJpbmdFbnRyeQAAAAMCAAAACURFQ1JFTUVOVAkBAAAADmtleVRvdGFsTG9ja2VkAAAAAQUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIIBQAAAAlkaWZmVHVwbGUAAAACXzEJAQAAABZUb3RhbExvY2tlZFN0cmluZ0VudHJ5AAAAAwIAAAAJREVDUkVNRU5UCQEAAAAUa2V5VG90YWxMb2NrZWRCeVVzZXIAAAACBQAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgUAAAAOdXNlckFkZHJlc3NTdHIIBQAAAAlkaWZmVHVwbGUAAAACXzIBAAAAG3ByaXZhdGVDdXJyZW50U3lzUGFyYW1zUkVTVAAAAAEAAAAMYmFzZUFzc2V0U3RyBAAAAAtiYXNlQXNzZXRJZAkAAlkAAAABBQAAAAxiYXNlQXNzZXRTdHIEAAAACGNmZ0FycmF5CQEAAAAScmVhZEFzc2V0Q2ZnT3JGYWlsAAAAAQUAAAAMYmFzZUFzc2V0U3RyBAAAAA1zaGFyZUFzc2V0U3RyCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABJJZHhDZmdTaGFyZUFzc2V0SWQEAAAADHNoYXJlQXNzZXRJZAkAAlkAAAABBQAAAA1zaGFyZUFzc2V0U3RyBAAAABZkZWNpbWFsc011bHRCb3RoQXNzZXRzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAHElkeENmZ0RlY2ltYWxzTXVsdEJvdGhBc3NldHMEAAAAEWRlY2ltYWxzTXVsdFByaWNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAF0lkeENmZ0RlY2ltYWxzTXVsdFByaWNlBAAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAXSWR4Q2ZnSW50ZXJuYWxCYXNlQXNzZXQEAAAACHN5c1N0YXRlCQEAAAAJY2FsY1ByaWNlAAAABAUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIFAAAAC2Jhc2VBc3NldElkBQAAAAxzaGFyZUFzc2V0SWQFAAAAEWRlY2ltYWxzTXVsdFByaWNlCQAFGAAAAAYJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAAVwcmljZQgFAAAACHN5c1N0YXRlAAAAAl8xCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAARZGVjaW1hbHNNdWx0UHJpY2UFAAAAEWRlY2ltYWxzTXVsdFByaWNlCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAQYmFzZUFzc2V0QmFsYW5jZQgFAAAACHN5c1N0YXRlAAAAAl8yCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAVdG90YWxMb2NrZWRCYXNlQW1vdW50CAUAAAAIc3lzU3RhdGUAAAACXzMJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAB9iYXNlQXNzZXRCYWxhbmNlQ29uc2lkZXJpbmdMb2NrCAUAAAAIc3lzU3RhdGUAAAACXzQJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAA1zaGFyZUVtaXNzaW9uCAUAAAAIc3lzU3RhdGUAAAACXzUAAAAIAAAAAWkBAAAAEmFkbWluUmVnaXN0ZXJBc3NldAAAAA0AAAAMYmFzZUFzc2V0U3RyAAAADnNoYXJlQXNzZXROYW1lAAAAD3NoYXJlQXNzZXREZXNjcgAAABBnZXREZWxheWluQmxvY2tzAAAAFnNodXRkb3duTWFuYWdlckFkZHJlc3MAAAAKc3RhcnRQcmljZQAAABV0b3B1cEludGVydmFsSW5CbG9ja3MAAAAUdG9wdXBNYXhOZWdhdGl2ZVBhcnQAAAATdG9wdXBNYW5hZ2VyQWRkcmVzcwAAABNzdWJtaXRMaW1pdHNCYXNlTWF4AAAAFXN1Ym1pdExpbWl0c0Jhc2VSZXNldAAAABRzdWJtaXRMaW1pdHNTaGFyZU1heAAAABZzdWJtaXRMaW1pdHNTaGFyZVJlc2V0BAAAAAtiYXNlQXNzZXRJZAkAAlkAAAABBQAAAAxiYXNlQXNzZXRTdHIEAAAACGRlY2ltYWxzCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAtiYXNlQXNzZXRJZAAAAAhkZWNpbWFscwQAAAAWZGVjaW1hbHNNdWx0Qm90aEFzc2V0cwkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAABQAAAAhkZWNpbWFscwAAAAAAAAAAAAAAAAAAAAAAAAUAAAAERE9XTgQAAAARZGVjaW1hbHNNdWx0UHJpY2UJAABoAAAAAgkAAGgAAAACAAAAAAAAAABkAAAAAAAAAAPoAAAAAAAAAAPoBAAAABh0b3B1cE1heE5lZ2F0aXZlUGVyY2VudHMJAABrAAAAAwUAAAAUdG9wdXBNYXhOZWdhdGl2ZVBhcnQAAAAAAAAAAGQFAAAAFmRlY2ltYWxzTXVsdEJvdGhBc3NldHMEAAAAEGJhc2VBc3NldEJhbGFuY2UJAAPwAAAAAgUAAAAEdGhpcwUAAAALYmFzZUFzc2V0SWQDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAScGVybWlzc2lvbnMgZGVuaWVkAwkAAAAAAAACBQAAABBiYXNlQXNzZXRCYWxhbmNlAAAAAAAAAAAACQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQAEJQAAAAEFAAAABHRoaXMCAAAAIiBtdXN0IGhhdmUgYW55IGluaXRpYWwgYmFsYW5jZSBvZiAFAAAADGJhc2VBc3NldFN0cgMJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMJAQAAAAtrZXlBc3NldENmZwAAAAEFAAAADGJhc2VBc3NldFN0cgkAAAIAAAABCQABLAAAAAIFAAAADGJhc2VBc3NldFN0cgIAAAAcIGhhcyBiZWVuIGFscmVhZHkgcmVnaXN0ZXJlZAMJAQAAAAIhPQAAAAIJAAQlAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAWc2h1dGRvd25NYW5hZ2VyQWRkcmVzcwUAAAAWc2h1dGRvd25NYW5hZ2VyQWRkcmVzcwkAAAIAAAABAgAAAB5pbnZhbGlkIHNodXRkb3duTWFuYWdlckFkZHJlc3MDCQEAAAACIT0AAAACCQAEJQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAE3RvcHVwTWFuYWdlckFkZHJlc3MFAAAAE3RvcHVwTWFuYWdlckFkZHJlc3MJAAACAAAAAQIAAAAbaW52YWxpZCB0b3B1cE1hbmFnZXJBZGRyZXNzAwkAAGYAAAACAAAAAAAAAAAABQAAABBnZXREZWxheWluQmxvY2tzCQAAAgAAAAEJAAEsAAAAAgIAAAAZaW52YWxpZCBnZXREZWxheWluQmxvY2tzPQkAAaQAAAABBQAAABBnZXREZWxheWluQmxvY2tzAwMJAABnAAAAAgAAAAAAAAAAAAUAAAAYdG9wdXBNYXhOZWdhdGl2ZVBlcmNlbnRzBgkAAGcAAAACBQAAABh0b3B1cE1heE5lZ2F0aXZlUGVyY2VudHMAAAAAAAAAAGMJAAACAAAAAQIAAAAmaW52YWxpZCB0b3B1cE1heE5lZ2F0aXZlUGFydCBwYXJhbWV0ZXIEAAAAD3NoYXJlSW5pdEFtb3VudAkBAAAAEWNvbnZlcnRCYXNlMlNoYXJlAAAAAwUAAAAQYmFzZUFzc2V0QmFsYW5jZQUAAAAKc3RhcnRQcmljZQUAAAARZGVjaW1hbHNNdWx0UHJpY2UEAAAAFXNoYXJlQXNzZXRJc3N1ZUFjdGlvbgkABEIAAAAFBQAAAA5zaGFyZUFzc2V0TmFtZQUAAAAPc2hhcmVBc3NldERlc2NyBQAAAA9zaGFyZUluaXRBbW91bnQFAAAACGRlY2ltYWxzBgQAAAAMc2hhcmVBc3NldElkCQAEOAAAAAEFAAAAFXNoYXJlQXNzZXRJc3N1ZUFjdGlvbgQAAAANc2hhcmVBc3NldFN0cgkAAlgAAAABBQAAAAxzaGFyZUFzc2V0SWQEAAAAE2ludGVybmFsQmFzZUFzc2V0SWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAFmtleU5leHRJbnRlcm5hbEFzc2V0SWQAAAAAAAAAAAAAAAAABAAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgkAAaQAAAABBQAAABNpbnRlcm5hbEJhc2VBc3NldElkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAtrZXlBc3NldENmZwAAAAEFAAAADGJhc2VBc3NldFN0cgkBAAAADGRhdGFBc3NldENmZwAAAAwFAAAADXNoYXJlQXNzZXRTdHIFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyBQAAABZkZWNpbWFsc011bHRCb3RoQXNzZXRzBQAAABFkZWNpbWFsc011bHRQcmljZQUAAAAQZ2V0RGVsYXlpbkJsb2NrcwUAAAAVdG9wdXBJbnRlcnZhbEluQmxvY2tzBQAAABR0b3B1cE1heE5lZ2F0aXZlUGFydAUAAAATdG9wdXBNYW5hZ2VyQWRkcmVzcwUAAAATc3VibWl0TGltaXRzQmFzZU1heAUAAAAVc3VibWl0TGltaXRzQmFzZVJlc2V0BQAAABRzdWJtaXRMaW1pdHNTaGFyZU1heAUAAAAWc3VibWl0TGltaXRzU2hhcmVSZXNldAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAfa2V5TWFwcGluZ3NJbnRlcm5hbDJiYXNlQXNzZXRJZAAAAAEFAAAAE2ludGVybmFsQmFzZUFzc2V0SWQFAAAADGJhc2VBc3NldFN0cgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEFAAAADGJhc2VBc3NldFN0cgUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAHGtleU1hcHBpbmdzU2hhcmUyYmFzZUFzc2V0SWQAAAABBQAAAA1zaGFyZUFzc2V0U3RyBQAAAAxiYXNlQXNzZXRTdHIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAHGtleU1hcHBpbmdzQmFzZUFzc2V0MnNoYXJlSWQAAAABBQAAAAxiYXNlQXNzZXRTdHIFAAAADXNoYXJlQXNzZXRTdHIJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIJAQAAABdrZXlTaHV0ZG93blB1dE9wZXJhdGlvbgAAAAEFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyBwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5U2h1dGRvd25NYW5hZ2VyAAAAAQUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIFAAAAFnNodXRkb3duTWFuYWdlckFkZHJlc3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABZrZXlOZXh0SW50ZXJuYWxBc3NldElkAAAAAAkAAGQAAAACBQAAABNpbnRlcm5hbEJhc2VBc3NldElkAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMa2V5UHJpY2VMYXN0AAAAAQUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIFAAAACnN0YXJ0UHJpY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA9rZXlQcmljZUhpc3RvcnkAAAADBQAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAUAAAAKc3RhcnRQcmljZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEmtleVRvcFVwQ3VycmVudElkeAAAAAEFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyAAAAAAAAAAAACQAETAAAAAIJAQAAABpSZW1haW5pbmdMaW1pdHNTdHJpbmdFbnRyeQAAAAMJAQAAABJrZXlMaW1pdHNSZW1haW5pbmcAAAABBQAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgUAAAATc3VibWl0TGltaXRzQmFzZU1heAUAAAAUc3VibWl0TGltaXRzU2hhcmVNYXgJAARMAAAAAgUAAAAVc2hhcmVBc3NldElzc3VlQWN0aW9uBQAAAANuaWwAAAABaQEAAAALc2h1dGRvd25QdXQAAAABAAAAE2ludGVybmFsQmFzZUFzc2V0SWQEAAAAFmludGVybmFsQmFzZUFzc2V0SWRTdHIJAAGkAAAAAQUAAAATaW50ZXJuYWxCYXNlQXNzZXRJZAQAAAAOYmFzZUFzc2V0SWRTdHIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABCQEAAAAfa2V5TWFwcGluZ3NJbnRlcm5hbDJiYXNlQXNzZXRJZAAAAAEFAAAAE2ludGVybmFsQmFzZUFzc2V0SWQEAAAAFnNodXRkb3duTWFuYWdlckFkZHJlc3MJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABCQEAAAASa2V5U2h1dGRvd25NYW5hZ2VyAAAAAQUAAAAWaW50ZXJuYWxCYXNlQXNzZXRJZFN0cgMJAABmAAAAAgAAAAAAAAAAAQkAATEAAAABBQAAAA5iYXNlQXNzZXRJZFN0cgkAAAIAAAABAgAAABtpbnZhbGlkIGludGVybmFsQmFzZUFzc2V0SWQDCQEAAAACIT0AAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAWc2h1dGRvd25NYW5hZ2VyQWRkcmVzcwkAAAIAAAABAgAAAA1hY2Nlc3MgZGVuaWVkCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAAXa2V5U2h1dGRvd25QdXRPcGVyYXRpb24AAAABCQABpAAAAAEFAAAAE2ludGVybmFsQmFzZUFzc2V0SWQGBQAAAANuaWwAAAABaQEAAAAJc3VibWl0UHV0AAAAAAQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAhpbkFtb3VudAgFAAAAA3BtdAAAAAZhbW91bnQEAAAACWluQXNzZXRJZAkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAAAxiYXNlQXNzZXRTdHIJAAJYAAAAAQUAAAAJaW5Bc3NldElkCQEAAAAGc3VibWl0AAAABQIAAAABUAUAAAABaQUAAAAIaW5BbW91bnQFAAAACWluQXNzZXRJZAUAAAAMYmFzZUFzc2V0U3RyAAAAAWkBAAAACXN1Ym1pdEdldAAAAAAEAAAAA3BtdAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAIaW5BbW91bnQIBQAAAANwbXQAAAAGYW1vdW50BAAAAAlpbkFzc2V0SWQJAQAAAAV2YWx1ZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAQAAAANc2hhcmVBc3NldFN0cgkAAlgAAAABBQAAAAlpbkFzc2V0SWQEAAAADGJhc2VBc3NldFN0cgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEJAQAAABxrZXlNYXBwaW5nc1NoYXJlMmJhc2VBc3NldElkAAAAAQUAAAANc2hhcmVBc3NldFN0cgkBAAAABnN1Ym1pdAAAAAUCAAAAAUcFAAAAAWkFAAAACGluQW1vdW50BQAAAAlpbkFzc2V0SWQFAAAADGJhc2VBc3NldFN0cgAAAAFpAQAAAApleGVjdXRlUHV0AAAAAwAAAAxiYXNlQXNzZXRTdHIAAAAOdXNlckFkZHJlc3NTdHIAAAANc3VibWl0VHhJZFN0cgkBAAAAB2V4ZWN1dGUAAAAEAgAAAAFQBQAAAAxiYXNlQXNzZXRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAA1zdWJtaXRUeElkU3RyAAAAAWkBAAAACmV4ZWN1dGVHZXQAAAADAAAADGJhc2VBc3NldFN0cgAAAA51c2VyQWRkcmVzc1N0cgAAAA1zdWJtaXRUeElkU3RyCQEAAAAHZXhlY3V0ZQAAAAQCAAAAAUcFAAAADGJhc2VBc3NldFN0cgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADXN1Ym1pdFR4SWRTdHIAAAABaQEAAAAMdG9wVXBCYWxhbmNlAAAAAgAAAAxiYXNlQXNzZXRTdHIAAAAGYW1vdW50BAAAAAtiYXNlQXNzZXRJZAkAAlkAAAABBQAAAAxiYXNlQXNzZXRTdHIEAAAADWFzc2V0Q2ZnQXJyYXkJAQAAABJyZWFkQXNzZXRDZmdPckZhaWwAAAABBQAAAAxiYXNlQXNzZXRTdHIEAAAADHNoYXJlQXNzZXRJZAkAAlkAAAABCQABkQAAAAIFAAAADWFzc2V0Q2ZnQXJyYXkFAAAAEklkeENmZ1NoYXJlQXNzZXRJZAQAAAAJcHJpY2VNdWx0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAANYXNzZXRDZmdBcnJheQUAAAAXSWR4Q2ZnRGVjaW1hbHNNdWx0UHJpY2UEAAAADWJvdGhBc3NldE11bHQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA1hc3NldENmZ0FycmF5BQAAABxJZHhDZmdEZWNpbWFsc011bHRCb3RoQXNzZXRzBAAAABV0b3B1cEludGVydmFsSW5CbG9ja3MJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA1hc3NldENmZ0FycmF5BQAAABtJZHhDZmdUb3B1cEludGVydmFsSW5CbG9ja3MEAAAAFHRvcHVwTWF4TmVnYXRpdmVQYXJ0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAANYXNzZXRDZmdBcnJheQUAAAAaSWR4Q2ZnVG9wdXBNYXhOZWdhdGl2ZVBhcnQEAAAAFGludGVybmFsQmFzZUFzc2V0U3RyCQABkQAAAAIFAAAADWFzc2V0Q2ZnQXJyYXkFAAAAF0lkeENmZ0ludGVybmFsQmFzZUFzc2V0BAAAABJ0b3BVcEN1cnJlbnRJZHhLRVkJAQAAABJrZXlUb3BVcEN1cnJlbnRJZHgAAAABBQAAABRpbnRlcm5hbEJhc2VBc3NldFN0cgQAAAAMcHJldlRvcFVwSWR4CQEAAAAMZ2V0SW50T3JGYWlsAAAAAQUAAAASdG9wVXBDdXJyZW50SWR4S0VZBAAAAA9jdXJyZW50VG9wVXBJZHgJAABkAAAAAgUAAAAMcHJldlRvcFVwSWR4AAAAAAAAAAABBAAAAAV2YWxpZAMJAABmAAAAAgUAAAAGYW1vdW50AAAAAAAAAAAABAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACnBtdEFzc2V0SWQJAQAAAAV2YWx1ZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAMJAQAAAAIhPQAAAAIFAAAAC2Jhc2VBc3NldElkBQAAAApwbXRBc3NldElkCQAAAgAAAAECAAAAPmF0dGFjaGVkIHBheW1lbnQncyBhc3NldCBpZCBpcyBOT1QgbWF0Y2hlZCBwYXNzZWQgYmFzZUFzc2V0U3RyAwkAAGYAAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAIG9ubHkgb25lIHBheW1lbnQgY2FuIGJlIGF0dGFjaGVkAwkBAAAAAiE9AAAAAggFAAAAA3BtdAAAAAZhbW91bnQFAAAABmFtb3VudAkAAAIAAAABAgAAAD1hdHRhY2hlZCBwYXltZW50LmFtb3VudCBpcyBOT1QgbWF0Y2hlZCBwYXNzZWQgYW1vdW50IGFyZ3VtZW50BgMJAABmAAAAAgAAAAAAAAAAAAUAAAAGYW1vdW50BAAAAAtiYXNlQmFsYW5jZQkAA/AAAAACBQAAAAR0aGlzBQAAAAtiYXNlQXNzZXRJZAQAAAANYWxsb3dlZEFtb3VudAkAAGsAAAADBQAAABR0b3B1cE1heE5lZ2F0aXZlUGFydAUAAAALYmFzZUJhbGFuY2UFAAAADWJvdGhBc3NldE11bHQDCQAAZgAAAAIJAQAAAAEtAAAAAQUAAAAGYW1vdW50BQAAAA1hbGxvd2VkQW1vdW50CQAAAgAAAAEJAAEsAAAAAgIAAAAvVG9wdXAgbmVnYXRpdmUgYW1vdW50IGNvdWxkbid0IGJlIGdyZWF0ZXIgdGhhbiAJAAGkAAAAAQUAAAANYWxsb3dlZEFtb3VudAYJAAACAAAAAQIAAAAaemVybyBhbW91bnQgaXMgbm90IGFsbG93ZWQEAAAAEnRvcFVwTGFzdEhlaWdodEtFWQkBAAAAEmtleVRvcFVwTGFzdEhlaWdodAAAAAIFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAPdG9wVXBMYXN0SGVpZ2h0CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEnRvcFVwTGFzdEhlaWdodEtFWQAAAAAAAAAAAAMJAQAAAAEhAAAAAQUAAAAFdmFsaWQJAAACAAAAAQIAAAARdmFsaWRhdGlvbiBmYWlsZWQDCQAAZgAAAAIFAAAAFXRvcHVwSW50ZXJ2YWxJbkJsb2NrcwkAAGUAAAACBQAAAAZoZWlnaHQFAAAAD3RvcFVwTGFzdEhlaWdodAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAMMSB0b3B1cCBwZXIgCQABpAAAAAEFAAAAFXRvcHVwSW50ZXJ2YWxJbkJsb2NrcwIAAAAoIGJsb2NrcyBmcm9tIHRoZSBzYW1lIGFkZHJlc3MgaXMgYWxsb3dlZAQAAAAFcHJpY2UICQEAAAAQZ2VuZXJpY0NhbGNQcmljZQAAAAUFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyBQAAAAtiYXNlQXNzZXRJZAUAAAAGYW1vdW50BQAAAAxzaGFyZUFzc2V0SWQFAAAACXByaWNlTXVsdAAAAAJfMQQAAAAJZGlmZlR1cGxlCQEAAAATY2FsY1RvdGFsTG9ja2VkRGlmZgAAAAgCAAAABXRvcHVwAgAAAAAFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyBQAAAAVwcmljZQUAAAAJcHJpY2VNdWx0AAAAAAAAAAAABQAAAAtiYXNlQXNzZXRJZAUAAAAMc2hhcmVBc3NldElkBAAAAA50b3B1cFRvdGFsRGlmZggFAAAACWRpZmZUdXBsZQAAAAJfMQQAAAALcHJpY2VBdGhLRVkJAQAAAAtrZXlQcmljZUFUSAAAAAEFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyBAAAAAxwcmV2UHJpY2VBVEgJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAALcHJpY2VBdGhLRVkAAAAAAAAAAAAJAARNAAAAAgkABE0AAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMa2V5UHJpY2VMYXN0AAAAAQUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIFAAAABXByaWNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAPa2V5UHJpY2VIaXN0b3J5AAAAAwUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAABXByaWNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAASa2V5UHJpY2VCeVRvcFVwSWR4AAAAAgUAAAAUaW50ZXJuYWxCYXNlQXNzZXRTdHIFAAAAD2N1cnJlbnRUb3BVcElkeAUAAAAFcHJpY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEnRvcFVwQ3VycmVudElkeEtFWQUAAAAPY3VycmVudFRvcFVwSWR4CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtwcmljZUF0aEtFWQMJAABmAAAAAgUAAAAFcHJpY2UFAAAADHByZXZQcmljZUFUSAUAAAAFcHJpY2UFAAAADHByZXZQcmljZUFUSAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAASdG9wVXBMYXN0SGVpZ2h0S0VZBQAAAAZoZWlnaHQFAAAAA25pbAkBAAAAFlRvdGFsTG9ja2VkU3RyaW5nRW50cnkAAAADAgAAAAlERUNSRU1FTlQJAQAAAA5rZXlUb3RhbExvY2tlZAAAAAEFAAAAFGludGVybmFsQmFzZUFzc2V0U3RyBQAAAA50b3B1cFRvdGFsRGlmZgkBAAAABEJ1cm4AAAACBQAAAAxzaGFyZUFzc2V0SWQJAAGRAAAAAgUAAAAOdG9wdXBUb3RhbERpZmYFAAAAFUlkeFRvdGFsTG9ja2VkSW5TaGFyZQAAAAFpAQAAABRjdXJyZW50U3lzUGFyYW1zUkVTVAAAAAEAAAAMYmFzZUFzc2V0U3RyBAAAAA1zeXNTdGF0ZVR1cGxlCQEAAAAbcHJpdmF0ZUN1cnJlbnRTeXNQYXJhbXNSRVNUAAAAAQUAAAAMYmFzZUFzc2V0U3RyBAAAAAVwcmljZQgIBQAAAA1zeXNTdGF0ZVR1cGxlAAAAAl8xAAAABXZhbHVlBAAAABFkZWNpbWFsc011bHRQcmljZQgIBQAAAA1zeXNTdGF0ZVR1cGxlAAAAAl8yAAAABXZhbHVlBAAAABBiYXNlQXNzZXRCYWxhbmNlCAgFAAAADXN5c1N0YXRlVHVwbGUAAAACXzMAAAAFdmFsdWUEAAAAFXRvdGFsTG9ja2VkQmFzZUFtb3VudAgIBQAAAA1zeXNTdGF0ZVR1cGxlAAAAAl80AAAABXZhbHVlBAAAAB9iYXNlQXNzZXRCYWxhbmNlQ29uc2lkZXJpbmdMb2NrCAgFAAAADXN5c1N0YXRlVHVwbGUAAAACXzUAAAAFdmFsdWUEAAAADXNoYXJlRW1pc3Npb24ICAUAAAANc3lzU3RhdGVUdXBsZQAAAAJfNgAAAAV2YWx1ZQQAAAAIcmVzdERhdGEJAAS5AAAAAgkABEwAAAACAgAAABlzdGFydEN1cnJlbnRTeXNQYXJhbXNSRVNUCQAETAAAAAIJAAGkAAAAAQUAAAAFcHJpY2UJAARMAAAAAgkAAaQAAAABBQAAABFkZWNpbWFsc011bHRQcmljZQkABEwAAAACCQABpAAAAAEFAAAAEGJhc2VBc3NldEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAABV0b3RhbExvY2tlZEJhc2VBbW91bnQJAARMAAAAAgkAAaQAAAABBQAAAB9iYXNlQXNzZXRCYWxhbmNlQ29uc2lkZXJpbmdMb2NrCQAETAAAAAIJAAGkAAAAAQUAAAANc2hhcmVFbWlzc2lvbgkABEwAAAACAgAAABdlbmRDdXJyZW50U3lzUGFyYW1zUkVTVAUAAAADbmlsBQAAAANTRVAJAAACAAAAAQUAAAAIcmVzdERhdGEAAAAA5ZPzJg==", "chainId": 84, "height": 1451532, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 4 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let SEP = "__"
5+
6+func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key))
7+
8+
9+func getBooleanOrFail (key) = valueOrErrorMessage(getBoolean(this, key), ("No data for this.key=" + key))
10+
11+
12+func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), ("No data for this.key=" + key))
13+
14+
15+func failExecuteGet (msg,baseAssetStr,userAddressStr,submitTxIdStr,operationType) = throw(((((((((msg + ": baseAssetStr=") + baseAssetStr) + " userAddressStr=") + userAddressStr) + " submitTxIdStr=") + submitTxIdStr) + " operationType=") + operationType))
16+
17+
18+func failSubmitLimitsExceeds (remainingBase,remainingShare,newRemainingBase,newRemainingShare) = throw((((((((("submit operation limits have been reached: " + " remainingBase=") + toString(remainingBase)) + " remainingShare=") + toString(remainingShare)) + " newRemainingBase=") + toString(newRemainingBase)) + " newRemainingShare=") + toString(newRemainingShare)))
19+
20+
21+func convertShare2Base (shareAmount,price,priceMult) = fraction(shareAmount, price, priceMult)
22+
23+
24+func convertBase2Share (baseAmount,price,priceMult) = fraction(baseAmount, priceMult, price)
25+
26+
27+func keyAssetCfg (baseAssetStr) = ("%s%s%s__config__asset__" + baseAssetStr)
28+
29+
30+func keyNextInternalAssetId () = "%s__nextInternalAssetId"
31+
32+
33+func keyPriceLast (internalBasetAssetStr) = ("%s%s%d__price__last__" + internalBasetAssetStr)
34+
35+
36+func keyPriceATH (internalBasetAssetStr) = ("%s%s%d__price__ath__" + internalBasetAssetStr)
37+
38+
39+func keyPriceByTopUpIdx (internalBaseAssetStr,topUpIdx) = makeString(["%s%s%d%d__price__byTopUpIdx", internalBaseAssetStr, toString(topUpIdx)], SEP)
40+
41+
42+func keyPriceHistory (internalBasetAssetStr,h,timestamp) = makeString(["%s%s%d%d%d__price__history", internalBasetAssetStr, toString(h), toString(timestamp)], SEP)
43+
44+
45+func keyTotalLocked (internalBasetAssetStr) = ("%s%s%d__total__locked__" + internalBasetAssetStr)
46+
47+
48+func keyTotalLockedByUser (internalBaseAssetStr,userAddressStr) = makeString(["%s%s%d%s__total__locked", internalBaseAssetStr, userAddressStr], SEP)
49+
50+
51+func keyMappingsInternal2baseAssetId (internalBaseAsset) = ("%s%s%d__mappings__internal2baseAssetId__" + toString(internalBaseAsset))
52+
53+
54+func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
55+
56+
57+func keyMappingsShare2baseAssetId (shareAssetStr) = ("%s%s%s__mappings__share2baseAssetId__" + shareAssetStr)
58+
59+
60+func keyMappingsBaseAsset2shareId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2shareId__" + baseAssetStr)
61+
62+
63+func keyShutdownPutOperation (internalBaseAssetStr) = ("%s%s%d__shutdown__put__" + internalBaseAssetStr)
64+
65+
66+func keyShutdownManager (internalBaseAssetStr) = ("%s%s%d__shutdown__manager__" + internalBaseAssetStr)
67+
68+
69+func keyTopUpCurrentIdx (internalBaseAssetStr) = ("%s%s%d__topup__currentIdx__" + internalBaseAssetStr)
70+
71+
72+func keyTopUpLastHeight (internalBasetAssetStr,sender) = makeString(["%s%s%s%d%s__topup__last__height", internalBasetAssetStr, sender], SEP)
73+
74+
75+func keyLimitsRemaining (internalBasetAssetStr) = ("%s%s__limits__remaining__" + internalBasetAssetStr)
76+
77+
78+let IdxCfgShareAssetId = 1
79+
80+let IdxCfgInternalBaseAsset = 2
81+
82+let IdxCfgDecimalsMultBothAssets = 3
83+
84+let IdxCfgDecimalsMultPrice = 4
85+
86+let IdxCfgGetDelayBlocks = 5
87+
88+let IdxCfgTopupIntervalInBlocks = 6
89+
90+let IdxCfgTopupMaxNegativePart = 7
91+
92+let IdxCfgTopupManagerAddress = 8
93+
94+let IdxCfgSubmitLimitsBaseMax = 9
95+
96+let IdxCfgSubmitLimitsBaseReset = 10
97+
98+let IdxCfgSubmitLimitsShareMax = 11
99+
100+let IdxCfgSubmitLimitsShareReset = 12
101+
102+func dataAssetCfg (shareAssetStr,internalBaseAssetStr,decimalsMultBothAssets,decimalsMultPrice,getDelayInBlocks,topupIntervalInBlocks,topupMaxNegativePart,topupManagerAddress,submitLimitsBaseMax,submitLimitsBaseReset,submitLimitsShareMax,submitLimitsShareReset) = makeString(["%s%d%d%d%d%d%d%s%d%d%d%d", shareAssetStr, internalBaseAssetStr, toString(decimalsMultBothAssets), toString(decimalsMultPrice), toString(getDelayInBlocks), toString(topupIntervalInBlocks), toString(topupMaxNegativePart), topupManagerAddress, toString(submitLimitsBaseMax), toString(submitLimitsBaseReset), toString(submitLimitsShareMax), toString(submitLimitsShareReset)], SEP)
103+
104+
105+let IdxTotalLockedInShare = 1
106+
107+let IdxTotalLockedOutBase = 2
108+
109+let IdxTotalLockedInBase = 3
110+
111+let IdxTotalLockedOutShare = 4
112+
113+func dataTotalLocked (inShareAmount,outBaseAmount,inBaseAmount,outShareAmount) = makeString(["%d%d%d%d", toString(inShareAmount), toString(outBaseAmount), toString(inBaseAmount), toString(outShareAmount)], SEP)
114+
115+
116+func dataTotalLockedInt (inShareAmount,outBaseAmount,inBaseAmount,outShareAmount) = [-1, inShareAmount, outBaseAmount, inBaseAmount, outShareAmount]
117+
118+
119+func readTotalLocked (key) = {
120+ let totalLockedArray = split(valueOrElse(getString(this, key), dataTotalLocked(0, 0, 0, 0)), SEP)
121+ dataTotalLockedInt(parseIntValue(totalLockedArray[IdxTotalLockedInShare]), parseIntValue(totalLockedArray[IdxTotalLockedOutBase]), parseIntValue(totalLockedArray[IdxTotalLockedInBase]), parseIntValue(totalLockedArray[IdxTotalLockedOutShare]))
122+ }
123+
124+
125+func calcTotalLockedDiff (direction,operationType,internalBaseAssetStr,price,priceMult,inAmount,baseAssetId,shareAssetId) = {
126+ let t = (direction + operationType)
127+ if ((t == "submitP"))
128+ then {
129+ let totalDiff = dataTotalLockedInt(0, 0, inAmount, 0)
130+ let userDiff = totalDiff
131+ $Tuple4(totalDiff, userDiff, 0, fromBase58String(""))
132+ }
133+ else if ((t == "submitG"))
134+ then {
135+ let totalDiff = dataTotalLockedInt(inAmount, 0, 0, 0)
136+ let userDiff = totalDiff
137+ $Tuple4(totalDiff, userDiff, 0, fromBase58String(""))
138+ }
139+ else if ((t == "executeP"))
140+ then {
141+ let outAmount = convertBase2Share(inAmount, price, priceMult)
142+ let totalDiff = dataTotalLockedInt(0, 0, 0, outAmount)
143+ let userDiff = dataTotalLockedInt(0, 0, inAmount, 0)
144+ $Tuple4(totalDiff, userDiff, outAmount, shareAssetId)
145+ }
146+ else if ((t == "executeG"))
147+ then {
148+ let outAmount = convertShare2Base(inAmount, price, priceMult)
149+ let totalDiff = dataTotalLockedInt(0, outAmount, 0, 0)
150+ let userDiff = dataTotalLockedInt(inAmount, 0, 0, 0)
151+ $Tuple4(totalDiff, userDiff, outAmount, baseAssetId)
152+ }
153+ else if ((t == "topup"))
154+ then {
155+ let totalLockedArray = readTotalLocked(keyTotalLocked(internalBaseAssetStr))
156+ let totalLockedInBaseAmount = totalLockedArray[IdxTotalLockedInBase]
157+ let totalLockedInShareAmount = totalLockedArray[IdxTotalLockedInShare]
158+ let totalDiff = dataTotalLockedInt(totalLockedInShareAmount, (-1 * convertShare2Base(totalLockedInShareAmount, price, priceMult)), totalLockedInBaseAmount, (-1 * convertBase2Share(totalLockedInBaseAmount, price, priceMult)))
159+ $Tuple4(totalDiff, nil, 0, fromBase58String(""))
160+ }
161+ else throw(("Unsupported Type " + t))
162+ }
163+
164+
165+func TotalLockedStringEntry (action,key,diff) = {
166+ func UPDATE (a,b) = if ((action == "INCREMENT"))
167+ then (a + b)
168+ else if ((action == "DECREMENT"))
169+ then (a - b)
170+ else throw(("Unsupported action " + action))
171+
172+ let dataArray = readTotalLocked(key)
173+ StringEntry(key, dataTotalLocked(UPDATE(dataArray[IdxTotalLockedInShare], diff[IdxTotalLockedInShare]), UPDATE(dataArray[IdxTotalLockedOutBase], diff[IdxTotalLockedOutBase]), UPDATE(dataArray[IdxTotalLockedInBase], diff[IdxTotalLockedInBase]), UPDATE(dataArray[IdxTotalLockedOutShare], diff[IdxTotalLockedOutShare])))
174+ }
175+
176+
177+func keyOperation (operationType,internalBaseAssetStr,userAddress,txId) = makeString(["%s%d%s%s", operationType, internalBaseAssetStr, userAddress, txId], SEP)
178+
179+
180+let IdxOperStatus = 1
181+
182+let IdxOperInAmount = 2
183+
184+let IdxOperPrice = 3
185+
186+let IdxOperOutAmount = 4
187+
188+let IdxOperStartHeight = 5
189+
190+let IdxOperStartTimestamp = 6
191+
192+let IdxOperEndHeight = 7
193+
194+let IdxOperEndTimestamp = 8
195+
196+let IdxOperLock = 9
197+
198+func privateDataOperationAllStrings (status,inAssetAmount,price,outAssetAmount,startHeight,startTimestamp,endHeight,endTimestamp,lock) = makeString(["%s%d%d%d%d%d%d%d%d", status, inAssetAmount, price, outAssetAmount, startHeight, startTimestamp, endHeight, endTimestamp, lock], SEP)
199+
200+
201+func dataOperation (status,inAssetAmount,price,outAssetAmount,startHeight,startTimestamp,endHeight,endTimestamp,lock) = privateDataOperationAllStrings(status, toString(inAssetAmount), toString(price), toString(outAssetAmount), toString(startHeight), toString(startTimestamp), toString(endHeight), toString(endTimestamp), toString(lock))
202+
203+
204+func dataOperationExecutionUpdate (currOperArray,newStatus,newPrice,newOutAmount) = privateDataOperationAllStrings(newStatus, currOperArray[IdxOperInAmount], toString(newPrice), toString(newOutAmount), currOperArray[IdxOperStartHeight], currOperArray[IdxOperStartTimestamp], toString(height), toString(lastBlock.timestamp), currOperArray[IdxOperLock])
205+
206+
207+func readAssetCfgOrFail (baseAssetStr) = {
208+ let key = keyAssetCfg(baseAssetStr)
209+ split(getStringOrFail(key), SEP)
210+ }
211+
212+
213+let IdxLimitsRemainingBase = 1
214+
215+let IdxLimitsRemainingShare = 2
216+
217+func RemainingLimitsStringEntry (key,baseRemainingLimit,shareRemainingLimit) = StringEntry(key, makeString(["%d%d", toString(baseRemainingLimit), toString(shareRemainingLimit)], SEP))
218+
219+
220+func genericCalcPrice (internalBaseAssetStr,baseAssetId,topUpBaseAmount,shareAssetId,decimalsMultPrice) = {
221+ let totalLockedArray = readTotalLocked(keyTotalLocked(internalBaseAssetStr))
222+ let totalLockedOutBaseAmount = totalLockedArray[IdxTotalLockedOutBase]
223+ let totalLockedInBaseAmount = totalLockedArray[IdxTotalLockedInBase]
224+ let baseAssetBalance = assetBalance(this, baseAssetId)
225+ let baseAssetBalanceCALC = (((baseAssetBalance + topUpBaseAmount) - totalLockedInBaseAmount) - totalLockedOutBaseAmount)
226+ let totalLockedOutShareAmount = totalLockedArray[IdxTotalLockedOutShare]
227+ let totalLockedInShareAmount = totalLockedArray[IdxTotalLockedInShare]
228+ let shareEmission = value(assetInfo(shareAssetId)).quantity
229+ let shareEmissionCALC = (shareEmission + totalLockedOutShareAmount)
230+ if ((0 > baseAssetBalanceCALC))
231+ then throw(((("baseAssetBalanceCALC < 0: baseAssetBalance=" + toString(baseAssetBalance)) + " baseAssetBalanceCALC=") + toString(baseAssetBalanceCALC)))
232+ else {
233+ let price = if ((shareEmission == 0))
234+ then (2 * decimalsMultPrice)
235+ else fraction(baseAssetBalanceCALC, decimalsMultPrice, shareEmissionCALC)
236+ $Tuple5(price, baseAssetBalance, totalLockedOutBaseAmount, baseAssetBalanceCALC, shareEmission)
237+ }
238+ }
239+
240+
241+func calcPrice (internalBaseAssetStr,baseAssetId,shareAssetId,decimalsMultPrice) = genericCalcPrice(internalBaseAssetStr, baseAssetId, 0, shareAssetId, decimalsMultPrice)
242+
243+
244+func submit (operationType,i,inAmount,inAssetId,baseAssetStr) = {
245+ let inAssetStr = toBase58String(inAssetId)
246+ let userAddressStr = toString(i.caller)
247+ let baseAssetId = fromBase58String(baseAssetStr)
248+ let cfgArray = readAssetCfgOrFail(baseAssetStr)
249+ let shareAssetStr = cfgArray[IdxCfgShareAssetId]
250+ let shareAssetId = fromBase58String(shareAssetStr)
251+ let decimalsMultBothAssets = parseIntValue(cfgArray[IdxCfgDecimalsMultBothAssets])
252+ let internalBaseAssetStr = cfgArray[IdxCfgInternalBaseAsset]
253+ let limitsKEY = keyLimitsRemaining(internalBaseAssetStr)
254+ let limitsCfgArray = split(getStringOrFail(limitsKEY), SEP)
255+ let limitsRemainingBase = parseIntValue(limitsCfgArray[IdxLimitsRemainingBase])
256+ let limitsRemainingShare = parseIntValue(limitsCfgArray[IdxLimitsRemainingShare])
257+ let isPutBlocked = getBooleanOrFail(keyShutdownPutOperation(internalBaseAssetStr))
258+ if (isPutBlocked)
259+ then throw("put operation is blocked")
260+ else {
261+ let diffTuple = calcTotalLockedDiff("submit", operationType, internalBaseAssetStr, 0, 0, inAmount, baseAssetId, shareAssetId)
262+ let limitsRemainingBaseNew = (limitsRemainingBase - diffTuple._2[IdxTotalLockedInBase])
263+ let limitsRemainingShareNew = (limitsRemainingShare - diffTuple._2[IdxTotalLockedInShare])
264+ if (if ((0 > limitsRemainingBaseNew))
265+ then true
266+ else (0 > limitsRemainingShareNew))
267+ then failSubmitLimitsExceeds(limitsRemainingBase, limitsRemainingShare, limitsRemainingBaseNew, limitsRemainingShareNew)
268+ else {
269+ let topUpCurrentIdx = getIntOrFail(keyTopUpCurrentIdx(internalBaseAssetStr))
270+ ((([StringEntry(keyOperation(operationType, internalBaseAssetStr, userAddressStr, toBase58String(i.transactionId)), dataOperation("PENDING", inAmount, 0, 0, height, lastBlock.timestamp, 0, 0, (topUpCurrentIdx + 1)))] :+ TotalLockedStringEntry("INCREMENT", keyTotalLocked(internalBaseAssetStr), diffTuple._1)) :+ TotalLockedStringEntry("INCREMENT", keyTotalLockedByUser(internalBaseAssetStr, userAddressStr), diffTuple._2)) :+ RemainingLimitsStringEntry(limitsKEY, limitsRemainingBaseNew, limitsRemainingShareNew))
271+ }
272+ }
273+ }
274+
275+
276+func execute (operationType,baseAssetStr,userAddressStr,submitTxIdStr) = {
277+ let userAddress = addressFromStringValue(userAddressStr)
278+ let assetCfgArray = readAssetCfgOrFail(baseAssetStr)
279+ let shareAssetId = fromBase58String(assetCfgArray[IdxCfgShareAssetId])
280+ let internalBaseAssetStr = assetCfgArray[IdxCfgInternalBaseAsset]
281+ let decimalsMultPrice = parseIntValue(assetCfgArray[IdxCfgDecimalsMultPrice])
282+ let baseAssetId = fromBase58String(baseAssetStr)
283+ let operationKey = keyOperation(operationType, internalBaseAssetStr, userAddressStr, submitTxIdStr)
284+ let operationArray = split(getStringOrFail(operationKey), SEP)
285+ let status = operationArray[IdxOperStatus]
286+ let inAmount = parseIntValue(operationArray[IdxOperInAmount])
287+ let operLock = parseIntValue(operationArray[IdxOperLock])
288+ let currTopUpIdx = getIntOrFail(keyTopUpCurrentIdx(internalBaseAssetStr))
289+ let priceByTopUpId = getIntOrFail(keyPriceByTopUpIdx(internalBaseAssetStr, currTopUpIdx))
290+ if ((status != "PENDING"))
291+ then failExecuteGet("Status is not PENDING", baseAssetStr, userAddressStr, submitTxIdStr, operationType)
292+ else if ((operLock > currTopUpIdx))
293+ then failExecuteGet(((("OperLock[" + toString(operLock)) + "] > ") + toString(currTopUpIdx)), baseAssetStr, userAddressStr, submitTxIdStr, operationType)
294+ else {
295+ let diffTuple = calcTotalLockedDiff("execute", operationType, internalBaseAssetStr, priceByTopUpId, decimalsMultPrice, inAmount, baseAssetId, shareAssetId)
296+ let outAmount = diffTuple._3
297+ let outTransferData = if ((diffTuple._4 == baseAssetId))
298+ then [ScriptTransfer(userAddress, outAmount, baseAssetId)]
299+ else [Reissue(shareAssetId, outAmount, true), ScriptTransfer(userAddress, outAmount, shareAssetId)]
300+ (((outTransferData :+ StringEntry(operationKey, dataOperationExecutionUpdate(operationArray, "FINISHED", priceByTopUpId, outAmount))) :+ TotalLockedStringEntry("DECREMENT", keyTotalLocked(internalBaseAssetStr), diffTuple._1)) :+ TotalLockedStringEntry("DECREMENT", keyTotalLockedByUser(internalBaseAssetStr, userAddressStr), diffTuple._2))
301+ }
302+ }
303+
304+
305+func privateCurrentSysParamsREST (baseAssetStr) = {
306+ let baseAssetId = fromBase58String(baseAssetStr)
307+ let cfgArray = readAssetCfgOrFail(baseAssetStr)
308+ let shareAssetStr = cfgArray[IdxCfgShareAssetId]
309+ let shareAssetId = fromBase58String(shareAssetStr)
310+ let decimalsMultBothAssets = parseIntValue(cfgArray[IdxCfgDecimalsMultBothAssets])
311+ let decimalsMultPrice = parseIntValue(cfgArray[IdxCfgDecimalsMultPrice])
312+ let internalBaseAssetStr = cfgArray[IdxCfgInternalBaseAsset]
313+ let sysState = calcPrice(internalBaseAssetStr, baseAssetId, shareAssetId, decimalsMultPrice)
314+ $Tuple6(IntegerEntry("price", sysState._1), IntegerEntry("decimalsMultPrice", decimalsMultPrice), IntegerEntry("baseAssetBalance", sysState._2), IntegerEntry("totalLockedBaseAmount", sysState._3), IntegerEntry("baseAssetBalanceConsideringLock", sysState._4), IntegerEntry("shareEmission", sysState._5))
315+ }
316+
317+
318+@Callable(i)
319+func adminRegisterAsset (baseAssetStr,shareAssetName,shareAssetDescr,getDelayinBlocks,shutdownManagerAddress,startPrice,topupIntervalInBlocks,topupMaxNegativePart,topupManagerAddress,submitLimitsBaseMax,submitLimitsBaseReset,submitLimitsShareMax,submitLimitsShareReset) = {
320+ let baseAssetId = fromBase58String(baseAssetStr)
321+ let decimals = value(assetInfo(baseAssetId)).decimals
322+ let decimalsMultBothAssets = pow(10, 0, decimals, 0, 0, DOWN)
323+ let decimalsMultPrice = ((100 * 1000) * 1000)
324+ let topupMaxNegativePercents = fraction(topupMaxNegativePart, 100, decimalsMultBothAssets)
325+ let baseAssetBalance = assetBalance(this, baseAssetId)
326+ if ((i.caller != this))
327+ then throw("permissions denied")
328+ else if ((baseAssetBalance == 0))
329+ then throw(((toString(this) + " must have any initial balance of ") + baseAssetStr))
330+ else if (isDefined(getString(this, keyAssetCfg(baseAssetStr))))
331+ then throw((baseAssetStr + " has been already registered"))
332+ else if ((toString(addressFromStringValue(shutdownManagerAddress)) != shutdownManagerAddress))
333+ then throw("invalid shutdownManagerAddress")
334+ else if ((toString(addressFromStringValue(topupManagerAddress)) != topupManagerAddress))
335+ then throw("invalid topupManagerAddress")
336+ else if ((0 > getDelayinBlocks))
337+ then throw(("invalid getDelayinBlocks=" + toString(getDelayinBlocks)))
338+ else if (if ((0 >= topupMaxNegativePercents))
339+ then true
340+ else (topupMaxNegativePercents >= 99))
341+ then throw("invalid topupMaxNegativePart parameter")
342+ else {
343+ let shareInitAmount = convertBase2Share(baseAssetBalance, startPrice, decimalsMultPrice)
344+ let shareAssetIssueAction = Issue(shareAssetName, shareAssetDescr, shareInitAmount, decimals, true)
345+ let shareAssetId = calculateAssetId(shareAssetIssueAction)
346+ let shareAssetStr = toBase58String(shareAssetId)
347+ let internalBaseAssetId = valueOrElse(getInteger(this, keyNextInternalAssetId()), 0)
348+ let internalBaseAssetStr = toString(internalBaseAssetId)
349+[StringEntry(keyAssetCfg(baseAssetStr), dataAssetCfg(shareAssetStr, internalBaseAssetStr, decimalsMultBothAssets, decimalsMultPrice, getDelayinBlocks, topupIntervalInBlocks, topupMaxNegativePart, topupManagerAddress, submitLimitsBaseMax, submitLimitsBaseReset, submitLimitsShareMax, submitLimitsShareReset)), StringEntry(keyMappingsInternal2baseAssetId(internalBaseAssetId), baseAssetStr), StringEntry(keyMappingsBaseAsset2internalId(baseAssetStr), internalBaseAssetStr), StringEntry(keyMappingsShare2baseAssetId(shareAssetStr), baseAssetStr), StringEntry(keyMappingsBaseAsset2shareId(baseAssetStr), shareAssetStr), BooleanEntry(keyShutdownPutOperation(internalBaseAssetStr), false), StringEntry(keyShutdownManager(internalBaseAssetStr), shutdownManagerAddress), IntegerEntry(keyNextInternalAssetId(), (internalBaseAssetId + 1)), IntegerEntry(keyPriceLast(internalBaseAssetStr), startPrice), IntegerEntry(keyPriceHistory(internalBaseAssetStr, height, lastBlock.timestamp), startPrice), IntegerEntry(keyTopUpCurrentIdx(internalBaseAssetStr), 0), RemainingLimitsStringEntry(keyLimitsRemaining(internalBaseAssetStr), submitLimitsBaseMax, submitLimitsShareMax), shareAssetIssueAction]
350+ }
351+ }
352+
353+
354+
355+@Callable(i)
356+func shutdownPut (internalBaseAssetId) = {
357+ let internalBaseAssetIdStr = toString(internalBaseAssetId)
358+ let baseAssetIdStr = getStringOrFail(keyMappingsInternal2baseAssetId(internalBaseAssetId))
359+ let shutdownManagerAddress = getStringOrFail(keyShutdownManager(internalBaseAssetIdStr))
360+ if ((1 > size(baseAssetIdStr)))
361+ then throw("invalid internalBaseAssetId")
362+ else if ((toString(i.caller) != shutdownManagerAddress))
363+ then throw("access denied")
364+ else [BooleanEntry(keyShutdownPutOperation(toString(internalBaseAssetId)), true)]
365+ }
366+
367+
368+
369+@Callable(i)
370+func submitPut () = {
371+ let pmt = value(i.payments[0])
372+ let inAmount = pmt.amount
373+ let inAssetId = value(pmt.assetId)
374+ let baseAssetStr = toBase58String(inAssetId)
375+ submit("P", i, inAmount, inAssetId, baseAssetStr)
376+ }
377+
378+
379+
380+@Callable(i)
381+func submitGet () = {
382+ let pmt = value(i.payments[0])
383+ let inAmount = pmt.amount
384+ let inAssetId = value(pmt.assetId)
385+ let shareAssetStr = toBase58String(inAssetId)
386+ let baseAssetStr = getStringOrFail(keyMappingsShare2baseAssetId(shareAssetStr))
387+ submit("G", i, inAmount, inAssetId, baseAssetStr)
388+ }
389+
390+
391+
392+@Callable(i)
393+func executePut (baseAssetStr,userAddressStr,submitTxIdStr) = execute("P", baseAssetStr, userAddressStr, submitTxIdStr)
394+
395+
396+
397+@Callable(i)
398+func executeGet (baseAssetStr,userAddressStr,submitTxIdStr) = execute("G", baseAssetStr, userAddressStr, submitTxIdStr)
399+
400+
401+
402+@Callable(i)
403+func topUpBalance (baseAssetStr,amount) = {
404+ let baseAssetId = fromBase58String(baseAssetStr)
405+ let assetCfgArray = readAssetCfgOrFail(baseAssetStr)
406+ let shareAssetId = fromBase58String(assetCfgArray[IdxCfgShareAssetId])
407+ let priceMult = parseIntValue(assetCfgArray[IdxCfgDecimalsMultPrice])
408+ let bothAssetMult = parseIntValue(assetCfgArray[IdxCfgDecimalsMultBothAssets])
409+ let topupIntervalInBlocks = parseIntValue(assetCfgArray[IdxCfgTopupIntervalInBlocks])
410+ let topupMaxNegativePart = parseIntValue(assetCfgArray[IdxCfgTopupMaxNegativePart])
411+ let internalBaseAssetStr = assetCfgArray[IdxCfgInternalBaseAsset]
412+ let topUpCurrentIdxKEY = keyTopUpCurrentIdx(internalBaseAssetStr)
413+ let prevTopUpIdx = getIntOrFail(topUpCurrentIdxKEY)
414+ let currentTopUpIdx = (prevTopUpIdx + 1)
415+ let valid = if ((amount > 0))
416+ then {
417+ let pmt = value(i.payments[0])
418+ let pmtAssetId = value(pmt.assetId)
419+ if ((baseAssetId != pmtAssetId))
420+ then throw("attached payment's asset id is NOT matched passed baseAssetStr")
421+ else if ((size(i.payments) > 1))
422+ then throw("only one payment can be attached")
423+ else if ((pmt.amount != amount))
424+ then throw("attached payment.amount is NOT matched passed amount argument")
425+ else true
426+ }
427+ else if ((0 > amount))
428+ then {
429+ let baseBalance = assetBalance(this, baseAssetId)
430+ let allowedAmount = fraction(topupMaxNegativePart, baseBalance, bothAssetMult)
431+ if ((-(amount) > allowedAmount))
432+ then throw(("Topup negative amount couldn't be greater than " + toString(allowedAmount)))
433+ else true
434+ }
435+ else throw("zero amount is not allowed")
436+ let topUpLastHeightKEY = keyTopUpLastHeight(internalBaseAssetStr, toString(i.caller))
437+ let topUpLastHeight = valueOrElse(getInteger(this, topUpLastHeightKEY), 0)
438+ if (!(valid))
439+ then throw("validation failed")
440+ else if ((topupIntervalInBlocks > (height - topUpLastHeight)))
441+ then throw((("1 topup per " + toString(topupIntervalInBlocks)) + " blocks from the same address is allowed"))
442+ else {
443+ let price = genericCalcPrice(internalBaseAssetStr, baseAssetId, amount, shareAssetId, priceMult)._1
444+ let diffTuple = calcTotalLockedDiff("topup", "", internalBaseAssetStr, price, priceMult, 0, baseAssetId, shareAssetId)
445+ let topupTotalDiff = diffTuple._1
446+ let priceAthKEY = keyPriceATH(internalBaseAssetStr)
447+ let prevPriceATH = valueOrElse(getInteger(this, priceAthKEY), 0)
448+ (([IntegerEntry(keyPriceLast(internalBaseAssetStr), price), IntegerEntry(keyPriceHistory(internalBaseAssetStr, height, lastBlock.timestamp), price), IntegerEntry(keyPriceByTopUpIdx(internalBaseAssetStr, currentTopUpIdx), price), IntegerEntry(topUpCurrentIdxKEY, currentTopUpIdx), IntegerEntry(priceAthKEY, if ((price > prevPriceATH))
449+ then price
450+ else prevPriceATH), IntegerEntry(topUpLastHeightKEY, height)] :+ TotalLockedStringEntry("DECREMENT", keyTotalLocked(internalBaseAssetStr), topupTotalDiff)) :+ Burn(shareAssetId, topupTotalDiff[IdxTotalLockedInShare]))
451+ }
452+ }
453+
454+
455+
456+@Callable(i)
457+func currentSysParamsREST (baseAssetStr) = {
458+ let sysStateTuple = privateCurrentSysParamsREST(baseAssetStr)
459+ let price = sysStateTuple._1.value
460+ let decimalsMultPrice = sysStateTuple._2.value
461+ let baseAssetBalance = sysStateTuple._3.value
462+ let totalLockedBaseAmount = sysStateTuple._4.value
463+ let baseAssetBalanceConsideringLock = sysStateTuple._5.value
464+ let shareEmission = sysStateTuple._6.value
465+ let restData = makeString(["startCurrentSysParamsREST", toString(price), toString(decimalsMultPrice), toString(baseAssetBalance), toString(totalLockedBaseAmount), toString(baseAssetBalanceConsideringLock), toString(shareEmission), "endCurrentSysParamsREST"], SEP)
466+ throw(restData)
467+ }
468+
469+

github/deemru/w8io/873ac7e 
422.69 ms