# automatically generated by the FlatBuffers compiler, do not modify

# namespace: example

import flatbuffers
class HelloRequest(object):
    __slots__ = ['_tab']

    @classmethod
    def GetRootAs(cls, buf, offset=0):
        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
        x = HelloRequest()
        x.Init(buf, n + offset)
        return x

    @classmethod
    def GetRootAsHelloRequest(cls, buf, offset=0):
        """This method is deprecated. Please switch to GetRootAs."""
        return cls.GetRootAs(buf, offset)
    # HelloRequest
    def Init(self, buf, pos):
        self._tab = flatbuffers.table.Table(buf, pos)

def HelloRequestStart(builder):
    builder.StartObject(0)

def HelloRequestEnd(builder):
    return builder.EndObject()



class HelloResponse(object):
    __slots__ = ['_tab']

    @classmethod
    def GetRootAs(cls, buf, offset=0):
        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
        x = HelloResponse()
        x.Init(buf, n + offset)
        return x

    @classmethod
    def GetRootAsHelloResponse(cls, buf, offset=0):
        """This method is deprecated. Please switch to GetRootAs."""
        return cls.GetRootAs(buf, offset)
    # HelloResponse
    def Init(self, buf, pos):
        self._tab = flatbuffers.table.Table(buf, pos)

def HelloResponseStart(builder):
    builder.StartObject(0)

def HelloResponseEnd(builder):
    return builder.EndObject()



