text: #import <Foundation/Foundation.h>
  
  typedef NS_ENUM(NSInteger, BTClientMetadataSourceType) {
      BTClientMetadataSourceUnknown = 0,
      BTClientMetadataSourcePayPalApp,
      BTClientMetadataSourcePayPalBrowser,
      BTClientMetadataSourceVenmoApp,
      BTClientMetadataSourceForm,
  };
  
  typedef NS_ENUM(NSInteger, BTClientMetadataIntegrationType) {
      BTClientMetadataIntegrationCustom,
      BTClientMetadataIntegrationDropIn,
      BTClientMetadataIntegrationDropIn2,
      BTClientMetadataIntegrationUnknown
  };
  
  NS_ASSUME_NONNULL_BEGIN
  
  /**
   @class BTClientMetadata
   @brief Represents the metadata associated with a session for posting along with payment data during tokenization
  
   @discussion When a payment method is tokenized, the client api accepts parameters under
   _meta which are used to determine where payment data originated.
  
   In general, this data may evolve and be used in different ways by different
   integrations in a single app. For example, if both Apple Pay and drop in are
   used. In this case, the source and integration may change over time, while
   the sessionId should remain constant. To achieve this, users of this class
   should use `mutableCopy` to create a new copy based on the existing session
   and then update the object as needed.
  */
  @interface BTClientMetadata : NSObject <NSCopying, NSMutableCopying>
  
  @property (nonatomic, assign, readonly) BTClientMetadataIntegrationType integration;
  @property (nonatomic, assign, readonly) BTClientMetadataSourceType source;
  
  /**
   @brief Auto-generated UUID
  */
  @property (nonatomic, copy, readonly) NSString *sessionId;
  
  #pragma mark Derived Properties
  
  @property (nonatomic, copy, readonly) NSString *integrationString;
  @property (nonatomic, copy, readonly) NSString *sourceString;
  @property (nonatomic, strong, readonly) NSDictionary *parameters;
  
  @end
  
  @interface BTMutableClientMetadata : BTClientMetadata
  
  - (void)setIntegration:(BTClientMetadataIntegrationType)integration;
  - (void)setSource:(BTClientMetadataSourceType)source;
  - (void)setSessionId:(NSString *)sessionId;
  
  @end
  
  NS_ASSUME_NONNULL_END
  