// Generated by the protocol buffer compiler.  DO NOT EDIT!

#import "ProtocolBuffers.h"

// @@protoc_insertion_point(imports)

@class Environment;
@class EnvironmentBuilder;
#ifndef __has_feature
  #define __has_feature(x) 0 // Compatibility with non-clang compilers.
#endif // __has_feature

#ifndef NS_RETURNS_NOT_RETAINED
  #if __has_feature(attribute_ns_returns_not_retained)
    #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
  #else
    #define NS_RETURNS_NOT_RETAINED
  #endif
#endif

typedef enum {
  EnvironmentOSUnknown = 0,
  EnvironmentOSAndroid = 1,
  EnvironmentOSIos = 2,
} EnvironmentOS;

BOOL EnvironmentOSIsValidValue(EnvironmentOS value);


@interface EnvironmentRoot : NSObject {
}
+ (PBExtensionRegistry*) extensionRegistry;
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry;
@end

@interface Environment : PBGeneratedMessage {
@private
  BOOL hasAppVersion_:1;
  BOOL hasAppVariant_:1;
  BOOL hasOsVersion_:1;
  BOOL hasBuildModel_:1;
  BOOL hasBuildManufacturer_:1;
  BOOL hasMobileCarrier_:1;
  BOOL hasOsType_:1;
  NSString* appVersion;
  NSString* appVariant;
  NSString* osVersion;
  NSString* buildModel;
  NSString* buildManufacturer;
  NSString* mobileCarrier;
  EnvironmentOS osType;
}
- (BOOL) hasAppVersion;
- (BOOL) hasAppVariant;
- (BOOL) hasOsType;
- (BOOL) hasOsVersion;
- (BOOL) hasBuildModel;
- (BOOL) hasBuildManufacturer;
- (BOOL) hasMobileCarrier;
@property (readonly, strong) NSString* appVersion;
@property (readonly, strong) NSString* appVariant;
@property (readonly) EnvironmentOS osType;
@property (readonly, strong) NSString* osVersion;
@property (readonly, strong) NSString* buildModel;
@property (readonly, strong) NSString* buildManufacturer;
@property (readonly, strong) NSString* mobileCarrier;

+ (Environment*) defaultInstance;
- (Environment*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (EnvironmentBuilder*) builder;
+ (EnvironmentBuilder*) builder;
+ (EnvironmentBuilder*) builderWithPrototype:(Environment*) prototype;
- (EnvironmentBuilder*) toBuilder;

+ (Environment*) parseFromData:(NSData*) data;
+ (Environment*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Environment*) parseFromInputStream:(NSInputStream*) input;
+ (Environment*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Environment*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (Environment*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface EnvironmentBuilder : PBGeneratedMessageBuilder {
@private
  Environment* result;
}

- (Environment*) defaultInstance;

- (EnvironmentBuilder*) clear;
- (EnvironmentBuilder*) clone;

- (Environment*) build;
- (Environment*) buildPartial;

- (EnvironmentBuilder*) mergeFrom:(Environment*) other;
- (EnvironmentBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (EnvironmentBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasAppVersion;
- (NSString*) appVersion;
- (EnvironmentBuilder*) setAppVersion:(NSString*) value;
- (EnvironmentBuilder*) clearAppVersion;

- (BOOL) hasAppVariant;
- (NSString*) appVariant;
- (EnvironmentBuilder*) setAppVariant:(NSString*) value;
- (EnvironmentBuilder*) clearAppVariant;

- (BOOL) hasOsType;
- (EnvironmentOS) osType;
- (EnvironmentBuilder*) setOsType:(EnvironmentOS) value;
- (EnvironmentBuilder*) clearOsType;

- (BOOL) hasOsVersion;
- (NSString*) osVersion;
- (EnvironmentBuilder*) setOsVersion:(NSString*) value;
- (EnvironmentBuilder*) clearOsVersion;

- (BOOL) hasBuildModel;
- (NSString*) buildModel;
- (EnvironmentBuilder*) setBuildModel:(NSString*) value;
- (EnvironmentBuilder*) clearBuildModel;

- (BOOL) hasBuildManufacturer;
- (NSString*) buildManufacturer;
- (EnvironmentBuilder*) setBuildManufacturer:(NSString*) value;
- (EnvironmentBuilder*) clearBuildManufacturer;

- (BOOL) hasMobileCarrier;
- (NSString*) mobileCarrier;
- (EnvironmentBuilder*) setMobileCarrier:(NSString*) value;
- (EnvironmentBuilder*) clearMobileCarrier;
@end


// @@protoc_insertion_point(global_scope)
