private async Task GetHalcyonGroupHash(HttpListenerContext context, HttpListenerRequest request)
        {
            //halcyon geometry is coming in as a primitive flatbuffer object
            //as binary in the body. deserialize and hash
            ByteBuffer body = await StreamUtil.ReadStreamFullyAsync(request.InputStream);

            ulong hash = 0;
            //The hashing is CPU intensive. Use a thread task
            await Task.Run(() =>
            {
                var group = HalcyonGroup.GetRootAsHalcyonGroup(body);
                var sog   = Mapper.MapFlatbufferGroupToSceneObjectGroup(group);

                hash = _hasher.GetGroupHash(sog);
            });

            context.Response.StatusCode = 200;
            context.Response.AddHeader("Content-Type", "text/plain");
            byte[] hashText = Encoding.UTF8.GetBytes(hash.ToString());

            await context.Response.OutputStream.WriteAsync(hashText, 0, hashText.Length);

            await context.Response.OutputStream.FlushAsync();

            context.Response.Close();
        }
        private async Task ConvertHalcyonGroupToBabylon(HttpListenerContext context, HttpListenerRequest request)
        {
            //halcyon gemoetry is coming in as a primitive group flatbuffer object
            //as binary in the body. deserialize and convert using the prim exporter
            ByteBuffer body = await StreamUtil.ReadStreamFullyAsync(request.InputStream);

            ExportResult             babylonExport     = null;
            Tuple <byte[], int, int> babylonFlatbuffer = null;

            //The actual conversion is CPU intensive. Use a thread task
            await Task.Run(() =>
            {
                var group = HalcyonGroup.GetRootAsHalcyonGroup(body);
                var sog   = Mapper.MapFlatbufferGroupToSceneObjectGroup(group);

                var displayData = GroupLoader.Instance.GroupDisplayDataFromSOG(UUID.Zero, new GroupLoader.LoaderParams(),
                                                                               sog, null, null, null);

                BabylonFlatbufferFormatter formatter = new BabylonFlatbufferFormatter();

                babylonExport     = formatter.Export(displayData);
                babylonFlatbuffer = babylonExport.FaceBlob;
            });

            context.Response.StatusCode = 200;
            context.Response.AddHeader("Content-Type", "application/octet-stream");
            context.Response.AddHeader("Etag", babylonExport.Hash.ToString());

            await context.Response.OutputStream.WriteAsync(babylonFlatbuffer.Item1, babylonFlatbuffer.Item2,
                                                           babylonFlatbuffer.Item3);

            context.Response.Close();
        }