diff --git a/api/csharp/Chirpstack/api/Application.cs b/api/csharp/Chirpstack/api/Application.cs index 7c6b27a7..be90e447 100644 --- a/api/csharp/Chirpstack/api/Application.cs +++ b/api/csharp/Chirpstack/api/Application.cs @@ -163,204 +163,205 @@ namespace Chirpstack.Api { "bG90VGhpbmdzSW50ZWdyYXRpb24iVwojVXBkYXRlUGlsb3RUaGluZ3NJbnRl", "Z3JhdGlvblJlcXVlc3QSMAoLaW50ZWdyYXRpb24YASABKAsyGy5hcGkuUGls", "b3RUaGluZ3NJbnRlZ3JhdGlvbiI9CiNEZWxldGVQaWxvdFRoaW5nc0ludGVn", - "cmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSJOChBJZnR0", + "cmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSJ8ChBJZnR0", "dEludGVncmF0aW9uEhYKDmFwcGxpY2F0aW9uX2lkGAEgASgJEgsKA2tleRgC", - "IAEoCRIVCg11cGxpbmtfdmFsdWVzGAMgAygJIksKHUNyZWF0ZUlmdHR0SW50", - "ZWdyYXRpb25SZXF1ZXN0EioKC2ludGVncmF0aW9uGAEgASgLMhUuYXBpLklm", - "dHR0SW50ZWdyYXRpb24iNAoaR2V0SWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QS", - "FgoOYXBwbGljYXRpb25faWQYASABKAkiSQobR2V0SWZ0dHRJbnRlZ3JhdGlv", - "blJlc3BvbnNlEioKC2ludGVncmF0aW9uGAEgASgLMhUuYXBpLklmdHR0SW50", - "ZWdyYXRpb24iSwodVXBkYXRlSWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QSKgoL", - "aW50ZWdyYXRpb24YASABKAsyFS5hcGkuSWZ0dHRJbnRlZ3JhdGlvbiI3Ch1E", - "ZWxldGVJZnR0dEludGVncmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9p", - "ZBgBIAEoCSJJCi9HZW5lcmF0ZU1xdHRJbnRlZ3JhdGlvbkNsaWVudENlcnRp", - "ZmljYXRlUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSKWAQowR2Vu", - "ZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZpY2F0ZVJlc3BvbnNl", - "EhAKCHRsc19jZXJ0GAEgASgJEg8KB3Rsc19rZXkYAiABKAkSDwoHY2FfY2Vy", - "dBgDIAEoCRIuCgpleHBpcmVzX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVm", - "LlRpbWVzdGFtcCoiCghFbmNvZGluZxIICgRKU09OEAASDAoIUFJPVE9CVUYQ", - "ASq/AQoPSW50ZWdyYXRpb25LaW5kEggKBEhUVFAQABINCglJTkZMVVhfREIQ", - "ARIQCgxUSElOR1NfQk9BUkQQAhIOCgpNWV9ERVZJQ0VTEAMSDgoKTE9SQV9D", - "TE9VRBAEEg8KC0dDUF9QVUJfU1VCEAUSCwoHQVdTX1NOUxAGEhUKEUFaVVJF", - "X1NFUlZJQ0VfQlVTEAcSEAoMUElMT1RfVEhJTkdTEAgSDwoLTVFUVF9HTE9C", - "QUwQCRIJCgVJRlRUVBAKKj8KEUluZmx1eERiUHJlY2lzaW9uEgYKAk5TEAAS", - "BQoBVRABEgYKAk1TEAISBQoBUxADEgUKAU0QBBIFCgFIEAUqMQoPSW5mbHV4", - "RGJWZXJzaW9uEg4KCklORkxVWERCXzEQABIOCgpJTkZMVVhEQl8yEAEyuDwK", - "EkFwcGxpY2F0aW9uU2VydmljZRJlCgZDcmVhdGUSHS5hcGkuQ3JlYXRlQXBw", - "bGljYXRpb25SZXF1ZXN0Gh4uYXBpLkNyZWF0ZUFwcGxpY2F0aW9uUmVzcG9u", - "c2UiHILT5JMCFiIRL2FwaS9hcHBsaWNhdGlvbnM6ASoSXgoDR2V0EhouYXBp", - "LkdldEFwcGxpY2F0aW9uUmVxdWVzdBobLmFwaS5HZXRBcHBsaWNhdGlvblJl", - "c3BvbnNlIh6C0+STAhgSFi9hcGkvYXBwbGljYXRpb25zL3tpZH0SbgoGVXBk", - "YXRlEh0uYXBpLlVwZGF0ZUFwcGxpY2F0aW9uUmVxdWVzdBoWLmdvb2dsZS5w", - "cm90b2J1Zi5FbXB0eSItgtPkkwInGiIvYXBpL2FwcGxpY2F0aW9ucy97YXBw", - "bGljYXRpb24uaWR9OgEqEl8KBkRlbGV0ZRIdLmFwaS5EZWxldGVBcHBsaWNh", - "dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiHoLT5JMCGCoW", - "L2FwaS9hcHBsaWNhdGlvbnMve2lkfRJeCgRMaXN0EhwuYXBpLkxpc3RBcHBs", - "aWNhdGlvbnNSZXF1ZXN0Gh0uYXBpLkxpc3RBcHBsaWNhdGlvbnNSZXNwb25z", - "ZSIZgtPkkwITEhEvYXBpL2FwcGxpY2F0aW9ucxKIAQoQTGlzdEludGVncmF0", - "aW9ucxIcLmFwaS5MaXN0SW50ZWdyYXRpb25zUmVxdWVzdBodLmFwaS5MaXN0", - "SW50ZWdyYXRpb25zUmVzcG9uc2UiN4LT5JMCMRIvL2FwaS9hcHBsaWNhdGlv", - "bnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMSnwEKFUNyZWF0ZUh0", - "dHBJbnRlZ3JhdGlvbhIhLmFwaS5DcmVhdGVIdHRwSW50ZWdyYXRpb25SZXF1", - "ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkuC0+STAkUiQC9hcGkvYXBw", + "IAEoCRIVCg11cGxpbmtfdmFsdWVzGAMgAygJEhYKDmFyYml0cmFyeV9qc29u", + "GAQgASgIEhQKDGV2ZW50X3ByZWZpeBgFIAEoCSJLCh1DcmVhdGVJZnR0dElu", + "dGVncmF0aW9uUmVxdWVzdBIqCgtpbnRlZ3JhdGlvbhgBIAEoCzIVLmFwaS5J", + "ZnR0dEludGVncmF0aW9uIjQKGkdldElmdHR0SW50ZWdyYXRpb25SZXF1ZXN0", + "EhYKDmFwcGxpY2F0aW9uX2lkGAEgASgJIkkKG0dldElmdHR0SW50ZWdyYXRp", + "b25SZXNwb25zZRIqCgtpbnRlZ3JhdGlvbhgBIAEoCzIVLmFwaS5JZnR0dElu", + "dGVncmF0aW9uIksKHVVwZGF0ZUlmdHR0SW50ZWdyYXRpb25SZXF1ZXN0EioK", + "C2ludGVncmF0aW9uGAEgASgLMhUuYXBpLklmdHR0SW50ZWdyYXRpb24iNwod", + "RGVsZXRlSWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QSFgoOYXBwbGljYXRpb25f", + "aWQYASABKAkiSQovR2VuZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0", + "aWZpY2F0ZVJlcXVlc3QSFgoOYXBwbGljYXRpb25faWQYASABKAkilgEKMEdl", + "bmVyYXRlTXF0dEludGVncmF0aW9uQ2xpZW50Q2VydGlmaWNhdGVSZXNwb25z", + "ZRIQCgh0bHNfY2VydBgBIAEoCRIPCgd0bHNfa2V5GAIgASgJEg8KB2NhX2Nl", + "cnQYAyABKAkSLgoKZXhwaXJlc19hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1", + "Zi5UaW1lc3RhbXAqIgoIRW5jb2RpbmcSCAoESlNPThAAEgwKCFBST1RPQlVG", + "EAEqvwEKD0ludGVncmF0aW9uS2luZBIICgRIVFRQEAASDQoJSU5GTFVYX0RC", + "EAESEAoMVEhJTkdTX0JPQVJEEAISDgoKTVlfREVWSUNFUxADEg4KCkxPUkFf", + "Q0xPVUQQBBIPCgtHQ1BfUFVCX1NVQhAFEgsKB0FXU19TTlMQBhIVChFBWlVS", + "RV9TRVJWSUNFX0JVUxAHEhAKDFBJTE9UX1RISU5HUxAIEg8KC01RVFRfR0xP", + "QkFMEAkSCQoFSUZUVFQQCio/ChFJbmZsdXhEYlByZWNpc2lvbhIGCgJOUxAA", + "EgUKAVUQARIGCgJNUxACEgUKAVMQAxIFCgFNEAQSBQoBSBAFKjEKD0luZmx1", + "eERiVmVyc2lvbhIOCgpJTkZMVVhEQl8xEAASDgoKSU5GTFVYREJfMhABMrg8", + "ChJBcHBsaWNhdGlvblNlcnZpY2USZQoGQ3JlYXRlEh0uYXBpLkNyZWF0ZUFw", + "cGxpY2F0aW9uUmVxdWVzdBoeLmFwaS5DcmVhdGVBcHBsaWNhdGlvblJlc3Bv", + "bnNlIhyC0+STAhYiES9hcGkvYXBwbGljYXRpb25zOgEqEl4KA0dldBIaLmFw", + "aS5HZXRBcHBsaWNhdGlvblJlcXVlc3QaGy5hcGkuR2V0QXBwbGljYXRpb25S", + "ZXNwb25zZSIegtPkkwIYEhYvYXBpL2FwcGxpY2F0aW9ucy97aWR9Em4KBlVw", + "ZGF0ZRIdLmFwaS5VcGRhdGVBcHBsaWNhdGlvblJlcXVlc3QaFi5nb29nbGUu", + "cHJvdG9idWYuRW1wdHkiLYLT5JMCJxoiL2FwaS9hcHBsaWNhdGlvbnMve2Fw", + "cGxpY2F0aW9uLmlkfToBKhJfCgZEZWxldGUSHS5hcGkuRGVsZXRlQXBwbGlj", + "YXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5Ih6C0+STAhgq", + "Fi9hcGkvYXBwbGljYXRpb25zL3tpZH0SXgoETGlzdBIcLmFwaS5MaXN0QXBw", + "bGljYXRpb25zUmVxdWVzdBodLmFwaS5MaXN0QXBwbGljYXRpb25zUmVzcG9u", + "c2UiGYLT5JMCExIRL2FwaS9hcHBsaWNhdGlvbnMSiAEKEExpc3RJbnRlZ3Jh", + "dGlvbnMSHC5hcGkuTGlzdEludGVncmF0aW9uc1JlcXVlc3QaHS5hcGkuTGlz", + "dEludGVncmF0aW9uc1Jlc3BvbnNlIjeC0+STAjESLy9hcGkvYXBwbGljYXRp", + "b25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zEp8BChVDcmVhdGVI", + "dHRwSW50ZWdyYXRpb24SIS5hcGkuQ3JlYXRlSHR0cEludGVncmF0aW9uUmVx", + "dWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJLgtPkkwJFIkAvYXBpL2Fw", + "cGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVn", + "cmF0aW9ucy9odHRwOgEqEpMBChJHZXRIdHRwSW50ZWdyYXRpb24SHi5hcGku", + "R2V0SHR0cEludGVncmF0aW9uUmVxdWVzdBofLmFwaS5HZXRIdHRwSW50ZWdy", + "YXRpb25SZXNwb25zZSI8gtPkkwI2EjQvYXBpL2FwcGxpY2F0aW9ucy97YXBw", + "bGljYXRpb25faWR9L2ludGVncmF0aW9ucy9odHRwEp8BChVVcGRhdGVIdHRw", + "SW50ZWdyYXRpb24SIS5hcGkuVXBkYXRlSHR0cEludGVncmF0aW9uUmVxdWVz", + "dBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJLgtPkkwJFGkAvYXBpL2FwcGxp", + "Y2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0", + "aW9ucy9odHRwOgEqEpABChVEZWxldGVIdHRwSW50ZWdyYXRpb24SIS5hcGku", + "RGVsZXRlSHR0cEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1", + "Zi5FbXB0eSI8gtPkkwI2KjQvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRp", + "b25faWR9L2ludGVncmF0aW9ucy9odHRwEqsBChlDcmVhdGVJbmZsdXhEYklu", + "dGVncmF0aW9uEiUuYXBpLkNyZWF0ZUluZmx1eERiSW50ZWdyYXRpb25SZXF1", + "ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5Ik+C0+STAkkiRC9hcGkvYXBw", "bGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdy", - "YXRpb25zL2h0dHA6ASoSkwEKEkdldEh0dHBJbnRlZ3JhdGlvbhIeLmFwaS5H", - "ZXRIdHRwSW50ZWdyYXRpb25SZXF1ZXN0Gh8uYXBpLkdldEh0dHBJbnRlZ3Jh", - "dGlvblJlc3BvbnNlIjyC0+STAjYSNC9hcGkvYXBwbGljYXRpb25zL3thcHBs", - "aWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2h0dHASnwEKFVVwZGF0ZUh0dHBJ", - "bnRlZ3JhdGlvbhIhLmFwaS5VcGRhdGVIdHRwSW50ZWdyYXRpb25SZXF1ZXN0", - "GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkuC0+STAkUaQC9hcGkvYXBwbGlj", - "YXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRp", - "b25zL2h0dHA6ASoSkAEKFURlbGV0ZUh0dHBJbnRlZ3JhdGlvbhIhLmFwaS5E", - "ZWxldGVIdHRwSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVm", - "LkVtcHR5IjyC0+STAjYqNC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlv", - "bl9pZH0vaW50ZWdyYXRpb25zL2h0dHASqwEKGUNyZWF0ZUluZmx1eERiSW50", - "ZWdyYXRpb24SJS5hcGkuQ3JlYXRlSW5mbHV4RGJJbnRlZ3JhdGlvblJlcXVl", - "c3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiT4LT5JMCSSJEL2FwaS9hcHBs", - "aWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3Jh", - "dGlvbnMvaW5mbHV4ZGI6ASoSowEKFkdldEluZmx1eERiSW50ZWdyYXRpb24S", - "Ii5hcGkuR2V0SW5mbHV4RGJJbnRlZ3JhdGlvblJlcXVlc3QaIy5hcGkuR2V0", - "SW5mbHV4RGJJbnRlZ3JhdGlvblJlc3BvbnNlIkCC0+STAjoSOC9hcGkvYXBw", - "bGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2luZmx1", - "eGRiEqsBChlVcGRhdGVJbmZsdXhEYkludGVncmF0aW9uEiUuYXBpLlVwZGF0", - "ZUluZmx1eERiSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVm", - "LkVtcHR5Ik+C0+STAkkaRC9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlv", - "bi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2luZmx1eGRiOgEqEpwB", - "ChlEZWxldGVJbmZsdXhEYkludGVncmF0aW9uEiUuYXBpLkRlbGV0ZUluZmx1", - "eERiSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5", - "IkCC0+STAjoqOC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0v", - "aW50ZWdyYXRpb25zL2luZmx1eGRiErQBChxDcmVhdGVUaGluZ3NCb2FyZElu", - "dGVncmF0aW9uEiguYXBpLkNyZWF0ZVRoaW5nc0JvYXJkSW50ZWdyYXRpb25S", - "ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IlKC0+STAkwiRy9hcGkv", + "YXRpb25zL2luZmx1eGRiOgEqEqMBChZHZXRJbmZsdXhEYkludGVncmF0aW9u", + "EiIuYXBpLkdldEluZmx1eERiSW50ZWdyYXRpb25SZXF1ZXN0GiMuYXBpLkdl", + "dEluZmx1eERiSW50ZWdyYXRpb25SZXNwb25zZSJAgtPkkwI6EjgvYXBpL2Fw", + "cGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pbmZs", + "dXhkYhKrAQoZVXBkYXRlSW5mbHV4RGJJbnRlZ3JhdGlvbhIlLmFwaS5VcGRh", + "dGVJbmZsdXhEYkludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1", + "Zi5FbXB0eSJPgtPkkwJJGkQvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRp", + "b24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pbmZsdXhkYjoBKhKc", + "AQoZRGVsZXRlSW5mbHV4RGJJbnRlZ3JhdGlvbhIlLmFwaS5EZWxldGVJbmZs", + "dXhEYkludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0", + "eSJAgtPkkwI6KjgvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9", + "L2ludGVncmF0aW9ucy9pbmZsdXhkYhK0AQocQ3JlYXRlVGhpbmdzQm9hcmRJ", + "bnRlZ3JhdGlvbhIoLmFwaS5DcmVhdGVUaGluZ3NCb2FyZEludGVncmF0aW9u", + "UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPkkwJMIkcvYXBp", + "L2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2lu", + "dGVncmF0aW9ucy90aGluZ3Nib2FyZDoBKhKvAQoZR2V0VGhpbmdzQm9hcmRJ", + "bnRlZ3JhdGlvbhIlLmFwaS5HZXRUaGluZ3NCb2FyZEludGVncmF0aW9uUmVx", + "dWVzdBomLmFwaS5HZXRUaGluZ3NCb2FyZEludGVncmF0aW9uUmVzcG9uc2Ui", + "Q4LT5JMCPRI7L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9p", + "bnRlZ3JhdGlvbnMvdGhpbmdzYm9hcmQStAEKHFVwZGF0ZVRoaW5nc0JvYXJk", + "SW50ZWdyYXRpb24SKC5hcGkuVXBkYXRlVGhpbmdzQm9hcmRJbnRlZ3JhdGlv", + "blJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUoLT5JMCTBpHL2Fw", + "aS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9p", + "bnRlZ3JhdGlvbnMvdGhpbmdzYm9hcmQ6ASoSpQEKHERlbGV0ZVRoaW5nc0Jv", + "YXJkSW50ZWdyYXRpb24SKC5hcGkuRGVsZXRlVGhpbmdzQm9hcmRJbnRlZ3Jh", + "dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiQ4LT5JMCPSo7", + "L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlv", + "bnMvdGhpbmdzYm9hcmQSrgEKGkNyZWF0ZU15RGV2aWNlc0ludGVncmF0aW9u", + "EiYuYXBpLkNyZWF0ZU15RGV2aWNlc0ludGVncmF0aW9uUmVxdWVzdBoWLmdv", + "b2dsZS5wcm90b2J1Zi5FbXB0eSJQgtPkkwJKIkUvYXBpL2FwcGxpY2F0aW9u", + "cy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9t", + "eWRldmljZXM6ASoSpwEKF0dldE15RGV2aWNlc0ludGVncmF0aW9uEiMuYXBp", + "LkdldE15RGV2aWNlc0ludGVncmF0aW9uUmVxdWVzdBokLmFwaS5HZXRNeURl", + "dmljZXNJbnRlZ3JhdGlvblJlc3BvbnNlIkGC0+STAjsSOS9hcGkvYXBwbGlj", + "YXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL215ZGV2aWNl", + "cxKuAQoaVXBkYXRlTXlEZXZpY2VzSW50ZWdyYXRpb24SJi5hcGkuVXBkYXRl", + "TXlEZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVm", + "LkVtcHR5IlCC0+STAkoaRS9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlv", + "bi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL215ZGV2aWNlczoBKhKf", + "AQoaRGVsZXRlTXlEZXZpY2VzSW50ZWdyYXRpb24SJi5hcGkuRGVsZXRlTXlE", + "ZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVt", + "cHR5IkGC0+STAjsqOS9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9p", + "ZH0vaW50ZWdyYXRpb25zL215ZGV2aWNlcxKuAQoaQ3JlYXRlTG9yYUNsb3Vk", + "SW50ZWdyYXRpb24SJi5hcGkuQ3JlYXRlTG9yYUNsb3VkSW50ZWdyYXRpb25S", + "ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IlCC0+STAkoiRS9hcGkv", "YXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50", - "ZWdyYXRpb25zL3RoaW5nc2JvYXJkOgEqEq8BChlHZXRUaGluZ3NCb2FyZElu", - "dGVncmF0aW9uEiUuYXBpLkdldFRoaW5nc0JvYXJkSW50ZWdyYXRpb25SZXF1", - "ZXN0GiYuYXBpLkdldFRoaW5nc0JvYXJkSW50ZWdyYXRpb25SZXNwb25zZSJD", - "gtPkkwI9EjsvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2lu", - "dGVncmF0aW9ucy90aGluZ3Nib2FyZBK0AQocVXBkYXRlVGhpbmdzQm9hcmRJ", - "bnRlZ3JhdGlvbhIoLmFwaS5VcGRhdGVUaGluZ3NCb2FyZEludGVncmF0aW9u", - "UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPkkwJMGkcvYXBp", - "L2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2lu", - "dGVncmF0aW9ucy90aGluZ3Nib2FyZDoBKhKlAQocRGVsZXRlVGhpbmdzQm9h", - "cmRJbnRlZ3JhdGlvbhIoLmFwaS5EZWxldGVUaGluZ3NCb2FyZEludGVncmF0", - "aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJDgtPkkwI9Kjsv", + "ZWdyYXRpb25zL2xvcmFjbG91ZDoBKhKnAQoXR2V0TG9yYUNsb3VkSW50ZWdy", + "YXRpb24SIy5hcGkuR2V0TG9yYUNsb3VkSW50ZWdyYXRpb25SZXF1ZXN0GiQu", + "YXBpLkdldExvcmFDbG91ZEludGVncmF0aW9uUmVzcG9uc2UiQYLT5JMCOxI5", + "L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlv", + "bnMvbG9yYWNsb3VkEq4BChpVcGRhdGVMb3JhQ2xvdWRJbnRlZ3JhdGlvbhIm", + "LmFwaS5VcGRhdGVMb3JhQ2xvdWRJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29n", + "bGUucHJvdG9idWYuRW1wdHkiUILT5JMCShpFL2FwaS9hcHBsaWNhdGlvbnMv", + "e2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbG9y", + "YWNsb3VkOgEqEp8BChpEZWxldGVMb3JhQ2xvdWRJbnRlZ3JhdGlvbhImLmFw", + "aS5EZWxldGVMb3JhQ2xvdWRJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUu", + "cHJvdG9idWYuRW1wdHkiQYLT5JMCOyo5L2FwaS9hcHBsaWNhdGlvbnMve2Fw", + "cGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbG9yYWNsb3VkErABChpDcmVh", + "dGVHY3BQdWJTdWJJbnRlZ3JhdGlvbhImLmFwaS5DcmVhdGVHY3BQdWJTdWJJ", + "bnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUoLT", + "5JMCTCJHL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0", + "aW9uX2lkfS9pbnRlZ3JhdGlvbnMvZ2NwLXB1Yi1zdWI6ASoSqQEKF0dldEdj", + "cFB1YlN1YkludGVncmF0aW9uEiMuYXBpLkdldEdjcFB1YlN1YkludGVncmF0", + "aW9uUmVxdWVzdBokLmFwaS5HZXRHY3BQdWJTdWJJbnRlZ3JhdGlvblJlc3Bv", + "bnNlIkOC0+STAj0SOy9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9p", + "ZH0vaW50ZWdyYXRpb25zL2djcC1wdWItc3ViErABChpVcGRhdGVHY3BQdWJT", + "dWJJbnRlZ3JhdGlvbhImLmFwaS5VcGRhdGVHY3BQdWJTdWJJbnRlZ3JhdGlv", + "blJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUoLT5JMCTBpHL2Fw", + "aS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9p", + "bnRlZ3JhdGlvbnMvZ2NwLXB1Yi1zdWI6ASoSoQEKGkRlbGV0ZUdjcFB1YlN1", + "YkludGVncmF0aW9uEiYuYXBpLkRlbGV0ZUdjcFB1YlN1YkludGVncmF0aW9u", + "UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJDgtPkkwI9KjsvYXBp", + "L2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9n", + "Y3AtcHViLXN1YhKmAQoXQ3JlYXRlQXdzU25zSW50ZWdyYXRpb24SIy5hcGku", + "Q3JlYXRlQXdzU25zSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3Rv", + "YnVmLkVtcHR5Ik6C0+STAkgiQy9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3Jh", + "dGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2F3cy1zbnM6ASoS", + "nAEKFEdldEF3c1Nuc0ludGVncmF0aW9uEiAuYXBpLkdldEF3c1Nuc0ludGVn", + "cmF0aW9uUmVxdWVzdBohLmFwaS5HZXRBd3NTbnNJbnRlZ3JhdGlvblJlc3Bv", + "bnNlIj+C0+STAjkSNy9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9p", + "ZH0vaW50ZWdyYXRpb25zL2F3cy1zbnMSpgEKF1VwZGF0ZUF3c1Nuc0ludGVn", + "cmF0aW9uEiMuYXBpLlVwZGF0ZUF3c1Nuc0ludGVncmF0aW9uUmVxdWVzdBoW", + "Lmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJOgtPkkwJIGkMvYXBpL2FwcGxpY2F0", + "aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9u", + "cy9hd3Mtc25zOgEqEpcBChdEZWxldGVBd3NTbnNJbnRlZ3JhdGlvbhIjLmFw", + "aS5EZWxldGVBd3NTbnNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJv", + "dG9idWYuRW1wdHkiP4LT5JMCOSo3L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxp", + "Y2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXdzLXNucxLCAQogQ3JlYXRlQXp1", + "cmVTZXJ2aWNlQnVzSW50ZWdyYXRpb24SLC5hcGkuQ3JlYXRlQXp1cmVTZXJ2", + "aWNlQnVzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVt", + "cHR5IliC0+STAlIiTS9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5h", + "cHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2F6dXJlLXNlcnZpY2UtYnVz", + "OgEqEsEBCh1HZXRBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbhIpLmFwaS5H", + "ZXRBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlcXVlc3QaKi5hcGkuR2V0", + "QXp1cmVTZXJ2aWNlQnVzSW50ZWdyYXRpb25SZXNwb25zZSJJgtPkkwJDEkEv", "YXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9u", - "cy90aGluZ3Nib2FyZBKuAQoaQ3JlYXRlTXlEZXZpY2VzSW50ZWdyYXRpb24S", - "Ji5hcGkuQ3JlYXRlTXlEZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29v", - "Z2xlLnByb3RvYnVmLkVtcHR5IlCC0+STAkoiRS9hcGkvYXBwbGljYXRpb25z", - "L3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL215", - "ZGV2aWNlczoBKhKnAQoXR2V0TXlEZXZpY2VzSW50ZWdyYXRpb24SIy5hcGku", - "R2V0TXlEZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GiQuYXBpLkdldE15RGV2", - "aWNlc0ludGVncmF0aW9uUmVzcG9uc2UiQYLT5JMCOxI5L2FwaS9hcHBsaWNh", - "dGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbXlkZXZpY2Vz", - "Eq4BChpVcGRhdGVNeURldmljZXNJbnRlZ3JhdGlvbhImLmFwaS5VcGRhdGVN", - "eURldmljZXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYu", - "RW1wdHkiUILT5JMCShpFL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9u", - "LmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbXlkZXZpY2VzOgEqEp8B", - "ChpEZWxldGVNeURldmljZXNJbnRlZ3JhdGlvbhImLmFwaS5EZWxldGVNeURl", - "dmljZXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1w", - "dHkiQYLT5JMCOyo5L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lk", - "fS9pbnRlZ3JhdGlvbnMvbXlkZXZpY2VzEq4BChpDcmVhdGVMb3JhQ2xvdWRJ", - "bnRlZ3JhdGlvbhImLmFwaS5DcmVhdGVMb3JhQ2xvdWRJbnRlZ3JhdGlvblJl", - "cXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUILT5JMCSiJFL2FwaS9h", - "cHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRl", - "Z3JhdGlvbnMvbG9yYWNsb3VkOgEqEqcBChdHZXRMb3JhQ2xvdWRJbnRlZ3Jh", - "dGlvbhIjLmFwaS5HZXRMb3JhQ2xvdWRJbnRlZ3JhdGlvblJlcXVlc3QaJC5h", - "cGkuR2V0TG9yYUNsb3VkSW50ZWdyYXRpb25SZXNwb25zZSJBgtPkkwI7Ejkv", - "YXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9u", - "cy9sb3JhY2xvdWQSrgEKGlVwZGF0ZUxvcmFDbG91ZEludGVncmF0aW9uEiYu", - "YXBpLlVwZGF0ZUxvcmFDbG91ZEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2ds", - "ZS5wcm90b2J1Zi5FbXB0eSJQgtPkkwJKGkUvYXBpL2FwcGxpY2F0aW9ucy97", - "aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9sb3Jh", - "Y2xvdWQ6ASoSnwEKGkRlbGV0ZUxvcmFDbG91ZEludGVncmF0aW9uEiYuYXBp", - "LkRlbGV0ZUxvcmFDbG91ZEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5w", - "cm90b2J1Zi5FbXB0eSJBgtPkkwI7KjkvYXBpL2FwcGxpY2F0aW9ucy97YXBw", - "bGljYXRpb25faWR9L2ludGVncmF0aW9ucy9sb3JhY2xvdWQSsAEKGkNyZWF0", - "ZUdjcFB1YlN1YkludGVncmF0aW9uEiYuYXBpLkNyZWF0ZUdjcFB1YlN1Yklu", - "dGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPk", - "kwJMIkcvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRp", - "b25faWR9L2ludGVncmF0aW9ucy9nY3AtcHViLXN1YjoBKhKpAQoXR2V0R2Nw", - "UHViU3ViSW50ZWdyYXRpb24SIy5hcGkuR2V0R2NwUHViU3ViSW50ZWdyYXRp", - "b25SZXF1ZXN0GiQuYXBpLkdldEdjcFB1YlN1YkludGVncmF0aW9uUmVzcG9u", - "c2UiQ4LT5JMCPRI7L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lk", - "fS9pbnRlZ3JhdGlvbnMvZ2NwLXB1Yi1zdWISsAEKGlVwZGF0ZUdjcFB1YlN1", - "YkludGVncmF0aW9uEiYuYXBpLlVwZGF0ZUdjcFB1YlN1YkludGVncmF0aW9u", - "UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPkkwJMGkcvYXBp", + "cy9henVyZS1zZXJ2aWNlLWJ1cxLCAQogVXBkYXRlQXp1cmVTZXJ2aWNlQnVz", + "SW50ZWdyYXRpb24SLC5hcGkuVXBkYXRlQXp1cmVTZXJ2aWNlQnVzSW50ZWdy", + "YXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IliC0+STAlIa", + "TS9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9p", + "ZH0vaW50ZWdyYXRpb25zL2F6dXJlLXNlcnZpY2UtYnVzOgEqErMBCiBEZWxl", + "dGVBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbhIsLmFwaS5EZWxldGVBenVy", + "ZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9i", + "dWYuRW1wdHkiSYLT5JMCQypBL2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0", + "aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXp1cmUtc2VydmljZS1idXMStQEKHENy", + "ZWF0ZVBpbG90VGhpbmdzSW50ZWdyYXRpb24SKC5hcGkuQ3JlYXRlUGlsb3RU", + "aGluZ3NJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1w", + "dHkiU4LT5JMCTSJIL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFw", + "cGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvcGlsb3QtdGhpbmdzOgEqErAB", + "ChlHZXRQaWxvdFRoaW5nc0ludGVncmF0aW9uEiUuYXBpLkdldFBpbG90VGhp", + "bmdzSW50ZWdyYXRpb25SZXF1ZXN0GiYuYXBpLkdldFBpbG90VGhpbmdzSW50", + "ZWdyYXRpb25SZXNwb25zZSJEgtPkkwI+EjwvYXBpL2FwcGxpY2F0aW9ucy97", + "YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9waWxvdC10aGluZ3MStQEK", + "HFVwZGF0ZVBpbG90VGhpbmdzSW50ZWdyYXRpb24SKC5hcGkuVXBkYXRlUGls", + "b3RUaGluZ3NJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYu", + "RW1wdHkiU4LT5JMCTRpIL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9u", + "LmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvcGlsb3QtdGhpbmdzOgEq", + "EqYBChxEZWxldGVQaWxvdFRoaW5nc0ludGVncmF0aW9uEiguYXBpLkRlbGV0", + "ZVBpbG90VGhpbmdzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3Rv", + "YnVmLkVtcHR5IkSC0+STAj4qPC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNh", + "dGlvbl9pZH0vaW50ZWdyYXRpb25zL3BpbG90LXRoaW5ncxKiAQoWQ3JlYXRl", + "SWZ0dHRJbnRlZ3JhdGlvbhIiLmFwaS5DcmVhdGVJZnR0dEludGVncmF0aW9u", + "UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJMgtPkkwJGIkEvYXBp", "L2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2lu", - "dGVncmF0aW9ucy9nY3AtcHViLXN1YjoBKhKhAQoaRGVsZXRlR2NwUHViU3Vi", - "SW50ZWdyYXRpb24SJi5hcGkuRGVsZXRlR2NwUHViU3ViSW50ZWdyYXRpb25S", - "ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkOC0+STAj0qOy9hcGkv", - "YXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2dj", - "cC1wdWItc3ViEqYBChdDcmVhdGVBd3NTbnNJbnRlZ3JhdGlvbhIjLmFwaS5D", - "cmVhdGVBd3NTbnNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9i", - "dWYuRW1wdHkiToLT5JMCSCJDL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0", - "aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXdzLXNuczoBKhKc", - "AQoUR2V0QXdzU25zSW50ZWdyYXRpb24SIC5hcGkuR2V0QXdzU25zSW50ZWdy", - "YXRpb25SZXF1ZXN0GiEuYXBpLkdldEF3c1Nuc0ludGVncmF0aW9uUmVzcG9u", - "c2UiP4LT5JMCORI3L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lk", - "fS9pbnRlZ3JhdGlvbnMvYXdzLXNucxKmAQoXVXBkYXRlQXdzU25zSW50ZWdy", - "YXRpb24SIy5hcGkuVXBkYXRlQXdzU25zSW50ZWdyYXRpb25SZXF1ZXN0GhYu", - "Z29vZ2xlLnByb3RvYnVmLkVtcHR5Ik6C0+STAkgaQy9hcGkvYXBwbGljYXRp", - "b25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25z", - "L2F3cy1zbnM6ASoSlwEKF0RlbGV0ZUF3c1Nuc0ludGVncmF0aW9uEiMuYXBp", - "LkRlbGV0ZUF3c1Nuc0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90", - "b2J1Zi5FbXB0eSI/gtPkkwI5KjcvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGlj", - "YXRpb25faWR9L2ludGVncmF0aW9ucy9hd3Mtc25zEsIBCiBDcmVhdGVBenVy", - "ZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbhIsLmFwaS5DcmVhdGVBenVyZVNlcnZp", - "Y2VCdXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1w", - "dHkiWILT5JMCUiJNL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFw", - "cGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXp1cmUtc2VydmljZS1idXM6", - "ASoSwQEKHUdldEF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9uEikuYXBpLkdl", - "dEF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9uUmVxdWVzdBoqLmFwaS5HZXRB", - "enVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlc3BvbnNlIkmC0+STAkMSQS9h", - "cGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25z", - "L2F6dXJlLXNlcnZpY2UtYnVzEsIBCiBVcGRhdGVBenVyZVNlcnZpY2VCdXNJ", - "bnRlZ3JhdGlvbhIsLmFwaS5VcGRhdGVBenVyZVNlcnZpY2VCdXNJbnRlZ3Jh", - "dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiWILT5JMCUhpN", + "dGVncmF0aW9ucy9pZnR0dDoBKhKXAQoTR2V0SWZ0dHRJbnRlZ3JhdGlvbhIf", + "LmFwaS5HZXRJZnR0dEludGVncmF0aW9uUmVxdWVzdBogLmFwaS5HZXRJZnR0", + "dEludGVncmF0aW9uUmVzcG9uc2UiPYLT5JMCNxI1L2FwaS9hcHBsaWNhdGlv", + "bnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvaWZ0dHQSogEKFlVw", + "ZGF0ZUlmdHR0SW50ZWdyYXRpb24SIi5hcGkuVXBkYXRlSWZ0dHRJbnRlZ3Jh", + "dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiTILT5JMCRhpB", "L2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lk", - "fS9pbnRlZ3JhdGlvbnMvYXp1cmUtc2VydmljZS1idXM6ASoSswEKIERlbGV0", - "ZUF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9uEiwuYXBpLkRlbGV0ZUF6dXJl", - "U2VydmljZUJ1c0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1", - "Zi5FbXB0eSJJgtPkkwJDKkEvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRp", - "b25faWR9L2ludGVncmF0aW9ucy9henVyZS1zZXJ2aWNlLWJ1cxK1AQocQ3Jl", - "YXRlUGlsb3RUaGluZ3NJbnRlZ3JhdGlvbhIoLmFwaS5DcmVhdGVQaWxvdFRo", - "aW5nc0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0", - "eSJTgtPkkwJNIkgvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBw", - "bGljYXRpb25faWR9L2ludGVncmF0aW9ucy9waWxvdC10aGluZ3M6ASoSsAEK", - "GUdldFBpbG90VGhpbmdzSW50ZWdyYXRpb24SJS5hcGkuR2V0UGlsb3RUaGlu", - "Z3NJbnRlZ3JhdGlvblJlcXVlc3QaJi5hcGkuR2V0UGlsb3RUaGluZ3NJbnRl", - "Z3JhdGlvblJlc3BvbnNlIkSC0+STAj4SPC9hcGkvYXBwbGljYXRpb25zL3th", - "cHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL3BpbG90LXRoaW5ncxK1AQoc", - "VXBkYXRlUGlsb3RUaGluZ3NJbnRlZ3JhdGlvbhIoLmFwaS5VcGRhdGVQaWxv", - "dFRoaW5nc0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5F", - "bXB0eSJTgtPkkwJNGkgvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24u", - "YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9waWxvdC10aGluZ3M6ASoS", - "pgEKHERlbGV0ZVBpbG90VGhpbmdzSW50ZWdyYXRpb24SKC5hcGkuRGVsZXRl", - "UGlsb3RUaGluZ3NJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9i", - "dWYuRW1wdHkiRILT5JMCPio8L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0", - "aW9uX2lkfS9pbnRlZ3JhdGlvbnMvcGlsb3QtdGhpbmdzEqIBChZDcmVhdGVJ", - "ZnR0dEludGVncmF0aW9uEiIuYXBpLkNyZWF0ZUlmdHR0SW50ZWdyYXRpb25S", - "ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkyC0+STAkYiQS9hcGkv", - "YXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50", - "ZWdyYXRpb25zL2lmdHR0OgEqEpcBChNHZXRJZnR0dEludGVncmF0aW9uEh8u", - "YXBpLkdldElmdHR0SW50ZWdyYXRpb25SZXF1ZXN0GiAuYXBpLkdldElmdHR0", - "SW50ZWdyYXRpb25SZXNwb25zZSI9gtPkkwI3EjUvYXBpL2FwcGxpY2F0aW9u", - "cy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pZnR0dBKiAQoWVXBk", - "YXRlSWZ0dHRJbnRlZ3JhdGlvbhIiLmFwaS5VcGRhdGVJZnR0dEludGVncmF0", - "aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJMgtPkkwJGGkEv", - "YXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9", - "L2ludGVncmF0aW9ucy9pZnR0dDoBKhKTAQoWRGVsZXRlSWZ0dHRJbnRlZ3Jh", - "dGlvbhIiLmFwaS5EZWxldGVJZnR0dEludGVncmF0aW9uUmVxdWVzdBoWLmdv", - "b2dsZS5wcm90b2J1Zi5FbXB0eSI9gtPkkwI3KjUvYXBpL2FwcGxpY2F0aW9u", - "cy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pZnR0dBLhAQooR2Vu", - "ZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZpY2F0ZRI0LmFwaS5H", - "ZW5lcmF0ZU1xdHRJbnRlZ3JhdGlvbkNsaWVudENlcnRpZmljYXRlUmVxdWVz", - "dBo1LmFwaS5HZW5lcmF0ZU1xdHRJbnRlZ3JhdGlvbkNsaWVudENlcnRpZmlj", - "YXRlUmVzcG9uc2UiSILT5JMCQiJAL2FwaS9hcHBsaWNhdGlvbnMve2FwcGxp", - "Y2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbXF0dC9jZXJ0aWZpY2F0ZUJoChFp", - "by5jaGlycHN0YWNrLmFwaUIQQXBwbGljYXRpb25Qcm90b1ABWi5naXRodWIu", - "Y29tL2NoaXJwc3RhY2svY2hpcnBzdGFjay9hcGkvZ28vdjQvYXBpqgIOQ2hp", - "cnBzdGFjay5BcGliBnByb3RvMw==")); + "fS9pbnRlZ3JhdGlvbnMvaWZ0dHQ6ASoSkwEKFkRlbGV0ZUlmdHR0SW50ZWdy", + "YXRpb24SIi5hcGkuRGVsZXRlSWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QaFi5n", + "b29nbGUucHJvdG9idWYuRW1wdHkiPYLT5JMCNyo1L2FwaS9hcHBsaWNhdGlv", + "bnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvaWZ0dHQS4QEKKEdl", + "bmVyYXRlTXF0dEludGVncmF0aW9uQ2xpZW50Q2VydGlmaWNhdGUSNC5hcGku", + "R2VuZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZpY2F0ZVJlcXVl", + "c3QaNS5hcGkuR2VuZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZp", + "Y2F0ZVJlc3BvbnNlIkiC0+STAkIiQC9hcGkvYXBwbGljYXRpb25zL3thcHBs", + "aWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL21xdHQvY2VydGlmaWNhdGVCaAoR", + "aW8uY2hpcnBzdGFjay5hcGlCEEFwcGxpY2F0aW9uUHJvdG9QAVouZ2l0aHVi", + "LmNvbS9jaGlycHN0YWNrL2NoaXJwc3RhY2svYXBpL2dvL3Y0L2FwaaoCDkNo", + "aXJwc3RhY2suQXBpYgZwcm90bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::Google.Api.AnnotationsReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.EmptyReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Chirpstack.Api.Encoding), typeof(global::Chirpstack.Api.IntegrationKind), typeof(global::Chirpstack.Api.InfluxDbPrecision), typeof(global::Chirpstack.Api.InfluxDbVersion), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -432,7 +433,7 @@ namespace Chirpstack.Api { new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetPilotThingsIntegrationResponse), global::Chirpstack.Api.GetPilotThingsIntegrationResponse.Parser, new[]{ "Integration" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.UpdatePilotThingsIntegrationRequest), global::Chirpstack.Api.UpdatePilotThingsIntegrationRequest.Parser, new[]{ "Integration" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.DeletePilotThingsIntegrationRequest), global::Chirpstack.Api.DeletePilotThingsIntegrationRequest.Parser, new[]{ "ApplicationId" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.IftttIntegration), global::Chirpstack.Api.IftttIntegration.Parser, new[]{ "ApplicationId", "Key", "UplinkValues" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.IftttIntegration), global::Chirpstack.Api.IftttIntegration.Parser, new[]{ "ApplicationId", "Key", "UplinkValues", "ArbitraryJson", "EventPrefix" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.CreateIftttIntegrationRequest), global::Chirpstack.Api.CreateIftttIntegrationRequest.Parser, new[]{ "Integration" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetIftttIntegrationRequest), global::Chirpstack.Api.GetIftttIntegrationRequest.Parser, new[]{ "ApplicationId" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetIftttIntegrationResponse), global::Chirpstack.Api.GetIftttIntegrationResponse.Parser, new[]{ "Integration" }, null, null, null, null), @@ -6136,7 +6137,7 @@ namespace Chirpstack.Api { public const int IntegrationFieldNumber = 1; private global::Chirpstack.Api.InfluxDbIntegration integration_; /// - /// Integration object to update. + /// Integration object to update. /// [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] @@ -10997,7 +10998,8 @@ namespace Chirpstack.Api { private string credentialsFile_ = ""; /// /// Credentials file. - /// This IAM service-account credentials file (JSON) must have the following Pub/Sub roles: + /// This IAM service-account credentials file (JSON) must have the following + /// Pub/Sub roles: /// * Pub/Sub Publisher /// [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -16231,6 +16233,8 @@ namespace Chirpstack.Api { applicationId_ = other.applicationId_; key_ = other.key_; uplinkValues_ = other.uplinkValues_.Clone(); + arbitraryJson_ = other.arbitraryJson_; + eventPrefix_ = other.eventPrefix_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -16287,7 +16291,8 @@ namespace Chirpstack.Api { /// You would specify the following fields: /// uplink_values = ["batteryLevel", "buttons_0_pressed"] /// - /// Note: The first value is always used for the DevEUI. + /// Notes: The first value is always used for the DevEUI. + /// Ignored if arbitrary_json is set to true. /// [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] @@ -16295,6 +16300,42 @@ namespace Chirpstack.Api { get { return uplinkValues_; } } + /// Field number for the "arbitrary_json" field. + public const int ArbitraryJsonFieldNumber = 4; + private bool arbitraryJson_; + /// + /// Arbitrary JSON. + /// If set to true, ChirpStack events will be sent as-is as arbitrary JSON + /// payload. If set to false (default), the 3 JSON values format will be used. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool ArbitraryJson { + get { return arbitraryJson_; } + set { + arbitraryJson_ = value; + } + } + + /// Field number for the "event_prefix" field. + public const int EventPrefixFieldNumber = 5; + private string eventPrefix_ = ""; + /// + /// Event prefix. + /// If set, the event name will be PREFIX_EVENT. For example if event_prefix + /// is set to weatherstation, and uplink event will be sent as + /// weatherstation_up to the IFTTT webhook. + /// Note: Only characters in the A-Z, a-z and 0-9 range are allowed. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string EventPrefix { + get { return eventPrefix_; } + set { + eventPrefix_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override bool Equals(object other) { @@ -16313,6 +16354,8 @@ namespace Chirpstack.Api { if (ApplicationId != other.ApplicationId) return false; if (Key != other.Key) return false; if(!uplinkValues_.Equals(other.uplinkValues_)) return false; + if (ArbitraryJson != other.ArbitraryJson) return false; + if (EventPrefix != other.EventPrefix) return false; return Equals(_unknownFields, other._unknownFields); } @@ -16323,6 +16366,8 @@ namespace Chirpstack.Api { if (ApplicationId.Length != 0) hash ^= ApplicationId.GetHashCode(); if (Key.Length != 0) hash ^= Key.GetHashCode(); hash ^= uplinkValues_.GetHashCode(); + if (ArbitraryJson != false) hash ^= ArbitraryJson.GetHashCode(); + if (EventPrefix.Length != 0) hash ^= EventPrefix.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -16350,6 +16395,14 @@ namespace Chirpstack.Api { output.WriteString(Key); } uplinkValues_.WriteTo(output, _repeated_uplinkValues_codec); + if (ArbitraryJson != false) { + output.WriteRawTag(32); + output.WriteBool(ArbitraryJson); + } + if (EventPrefix.Length != 0) { + output.WriteRawTag(42); + output.WriteString(EventPrefix); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -16369,6 +16422,14 @@ namespace Chirpstack.Api { output.WriteString(Key); } uplinkValues_.WriteTo(ref output, _repeated_uplinkValues_codec); + if (ArbitraryJson != false) { + output.WriteRawTag(32); + output.WriteBool(ArbitraryJson); + } + if (EventPrefix.Length != 0) { + output.WriteRawTag(42); + output.WriteString(EventPrefix); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -16386,6 +16447,12 @@ namespace Chirpstack.Api { size += 1 + pb::CodedOutputStream.ComputeStringSize(Key); } size += uplinkValues_.CalculateSize(_repeated_uplinkValues_codec); + if (ArbitraryJson != false) { + size += 1 + 1; + } + if (EventPrefix.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(EventPrefix); + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -16405,6 +16472,12 @@ namespace Chirpstack.Api { Key = other.Key; } uplinkValues_.Add(other.uplinkValues_); + if (other.ArbitraryJson != false) { + ArbitraryJson = other.ArbitraryJson; + } + if (other.EventPrefix.Length != 0) { + EventPrefix = other.EventPrefix; + } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -16432,6 +16505,14 @@ namespace Chirpstack.Api { uplinkValues_.AddEntriesFrom(input, _repeated_uplinkValues_codec); break; } + case 32: { + ArbitraryJson = input.ReadBool(); + break; + } + case 42: { + EventPrefix = input.ReadString(); + break; + } } } #endif @@ -16459,6 +16540,14 @@ namespace Chirpstack.Api { uplinkValues_.AddEntriesFrom(ref input, _repeated_uplinkValues_codec); break; } + case 32: { + ArbitraryJson = input.ReadBool(); + break; + } + case 42: { + EventPrefix = input.ReadString(); + break; + } } } } diff --git a/api/csharp/Chirpstack/api/ApplicationGrpc.cs b/api/csharp/Chirpstack/api/ApplicationGrpc.cs index 7e6e9098..c8369f27 100644 --- a/api/csharp/Chirpstack/api/ApplicationGrpc.cs +++ b/api/csharp/Chirpstack/api/ApplicationGrpc.cs @@ -9,7 +9,8 @@ using grpc = global::Grpc.Core; namespace Chirpstack.Api { /// - /// ApplicationService is the service providing API methods for managing applications. + /// ApplicationService is the service providing API methods for managing + /// applications. /// public static partial class ApplicationService { diff --git a/api/go/api/application.pb.go b/api/go/api/application.pb.go index cc34d638..73916259 100644 --- a/api/go/api/application.pb.go +++ b/api/go/api/application.pb.go @@ -2803,7 +2803,8 @@ type GcpPubSubIntegration struct { // Encoding. Encoding Encoding `protobuf:"varint,2,opt,name=encoding,proto3,enum=api.Encoding" json:"encoding,omitempty"` // Credentials file. - // This IAM service-account credentials file (JSON) must have the following Pub/Sub roles: + // This IAM service-account credentials file (JSON) must have the following + // Pub/Sub roles: // * Pub/Sub Publisher CredentialsFile string `protobuf:"bytes,3,opt,name=credentials_file,json=credentialsFile,proto3" json:"credentials_file,omitempty"` // Project ID. @@ -4097,8 +4098,19 @@ type IftttIntegration struct { // You would specify the following fields: // uplink_values = ["batteryLevel", "buttons_0_pressed"] // - // Note: The first value is always used for the DevEUI. + // Notes: The first value is always used for the DevEUI. + // Ignored if arbitrary_json is set to true. UplinkValues []string `protobuf:"bytes,3,rep,name=uplink_values,json=uplinkValues,proto3" json:"uplink_values,omitempty"` + // Arbitrary JSON. + // If set to true, ChirpStack events will be sent as-is as arbitrary JSON + // payload. If set to false (default), the 3 JSON values format will be used. + ArbitraryJson bool `protobuf:"varint,4,opt,name=arbitrary_json,json=arbitraryJson,proto3" json:"arbitrary_json,omitempty"` + // Event prefix. + // If set, the event name will be PREFIX_EVENT. For example if event_prefix + // is set to weatherstation, and uplink event will be sent as + // weatherstation_up to the IFTTT webhook. + // Note: Only characters in the A-Z, a-z and 0-9 range are allowed. + EventPrefix string `protobuf:"bytes,5,opt,name=event_prefix,json=eventPrefix,proto3" json:"event_prefix,omitempty"` } func (x *IftttIntegration) Reset() { @@ -4154,6 +4166,20 @@ func (x *IftttIntegration) GetUplinkValues() []string { return nil } +func (x *IftttIntegration) GetArbitraryJson() bool { + if x != nil { + return x.ArbitraryJson + } + return false +} + +func (x *IftttIntegration) GetEventPrefix() string { + if x != nil { + return x.EventPrefix + } + return "" +} + type CreateIftttIntegrationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5017,569 +5043,574 @@ var file_api_application_proto_rawDesc = []byte{ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x70, 0x0a, 0x10, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x58, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x43, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, - 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x56, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x49, 0x66, 0x74, 0x74, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x58, 0x0a, - 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, - 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x46, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, - 0x58, 0x0a, 0x2f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4d, 0x71, 0x74, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xba, 0x01, 0x0a, 0x30, 0x47, 0x65, + 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xba, 0x01, 0x0a, 0x10, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x70, 0x6c, 0x69, 0x6e, + 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x72, 0x62, 0x69, 0x74, + 0x72, 0x61, 0x72, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x61, 0x72, 0x62, 0x69, 0x74, 0x72, 0x61, 0x72, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x21, + 0x0a, 0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x22, 0x58, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x37, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x66, + 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x1a, 0x47, + 0x65, 0x74, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x22, 0x56, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x37, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x66, 0x74, 0x74, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x58, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x0b, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x46, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x58, 0x0a, 0x2f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4d, 0x71, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, - 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, - 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x2a, 0x22, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, - 0x6e, 0x67, 0x12, 0x08, 0x0a, 0x04, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, - 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x42, 0x55, 0x46, 0x10, 0x01, 0x2a, 0xbf, 0x01, 0x0a, 0x0f, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x08, - 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x46, 0x4c, - 0x55, 0x58, 0x5f, 0x44, 0x42, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x48, 0x49, 0x4e, 0x47, - 0x53, 0x5f, 0x42, 0x4f, 0x41, 0x52, 0x44, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x59, 0x5f, - 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x53, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x4f, 0x52, - 0x41, 0x5f, 0x43, 0x4c, 0x4f, 0x55, 0x44, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x47, 0x43, 0x50, - 0x5f, 0x50, 0x55, 0x42, 0x5f, 0x53, 0x55, 0x42, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x57, - 0x53, 0x5f, 0x53, 0x4e, 0x53, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x5a, 0x55, 0x52, 0x45, - 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x42, 0x55, 0x53, 0x10, 0x07, 0x12, 0x10, - 0x0a, 0x0c, 0x50, 0x49, 0x4c, 0x4f, 0x54, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x53, 0x10, 0x08, - 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x51, 0x54, 0x54, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x10, - 0x09, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x46, 0x54, 0x54, 0x54, 0x10, 0x0a, 0x2a, 0x3f, 0x0a, 0x11, - 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x50, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x53, 0x10, 0x00, 0x12, 0x05, 0x0a, 0x01, 0x55, 0x10, 0x01, - 0x12, 0x06, 0x0a, 0x02, 0x4d, 0x53, 0x10, 0x02, 0x12, 0x05, 0x0a, 0x01, 0x53, 0x10, 0x03, 0x12, - 0x05, 0x0a, 0x01, 0x4d, 0x10, 0x04, 0x12, 0x05, 0x0a, 0x01, 0x48, 0x10, 0x05, 0x2a, 0x31, 0x0a, - 0x0f, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4e, 0x46, 0x4c, 0x55, 0x58, 0x44, 0x42, 0x5f, 0x31, 0x10, 0x00, - 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4e, 0x46, 0x4c, 0x55, 0x58, 0x44, 0x42, 0x5f, 0x32, 0x10, 0x01, - 0x32, 0xb8, 0x3c, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x65, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x5e, - 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x6e, - 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x1a, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, + 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xba, 0x01, 0x0a, 0x30, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x4d, 0x71, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, + 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, + 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, + 0x07, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x73, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, + 0x74, 0x2a, 0x22, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x08, 0x0a, + 0x04, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x52, 0x4f, 0x54, 0x4f, + 0x42, 0x55, 0x46, 0x10, 0x01, 0x2a, 0xbf, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, + 0x50, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x46, 0x4c, 0x55, 0x58, 0x5f, 0x44, 0x42, + 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x42, 0x4f, 0x41, + 0x52, 0x44, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x59, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, + 0x45, 0x53, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x4f, 0x52, 0x41, 0x5f, 0x43, 0x4c, 0x4f, + 0x55, 0x44, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x47, 0x43, 0x50, 0x5f, 0x50, 0x55, 0x42, 0x5f, + 0x53, 0x55, 0x42, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x57, 0x53, 0x5f, 0x53, 0x4e, 0x53, + 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, + 0x49, 0x43, 0x45, 0x5f, 0x42, 0x55, 0x53, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x49, 0x4c, + 0x4f, 0x54, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x53, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, + 0x51, 0x54, 0x54, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x10, 0x09, 0x12, 0x09, 0x0a, 0x05, + 0x49, 0x46, 0x54, 0x54, 0x54, 0x10, 0x0a, 0x2a, 0x3f, 0x0a, 0x11, 0x49, 0x6e, 0x66, 0x6c, 0x75, + 0x78, 0x44, 0x62, 0x50, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x06, 0x0a, 0x02, + 0x4e, 0x53, 0x10, 0x00, 0x12, 0x05, 0x0a, 0x01, 0x55, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4d, + 0x53, 0x10, 0x02, 0x12, 0x05, 0x0a, 0x01, 0x53, 0x10, 0x03, 0x12, 0x05, 0x0a, 0x01, 0x4d, 0x10, + 0x04, 0x12, 0x05, 0x0a, 0x01, 0x48, 0x10, 0x05, 0x2a, 0x31, 0x0a, 0x0f, 0x49, 0x6e, 0x66, 0x6c, + 0x75, 0x78, 0x44, 0x62, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x0a, 0x49, + 0x4e, 0x46, 0x4c, 0x55, 0x58, 0x44, 0x42, 0x5f, 0x31, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x49, + 0x4e, 0x46, 0x4c, 0x55, 0x58, 0x44, 0x42, 0x5f, 0x32, 0x10, 0x01, 0x32, 0xb8, 0x3c, 0x0a, 0x12, + 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x65, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x5e, 0x0a, 0x03, 0x47, 0x65, 0x74, + 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x18, 0x12, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x6e, 0x0a, 0x06, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x27, 0x1a, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x5f, 0x0a, 0x06, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x5e, 0x0a, 0x04, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x48, 0x74, 0x74, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x74, 0x74, 0x70, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x45, 0x22, 0x40, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x01, 0x2a, 0x12, 0x93, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x48, + 0x74, 0x74, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x74, 0x74, 0x70, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x74, 0x74, 0x70, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x12, 0x34, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x5f, - 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, - 0x5e, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x88, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x15, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x74, 0x74, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x48, 0x74, 0x74, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x22, 0x40, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x01, 0x2a, 0x12, 0x93, 0x01, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x48, 0x74, 0x74, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x74, 0x74, - 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x74, 0x74, - 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x12, 0x34, 0x2f, 0x61, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x12, 0x9f, 0x01, + 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x74, 0x74, 0x70, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x48, 0x74, 0x74, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x1a, 0x40, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x01, 0x2a, 0x12, + 0x90, 0x01, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x74, 0x74, 0x70, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x74, 0x74, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x2a, 0x34, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x68, 0x74, - 0x74, 0x70, 0x12, 0x9f, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x74, 0x74, - 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x74, 0x74, 0x70, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x1a, - 0x40, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x68, 0x74, 0x74, - 0x70, 0x3a, 0x01, 0x2a, 0x12, 0x90, 0x01, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, - 0x74, 0x74, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x74, 0x74, 0x70, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x36, 0x2a, 0x34, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x12, 0xab, 0x01, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x22, 0x44, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x78, - 0x64, 0x62, 0x3a, 0x01, 0x2a, 0x12, 0xa3, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, + 0x74, 0x70, 0x12, 0xab, 0x01, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, - 0x44, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, - 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x3a, 0x12, 0x38, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x64, 0x62, 0x12, 0xab, 0x01, 0x0a, 0x19, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, - 0x1a, 0x44, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x6e, - 0x66, 0x6c, 0x75, 0x78, 0x64, 0x62, 0x3a, 0x01, 0x2a, 0x12, 0x9c, 0x01, 0x0a, 0x19, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x2a, 0x38, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x64, 0x62, 0x12, 0xb4, 0x01, 0x0a, 0x1c, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, 0x72, - 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x52, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x4c, 0x22, 0x47, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x01, 0x2a, 0x12, - 0xaf, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, - 0x72, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, - 0x72, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, - 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x3d, 0x12, 0x3b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x12, 0xb4, 0x01, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x69, 0x6e, - 0x67, 0x73, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, - 0x68, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x1a, 0x47, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0xa5, 0x01, 0x0a, 0x1c, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, 0x72, - 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x43, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x3d, 0x2a, 0x3b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x12, 0xae, 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x50, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4a, 0x22, 0x45, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, + 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x22, 0x44, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, 0x79, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x3a, 0x01, - 0x2a, 0x12, 0xa7, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x79, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, - 0x12, 0x39, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x6d, 0x79, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0xae, 0x01, 0x0a, 0x1a, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x50, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x4a, 0x1a, 0x45, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x6d, 0x79, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x9f, 0x01, 0x0a, - 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x41, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x3b, 0x2a, 0x39, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, 0x79, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0xae, - 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, - 0x75, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, - 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x50, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x4a, 0x22, 0x45, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x01, 0x2a, 0x12, - 0xa7, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, - 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x12, 0x39, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x6c, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0xae, 0x01, 0x0a, 0x1a, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x50, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4a, - 0x1a, 0x45, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, - 0x72, 0x61, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x9f, 0x01, 0x0a, 0x1a, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x3b, 0x2a, 0x39, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0xb0, 0x01, 0x0a, - 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, - 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x52, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x4c, 0x22, 0x47, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x67, 0x63, 0x70, 0x2d, 0x70, 0x75, 0x62, 0x2d, 0x73, 0x75, 0x62, 0x3a, 0x01, 0x2a, 0x12, - 0xa9, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, - 0x53, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x12, 0x3b, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x67, 0x63, 0x70, 0x2d, 0x70, 0x75, 0x62, 0x2d, 0x73, 0x75, 0x62, 0x12, 0xb0, 0x01, 0x0a, 0x1a, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x4c, 0x1a, 0x47, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x67, 0x63, 0x70, 0x2d, 0x70, 0x75, 0x62, 0x2d, 0x73, 0x75, 0x62, 0x3a, 0x01, 0x2a, 0x12, 0xa1, - 0x01, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, - 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, - 0x53, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x43, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x2a, 0x3b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x63, 0x70, 0x2d, 0x70, 0x75, 0x62, 0x2d, 0x73, - 0x75, 0x62, 0x12, 0xa6, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x77, 0x73, - 0x53, 0x6e, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x77, 0x73, 0x53, 0x6e, - 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x48, 0x22, 0x43, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x61, 0x77, 0x73, 0x2d, 0x73, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x9c, 0x01, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x41, 0x77, 0x73, 0x53, 0x6e, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x77, - 0x73, 0x53, 0x6e, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, - 0x41, 0x77, 0x73, 0x53, 0x6e, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x39, 0x12, 0x37, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x61, 0x77, 0x73, 0x2d, 0x73, 0x6e, 0x73, 0x12, 0xa6, 0x01, 0x0a, 0x17, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x77, 0x73, 0x53, 0x6e, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x41, 0x77, 0x73, 0x53, 0x6e, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x64, 0x62, 0x3a, 0x01, 0x2a, + 0x12, 0xa3, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, + 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x12, 0x38, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x6e, + 0x66, 0x6c, 0x75, 0x78, 0x64, 0x62, 0x12, 0xab, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x4e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x48, 0x1a, 0x43, 0x2f, 0x61, 0x70, + 0x70, 0x74, 0x79, 0x22, 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x1a, 0x44, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x77, 0x73, 0x2d, 0x73, 0x6e, 0x73, - 0x3a, 0x01, 0x2a, 0x12, 0x97, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x77, - 0x73, 0x53, 0x6e, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x77, 0x73, 0x53, - 0x6e, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3f, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x39, 0x2a, 0x37, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x77, 0x73, 0x2d, 0x73, 0x6e, 0x73, 0x12, 0xc2, 0x01, - 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x42, 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, - 0x7a, 0x75, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x75, 0x73, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x58, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x52, - 0x22, 0x4d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x7a, - 0x75, 0x72, 0x65, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x62, 0x75, 0x73, 0x3a, - 0x01, 0x2a, 0x12, 0xc1, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x7a, - 0x75, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x75, 0x73, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x43, 0x12, 0x41, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2d, 0x62, 0x75, 0x73, 0x12, 0xc2, 0x01, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x75, 0x73, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x42, 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x64, + 0x62, 0x3a, 0x01, 0x2a, 0x12, 0x9c, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x44, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x58, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x52, 0x1a, 0x4d, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x2d, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2d, 0x62, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0xb3, 0x01, 0x0a, 0x20, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x42, 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x7a, 0x75, - 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, + 0x79, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x2a, 0x38, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x6c, 0x75, + 0x78, 0x64, 0x62, 0x12, 0xb4, 0x01, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x68, + 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x43, 0x2a, 0x41, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x22, 0x47, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x68, 0x69, 0x6e, + 0x67, 0x73, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0xaf, 0x01, 0x0a, 0x19, 0x47, + 0x65, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x42, + 0x6f, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x12, + 0x3b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0xb4, 0x01, 0x0a, + 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, + 0x72, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, + 0x42, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x1a, 0x47, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x3a, 0x01, 0x2a, 0x12, 0xa5, 0x01, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x68, + 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x2a, 0x3b, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0xae, 0x01, 0x0a, 0x1a, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x50, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x4a, 0x22, 0x45, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x6d, 0x79, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0xa7, 0x01, 0x0a, + 0x17, 0x47, 0x65, 0x74, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, + 0x65, 0x74, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x12, 0x39, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, 0x79, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0xae, 0x01, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x50, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4a, 0x1a, 0x45, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, 0x79, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x9f, 0x01, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4d, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x2a, 0x39, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x6d, 0x79, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0xae, 0x01, 0x0a, 0x1a, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x50, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4a, + 0x22, 0x45, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0xa7, 0x01, 0x0a, 0x17, 0x47, + 0x65, 0x74, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, + 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x12, 0x39, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x12, 0xae, 0x01, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4c, + 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x50, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4a, 0x1a, 0x45, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x9f, 0x01, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4c, 0x6f, 0x72, 0x61, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x2a, 0x39, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0xb0, 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x22, 0x47, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x63, 0x70, 0x2d, + 0x70, 0x75, 0x62, 0x2d, 0x73, 0x75, 0x62, 0x3a, 0x01, 0x2a, 0x12, 0xa9, 0x01, 0x0a, 0x17, 0x47, + 0x65, 0x74, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, + 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x12, 0x3b, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x63, 0x70, 0x2d, 0x70, + 0x75, 0x62, 0x2d, 0x73, 0x75, 0x62, 0x12, 0xb0, 0x01, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x1a, 0x47, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x63, 0x70, 0x2d, 0x70, + 0x75, 0x62, 0x2d, 0x73, 0x75, 0x62, 0x3a, 0x01, 0x2a, 0x12, 0xa1, 0x01, 0x0a, 0x1a, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x63, 0x70, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, + 0x2a, 0x3b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x67, 0x63, 0x70, 0x2d, 0x70, 0x75, 0x62, 0x2d, 0x73, 0x75, 0x62, 0x12, 0xa6, 0x01, + 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x77, 0x73, 0x53, 0x6e, 0x73, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x77, 0x73, 0x53, 0x6e, 0x73, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x48, 0x22, 0x43, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x77, 0x73, 0x2d, + 0x73, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x9c, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x77, + 0x73, 0x53, 0x6e, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x77, 0x73, 0x53, 0x6e, 0x73, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x77, 0x73, 0x53, 0x6e, + 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x77, + 0x73, 0x2d, 0x73, 0x6e, 0x73, 0x12, 0xa6, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x41, 0x77, 0x73, 0x53, 0x6e, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x77, + 0x73, 0x53, 0x6e, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x48, 0x1a, 0x43, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x77, 0x73, 0x2d, 0x73, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x97, + 0x01, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x77, 0x73, 0x53, 0x6e, 0x73, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x77, 0x73, 0x53, 0x6e, 0x73, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x2a, + 0x37, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x61, 0x77, 0x73, 0x2d, 0x73, 0x6e, 0x73, 0x12, 0xc2, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, + 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x58, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x52, 0x22, 0x4d, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x2d, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x62, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0xc1, 0x01, + 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x42, 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x42, 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x43, 0x12, 0x41, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x62, 0x75, - 0x73, 0x12, 0xb5, 0x01, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x69, 0x6c, 0x6f, - 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, - 0x69, 0x6c, 0x6f, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x53, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4d, 0x22, 0x48, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2d, - 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0xb0, 0x01, 0x0a, 0x19, 0x47, 0x65, - 0x74, 0x50, 0x69, 0x6c, 0x6f, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, - 0x74, 0x50, 0x69, 0x6c, 0x6f, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x6c, 0x6f, 0x74, 0x54, 0x68, 0x69, - 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2d, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xb5, 0x01, 0x0a, - 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x69, 0x6c, 0x6f, 0x74, 0x54, 0x68, 0x69, 0x6e, + 0x73, 0x12, 0xc2, 0x01, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x7a, 0x75, 0x72, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, + 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x58, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x52, 0x1a, 0x4d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2d, + 0x62, 0x75, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0xb3, 0x01, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x75, 0x73, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x42, 0x75, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x43, 0x2a, 0x41, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x7a, 0x75, 0x72, 0x65, + 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x62, 0x75, 0x73, 0x12, 0xb5, 0x01, 0x0a, + 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x69, 0x6c, 0x6f, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x69, 0x6c, 0x6f, 0x74, 0x54, + 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x69, 0x6c, 0x6f, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x53, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4d, 0x1a, 0x48, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, + 0x53, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4d, 0x22, 0x48, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2d, 0x74, 0x68, 0x69, 0x6e, 0x67, - 0x73, 0x3a, 0x01, 0x2a, 0x12, 0xa6, 0x01, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, - 0x69, 0x6c, 0x6f, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x50, 0x69, 0x6c, 0x6f, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x2a, - 0x3c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2d, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xa2, 0x01, - 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x22, 0x41, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x66, 0x74, 0x74, 0x74, 0x3a, - 0x01, 0x2a, 0x12, 0x97, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x47, 0x65, 0x74, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x66, 0x74, 0x74, 0x74, 0x12, 0xa2, 0x01, 0x0a, - 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x1a, 0x41, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x66, 0x74, 0x74, 0x74, 0x3a, 0x01, - 0x2a, 0x12, 0x93, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, - 0x2a, 0x35, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x69, 0x66, 0x74, 0x74, 0x74, 0x12, 0xe1, 0x01, 0x0a, 0x28, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x4d, 0x71, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x4d, 0x71, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4d, 0x71, 0x74, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x48, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x22, 0x40, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x73, 0x3a, 0x01, 0x2a, 0x12, 0xb0, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50, 0x69, 0x6c, 0x6f, + 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x6c, 0x6f, + 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x65, 0x74, 0x50, 0x69, 0x6c, 0x6f, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, 0x71, 0x74, 0x74, 0x2f, - 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x42, 0x68, 0x0a, 0x11, 0x69, - 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, - 0x42, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, - 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, - 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2e, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x70, 0x69, 0x6c, 0x6f, 0x74, + 0x2d, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xb5, 0x01, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x50, 0x69, 0x6c, 0x6f, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x69, 0x6c, 0x6f, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x53, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x4d, 0x1a, 0x48, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2d, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, + 0xa6, 0x01, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x69, 0x6c, 0x6f, 0x74, 0x54, + 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x69, 0x6c, + 0x6f, 0x74, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x2a, 0x3c, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x70, 0x69, 0x6c, 0x6f, + 0x74, 0x2d, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xa2, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x22, 0x41, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x66, 0x74, 0x74, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x97, 0x01, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x49, + 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, + 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, + 0x12, 0x35, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x69, 0x66, 0x74, 0x74, 0x74, 0x12, 0xa2, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, + 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4c, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x1a, 0x41, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x66, 0x74, 0x74, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x93, 0x01, 0x0a, + 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x49, 0x66, 0x74, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x2a, 0x35, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x66, 0x74, + 0x74, 0x74, 0x12, 0xe1, 0x01, 0x0a, 0x28, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4d, + 0x71, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, + 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4d, 0x71, + 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x4d, 0x71, 0x74, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x42, 0x22, 0x40, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, 0x71, 0x74, 0x74, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x42, 0x68, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, + 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x10, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, + 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, + 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/grpc-web/api/application_pb.d.ts b/api/grpc-web/api/application_pb.d.ts index 37788ff8..05195153 100644 --- a/api/grpc-web/api/application_pb.d.ts +++ b/api/grpc-web/api/application_pb.d.ts @@ -1555,6 +1555,12 @@ export class IftttIntegration extends jspb.Message { clearUplinkValuesList(): IftttIntegration; addUplinkValues(value: string, index?: number): IftttIntegration; + getArbitraryJson(): boolean; + setArbitraryJson(value: boolean): IftttIntegration; + + getEventPrefix(): string; + setEventPrefix(value: string): IftttIntegration; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): IftttIntegration.AsObject; static toObject(includeInstance: boolean, msg: IftttIntegration): IftttIntegration.AsObject; @@ -1568,6 +1574,8 @@ export namespace IftttIntegration { applicationId: string, key: string, uplinkValuesList: Array, + arbitraryJson: boolean, + eventPrefix: string, } } diff --git a/api/grpc-web/api/application_pb.js b/api/grpc-web/api/application_pb.js index b34b9b89..977cf9f0 100644 --- a/api/grpc-web/api/application_pb.js +++ b/api/grpc-web/api/application_pb.js @@ -13195,7 +13195,9 @@ proto.api.IftttIntegration.toObject = function(includeInstance, msg) { var f, obj = { applicationId: jspb.Message.getFieldWithDefault(msg, 1, ""), key: jspb.Message.getFieldWithDefault(msg, 2, ""), - uplinkValuesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f + uplinkValuesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f, + arbitraryJson: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), + eventPrefix: jspb.Message.getFieldWithDefault(msg, 5, "") }; if (includeInstance) { @@ -13244,6 +13246,14 @@ proto.api.IftttIntegration.deserializeBinaryFromReader = function(msg, reader) { var value = /** @type {string} */ (reader.readString()); msg.addUplinkValues(value); break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setArbitraryJson(value); + break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.setEventPrefix(value); + break; default: reader.skipField(); break; @@ -13294,6 +13304,20 @@ proto.api.IftttIntegration.serializeBinaryToWriter = function(message, writer) { f ); } + f = message.getArbitraryJson(); + if (f) { + writer.writeBool( + 4, + f + ); + } + f = message.getEventPrefix(); + if (f.length > 0) { + writer.writeString( + 5, + f + ); + } }; @@ -13370,6 +13394,42 @@ proto.api.IftttIntegration.prototype.clearUplinkValuesList = function() { }; +/** + * optional bool arbitrary_json = 4; + * @return {boolean} + */ +proto.api.IftttIntegration.prototype.getArbitraryJson = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.api.IftttIntegration} returns this + */ +proto.api.IftttIntegration.prototype.setArbitraryJson = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + +/** + * optional string event_prefix = 5; + * @return {string} + */ +proto.api.IftttIntegration.prototype.getEventPrefix = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api.IftttIntegration} returns this + */ +proto.api.IftttIntegration.prototype.setEventPrefix = function(value) { + return jspb.Message.setProto3StringField(this, 5, value); +}; + + diff --git a/api/js/api/application_grpc_pb.js b/api/js/api/application_grpc_pb.js index 66500103..7eaea8f8 100644 --- a/api/js/api/application_grpc_pb.js +++ b/api/js/api/application_grpc_pb.js @@ -701,7 +701,8 @@ function deserialize_google_protobuf_Empty(buffer_arg) { } -// ApplicationService is the service providing API methods for managing applications. +// ApplicationService is the service providing API methods for managing +// applications. var ApplicationServiceService = exports.ApplicationServiceService = { // Create creates the given application. create: { diff --git a/api/js/api/application_pb.d.ts b/api/js/api/application_pb.d.ts index 02505a9c..31f538dc 100644 --- a/api/js/api/application_pb.d.ts +++ b/api/js/api/application_pb.d.ts @@ -1691,6 +1691,12 @@ export class IftttIntegration extends jspb.Message { setUplinkValuesList(value: Array): void; addUplinkValues(value: string, index?: number): string; + getArbitraryJson(): boolean; + setArbitraryJson(value: boolean): void; + + getEventPrefix(): string; + setEventPrefix(value: string): void; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): IftttIntegration.AsObject; static toObject(includeInstance: boolean, msg: IftttIntegration): IftttIntegration.AsObject; @@ -1706,6 +1712,8 @@ export namespace IftttIntegration { applicationId: string, key: string, uplinkValuesList: Array, + arbitraryJson: boolean, + eventPrefix: string, } } diff --git a/api/js/api/application_pb.js b/api/js/api/application_pb.js index b34b9b89..977cf9f0 100644 --- a/api/js/api/application_pb.js +++ b/api/js/api/application_pb.js @@ -13195,7 +13195,9 @@ proto.api.IftttIntegration.toObject = function(includeInstance, msg) { var f, obj = { applicationId: jspb.Message.getFieldWithDefault(msg, 1, ""), key: jspb.Message.getFieldWithDefault(msg, 2, ""), - uplinkValuesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f + uplinkValuesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f, + arbitraryJson: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), + eventPrefix: jspb.Message.getFieldWithDefault(msg, 5, "") }; if (includeInstance) { @@ -13244,6 +13246,14 @@ proto.api.IftttIntegration.deserializeBinaryFromReader = function(msg, reader) { var value = /** @type {string} */ (reader.readString()); msg.addUplinkValues(value); break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setArbitraryJson(value); + break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.setEventPrefix(value); + break; default: reader.skipField(); break; @@ -13294,6 +13304,20 @@ proto.api.IftttIntegration.serializeBinaryToWriter = function(message, writer) { f ); } + f = message.getArbitraryJson(); + if (f) { + writer.writeBool( + 4, + f + ); + } + f = message.getEventPrefix(); + if (f.length > 0) { + writer.writeString( + 5, + f + ); + } }; @@ -13370,6 +13394,42 @@ proto.api.IftttIntegration.prototype.clearUplinkValuesList = function() { }; +/** + * optional bool arbitrary_json = 4; + * @return {boolean} + */ +proto.api.IftttIntegration.prototype.getArbitraryJson = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.api.IftttIntegration} returns this + */ +proto.api.IftttIntegration.prototype.setArbitraryJson = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + +/** + * optional string event_prefix = 5; + * @return {string} + */ +proto.api.IftttIntegration.prototype.getEventPrefix = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api.IftttIntegration} returns this + */ +proto.api.IftttIntegration.prototype.setEventPrefix = function(value) { + return jspb.Message.setProto3StringField(this, 5, value); +}; + + diff --git a/api/md/api/api.md b/api/md/api/api.md index eaabb2fb..bf73e334 100644 --- a/api/md/api/api.md +++ b/api/md/api/api.md @@ -1108,7 +1108,9 @@ | key | [string](#string) | | Key. This key can be obtained from the IFTTT Webhooks documentation page. | | uplink_values | [string](#string) | repeated | Values. Up to 2 values can be forwarded to IFTTT. These values must map to the decoded payload keys. For example: { "batteryLevel": 75.3, "buttons": [{"pressed": false}, {"pressed": true}] } You would specify the following fields: uplink_values = ["batteryLevel", "buttons_0_pressed"] -Note: The first value is always used for the DevEUI. | +Notes: The first value is always used for the DevEUI. Ignored if arbitrary_json is set to true. | +| arbitrary_json | [bool](#bool) | | Arbitrary JSON. If set to true, ChirpStack events will be sent as-is as arbitrary JSON payload. If set to false (default), the 3 JSON values format will be used. | +| event_prefix | [string](#string) | | Event prefix. If set, the event name will be PREFIX_EVENT. For example if event_prefix is set to weatherstation, and uplink event will be sent as weatherstation_up to the IFTTT webhook. Note: Only characters in the A-Z, a-z and 0-9 range are allowed. | @@ -1549,7 +1551,8 @@ Note: The first value is always used for the DevEUI. | ### ApplicationService -ApplicationService is the service providing API methods for managing applications. +ApplicationService is the service providing API methods for managing +applications. | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| diff --git a/api/proto/api/application.proto b/api/proto/api/application.proto index 2055ce09..c0c98cc5 100644 --- a/api/proto/api/application.proto +++ b/api/proto/api/application.proto @@ -12,1006 +12,1081 @@ import "google/api/annotations.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/empty.proto"; -// ApplicationService is the service providing API methods for managing applications. +// ApplicationService is the service providing API methods for managing +// applications. service ApplicationService { - // Create creates the given application. - rpc Create(CreateApplicationRequest) returns (CreateApplicationResponse) { - option(google.api.http) = { - post: "/api/applications" - body: "*" - }; - } + // Create creates the given application. + rpc Create(CreateApplicationRequest) returns (CreateApplicationResponse) { + option (google.api.http) = { + post : "/api/applications" + body : "*" + }; + } - // Get the application for the given ID. - rpc Get(GetApplicationRequest) returns (GetApplicationResponse) { - option(google.api.http) = { - get: "/api/applications/{id}" - }; - } + // Get the application for the given ID. + rpc Get(GetApplicationRequest) returns (GetApplicationResponse) { + option (google.api.http) = { + get : "/api/applications/{id}" + }; + } - // Update updates the given application. - rpc Update(UpdateApplicationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{application.id}" - body: "*" - }; - } + // Update updates the given application. + rpc Update(UpdateApplicationRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{application.id}" + body : "*" + }; + } - // Delete the application for the given ID. - rpc Delete(DeleteApplicationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{id}" - }; - } + // Delete the application for the given ID. + rpc Delete(DeleteApplicationRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{id}" + }; + } - // Get the list of applications. - rpc List(ListApplicationsRequest) returns (ListApplicationsResponse) { - option(google.api.http) = { - get: "/api/applications" - }; - } + // Get the list of applications. + rpc List(ListApplicationsRequest) returns (ListApplicationsResponse) { + option (google.api.http) = { + get : "/api/applications" + }; + } - // List all configured integrations. - rpc ListIntegrations(ListIntegrationsRequest) returns (ListIntegrationsResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations" - }; - } + // List all configured integrations. + rpc ListIntegrations(ListIntegrationsRequest) + returns (ListIntegrationsResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations" + }; + } - // Create HTTP integration. - rpc CreateHttpIntegration(CreateHttpIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/http" - body: "*" - }; - } + // Create HTTP integration. + rpc CreateHttpIntegration(CreateHttpIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/http" + body : "*" + }; + } - // Get the configured HTTP integration. - rpc GetHttpIntegration(GetHttpIntegrationRequest) returns (GetHttpIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/http" - }; - } + // Get the configured HTTP integration. + rpc GetHttpIntegration(GetHttpIntegrationRequest) + returns (GetHttpIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/http" + }; + } - // Update the HTTP integration. - rpc UpdateHttpIntegration(UpdateHttpIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/http" - body: "*" - }; - } + // Update the HTTP integration. + rpc UpdateHttpIntegration(UpdateHttpIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/http" + body : "*" + }; + } - // Delete the HTTP integration. - rpc DeleteHttpIntegration(DeleteHttpIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/http" - }; - } + // Delete the HTTP integration. + rpc DeleteHttpIntegration(DeleteHttpIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/http" + }; + } - // Create InfluxDb integration. - rpc CreateInfluxDbIntegration(CreateInfluxDbIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/influxdb" - body: "*" - }; - } + // Create InfluxDb integration. + rpc CreateInfluxDbIntegration(CreateInfluxDbIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "influxdb" + body : "*" + }; + } - // Get InfluxDb integration. - rpc GetInfluxDbIntegration(GetInfluxDbIntegrationRequest) returns (GetInfluxDbIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/influxdb" - }; - } + // Get InfluxDb integration. + rpc GetInfluxDbIntegration(GetInfluxDbIntegrationRequest) + returns (GetInfluxDbIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/influxdb" + }; + } - // Update InfluxDb integration. - rpc UpdateInfluxDbIntegration(UpdateInfluxDbIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/influxdb" - body: "*" - }; - } + // Update InfluxDb integration. + rpc UpdateInfluxDbIntegration(UpdateInfluxDbIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "influxdb" + body : "*" + }; + } - // Delete InfluxDb integration. - rpc DeleteInfluxDbIntegration(DeleteInfluxDbIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/influxdb" - }; - } + // Delete InfluxDb integration. + rpc DeleteInfluxDbIntegration(DeleteInfluxDbIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/influxdb" + }; + } - // Create ThingsBoard integration. - rpc CreateThingsBoardIntegration(CreateThingsBoardIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/thingsboard" - body: "*" - }; - } + // Create ThingsBoard integration. + rpc CreateThingsBoardIntegration(CreateThingsBoardIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "thingsboard" + body : "*" + }; + } - // Get ThingsBoard integration. - rpc GetThingsBoardIntegration(GetThingsBoardIntegrationRequest) returns (GetThingsBoardIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/thingsboard" - }; - } + // Get ThingsBoard integration. + rpc GetThingsBoardIntegration(GetThingsBoardIntegrationRequest) + returns (GetThingsBoardIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/thingsboard" + }; + } - // Update ThingsBoard integration. - rpc UpdateThingsBoardIntegration(UpdateThingsBoardIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/thingsboard" - body: "*" - }; - } + // Update ThingsBoard integration. + rpc UpdateThingsBoardIntegration(UpdateThingsBoardIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "thingsboard" + body : "*" + }; + } - // Delete ThingsBoard integration. - rpc DeleteThingsBoardIntegration(DeleteThingsBoardIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/thingsboard" - }; - } + // Delete ThingsBoard integration. + rpc DeleteThingsBoardIntegration(DeleteThingsBoardIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/thingsboard" + }; + } - // Create myDevices integration. - rpc CreateMyDevicesIntegration(CreateMyDevicesIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/mydevices" - body: "*" - }; - } + // Create myDevices integration. + rpc CreateMyDevicesIntegration(CreateMyDevicesIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "mydevices" + body : "*" + }; + } - // Get myDevices integration. - rpc GetMyDevicesIntegration(GetMyDevicesIntegrationRequest) returns (GetMyDevicesIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/mydevices" - }; - } + // Get myDevices integration. + rpc GetMyDevicesIntegration(GetMyDevicesIntegrationRequest) + returns (GetMyDevicesIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/mydevices" + }; + } - // Update myDevices integration. - rpc UpdateMyDevicesIntegration(UpdateMyDevicesIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/mydevices" - body: "*" - }; - } + // Update myDevices integration. + rpc UpdateMyDevicesIntegration(UpdateMyDevicesIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "mydevices" + body : "*" + }; + } - // Delete myDevices integration. - rpc DeleteMyDevicesIntegration(DeleteMyDevicesIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/mydevices" - }; - } + // Delete myDevices integration. + rpc DeleteMyDevicesIntegration(DeleteMyDevicesIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/mydevices" + }; + } - // Create LoRaCloud integration. - rpc CreateLoraCloudIntegration(CreateLoraCloudIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/loracloud" - body: "*" - }; - } + // Create LoRaCloud integration. + rpc CreateLoraCloudIntegration(CreateLoraCloudIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "loracloud" + body : "*" + }; + } - // Get LoRaCloud integration. - rpc GetLoraCloudIntegration(GetLoraCloudIntegrationRequest) returns (GetLoraCloudIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/loracloud" - }; - } + // Get LoRaCloud integration. + rpc GetLoraCloudIntegration(GetLoraCloudIntegrationRequest) + returns (GetLoraCloudIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/loracloud" + }; + } - // Update LoRaCloud integration. - rpc UpdateLoraCloudIntegration(UpdateLoraCloudIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/loracloud" - body: "*" - }; - } + // Update LoRaCloud integration. + rpc UpdateLoraCloudIntegration(UpdateLoraCloudIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "loracloud" + body : "*" + }; + } - // Delete LoRaCloud integration. - rpc DeleteLoraCloudIntegration(DeleteLoraCloudIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/loracloud" - }; - } + // Delete LoRaCloud integration. + rpc DeleteLoraCloudIntegration(DeleteLoraCloudIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/loracloud" + }; + } - // Create GCP Pub/Sub integration. - rpc CreateGcpPubSubIntegration(CreateGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/gcp-pub-sub" - body: "*" - }; - } + // Create GCP Pub/Sub integration. + rpc CreateGcpPubSubIntegration(CreateGcpPubSubIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "gcp-pub-sub" + body : "*" + }; + } - // Get GCP Pub/Sub integration. - rpc GetGcpPubSubIntegration(GetGcpPubSubIntegrationRequest) returns (GetGcpPubSubIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/gcp-pub-sub" - }; - } + // Get GCP Pub/Sub integration. + rpc GetGcpPubSubIntegration(GetGcpPubSubIntegrationRequest) + returns (GetGcpPubSubIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/gcp-pub-sub" + }; + } - // Update GCP Pub/Sub integration. - rpc UpdateGcpPubSubIntegration(UpdateGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/gcp-pub-sub" - body: "*" - }; - } + // Update GCP Pub/Sub integration. + rpc UpdateGcpPubSubIntegration(UpdateGcpPubSubIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "gcp-pub-sub" + body : "*" + }; + } - // Delete GCP Pub/Sub integration. - rpc DeleteGcpPubSubIntegration(DeleteGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/gcp-pub-sub" - }; - } + // Delete GCP Pub/Sub integration. + rpc DeleteGcpPubSubIntegration(DeleteGcpPubSubIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/gcp-pub-sub" + }; + } - // Create AWS SNS integration. - rpc CreateAwsSnsIntegration(CreateAwsSnsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/aws-sns" - body: "*" - }; - } + // Create AWS SNS integration. + rpc CreateAwsSnsIntegration(CreateAwsSnsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "aws-sns" + body : "*" + }; + } - // Get AWS SNS integration. - rpc GetAwsSnsIntegration(GetAwsSnsIntegrationRequest) returns (GetAwsSnsIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/aws-sns" - }; - } + // Get AWS SNS integration. + rpc GetAwsSnsIntegration(GetAwsSnsIntegrationRequest) + returns (GetAwsSnsIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/aws-sns" + }; + } - // Update AWS SNS integration. - rpc UpdateAwsSnsIntegration(UpdateAwsSnsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/aws-sns" - body: "*" - }; - } + // Update AWS SNS integration. + rpc UpdateAwsSnsIntegration(UpdateAwsSnsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "aws-sns" + body : "*" + }; + } - // Delete AWS SNS integration. - rpc DeleteAwsSnsIntegration(DeleteAwsSnsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/aws-sns" - }; - } + // Delete AWS SNS integration. + rpc DeleteAwsSnsIntegration(DeleteAwsSnsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/aws-sns" + }; + } - // Create Azure Service-Bus integration. - rpc CreateAzureServiceBusIntegration(CreateAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/azure-service-bus" - body: "*" - }; - } + // Create Azure Service-Bus integration. + rpc CreateAzureServiceBusIntegration(CreateAzureServiceBusIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "azure-service-bus" + body : "*" + }; + } - // Get Azure Service-Bus integration. - rpc GetAzureServiceBusIntegration(GetAzureServiceBusIntegrationRequest) returns (GetAzureServiceBusIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/azure-service-bus" - }; - } + // Get Azure Service-Bus integration. + rpc GetAzureServiceBusIntegration(GetAzureServiceBusIntegrationRequest) + returns (GetAzureServiceBusIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/azure-service-bus" + }; + } - // Update Azure Service-Bus integration. - rpc UpdateAzureServiceBusIntegration(UpdateAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/azure-service-bus" - body: "*" - }; - } + // Update Azure Service-Bus integration. + rpc UpdateAzureServiceBusIntegration(UpdateAzureServiceBusIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "azure-service-bus" + body : "*" + }; + } - // Delete Azure Service-Bus integration. - rpc DeleteAzureServiceBusIntegration(DeleteAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/azure-service-bus" - }; - } + // Delete Azure Service-Bus integration. + rpc DeleteAzureServiceBusIntegration(DeleteAzureServiceBusIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/" + "azure-service-bus" + }; + } - // Create Pilot Things integration. - rpc CreatePilotThingsIntegration(CreatePilotThingsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/pilot-things" - body: "*" - }; - } + // Create Pilot Things integration. + rpc CreatePilotThingsIntegration(CreatePilotThingsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "pilot-things" + body : "*" + }; + } - // Get Pilot Things integration. - rpc GetPilotThingsIntegration(GetPilotThingsIntegrationRequest) returns (GetPilotThingsIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/pilot-things" - }; - } + // Get Pilot Things integration. + rpc GetPilotThingsIntegration(GetPilotThingsIntegrationRequest) + returns (GetPilotThingsIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/pilot-things" + }; + } - // Update Pilot Things integration. - rpc UpdatePilotThingsIntegration(UpdatePilotThingsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/pilot-things" - body: "*" - }; - } + // Update Pilot Things integration. + rpc UpdatePilotThingsIntegration(UpdatePilotThingsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "pilot-things" + body : "*" + }; + } - // Delete Pilot Things integration. - rpc DeletePilotThingsIntegration(DeletePilotThingsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/pilot-things" - }; - } + // Delete Pilot Things integration. + rpc DeletePilotThingsIntegration(DeletePilotThingsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/pilot-things" + }; + } - // Create IFTTT integration. - rpc CreateIftttIntegration(CreateIftttIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/ifttt" - body: "*" - }; - } + // Create IFTTT integration. + rpc CreateIftttIntegration(CreateIftttIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/ifttt" + body : "*" + }; + } - // Get IFTTT integration. - rpc GetIftttIntegration(GetIftttIntegrationRequest) returns (GetIftttIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/ifttt" - }; - } + // Get IFTTT integration. + rpc GetIftttIntegration(GetIftttIntegrationRequest) + returns (GetIftttIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/ifttt" + }; + } - // Update IFTTT integration. - rpc UpdateIftttIntegration(UpdateIftttIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/ifttt" - body: "*" - }; - } + // Update IFTTT integration. + rpc UpdateIftttIntegration(UpdateIftttIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/ifttt" + body : "*" + }; + } - // Delete IFTTT integration. - rpc DeleteIftttIntegration(DeleteIftttIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/ifttt" - }; - } + // Delete IFTTT integration. + rpc DeleteIftttIntegration(DeleteIftttIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/ifttt" + }; + } - // Generates application ID specific client-certificate. - rpc GenerateMqttIntegrationClientCertificate(GenerateMqttIntegrationClientCertificateRequest) returns (GenerateMqttIntegrationClientCertificateResponse) { - option(google.api.http) = { - post: "/api/applications/{application_id}/integrations/mqtt/certificate" - }; - } + // Generates application ID specific client-certificate. + rpc GenerateMqttIntegrationClientCertificate( + GenerateMqttIntegrationClientCertificateRequest) + returns (GenerateMqttIntegrationClientCertificateResponse) { + option (google.api.http) = { + post : "/api/applications/{application_id}/integrations/mqtt/certificate" + }; + } } enum Encoding { - JSON = 0; - PROTOBUF = 1; + JSON = 0; + PROTOBUF = 1; } enum IntegrationKind { - HTTP = 0; - INFLUX_DB = 1; - THINGS_BOARD = 2; - MY_DEVICES = 3; - LORA_CLOUD = 4; - GCP_PUB_SUB = 5; - AWS_SNS = 6; - AZURE_SERVICE_BUS = 7; - PILOT_THINGS = 8; - MQTT_GLOBAL = 9; - IFTTT = 10; + HTTP = 0; + INFLUX_DB = 1; + THINGS_BOARD = 2; + MY_DEVICES = 3; + LORA_CLOUD = 4; + GCP_PUB_SUB = 5; + AWS_SNS = 6; + AZURE_SERVICE_BUS = 7; + PILOT_THINGS = 8; + MQTT_GLOBAL = 9; + IFTTT = 10; } message Application { - // Application ID (UUID). - // Note: on create this will be automatically generated. - string id = 1; + // Application ID (UUID). + // Note: on create this will be automatically generated. + string id = 1; - // Application name. - string name = 2; + // Application name. + string name = 2; - // Application description. - string description = 3; + // Application description. + string description = 3; - // Tenant ID (UUID). - string tenant_id = 4; + // Tenant ID (UUID). + string tenant_id = 4; } message ApplicationListItem { - // Application ID (UUID). - string id = 1; + // Application ID (UUID). + string id = 1; - // Created at timestamp. - google.protobuf.Timestamp created_at = 2; + // Created at timestamp. + google.protobuf.Timestamp created_at = 2; - // Last update timestamp. - google.protobuf.Timestamp updated_at = 3; + // Last update timestamp. + google.protobuf.Timestamp updated_at = 3; - // Application name. - string name = 4; - - // Application description. - string description = 5; + // Application name. + string name = 4; + + // Application description. + string description = 5; } message CreateApplicationRequest { - // Application object to create. - Application application = 1; + // Application object to create. + Application application = 1; } message CreateApplicationResponse { - // Application ID (UUID). - string id = 1; + // Application ID (UUID). + string id = 1; } message GetApplicationRequest { - // Application ID (UUID). - string id = 1; + // Application ID (UUID). + string id = 1; } message GetApplicationResponse { - // Application object. - Application application = 1; + // Application object. + Application application = 1; - // Created at timestamp. - google.protobuf.Timestamp created_at = 2; + // Created at timestamp. + google.protobuf.Timestamp created_at = 2; - // Last update timestamp. - google.protobuf.Timestamp updated_at = 3; + // Last update timestamp. + google.protobuf.Timestamp updated_at = 3; - // Measurement keys. - // This contains the measurement keys from all the device-profiles that - // are used by the devices under this application. - repeated string measurement_keys = 4; + // Measurement keys. + // This contains the measurement keys from all the device-profiles that + // are used by the devices under this application. + repeated string measurement_keys = 4; } message UpdateApplicationRequest { - // Application object. - Application application = 1; + // Application object. + Application application = 1; } message DeleteApplicationRequest { - // Application ID (UUID). - string id = 1; + // Application ID (UUID). + string id = 1; } message ListApplicationsRequest { - // Max number of applications to return in the result-set. - uint32 limit = 1; + // Max number of applications to return in the result-set. + uint32 limit = 1; - // Offset in the result-set (for pagination). - uint32 offset = 2; + // Offset in the result-set (for pagination). + uint32 offset = 2; - // If set, the given string will be used to search on name (optional). - string search = 3; + // If set, the given string will be used to search on name (optional). + string search = 3; - // Tenant ID to list the applications for. - string tenant_id = 4; + // Tenant ID to list the applications for. + string tenant_id = 4; } message ListApplicationsResponse { - // Total number of applications. - uint32 total_count = 1; + // Total number of applications. + uint32 total_count = 1; - // Result-set. - repeated ApplicationListItem result = 2; + // Result-set. + repeated ApplicationListItem result = 2; } message ListIntegrationsRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message IntegrationListItem { - // Integration kind. - IntegrationKind kind = 1; + // Integration kind. + IntegrationKind kind = 1; } message ListIntegrationsResponse { - // Total number of integrations available within the result-set. - uint32 total_count = 1; + // Total number of integrations available within the result-set. + uint32 total_count = 1; - // Integrations within result-set. - repeated IntegrationListItem result = 2; + // Integrations within result-set. + repeated IntegrationListItem result = 2; } message HttpIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // HTTP headers to set when making requests. - map headers = 2; + // HTTP headers to set when making requests. + map headers = 2; - // Payload encoding. - Encoding encoding = 3; + // Payload encoding. + Encoding encoding = 3; - // Event endpoint URL. - // The HTTP integration will POST all events to this enpoint. The request - // will contain a query parameters "event" containing the type of the - // event. - string event_endpoint_url = 4; + // Event endpoint URL. + // The HTTP integration will POST all events to this enpoint. The request + // will contain a query parameters "event" containing the type of the + // event. + string event_endpoint_url = 4; } message CreateHttpIntegrationRequest { - // Integration object to create. - HttpIntegration integration = 1; + // Integration object to create. + HttpIntegration integration = 1; } message GetHttpIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetHttpIntegrationResponse { - // Integration object. - HttpIntegration integration = 1; + // Integration object. + HttpIntegration integration = 1; } message UpdateHttpIntegrationRequest { - // Integration object to update. - HttpIntegration integration = 1; + // Integration object to update. + HttpIntegration integration = 1; } message DeleteHttpIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } enum InfluxDbPrecision { - NS = 0; - U = 1; - MS = 2; - S = 3; - M = 4; - H = 5; + NS = 0; + U = 1; + MS = 2; + S = 3; + M = 4; + H = 5; } enum InfluxDbVersion { - INFLUXDB_1 = 0; - INFLUXDB_2 = 1; + INFLUXDB_1 = 0; + INFLUXDB_2 = 1; } message InfluxDbIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // InfluxDb API write endpoint (e.g. http://localhost:8086/write). - string endpoint = 2; + // InfluxDb API write endpoint (e.g. http://localhost:8086/write). + string endpoint = 2; - // InfluxDb database name. (InfluxDb v1) - string db = 3; + // InfluxDb database name. (InfluxDb v1) + string db = 3; - // InfluxDb username. (InfluxDb v1) - string username = 4; + // InfluxDb username. (InfluxDb v1) + string username = 4; - // InfluxDb password. (InfluxDb v1) - string password = 5; + // InfluxDb password. (InfluxDb v1) + string password = 5; - // InfluxDb retention policy name. (InfluxDb v1) - string retention_policy_name = 6; + // InfluxDb retention policy name. (InfluxDb v1) + string retention_policy_name = 6; - // InfluxDb timestamp precision (InfluxDb v1). - InfluxDbPrecision precision = 7; + // InfluxDb timestamp precision (InfluxDb v1). + InfluxDbPrecision precision = 7; - // InfluxDb version. - InfluxDbVersion version = 8; + // InfluxDb version. + InfluxDbVersion version = 8; - // Token. (InfluxDb v2) - string token = 9; + // Token. (InfluxDb v2) + string token = 9; - // Organization. (InfluxDb v2) - string organization = 10; + // Organization. (InfluxDb v2) + string organization = 10; - // Bucket. (InfluxDb v2) - string bucket = 11; + // Bucket. (InfluxDb v2) + string bucket = 11; } message CreateInfluxDbIntegrationRequest { - // Integration object to create. - InfluxDbIntegration integration = 1; + // Integration object to create. + InfluxDbIntegration integration = 1; } message GetInfluxDbIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetInfluxDbIntegrationResponse { - // Integration object. - InfluxDbIntegration integration = 1; + // Integration object. + InfluxDbIntegration integration = 1; } message UpdateInfluxDbIntegrationRequest { - // Integration object to update. - InfluxDbIntegration integration = 1; + // Integration object to update. + InfluxDbIntegration integration = 1; } message DeleteInfluxDbIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message ThingsBoardIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // ThingsBoard server endpoint, e.g. https://example.com - string server = 2; + // ThingsBoard server endpoint, e.g. https://example.com + string server = 2; } message CreateThingsBoardIntegrationRequest { - // Integration object to create. - ThingsBoardIntegration integration = 1; + // Integration object to create. + ThingsBoardIntegration integration = 1; } message GetThingsBoardIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetThingsBoardIntegrationResponse { - // Integration object. - ThingsBoardIntegration integration = 1; + // Integration object. + ThingsBoardIntegration integration = 1; } message UpdateThingsBoardIntegrationRequest { - // Integration object to update. - ThingsBoardIntegration integration = 1; + // Integration object to update. + ThingsBoardIntegration integration = 1; } message DeleteThingsBoardIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message MyDevicesIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // myDevices API endpoint. - string endpoint = 2; + // myDevices API endpoint. + string endpoint = 2; } message CreateMyDevicesIntegrationRequest { - // Integration object to create. - MyDevicesIntegration integration = 1; + // Integration object to create. + MyDevicesIntegration integration = 1; } message GetMyDevicesIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetMyDevicesIntegrationResponse { - // Integration object. - MyDevicesIntegration integration = 1; + // Integration object. + MyDevicesIntegration integration = 1; } message UpdateMyDevicesIntegrationRequest { - // Integration object to update. - MyDevicesIntegration integration = 1; + // Integration object to update. + MyDevicesIntegration integration = 1; } message DeleteMyDevicesIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message LoraCloudIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Modem & Geolocation Services configuration. - LoraCloudModemGeolocationServices modem_geolocation_services = 2; + // Modem & Geolocation Services configuration. + LoraCloudModemGeolocationServices modem_geolocation_services = 2; } message LoraCloudModemGeolocationServices { - // API token. - string token = 1; + // API token. + string token = 1; - // Device implements Modem / Modem-E stack. - bool modem_enabled = 2; + // Device implements Modem / Modem-E stack. + bool modem_enabled = 2; - // Forward FPorts. - // Forward uplink messages matching the given FPorts to the MGS. - repeated uint32 forward_f_ports = 16; + // Forward FPorts. + // Forward uplink messages matching the given FPorts to the MGS. + repeated uint32 forward_f_ports = 16; - // Use rx time for GNSS resolving. - // In case this is set to true, the MGS resolver will use the RX time of the - // network instead of the timestamp included in the LR1110 payload. - bool gnss_use_rx_time = 5; + // Use rx time for GNSS resolving. + // In case this is set to true, the MGS resolver will use the RX time of the + // network instead of the timestamp included in the LR1110 payload. + bool gnss_use_rx_time = 5; - // Use gateway location for GNSS resolving. - // In the case this is set to true, ChirpStack will provide the location of - // one of the gateways to the MGS resolver to aid the resolving process. - // Disable this in case the gateway location is not accurate / incorrectly - // configured as an incorrect location will cause the resolver to return an - // error. - bool gnss_use_gateway_location = 17; + // Use gateway location for GNSS resolving. + // In the case this is set to true, ChirpStack will provide the location of + // one of the gateways to the MGS resolver to aid the resolving process. + // Disable this in case the gateway location is not accurate / incorrectly + // configured as an incorrect location will cause the resolver to return an + // error. + bool gnss_use_gateway_location = 17; - // Parse TLV records. - // If enabled, stream records (expected in TLV format) are scanned for GNSS - // data (0x06 or 0x07). If found, ChirpStack will make an additional - // geolocation call to the MGS API for resolving the location of the detected - // payload. - bool parse_tlv = 6; + // Parse TLV records. + // If enabled, stream records (expected in TLV format) are scanned for GNSS + // data (0x06 or 0x07). If found, ChirpStack will make an additional + // geolocation call to the MGS API for resolving the location of the detected + // payload. + bool parse_tlv = 6; - // Geolocation buffer TTL (in seconds). - // If > 0, uplink RX meta-data will be stored in a buffer so that - // the meta-data of multiple uplinks can be used for geolocation. - uint32 geolocation_buffer_ttl = 7; + // Geolocation buffer TTL (in seconds). + // If > 0, uplink RX meta-data will be stored in a buffer so that + // the meta-data of multiple uplinks can be used for geolocation. + uint32 geolocation_buffer_ttl = 7; - // Geolocation minimum buffer size. - // If > 0, geolocation will only be performed when the buffer has - // at least the given size. - uint32 geolocation_min_buffer_size = 8; + // Geolocation minimum buffer size. + // If > 0, geolocation will only be performed when the buffer has + // at least the given size. + uint32 geolocation_min_buffer_size = 8; - // TDOA based geolocation is enabled. - bool geolocation_tdoa = 9; + // TDOA based geolocation is enabled. + bool geolocation_tdoa = 9; - // RSSI based geolocation is enabled. - bool geolocation_rssi = 10; + // RSSI based geolocation is enabled. + bool geolocation_rssi = 10; - // GNSS based geolocation is enabled (LR1110). - bool geolocation_gnss = 11; + // GNSS based geolocation is enabled (LR1110). + bool geolocation_gnss = 11; - // GNSS payload field. - // This holds the name of the field in the decoded payload object which - // contains the GNSS payload bytes (as HEX string). - string geolocation_gnss_payload_field = 12; + // GNSS payload field. + // This holds the name of the field in the decoded payload object which + // contains the GNSS payload bytes (as HEX string). + string geolocation_gnss_payload_field = 12; - // GNSS use RX time. - // In case this is set to true, the resolver will use the RX time of the - // network instead of the timestamp included in the LR1110 payload. - bool geolocation_gnss_use_rx_time = 13; + // GNSS use RX time. + // In case this is set to true, the resolver will use the RX time of the + // network instead of the timestamp included in the LR1110 payload. + bool geolocation_gnss_use_rx_time = 13; - // Wifi based geolocation is enabled. - bool geolocation_wifi = 14; + // Wifi based geolocation is enabled. + bool geolocation_wifi = 14; - // Wifi payload field. - // This holds the name of the field in the decoded payload object which - // contains an array of objects with the following fields: - // * macAddress - e.g. 01:23:45:67:89:ab - // * signalStrength - e.g. -51 (optional) - string geolocation_wifi_payload_field = 15; + // Wifi payload field. + // This holds the name of the field in the decoded payload object which + // contains an array of objects with the following fields: + // * macAddress - e.g. 01:23:45:67:89:ab + // * signalStrength - e.g. -51 (optional) + string geolocation_wifi_payload_field = 15; } message CreateLoraCloudIntegrationRequest { - // Integration object to create. - LoraCloudIntegration integration = 1; + // Integration object to create. + LoraCloudIntegration integration = 1; } message GetLoraCloudIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetLoraCloudIntegrationResponse { - // Integration object. - LoraCloudIntegration integration = 1; + // Integration object. + LoraCloudIntegration integration = 1; } message UpdateLoraCloudIntegrationRequest { - // Integration object to update. - LoraCloudIntegration integration = 1; + // Integration object to update. + LoraCloudIntegration integration = 1; } message DeleteLoraCloudIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GcpPubSubIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Encoding. - Encoding encoding = 2; + // Encoding. + Encoding encoding = 2; - // Credentials file. - // This IAM service-account credentials file (JSON) must have the following Pub/Sub roles: - // * Pub/Sub Publisher - string credentials_file = 3; + // Credentials file. + // This IAM service-account credentials file (JSON) must have the following + // Pub/Sub roles: + // * Pub/Sub Publisher + string credentials_file = 3; - // Project ID. - string project_id = 4; + // Project ID. + string project_id = 4; - // Topic name. - // This is the name of the Pub/Sub topic. - string topic_name = 5; + // Topic name. + // This is the name of the Pub/Sub topic. + string topic_name = 5; } message CreateGcpPubSubIntegrationRequest { - // Integration object to create. - GcpPubSubIntegration integration = 1; + // Integration object to create. + GcpPubSubIntegration integration = 1; } message GetGcpPubSubIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetGcpPubSubIntegrationResponse { - // Integration object. - GcpPubSubIntegration integration = 1; + // Integration object. + GcpPubSubIntegration integration = 1; } message UpdateGcpPubSubIntegrationRequest { - // Integration object to update. - GcpPubSubIntegration integration = 1; + // Integration object to update. + GcpPubSubIntegration integration = 1; } message DeleteGcpPubSubIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message AwsSnsIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Encoding. - Encoding encoding = 2; + // Encoding. + Encoding encoding = 2; - // AWS region. - string region = 3; + // AWS region. + string region = 3; - // AWS Access Key ID. - string access_key_id = 4; + // AWS Access Key ID. + string access_key_id = 4; - // AWS Secret Access Key. - string secret_access_key = 5; + // AWS Secret Access Key. + string secret_access_key = 5; - // Topic ARN. - string topic_arn = 6; + // Topic ARN. + string topic_arn = 6; } message CreateAwsSnsIntegrationRequest { - // Integration object to create. - AwsSnsIntegration integration = 1; + // Integration object to create. + AwsSnsIntegration integration = 1; } message GetAwsSnsIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetAwsSnsIntegrationResponse { - // Integration object. - AwsSnsIntegration integration = 1; + // Integration object. + AwsSnsIntegration integration = 1; } message UpdateAwsSnsIntegrationRequest { - // Integration object to update. - AwsSnsIntegration integration = 1; + // Integration object to update. + AwsSnsIntegration integration = 1; } message DeleteAwsSnsIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message AzureServiceBusIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Encoding. - Encoding encoding = 2; + // Encoding. + Encoding encoding = 2; - // Connection string. - string connection_string = 3; + // Connection string. + string connection_string = 3; - // Publish name. - // This is the name of the topic or queue. - string publish_name = 4; + // Publish name. + // This is the name of the topic or queue. + string publish_name = 4; } message CreateAzureServiceBusIntegrationRequest { - // Integration object to create. - AzureServiceBusIntegration integration = 1; + // Integration object to create. + AzureServiceBusIntegration integration = 1; } message GetAzureServiceBusIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetAzureServiceBusIntegrationResponse { - // Integration object. - AzureServiceBusIntegration integration = 1; + // Integration object. + AzureServiceBusIntegration integration = 1; } message UpdateAzureServiceBusIntegrationRequest { - // Integration object to create. - AzureServiceBusIntegration integration = 1; + // Integration object to create. + AzureServiceBusIntegration integration = 1; } message DeleteAzureServiceBusIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message PilotThingsIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Server URL. - string server = 2; + // Server URL. + string server = 2; - // Authentication token. - string token = 3; + // Authentication token. + string token = 3; } message CreatePilotThingsIntegrationRequest { - // Integration object to create. - PilotThingsIntegration integration = 1; + // Integration object to create. + PilotThingsIntegration integration = 1; } message GetPilotThingsIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetPilotThingsIntegrationResponse { - // Integration object. - PilotThingsIntegration integration = 1; + // Integration object. + PilotThingsIntegration integration = 1; } message UpdatePilotThingsIntegrationRequest { - // Integration object to update. - PilotThingsIntegration integration = 1; + // Integration object to update. + PilotThingsIntegration integration = 1; } message DeletePilotThingsIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message IftttIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Key. - // This key can be obtained from the IFTTT Webhooks documentation page. - string key = 2; + // Key. + // This key can be obtained from the IFTTT Webhooks documentation page. + string key = 2; - // Values. - // Up to 2 values can be forwarded to IFTTT. These values must map to the - // decoded payload keys. For example: - // { - // "batteryLevel": 75.3, - // "buttons": [{"pressed": false}, {"pressed": true}] - // } - // You would specify the following fields: - // uplink_values = ["batteryLevel", "buttons_0_pressed"] - // - // Note: The first value is always used for the DevEUI. - repeated string uplink_values = 3; + // Values. + // Up to 2 values can be forwarded to IFTTT. These values must map to the + // decoded payload keys. For example: + // { + // "batteryLevel": 75.3, + // "buttons": [{"pressed": false}, {"pressed": true}] + // } + // You would specify the following fields: + // uplink_values = ["batteryLevel", "buttons_0_pressed"] + // + // Notes: The first value is always used for the DevEUI. + // Ignored if arbitrary_json is set to true. + repeated string uplink_values = 3; + + // Arbitrary JSON. + // If set to true, ChirpStack events will be sent as-is as arbitrary JSON + // payload. If set to false (default), the 3 JSON values format will be used. + bool arbitrary_json = 4; + + // Event prefix. + // If set, the event name will be PREFIX_EVENT. For example if event_prefix + // is set to weatherstation, and uplink event will be sent as + // weatherstation_up to the IFTTT webhook. + // Note: Only characters in the A-Z, a-z and 0-9 range are allowed. + string event_prefix = 5; } message CreateIftttIntegrationRequest { - // Integration object. - IftttIntegration integration = 1; + // Integration object. + IftttIntegration integration = 1; } message GetIftttIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetIftttIntegrationResponse { - // Integration object. - IftttIntegration integration = 1; + // Integration object. + IftttIntegration integration = 1; } message UpdateIftttIntegrationRequest { - // Integration object to update. - IftttIntegration integration = 1; + // Integration object to update. + IftttIntegration integration = 1; } message DeleteIftttIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GenerateMqttIntegrationClientCertificateRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GenerateMqttIntegrationClientCertificateResponse { - // TLS certificate. - string tls_cert = 1; + // TLS certificate. + string tls_cert = 1; - // TLS key. - string tls_key = 2; + // TLS key. + string tls_key = 2; - // CA certificate. - string ca_cert = 3; + // CA certificate. + string ca_cert = 3; - // Expires at defines the expiration date of the certificate. - google.protobuf.Timestamp expires_at = 4; + // Expires at defines the expiration date of the certificate. + google.protobuf.Timestamp expires_at = 4; } diff --git a/api/python/proto/chirpstack-api/api/application.proto b/api/python/proto/chirpstack-api/api/application.proto index 2055ce09..c0c98cc5 100644 --- a/api/python/proto/chirpstack-api/api/application.proto +++ b/api/python/proto/chirpstack-api/api/application.proto @@ -12,1006 +12,1081 @@ import "google/api/annotations.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/empty.proto"; -// ApplicationService is the service providing API methods for managing applications. +// ApplicationService is the service providing API methods for managing +// applications. service ApplicationService { - // Create creates the given application. - rpc Create(CreateApplicationRequest) returns (CreateApplicationResponse) { - option(google.api.http) = { - post: "/api/applications" - body: "*" - }; - } + // Create creates the given application. + rpc Create(CreateApplicationRequest) returns (CreateApplicationResponse) { + option (google.api.http) = { + post : "/api/applications" + body : "*" + }; + } - // Get the application for the given ID. - rpc Get(GetApplicationRequest) returns (GetApplicationResponse) { - option(google.api.http) = { - get: "/api/applications/{id}" - }; - } + // Get the application for the given ID. + rpc Get(GetApplicationRequest) returns (GetApplicationResponse) { + option (google.api.http) = { + get : "/api/applications/{id}" + }; + } - // Update updates the given application. - rpc Update(UpdateApplicationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{application.id}" - body: "*" - }; - } + // Update updates the given application. + rpc Update(UpdateApplicationRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{application.id}" + body : "*" + }; + } - // Delete the application for the given ID. - rpc Delete(DeleteApplicationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{id}" - }; - } + // Delete the application for the given ID. + rpc Delete(DeleteApplicationRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{id}" + }; + } - // Get the list of applications. - rpc List(ListApplicationsRequest) returns (ListApplicationsResponse) { - option(google.api.http) = { - get: "/api/applications" - }; - } + // Get the list of applications. + rpc List(ListApplicationsRequest) returns (ListApplicationsResponse) { + option (google.api.http) = { + get : "/api/applications" + }; + } - // List all configured integrations. - rpc ListIntegrations(ListIntegrationsRequest) returns (ListIntegrationsResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations" - }; - } + // List all configured integrations. + rpc ListIntegrations(ListIntegrationsRequest) + returns (ListIntegrationsResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations" + }; + } - // Create HTTP integration. - rpc CreateHttpIntegration(CreateHttpIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/http" - body: "*" - }; - } + // Create HTTP integration. + rpc CreateHttpIntegration(CreateHttpIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/http" + body : "*" + }; + } - // Get the configured HTTP integration. - rpc GetHttpIntegration(GetHttpIntegrationRequest) returns (GetHttpIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/http" - }; - } + // Get the configured HTTP integration. + rpc GetHttpIntegration(GetHttpIntegrationRequest) + returns (GetHttpIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/http" + }; + } - // Update the HTTP integration. - rpc UpdateHttpIntegration(UpdateHttpIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/http" - body: "*" - }; - } + // Update the HTTP integration. + rpc UpdateHttpIntegration(UpdateHttpIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/http" + body : "*" + }; + } - // Delete the HTTP integration. - rpc DeleteHttpIntegration(DeleteHttpIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/http" - }; - } + // Delete the HTTP integration. + rpc DeleteHttpIntegration(DeleteHttpIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/http" + }; + } - // Create InfluxDb integration. - rpc CreateInfluxDbIntegration(CreateInfluxDbIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/influxdb" - body: "*" - }; - } + // Create InfluxDb integration. + rpc CreateInfluxDbIntegration(CreateInfluxDbIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "influxdb" + body : "*" + }; + } - // Get InfluxDb integration. - rpc GetInfluxDbIntegration(GetInfluxDbIntegrationRequest) returns (GetInfluxDbIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/influxdb" - }; - } + // Get InfluxDb integration. + rpc GetInfluxDbIntegration(GetInfluxDbIntegrationRequest) + returns (GetInfluxDbIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/influxdb" + }; + } - // Update InfluxDb integration. - rpc UpdateInfluxDbIntegration(UpdateInfluxDbIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/influxdb" - body: "*" - }; - } + // Update InfluxDb integration. + rpc UpdateInfluxDbIntegration(UpdateInfluxDbIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "influxdb" + body : "*" + }; + } - // Delete InfluxDb integration. - rpc DeleteInfluxDbIntegration(DeleteInfluxDbIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/influxdb" - }; - } + // Delete InfluxDb integration. + rpc DeleteInfluxDbIntegration(DeleteInfluxDbIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/influxdb" + }; + } - // Create ThingsBoard integration. - rpc CreateThingsBoardIntegration(CreateThingsBoardIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/thingsboard" - body: "*" - }; - } + // Create ThingsBoard integration. + rpc CreateThingsBoardIntegration(CreateThingsBoardIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "thingsboard" + body : "*" + }; + } - // Get ThingsBoard integration. - rpc GetThingsBoardIntegration(GetThingsBoardIntegrationRequest) returns (GetThingsBoardIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/thingsboard" - }; - } + // Get ThingsBoard integration. + rpc GetThingsBoardIntegration(GetThingsBoardIntegrationRequest) + returns (GetThingsBoardIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/thingsboard" + }; + } - // Update ThingsBoard integration. - rpc UpdateThingsBoardIntegration(UpdateThingsBoardIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/thingsboard" - body: "*" - }; - } + // Update ThingsBoard integration. + rpc UpdateThingsBoardIntegration(UpdateThingsBoardIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "thingsboard" + body : "*" + }; + } - // Delete ThingsBoard integration. - rpc DeleteThingsBoardIntegration(DeleteThingsBoardIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/thingsboard" - }; - } + // Delete ThingsBoard integration. + rpc DeleteThingsBoardIntegration(DeleteThingsBoardIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/thingsboard" + }; + } - // Create myDevices integration. - rpc CreateMyDevicesIntegration(CreateMyDevicesIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/mydevices" - body: "*" - }; - } + // Create myDevices integration. + rpc CreateMyDevicesIntegration(CreateMyDevicesIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "mydevices" + body : "*" + }; + } - // Get myDevices integration. - rpc GetMyDevicesIntegration(GetMyDevicesIntegrationRequest) returns (GetMyDevicesIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/mydevices" - }; - } + // Get myDevices integration. + rpc GetMyDevicesIntegration(GetMyDevicesIntegrationRequest) + returns (GetMyDevicesIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/mydevices" + }; + } - // Update myDevices integration. - rpc UpdateMyDevicesIntegration(UpdateMyDevicesIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/mydevices" - body: "*" - }; - } + // Update myDevices integration. + rpc UpdateMyDevicesIntegration(UpdateMyDevicesIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "mydevices" + body : "*" + }; + } - // Delete myDevices integration. - rpc DeleteMyDevicesIntegration(DeleteMyDevicesIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/mydevices" - }; - } + // Delete myDevices integration. + rpc DeleteMyDevicesIntegration(DeleteMyDevicesIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/mydevices" + }; + } - // Create LoRaCloud integration. - rpc CreateLoraCloudIntegration(CreateLoraCloudIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/loracloud" - body: "*" - }; - } + // Create LoRaCloud integration. + rpc CreateLoraCloudIntegration(CreateLoraCloudIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "loracloud" + body : "*" + }; + } - // Get LoRaCloud integration. - rpc GetLoraCloudIntegration(GetLoraCloudIntegrationRequest) returns (GetLoraCloudIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/loracloud" - }; - } + // Get LoRaCloud integration. + rpc GetLoraCloudIntegration(GetLoraCloudIntegrationRequest) + returns (GetLoraCloudIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/loracloud" + }; + } - // Update LoRaCloud integration. - rpc UpdateLoraCloudIntegration(UpdateLoraCloudIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/loracloud" - body: "*" - }; - } + // Update LoRaCloud integration. + rpc UpdateLoraCloudIntegration(UpdateLoraCloudIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "loracloud" + body : "*" + }; + } - // Delete LoRaCloud integration. - rpc DeleteLoraCloudIntegration(DeleteLoraCloudIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/loracloud" - }; - } + // Delete LoRaCloud integration. + rpc DeleteLoraCloudIntegration(DeleteLoraCloudIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/loracloud" + }; + } - // Create GCP Pub/Sub integration. - rpc CreateGcpPubSubIntegration(CreateGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/gcp-pub-sub" - body: "*" - }; - } + // Create GCP Pub/Sub integration. + rpc CreateGcpPubSubIntegration(CreateGcpPubSubIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "gcp-pub-sub" + body : "*" + }; + } - // Get GCP Pub/Sub integration. - rpc GetGcpPubSubIntegration(GetGcpPubSubIntegrationRequest) returns (GetGcpPubSubIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/gcp-pub-sub" - }; - } + // Get GCP Pub/Sub integration. + rpc GetGcpPubSubIntegration(GetGcpPubSubIntegrationRequest) + returns (GetGcpPubSubIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/gcp-pub-sub" + }; + } - // Update GCP Pub/Sub integration. - rpc UpdateGcpPubSubIntegration(UpdateGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/gcp-pub-sub" - body: "*" - }; - } + // Update GCP Pub/Sub integration. + rpc UpdateGcpPubSubIntegration(UpdateGcpPubSubIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "gcp-pub-sub" + body : "*" + }; + } - // Delete GCP Pub/Sub integration. - rpc DeleteGcpPubSubIntegration(DeleteGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/gcp-pub-sub" - }; - } + // Delete GCP Pub/Sub integration. + rpc DeleteGcpPubSubIntegration(DeleteGcpPubSubIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/gcp-pub-sub" + }; + } - // Create AWS SNS integration. - rpc CreateAwsSnsIntegration(CreateAwsSnsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/aws-sns" - body: "*" - }; - } + // Create AWS SNS integration. + rpc CreateAwsSnsIntegration(CreateAwsSnsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "aws-sns" + body : "*" + }; + } - // Get AWS SNS integration. - rpc GetAwsSnsIntegration(GetAwsSnsIntegrationRequest) returns (GetAwsSnsIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/aws-sns" - }; - } + // Get AWS SNS integration. + rpc GetAwsSnsIntegration(GetAwsSnsIntegrationRequest) + returns (GetAwsSnsIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/aws-sns" + }; + } - // Update AWS SNS integration. - rpc UpdateAwsSnsIntegration(UpdateAwsSnsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/aws-sns" - body: "*" - }; - } + // Update AWS SNS integration. + rpc UpdateAwsSnsIntegration(UpdateAwsSnsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "aws-sns" + body : "*" + }; + } - // Delete AWS SNS integration. - rpc DeleteAwsSnsIntegration(DeleteAwsSnsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/aws-sns" - }; - } + // Delete AWS SNS integration. + rpc DeleteAwsSnsIntegration(DeleteAwsSnsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/aws-sns" + }; + } - // Create Azure Service-Bus integration. - rpc CreateAzureServiceBusIntegration(CreateAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/azure-service-bus" - body: "*" - }; - } + // Create Azure Service-Bus integration. + rpc CreateAzureServiceBusIntegration(CreateAzureServiceBusIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "azure-service-bus" + body : "*" + }; + } - // Get Azure Service-Bus integration. - rpc GetAzureServiceBusIntegration(GetAzureServiceBusIntegrationRequest) returns (GetAzureServiceBusIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/azure-service-bus" - }; - } + // Get Azure Service-Bus integration. + rpc GetAzureServiceBusIntegration(GetAzureServiceBusIntegrationRequest) + returns (GetAzureServiceBusIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/azure-service-bus" + }; + } - // Update Azure Service-Bus integration. - rpc UpdateAzureServiceBusIntegration(UpdateAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/azure-service-bus" - body: "*" - }; - } + // Update Azure Service-Bus integration. + rpc UpdateAzureServiceBusIntegration(UpdateAzureServiceBusIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "azure-service-bus" + body : "*" + }; + } - // Delete Azure Service-Bus integration. - rpc DeleteAzureServiceBusIntegration(DeleteAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/azure-service-bus" - }; - } + // Delete Azure Service-Bus integration. + rpc DeleteAzureServiceBusIntegration(DeleteAzureServiceBusIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/" + "azure-service-bus" + }; + } - // Create Pilot Things integration. - rpc CreatePilotThingsIntegration(CreatePilotThingsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/pilot-things" - body: "*" - }; - } + // Create Pilot Things integration. + rpc CreatePilotThingsIntegration(CreatePilotThingsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "pilot-things" + body : "*" + }; + } - // Get Pilot Things integration. - rpc GetPilotThingsIntegration(GetPilotThingsIntegrationRequest) returns (GetPilotThingsIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/pilot-things" - }; - } + // Get Pilot Things integration. + rpc GetPilotThingsIntegration(GetPilotThingsIntegrationRequest) + returns (GetPilotThingsIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/pilot-things" + }; + } - // Update Pilot Things integration. - rpc UpdatePilotThingsIntegration(UpdatePilotThingsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/pilot-things" - body: "*" - }; - } + // Update Pilot Things integration. + rpc UpdatePilotThingsIntegration(UpdatePilotThingsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "pilot-things" + body : "*" + }; + } - // Delete Pilot Things integration. - rpc DeletePilotThingsIntegration(DeletePilotThingsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/pilot-things" - }; - } + // Delete Pilot Things integration. + rpc DeletePilotThingsIntegration(DeletePilotThingsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/pilot-things" + }; + } - // Create IFTTT integration. - rpc CreateIftttIntegration(CreateIftttIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/ifttt" - body: "*" - }; - } + // Create IFTTT integration. + rpc CreateIftttIntegration(CreateIftttIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/ifttt" + body : "*" + }; + } - // Get IFTTT integration. - rpc GetIftttIntegration(GetIftttIntegrationRequest) returns (GetIftttIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/ifttt" - }; - } + // Get IFTTT integration. + rpc GetIftttIntegration(GetIftttIntegrationRequest) + returns (GetIftttIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/ifttt" + }; + } - // Update IFTTT integration. - rpc UpdateIftttIntegration(UpdateIftttIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/ifttt" - body: "*" - }; - } + // Update IFTTT integration. + rpc UpdateIftttIntegration(UpdateIftttIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/ifttt" + body : "*" + }; + } - // Delete IFTTT integration. - rpc DeleteIftttIntegration(DeleteIftttIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/ifttt" - }; - } + // Delete IFTTT integration. + rpc DeleteIftttIntegration(DeleteIftttIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/ifttt" + }; + } - // Generates application ID specific client-certificate. - rpc GenerateMqttIntegrationClientCertificate(GenerateMqttIntegrationClientCertificateRequest) returns (GenerateMqttIntegrationClientCertificateResponse) { - option(google.api.http) = { - post: "/api/applications/{application_id}/integrations/mqtt/certificate" - }; - } + // Generates application ID specific client-certificate. + rpc GenerateMqttIntegrationClientCertificate( + GenerateMqttIntegrationClientCertificateRequest) + returns (GenerateMqttIntegrationClientCertificateResponse) { + option (google.api.http) = { + post : "/api/applications/{application_id}/integrations/mqtt/certificate" + }; + } } enum Encoding { - JSON = 0; - PROTOBUF = 1; + JSON = 0; + PROTOBUF = 1; } enum IntegrationKind { - HTTP = 0; - INFLUX_DB = 1; - THINGS_BOARD = 2; - MY_DEVICES = 3; - LORA_CLOUD = 4; - GCP_PUB_SUB = 5; - AWS_SNS = 6; - AZURE_SERVICE_BUS = 7; - PILOT_THINGS = 8; - MQTT_GLOBAL = 9; - IFTTT = 10; + HTTP = 0; + INFLUX_DB = 1; + THINGS_BOARD = 2; + MY_DEVICES = 3; + LORA_CLOUD = 4; + GCP_PUB_SUB = 5; + AWS_SNS = 6; + AZURE_SERVICE_BUS = 7; + PILOT_THINGS = 8; + MQTT_GLOBAL = 9; + IFTTT = 10; } message Application { - // Application ID (UUID). - // Note: on create this will be automatically generated. - string id = 1; + // Application ID (UUID). + // Note: on create this will be automatically generated. + string id = 1; - // Application name. - string name = 2; + // Application name. + string name = 2; - // Application description. - string description = 3; + // Application description. + string description = 3; - // Tenant ID (UUID). - string tenant_id = 4; + // Tenant ID (UUID). + string tenant_id = 4; } message ApplicationListItem { - // Application ID (UUID). - string id = 1; + // Application ID (UUID). + string id = 1; - // Created at timestamp. - google.protobuf.Timestamp created_at = 2; + // Created at timestamp. + google.protobuf.Timestamp created_at = 2; - // Last update timestamp. - google.protobuf.Timestamp updated_at = 3; + // Last update timestamp. + google.protobuf.Timestamp updated_at = 3; - // Application name. - string name = 4; - - // Application description. - string description = 5; + // Application name. + string name = 4; + + // Application description. + string description = 5; } message CreateApplicationRequest { - // Application object to create. - Application application = 1; + // Application object to create. + Application application = 1; } message CreateApplicationResponse { - // Application ID (UUID). - string id = 1; + // Application ID (UUID). + string id = 1; } message GetApplicationRequest { - // Application ID (UUID). - string id = 1; + // Application ID (UUID). + string id = 1; } message GetApplicationResponse { - // Application object. - Application application = 1; + // Application object. + Application application = 1; - // Created at timestamp. - google.protobuf.Timestamp created_at = 2; + // Created at timestamp. + google.protobuf.Timestamp created_at = 2; - // Last update timestamp. - google.protobuf.Timestamp updated_at = 3; + // Last update timestamp. + google.protobuf.Timestamp updated_at = 3; - // Measurement keys. - // This contains the measurement keys from all the device-profiles that - // are used by the devices under this application. - repeated string measurement_keys = 4; + // Measurement keys. + // This contains the measurement keys from all the device-profiles that + // are used by the devices under this application. + repeated string measurement_keys = 4; } message UpdateApplicationRequest { - // Application object. - Application application = 1; + // Application object. + Application application = 1; } message DeleteApplicationRequest { - // Application ID (UUID). - string id = 1; + // Application ID (UUID). + string id = 1; } message ListApplicationsRequest { - // Max number of applications to return in the result-set. - uint32 limit = 1; + // Max number of applications to return in the result-set. + uint32 limit = 1; - // Offset in the result-set (for pagination). - uint32 offset = 2; + // Offset in the result-set (for pagination). + uint32 offset = 2; - // If set, the given string will be used to search on name (optional). - string search = 3; + // If set, the given string will be used to search on name (optional). + string search = 3; - // Tenant ID to list the applications for. - string tenant_id = 4; + // Tenant ID to list the applications for. + string tenant_id = 4; } message ListApplicationsResponse { - // Total number of applications. - uint32 total_count = 1; + // Total number of applications. + uint32 total_count = 1; - // Result-set. - repeated ApplicationListItem result = 2; + // Result-set. + repeated ApplicationListItem result = 2; } message ListIntegrationsRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message IntegrationListItem { - // Integration kind. - IntegrationKind kind = 1; + // Integration kind. + IntegrationKind kind = 1; } message ListIntegrationsResponse { - // Total number of integrations available within the result-set. - uint32 total_count = 1; + // Total number of integrations available within the result-set. + uint32 total_count = 1; - // Integrations within result-set. - repeated IntegrationListItem result = 2; + // Integrations within result-set. + repeated IntegrationListItem result = 2; } message HttpIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // HTTP headers to set when making requests. - map headers = 2; + // HTTP headers to set when making requests. + map headers = 2; - // Payload encoding. - Encoding encoding = 3; + // Payload encoding. + Encoding encoding = 3; - // Event endpoint URL. - // The HTTP integration will POST all events to this enpoint. The request - // will contain a query parameters "event" containing the type of the - // event. - string event_endpoint_url = 4; + // Event endpoint URL. + // The HTTP integration will POST all events to this enpoint. The request + // will contain a query parameters "event" containing the type of the + // event. + string event_endpoint_url = 4; } message CreateHttpIntegrationRequest { - // Integration object to create. - HttpIntegration integration = 1; + // Integration object to create. + HttpIntegration integration = 1; } message GetHttpIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetHttpIntegrationResponse { - // Integration object. - HttpIntegration integration = 1; + // Integration object. + HttpIntegration integration = 1; } message UpdateHttpIntegrationRequest { - // Integration object to update. - HttpIntegration integration = 1; + // Integration object to update. + HttpIntegration integration = 1; } message DeleteHttpIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } enum InfluxDbPrecision { - NS = 0; - U = 1; - MS = 2; - S = 3; - M = 4; - H = 5; + NS = 0; + U = 1; + MS = 2; + S = 3; + M = 4; + H = 5; } enum InfluxDbVersion { - INFLUXDB_1 = 0; - INFLUXDB_2 = 1; + INFLUXDB_1 = 0; + INFLUXDB_2 = 1; } message InfluxDbIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // InfluxDb API write endpoint (e.g. http://localhost:8086/write). - string endpoint = 2; + // InfluxDb API write endpoint (e.g. http://localhost:8086/write). + string endpoint = 2; - // InfluxDb database name. (InfluxDb v1) - string db = 3; + // InfluxDb database name. (InfluxDb v1) + string db = 3; - // InfluxDb username. (InfluxDb v1) - string username = 4; + // InfluxDb username. (InfluxDb v1) + string username = 4; - // InfluxDb password. (InfluxDb v1) - string password = 5; + // InfluxDb password. (InfluxDb v1) + string password = 5; - // InfluxDb retention policy name. (InfluxDb v1) - string retention_policy_name = 6; + // InfluxDb retention policy name. (InfluxDb v1) + string retention_policy_name = 6; - // InfluxDb timestamp precision (InfluxDb v1). - InfluxDbPrecision precision = 7; + // InfluxDb timestamp precision (InfluxDb v1). + InfluxDbPrecision precision = 7; - // InfluxDb version. - InfluxDbVersion version = 8; + // InfluxDb version. + InfluxDbVersion version = 8; - // Token. (InfluxDb v2) - string token = 9; + // Token. (InfluxDb v2) + string token = 9; - // Organization. (InfluxDb v2) - string organization = 10; + // Organization. (InfluxDb v2) + string organization = 10; - // Bucket. (InfluxDb v2) - string bucket = 11; + // Bucket. (InfluxDb v2) + string bucket = 11; } message CreateInfluxDbIntegrationRequest { - // Integration object to create. - InfluxDbIntegration integration = 1; + // Integration object to create. + InfluxDbIntegration integration = 1; } message GetInfluxDbIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetInfluxDbIntegrationResponse { - // Integration object. - InfluxDbIntegration integration = 1; + // Integration object. + InfluxDbIntegration integration = 1; } message UpdateInfluxDbIntegrationRequest { - // Integration object to update. - InfluxDbIntegration integration = 1; + // Integration object to update. + InfluxDbIntegration integration = 1; } message DeleteInfluxDbIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message ThingsBoardIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // ThingsBoard server endpoint, e.g. https://example.com - string server = 2; + // ThingsBoard server endpoint, e.g. https://example.com + string server = 2; } message CreateThingsBoardIntegrationRequest { - // Integration object to create. - ThingsBoardIntegration integration = 1; + // Integration object to create. + ThingsBoardIntegration integration = 1; } message GetThingsBoardIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetThingsBoardIntegrationResponse { - // Integration object. - ThingsBoardIntegration integration = 1; + // Integration object. + ThingsBoardIntegration integration = 1; } message UpdateThingsBoardIntegrationRequest { - // Integration object to update. - ThingsBoardIntegration integration = 1; + // Integration object to update. + ThingsBoardIntegration integration = 1; } message DeleteThingsBoardIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message MyDevicesIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // myDevices API endpoint. - string endpoint = 2; + // myDevices API endpoint. + string endpoint = 2; } message CreateMyDevicesIntegrationRequest { - // Integration object to create. - MyDevicesIntegration integration = 1; + // Integration object to create. + MyDevicesIntegration integration = 1; } message GetMyDevicesIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetMyDevicesIntegrationResponse { - // Integration object. - MyDevicesIntegration integration = 1; + // Integration object. + MyDevicesIntegration integration = 1; } message UpdateMyDevicesIntegrationRequest { - // Integration object to update. - MyDevicesIntegration integration = 1; + // Integration object to update. + MyDevicesIntegration integration = 1; } message DeleteMyDevicesIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message LoraCloudIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Modem & Geolocation Services configuration. - LoraCloudModemGeolocationServices modem_geolocation_services = 2; + // Modem & Geolocation Services configuration. + LoraCloudModemGeolocationServices modem_geolocation_services = 2; } message LoraCloudModemGeolocationServices { - // API token. - string token = 1; + // API token. + string token = 1; - // Device implements Modem / Modem-E stack. - bool modem_enabled = 2; + // Device implements Modem / Modem-E stack. + bool modem_enabled = 2; - // Forward FPorts. - // Forward uplink messages matching the given FPorts to the MGS. - repeated uint32 forward_f_ports = 16; + // Forward FPorts. + // Forward uplink messages matching the given FPorts to the MGS. + repeated uint32 forward_f_ports = 16; - // Use rx time for GNSS resolving. - // In case this is set to true, the MGS resolver will use the RX time of the - // network instead of the timestamp included in the LR1110 payload. - bool gnss_use_rx_time = 5; + // Use rx time for GNSS resolving. + // In case this is set to true, the MGS resolver will use the RX time of the + // network instead of the timestamp included in the LR1110 payload. + bool gnss_use_rx_time = 5; - // Use gateway location for GNSS resolving. - // In the case this is set to true, ChirpStack will provide the location of - // one of the gateways to the MGS resolver to aid the resolving process. - // Disable this in case the gateway location is not accurate / incorrectly - // configured as an incorrect location will cause the resolver to return an - // error. - bool gnss_use_gateway_location = 17; + // Use gateway location for GNSS resolving. + // In the case this is set to true, ChirpStack will provide the location of + // one of the gateways to the MGS resolver to aid the resolving process. + // Disable this in case the gateway location is not accurate / incorrectly + // configured as an incorrect location will cause the resolver to return an + // error. + bool gnss_use_gateway_location = 17; - // Parse TLV records. - // If enabled, stream records (expected in TLV format) are scanned for GNSS - // data (0x06 or 0x07). If found, ChirpStack will make an additional - // geolocation call to the MGS API for resolving the location of the detected - // payload. - bool parse_tlv = 6; + // Parse TLV records. + // If enabled, stream records (expected in TLV format) are scanned for GNSS + // data (0x06 or 0x07). If found, ChirpStack will make an additional + // geolocation call to the MGS API for resolving the location of the detected + // payload. + bool parse_tlv = 6; - // Geolocation buffer TTL (in seconds). - // If > 0, uplink RX meta-data will be stored in a buffer so that - // the meta-data of multiple uplinks can be used for geolocation. - uint32 geolocation_buffer_ttl = 7; + // Geolocation buffer TTL (in seconds). + // If > 0, uplink RX meta-data will be stored in a buffer so that + // the meta-data of multiple uplinks can be used for geolocation. + uint32 geolocation_buffer_ttl = 7; - // Geolocation minimum buffer size. - // If > 0, geolocation will only be performed when the buffer has - // at least the given size. - uint32 geolocation_min_buffer_size = 8; + // Geolocation minimum buffer size. + // If > 0, geolocation will only be performed when the buffer has + // at least the given size. + uint32 geolocation_min_buffer_size = 8; - // TDOA based geolocation is enabled. - bool geolocation_tdoa = 9; + // TDOA based geolocation is enabled. + bool geolocation_tdoa = 9; - // RSSI based geolocation is enabled. - bool geolocation_rssi = 10; + // RSSI based geolocation is enabled. + bool geolocation_rssi = 10; - // GNSS based geolocation is enabled (LR1110). - bool geolocation_gnss = 11; + // GNSS based geolocation is enabled (LR1110). + bool geolocation_gnss = 11; - // GNSS payload field. - // This holds the name of the field in the decoded payload object which - // contains the GNSS payload bytes (as HEX string). - string geolocation_gnss_payload_field = 12; + // GNSS payload field. + // This holds the name of the field in the decoded payload object which + // contains the GNSS payload bytes (as HEX string). + string geolocation_gnss_payload_field = 12; - // GNSS use RX time. - // In case this is set to true, the resolver will use the RX time of the - // network instead of the timestamp included in the LR1110 payload. - bool geolocation_gnss_use_rx_time = 13; + // GNSS use RX time. + // In case this is set to true, the resolver will use the RX time of the + // network instead of the timestamp included in the LR1110 payload. + bool geolocation_gnss_use_rx_time = 13; - // Wifi based geolocation is enabled. - bool geolocation_wifi = 14; + // Wifi based geolocation is enabled. + bool geolocation_wifi = 14; - // Wifi payload field. - // This holds the name of the field in the decoded payload object which - // contains an array of objects with the following fields: - // * macAddress - e.g. 01:23:45:67:89:ab - // * signalStrength - e.g. -51 (optional) - string geolocation_wifi_payload_field = 15; + // Wifi payload field. + // This holds the name of the field in the decoded payload object which + // contains an array of objects with the following fields: + // * macAddress - e.g. 01:23:45:67:89:ab + // * signalStrength - e.g. -51 (optional) + string geolocation_wifi_payload_field = 15; } message CreateLoraCloudIntegrationRequest { - // Integration object to create. - LoraCloudIntegration integration = 1; + // Integration object to create. + LoraCloudIntegration integration = 1; } message GetLoraCloudIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetLoraCloudIntegrationResponse { - // Integration object. - LoraCloudIntegration integration = 1; + // Integration object. + LoraCloudIntegration integration = 1; } message UpdateLoraCloudIntegrationRequest { - // Integration object to update. - LoraCloudIntegration integration = 1; + // Integration object to update. + LoraCloudIntegration integration = 1; } message DeleteLoraCloudIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GcpPubSubIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Encoding. - Encoding encoding = 2; + // Encoding. + Encoding encoding = 2; - // Credentials file. - // This IAM service-account credentials file (JSON) must have the following Pub/Sub roles: - // * Pub/Sub Publisher - string credentials_file = 3; + // Credentials file. + // This IAM service-account credentials file (JSON) must have the following + // Pub/Sub roles: + // * Pub/Sub Publisher + string credentials_file = 3; - // Project ID. - string project_id = 4; + // Project ID. + string project_id = 4; - // Topic name. - // This is the name of the Pub/Sub topic. - string topic_name = 5; + // Topic name. + // This is the name of the Pub/Sub topic. + string topic_name = 5; } message CreateGcpPubSubIntegrationRequest { - // Integration object to create. - GcpPubSubIntegration integration = 1; + // Integration object to create. + GcpPubSubIntegration integration = 1; } message GetGcpPubSubIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetGcpPubSubIntegrationResponse { - // Integration object. - GcpPubSubIntegration integration = 1; + // Integration object. + GcpPubSubIntegration integration = 1; } message UpdateGcpPubSubIntegrationRequest { - // Integration object to update. - GcpPubSubIntegration integration = 1; + // Integration object to update. + GcpPubSubIntegration integration = 1; } message DeleteGcpPubSubIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message AwsSnsIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Encoding. - Encoding encoding = 2; + // Encoding. + Encoding encoding = 2; - // AWS region. - string region = 3; + // AWS region. + string region = 3; - // AWS Access Key ID. - string access_key_id = 4; + // AWS Access Key ID. + string access_key_id = 4; - // AWS Secret Access Key. - string secret_access_key = 5; + // AWS Secret Access Key. + string secret_access_key = 5; - // Topic ARN. - string topic_arn = 6; + // Topic ARN. + string topic_arn = 6; } message CreateAwsSnsIntegrationRequest { - // Integration object to create. - AwsSnsIntegration integration = 1; + // Integration object to create. + AwsSnsIntegration integration = 1; } message GetAwsSnsIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetAwsSnsIntegrationResponse { - // Integration object. - AwsSnsIntegration integration = 1; + // Integration object. + AwsSnsIntegration integration = 1; } message UpdateAwsSnsIntegrationRequest { - // Integration object to update. - AwsSnsIntegration integration = 1; + // Integration object to update. + AwsSnsIntegration integration = 1; } message DeleteAwsSnsIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message AzureServiceBusIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Encoding. - Encoding encoding = 2; + // Encoding. + Encoding encoding = 2; - // Connection string. - string connection_string = 3; + // Connection string. + string connection_string = 3; - // Publish name. - // This is the name of the topic or queue. - string publish_name = 4; + // Publish name. + // This is the name of the topic or queue. + string publish_name = 4; } message CreateAzureServiceBusIntegrationRequest { - // Integration object to create. - AzureServiceBusIntegration integration = 1; + // Integration object to create. + AzureServiceBusIntegration integration = 1; } message GetAzureServiceBusIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetAzureServiceBusIntegrationResponse { - // Integration object. - AzureServiceBusIntegration integration = 1; + // Integration object. + AzureServiceBusIntegration integration = 1; } message UpdateAzureServiceBusIntegrationRequest { - // Integration object to create. - AzureServiceBusIntegration integration = 1; + // Integration object to create. + AzureServiceBusIntegration integration = 1; } message DeleteAzureServiceBusIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message PilotThingsIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Server URL. - string server = 2; + // Server URL. + string server = 2; - // Authentication token. - string token = 3; + // Authentication token. + string token = 3; } message CreatePilotThingsIntegrationRequest { - // Integration object to create. - PilotThingsIntegration integration = 1; + // Integration object to create. + PilotThingsIntegration integration = 1; } message GetPilotThingsIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetPilotThingsIntegrationResponse { - // Integration object. - PilotThingsIntegration integration = 1; + // Integration object. + PilotThingsIntegration integration = 1; } message UpdatePilotThingsIntegrationRequest { - // Integration object to update. - PilotThingsIntegration integration = 1; + // Integration object to update. + PilotThingsIntegration integration = 1; } message DeletePilotThingsIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message IftttIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Key. - // This key can be obtained from the IFTTT Webhooks documentation page. - string key = 2; + // Key. + // This key can be obtained from the IFTTT Webhooks documentation page. + string key = 2; - // Values. - // Up to 2 values can be forwarded to IFTTT. These values must map to the - // decoded payload keys. For example: - // { - // "batteryLevel": 75.3, - // "buttons": [{"pressed": false}, {"pressed": true}] - // } - // You would specify the following fields: - // uplink_values = ["batteryLevel", "buttons_0_pressed"] - // - // Note: The first value is always used for the DevEUI. - repeated string uplink_values = 3; + // Values. + // Up to 2 values can be forwarded to IFTTT. These values must map to the + // decoded payload keys. For example: + // { + // "batteryLevel": 75.3, + // "buttons": [{"pressed": false}, {"pressed": true}] + // } + // You would specify the following fields: + // uplink_values = ["batteryLevel", "buttons_0_pressed"] + // + // Notes: The first value is always used for the DevEUI. + // Ignored if arbitrary_json is set to true. + repeated string uplink_values = 3; + + // Arbitrary JSON. + // If set to true, ChirpStack events will be sent as-is as arbitrary JSON + // payload. If set to false (default), the 3 JSON values format will be used. + bool arbitrary_json = 4; + + // Event prefix. + // If set, the event name will be PREFIX_EVENT. For example if event_prefix + // is set to weatherstation, and uplink event will be sent as + // weatherstation_up to the IFTTT webhook. + // Note: Only characters in the A-Z, a-z and 0-9 range are allowed. + string event_prefix = 5; } message CreateIftttIntegrationRequest { - // Integration object. - IftttIntegration integration = 1; + // Integration object. + IftttIntegration integration = 1; } message GetIftttIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetIftttIntegrationResponse { - // Integration object. - IftttIntegration integration = 1; + // Integration object. + IftttIntegration integration = 1; } message UpdateIftttIntegrationRequest { - // Integration object to update. - IftttIntegration integration = 1; + // Integration object to update. + IftttIntegration integration = 1; } message DeleteIftttIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GenerateMqttIntegrationClientCertificateRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GenerateMqttIntegrationClientCertificateResponse { - // TLS certificate. - string tls_cert = 1; + // TLS certificate. + string tls_cert = 1; - // TLS key. - string tls_key = 2; + // TLS key. + string tls_key = 2; - // CA certificate. - string ca_cert = 3; + // CA certificate. + string ca_cert = 3; - // Expires at defines the expiration date of the certificate. - google.protobuf.Timestamp expires_at = 4; + // Expires at defines the expiration date of the certificate. + google.protobuf.Timestamp expires_at = 4; } diff --git a/api/python/src/chirpstack_api/api/application_pb2.py b/api/python/src/chirpstack_api/api/application_pb2.py index bd40bf44..582b94af 100644 --- a/api/python/src/chirpstack_api/api/application_pb2.py +++ b/api/python/src/chirpstack_api/api/application_pb2.py @@ -16,7 +16,7 @@ from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$chirpstack-api/api/application.proto\x12\x03\x61pi\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\"O\n\x0b\x41pplication\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x11\n\ttenant_id\x18\x04 \x01(\t\"\xa4\x01\n\x13\x41pplicationListItem\x12\n\n\x02id\x18\x01 \x01(\t\x12.\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x05 \x01(\t\"A\n\x18\x43reateApplicationRequest\x12%\n\x0b\x61pplication\x18\x01 \x01(\x0b\x32\x10.api.Application\"\'\n\x19\x43reateApplicationResponse\x12\n\n\x02id\x18\x01 \x01(\t\"#\n\x15GetApplicationRequest\x12\n\n\x02id\x18\x01 \x01(\t\"\xb9\x01\n\x16GetApplicationResponse\x12%\n\x0b\x61pplication\x18\x01 \x01(\x0b\x32\x10.api.Application\x12.\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10measurement_keys\x18\x04 \x03(\t\"A\n\x18UpdateApplicationRequest\x12%\n\x0b\x61pplication\x18\x01 \x01(\x0b\x32\x10.api.Application\"&\n\x18\x44\x65leteApplicationRequest\x12\n\n\x02id\x18\x01 \x01(\t\"[\n\x17ListApplicationsRequest\x12\r\n\x05limit\x18\x01 \x01(\r\x12\x0e\n\x06offset\x18\x02 \x01(\r\x12\x0e\n\x06search\x18\x03 \x01(\t\x12\x11\n\ttenant_id\x18\x04 \x01(\t\"Y\n\x18ListApplicationsResponse\x12\x13\n\x0btotal_count\x18\x01 \x01(\r\x12(\n\x06result\x18\x02 \x03(\x0b\x32\x18.api.ApplicationListItem\"1\n\x17ListIntegrationsRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"9\n\x13IntegrationListItem\x12\"\n\x04kind\x18\x01 \x01(\x0e\x32\x14.api.IntegrationKind\"Y\n\x18ListIntegrationsResponse\x12\x13\n\x0btotal_count\x18\x01 \x01(\r\x12(\n\x06result\x18\x02 \x03(\x0b\x32\x18.api.IntegrationListItem\"\xca\x01\n\x0fHttpIntegration\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\x12\x32\n\x07headers\x18\x02 \x03(\x0b\x32!.api.HttpIntegration.HeadersEntry\x12\x1f\n\x08\x65ncoding\x18\x03 \x01(\x0e\x32\r.api.Encoding\x12\x1a\n\x12\x65vent_endpoint_url\x18\x04 \x01(\t\x1a.\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"I\n\x1c\x43reateHttpIntegrationRequest\x12)\n\x0bintegration\x18\x01 \x01(\x0b\x32\x14.api.HttpIntegration\"3\n\x19GetHttpIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"G\n\x1aGetHttpIntegrationResponse\x12)\n\x0bintegration\x18\x01 \x01(\x0b\x32\x14.api.HttpIntegration\"I\n\x1cUpdateHttpIntegrationRequest\x12)\n\x0bintegration\x18\x01 \x01(\x0b\x32\x14.api.HttpIntegration\"6\n\x1c\x44\x65leteHttpIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"\x95\x02\n\x13InfluxDbIntegration\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\n\n\x02\x64\x62\x18\x03 \x01(\t\x12\x10\n\x08username\x18\x04 \x01(\t\x12\x10\n\x08password\x18\x05 \x01(\t\x12\x1d\n\x15retention_policy_name\x18\x06 \x01(\t\x12)\n\tprecision\x18\x07 \x01(\x0e\x32\x16.api.InfluxDbPrecision\x12%\n\x07version\x18\x08 \x01(\x0e\x32\x14.api.InfluxDbVersion\x12\r\n\x05token\x18\t \x01(\t\x12\x14\n\x0corganization\x18\n \x01(\t\x12\x0e\n\x06\x62ucket\x18\x0b \x01(\t\"Q\n CreateInfluxDbIntegrationRequest\x12-\n\x0bintegration\x18\x01 \x01(\x0b\x32\x18.api.InfluxDbIntegration\"7\n\x1dGetInfluxDbIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"O\n\x1eGetInfluxDbIntegrationResponse\x12-\n\x0bintegration\x18\x01 \x01(\x0b\x32\x18.api.InfluxDbIntegration\"Q\n UpdateInfluxDbIntegrationRequest\x12-\n\x0bintegration\x18\x01 \x01(\x0b\x32\x18.api.InfluxDbIntegration\":\n DeleteInfluxDbIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"@\n\x16ThingsBoardIntegration\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\x12\x0e\n\x06server\x18\x02 \x01(\t\"W\n#CreateThingsBoardIntegrationRequest\x12\x30\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1b.api.ThingsBoardIntegration\":\n GetThingsBoardIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"U\n!GetThingsBoardIntegrationResponse\x12\x30\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1b.api.ThingsBoardIntegration\"W\n#UpdateThingsBoardIntegrationRequest\x12\x30\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1b.api.ThingsBoardIntegration\"=\n#DeleteThingsBoardIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"@\n\x14MyDevicesIntegration\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\"S\n!CreateMyDevicesIntegrationRequest\x12.\n\x0bintegration\x18\x01 \x01(\x0b\x32\x19.api.MyDevicesIntegration\"8\n\x1eGetMyDevicesIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"Q\n\x1fGetMyDevicesIntegrationResponse\x12.\n\x0bintegration\x18\x01 \x01(\x0b\x32\x19.api.MyDevicesIntegration\"S\n!UpdateMyDevicesIntegrationRequest\x12.\n\x0bintegration\x18\x01 \x01(\x0b\x32\x19.api.MyDevicesIntegration\";\n!DeleteMyDevicesIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"z\n\x14LoraCloudIntegration\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\x12J\n\x1amodem_geolocation_services\x18\x02 \x01(\x0b\x32&.api.LoraCloudModemGeolocationServices\"\xd5\x03\n!LoraCloudModemGeolocationServices\x12\r\n\x05token\x18\x01 \x01(\t\x12\x15\n\rmodem_enabled\x18\x02 \x01(\x08\x12\x17\n\x0f\x66orward_f_ports\x18\x10 \x03(\r\x12\x18\n\x10gnss_use_rx_time\x18\x05 \x01(\x08\x12!\n\x19gnss_use_gateway_location\x18\x11 \x01(\x08\x12\x11\n\tparse_tlv\x18\x06 \x01(\x08\x12\x1e\n\x16geolocation_buffer_ttl\x18\x07 \x01(\r\x12#\n\x1bgeolocation_min_buffer_size\x18\x08 \x01(\r\x12\x18\n\x10geolocation_tdoa\x18\t \x01(\x08\x12\x18\n\x10geolocation_rssi\x18\n \x01(\x08\x12\x18\n\x10geolocation_gnss\x18\x0b \x01(\x08\x12&\n\x1egeolocation_gnss_payload_field\x18\x0c \x01(\t\x12$\n\x1cgeolocation_gnss_use_rx_time\x18\r \x01(\x08\x12\x18\n\x10geolocation_wifi\x18\x0e \x01(\x08\x12&\n\x1egeolocation_wifi_payload_field\x18\x0f \x01(\t\"S\n!CreateLoraCloudIntegrationRequest\x12.\n\x0bintegration\x18\x01 \x01(\x0b\x32\x19.api.LoraCloudIntegration\"8\n\x1eGetLoraCloudIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"Q\n\x1fGetLoraCloudIntegrationResponse\x12.\n\x0bintegration\x18\x01 \x01(\x0b\x32\x19.api.LoraCloudIntegration\"S\n!UpdateLoraCloudIntegrationRequest\x12.\n\x0bintegration\x18\x01 \x01(\x0b\x32\x19.api.LoraCloudIntegration\";\n!DeleteLoraCloudIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"\x91\x01\n\x14GcpPubSubIntegration\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\x12\x1f\n\x08\x65ncoding\x18\x02 \x01(\x0e\x32\r.api.Encoding\x12\x18\n\x10\x63redentials_file\x18\x03 \x01(\t\x12\x12\n\nproject_id\x18\x04 \x01(\t\x12\x12\n\ntopic_name\x18\x05 \x01(\t\"S\n!CreateGcpPubSubIntegrationRequest\x12.\n\x0bintegration\x18\x01 \x01(\x0b\x32\x19.api.GcpPubSubIntegration\"8\n\x1eGetGcpPubSubIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"Q\n\x1fGetGcpPubSubIntegrationResponse\x12.\n\x0bintegration\x18\x01 \x01(\x0b\x32\x19.api.GcpPubSubIntegration\"S\n!UpdateGcpPubSubIntegrationRequest\x12.\n\x0bintegration\x18\x01 \x01(\x0b\x32\x19.api.GcpPubSubIntegration\";\n!DeleteGcpPubSubIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"\xa1\x01\n\x11\x41wsSnsIntegration\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\x12\x1f\n\x08\x65ncoding\x18\x02 \x01(\x0e\x32\r.api.Encoding\x12\x0e\n\x06region\x18\x03 \x01(\t\x12\x15\n\raccess_key_id\x18\x04 \x01(\t\x12\x19\n\x11secret_access_key\x18\x05 \x01(\t\x12\x11\n\ttopic_arn\x18\x06 \x01(\t\"M\n\x1e\x43reateAwsSnsIntegrationRequest\x12+\n\x0bintegration\x18\x01 \x01(\x0b\x32\x16.api.AwsSnsIntegration\"5\n\x1bGetAwsSnsIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"K\n\x1cGetAwsSnsIntegrationResponse\x12+\n\x0bintegration\x18\x01 \x01(\x0b\x32\x16.api.AwsSnsIntegration\"M\n\x1eUpdateAwsSnsIntegrationRequest\x12+\n\x0bintegration\x18\x01 \x01(\x0b\x32\x16.api.AwsSnsIntegration\"8\n\x1e\x44\x65leteAwsSnsIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"\x86\x01\n\x1a\x41zureServiceBusIntegration\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\x12\x1f\n\x08\x65ncoding\x18\x02 \x01(\x0e\x32\r.api.Encoding\x12\x19\n\x11\x63onnection_string\x18\x03 \x01(\t\x12\x14\n\x0cpublish_name\x18\x04 \x01(\t\"_\n\'CreateAzureServiceBusIntegrationRequest\x12\x34\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1f.api.AzureServiceBusIntegration\">\n$GetAzureServiceBusIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"]\n%GetAzureServiceBusIntegrationResponse\x12\x34\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1f.api.AzureServiceBusIntegration\"_\n\'UpdateAzureServiceBusIntegrationRequest\x12\x34\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1f.api.AzureServiceBusIntegration\"A\n\'DeleteAzureServiceBusIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"O\n\x16PilotThingsIntegration\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\x12\x0e\n\x06server\x18\x02 \x01(\t\x12\r\n\x05token\x18\x03 \x01(\t\"W\n#CreatePilotThingsIntegrationRequest\x12\x30\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1b.api.PilotThingsIntegration\":\n GetPilotThingsIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"U\n!GetPilotThingsIntegrationResponse\x12\x30\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1b.api.PilotThingsIntegration\"W\n#UpdatePilotThingsIntegrationRequest\x12\x30\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1b.api.PilotThingsIntegration\"=\n#DeletePilotThingsIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"N\n\x10IftttIntegration\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\x15\n\ruplink_values\x18\x03 \x03(\t\"K\n\x1d\x43reateIftttIntegrationRequest\x12*\n\x0bintegration\x18\x01 \x01(\x0b\x32\x15.api.IftttIntegration\"4\n\x1aGetIftttIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"I\n\x1bGetIftttIntegrationResponse\x12*\n\x0bintegration\x18\x01 \x01(\x0b\x32\x15.api.IftttIntegration\"K\n\x1dUpdateIftttIntegrationRequest\x12*\n\x0bintegration\x18\x01 \x01(\x0b\x32\x15.api.IftttIntegration\"7\n\x1d\x44\x65leteIftttIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"I\n/GenerateMqttIntegrationClientCertificateRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"\x96\x01\n0GenerateMqttIntegrationClientCertificateResponse\x12\x10\n\x08tls_cert\x18\x01 \x01(\t\x12\x0f\n\x07tls_key\x18\x02 \x01(\t\x12\x0f\n\x07\x63\x61_cert\x18\x03 \x01(\t\x12.\n\nexpires_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp*\"\n\x08\x45ncoding\x12\x08\n\x04JSON\x10\x00\x12\x0c\n\x08PROTOBUF\x10\x01*\xbf\x01\n\x0fIntegrationKind\x12\x08\n\x04HTTP\x10\x00\x12\r\n\tINFLUX_DB\x10\x01\x12\x10\n\x0cTHINGS_BOARD\x10\x02\x12\x0e\n\nMY_DEVICES\x10\x03\x12\x0e\n\nLORA_CLOUD\x10\x04\x12\x0f\n\x0bGCP_PUB_SUB\x10\x05\x12\x0b\n\x07\x41WS_SNS\x10\x06\x12\x15\n\x11\x41ZURE_SERVICE_BUS\x10\x07\x12\x10\n\x0cPILOT_THINGS\x10\x08\x12\x0f\n\x0bMQTT_GLOBAL\x10\t\x12\t\n\x05IFTTT\x10\n*?\n\x11InfluxDbPrecision\x12\x06\n\x02NS\x10\x00\x12\x05\n\x01U\x10\x01\x12\x06\n\x02MS\x10\x02\x12\x05\n\x01S\x10\x03\x12\x05\n\x01M\x10\x04\x12\x05\n\x01H\x10\x05*1\n\x0fInfluxDbVersion\x12\x0e\n\nINFLUXDB_1\x10\x00\x12\x0e\n\nINFLUXDB_2\x10\x01\x32\xb8<\n\x12\x41pplicationService\x12\x65\n\x06\x43reate\x12\x1d.api.CreateApplicationRequest\x1a\x1e.api.CreateApplicationResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/api/applications:\x01*\x12^\n\x03Get\x12\x1a.api.GetApplicationRequest\x1a\x1b.api.GetApplicationResponse\"\x1e\x82\xd3\xe4\x93\x02\x18\x12\x16/api/applications/{id}\x12n\n\x06Update\x12\x1d.api.UpdateApplicationRequest\x1a\x16.google.protobuf.Empty\"-\x82\xd3\xe4\x93\x02\'\x1a\"/api/applications/{application.id}:\x01*\x12_\n\x06\x44\x65lete\x12\x1d.api.DeleteApplicationRequest\x1a\x16.google.protobuf.Empty\"\x1e\x82\xd3\xe4\x93\x02\x18*\x16/api/applications/{id}\x12^\n\x04List\x12\x1c.api.ListApplicationsRequest\x1a\x1d.api.ListApplicationsResponse\"\x19\x82\xd3\xe4\x93\x02\x13\x12\x11/api/applications\x12\x88\x01\n\x10ListIntegrations\x12\x1c.api.ListIntegrationsRequest\x1a\x1d.api.ListIntegrationsResponse\"7\x82\xd3\xe4\x93\x02\x31\x12//api/applications/{application_id}/integrations\x12\x9f\x01\n\x15\x43reateHttpIntegration\x12!.api.CreateHttpIntegrationRequest\x1a\x16.google.protobuf.Empty\"K\x82\xd3\xe4\x93\x02\x45\"@/api/applications/{integration.application_id}/integrations/http:\x01*\x12\x93\x01\n\x12GetHttpIntegration\x12\x1e.api.GetHttpIntegrationRequest\x1a\x1f.api.GetHttpIntegrationResponse\"<\x82\xd3\xe4\x93\x02\x36\x12\x34/api/applications/{application_id}/integrations/http\x12\x9f\x01\n\x15UpdateHttpIntegration\x12!.api.UpdateHttpIntegrationRequest\x1a\x16.google.protobuf.Empty\"K\x82\xd3\xe4\x93\x02\x45\x1a@/api/applications/{integration.application_id}/integrations/http:\x01*\x12\x90\x01\n\x15\x44\x65leteHttpIntegration\x12!.api.DeleteHttpIntegrationRequest\x1a\x16.google.protobuf.Empty\"<\x82\xd3\xe4\x93\x02\x36*4/api/applications/{application_id}/integrations/http\x12\xab\x01\n\x19\x43reateInfluxDbIntegration\x12%.api.CreateInfluxDbIntegrationRequest\x1a\x16.google.protobuf.Empty\"O\x82\xd3\xe4\x93\x02I\"D/api/applications/{integration.application_id}/integrations/influxdb:\x01*\x12\xa3\x01\n\x16GetInfluxDbIntegration\x12\".api.GetInfluxDbIntegrationRequest\x1a#.api.GetInfluxDbIntegrationResponse\"@\x82\xd3\xe4\x93\x02:\x12\x38/api/applications/{application_id}/integrations/influxdb\x12\xab\x01\n\x19UpdateInfluxDbIntegration\x12%.api.UpdateInfluxDbIntegrationRequest\x1a\x16.google.protobuf.Empty\"O\x82\xd3\xe4\x93\x02I\x1a\x44/api/applications/{integration.application_id}/integrations/influxdb:\x01*\x12\x9c\x01\n\x19\x44\x65leteInfluxDbIntegration\x12%.api.DeleteInfluxDbIntegrationRequest\x1a\x16.google.protobuf.Empty\"@\x82\xd3\xe4\x93\x02:*8/api/applications/{application_id}/integrations/influxdb\x12\xb4\x01\n\x1c\x43reateThingsBoardIntegration\x12(.api.CreateThingsBoardIntegrationRequest\x1a\x16.google.protobuf.Empty\"R\x82\xd3\xe4\x93\x02L\"G/api/applications/{integration.application_id}/integrations/thingsboard:\x01*\x12\xaf\x01\n\x19GetThingsBoardIntegration\x12%.api.GetThingsBoardIntegrationRequest\x1a&.api.GetThingsBoardIntegrationResponse\"C\x82\xd3\xe4\x93\x02=\x12;/api/applications/{application_id}/integrations/thingsboard\x12\xb4\x01\n\x1cUpdateThingsBoardIntegration\x12(.api.UpdateThingsBoardIntegrationRequest\x1a\x16.google.protobuf.Empty\"R\x82\xd3\xe4\x93\x02L\x1aG/api/applications/{integration.application_id}/integrations/thingsboard:\x01*\x12\xa5\x01\n\x1c\x44\x65leteThingsBoardIntegration\x12(.api.DeleteThingsBoardIntegrationRequest\x1a\x16.google.protobuf.Empty\"C\x82\xd3\xe4\x93\x02=*;/api/applications/{application_id}/integrations/thingsboard\x12\xae\x01\n\x1a\x43reateMyDevicesIntegration\x12&.api.CreateMyDevicesIntegrationRequest\x1a\x16.google.protobuf.Empty\"P\x82\xd3\xe4\x93\x02J\"E/api/applications/{integration.application_id}/integrations/mydevices:\x01*\x12\xa7\x01\n\x17GetMyDevicesIntegration\x12#.api.GetMyDevicesIntegrationRequest\x1a$.api.GetMyDevicesIntegrationResponse\"A\x82\xd3\xe4\x93\x02;\x12\x39/api/applications/{application_id}/integrations/mydevices\x12\xae\x01\n\x1aUpdateMyDevicesIntegration\x12&.api.UpdateMyDevicesIntegrationRequest\x1a\x16.google.protobuf.Empty\"P\x82\xd3\xe4\x93\x02J\x1a\x45/api/applications/{integration.application_id}/integrations/mydevices:\x01*\x12\x9f\x01\n\x1a\x44\x65leteMyDevicesIntegration\x12&.api.DeleteMyDevicesIntegrationRequest\x1a\x16.google.protobuf.Empty\"A\x82\xd3\xe4\x93\x02;*9/api/applications/{application_id}/integrations/mydevices\x12\xae\x01\n\x1a\x43reateLoraCloudIntegration\x12&.api.CreateLoraCloudIntegrationRequest\x1a\x16.google.protobuf.Empty\"P\x82\xd3\xe4\x93\x02J\"E/api/applications/{integration.application_id}/integrations/loracloud:\x01*\x12\xa7\x01\n\x17GetLoraCloudIntegration\x12#.api.GetLoraCloudIntegrationRequest\x1a$.api.GetLoraCloudIntegrationResponse\"A\x82\xd3\xe4\x93\x02;\x12\x39/api/applications/{application_id}/integrations/loracloud\x12\xae\x01\n\x1aUpdateLoraCloudIntegration\x12&.api.UpdateLoraCloudIntegrationRequest\x1a\x16.google.protobuf.Empty\"P\x82\xd3\xe4\x93\x02J\x1a\x45/api/applications/{integration.application_id}/integrations/loracloud:\x01*\x12\x9f\x01\n\x1a\x44\x65leteLoraCloudIntegration\x12&.api.DeleteLoraCloudIntegrationRequest\x1a\x16.google.protobuf.Empty\"A\x82\xd3\xe4\x93\x02;*9/api/applications/{application_id}/integrations/loracloud\x12\xb0\x01\n\x1a\x43reateGcpPubSubIntegration\x12&.api.CreateGcpPubSubIntegrationRequest\x1a\x16.google.protobuf.Empty\"R\x82\xd3\xe4\x93\x02L\"G/api/applications/{integration.application_id}/integrations/gcp-pub-sub:\x01*\x12\xa9\x01\n\x17GetGcpPubSubIntegration\x12#.api.GetGcpPubSubIntegrationRequest\x1a$.api.GetGcpPubSubIntegrationResponse\"C\x82\xd3\xe4\x93\x02=\x12;/api/applications/{application_id}/integrations/gcp-pub-sub\x12\xb0\x01\n\x1aUpdateGcpPubSubIntegration\x12&.api.UpdateGcpPubSubIntegrationRequest\x1a\x16.google.protobuf.Empty\"R\x82\xd3\xe4\x93\x02L\x1aG/api/applications/{integration.application_id}/integrations/gcp-pub-sub:\x01*\x12\xa1\x01\n\x1a\x44\x65leteGcpPubSubIntegration\x12&.api.DeleteGcpPubSubIntegrationRequest\x1a\x16.google.protobuf.Empty\"C\x82\xd3\xe4\x93\x02=*;/api/applications/{application_id}/integrations/gcp-pub-sub\x12\xa6\x01\n\x17\x43reateAwsSnsIntegration\x12#.api.CreateAwsSnsIntegrationRequest\x1a\x16.google.protobuf.Empty\"N\x82\xd3\xe4\x93\x02H\"C/api/applications/{integration.application_id}/integrations/aws-sns:\x01*\x12\x9c\x01\n\x14GetAwsSnsIntegration\x12 .api.GetAwsSnsIntegrationRequest\x1a!.api.GetAwsSnsIntegrationResponse\"?\x82\xd3\xe4\x93\x02\x39\x12\x37/api/applications/{application_id}/integrations/aws-sns\x12\xa6\x01\n\x17UpdateAwsSnsIntegration\x12#.api.UpdateAwsSnsIntegrationRequest\x1a\x16.google.protobuf.Empty\"N\x82\xd3\xe4\x93\x02H\x1a\x43/api/applications/{integration.application_id}/integrations/aws-sns:\x01*\x12\x97\x01\n\x17\x44\x65leteAwsSnsIntegration\x12#.api.DeleteAwsSnsIntegrationRequest\x1a\x16.google.protobuf.Empty\"?\x82\xd3\xe4\x93\x02\x39*7/api/applications/{application_id}/integrations/aws-sns\x12\xc2\x01\n CreateAzureServiceBusIntegration\x12,.api.CreateAzureServiceBusIntegrationRequest\x1a\x16.google.protobuf.Empty\"X\x82\xd3\xe4\x93\x02R\"M/api/applications/{integration.application_id}/integrations/azure-service-bus:\x01*\x12\xc1\x01\n\x1dGetAzureServiceBusIntegration\x12).api.GetAzureServiceBusIntegrationRequest\x1a*.api.GetAzureServiceBusIntegrationResponse\"I\x82\xd3\xe4\x93\x02\x43\x12\x41/api/applications/{application_id}/integrations/azure-service-bus\x12\xc2\x01\n UpdateAzureServiceBusIntegration\x12,.api.UpdateAzureServiceBusIntegrationRequest\x1a\x16.google.protobuf.Empty\"X\x82\xd3\xe4\x93\x02R\x1aM/api/applications/{integration.application_id}/integrations/azure-service-bus:\x01*\x12\xb3\x01\n DeleteAzureServiceBusIntegration\x12,.api.DeleteAzureServiceBusIntegrationRequest\x1a\x16.google.protobuf.Empty\"I\x82\xd3\xe4\x93\x02\x43*A/api/applications/{application_id}/integrations/azure-service-bus\x12\xb5\x01\n\x1c\x43reatePilotThingsIntegration\x12(.api.CreatePilotThingsIntegrationRequest\x1a\x16.google.protobuf.Empty\"S\x82\xd3\xe4\x93\x02M\"H/api/applications/{integration.application_id}/integrations/pilot-things:\x01*\x12\xb0\x01\n\x19GetPilotThingsIntegration\x12%.api.GetPilotThingsIntegrationRequest\x1a&.api.GetPilotThingsIntegrationResponse\"D\x82\xd3\xe4\x93\x02>\x12*\n$GetAzureServiceBusIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"]\n%GetAzureServiceBusIntegrationResponse\x12\x34\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1f.api.AzureServiceBusIntegration\"_\n\'UpdateAzureServiceBusIntegrationRequest\x12\x34\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1f.api.AzureServiceBusIntegration\"A\n\'DeleteAzureServiceBusIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"O\n\x16PilotThingsIntegration\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\x12\x0e\n\x06server\x18\x02 \x01(\t\x12\r\n\x05token\x18\x03 \x01(\t\"W\n#CreatePilotThingsIntegrationRequest\x12\x30\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1b.api.PilotThingsIntegration\":\n GetPilotThingsIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"U\n!GetPilotThingsIntegrationResponse\x12\x30\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1b.api.PilotThingsIntegration\"W\n#UpdatePilotThingsIntegrationRequest\x12\x30\n\x0bintegration\x18\x01 \x01(\x0b\x32\x1b.api.PilotThingsIntegration\"=\n#DeletePilotThingsIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"|\n\x10IftttIntegration\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\x15\n\ruplink_values\x18\x03 \x03(\t\x12\x16\n\x0e\x61rbitrary_json\x18\x04 \x01(\x08\x12\x14\n\x0c\x65vent_prefix\x18\x05 \x01(\t\"K\n\x1d\x43reateIftttIntegrationRequest\x12*\n\x0bintegration\x18\x01 \x01(\x0b\x32\x15.api.IftttIntegration\"4\n\x1aGetIftttIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"I\n\x1bGetIftttIntegrationResponse\x12*\n\x0bintegration\x18\x01 \x01(\x0b\x32\x15.api.IftttIntegration\"K\n\x1dUpdateIftttIntegrationRequest\x12*\n\x0bintegration\x18\x01 \x01(\x0b\x32\x15.api.IftttIntegration\"7\n\x1d\x44\x65leteIftttIntegrationRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"I\n/GenerateMqttIntegrationClientCertificateRequest\x12\x16\n\x0e\x61pplication_id\x18\x01 \x01(\t\"\x96\x01\n0GenerateMqttIntegrationClientCertificateResponse\x12\x10\n\x08tls_cert\x18\x01 \x01(\t\x12\x0f\n\x07tls_key\x18\x02 \x01(\t\x12\x0f\n\x07\x63\x61_cert\x18\x03 \x01(\t\x12.\n\nexpires_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp*\"\n\x08\x45ncoding\x12\x08\n\x04JSON\x10\x00\x12\x0c\n\x08PROTOBUF\x10\x01*\xbf\x01\n\x0fIntegrationKind\x12\x08\n\x04HTTP\x10\x00\x12\r\n\tINFLUX_DB\x10\x01\x12\x10\n\x0cTHINGS_BOARD\x10\x02\x12\x0e\n\nMY_DEVICES\x10\x03\x12\x0e\n\nLORA_CLOUD\x10\x04\x12\x0f\n\x0bGCP_PUB_SUB\x10\x05\x12\x0b\n\x07\x41WS_SNS\x10\x06\x12\x15\n\x11\x41ZURE_SERVICE_BUS\x10\x07\x12\x10\n\x0cPILOT_THINGS\x10\x08\x12\x0f\n\x0bMQTT_GLOBAL\x10\t\x12\t\n\x05IFTTT\x10\n*?\n\x11InfluxDbPrecision\x12\x06\n\x02NS\x10\x00\x12\x05\n\x01U\x10\x01\x12\x06\n\x02MS\x10\x02\x12\x05\n\x01S\x10\x03\x12\x05\n\x01M\x10\x04\x12\x05\n\x01H\x10\x05*1\n\x0fInfluxDbVersion\x12\x0e\n\nINFLUXDB_1\x10\x00\x12\x0e\n\nINFLUXDB_2\x10\x01\x32\xb8<\n\x12\x41pplicationService\x12\x65\n\x06\x43reate\x12\x1d.api.CreateApplicationRequest\x1a\x1e.api.CreateApplicationResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/api/applications:\x01*\x12^\n\x03Get\x12\x1a.api.GetApplicationRequest\x1a\x1b.api.GetApplicationResponse\"\x1e\x82\xd3\xe4\x93\x02\x18\x12\x16/api/applications/{id}\x12n\n\x06Update\x12\x1d.api.UpdateApplicationRequest\x1a\x16.google.protobuf.Empty\"-\x82\xd3\xe4\x93\x02\'\x1a\"/api/applications/{application.id}:\x01*\x12_\n\x06\x44\x65lete\x12\x1d.api.DeleteApplicationRequest\x1a\x16.google.protobuf.Empty\"\x1e\x82\xd3\xe4\x93\x02\x18*\x16/api/applications/{id}\x12^\n\x04List\x12\x1c.api.ListApplicationsRequest\x1a\x1d.api.ListApplicationsResponse\"\x19\x82\xd3\xe4\x93\x02\x13\x12\x11/api/applications\x12\x88\x01\n\x10ListIntegrations\x12\x1c.api.ListIntegrationsRequest\x1a\x1d.api.ListIntegrationsResponse\"7\x82\xd3\xe4\x93\x02\x31\x12//api/applications/{application_id}/integrations\x12\x9f\x01\n\x15\x43reateHttpIntegration\x12!.api.CreateHttpIntegrationRequest\x1a\x16.google.protobuf.Empty\"K\x82\xd3\xe4\x93\x02\x45\"@/api/applications/{integration.application_id}/integrations/http:\x01*\x12\x93\x01\n\x12GetHttpIntegration\x12\x1e.api.GetHttpIntegrationRequest\x1a\x1f.api.GetHttpIntegrationResponse\"<\x82\xd3\xe4\x93\x02\x36\x12\x34/api/applications/{application_id}/integrations/http\x12\x9f\x01\n\x15UpdateHttpIntegration\x12!.api.UpdateHttpIntegrationRequest\x1a\x16.google.protobuf.Empty\"K\x82\xd3\xe4\x93\x02\x45\x1a@/api/applications/{integration.application_id}/integrations/http:\x01*\x12\x90\x01\n\x15\x44\x65leteHttpIntegration\x12!.api.DeleteHttpIntegrationRequest\x1a\x16.google.protobuf.Empty\"<\x82\xd3\xe4\x93\x02\x36*4/api/applications/{application_id}/integrations/http\x12\xab\x01\n\x19\x43reateInfluxDbIntegration\x12%.api.CreateInfluxDbIntegrationRequest\x1a\x16.google.protobuf.Empty\"O\x82\xd3\xe4\x93\x02I\"D/api/applications/{integration.application_id}/integrations/influxdb:\x01*\x12\xa3\x01\n\x16GetInfluxDbIntegration\x12\".api.GetInfluxDbIntegrationRequest\x1a#.api.GetInfluxDbIntegrationResponse\"@\x82\xd3\xe4\x93\x02:\x12\x38/api/applications/{application_id}/integrations/influxdb\x12\xab\x01\n\x19UpdateInfluxDbIntegration\x12%.api.UpdateInfluxDbIntegrationRequest\x1a\x16.google.protobuf.Empty\"O\x82\xd3\xe4\x93\x02I\x1a\x44/api/applications/{integration.application_id}/integrations/influxdb:\x01*\x12\x9c\x01\n\x19\x44\x65leteInfluxDbIntegration\x12%.api.DeleteInfluxDbIntegrationRequest\x1a\x16.google.protobuf.Empty\"@\x82\xd3\xe4\x93\x02:*8/api/applications/{application_id}/integrations/influxdb\x12\xb4\x01\n\x1c\x43reateThingsBoardIntegration\x12(.api.CreateThingsBoardIntegrationRequest\x1a\x16.google.protobuf.Empty\"R\x82\xd3\xe4\x93\x02L\"G/api/applications/{integration.application_id}/integrations/thingsboard:\x01*\x12\xaf\x01\n\x19GetThingsBoardIntegration\x12%.api.GetThingsBoardIntegrationRequest\x1a&.api.GetThingsBoardIntegrationResponse\"C\x82\xd3\xe4\x93\x02=\x12;/api/applications/{application_id}/integrations/thingsboard\x12\xb4\x01\n\x1cUpdateThingsBoardIntegration\x12(.api.UpdateThingsBoardIntegrationRequest\x1a\x16.google.protobuf.Empty\"R\x82\xd3\xe4\x93\x02L\x1aG/api/applications/{integration.application_id}/integrations/thingsboard:\x01*\x12\xa5\x01\n\x1c\x44\x65leteThingsBoardIntegration\x12(.api.DeleteThingsBoardIntegrationRequest\x1a\x16.google.protobuf.Empty\"C\x82\xd3\xe4\x93\x02=*;/api/applications/{application_id}/integrations/thingsboard\x12\xae\x01\n\x1a\x43reateMyDevicesIntegration\x12&.api.CreateMyDevicesIntegrationRequest\x1a\x16.google.protobuf.Empty\"P\x82\xd3\xe4\x93\x02J\"E/api/applications/{integration.application_id}/integrations/mydevices:\x01*\x12\xa7\x01\n\x17GetMyDevicesIntegration\x12#.api.GetMyDevicesIntegrationRequest\x1a$.api.GetMyDevicesIntegrationResponse\"A\x82\xd3\xe4\x93\x02;\x12\x39/api/applications/{application_id}/integrations/mydevices\x12\xae\x01\n\x1aUpdateMyDevicesIntegration\x12&.api.UpdateMyDevicesIntegrationRequest\x1a\x16.google.protobuf.Empty\"P\x82\xd3\xe4\x93\x02J\x1a\x45/api/applications/{integration.application_id}/integrations/mydevices:\x01*\x12\x9f\x01\n\x1a\x44\x65leteMyDevicesIntegration\x12&.api.DeleteMyDevicesIntegrationRequest\x1a\x16.google.protobuf.Empty\"A\x82\xd3\xe4\x93\x02;*9/api/applications/{application_id}/integrations/mydevices\x12\xae\x01\n\x1a\x43reateLoraCloudIntegration\x12&.api.CreateLoraCloudIntegrationRequest\x1a\x16.google.protobuf.Empty\"P\x82\xd3\xe4\x93\x02J\"E/api/applications/{integration.application_id}/integrations/loracloud:\x01*\x12\xa7\x01\n\x17GetLoraCloudIntegration\x12#.api.GetLoraCloudIntegrationRequest\x1a$.api.GetLoraCloudIntegrationResponse\"A\x82\xd3\xe4\x93\x02;\x12\x39/api/applications/{application_id}/integrations/loracloud\x12\xae\x01\n\x1aUpdateLoraCloudIntegration\x12&.api.UpdateLoraCloudIntegrationRequest\x1a\x16.google.protobuf.Empty\"P\x82\xd3\xe4\x93\x02J\x1a\x45/api/applications/{integration.application_id}/integrations/loracloud:\x01*\x12\x9f\x01\n\x1a\x44\x65leteLoraCloudIntegration\x12&.api.DeleteLoraCloudIntegrationRequest\x1a\x16.google.protobuf.Empty\"A\x82\xd3\xe4\x93\x02;*9/api/applications/{application_id}/integrations/loracloud\x12\xb0\x01\n\x1a\x43reateGcpPubSubIntegration\x12&.api.CreateGcpPubSubIntegrationRequest\x1a\x16.google.protobuf.Empty\"R\x82\xd3\xe4\x93\x02L\"G/api/applications/{integration.application_id}/integrations/gcp-pub-sub:\x01*\x12\xa9\x01\n\x17GetGcpPubSubIntegration\x12#.api.GetGcpPubSubIntegrationRequest\x1a$.api.GetGcpPubSubIntegrationResponse\"C\x82\xd3\xe4\x93\x02=\x12;/api/applications/{application_id}/integrations/gcp-pub-sub\x12\xb0\x01\n\x1aUpdateGcpPubSubIntegration\x12&.api.UpdateGcpPubSubIntegrationRequest\x1a\x16.google.protobuf.Empty\"R\x82\xd3\xe4\x93\x02L\x1aG/api/applications/{integration.application_id}/integrations/gcp-pub-sub:\x01*\x12\xa1\x01\n\x1a\x44\x65leteGcpPubSubIntegration\x12&.api.DeleteGcpPubSubIntegrationRequest\x1a\x16.google.protobuf.Empty\"C\x82\xd3\xe4\x93\x02=*;/api/applications/{application_id}/integrations/gcp-pub-sub\x12\xa6\x01\n\x17\x43reateAwsSnsIntegration\x12#.api.CreateAwsSnsIntegrationRequest\x1a\x16.google.protobuf.Empty\"N\x82\xd3\xe4\x93\x02H\"C/api/applications/{integration.application_id}/integrations/aws-sns:\x01*\x12\x9c\x01\n\x14GetAwsSnsIntegration\x12 .api.GetAwsSnsIntegrationRequest\x1a!.api.GetAwsSnsIntegrationResponse\"?\x82\xd3\xe4\x93\x02\x39\x12\x37/api/applications/{application_id}/integrations/aws-sns\x12\xa6\x01\n\x17UpdateAwsSnsIntegration\x12#.api.UpdateAwsSnsIntegrationRequest\x1a\x16.google.protobuf.Empty\"N\x82\xd3\xe4\x93\x02H\x1a\x43/api/applications/{integration.application_id}/integrations/aws-sns:\x01*\x12\x97\x01\n\x17\x44\x65leteAwsSnsIntegration\x12#.api.DeleteAwsSnsIntegrationRequest\x1a\x16.google.protobuf.Empty\"?\x82\xd3\xe4\x93\x02\x39*7/api/applications/{application_id}/integrations/aws-sns\x12\xc2\x01\n CreateAzureServiceBusIntegration\x12,.api.CreateAzureServiceBusIntegrationRequest\x1a\x16.google.protobuf.Empty\"X\x82\xd3\xe4\x93\x02R\"M/api/applications/{integration.application_id}/integrations/azure-service-bus:\x01*\x12\xc1\x01\n\x1dGetAzureServiceBusIntegration\x12).api.GetAzureServiceBusIntegrationRequest\x1a*.api.GetAzureServiceBusIntegrationResponse\"I\x82\xd3\xe4\x93\x02\x43\x12\x41/api/applications/{application_id}/integrations/azure-service-bus\x12\xc2\x01\n UpdateAzureServiceBusIntegration\x12,.api.UpdateAzureServiceBusIntegrationRequest\x1a\x16.google.protobuf.Empty\"X\x82\xd3\xe4\x93\x02R\x1aM/api/applications/{integration.application_id}/integrations/azure-service-bus:\x01*\x12\xb3\x01\n DeleteAzureServiceBusIntegration\x12,.api.DeleteAzureServiceBusIntegrationRequest\x1a\x16.google.protobuf.Empty\"I\x82\xd3\xe4\x93\x02\x43*A/api/applications/{application_id}/integrations/azure-service-bus\x12\xb5\x01\n\x1c\x43reatePilotThingsIntegration\x12(.api.CreatePilotThingsIntegrationRequest\x1a\x16.google.protobuf.Empty\"S\x82\xd3\xe4\x93\x02M\"H/api/applications/{integration.application_id}/integrations/pilot-things:\x01*\x12\xb0\x01\n\x19GetPilotThingsIntegration\x12%.api.GetPilotThingsIntegrationRequest\x1a&.api.GetPilotThingsIntegrationResponse\"D\x82\xd3\xe4\x93\x02>\x12* None: ... class IftttIntegration(_message.Message): - __slots__ = ["application_id", "key", "uplink_values"] + __slots__ = ["application_id", "arbitrary_json", "event_prefix", "key", "uplink_values"] APPLICATION_ID_FIELD_NUMBER: _ClassVar[int] + ARBITRARY_JSON_FIELD_NUMBER: _ClassVar[int] + EVENT_PREFIX_FIELD_NUMBER: _ClassVar[int] KEY_FIELD_NUMBER: _ClassVar[int] UPLINK_VALUES_FIELD_NUMBER: _ClassVar[int] application_id: str + arbitrary_json: bool + event_prefix: str key: str uplink_values: _containers.RepeatedScalarFieldContainer[str] - def __init__(self, application_id: _Optional[str] = ..., key: _Optional[str] = ..., uplink_values: _Optional[_Iterable[str]] = ...) -> None: ... + def __init__(self, application_id: _Optional[str] = ..., key: _Optional[str] = ..., uplink_values: _Optional[_Iterable[str]] = ..., arbitrary_json: bool = ..., event_prefix: _Optional[str] = ...) -> None: ... class InfluxDbIntegration(_message.Message): __slots__ = ["application_id", "bucket", "db", "endpoint", "organization", "password", "precision", "retention_policy_name", "token", "username", "version"] diff --git a/api/python/src/chirpstack_api/api/application_pb2_grpc.py b/api/python/src/chirpstack_api/api/application_pb2_grpc.py index c12f40e5..1ebaa20a 100644 --- a/api/python/src/chirpstack_api/api/application_pb2_grpc.py +++ b/api/python/src/chirpstack_api/api/application_pb2_grpc.py @@ -7,7 +7,8 @@ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 class ApplicationServiceStub(object): - """ApplicationService is the service providing API methods for managing applications. + """ApplicationService is the service providing API methods for managing + applications. """ def __init__(self, channel): @@ -254,7 +255,8 @@ class ApplicationServiceStub(object): class ApplicationServiceServicer(object): - """ApplicationService is the service providing API methods for managing applications. + """ApplicationService is the service providing API methods for managing + applications. """ def Create(self, request, context): @@ -832,7 +834,8 @@ def add_ApplicationServiceServicer_to_server(servicer, server): # This class is part of an EXPERIMENTAL API. class ApplicationService(object): - """ApplicationService is the service providing API methods for managing applications. + """ApplicationService is the service providing API methods for managing + applications. """ @staticmethod diff --git a/api/rust/proto/chirpstack/api/application.proto b/api/rust/proto/chirpstack/api/application.proto index 2055ce09..c0c98cc5 100644 --- a/api/rust/proto/chirpstack/api/application.proto +++ b/api/rust/proto/chirpstack/api/application.proto @@ -12,1006 +12,1081 @@ import "google/api/annotations.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/empty.proto"; -// ApplicationService is the service providing API methods for managing applications. +// ApplicationService is the service providing API methods for managing +// applications. service ApplicationService { - // Create creates the given application. - rpc Create(CreateApplicationRequest) returns (CreateApplicationResponse) { - option(google.api.http) = { - post: "/api/applications" - body: "*" - }; - } + // Create creates the given application. + rpc Create(CreateApplicationRequest) returns (CreateApplicationResponse) { + option (google.api.http) = { + post : "/api/applications" + body : "*" + }; + } - // Get the application for the given ID. - rpc Get(GetApplicationRequest) returns (GetApplicationResponse) { - option(google.api.http) = { - get: "/api/applications/{id}" - }; - } + // Get the application for the given ID. + rpc Get(GetApplicationRequest) returns (GetApplicationResponse) { + option (google.api.http) = { + get : "/api/applications/{id}" + }; + } - // Update updates the given application. - rpc Update(UpdateApplicationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{application.id}" - body: "*" - }; - } + // Update updates the given application. + rpc Update(UpdateApplicationRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{application.id}" + body : "*" + }; + } - // Delete the application for the given ID. - rpc Delete(DeleteApplicationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{id}" - }; - } + // Delete the application for the given ID. + rpc Delete(DeleteApplicationRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{id}" + }; + } - // Get the list of applications. - rpc List(ListApplicationsRequest) returns (ListApplicationsResponse) { - option(google.api.http) = { - get: "/api/applications" - }; - } + // Get the list of applications. + rpc List(ListApplicationsRequest) returns (ListApplicationsResponse) { + option (google.api.http) = { + get : "/api/applications" + }; + } - // List all configured integrations. - rpc ListIntegrations(ListIntegrationsRequest) returns (ListIntegrationsResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations" - }; - } + // List all configured integrations. + rpc ListIntegrations(ListIntegrationsRequest) + returns (ListIntegrationsResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations" + }; + } - // Create HTTP integration. - rpc CreateHttpIntegration(CreateHttpIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/http" - body: "*" - }; - } + // Create HTTP integration. + rpc CreateHttpIntegration(CreateHttpIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/http" + body : "*" + }; + } - // Get the configured HTTP integration. - rpc GetHttpIntegration(GetHttpIntegrationRequest) returns (GetHttpIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/http" - }; - } + // Get the configured HTTP integration. + rpc GetHttpIntegration(GetHttpIntegrationRequest) + returns (GetHttpIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/http" + }; + } - // Update the HTTP integration. - rpc UpdateHttpIntegration(UpdateHttpIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/http" - body: "*" - }; - } + // Update the HTTP integration. + rpc UpdateHttpIntegration(UpdateHttpIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/http" + body : "*" + }; + } - // Delete the HTTP integration. - rpc DeleteHttpIntegration(DeleteHttpIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/http" - }; - } + // Delete the HTTP integration. + rpc DeleteHttpIntegration(DeleteHttpIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/http" + }; + } - // Create InfluxDb integration. - rpc CreateInfluxDbIntegration(CreateInfluxDbIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/influxdb" - body: "*" - }; - } + // Create InfluxDb integration. + rpc CreateInfluxDbIntegration(CreateInfluxDbIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "influxdb" + body : "*" + }; + } - // Get InfluxDb integration. - rpc GetInfluxDbIntegration(GetInfluxDbIntegrationRequest) returns (GetInfluxDbIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/influxdb" - }; - } + // Get InfluxDb integration. + rpc GetInfluxDbIntegration(GetInfluxDbIntegrationRequest) + returns (GetInfluxDbIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/influxdb" + }; + } - // Update InfluxDb integration. - rpc UpdateInfluxDbIntegration(UpdateInfluxDbIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/influxdb" - body: "*" - }; - } + // Update InfluxDb integration. + rpc UpdateInfluxDbIntegration(UpdateInfluxDbIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "influxdb" + body : "*" + }; + } - // Delete InfluxDb integration. - rpc DeleteInfluxDbIntegration(DeleteInfluxDbIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/influxdb" - }; - } + // Delete InfluxDb integration. + rpc DeleteInfluxDbIntegration(DeleteInfluxDbIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/influxdb" + }; + } - // Create ThingsBoard integration. - rpc CreateThingsBoardIntegration(CreateThingsBoardIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/thingsboard" - body: "*" - }; - } + // Create ThingsBoard integration. + rpc CreateThingsBoardIntegration(CreateThingsBoardIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "thingsboard" + body : "*" + }; + } - // Get ThingsBoard integration. - rpc GetThingsBoardIntegration(GetThingsBoardIntegrationRequest) returns (GetThingsBoardIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/thingsboard" - }; - } + // Get ThingsBoard integration. + rpc GetThingsBoardIntegration(GetThingsBoardIntegrationRequest) + returns (GetThingsBoardIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/thingsboard" + }; + } - // Update ThingsBoard integration. - rpc UpdateThingsBoardIntegration(UpdateThingsBoardIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/thingsboard" - body: "*" - }; - } + // Update ThingsBoard integration. + rpc UpdateThingsBoardIntegration(UpdateThingsBoardIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "thingsboard" + body : "*" + }; + } - // Delete ThingsBoard integration. - rpc DeleteThingsBoardIntegration(DeleteThingsBoardIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/thingsboard" - }; - } + // Delete ThingsBoard integration. + rpc DeleteThingsBoardIntegration(DeleteThingsBoardIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/thingsboard" + }; + } - // Create myDevices integration. - rpc CreateMyDevicesIntegration(CreateMyDevicesIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/mydevices" - body: "*" - }; - } + // Create myDevices integration. + rpc CreateMyDevicesIntegration(CreateMyDevicesIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "mydevices" + body : "*" + }; + } - // Get myDevices integration. - rpc GetMyDevicesIntegration(GetMyDevicesIntegrationRequest) returns (GetMyDevicesIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/mydevices" - }; - } + // Get myDevices integration. + rpc GetMyDevicesIntegration(GetMyDevicesIntegrationRequest) + returns (GetMyDevicesIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/mydevices" + }; + } - // Update myDevices integration. - rpc UpdateMyDevicesIntegration(UpdateMyDevicesIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/mydevices" - body: "*" - }; - } + // Update myDevices integration. + rpc UpdateMyDevicesIntegration(UpdateMyDevicesIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "mydevices" + body : "*" + }; + } - // Delete myDevices integration. - rpc DeleteMyDevicesIntegration(DeleteMyDevicesIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/mydevices" - }; - } + // Delete myDevices integration. + rpc DeleteMyDevicesIntegration(DeleteMyDevicesIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/mydevices" + }; + } - // Create LoRaCloud integration. - rpc CreateLoraCloudIntegration(CreateLoraCloudIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/loracloud" - body: "*" - }; - } + // Create LoRaCloud integration. + rpc CreateLoraCloudIntegration(CreateLoraCloudIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "loracloud" + body : "*" + }; + } - // Get LoRaCloud integration. - rpc GetLoraCloudIntegration(GetLoraCloudIntegrationRequest) returns (GetLoraCloudIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/loracloud" - }; - } + // Get LoRaCloud integration. + rpc GetLoraCloudIntegration(GetLoraCloudIntegrationRequest) + returns (GetLoraCloudIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/loracloud" + }; + } - // Update LoRaCloud integration. - rpc UpdateLoraCloudIntegration(UpdateLoraCloudIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/loracloud" - body: "*" - }; - } + // Update LoRaCloud integration. + rpc UpdateLoraCloudIntegration(UpdateLoraCloudIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "loracloud" + body : "*" + }; + } - // Delete LoRaCloud integration. - rpc DeleteLoraCloudIntegration(DeleteLoraCloudIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/loracloud" - }; - } + // Delete LoRaCloud integration. + rpc DeleteLoraCloudIntegration(DeleteLoraCloudIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/loracloud" + }; + } - // Create GCP Pub/Sub integration. - rpc CreateGcpPubSubIntegration(CreateGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/gcp-pub-sub" - body: "*" - }; - } + // Create GCP Pub/Sub integration. + rpc CreateGcpPubSubIntegration(CreateGcpPubSubIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "gcp-pub-sub" + body : "*" + }; + } - // Get GCP Pub/Sub integration. - rpc GetGcpPubSubIntegration(GetGcpPubSubIntegrationRequest) returns (GetGcpPubSubIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/gcp-pub-sub" - }; - } + // Get GCP Pub/Sub integration. + rpc GetGcpPubSubIntegration(GetGcpPubSubIntegrationRequest) + returns (GetGcpPubSubIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/gcp-pub-sub" + }; + } - // Update GCP Pub/Sub integration. - rpc UpdateGcpPubSubIntegration(UpdateGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/gcp-pub-sub" - body: "*" - }; - } + // Update GCP Pub/Sub integration. + rpc UpdateGcpPubSubIntegration(UpdateGcpPubSubIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "gcp-pub-sub" + body : "*" + }; + } - // Delete GCP Pub/Sub integration. - rpc DeleteGcpPubSubIntegration(DeleteGcpPubSubIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/gcp-pub-sub" - }; - } + // Delete GCP Pub/Sub integration. + rpc DeleteGcpPubSubIntegration(DeleteGcpPubSubIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/gcp-pub-sub" + }; + } - // Create AWS SNS integration. - rpc CreateAwsSnsIntegration(CreateAwsSnsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/aws-sns" - body: "*" - }; - } + // Create AWS SNS integration. + rpc CreateAwsSnsIntegration(CreateAwsSnsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "aws-sns" + body : "*" + }; + } - // Get AWS SNS integration. - rpc GetAwsSnsIntegration(GetAwsSnsIntegrationRequest) returns (GetAwsSnsIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/aws-sns" - }; - } + // Get AWS SNS integration. + rpc GetAwsSnsIntegration(GetAwsSnsIntegrationRequest) + returns (GetAwsSnsIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/aws-sns" + }; + } - // Update AWS SNS integration. - rpc UpdateAwsSnsIntegration(UpdateAwsSnsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/aws-sns" - body: "*" - }; - } + // Update AWS SNS integration. + rpc UpdateAwsSnsIntegration(UpdateAwsSnsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "aws-sns" + body : "*" + }; + } - // Delete AWS SNS integration. - rpc DeleteAwsSnsIntegration(DeleteAwsSnsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/aws-sns" - }; - } + // Delete AWS SNS integration. + rpc DeleteAwsSnsIntegration(DeleteAwsSnsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/aws-sns" + }; + } - // Create Azure Service-Bus integration. - rpc CreateAzureServiceBusIntegration(CreateAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/azure-service-bus" - body: "*" - }; - } + // Create Azure Service-Bus integration. + rpc CreateAzureServiceBusIntegration(CreateAzureServiceBusIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "azure-service-bus" + body : "*" + }; + } - // Get Azure Service-Bus integration. - rpc GetAzureServiceBusIntegration(GetAzureServiceBusIntegrationRequest) returns (GetAzureServiceBusIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/azure-service-bus" - }; - } + // Get Azure Service-Bus integration. + rpc GetAzureServiceBusIntegration(GetAzureServiceBusIntegrationRequest) + returns (GetAzureServiceBusIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/azure-service-bus" + }; + } - // Update Azure Service-Bus integration. - rpc UpdateAzureServiceBusIntegration(UpdateAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/azure-service-bus" - body: "*" - }; - } + // Update Azure Service-Bus integration. + rpc UpdateAzureServiceBusIntegration(UpdateAzureServiceBusIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "azure-service-bus" + body : "*" + }; + } - // Delete Azure Service-Bus integration. - rpc DeleteAzureServiceBusIntegration(DeleteAzureServiceBusIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/azure-service-bus" - }; - } + // Delete Azure Service-Bus integration. + rpc DeleteAzureServiceBusIntegration(DeleteAzureServiceBusIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/" + "azure-service-bus" + }; + } - // Create Pilot Things integration. - rpc CreatePilotThingsIntegration(CreatePilotThingsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/pilot-things" - body: "*" - }; - } + // Create Pilot Things integration. + rpc CreatePilotThingsIntegration(CreatePilotThingsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/" + "pilot-things" + body : "*" + }; + } - // Get Pilot Things integration. - rpc GetPilotThingsIntegration(GetPilotThingsIntegrationRequest) returns (GetPilotThingsIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/pilot-things" - }; - } + // Get Pilot Things integration. + rpc GetPilotThingsIntegration(GetPilotThingsIntegrationRequest) + returns (GetPilotThingsIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/pilot-things" + }; + } - // Update Pilot Things integration. - rpc UpdatePilotThingsIntegration(UpdatePilotThingsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/pilot-things" - body: "*" - }; - } + // Update Pilot Things integration. + rpc UpdatePilotThingsIntegration(UpdatePilotThingsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/" + "pilot-things" + body : "*" + }; + } - // Delete Pilot Things integration. - rpc DeletePilotThingsIntegration(DeletePilotThingsIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/pilot-things" - }; - } + // Delete Pilot Things integration. + rpc DeletePilotThingsIntegration(DeletePilotThingsIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/pilot-things" + }; + } - // Create IFTTT integration. - rpc CreateIftttIntegration(CreateIftttIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - post: "/api/applications/{integration.application_id}/integrations/ifttt" - body: "*" - }; - } + // Create IFTTT integration. + rpc CreateIftttIntegration(CreateIftttIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post : "/api/applications/{integration.application_id}/integrations/ifttt" + body : "*" + }; + } - // Get IFTTT integration. - rpc GetIftttIntegration(GetIftttIntegrationRequest) returns (GetIftttIntegrationResponse) { - option(google.api.http) = { - get: "/api/applications/{application_id}/integrations/ifttt" - }; - } + // Get IFTTT integration. + rpc GetIftttIntegration(GetIftttIntegrationRequest) + returns (GetIftttIntegrationResponse) { + option (google.api.http) = { + get : "/api/applications/{application_id}/integrations/ifttt" + }; + } - // Update IFTTT integration. - rpc UpdateIftttIntegration(UpdateIftttIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - put: "/api/applications/{integration.application_id}/integrations/ifttt" - body: "*" - }; - } + // Update IFTTT integration. + rpc UpdateIftttIntegration(UpdateIftttIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + put : "/api/applications/{integration.application_id}/integrations/ifttt" + body : "*" + }; + } - // Delete IFTTT integration. - rpc DeleteIftttIntegration(DeleteIftttIntegrationRequest) returns (google.protobuf.Empty) { - option(google.api.http) = { - delete: "/api/applications/{application_id}/integrations/ifttt" - }; - } + // Delete IFTTT integration. + rpc DeleteIftttIntegration(DeleteIftttIntegrationRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete : "/api/applications/{application_id}/integrations/ifttt" + }; + } - // Generates application ID specific client-certificate. - rpc GenerateMqttIntegrationClientCertificate(GenerateMqttIntegrationClientCertificateRequest) returns (GenerateMqttIntegrationClientCertificateResponse) { - option(google.api.http) = { - post: "/api/applications/{application_id}/integrations/mqtt/certificate" - }; - } + // Generates application ID specific client-certificate. + rpc GenerateMqttIntegrationClientCertificate( + GenerateMqttIntegrationClientCertificateRequest) + returns (GenerateMqttIntegrationClientCertificateResponse) { + option (google.api.http) = { + post : "/api/applications/{application_id}/integrations/mqtt/certificate" + }; + } } enum Encoding { - JSON = 0; - PROTOBUF = 1; + JSON = 0; + PROTOBUF = 1; } enum IntegrationKind { - HTTP = 0; - INFLUX_DB = 1; - THINGS_BOARD = 2; - MY_DEVICES = 3; - LORA_CLOUD = 4; - GCP_PUB_SUB = 5; - AWS_SNS = 6; - AZURE_SERVICE_BUS = 7; - PILOT_THINGS = 8; - MQTT_GLOBAL = 9; - IFTTT = 10; + HTTP = 0; + INFLUX_DB = 1; + THINGS_BOARD = 2; + MY_DEVICES = 3; + LORA_CLOUD = 4; + GCP_PUB_SUB = 5; + AWS_SNS = 6; + AZURE_SERVICE_BUS = 7; + PILOT_THINGS = 8; + MQTT_GLOBAL = 9; + IFTTT = 10; } message Application { - // Application ID (UUID). - // Note: on create this will be automatically generated. - string id = 1; + // Application ID (UUID). + // Note: on create this will be automatically generated. + string id = 1; - // Application name. - string name = 2; + // Application name. + string name = 2; - // Application description. - string description = 3; + // Application description. + string description = 3; - // Tenant ID (UUID). - string tenant_id = 4; + // Tenant ID (UUID). + string tenant_id = 4; } message ApplicationListItem { - // Application ID (UUID). - string id = 1; + // Application ID (UUID). + string id = 1; - // Created at timestamp. - google.protobuf.Timestamp created_at = 2; + // Created at timestamp. + google.protobuf.Timestamp created_at = 2; - // Last update timestamp. - google.protobuf.Timestamp updated_at = 3; + // Last update timestamp. + google.protobuf.Timestamp updated_at = 3; - // Application name. - string name = 4; - - // Application description. - string description = 5; + // Application name. + string name = 4; + + // Application description. + string description = 5; } message CreateApplicationRequest { - // Application object to create. - Application application = 1; + // Application object to create. + Application application = 1; } message CreateApplicationResponse { - // Application ID (UUID). - string id = 1; + // Application ID (UUID). + string id = 1; } message GetApplicationRequest { - // Application ID (UUID). - string id = 1; + // Application ID (UUID). + string id = 1; } message GetApplicationResponse { - // Application object. - Application application = 1; + // Application object. + Application application = 1; - // Created at timestamp. - google.protobuf.Timestamp created_at = 2; + // Created at timestamp. + google.protobuf.Timestamp created_at = 2; - // Last update timestamp. - google.protobuf.Timestamp updated_at = 3; + // Last update timestamp. + google.protobuf.Timestamp updated_at = 3; - // Measurement keys. - // This contains the measurement keys from all the device-profiles that - // are used by the devices under this application. - repeated string measurement_keys = 4; + // Measurement keys. + // This contains the measurement keys from all the device-profiles that + // are used by the devices under this application. + repeated string measurement_keys = 4; } message UpdateApplicationRequest { - // Application object. - Application application = 1; + // Application object. + Application application = 1; } message DeleteApplicationRequest { - // Application ID (UUID). - string id = 1; + // Application ID (UUID). + string id = 1; } message ListApplicationsRequest { - // Max number of applications to return in the result-set. - uint32 limit = 1; + // Max number of applications to return in the result-set. + uint32 limit = 1; - // Offset in the result-set (for pagination). - uint32 offset = 2; + // Offset in the result-set (for pagination). + uint32 offset = 2; - // If set, the given string will be used to search on name (optional). - string search = 3; + // If set, the given string will be used to search on name (optional). + string search = 3; - // Tenant ID to list the applications for. - string tenant_id = 4; + // Tenant ID to list the applications for. + string tenant_id = 4; } message ListApplicationsResponse { - // Total number of applications. - uint32 total_count = 1; + // Total number of applications. + uint32 total_count = 1; - // Result-set. - repeated ApplicationListItem result = 2; + // Result-set. + repeated ApplicationListItem result = 2; } message ListIntegrationsRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message IntegrationListItem { - // Integration kind. - IntegrationKind kind = 1; + // Integration kind. + IntegrationKind kind = 1; } message ListIntegrationsResponse { - // Total number of integrations available within the result-set. - uint32 total_count = 1; + // Total number of integrations available within the result-set. + uint32 total_count = 1; - // Integrations within result-set. - repeated IntegrationListItem result = 2; + // Integrations within result-set. + repeated IntegrationListItem result = 2; } message HttpIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // HTTP headers to set when making requests. - map headers = 2; + // HTTP headers to set when making requests. + map headers = 2; - // Payload encoding. - Encoding encoding = 3; + // Payload encoding. + Encoding encoding = 3; - // Event endpoint URL. - // The HTTP integration will POST all events to this enpoint. The request - // will contain a query parameters "event" containing the type of the - // event. - string event_endpoint_url = 4; + // Event endpoint URL. + // The HTTP integration will POST all events to this enpoint. The request + // will contain a query parameters "event" containing the type of the + // event. + string event_endpoint_url = 4; } message CreateHttpIntegrationRequest { - // Integration object to create. - HttpIntegration integration = 1; + // Integration object to create. + HttpIntegration integration = 1; } message GetHttpIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetHttpIntegrationResponse { - // Integration object. - HttpIntegration integration = 1; + // Integration object. + HttpIntegration integration = 1; } message UpdateHttpIntegrationRequest { - // Integration object to update. - HttpIntegration integration = 1; + // Integration object to update. + HttpIntegration integration = 1; } message DeleteHttpIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } enum InfluxDbPrecision { - NS = 0; - U = 1; - MS = 2; - S = 3; - M = 4; - H = 5; + NS = 0; + U = 1; + MS = 2; + S = 3; + M = 4; + H = 5; } enum InfluxDbVersion { - INFLUXDB_1 = 0; - INFLUXDB_2 = 1; + INFLUXDB_1 = 0; + INFLUXDB_2 = 1; } message InfluxDbIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // InfluxDb API write endpoint (e.g. http://localhost:8086/write). - string endpoint = 2; + // InfluxDb API write endpoint (e.g. http://localhost:8086/write). + string endpoint = 2; - // InfluxDb database name. (InfluxDb v1) - string db = 3; + // InfluxDb database name. (InfluxDb v1) + string db = 3; - // InfluxDb username. (InfluxDb v1) - string username = 4; + // InfluxDb username. (InfluxDb v1) + string username = 4; - // InfluxDb password. (InfluxDb v1) - string password = 5; + // InfluxDb password. (InfluxDb v1) + string password = 5; - // InfluxDb retention policy name. (InfluxDb v1) - string retention_policy_name = 6; + // InfluxDb retention policy name. (InfluxDb v1) + string retention_policy_name = 6; - // InfluxDb timestamp precision (InfluxDb v1). - InfluxDbPrecision precision = 7; + // InfluxDb timestamp precision (InfluxDb v1). + InfluxDbPrecision precision = 7; - // InfluxDb version. - InfluxDbVersion version = 8; + // InfluxDb version. + InfluxDbVersion version = 8; - // Token. (InfluxDb v2) - string token = 9; + // Token. (InfluxDb v2) + string token = 9; - // Organization. (InfluxDb v2) - string organization = 10; + // Organization. (InfluxDb v2) + string organization = 10; - // Bucket. (InfluxDb v2) - string bucket = 11; + // Bucket. (InfluxDb v2) + string bucket = 11; } message CreateInfluxDbIntegrationRequest { - // Integration object to create. - InfluxDbIntegration integration = 1; + // Integration object to create. + InfluxDbIntegration integration = 1; } message GetInfluxDbIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetInfluxDbIntegrationResponse { - // Integration object. - InfluxDbIntegration integration = 1; + // Integration object. + InfluxDbIntegration integration = 1; } message UpdateInfluxDbIntegrationRequest { - // Integration object to update. - InfluxDbIntegration integration = 1; + // Integration object to update. + InfluxDbIntegration integration = 1; } message DeleteInfluxDbIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message ThingsBoardIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // ThingsBoard server endpoint, e.g. https://example.com - string server = 2; + // ThingsBoard server endpoint, e.g. https://example.com + string server = 2; } message CreateThingsBoardIntegrationRequest { - // Integration object to create. - ThingsBoardIntegration integration = 1; + // Integration object to create. + ThingsBoardIntegration integration = 1; } message GetThingsBoardIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetThingsBoardIntegrationResponse { - // Integration object. - ThingsBoardIntegration integration = 1; + // Integration object. + ThingsBoardIntegration integration = 1; } message UpdateThingsBoardIntegrationRequest { - // Integration object to update. - ThingsBoardIntegration integration = 1; + // Integration object to update. + ThingsBoardIntegration integration = 1; } message DeleteThingsBoardIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message MyDevicesIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // myDevices API endpoint. - string endpoint = 2; + // myDevices API endpoint. + string endpoint = 2; } message CreateMyDevicesIntegrationRequest { - // Integration object to create. - MyDevicesIntegration integration = 1; + // Integration object to create. + MyDevicesIntegration integration = 1; } message GetMyDevicesIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetMyDevicesIntegrationResponse { - // Integration object. - MyDevicesIntegration integration = 1; + // Integration object. + MyDevicesIntegration integration = 1; } message UpdateMyDevicesIntegrationRequest { - // Integration object to update. - MyDevicesIntegration integration = 1; + // Integration object to update. + MyDevicesIntegration integration = 1; } message DeleteMyDevicesIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message LoraCloudIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Modem & Geolocation Services configuration. - LoraCloudModemGeolocationServices modem_geolocation_services = 2; + // Modem & Geolocation Services configuration. + LoraCloudModemGeolocationServices modem_geolocation_services = 2; } message LoraCloudModemGeolocationServices { - // API token. - string token = 1; + // API token. + string token = 1; - // Device implements Modem / Modem-E stack. - bool modem_enabled = 2; + // Device implements Modem / Modem-E stack. + bool modem_enabled = 2; - // Forward FPorts. - // Forward uplink messages matching the given FPorts to the MGS. - repeated uint32 forward_f_ports = 16; + // Forward FPorts. + // Forward uplink messages matching the given FPorts to the MGS. + repeated uint32 forward_f_ports = 16; - // Use rx time for GNSS resolving. - // In case this is set to true, the MGS resolver will use the RX time of the - // network instead of the timestamp included in the LR1110 payload. - bool gnss_use_rx_time = 5; + // Use rx time for GNSS resolving. + // In case this is set to true, the MGS resolver will use the RX time of the + // network instead of the timestamp included in the LR1110 payload. + bool gnss_use_rx_time = 5; - // Use gateway location for GNSS resolving. - // In the case this is set to true, ChirpStack will provide the location of - // one of the gateways to the MGS resolver to aid the resolving process. - // Disable this in case the gateway location is not accurate / incorrectly - // configured as an incorrect location will cause the resolver to return an - // error. - bool gnss_use_gateway_location = 17; + // Use gateway location for GNSS resolving. + // In the case this is set to true, ChirpStack will provide the location of + // one of the gateways to the MGS resolver to aid the resolving process. + // Disable this in case the gateway location is not accurate / incorrectly + // configured as an incorrect location will cause the resolver to return an + // error. + bool gnss_use_gateway_location = 17; - // Parse TLV records. - // If enabled, stream records (expected in TLV format) are scanned for GNSS - // data (0x06 or 0x07). If found, ChirpStack will make an additional - // geolocation call to the MGS API for resolving the location of the detected - // payload. - bool parse_tlv = 6; + // Parse TLV records. + // If enabled, stream records (expected in TLV format) are scanned for GNSS + // data (0x06 or 0x07). If found, ChirpStack will make an additional + // geolocation call to the MGS API for resolving the location of the detected + // payload. + bool parse_tlv = 6; - // Geolocation buffer TTL (in seconds). - // If > 0, uplink RX meta-data will be stored in a buffer so that - // the meta-data of multiple uplinks can be used for geolocation. - uint32 geolocation_buffer_ttl = 7; + // Geolocation buffer TTL (in seconds). + // If > 0, uplink RX meta-data will be stored in a buffer so that + // the meta-data of multiple uplinks can be used for geolocation. + uint32 geolocation_buffer_ttl = 7; - // Geolocation minimum buffer size. - // If > 0, geolocation will only be performed when the buffer has - // at least the given size. - uint32 geolocation_min_buffer_size = 8; + // Geolocation minimum buffer size. + // If > 0, geolocation will only be performed when the buffer has + // at least the given size. + uint32 geolocation_min_buffer_size = 8; - // TDOA based geolocation is enabled. - bool geolocation_tdoa = 9; + // TDOA based geolocation is enabled. + bool geolocation_tdoa = 9; - // RSSI based geolocation is enabled. - bool geolocation_rssi = 10; + // RSSI based geolocation is enabled. + bool geolocation_rssi = 10; - // GNSS based geolocation is enabled (LR1110). - bool geolocation_gnss = 11; + // GNSS based geolocation is enabled (LR1110). + bool geolocation_gnss = 11; - // GNSS payload field. - // This holds the name of the field in the decoded payload object which - // contains the GNSS payload bytes (as HEX string). - string geolocation_gnss_payload_field = 12; + // GNSS payload field. + // This holds the name of the field in the decoded payload object which + // contains the GNSS payload bytes (as HEX string). + string geolocation_gnss_payload_field = 12; - // GNSS use RX time. - // In case this is set to true, the resolver will use the RX time of the - // network instead of the timestamp included in the LR1110 payload. - bool geolocation_gnss_use_rx_time = 13; + // GNSS use RX time. + // In case this is set to true, the resolver will use the RX time of the + // network instead of the timestamp included in the LR1110 payload. + bool geolocation_gnss_use_rx_time = 13; - // Wifi based geolocation is enabled. - bool geolocation_wifi = 14; + // Wifi based geolocation is enabled. + bool geolocation_wifi = 14; - // Wifi payload field. - // This holds the name of the field in the decoded payload object which - // contains an array of objects with the following fields: - // * macAddress - e.g. 01:23:45:67:89:ab - // * signalStrength - e.g. -51 (optional) - string geolocation_wifi_payload_field = 15; + // Wifi payload field. + // This holds the name of the field in the decoded payload object which + // contains an array of objects with the following fields: + // * macAddress - e.g. 01:23:45:67:89:ab + // * signalStrength - e.g. -51 (optional) + string geolocation_wifi_payload_field = 15; } message CreateLoraCloudIntegrationRequest { - // Integration object to create. - LoraCloudIntegration integration = 1; + // Integration object to create. + LoraCloudIntegration integration = 1; } message GetLoraCloudIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetLoraCloudIntegrationResponse { - // Integration object. - LoraCloudIntegration integration = 1; + // Integration object. + LoraCloudIntegration integration = 1; } message UpdateLoraCloudIntegrationRequest { - // Integration object to update. - LoraCloudIntegration integration = 1; + // Integration object to update. + LoraCloudIntegration integration = 1; } message DeleteLoraCloudIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GcpPubSubIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Encoding. - Encoding encoding = 2; + // Encoding. + Encoding encoding = 2; - // Credentials file. - // This IAM service-account credentials file (JSON) must have the following Pub/Sub roles: - // * Pub/Sub Publisher - string credentials_file = 3; + // Credentials file. + // This IAM service-account credentials file (JSON) must have the following + // Pub/Sub roles: + // * Pub/Sub Publisher + string credentials_file = 3; - // Project ID. - string project_id = 4; + // Project ID. + string project_id = 4; - // Topic name. - // This is the name of the Pub/Sub topic. - string topic_name = 5; + // Topic name. + // This is the name of the Pub/Sub topic. + string topic_name = 5; } message CreateGcpPubSubIntegrationRequest { - // Integration object to create. - GcpPubSubIntegration integration = 1; + // Integration object to create. + GcpPubSubIntegration integration = 1; } message GetGcpPubSubIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetGcpPubSubIntegrationResponse { - // Integration object. - GcpPubSubIntegration integration = 1; + // Integration object. + GcpPubSubIntegration integration = 1; } message UpdateGcpPubSubIntegrationRequest { - // Integration object to update. - GcpPubSubIntegration integration = 1; + // Integration object to update. + GcpPubSubIntegration integration = 1; } message DeleteGcpPubSubIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message AwsSnsIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Encoding. - Encoding encoding = 2; + // Encoding. + Encoding encoding = 2; - // AWS region. - string region = 3; + // AWS region. + string region = 3; - // AWS Access Key ID. - string access_key_id = 4; + // AWS Access Key ID. + string access_key_id = 4; - // AWS Secret Access Key. - string secret_access_key = 5; + // AWS Secret Access Key. + string secret_access_key = 5; - // Topic ARN. - string topic_arn = 6; + // Topic ARN. + string topic_arn = 6; } message CreateAwsSnsIntegrationRequest { - // Integration object to create. - AwsSnsIntegration integration = 1; + // Integration object to create. + AwsSnsIntegration integration = 1; } message GetAwsSnsIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetAwsSnsIntegrationResponse { - // Integration object. - AwsSnsIntegration integration = 1; + // Integration object. + AwsSnsIntegration integration = 1; } message UpdateAwsSnsIntegrationRequest { - // Integration object to update. - AwsSnsIntegration integration = 1; + // Integration object to update. + AwsSnsIntegration integration = 1; } message DeleteAwsSnsIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message AzureServiceBusIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Encoding. - Encoding encoding = 2; + // Encoding. + Encoding encoding = 2; - // Connection string. - string connection_string = 3; + // Connection string. + string connection_string = 3; - // Publish name. - // This is the name of the topic or queue. - string publish_name = 4; + // Publish name. + // This is the name of the topic or queue. + string publish_name = 4; } message CreateAzureServiceBusIntegrationRequest { - // Integration object to create. - AzureServiceBusIntegration integration = 1; + // Integration object to create. + AzureServiceBusIntegration integration = 1; } message GetAzureServiceBusIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetAzureServiceBusIntegrationResponse { - // Integration object. - AzureServiceBusIntegration integration = 1; + // Integration object. + AzureServiceBusIntegration integration = 1; } message UpdateAzureServiceBusIntegrationRequest { - // Integration object to create. - AzureServiceBusIntegration integration = 1; + // Integration object to create. + AzureServiceBusIntegration integration = 1; } message DeleteAzureServiceBusIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message PilotThingsIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Server URL. - string server = 2; + // Server URL. + string server = 2; - // Authentication token. - string token = 3; + // Authentication token. + string token = 3; } message CreatePilotThingsIntegrationRequest { - // Integration object to create. - PilotThingsIntegration integration = 1; + // Integration object to create. + PilotThingsIntegration integration = 1; } message GetPilotThingsIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetPilotThingsIntegrationResponse { - // Integration object. - PilotThingsIntegration integration = 1; + // Integration object. + PilotThingsIntegration integration = 1; } message UpdatePilotThingsIntegrationRequest { - // Integration object to update. - PilotThingsIntegration integration = 1; + // Integration object to update. + PilotThingsIntegration integration = 1; } message DeletePilotThingsIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message IftttIntegration { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; - // Key. - // This key can be obtained from the IFTTT Webhooks documentation page. - string key = 2; + // Key. + // This key can be obtained from the IFTTT Webhooks documentation page. + string key = 2; - // Values. - // Up to 2 values can be forwarded to IFTTT. These values must map to the - // decoded payload keys. For example: - // { - // "batteryLevel": 75.3, - // "buttons": [{"pressed": false}, {"pressed": true}] - // } - // You would specify the following fields: - // uplink_values = ["batteryLevel", "buttons_0_pressed"] - // - // Note: The first value is always used for the DevEUI. - repeated string uplink_values = 3; + // Values. + // Up to 2 values can be forwarded to IFTTT. These values must map to the + // decoded payload keys. For example: + // { + // "batteryLevel": 75.3, + // "buttons": [{"pressed": false}, {"pressed": true}] + // } + // You would specify the following fields: + // uplink_values = ["batteryLevel", "buttons_0_pressed"] + // + // Notes: The first value is always used for the DevEUI. + // Ignored if arbitrary_json is set to true. + repeated string uplink_values = 3; + + // Arbitrary JSON. + // If set to true, ChirpStack events will be sent as-is as arbitrary JSON + // payload. If set to false (default), the 3 JSON values format will be used. + bool arbitrary_json = 4; + + // Event prefix. + // If set, the event name will be PREFIX_EVENT. For example if event_prefix + // is set to weatherstation, and uplink event will be sent as + // weatherstation_up to the IFTTT webhook. + // Note: Only characters in the A-Z, a-z and 0-9 range are allowed. + string event_prefix = 5; } message CreateIftttIntegrationRequest { - // Integration object. - IftttIntegration integration = 1; + // Integration object. + IftttIntegration integration = 1; } message GetIftttIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GetIftttIntegrationResponse { - // Integration object. - IftttIntegration integration = 1; + // Integration object. + IftttIntegration integration = 1; } message UpdateIftttIntegrationRequest { - // Integration object to update. - IftttIntegration integration = 1; + // Integration object to update. + IftttIntegration integration = 1; } message DeleteIftttIntegrationRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GenerateMqttIntegrationClientCertificateRequest { - // Application ID (UUID). - string application_id = 1; + // Application ID (UUID). + string application_id = 1; } message GenerateMqttIntegrationClientCertificateResponse { - // TLS certificate. - string tls_cert = 1; + // TLS certificate. + string tls_cert = 1; - // TLS key. - string tls_key = 2; + // TLS key. + string tls_key = 2; - // CA certificate. - string ca_cert = 3; + // CA certificate. + string ca_cert = 3; - // Expires at defines the expiration date of the certificate. - google.protobuf.Timestamp expires_at = 4; + // Expires at defines the expiration date of the certificate. + google.protobuf.Timestamp expires_at = 4; } diff --git a/chirpstack/src/api/application.rs b/chirpstack/src/api/application.rs index f792f0df..bbd3aabb 100644 --- a/chirpstack/src/api/application.rs +++ b/chirpstack/src/api/application.rs @@ -1716,6 +1716,16 @@ impl ApplicationService for Application { ) .await?; + if !req_int.event_prefix.is_empty() + && !regex::Regex::new(r"^[a-zA-Z0-9]+$") + .unwrap() + .is_match(&req_int.event_prefix) + { + return Err(Status::invalid_argument( + "event_prefix may only contain A-Z, a-z and 0-9 characters", + )); + } + let _ = application::create_integration(application::Integration { application_id: app_id, kind: application::IntegrationKind::Ifttt, @@ -1726,6 +1736,8 @@ impl ApplicationService for Application { req_int.uplink_values.get(0).cloned().unwrap_or_default(), req_int.uplink_values.get(1).cloned().unwrap_or_default(), ], + arbitrary_json: req_int.arbitrary_json, + event_prefix: req_int.event_prefix.clone(), }, ), ..Default::default() @@ -1766,6 +1778,8 @@ impl ApplicationService for Application { application_id: app_id.to_string(), key: conf.key.clone(), uplink_values: conf.uplink_values.to_vec(), + arbitrary_json: conf.arbitrary_json, + event_prefix: conf.event_prefix.clone(), }), }); resp.metadata_mut() @@ -1806,6 +1820,8 @@ impl ApplicationService for Application { req_int.uplink_values.get(0).cloned().unwrap_or_default(), req_int.uplink_values.get(1).cloned().unwrap_or_default(), ], + arbitrary_json: req_int.arbitrary_json, + event_prefix: req_int.event_prefix.clone(), }, ), ..Default::default() @@ -3353,6 +3369,8 @@ pub mod test { application_id: app.id.to_string(), key: "verysecret".into(), uplink_values: vec!["value_1".into(), "value_2".into()], + arbitrary_json: false, + event_prefix: "foo".to_string(), }), }, ); @@ -3372,6 +3390,8 @@ pub mod test { application_id: app.id.to_string(), key: "verysecret".into(), uplink_values: vec!["value_1".into(), "value_2".into()], + arbitrary_json: false, + event_prefix: "foo".to_string(), }), get_resp.integration ); @@ -3384,6 +3404,8 @@ pub mod test { application_id: app.id.to_string(), key: "verysecrettoo".into(), uplink_values: vec!["value_4".into(), "value_5".into()], + arbitrary_json: true, + event_prefix: "bar".to_string(), }), }, ); @@ -3403,6 +3425,8 @@ pub mod test { application_id: app.id.to_string(), key: "verysecrettoo".into(), uplink_values: vec!["value_4".into(), "value_5".into()], + arbitrary_json: true, + event_prefix: "bar".to_string(), }), get_resp.integration ); diff --git a/chirpstack/src/integration/ifttt.rs b/chirpstack/src/integration/ifttt.rs index f184e04a..fb8279ff 100644 --- a/chirpstack/src/integration/ifttt.rs +++ b/chirpstack/src/integration/ifttt.rs @@ -27,6 +27,8 @@ pub struct Integration { key: String, uplink_values: [String; 2], server: String, + arbitrary_json: bool, + event_prefix: String, } impl Integration { @@ -37,11 +39,30 @@ impl Integration { key: conf.key.clone(), uplink_values: conf.uplink_values.clone(), server: "https://maker.ifttt.com".to_string(), + arbitrary_json: conf.arbitrary_json, + event_prefix: conf.event_prefix.clone(), } } - async fn post(&self, event: &str, v: Values) -> Result<()> { - let url = format!("{}/trigger/{}/with/key/{}", self.server, event, self.key); + async fn post(&self, event: &str, v: &T) -> Result<()> + where + T: Serialize, + { + let event = if self.event_prefix.is_empty() { + event.to_string() + } else { + format!("{}_{}", self.event_prefix, event) + }; + + let url = if self.arbitrary_json { + format!( + "{}/trigger/{}/json/with/key/{}", + self.server, event, self.key + ) + } else { + format!("{}/trigger/{}/with/key/{}", self.server, event, self.key) + }; + let client = Client::builder().timeout(Duration::from_secs(5)).build()?; let mut headers = HeaderMap::new(); headers.insert(CONTENT_TYPE, "application/json".parse().unwrap()); @@ -65,6 +86,10 @@ impl IntegrationTrait for Integration { _vars: &HashMap, pl: &integration::UplinkEvent, ) -> Result<()> { + if self.arbitrary_json { + return self.post("up", pl).await; + } + let data_measurements: HashMap = match &pl.object { None => { trace!("object is None, nothing to send"); @@ -91,7 +116,7 @@ impl IntegrationTrait for Integration { return Ok(()); } - self.post("up", v).await + self.post("up", &v).await } async fn join_event( @@ -170,13 +195,15 @@ pub mod test { use httpmock::prelude::*; #[tokio::test] - async fn test_ifttt() { + async fn test_ifttt_no_prefix() { let server = MockServer::start(); let i = Integration { key: "verysecret".into(), uplink_values: ["temp".to_string(), "door_open".to_string()], server: server.url(""), + arbitrary_json: false, + event_prefix: "".into(), }; // uplink event @@ -228,4 +255,121 @@ pub mod test { mock.assert(); mock.delete(); } + + #[tokio::test] + async fn test_ifttt_prefix() { + let server = MockServer::start(); + + let i = Integration { + key: "verysecret".into(), + uplink_values: ["temp".to_string(), "door_open".to_string()], + server: server.url(""), + arbitrary_json: false, + event_prefix: "weatherstation".into(), + }; + + // uplink event + let pl = integration::UplinkEvent { + device_info: Some(integration::DeviceInfo { + dev_eui: "0102030405060708".to_string(), + ..Default::default() + }), + object: Some(pbjson_types::Struct { + fields: [ + ( + "temp".to_string(), + pbjson_types::Value { + kind: Some(pbjson_types::value::Kind::NumberValue(23.5)), + }, + ), + ( + "door_open".to_string(), + pbjson_types::Value { + kind: Some(pbjson_types::value::Kind::StringValue( + "closed".to_string(), + )), + }, + ), + ] + .iter() + .cloned() + .collect(), + }), + ..Default::default() + }; + let mut mock = server.mock(|when, then| { + when.method(POST) + .path("/trigger/weatherstation_up/with/key/verysecret") + .header("Content-Type", "application/json") + .body( + serde_json::to_string(&Values { + value1: "0102030405060708".to_string(), + value2: "23.5".to_string(), + value3: "closed".to_string(), + }) + .unwrap(), + ); + + then.status(200); + }); + + i.uplink_event(&HashMap::new(), &pl).await.unwrap(); + mock.assert(); + mock.delete(); + } + + #[tokio::test] + async fn test_ifttt_arbitrary_json() { + let server = MockServer::start(); + + let i = Integration { + key: "verysecret".into(), + uplink_values: ["temp".to_string(), "door_open".to_string()], + server: server.url(""), + arbitrary_json: true, + event_prefix: "".into(), + }; + + // uplink event + let pl = integration::UplinkEvent { + device_info: Some(integration::DeviceInfo { + dev_eui: "0102030405060708".to_string(), + ..Default::default() + }), + object: Some(pbjson_types::Struct { + fields: [ + ( + "temp".to_string(), + pbjson_types::Value { + kind: Some(pbjson_types::value::Kind::NumberValue(23.5)), + }, + ), + ( + "door_open".to_string(), + pbjson_types::Value { + kind: Some(pbjson_types::value::Kind::StringValue( + "closed".to_string(), + )), + }, + ), + ] + .iter() + .cloned() + .collect(), + }), + ..Default::default() + }; + let mut mock = server.mock(|when, then| { + when.method(POST) + .path("/trigger/up/json/with/key/verysecret") + .header("Content-Type", "application/json") + .body(serde_json::to_string(&pl).unwrap()); + + then.status(200); + }); + + i.uplink_event(&HashMap::new(), &pl).await.unwrap(); + mock.assert(); + mock.delete(); + } } diff --git a/chirpstack/src/storage/application.rs b/chirpstack/src/storage/application.rs index ee2a2ec6..4e68fc7d 100644 --- a/chirpstack/src/storage/application.rs +++ b/chirpstack/src/storage/application.rs @@ -252,10 +252,13 @@ pub struct PilotThingsConfiguration { pub token: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(default)] pub struct IftttConfiguration { pub key: String, pub uplink_values: [String; 2], // The first value is reserved for the DevEUI + pub arbitrary_json: bool, + pub event_prefix: String, } #[derive(Clone, Queryable, Insertable, PartialEq, Eq, Debug)] diff --git a/ui/src/views/applications/integrations/IftttIntegrationForm.tsx b/ui/src/views/applications/integrations/IftttIntegrationForm.tsx index da4b7076..a238ceff 100644 --- a/ui/src/views/applications/integrations/IftttIntegrationForm.tsx +++ b/ui/src/views/applications/integrations/IftttIntegrationForm.tsx @@ -1,6 +1,6 @@ import React, { Component } from "react"; -import { Form, Input, AutoComplete, Button } from "antd"; +import { Form, Input, AutoComplete, Button, Row, Col, Switch } from "antd"; import { IftttIntegration } from "@chirpstack/chirpstack-api-grpc-web/api/application_pb"; @@ -10,18 +10,46 @@ interface IProps { onFinish: (obj: IftttIntegration) => void; } -class IftttIntegrationForm extends Component { +interface IState { + arbitraryJson: boolean; +} + +class IftttIntegrationForm extends Component { + constructor(props: IProps) { + super(props); + + this.state = { + arbitraryJson: false, + }; + } + + componentDidMount() { + const v = this.props.initialValues; + + this.setState({ + arbitraryJson: v.getArbitraryJson(), + }); + } + onFinish = (values: IftttIntegration.AsObject) => { const v = Object.assign(this.props.initialValues.toObject(), values); let i = new IftttIntegration(); i.setApplicationId(v.applicationId); i.setKey(v.key); + i.setEventPrefix(v.eventPrefix); + i.setArbitraryJson(v.arbitraryJson); i.setUplinkValuesList(v.uplinkValuesList); this.props.onFinish(i); }; + onArbitraryJsonChange = (checked: boolean) => { + this.setState({ + arbitraryJson: checked, + }); + } + render() { const options: { value: string; @@ -39,21 +67,45 @@ class IftttIntegrationForm extends Component { > - + + + + + + + + + + + + + {!this.state.arbitraryJson && {fields => ( -
+ {fields.map((field, i) => ( - - - + + + + + ))} -
+ )} -
+
}