// services/media_session/public/mojom/audio_focus.mojom-shared.h is auto generated by mojom_bindings_generator.py, do not edit

// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SERVICES_MEDIA_SESSION_PUBLIC_MOJOM_AUDIO_FOCUS_MOJOM_SHARED_H_
#define SERVICES_MEDIA_SESSION_PUBLIC_MOJOM_AUDIO_FOCUS_MOJOM_SHARED_H_

#include <stdint.h>

#include <functional>
#include <iosfwd>
#include <type_traits>
#include <utility>
#include "mojo/public/cpp/bindings/array_data_view.h"
#include "mojo/public/cpp/bindings/enum_traits.h"
#include "mojo/public/cpp/bindings/interface_data_view.h"
#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
#include "mojo/public/cpp/bindings/lib/serialization.h"
#include "mojo/public/cpp/bindings/map_data_view.h"
#include "mojo/public/cpp/bindings/string_data_view.h"

#include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"

#include "services/media_session/public/mojom/audio_focus.mojom-shared-internal.h"
#include "mojo/public/mojom/base/unguessable_token.mojom-shared.h"
#include "services/media_session/public/mojom/media_session.mojom-shared.h"
#include "mojo/public/cpp/bindings/lib/interface_serialization.h"
#include "mojo/public/cpp/system/data_pipe.h"



#ifdef KYTHE_IS_RUNNING
#pragma kythe_inline_metadata "Metadata comment"
#endif


namespace media_session::mojom {
class AudioFocusRequestStateDataView;



}  // media_session::mojom

namespace mojo {
namespace internal {

template <>
struct MojomTypeTraits<::media_session::mojom::AudioFocusRequestStateDataView> {
  using Data = ::media_session::mojom::internal::AudioFocusRequestState_Data;
  using DataAsArrayElement = Pointer<Data>;
  static constexpr MojomTypeCategory category = MojomTypeCategory::kStruct;
};

}  // namespace internal
}  // namespace mojo


namespace media_session::mojom {


// @generated_from: media_session.mojom.EnforcementMode
enum class EnforcementMode : int32_t {
  
// @generated_from: media_session.mojom.EnforcementMode.kDefault
  kDefault = 0,
  
// @generated_from: media_session.mojom.EnforcementMode.kNone
  kNone = 1,
  
// @generated_from: media_session.mojom.EnforcementMode.kSingleGroup
  kSingleGroup = 2,
  
// @generated_from: media_session.mojom.EnforcementMode.kSingleSession
  kSingleSession = 3,
  kMinValue = 0,
  kMaxValue = 3,
};

 std::ostream& operator<<(std::ostream& os, EnforcementMode value);
inline bool IsKnownEnumValue(EnforcementMode value) {
  return internal::EnforcementMode_Data::IsKnownValue(
      static_cast<int32_t>(value));
}


// @generated_from: media_session.mojom.AudioFocusType
enum class AudioFocusType : int32_t {
  
// @generated_from: media_session.mojom.AudioFocusType.kGain
  kGain = 0,
  
// @generated_from: media_session.mojom.AudioFocusType.kGainTransientMayDuck
  kGainTransientMayDuck = 1,
  
// @generated_from: media_session.mojom.AudioFocusType.kGainTransient
  kGainTransient = 2,
  
// @generated_from: media_session.mojom.AudioFocusType.kAmbient
  kAmbient = 3,
  kMinValue = 0,
  kMaxValue = 3,
};

 std::ostream& operator<<(std::ostream& os, AudioFocusType value);
inline bool IsKnownEnumValue(AudioFocusType value) {
  return internal::AudioFocusType_Data::IsKnownValue(
      static_cast<int32_t>(value));
}
// Interface base classes. They are used for type safety check.
class AudioFocusObserverInterfaceBase {};

using AudioFocusObserverPtrDataView =
    mojo::InterfacePtrDataView<AudioFocusObserverInterfaceBase>;
using AudioFocusObserverRequestDataView =
    mojo::InterfaceRequestDataView<AudioFocusObserverInterfaceBase>;
using AudioFocusObserverAssociatedPtrInfoDataView =
    mojo::AssociatedInterfacePtrInfoDataView<AudioFocusObserverInterfaceBase>;
using AudioFocusObserverAssociatedRequestDataView =
    mojo::AssociatedInterfaceRequestDataView<AudioFocusObserverInterfaceBase>;
class AudioFocusRequestClientInterfaceBase {};

using AudioFocusRequestClientPtrDataView =
    mojo::InterfacePtrDataView<AudioFocusRequestClientInterfaceBase>;
using AudioFocusRequestClientRequestDataView =
    mojo::InterfaceRequestDataView<AudioFocusRequestClientInterfaceBase>;
using AudioFocusRequestClientAssociatedPtrInfoDataView =
    mojo::AssociatedInterfacePtrInfoDataView<AudioFocusRequestClientInterfaceBase>;
using AudioFocusRequestClientAssociatedRequestDataView =
    mojo::AssociatedInterfaceRequestDataView<AudioFocusRequestClientInterfaceBase>;
class AudioFocusManagerInterfaceBase {};

using AudioFocusManagerPtrDataView =
    mojo::InterfacePtrDataView<AudioFocusManagerInterfaceBase>;
using AudioFocusManagerRequestDataView =
    mojo::InterfaceRequestDataView<AudioFocusManagerInterfaceBase>;
using AudioFocusManagerAssociatedPtrInfoDataView =
    mojo::AssociatedInterfacePtrInfoDataView<AudioFocusManagerInterfaceBase>;
using AudioFocusManagerAssociatedRequestDataView =
    mojo::AssociatedInterfaceRequestDataView<AudioFocusManagerInterfaceBase>;
class AudioFocusManagerDebugInterfaceBase {};

using AudioFocusManagerDebugPtrDataView =
    mojo::InterfacePtrDataView<AudioFocusManagerDebugInterfaceBase>;
using AudioFocusManagerDebugRequestDataView =
    mojo::InterfaceRequestDataView<AudioFocusManagerDebugInterfaceBase>;
using AudioFocusManagerDebugAssociatedPtrInfoDataView =
    mojo::AssociatedInterfacePtrInfoDataView<AudioFocusManagerDebugInterfaceBase>;
using AudioFocusManagerDebugAssociatedRequestDataView =
    mojo::AssociatedInterfaceRequestDataView<AudioFocusManagerDebugInterfaceBase>;


class AudioFocusRequestStateDataView {
 public:
  AudioFocusRequestStateDataView() = default;

  AudioFocusRequestStateDataView(
      internal::AudioFocusRequestState_Data* data,
      mojo::Message* message)
      : data_(data), message_(message) {}

  bool is_null() const { return !data_; }
  inline void GetSessionInfoDataView(
      ::media_session::mojom::MediaSessionInfoDataView* output);

  template <typename UserType>
  [[nodiscard]] bool ReadSessionInfo(UserType* output) {
    
    auto* pointer = data_->session_info.Get();
    return mojo::internal::Deserialize<::media_session::mojom::MediaSessionInfoDataView>(
        pointer, output, message_);
  }
  template <typename UserType>
  [[nodiscard]] bool ReadAudioFocusType(UserType* output) const {
    auto data_value = data_->audio_focus_type;
    return mojo::internal::Deserialize<::media_session::mojom::AudioFocusType>(
        data_value, output);
  }
  AudioFocusType audio_focus_type() const {
    return ::mojo::internal::ToKnownEnumValueHelper(
          static_cast<::media_session::mojom::AudioFocusType>(data_->audio_focus_type));
  }
  inline void GetSourceNameDataView(
      mojo::StringDataView* output);

  template <typename UserType>
  [[nodiscard]] bool ReadSourceName(UserType* output) {
    
static_assert(
    mojo::internal::IsValidUserTypeForOptionalValue<
        mojo::StringDataView, UserType>(),
    "Attempting to read the optional `source_name` field into a type which "
    "cannot represent a null value. Either wrap the destination object "
    "with std::optional, ensure that any corresponding "
    "{Struct/Union/Array/String}Traits define the necessary IsNull and "
    "SetToNull methods, or use `MaybeReadSourceName` instead "
    "of `ReadSourceName if you're fine with null values being "
    "silently ignored in this case.");
    auto* pointer = data_->header_.version >= 2
                    ? data_->source_name.Get() : nullptr;
    return mojo::internal::Deserialize<mojo::StringDataView>(
        pointer, output, message_);
  }
  inline void GetRequestIdDataView(
      ::mojo_base::mojom::UnguessableTokenDataView* output);

  template <typename UserType>
  [[nodiscard]] bool ReadRequestId(UserType* output) {
    
static_assert(
    mojo::internal::IsValidUserTypeForOptionalValue<
        ::mojo_base::mojom::UnguessableTokenDataView, UserType>(),
    "Attempting to read the optional `request_id` field into a type which "
    "cannot represent a null value. Either wrap the destination object "
    "with std::optional, ensure that any corresponding "
    "{Struct/Union/Array/String}Traits define the necessary IsNull and "
    "SetToNull methods, or use `MaybeReadRequestId` instead "
    "of `ReadRequestId if you're fine with null values being "
    "silently ignored in this case.");
    auto* pointer = data_->header_.version >= 3
                    ? data_->request_id.Get() : nullptr;
    return mojo::internal::Deserialize<::mojo_base::mojom::UnguessableTokenDataView>(
        pointer, output, message_);
  }
  inline void GetSourceIdDataView(
      ::mojo_base::mojom::UnguessableTokenDataView* output);

  template <typename UserType>
  [[nodiscard]] bool ReadSourceId(UserType* output) {
    
static_assert(
    mojo::internal::IsValidUserTypeForOptionalValue<
        ::mojo_base::mojom::UnguessableTokenDataView, UserType>(),
    "Attempting to read the optional `source_id` field into a type which "
    "cannot represent a null value. Either wrap the destination object "
    "with std::optional, ensure that any corresponding "
    "{Struct/Union/Array/String}Traits define the necessary IsNull and "
    "SetToNull methods, or use `MaybeReadSourceId` instead "
    "of `ReadSourceId if you're fine with null values being "
    "silently ignored in this case.");
    auto* pointer = data_->header_.version >= 9
                    ? data_->source_id.Get() : nullptr;
    return mojo::internal::Deserialize<::mojo_base::mojom::UnguessableTokenDataView>(
        pointer, output, message_);
  }
 private:
  internal::AudioFocusRequestState_Data* data_ = nullptr;
  mojo::Message* message_ = nullptr;
};


}  // media_session::mojom

namespace std {

template <>
struct hash<::media_session::mojom::EnforcementMode>
    : public mojo::internal::EnumHashImpl<::media_session::mojom::EnforcementMode> {};

template <>
struct hash<::media_session::mojom::AudioFocusType>
    : public mojo::internal::EnumHashImpl<::media_session::mojom::AudioFocusType> {};

}  // namespace std

namespace mojo {


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::media_session::mojom::EnforcementMode, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = EnumTraits<::media_session::mojom::EnforcementMode, UserType>;

  static void Serialize(UserType input, int32_t* output) {
    *output = static_cast<int32_t>(Traits::ToMojom(input));
  }

  static bool Deserialize(int32_t input, UserType* output) {
    return Traits::FromMojom(::mojo::internal::ToKnownEnumValueHelper(
        static_cast<::media_session::mojom::EnforcementMode>(input)), output);
  }
};

}  // namespace internal


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::media_session::mojom::AudioFocusType, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = EnumTraits<::media_session::mojom::AudioFocusType, UserType>;

  static void Serialize(UserType input, int32_t* output) {
    *output = static_cast<int32_t>(Traits::ToMojom(input));
  }

  static bool Deserialize(int32_t input, UserType* output) {
    return Traits::FromMojom(::mojo::internal::ToKnownEnumValueHelper(
        static_cast<::media_session::mojom::AudioFocusType>(input)), output);
  }
};

}  // namespace internal


namespace internal {

template <typename MaybeConstUserType>
struct Serializer<::media_session::mojom::AudioFocusRequestStateDataView, MaybeConstUserType> {
  using UserType = typename std::remove_const<MaybeConstUserType>::type;
  using Traits = StructTraits<::media_session::mojom::AudioFocusRequestStateDataView, UserType>;

  static void Serialize(
      MaybeConstUserType& input,
      mojo::internal::MessageFragment<::media_session::mojom::internal::AudioFocusRequestState_Data>& fragment) {
    if (CallIsNullIfExists<Traits>(input))
      return;
    fragment.Allocate();
    decltype(Traits::session_info(input)) in_session_info = Traits::session_info(input);
    mojo::internal::MessageFragment<
        typename decltype(fragment->session_info)::BaseType> session_info_fragment(
            fragment.message());
    mojo::internal::Serialize<::media_session::mojom::MediaSessionInfoDataView>(
        in_session_info, session_info_fragment);
    fragment->session_info.Set(
        session_info_fragment.is_null() ? nullptr : session_info_fragment.data());
    MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
        fragment->session_info.is_null(),
        mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
        "null session_info in AudioFocusRequestState struct");
    mojo::internal::Serialize<::media_session::mojom::AudioFocusType>(
        Traits::audio_focus_type(input), &fragment->audio_focus_type);
    decltype(Traits::source_name(input)) in_source_name = Traits::source_name(input);
    mojo::internal::MessageFragment<
        typename decltype(fragment->source_name)::BaseType> source_name_fragment(
            fragment.message());
    mojo::internal::Serialize<mojo::StringDataView>(
        in_source_name, source_name_fragment);
    fragment->source_name.Set(
        source_name_fragment.is_null() ? nullptr : source_name_fragment.data());
    decltype(Traits::request_id(input)) in_request_id = Traits::request_id(input);
    mojo::internal::MessageFragment<
        typename decltype(fragment->request_id)::BaseType> request_id_fragment(
            fragment.message());
    mojo::internal::Serialize<::mojo_base::mojom::UnguessableTokenDataView>(
        in_request_id, request_id_fragment);
    fragment->request_id.Set(
        request_id_fragment.is_null() ? nullptr : request_id_fragment.data());
    decltype(Traits::source_id(input)) in_source_id = Traits::source_id(input);
    mojo::internal::MessageFragment<
        typename decltype(fragment->source_id)::BaseType> source_id_fragment(
            fragment.message());
    mojo::internal::Serialize<::mojo_base::mojom::UnguessableTokenDataView>(
        in_source_id, source_id_fragment);
    fragment->source_id.Set(
        source_id_fragment.is_null() ? nullptr : source_id_fragment.data());
  }

  static bool Deserialize(::media_session::mojom::internal::AudioFocusRequestState_Data* input,
                          UserType* output,
                          Message* message) {
    if (!input)
      return CallSetToNullIfExists<Traits>(output);

    ::media_session::mojom::AudioFocusRequestStateDataView data_view(input, message);
    return Traits::Read(data_view, output);
  }
};

}  // namespace internal

}  // namespace mojo


namespace media_session::mojom {

inline void AudioFocusRequestStateDataView::GetSessionInfoDataView(
    ::media_session::mojom::MediaSessionInfoDataView* output) {
  auto pointer = data_->session_info.Get();
  *output = ::media_session::mojom::MediaSessionInfoDataView(pointer, message_);
}
inline void AudioFocusRequestStateDataView::GetSourceNameDataView(
    mojo::StringDataView* output) {
  auto pointer = data_->header_.version >= 2
                 ? data_->source_name.Get() : nullptr;
  *output = mojo::StringDataView(pointer, message_);
}
inline void AudioFocusRequestStateDataView::GetRequestIdDataView(
    ::mojo_base::mojom::UnguessableTokenDataView* output) {
  auto pointer = data_->header_.version >= 3
                 ? data_->request_id.Get() : nullptr;
  *output = ::mojo_base::mojom::UnguessableTokenDataView(pointer, message_);
}
inline void AudioFocusRequestStateDataView::GetSourceIdDataView(
    ::mojo_base::mojom::UnguessableTokenDataView* output) {
  auto pointer = data_->header_.version >= 9
                 ? data_->source_id.Get() : nullptr;
  *output = ::mojo_base::mojom::UnguessableTokenDataView(pointer, message_);
}



}  // media_session::mojom

// Declare TraceFormatTraits for enums, which should be defined in ::perfetto
// namespace.

namespace perfetto {

template <>
struct  TraceFormatTraits<::media_session::mojom::EnforcementMode> {
 static void WriteIntoTrace(perfetto::TracedValue context, ::media_session::mojom::EnforcementMode value);
};

} // namespace perfetto

namespace perfetto {

template <>
struct  TraceFormatTraits<::media_session::mojom::AudioFocusType> {
 static void WriteIntoTrace(perfetto::TracedValue context, ::media_session::mojom::AudioFocusType value);
};

} // namespace perfetto

#endif  // SERVICES_MEDIA_SESSION_PUBLIC_MOJOM_AUDIO_FOCUS_MOJOM_SHARED_H_
/* Metadata comment
eyJ0eXBlIjogImt5dGhlMCIsICJtZXRhIjogW3sidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJi
ZWdpbiI6IDE5OTcsICJlbmQiOiAyMDEyLCAidm5hbWUiOiB7Imxhbmd1YWdlIjogIm1vam9tIiwg
ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2NvZGVzZWFyY2gvY2hyb21pdW0v
c3JjLy9tYWluIiwgInNpZ25hdHVyZSI6ICJtZWRpYV9zZXNzaW9uLm1vam9tLkVuZm9yY2VtZW50
TW9kZSJ9LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIn0sIHsidHlwZSI6ICJhbmNo
b3JfZGVmaW5lcyIsICJiZWdpbiI6IDIwOTUsICJlbmQiOiAyMTAzLCAidm5hbWUiOiB7Imxhbmd1
YWdlIjogIm1vam9tIiwgImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2NvZGVz
ZWFyY2gvY2hyb21pdW0vc3JjLy9tYWluIiwgInNpZ25hdHVyZSI6ICJtZWRpYV9zZXNzaW9uLm1v
am9tLkVuZm9yY2VtZW50TW9kZS5rRGVmYXVsdCJ9LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2Vu
ZXJhdGVzIn0sIHsidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJiZWdpbiI6IDIxNzYsICJlbmQi
OiAyMTgxLCAidm5hbWUiOiB7Imxhbmd1YWdlIjogIm1vam9tIiwgImNvcnB1cyI6ICJjaHJvbWl1
bS5nb29nbGVzb3VyY2UuY29tL2NvZGVzZWFyY2gvY2hyb21pdW0vc3JjLy9tYWluIiwgInNpZ25h
dHVyZSI6ICJtZWRpYV9zZXNzaW9uLm1vam9tLkVuZm9yY2VtZW50TW9kZS5rTm9uZSJ9LCAiZWRn
ZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIn0sIHsidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIs
ICJiZWdpbiI6IDIyNjEsICJlbmQiOiAyMjczLCAidm5hbWUiOiB7Imxhbmd1YWdlIjogIm1vam9t
IiwgImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2NvZGVzZWFyY2gvY2hyb21p
dW0vc3JjLy9tYWluIiwgInNpZ25hdHVyZSI6ICJtZWRpYV9zZXNzaW9uLm1vam9tLkVuZm9yY2Vt
ZW50TW9kZS5rU2luZ2xlR3JvdXAifSwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyJ9
LCB7InR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAiYmVnaW4iOiAyMzU1LCAiZW5kIjogMjM2OSwg
InZuYW1lIjogeyJsYW5ndWFnZSI6ICJtb2pvbSIsICJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xl
c291cmNlLmNvbS9jb2Rlc2VhcmNoL2Nocm9taXVtL3NyYy8vbWFpbiIsICJzaWduYXR1cmUiOiAi
bWVkaWFfc2Vzc2lvbi5tb2pvbS5FbmZvcmNlbWVudE1vZGUua1NpbmdsZVNlc3Npb24ifSwgImVk
Z2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyJ9LCB7InR5cGUiOiAiYW5jaG9yX2RlZmluZXMi
LCAiYmVnaW4iOiAyNjk2LCAiZW5kIjogMjcxMCwgInZuYW1lIjogeyJsYW5ndWFnZSI6ICJtb2pv
bSIsICJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jb2Rlc2VhcmNoL2Nocm9t
aXVtL3NyYy8vbWFpbiIsICJzaWduYXR1cmUiOiAibWVkaWFfc2Vzc2lvbi5tb2pvbS5BdWRpb0Zv
Y3VzVHlwZSJ9LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIn0sIHsidHlwZSI6ICJh
bmNob3JfZGVmaW5lcyIsICJiZWdpbiI6IDI3ODksICJlbmQiOiAyNzk0LCAidm5hbWUiOiB7Imxh
bmd1YWdlIjogIm1vam9tIiwgImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nv
ZGVzZWFyY2gvY2hyb21pdW0vc3JjLy9tYWluIiwgInNpZ25hdHVyZSI6ICJtZWRpYV9zZXNzaW9u
Lm1vam9tLkF1ZGlvRm9jdXNUeXBlLmtHYWluIn0sICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5l
cmF0ZXMifSwgeyJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgImJlZ2luIjogMjg4MiwgImVuZCI6
IDI5MDMsICJ2bmFtZSI6IHsibGFuZ3VhZ2UiOiAibW9qb20iLCAiY29ycHVzIjogImNocm9taXVt
Lmdvb2dsZXNvdXJjZS5jb20vY29kZXNlYXJjaC9jaHJvbWl1bS9zcmMvL21haW4iLCAic2lnbmF0
dXJlIjogIm1lZGlhX3Nlc3Npb24ubW9qb20uQXVkaW9Gb2N1c1R5cGUua0dhaW5UcmFuc2llbnRN
YXlEdWNrIn0sICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMifSwgeyJ0eXBlIjogImFu
Y2hvcl9kZWZpbmVzIiwgImJlZ2luIjogMjk4NCwgImVuZCI6IDI5OTgsICJ2bmFtZSI6IHsibGFu
Z3VhZ2UiOiAibW9qb20iLCAiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY29k
ZXNlYXJjaC9jaHJvbWl1bS9zcmMvL21haW4iLCAic2lnbmF0dXJlIjogIm1lZGlhX3Nlc3Npb24u
bW9qb20uQXVkaW9Gb2N1c1R5cGUua0dhaW5UcmFuc2llbnQifSwgImVkZ2UiOiAiJS9reXRoZS9l
ZGdlL2dlbmVyYXRlcyJ9LCB7InR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAiYmVnaW4iOiAzMDcz
LCAiZW5kIjogMzA4MSwgInZuYW1lIjogeyJsYW5ndWFnZSI6ICJtb2pvbSIsICJjb3JwdXMiOiAi
Y2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jb2Rlc2VhcmNoL2Nocm9taXVtL3NyYy8vbWFpbiIs
ICJzaWduYXR1cmUiOiAibWVkaWFfc2Vzc2lvbi5tb2pvbS5BdWRpb0ZvY3VzVHlwZS5rQW1iaWVu
dCJ9LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIn1dfQ==
*/