├── .gitignore ├── requirements.txt ├── README.md ├── Common_pb2.py ├── WholeLandTokenData_pb2.py ├── GetFriendData_pb2.py ├── Error_pb2.py ├── AuthData_pb2.py ├── PurchaseData_pb2.py ├── friend_puller.py └── LandData_pb2.py /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | *.bak 3 | /__pycache__ 4 | /towns 5 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | protobuf>=5.29.2 2 | requests 3 | pycryptodome -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tsto_friend_puller 2 | Tool for downloading you and your friends' The Simpsons: Tapped Out towns 3 | 4 | 5 | # How to use 6 | 7 | Once you have installed the necessary modules (see the requirements.txt file), 8 | simply run the script as: 9 | 10 | ```python friend_puller.py``` 11 | 12 | The script will ask you for your email address. This will generate a verification 13 | code that is sent to your email. Enter the verification code at the prompt and 14 | the script will begin by first downloading your town (and your currency state) 15 | immediately followed by pulling the towns of each of your friends. 16 | 17 | All saved towns (yours and your friends) are stored in the towns\ directory. 18 | These worlds can be loaded using one of the local TSTO servers available such as 19 | [TSTO Server](https://github.com/tjac/tsto_server) or [GameServer-Reborn](https://github.com/TappedOutReborn/GameServer-Reborn). -------------------------------------------------------------------------------- /Common_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # NO CHECKED-IN PROTOBUF GENCODE 4 | # source: Common.proto 5 | # Protobuf Python Version: 5.28.3 6 | """Generated protocol buffer code.""" 7 | from google.protobuf import descriptor as _descriptor 8 | from google.protobuf import descriptor_pool as _descriptor_pool 9 | from google.protobuf import runtime_version as _runtime_version 10 | from google.protobuf import symbol_database as _symbol_database 11 | from google.protobuf.internal import builder as _builder 12 | _runtime_version.ValidateProtobufRuntimeVersion( 13 | _runtime_version.Domain.PUBLIC, 14 | 5, 15 | 28, 16 | 3, 17 | '', 18 | 'Common.proto' 19 | ) 20 | # @@protoc_insertion_point(imports) 21 | 22 | _sym_db = _symbol_database.Default() 23 | 24 | 25 | 26 | 27 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0c\x43ommon.proto\x12\x04\x44\x61ta\"E\n\tNameValue\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05value\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x07\n\x05_nameB\x08\n\x06_value\"5\n\x0cNameValueSet\x12%\n\x0cnameValueSet\x18\x01 \x03(\x0b\x32\x0f.Data.NameValueB\x16\n\x14\x63om.ea.simpsons.datab\x06proto3') 28 | 29 | _globals = globals() 30 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) 31 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'Common_pb2', _globals) 32 | if not _descriptor._USE_C_DESCRIPTORS: 33 | _globals['DESCRIPTOR']._loaded_options = None 34 | _globals['DESCRIPTOR']._serialized_options = b'\n\024com.ea.simpsons.data' 35 | _globals['_NAMEVALUE']._serialized_start=22 36 | _globals['_NAMEVALUE']._serialized_end=91 37 | _globals['_NAMEVALUESET']._serialized_start=93 38 | _globals['_NAMEVALUESET']._serialized_end=146 39 | # @@protoc_insertion_point(module_scope) 40 | -------------------------------------------------------------------------------- /WholeLandTokenData_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # NO CHECKED-IN PROTOBUF GENCODE 4 | # source: WholeLandTokenData.proto 5 | # Protobuf Python Version: 5.28.3 6 | """Generated protocol buffer code.""" 7 | from google.protobuf import descriptor as _descriptor 8 | from google.protobuf import descriptor_pool as _descriptor_pool 9 | from google.protobuf import runtime_version as _runtime_version 10 | from google.protobuf import symbol_database as _symbol_database 11 | from google.protobuf.internal import builder as _builder 12 | _runtime_version.ValidateProtobufRuntimeVersion( 13 | _runtime_version.Domain.PUBLIC, 14 | 5, 15 | 28, 16 | 3, 17 | '', 18 | 'WholeLandTokenData.proto' 19 | ) 20 | # @@protoc_insertion_point(imports) 21 | 22 | _sym_db = _symbol_database.Default() 23 | 24 | 25 | 26 | 27 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18WholeLandTokenData.proto\x12\x04\x44\x61ta\"=\n\x15WholeLandTokenRequest\x12\x16\n\trequestId\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x0c\n\n_requestId\"Z\n\x16WholeLandTokenResponse\x12\x12\n\x05token\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08\x63onflict\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x08\n\x06_tokenB\x0b\n\t_conflict\"2\n\x12\x44\x65leteTokenRequest\x12\x12\n\x05token\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_token\"5\n\x13\x44\x65leteTokenResponse\x12\x13\n\x06result\x18\x01 \x01(\x08H\x00\x88\x01\x01\x42\t\n\x07_resultB\x16\n\x14\x63om.ea.simpsons.datab\x06proto3') 28 | 29 | _globals = globals() 30 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) 31 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'WholeLandTokenData_pb2', _globals) 32 | if not _descriptor._USE_C_DESCRIPTORS: 33 | _globals['DESCRIPTOR']._loaded_options = None 34 | _globals['DESCRIPTOR']._serialized_options = b'\n\024com.ea.simpsons.data' 35 | _globals['_WHOLELANDTOKENREQUEST']._serialized_start=34 36 | _globals['_WHOLELANDTOKENREQUEST']._serialized_end=95 37 | _globals['_WHOLELANDTOKENRESPONSE']._serialized_start=97 38 | _globals['_WHOLELANDTOKENRESPONSE']._serialized_end=187 39 | _globals['_DELETETOKENREQUEST']._serialized_start=189 40 | _globals['_DELETETOKENREQUEST']._serialized_end=239 41 | _globals['_DELETETOKENRESPONSE']._serialized_start=241 42 | _globals['_DELETETOKENRESPONSE']._serialized_end=294 43 | # @@protoc_insertion_point(module_scope) 44 | -------------------------------------------------------------------------------- /GetFriendData_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # NO CHECKED-IN PROTOBUF GENCODE 4 | # source: GetFriendData.proto 5 | # Protobuf Python Version: 5.28.3 6 | """Generated protocol buffer code.""" 7 | from google.protobuf import descriptor as _descriptor 8 | from google.protobuf import descriptor_pool as _descriptor_pool 9 | from google.protobuf import runtime_version as _runtime_version 10 | from google.protobuf import symbol_database as _symbol_database 11 | from google.protobuf.internal import builder as _builder 12 | _runtime_version.ValidateProtobufRuntimeVersion( 13 | _runtime_version.Domain.PUBLIC, 14 | 5, 15 | 28, 16 | 3, 17 | '', 18 | 'GetFriendData.proto' 19 | ) 20 | # @@protoc_insertion_point(imports) 21 | 22 | _sym_db = _symbol_database.Default() 23 | 24 | 25 | import LandData_pb2 as LandData__pb2 26 | import Error_pb2 as Error__pb2 27 | 28 | 29 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13GetFriendData.proto\x12\x04\x44\x61ta\x1a\x0eLandData.proto\x1a\x0b\x45rror.proto\"(\n\x14GetFriendDataRequest\x12\x10\n\x08\x66riendId\x18\x01 \x03(\t\"\xdf\x04\n\x15GetFriendDataResponse\x12>\n\nfriendData\x18\x01 \x03(\x0b\x32*.Data.GetFriendDataResponse.FriendDataPair\x12&\n\x05\x65rror\x18\x02 \x01(\x0b\x32\x12.Data.ErrorMessageH\x00\x88\x01\x01\x1a\xd3\x03\n\x0e\x46riendDataPair\x12\x15\n\x08\x66riendId\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x35\n\nfriendData\x18\x02 \x01(\x0b\x32\x1c.Data.LandMessage.FriendDataH\x01\x88\x01\x01\x12N\n\x05\x65rror\x18\x03 \x01(\x0b\x32:.Data.GetFriendDataResponse.FriendDataPair.FriendDataErrorH\x02\x88\x01\x01\x12P\n\x0b\x61uthService\x18\x04 \x01(\x0e\x32\x36.Data.GetFriendDataResponse.FriendDataPair.AuthServiceH\x03\x88\x01\x01\x12\x17\n\nexternalId\x18\x05 \x01(\tH\x04\x88\x01\x01\x1aI\n\x0f\x46riendDataError\x12\x11\n\x04\x63ode\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x11\n\x04type\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x07\n\x05_codeB\x07\n\x05_type\"(\n\x0b\x41uthService\x12\x0b\n\x07NUCLEUS\x10\x00\x12\x0c\n\x08\x46\x41\x43\x45\x42OOK\x10\x01\x42\x0b\n\t_friendIdB\r\n\x0b_friendDataB\x08\n\x06_errorB\x0e\n\x0c_authServiceB\r\n\x0b_externalIdB\x08\n\x06_errorB\x16\n\x14\x63om.ea.simpsons.datab\x06proto3') 30 | 31 | _globals = globals() 32 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) 33 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'GetFriendData_pb2', _globals) 34 | if not _descriptor._USE_C_DESCRIPTORS: 35 | _globals['DESCRIPTOR']._loaded_options = None 36 | _globals['DESCRIPTOR']._serialized_options = b'\n\024com.ea.simpsons.data' 37 | _globals['_GETFRIENDDATAREQUEST']._serialized_start=58 38 | _globals['_GETFRIENDDATAREQUEST']._serialized_end=98 39 | _globals['_GETFRIENDDATARESPONSE']._serialized_start=101 40 | _globals['_GETFRIENDDATARESPONSE']._serialized_end=708 41 | _globals['_GETFRIENDDATARESPONSE_FRIENDDATAPAIR']._serialized_start=231 42 | _globals['_GETFRIENDDATARESPONSE_FRIENDDATAPAIR']._serialized_end=698 43 | _globals['_GETFRIENDDATARESPONSE_FRIENDDATAPAIR_FRIENDDATAERROR']._serialized_start=514 44 | _globals['_GETFRIENDDATARESPONSE_FRIENDDATAPAIR_FRIENDDATAERROR']._serialized_end=587 45 | _globals['_GETFRIENDDATARESPONSE_FRIENDDATAPAIR_AUTHSERVICE']._serialized_start=589 46 | _globals['_GETFRIENDDATARESPONSE_FRIENDDATAPAIR_AUTHSERVICE']._serialized_end=629 47 | # @@protoc_insertion_point(module_scope) 48 | -------------------------------------------------------------------------------- /Error_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # NO CHECKED-IN PROTOBUF GENCODE 4 | # source: Error.proto 5 | # Protobuf Python Version: 5.28.3 6 | """Generated protocol buffer code.""" 7 | from google.protobuf import descriptor as _descriptor 8 | from google.protobuf import descriptor_pool as _descriptor_pool 9 | from google.protobuf import runtime_version as _runtime_version 10 | from google.protobuf import symbol_database as _symbol_database 11 | from google.protobuf.internal import builder as _builder 12 | _runtime_version.ValidateProtobufRuntimeVersion( 13 | _runtime_version.Domain.PUBLIC, 14 | 5, 15 | 28, 16 | 3, 17 | '', 18 | 'Error.proto' 19 | ) 20 | # @@protoc_insertion_point(imports) 21 | 22 | _sym_db = _symbol_database.Default() 23 | 24 | 25 | 26 | 27 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0b\x45rror.proto\x12\x04\x44\x61ta\"\xae\x07\n\x0c\x45rrorMessage\x12%\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x17.Data.ErrorMessage.Code\x12%\n\x04type\x18\x02 \x01(\x0e\x32\x17.Data.ErrorMessage.Type\x12\r\n\x05\x66ield\x18\x03 \x01(\t\x12-\n\x08severity\x18\x04 \x01(\x0e\x32\x1b.Data.ErrorMessage.Severity\x12\x0f\n\x07message\x18\x05 \x01(\t\"\xc9\x01\n\x04\x43ode\x12\x10\n\x0cUNKNOWN_CODE\x10\x01\x12\x11\n\x0cUNAUTHORIZED\x10\x91\x03\x12\x0e\n\tNOT_FOUND\x10\x94\x03\x12\r\n\x08\x43ONFLICT\x10\x99\x03\x12\x1a\n\x15INTERNAL_SERVER_ERROR\x10\xf4\x03\x12\x14\n\x0fNOT_IMPLEMENTED\x10\xf5\x03\x12\x18\n\x13SERVICE_UNAVAILABLE\x10\xf7\x03\x12\x1f\n\x1aHTTP_VERSION_NOT_SUPPORTED\x10\xf9\x03\x12\x10\n\x0b\x42\x41\x44_REQUEST\x10\x90\x03\"\xd5\x03\n\x04Type\x12\x11\n\rUNKNOWN_ERROR\x10\x01\x12\x18\n\x14\x41UTHENTICATION_ERROR\x10\x02\x12\x12\n\x0eNO_SUCH_METHOD\x10\x03\x12\x14\n\x10NO_SUCH_RESOURCE\x10\x04\x12\x11\n\rMISSING_VALUE\x10\x05\x12\x11\n\rINVALID_VALUE\x10\x06\x12\x13\n\x0fVALUE_TOO_SMALL\x10\x07\x12\x13\n\x0fVALUE_TOO_LARGE\x10\x08\x12\x1b\n\x17RESOURCE_ALREADY_EXISTS\x10\t\x12\x1b\n\x17METHOD_CALLED_TOO_OFTEN\x10\x17\x12\x1d\n\x19INVALID_PARAMETERS_FORMAT\x10\x18\x12&\n\"LOCK_REQUEST_FAILED_DUE_TO_TIMEOUT\x10\x1a\x12\x15\n\x11PROTOCOL_MISMATCH\x10\x1c\x12\x12\n\x0e\x44\x41TABASE_ERROR\x10\x1d\x12\x1c\n\x18SERVICE_UNAVAILABLE_TYPE\x10\x1e\x12\x18\n\x14NOT_IMPLEMENTED_TYPE\x10\x1f\x12\x10\n\x0cSERVER_ERROR\x10 \x12\x1b\n\x17SHARD_UNDER_MAINTENANCE\x10\"\x12\x13\n\x0fPLUGIN_INACTIVE\x10#\"]\n\x08Severity\x12\x0f\n\x0bLEVEL_DEBUG\x10\x00\x12\x0e\n\nLEVEL_INFO\x10\x01\x12\x0e\n\nLEVEL_WARN\x10\x02\x12\x0f\n\x0bLEVEL_ERROR\x10\x03\x12\x0f\n\x0bLEVEL_FATAL\x10\x04\x42\x16\n\x14\x63om.ea.simpsons.data') 28 | 29 | _globals = globals() 30 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) 31 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'Error_pb2', _globals) 32 | if not _descriptor._USE_C_DESCRIPTORS: 33 | _globals['DESCRIPTOR']._loaded_options = None 34 | _globals['DESCRIPTOR']._serialized_options = b'\n\024com.ea.simpsons.data' 35 | _globals['_ERRORMESSAGE']._serialized_start=22 36 | _globals['_ERRORMESSAGE']._serialized_end=964 37 | _globals['_ERRORMESSAGE_CODE']._serialized_start=196 38 | _globals['_ERRORMESSAGE_CODE']._serialized_end=397 39 | _globals['_ERRORMESSAGE_TYPE']._serialized_start=400 40 | _globals['_ERRORMESSAGE_TYPE']._serialized_end=869 41 | _globals['_ERRORMESSAGE_SEVERITY']._serialized_start=871 42 | _globals['_ERRORMESSAGE_SEVERITY']._serialized_end=964 43 | # @@protoc_insertion_point(module_scope) 44 | -------------------------------------------------------------------------------- /AuthData_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # NO CHECKED-IN PROTOBUF GENCODE 4 | # source: AuthData.proto 5 | # Protobuf Python Version: 5.28.3 6 | """Generated protocol buffer code.""" 7 | from google.protobuf import descriptor as _descriptor 8 | from google.protobuf import descriptor_pool as _descriptor_pool 9 | from google.protobuf import runtime_version as _runtime_version 10 | from google.protobuf import symbol_database as _symbol_database 11 | from google.protobuf.internal import builder as _builder 12 | _runtime_version.ValidateProtobufRuntimeVersion( 13 | _runtime_version.Domain.PUBLIC, 14 | 5, 15 | 28, 16 | 3, 17 | '', 18 | 'AuthData.proto' 19 | ) 20 | # @@protoc_insertion_point(imports) 21 | 22 | _sym_db = _symbol_database.Default() 23 | 24 | 25 | import Error_pb2 as Error__pb2 26 | 27 | 28 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0e\x41uthData.proto\x12\x04\x44\x61ta\x1a\x0b\x45rror.proto\"\\\n\x10UserIndirectData\x12\x13\n\x06userId\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0btelemetryId\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\t\n\x07_userIdB\x0e\n\x0c_telemetryId\"=\n\x11\x41nonymousUserData\x12\x18\n\x0bisAnonymous\x18\x01 \x01(\x08H\x00\x88\x01\x01\x42\x0e\n\x0c_isAnonymous\"c\n\tTokenData\x12\x17\n\nsessionKey\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1b\n\x0e\x65xpirationDate\x18\x02 \x01(\x03H\x01\x88\x01\x01\x42\r\n\x0b_sessionKeyB\x11\n\x0f_expirationDate\"y\n\x14UsersResponseMessage\x12)\n\x04user\x18\x01 \x01(\x0b\x32\x16.Data.UserIndirectDataH\x00\x88\x01\x01\x12#\n\x05token\x18\x02 \x01(\x0b\x32\x0f.Data.TokenDataH\x01\x88\x01\x01\x42\x07\n\x05_userB\x08\n\x06_token\"\x9f\x02\n\x08LinkData\x12\x34\n\nsourceType\x18\x01 \x01(\x0e\x32\x1b.Data.LinkData.identityTypeH\x00\x88\x01\x01\x12\x15\n\x08sourceId\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x39\n\x0f\x64\x65stinationType\x18\x03 \x01(\x0e\x32\x1b.Data.LinkData.identityTypeH\x02\x88\x01\x01\x12\x1a\n\rdestinationId\x18\x04 \x01(\tH\x03\x88\x01\x01\"-\n\x0cidentityType\x12\n\n\x06TNT_ID\x10\x00\x12\x11\n\rNUCLEUS_TOKEN\x10\x01\x42\r\n\x0b_sourceTypeB\x0b\n\t_sourceIdB\x12\n\x10_destinationTypeB\x10\n\x0e_destinationId\"\xbf\x01\n\x17LinkUserResponseMessage\x12\x13\n\x06userId\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nexternalId\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x19\n\x0c\x65xternalType\x18\x03 \x01(\tH\x02\x88\x01\x01\x12&\n\x05\x65rror\x18\x04 \x01(\x0b\x32\x12.Data.ErrorMessageH\x03\x88\x01\x01\x42\t\n\x07_userIdB\r\n\x0b_externalIdB\x0f\n\r_externalTypeB\x08\n\x06_error\"m\n\x19\x44\x65leteUserResponseMessage\x12\x13\n\x06userId\x18\x01 \x01(\tH\x00\x88\x01\x01\x12&\n\x05\x65rror\x18\x02 \x01(\x0b\x32\x12.Data.ErrorMessageH\x01\x88\x01\x01\x42\t\n\x07_userIdB\x08\n\x06_errorB!\n\x1f\x63om.eamobile.mayhem.plugin.datab\x06proto3') 29 | 30 | _globals = globals() 31 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) 32 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'AuthData_pb2', _globals) 33 | if not _descriptor._USE_C_DESCRIPTORS: 34 | _globals['DESCRIPTOR']._loaded_options = None 35 | _globals['DESCRIPTOR']._serialized_options = b'\n\037com.eamobile.mayhem.plugin.data' 36 | _globals['_USERINDIRECTDATA']._serialized_start=37 37 | _globals['_USERINDIRECTDATA']._serialized_end=129 38 | _globals['_ANONYMOUSUSERDATA']._serialized_start=131 39 | _globals['_ANONYMOUSUSERDATA']._serialized_end=192 40 | _globals['_TOKENDATA']._serialized_start=194 41 | _globals['_TOKENDATA']._serialized_end=293 42 | _globals['_USERSRESPONSEMESSAGE']._serialized_start=295 43 | _globals['_USERSRESPONSEMESSAGE']._serialized_end=416 44 | _globals['_LINKDATA']._serialized_start=419 45 | _globals['_LINKDATA']._serialized_end=706 46 | _globals['_LINKDATA_IDENTITYTYPE']._serialized_start=595 47 | _globals['_LINKDATA_IDENTITYTYPE']._serialized_end=640 48 | _globals['_LINKUSERRESPONSEMESSAGE']._serialized_start=709 49 | _globals['_LINKUSERRESPONSEMESSAGE']._serialized_end=900 50 | _globals['_DELETEUSERRESPONSEMESSAGE']._serialized_start=902 51 | _globals['_DELETEUSERRESPONSEMESSAGE']._serialized_end=1011 52 | # @@protoc_insertion_point(module_scope) 53 | -------------------------------------------------------------------------------- /PurchaseData_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # NO CHECKED-IN PROTOBUF GENCODE 4 | # source: PurchaseData.proto 5 | # Protobuf Python Version: 5.28.3 6 | """Generated protocol buffer code.""" 7 | from google.protobuf import descriptor as _descriptor 8 | from google.protobuf import descriptor_pool as _descriptor_pool 9 | from google.protobuf import runtime_version as _runtime_version 10 | from google.protobuf import symbol_database as _symbol_database 11 | from google.protobuf.internal import builder as _builder 12 | _runtime_version.ValidateProtobufRuntimeVersion( 13 | _runtime_version.Domain.PUBLIC, 14 | 5, 15 | 28, 16 | 3, 17 | '', 18 | 'PurchaseData.proto' 19 | ) 20 | # @@protoc_insertion_point(imports) 21 | 22 | _sym_db = _symbol_database.Default() 23 | 24 | 25 | 26 | 27 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12PurchaseData.proto\x12\x04\x44\x61ta\"S\n\x11PurchasedItemData\x12\x11\n\tproductId\x18\x01 \x01(\t\x12\x15\n\rpurchasePrice\x18\x02 \x01(\t\x12\x14\n\x0cpurchaseDate\x18\x03 \x01(\x03\"\x99\x01\n\x0c\x43urrencyData\x12\n\n\x02id\x18\x01 \x01(\t\x12\x18\n\x10vcTotalPurchased\x18\x02 \x01(\x05\x12\x16\n\x0evcTotalAwarded\x18\x03 \x01(\x05\x12\x11\n\tvcBalance\x18\x04 \x01(\x05\x12\x11\n\tcreatedAt\x18\x05 \x01(\x03\x12\x11\n\tupdatedAt\x18\x06 \x01(\x03\x12\x12\n\nunverified\x18\x07 \x01(\x05\"/\n\x11PurchaseErrorData\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0c\n\x04type\x18\x02 \x01(\t\"\xe6\x01\n\x17PurchaseResponseMessage\x12$\n\x08\x63urrency\x18\x01 \x01(\x0b\x32\x12.Data.CurrencyData\x12*\n\tpurchases\x18\x02 \x03(\x0b\x32\x17.Data.PurchasedItemData\x12&\n\x05\x65rror\x18\x03 \x01(\x0b\x32\x17.Data.PurchaseErrorData\x12\"\n\torderData\x18\x04 \x03(\x0b\x32\x0f.Data.OrderData\x12-\n\rsubscriptions\x18\x05 \x03(\x0b\x32\x16.Data.SubscriptionData\"\xb1\x07\n\x16PurchaseRequestMessage\x12\x0f\n\x07receipt\x18\x01 \x01(\t\x12\x12\n\nsignedData\x18\x02 \x01(\t\x12\x11\n\tsignature\x18\x03 \x01(\t\x12(\n\x08platform\x18\x04 \x01(\x0e\x32\x16.Data.PurchasePlatform\x12\x15\n\rpurchaseToken\x18\x05 \x01(\t\x12\x14\n\x0c\x61mazonUserId\x18\x06 \x01(\t\x12=\n\x0bpaymentInfo\x18\x07 \x03(\x0b\x32(.Data.PurchaseRequestMessage.PaymentInfo\x12\x39\n\tdeviceIds\x18\x08 \x03(\x0b\x32&.Data.PurchaseRequestMessage.DeviceIds\x12\x45\n\x0f\x61pplicationInfo\x18\t \x01(\x0b\x32,.Data.PurchaseRequestMessage.ApplicationInfo\x12;\n\ndeviceInfo\x18\n \x01(\x0b\x32\'.Data.PurchaseRequestMessage.DeviceInfo\x12\x1c\n\x14synergySystemVersion\x18\x0b \x01(\t\x12\x16\n\x0eisSubscription\x18\x0c \x01(\x08\x1aQ\n\x0bPaymentInfo\x12\x15\n\rtransactionId\x18\x01 \x01(\t\x12\x15\n\rpurchasePrice\x18\x02 \x01(\t\x12\x14\n\x0c\x63urrencyCode\x18\x03 \x01(\t\x1a\x35\n\tDeviceIds\x12\x1c\n\x04type\x18\x01 \x01(\x0e\x32\x0e.Data.DeviceId\x12\n\n\x02id\x18\x02 \x01(\t\x1a\xbb\x01\n\x0f\x41pplicationInfo\x12\x11\n\ttimestamp\x18\x01 \x01(\x03\x12\x10\n\x08\x62undleId\x18\x02 \x01(\t\x12\x0f\n\x07\x61ppName\x18\x03 \x01(\t\x12\x12\n\nappVersion\x18\x04 \x01(\t\x12\x13\n\x0b\x61ppLanguage\x18\x05 \x01(\t\x12\x13\n\x0b\x63ountryCode\x18\x06 \x01(\t\x12\x15\n\rfacebookAppId\x18\x07 \x01(\t\x12\x1d\n\x15\x66\x61\x63\x65\x62ookAttributionId\x18\x08 \x01(\t\x1a\x8b\x01\n\nDeviceInfo\x12\x12\n\nsystemName\x18\x01 \x01(\t\x12\x17\n\x0flimitAdTracking\x18\x02 \x01(\x08\x12\x16\n\x0e\x64\x65viceNativeId\x18\x03 \x01(\t\x12\x12\n\ndeviceType\x18\x04 \x01(\t\x12\x16\n\x0eiadAttribution\x18\x05 \x01(\x08\x12\x0c\n\x04imei\x18\x06 \x01(\t\"\xef\x01\n\tOrderData\x12\x16\n\x0enotificationId\x18\x01 \x01(\t\x12\x0f\n\x07orderId\x18\x02 \x01(\t\x12\x32\n\x05state\x18\x03 \x01(\x0e\x32\x1a.Data.OrderData.OrderState:\x07IGNORED\x12(\n\x08platform\x18\x04 \x01(\x0e\x32\x16.Data.PurchasePlatform\x12\x15\n\rpurchaseToken\x18\x05 \x01(\t\x12\x12\n\nsignedData\x18\x06 \x01(\t\"0\n\nOrderState\x12\t\n\x05VALID\x10\x00\x12\x0b\n\x07IGNORED\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\"\x96\x01\n\x10SubscriptionData\x12\x16\n\x0esubscriptionId\x18\x01 \x01(\t\x12\x12\n\npurchaseId\x18\x02 \x01(\t\x12(\n\x08platform\x18\x03 \x01(\x0e\x32\x16.Data.PurchasePlatform\x12\x14\n\x0cpurchaseDate\x18\x04 \x01(\x03\x12\x16\n\x0evalidationDate\x18\x05 \x01(\x03*\x95\x01\n\x10PurchasePlatform\x12\n\n\x06ITUNES\x10\x00\x12\x11\n\rGOOGLEPLAY_V2\x10\x01\x12\x11\n\rGOOGLEPLAY_V3\x10\x02\x12\n\n\x06\x41MAZON\x10\x03\x12 \n\x1cITUNES_GRAND_UNIFIED_RECEIPT\x10\x04\x12\x12\n\x0eNOKIA_NORMANDY\x10\x05\x12\r\n\tAMAZON_V2\x10\x06*e\n\x08\x44\x65viceId\x12\x10\n\x0c\x45\x41_DEVICE_ID\x10\x00\x12\x07\n\x03\x41UT\x10\x01\x12\x11\n\rADVERTISER_ID\x10\x02\x12\r\n\tVENDOR_ID\x10\x03\x12\x0e\n\nANDROID_ID\x10\x04\x12\x0c\n\x08MAC_HASH\x10\x05\x42\x16\n\x14\x63om.ea.simpsons.data') 28 | 29 | _globals = globals() 30 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) 31 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'PurchaseData_pb2', _globals) 32 | if not _descriptor._USE_C_DESCRIPTORS: 33 | _globals['DESCRIPTOR']._loaded_options = None 34 | _globals['DESCRIPTOR']._serialized_options = b'\n\024com.ea.simpsons.data' 35 | _globals['_PURCHASEPLATFORM']._serialized_start=1895 36 | _globals['_PURCHASEPLATFORM']._serialized_end=2044 37 | _globals['_DEVICEID']._serialized_start=2046 38 | _globals['_DEVICEID']._serialized_end=2147 39 | _globals['_PURCHASEDITEMDATA']._serialized_start=28 40 | _globals['_PURCHASEDITEMDATA']._serialized_end=111 41 | _globals['_CURRENCYDATA']._serialized_start=114 42 | _globals['_CURRENCYDATA']._serialized_end=267 43 | _globals['_PURCHASEERRORDATA']._serialized_start=269 44 | _globals['_PURCHASEERRORDATA']._serialized_end=316 45 | _globals['_PURCHASERESPONSEMESSAGE']._serialized_start=319 46 | _globals['_PURCHASERESPONSEMESSAGE']._serialized_end=549 47 | _globals['_PURCHASEREQUESTMESSAGE']._serialized_start=552 48 | _globals['_PURCHASEREQUESTMESSAGE']._serialized_end=1497 49 | _globals['_PURCHASEREQUESTMESSAGE_PAYMENTINFO']._serialized_start=1029 50 | _globals['_PURCHASEREQUESTMESSAGE_PAYMENTINFO']._serialized_end=1110 51 | _globals['_PURCHASEREQUESTMESSAGE_DEVICEIDS']._serialized_start=1112 52 | _globals['_PURCHASEREQUESTMESSAGE_DEVICEIDS']._serialized_end=1165 53 | _globals['_PURCHASEREQUESTMESSAGE_APPLICATIONINFO']._serialized_start=1168 54 | _globals['_PURCHASEREQUESTMESSAGE_APPLICATIONINFO']._serialized_end=1355 55 | _globals['_PURCHASEREQUESTMESSAGE_DEVICEINFO']._serialized_start=1358 56 | _globals['_PURCHASEREQUESTMESSAGE_DEVICEINFO']._serialized_end=1497 57 | _globals['_ORDERDATA']._serialized_start=1500 58 | _globals['_ORDERDATA']._serialized_end=1739 59 | _globals['_ORDERDATA_ORDERSTATE']._serialized_start=1691 60 | _globals['_ORDERDATA_ORDERSTATE']._serialized_end=1739 61 | _globals['_SUBSCRIPTIONDATA']._serialized_start=1742 62 | _globals['_SUBSCRIPTIONDATA']._serialized_end=1892 63 | # @@protoc_insertion_point(module_scope) 64 | -------------------------------------------------------------------------------- /friend_puller.py: -------------------------------------------------------------------------------- 1 | """This script saves the worlds of your friends as well as your own. 2 | 3 | Upon activation, the script will ask you for your email address (the email 4 | address associated with your EA Origin account). A moment or so later, you will 5 | receive an email with your verification code. Enter the code when prompted by 6 | the script. After this the script will then download your town and your current 7 | currency state. Then the script will download the towns of any friend associated 8 | with your account. 9 | 10 | The authentication component is from @damar1st. I greatly appreciate him 11 | allowing me to use his code for this project. 12 | 13 | @tjac. 14 | """ 15 | 16 | import base64 17 | import binascii 18 | import datetime 19 | import json 20 | import logging 21 | import hashlib 22 | import hmac 23 | import os 24 | import subprocess 25 | import sys 26 | import uuid 27 | 28 | try: 29 | # pip install pycryptodome 30 | from Crypto.Cipher import AES 31 | except ImportError: 32 | print("Installing pycryptodome...") 33 | subprocess.check_call( 34 | [sys.executable, "-m", "pip", "install", "pycryptodome"] 35 | ) 36 | from Crypto.Cipher import AES 37 | 38 | try: 39 | # pip install requests 40 | import requests 41 | except ImportError: 42 | print("Installing requests...") 43 | subprocess.check_call( 44 | [sys.executable, "-m", "pip", "install", "requests"] 45 | ) 46 | import requests 47 | 48 | try: 49 | # pip install protobufs 50 | # The Simpsons: Tapped Out protobuffers 51 | import AuthData_pb2 52 | import GetFriendData_pb2 53 | import LandData_pb2 54 | import PurchaseData_pb2 55 | import WholeLandTokenData_pb2 56 | except ImportError: 57 | print("Installing protobuf...") 58 | subprocess.check_call( 59 | [sys.executable, "-m", "pip", "install", "protobuf"] 60 | ) 61 | import AuthData_pb2 62 | import GetFriendData_pb2 63 | import LandData_pb2 64 | import PurchaseData_pb2 65 | import WholeLandTokenData_pb2 66 | 67 | try: 68 | # pip install urllib3 69 | import urllib3 70 | except ImportError: 71 | print("Installing urllib3...") 72 | subprocess.check_call( 73 | [sys.executable, "-m", "pip", "install", "urllib3"] 74 | ) 75 | import urllib3 76 | 77 | 78 | # Disable InsecureRequestWarning warnings. 79 | urllib3.disable_warnings() 80 | 81 | URL_SIMPSONS = 'prod.simpsons-ea.com' 82 | URL_OFRIENDS = 'm.friends.dm.origin.com' 83 | URL_AVATAR = 'm.avatar.dm.origin.com' 84 | URL_TNTAUTH = 'auth.tnt-ea.com' 85 | URL_TNTNUCLEUS = 'nucleus.tnt-ea.com' 86 | URL_ACCOUNTS_EA = 'accounts.ea.com' 87 | URL_GATEWAY_EA = 'gateway.ea.com' 88 | CT_URLENCODED = 'application/x-www-form-urlencoded' 89 | CT_PROTOBUF = 'application/x-protobuf' 90 | CT_JSON = 'application/json' 91 | CT_XML = 'application/xml' 92 | 93 | VERSION_APP = '4.69.5' 94 | VERSION_LAND = '72' 95 | 96 | SECRET_KEY = '2Tok8RykmQD41uWDv5mI7JTZ7NIhcZAIPtiBm4Z5' # found in libscorpio.so 97 | CLIENT_ID = 'simpsons4-android-client' 98 | CLIENT_SECRET = 'D0fpQvaBKmAgBRCwGPvROmBf96zHnAuZmNepQht44SgyhbCdCfFgtUTdCezpWpbRI8N6oPtb38aOVg2y' 99 | HDRS = {'Accept': '/', 'Accept-Encoding': 'gzip', 'Connection': None, 'User-Agent': None} 100 | 101 | 102 | # pull the current mayhem code and hash from damar1st's server 103 | response = requests.get("https://damarist.de/mhcrc.txt") 104 | data = response.text 105 | datas = data.split(" ") 106 | MHCODE = datas[0] 107 | MHHASH = bytes(datas[1], 'utf-8') 108 | 109 | 110 | class TSTO: 111 | def __init__(self): 112 | self.mLandMessage = LandData_pb2.LandMessage() 113 | self.mLandMessageExtra = None 114 | self.headers = dict() 115 | self.headers["Accept"] = "*/*" 116 | self.headers["Accept-Encoding"] = "gzip" 117 | self.headers["client_version"] = VERSION_APP 118 | self.headers["server_api_version"] = "4.0.0" 119 | self.headers["EA-SELL-ID"] = "857120" 120 | self.headers["platform"] = "android" 121 | self.headers["os_version"] = "4.4.4" 122 | self.headers["hw_model_id"] = "0 0.0" 123 | self.headers["data_param_1"] = "1495502718" 124 | self.mMhClientVersion = "Android." + VERSION_APP 125 | self.mSesSimpsons = requests.Session() 126 | self.mSesOther = requests.Session() 127 | self.mUid = None 128 | self.mSession = '' 129 | self.mEmail = '' 130 | self.mPasswd = '' 131 | 132 | # REQUEST CODE 133 | nonce = datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S:000') 134 | anon_as = str(uuid.uuid4()) 135 | ap = 'ewogICAiYXMiIDogIkExIiwKICAgImF2IiA6ICJ2MSIsCiAgICJzdiIgOiAidjEiLAogICAidHMiIDogIkEyIgp9Cg==' 136 | app = base64.b64decode(ap) 137 | app = app.decode('ascii') 138 | 139 | app = app.replace('A1', anon_as) 140 | app = app.replace('A2', nonce) 141 | si = app.encode() 142 | si = base64.b64encode(si) 143 | si = si.decode() 144 | si = si.replace('+', '-') 145 | si = si.replace('/', '_') 146 | si = si.replace('=', '') 147 | si = si.replace('\n', '') 148 | si = si.encode() 149 | 150 | si = si + '.'.encode('ascii') + base64.b64encode( 151 | binascii.unhexlify(hmac.new(SECRET_KEY.encode(), si, hashlib.sha256).hexdigest())) 152 | 153 | si = si.decode('ascii') 154 | si = si.replace('+', '-') 155 | si = si.replace('/', '_') 156 | si = si.replace('=', '') 157 | si = si.replace('\n', '') 158 | 159 | urget = "https://accounts.ea.com/connect/auth?authenticator_login_type=mobile_anonymous&client_id=simpsons4-android-client&redirect_uri=nucleus:rest&release_type=prod&response_type=code&sig=" + si 160 | data = requests.get(urget, headers=HDRS) 161 | jsonResponse = data.json() 162 | code = jsonResponse["code"] 163 | 164 | 165 | # Request ACCESS TOKEN 166 | h = HDRS.copy() 167 | h['X-Include-RT-Time'] = 'true' 168 | h['Content-Type'] = CT_URLENCODED 169 | urget2 = "https://accounts.ea.com/connect/token?client_id=simpsons4-android-client&client_secret=" 170 | urget22 = "&code=" 171 | urget222 = "&grant_type=authorization_code&redirect_uri=nucleus%3Arest&release_type=prod" 172 | data2 = requests.post(urget2 + CLIENT_SECRET + urget22 + code + urget222, headers=h) 173 | if data2.status_code != 200: 174 | print("Error getting initial token") 175 | exit(-1) 176 | 177 | jsonResponse2 = data2.json() 178 | acto = jsonResponse2["access_token"] 179 | reto = jsonResponse2["refresh_token"] 180 | idto = jsonResponse2["id_token"] 181 | 182 | # Initiate verification code 183 | """Initiate an authentication sequence by requesting a verification code.""" 184 | url = "https://gateway.ea.com/proxy/identity/progreg/code" 185 | headers = { 186 | "Authorization": f"Bearer {acto}", 187 | "X-SEND-CODE": "true", 188 | "Content-Type": "text/plain;charset=UTF-8" 189 | } 190 | 191 | 192 | self.mEmail = input("Please enter your account email: ") 193 | body = json.dumps( 194 | { 195 | "codeType" : "EMAIL", 196 | "email" : self.mEmail 197 | } 198 | ) 199 | 200 | req = requests.post(url, headers = headers, data = body) 201 | if req.status_code != 200: 202 | self.error(f"Unable to get verification code: {req.status_code}") 203 | self.error(req.text) 204 | exit(0) 205 | 206 | self.mPasswd = input("Please enter your verification code: ") 207 | 208 | # REQUEST AUTH - PID 209 | h = HDRS.copy() 210 | h['X-Check-Underage'] = 'true' 211 | h['X-Include-Authenticators'] = 'true' 212 | h['X-Include-StopProcess'] = 'true' 213 | 214 | urget3 = "https://accounts.ea.com/connect/tokeninfo?access_token=" + acto 215 | data3 = requests.get(urget3, headers=h) 216 | if data3.status_code != 200: 217 | print("Error getting initial tokeninfo") 218 | exit(-1) 219 | 220 | 221 | jsonResponse3 = data3.json() 222 | aupid = jsonResponse3["user_id"] 223 | 224 | 225 | # Request LONGLIVETOKEN 226 | tbase = "ewogICAiYXYiIDogInYxIiwKICAgImNyZWQiIDogIkRhbUF1dGgiLAogICAiZW1haWwiIDogIkRhbUVtYWlsIiwKICAgIm0iIDogIjEiLAogICAic3YiIDogInYxIiwKICAgInRzIiA6ICJEYW1Ob25jZSIKfQ==" 227 | tapp = base64.b64decode(tbase) 228 | tapp = tapp.decode('ascii') 229 | tapp = tapp.replace('DamEmail', self.mEmail) 230 | tapp = tapp.replace('DamAuth', self.mPasswd) 231 | tapp = tapp.replace('DamNonce', nonce) 232 | #print(tapp) 233 | 234 | tsi = tapp.encode() 235 | tsi = base64.b64encode(tsi) 236 | tsi = tsi.decode() 237 | tsi = tsi.replace('+', '-') 238 | tsi = tsi.replace('/', '_') 239 | tsi = tsi.replace('=', '') 240 | tsi = tsi.replace('\n', '') 241 | tsi = tsi.encode() 242 | tsi = tsi + '.'.encode('ascii') + base64.b64encode( 243 | binascii.unhexlify(hmac.new(SECRET_KEY.encode(), tsi, hashlib.sha256).hexdigest())) 244 | 245 | tsi = tsi.decode('ascii') 246 | tsi = tsi.replace('+', '-') 247 | tsi = tsi.replace('/', '_') 248 | tsi = tsi.replace('=', '') 249 | tsi = tsi.replace('\n', '') 250 | 251 | urget4 = "https://accounts.ea.com/connect/auth?authenticator_login_type=mobile_ea_account&client_id=simpsons4-android-client&nonce=" 252 | urget44 = "&redirect_uri=nucleus:rest&release_type=prod&response_type=code lnglv_token&sig=" 253 | data4 = requests.get(urget4 + nonce + urget44 + tsi, headers=HDRS) 254 | if data4.status_code != 200: 255 | print("Error getting lnglv_token") 256 | exit(-1) 257 | 258 | #print(data4.status_code) 259 | #print("CODE response 4") 260 | #print(data4.content) 261 | jsonResponse4 = data4.json() 262 | #print(jsonResponse4) 263 | mCode = jsonResponse4["code"] 264 | self.mPrevLnglv_token = jsonResponse4["lnglv_token"] 265 | 266 | 267 | # ACCESS TOKEN LOGIN 268 | h = HDRS.copy() 269 | h['X-Include-RT-Time'] = 'true' 270 | h['X-Suppress-Conflict'] = 'true' 271 | h['Content-Type'] = CT_URLENCODED 272 | urget5 = "https://accounts.ea.com/connect/token?client_id=simpsons4-android-client&client_secret=" 273 | urget55 = "&code=" 274 | urget555 = "&grant_type=add_authenticator&previous_access_token=" 275 | urget5555 = "&redirect_uri=nucleus:rest&release_type=prod&transaction_guid=" 276 | data5 = urget5 + CLIENT_SECRET + urget55 + mCode + urget555 + acto + urget5555 + str(uuid.uuid4()) 277 | s = requests.Session() 278 | data6 = s.post(data5, headers=h) 279 | if data6.status_code != 200: 280 | print("Error getting client token") 281 | exit(-1) 282 | 283 | jsonResponse5 = data6.json() 284 | 285 | self.doAuthWithToken(jsonResponse5['access_token']) 286 | print("Downloading town...") 287 | self.doLandDownload() 288 | print("Saving town...") 289 | self.saveWorldData() 290 | print("Downloading and saving currency data...") 291 | self.saveCurrencyData() 292 | self.pull_friends() 293 | 294 | 295 | def doAuthWithToken(self, token): 296 | print(f"Attempting to acquire authentication via token: {token}") 297 | URL_SIMPSONS = 'prod.simpsons-ea.com' 298 | CT_URLENCODED = 'application/x-www-form-urlencoded' 299 | CT_XML = 'application/xml' 300 | HDRS = {'Accept': '*/*', 'Accept-Encoding': 'gzip', 'Connection': None, 'User-Agent': None} 301 | self.mAccessToken = token 302 | self.headers["mh_auth_params"] = self.mAccessToken 303 | self.headers["nucleus_token"] = self.mAccessToken 304 | path = '/connect/tokeninfo' 305 | params = 'access_token=%s' % (self.mAccessToken) 306 | h = dict() 307 | h['X-Check-Underage'] = 'true' 308 | h['X-Include-Authenticators'] = 'true' 309 | h['Content-Type'] = CT_URLENCODED 310 | data = requests.get("https://accounts.ea.com/" + path + '?' + params, headers=h) 311 | if data.status_code != 200: 312 | print("Error getting tokeninfo") 313 | exit(-1) 314 | 315 | self.mAuthPidId = '' 316 | self.mAuthPidId_Anon = '' 317 | data = data.json() 318 | for a in data['authenticators']: 319 | if a['authenticator_type'] == 'NUCLEUS': 320 | self.mAuthPidId = a['authenticator_pid_id'] 321 | elif a['authenticator_type'] == 'AUTHENTICATOR_ANONYMOUS': 322 | self.mAuthPidId_Anon = a['authenticator_pid_id'] 323 | 324 | path = '/proxy/identity/links' 325 | params = 'personaNamespace=gsp-redcrow-simpsons4' 326 | h = HDRS.copy() 327 | h['Authorization'] = 'Bearer ' + self.mAccessToken 328 | data = requests.get("https://gateway.ea.com" + path + '?' + params, headers=h) 329 | if data.status_code != 200: 330 | print("Error getting proxy id link") 331 | exit(-1) 332 | 333 | data = data.json() 334 | self.mPersonaId = '' 335 | self.mPersonaId_Anon = '' 336 | for m in data['pidGamePersonaMappings']['pidGamePersonaMapping']: 337 | if m['pidId'] == self.mAuthPidId: 338 | self.mPersonaId = m['personaId'] 339 | elif m['pidId'] == self.mAuthPidId_Anon: 340 | self.mPersonaId_Anon = m['personaId'] 341 | 342 | path = '/connect/tokeninfo' 343 | params = 'access_token=%s' % (self.mAccessToken) 344 | h = HDRS.copy() 345 | h['Content-Type'] = CT_URLENCODED 346 | data = requests.get("https://accounts.ea.com" + path + '?' + params, headers=h) 347 | if data.status_code != 200: 348 | print("Error connect tokeninfo") 349 | exit(-1) 350 | 351 | data = data.json() 352 | 353 | path = '/mh/users' 354 | params = "appVer=2.2.0&appLang=en&application=nucleus&applicationUserId=%s" % self.mAuthPidId 355 | h = self.headers.copy() 356 | h['Content-Type'] = CT_XML 357 | data = requests.get("https://prod.simpsons-ea.com" + path + '?' + params, True, headers=h) 358 | 359 | path = "/proxy/identity/pids/%s/personas" % self.mAuthPidId 360 | h = HDRS.copy() 361 | h['Accept'] = "*/*" 362 | h['Authorization'] = 'Bearer ' + self.mAccessToken 363 | h['X-Expand-Results'] = 'true' 364 | data = requests.get("https://gateway.ea.com" + path, headers=h) 365 | 366 | path = '/mh/users' 367 | ccsid = str(uuid.uuid4()) 368 | self.mCcsid = ccsid 369 | params = "appVer=2.2.0&appLang=en&application=nucleus&applicationUserId=%s" % self.mAuthPidId 370 | h = self.headers.copy() 371 | h['Transfer-Encoding'] = 'chunked' 372 | h["currentClientSessionId"] = ccsid 373 | h['Accept'] = '*/*' 374 | h['Transfer-Encoding'] = 'chunked' 375 | h['Content-Type'] = CT_XML 376 | h['mh_auth_method'] = 'nucleus' 377 | h['mh_client_datetime'] = datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S:000') 378 | h['currentClientSessionId'] = str(uuid.uuid4()) 379 | h["mh_client_flag"] = "2" 380 | h['Content-Type'] = CT_XML 381 | data = self.doRequest("PUT", CT_XML, URL_SIMPSONS, path + '?' + params, True, hdrs=h) 382 | if "".encode() in data: 383 | path = '/mh/users' 384 | ccsid = str(uuid.uuid4()) 385 | self.mCcsid = ccsid 386 | params = "appVer=2.2.0&appLang=en&application=nucleus&applicationUserId=%s" % self.mAuthPidId 387 | h = self.headers.copy() 388 | h['Transfer-Encoding'] = 'chunked' 389 | h["currentClientSessionId"] = ccsid 390 | h['Accept'] = '*/*' 391 | h['Transfer-Encoding'] = 'chunked' 392 | h['Content-Type'] = CT_XML 393 | h['mh_auth_params'] = self.mPrevLnglv_token 394 | h['nucleus_token'] = self.mPrevLnglv_token 395 | h['mh_auth_method'] = 'nucleus' 396 | h['mh_client_datetime'] = datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S:000') 397 | h['currentClientSessionId'] = str(uuid.uuid4()) 398 | h["mh_client_flag"] = "2" 399 | h['Content-Type'] = CT_XML 400 | data = self.doRequest("PUT", CT_XML, URL_SIMPSONS, path + '?' + params, True, hdrs=h) 401 | 402 | urm = AuthData_pb2.UsersResponseMessage() 403 | urm.ParseFromString(data) 404 | if urm.user.userId == '': 405 | return 406 | else: 407 | urm = AuthData_pb2.UsersResponseMessage() 408 | urm.ParseFromString(data) 409 | if urm.user.userId == '': 410 | return 411 | 412 | self.mUid = urm.user.userId 413 | self.mSession = urm.token.sessionKey 414 | 415 | h = self.headers.copy() 416 | h["Content-Type"] = "application/x-protobuf" 417 | h["mh_client_flag"] = "2" 418 | h["mh_auth_method"] = "nucleus" 419 | h["mh_auth_params"] = self.mAccessToken 420 | h["nucleus_token"] = self.mAccessToken 421 | h["mh_client_version"] = self.mMhClientVersion 422 | h["currentClientSessionId"] = self.mCcsid 423 | h["mh_uid"] = self.mUid 424 | h["mh_session_key"] = self.mSession 425 | h["target_land_id"] = self.mUid 426 | ts = datetime.datetime.today().isoformat(' ') 427 | h["mh_client_datetime"] = ts 428 | ts = ts + ' - ' + self.mMhClientVersion 429 | ts = ts + ' - ' + self.mSession 430 | 431 | ts = ts + ' - WARNING: Expected ID 81288208, but found ' + MHCODE + '. Found at 1495502718' 432 | ts = ts + chr(AES.block_size - len(ts) % AES.block_size) * (AES.block_size - len(ts) % AES.block_size) 433 | self.mhcrc = base64.b64encode( 434 | AES.new(MHHASH, AES.MODE_ECB).encrypt(ts.encode('ascii'))).decode() 435 | h["mh_crc"] = self.mhcrc 436 | 437 | wltr = WholeLandTokenData_pb2.WholeLandTokenRequest() 438 | wltr.requestId = str(uuid.uuid4()) 439 | path = "/mh/games/bg_gameserver_plugin/protoWholeLandToken/%s/" % self.mUid 440 | datas = wltr.SerializeToString() 441 | data = requests.post("https://prod.simpsons-ea.com" + path, datas, True, headers=h) 442 | if "RESOURCE_ALREADY_EXISTS".encode() in data.content: 443 | wltr = WholeLandTokenData_pb2.WholeLandTokenRequest() 444 | wltr.requestId = str(uuid.uuid4()) 445 | path = "/mh/games/bg_gameserver_plugin/protoWholeLandToken/%s/?force=1" % self.mUid 446 | datas = wltr.SerializeToString() 447 | data = requests.post("https://prod.simpsons-ea.com" + path, datas, True, headers=h) 448 | 449 | #print(data.content) 450 | wltr = WholeLandTokenData_pb2.WholeLandTokenRequest() 451 | wltr.ParseFromString(data.content) 452 | self.mUpdateToken = wltr.requestId 453 | self.headers["land-update-token"] = self.mUpdateToken 454 | self.mLogined = True 455 | self.headers["AuthToken"] = self.mAccessToken 456 | 457 | 458 | def doRequest(self, method, content_type, host, path, keep_alive=False, body=[], uncomressedLen=-1, hdrs={}): 459 | # # print("\n=============================================================================") 460 | url = ("https://%s%s" % (host, path)).encode('utf-8') 461 | if len(hdrs) != 0: 462 | headers = hdrs 463 | else: 464 | headers = self.headers.copy() 465 | if uncomressedLen > -1: 466 | headers["Content-Encoding"] = "gzip" 467 | headers["Uncompressed-Length"] = str(uncomressedLen) 468 | headers["Content-Length"] = str(len(body)) 469 | headers["Content-Type"] = content_type 470 | headers["Content-Type"] = "application/x-protobuf" 471 | headers["mh_client_flag"] = "2" 472 | headers["mh_auth_method"] = "nucleus" 473 | headers["mh_auth_params"] = self.mAccessToken 474 | headers["nucleus_token"] = self.mAccessToken 475 | headers["mh_client_version"] = self.mMhClientVersion 476 | headers["currentClientSessionId"] = self.mCcsid 477 | headers["mh_uid"] = self.mUid 478 | headers["mh_session_key"] = self.mSession 479 | headers["target_land_id"] = self.mUid 480 | 481 | if keep_alive == True: 482 | ssn = self.mSesSimpsons if host == URL_SIMPSONS else self.mSesOther 483 | else: 484 | ssn = requests.Session() 485 | 486 | # mh_crc calculation 487 | if self.mSession != '': 488 | ts = datetime.datetime.today().isoformat(' ') 489 | headers["mh_client_datetime"] = ts 490 | ts = ts + ' - ' + self.mMhClientVersion 491 | ts = ts + ' - ' + self.mSession 492 | ts = ts + ' - WARNING: Expected ID 81288208, but found ' + MHCODE + '. Found at 1495502718' 493 | ts = ts + chr(AES.block_size - len(ts) % AES.block_size) * (AES.block_size - len(ts) % AES.block_size) 494 | headers["mh_crc"] = base64.b64encode(AES.new(MHHASH, AES.MODE_ECB).encrypt(ts.encode('ascii'))).decode() 495 | 496 | # prepare list of not needed headers 497 | forDel = [] 498 | if len(hdrs) > 0: 499 | headers = {} 500 | for k, v in hdrs.items(): 501 | if v is None: 502 | forDel.append(k) 503 | else: 504 | headers[k] = v 505 | 506 | # prepare request 507 | prepped = requests.Request(method, url=url, headers=headers, data=body).prepare() 508 | for h in forDel: 509 | if h in prepped.headers: 510 | del prepped.headers[h] 511 | 512 | r = ssn.send(prepped, verify=False) 513 | 514 | # reading response 515 | data = r.content 516 | 517 | if (len(data) == 0): 518 | logging.debug("no content") 519 | #else: 520 | # logging.debug(data) 521 | return data 522 | 523 | def doLandDownload(self): 524 | data = self.doRequest("GET", CT_PROTOBUF, URL_SIMPSONS, 525 | "/mh/games/bg_gameserver_plugin/protoland/%s/" % self.mUid, True) 526 | 527 | self.mLandMessage = LandData_pb2.LandMessage() 528 | self.mLandMessage.ParseFromString(data) 529 | 530 | def saveWorldData(self): 531 | if not os.path.exists("towns"): 532 | os.makedirs("towns") 533 | self.town_filename = os.path.join("towns", self.mEmail) 534 | if self.mLandMessage.HasField("friendData"): 535 | if self.mLandMessage.friendData.HasField("name"): 536 | self.town_filename = os.path.join( 537 | "towns", self.mLandMessage.friendData.name 538 | ) 539 | 540 | with open(self.town_filename, "wb") as f: 541 | f.write(self.mLandMessage.SerializeToString()) 542 | 543 | def saveCurrencyData(self): 544 | self.getCurrencyData() 545 | data = self.doRequest("GET", "application/x-protobuf", "prod.simpsons-ea.com" 546 | , "/mh/games/bg_gameserver_plugin/protocurrency/%s/" % self.mUid, True); 547 | currdat = PurchaseData_pb2.CurrencyData() 548 | currdat2 = currdat.ParseFromString(data) 549 | with open(f"{self.town_filename}.currency", "wb") as f: 550 | f.write(data) 551 | 552 | def getCurrencyData(self): 553 | if self.mLandMessageExtra == None: 554 | self.mLandMessageExtra = LandData_pb2.ExtraLandMessage() 555 | return self.mLandMessageExtra 556 | 557 | def get_friends(self) -> dict: 558 | """Pull's the user's friends list""" 559 | 560 | # Make the request 561 | print("Getting friends list...") 562 | 563 | data = self.doRequest("GET", "application/x-protobuf", "prod.simpsons-ea.com", 564 | "/mh/games/bg_gameserver_plugin/friendData/origin", True); 565 | 566 | 567 | # Load the protobuf 568 | req = GetFriendData_pb2.GetFriendDataResponse() 569 | req.ParseFromString(data) 570 | 571 | # Parse the protobuf into friend-land mapping 572 | friends = {} 573 | for friend in req.friendData: 574 | if not friend.HasField("friendId") or not friend.HasField("friendData"): 575 | print("skipping entry with missing friendId or friendData") 576 | continue 577 | land_id = friend.friendId # this is the land_id 578 | friend_data = friend.friendData 579 | friend_name = land_id 580 | if not friend_data.HasField("name"): 581 | print(f"{land_id} is missing a name. Using land_id as the name") 582 | else: 583 | friend_name = friend_data.name 584 | 585 | friends[friend_name] = land_id 586 | print(f"Found friend: {friend_name}") 587 | # Return the friend-land map 588 | return friends 589 | 590 | def pull_land(self, land_id: str, username: str) -> bool: 591 | """Downloads the land for the given user. Saves contents to disk.""" 592 | 593 | # Start by downloading the LandData 594 | print(f"Downloading {username}'s land (land_id: {land_id})") 595 | 596 | data = self.doRequest("GET", "application/x-protobuf", "prod.simpsons-ea.com", 597 | f"/mh/games/bg_gameserver_plugin/protoland/{land_id}/", True) 598 | 599 | 600 | if not data: 601 | print(f"Error getting {username}'s land.") 602 | return False 603 | 604 | filename = os.path.join("towns", username) 605 | with open(filename, "wb") as f: 606 | f.write(data) 607 | 608 | 609 | return True 610 | 611 | 612 | def pull_friends(self) -> bool: 613 | 614 | friends = self.get_friends() 615 | if not friends: 616 | print("You have no friends or there was an error.") 617 | return False 618 | 619 | for friend_name in friends: 620 | if not self.pull_land(friends[friend_name], friend_name): 621 | print(f"Failure getting {friend_name}'s land. Skipping.") 622 | 623 | 624 | if __name__ == "__main__": 625 | TSTO() 626 | -------------------------------------------------------------------------------- /LandData_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # NO CHECKED-IN PROTOBUF GENCODE 4 | # source: LandData.proto 5 | # Protobuf Python Version: 5.28.3 6 | """Generated protocol buffer code.""" 7 | from google.protobuf import descriptor as _descriptor 8 | from google.protobuf import descriptor_pool as _descriptor_pool 9 | from google.protobuf import runtime_version as _runtime_version 10 | from google.protobuf import symbol_database as _symbol_database 11 | from google.protobuf.internal import builder as _builder 12 | _runtime_version.ValidateProtobufRuntimeVersion( 13 | _runtime_version.Domain.PUBLIC, 14 | 5, 15 | 28, 16 | 3, 17 | '', 18 | 'LandData.proto' 19 | ) 20 | # @@protoc_insertion_point(imports) 21 | 22 | _sym_db = _symbol_database.Default() 23 | 24 | 25 | import Common_pb2 as Common__pb2 26 | import PurchaseData_pb2 as PurchaseData__pb2 27 | 28 | 29 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0eLandData.proto\x12\x04\x44\x61ta\x1a\x0c\x43ommon.proto\x1a\x12PurchaseData.proto\"t\n\x0bVariableSet\x12,\n\x08variable\x18\x01 \x03(\x0b\x32\x1a.Data.VariableSet.Variable\x1a\x37\n\x08Variable\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05\x12\x0e\n\x06\x64value\x18\x03 \x01(\x01\"\x89\x01\n\x11SharedVariableSet\x12\x38\n\x08variable\x18\x01 \x03(\x0b\x32&.Data.SharedVariableSet.SharedVariable\x1a:\n\x0eSharedVariable\x12\r\n\x05owner\x18\x01 \x01(\r\x12\n\n\x02id\x18\x02 \x01(\x05\x12\r\n\x05value\x18\x03 \x01(\x05\"\xaf\x01\n\x0bTimeGateSet\x12,\n\x08timegate\x18\x01 \x03(\x0b\x32\x1a.Data.TimeGateSet.TimeGate\x1ar\n\x08TimeGate\x12\x0e\n\x06gateId\x18\x01 \x01(\x05\x12\x15\n\rusesRemaining\x18\x02 \x01(\x05\x12\x12\n\nrefillTime\x18\x03 \x01(\x03\x12\x12\n\ninstanceId\x18\x04 \x01(\t\x12\x17\n\x0flastRefillCount\x18\x05 \x01(\x05\"\xcc\x02\n\x13\x41\x64vancedVariableSet\x12<\n\x08variable\x18\x01 \x03(\x0b\x32*.Data.AdvancedVariableSet.AdvancedVariable\x1a\xf6\x01\n\x10\x41\x64vancedVariable\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x13\n\x0b\x63reatedTime\x18\x03 \x01(\x03\x12\x0b\n\x03ttl\x18\x04 \x01(\x03\x12\x13\n\x0bobjectClass\x18\x05 \x01(\r\x12\x10\n\x08serverID\x18\x06 \x01(\r\x12\x14\n\x0cobjectTypeID\x18\x07 \x01(\r\x12\x10\n\x08orphaned\x18\x08 \x01(\x08\x12\x15\n\rcanBeOrphaned\x18\t \x01(\x08\x12\r\n\x05scope\x18\n \x01(\x05\x12\x11\n\tsublandID\x18\x0b \x01(\r\x12\r\n\x05\x66lags\x18\x0c \x01(\r\x12\x0c\n\x04uuid\x18\r \x01(\r\"\xfb\x01\n\x0fTimedAttackData\x12\x12\n\ninstanceID\x18\x01 \x01(\t\x12\x11\n\tsubLandID\x18\x02 \x01(\r\x12\x16\n\x0eobjectServerID\x18\x03 \x01(\r\x12\x13\n\x0bobjectClass\x18\x04 \x01(\r\x12\x13\n\x0bobjectOwner\x18\x05 \x01(\t\x12\x13\n\x0b\x61ttackOwner\x18\x06 \x01(\t\x12\x13\n\x0btimeCreated\x18\x07 \x01(\x03\x12\x10\n\x08lifeSpan\x18\x08 \x01(\x03\x12\x0c\n\x04\x66lag\x18\t \x01(\r\x12\x0f\n\x07\x65ventID\x18\n \x01(\r\x12\x12\n\nnumResUsed\x18\x0b \x01(\x05\x12\x10\n\x08objectID\x18\x0c \x01(\r\"D\n\x12TimedAttackDataSet\x12.\n\x0ftimedAttackData\x18\x01 \x03(\x0b\x32\x15.Data.TimedAttackData\"?\n\x0fObjectVariables\x12,\n\tvariables\x18\x01 \x01(\x0b\x32\x19.Data.AdvancedVariableSet\"B\n\x10SpendableElement\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0e\n\x06\x61mount\x18\x02 \x01(\r\x12\x10\n\x08nextTime\x18\x03 \x01(\x03\")\n\tOwnerList\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08userName\x18\x02 \x03(\t\"\x9a\x01\n\x10\x43urrencySaveData\x12\r\n\x05money\x18\x01 \x01(\r\x12\x0f\n\x07premium\x18\x02 \x01(\r\x12\x11\n\trealMoney\x18\x03 \x01(\r\x12\x13\n\x0brealPremium\x18\x04 \x01(\r\x12\x12\n\nnumSpecial\x18\x05 \x01(\r\x12\x13\n\x0bspecialType\x18\x06 \x03(\r\x12\x15\n\rspecialAmount\x18\x07 \x03(\r\"\xb5\xa3\x01\n\x0bLandMessage\x12\n\n\x02id\x18\x01 \x01(\t\x12\x30\n\nfriendData\x18\x02 \x01(\x0b\x32\x1c.Data.LandMessage.FriendData\x12,\n\x08userData\x18\x03 \x01(\x0b\x32\x1a.Data.LandMessage.UserData\x12\x36\n\rinnerLandData\x18\x04 \x01(\x0b\x32\x1f.Data.LandMessage.InnerLandData\x12\x30\n\troadsData\x18\x05 \x01(\x0b\x32\x1d.Data.LandMessage.TerrainData\x12\x31\n\nriversData\x18\x06 \x01(\x0b\x32\x1d.Data.LandMessage.TerrainData\x12\x34\n\x0c\x62uildingData\x18\x07 \x03(\x0b\x32\x1e.Data.LandMessage.BuildingData\x12\x36\n\rcharacterData\x18\x08 \x03(\x0b\x32\x1f.Data.LandMessage.CharacterData\x12\x38\n\x0e\x63onsumableData\x18\t \x03(\x0b\x32 .Data.LandMessage.ConsumableData\x12*\n\x07jobData\x18\n \x03(\x0b\x32\x19.Data.LandMessage.JobData\x12.\n\tquestData\x18\x0b \x03(\x0b\x32\x1b.Data.LandMessage.QuestData\x12<\n\x10notificationData\x18\x0c \x03(\x0b\x32\".Data.LandMessage.NotificationData\x12>\n\x11inventoryItemData\x18\r \x03(\x0b\x32#.Data.LandMessage.InventoryItemData\x12\x42\n\x13memorabiliaItemData\x18\x0e \x03(\x0b\x32%.Data.LandMessage.MemorabiliaItemData\x12\x46\n\x15premiumUnlockItemData\x18\x0f \x03(\x0b\x32\'.Data.LandMessage.PremiumUnlockItemData\x12@\n\x12\x65ventCountListData\x18\x10 \x03(\x0b\x32$.Data.LandMessage.EventCountListData\x12:\n\x0f\x61\x63tionLimitData\x18\x11 \x03(\x0b\x32!.Data.LandMessage.ActionLimitData\x12\x32\n\x0bsidebarData\x18\x12 \x01(\x0b\x32\x1d.Data.LandMessage.SidebarData\x12>\n\x11\x63haracterSetsData\x18\x13 \x01(\x0b\x32#.Data.LandMessage.CharacterSetsData\x12\x46\n\x15pushNotificationsData\x18\x14 \x03(\x0b\x32\'.Data.LandMessage.PushNotificationsData\x12:\n\x0ftimedScriptData\x18\x15 \x03(\x0b\x32!.Data.LandMessage.TimedScriptData\x12<\n\x10\x62onusUnlocksData\x18\x16 \x01(\x0b\x32\".Data.LandMessage.BonusUnlocksData\x12\x44\n\x14\x63haracterUnlocksData\x18\x17 \x03(\x0b\x32&.Data.LandMessage.CharacterUnlocksData\x12:\n\x0fskinUnlocksData\x18\x18 \x01(\x0b\x32!.Data.LandMessage.SkinUnlocksData\x12>\n\x11\x64\x65layedActionData\x18\x19 \x03(\x0b\x32#.Data.LandMessage.DelayedActionData\x12\x38\n\x0espendablesData\x18\x1a \x01(\x0b\x32 .Data.LandMessage.SpendablesData\x12>\n\x11specialEventsData\x18\x1b \x01(\x0b\x32#.Data.LandMessage.SpecialEventsData\x12\x38\n\x0e\x66\x61keFriendData\x18\x1c \x01(\x0b\x32 .Data.LandMessage.FakeFriendData\x12\x38\n\x0equestGroupData\x18\x1d \x03(\x0b\x32 .Data.LandMessage.QuestGroupData\x12*\n\tpurchases\x18\x1e \x03(\x0b\x32\x17.Data.PurchasedItemData\x12\x46\n\x15processedPurchaseData\x18\x1f \x01(\x0b\x32\'.Data.LandMessage.ProcessedPurchaseData\x12H\n\x16\x63ustomFriendActionData\x18 \x03(\x0b\x32(.Data.LandMessage.CustomFriendActionData\x12\x11\n\tdebugLand\x18! \x01(\x08\x12\x30\n\toceanData\x18\" \x01(\x0b\x32\x1d.Data.LandMessage.TerrainData\x12\x38\n\x0egameObjectInfo\x18# \x01(\x0b\x32 .Data.LandMessage.GameObjectInfo\x12\x32\n\x0bsubLandData\x18$ \x03(\x0b\x32\x1d.Data.LandMessage.SubLandData\x12\x34\n\x0cminigameData\x18% \x03(\x0b\x32\x1e.Data.LandMessage.MinigameData\x12=\n\x15stealableBuildingData\x18& \x03(\x0b\x32\x1e.Data.LandMessage.BuildingData\x12\x42\n\x13\x63ollectionItemsData\x18\' \x03(\x0b\x32%.Data.LandMessage.CollectionItemsData\x12\x38\n\x0e\x66riendListData\x18( \x03(\x0b\x32 .Data.LandMessage.FriendListData\x12\x42\n\x15\x61llFriendActionsCount\x18) \x01(\x0b\x32#.Data.LandMessage.FriendActionCount\x12\'\n\x1f\x66riendListDataIsCreatedAndSaved\x18* \x01(\x08\x12.\n\x0fobjectVariables\x18+ \x01(\x0b\x32\x15.Data.ObjectVariables\x12?\n\x0frecommendations\x18, \x03(\x0b\x32&.Data.LandMessage.SavedRecommendations\x12=\n\x12\x61mazonDimensionSet\x18- \x03(\x0b\x32!.Data.LandMessage.AmazonDimension\x12=\n\x11\x64\x61ilyTaskDataList\x18. \x01(\x0b\x32\".Data.LandMessage.DailyTaskMessage\x12@\n\x12roadMapDataMessage\x18/ \x01(\x0b\x32$.Data.LandMessage.RoadMapDataMessage\x12:\n\x0f\x61\x64HocObjectData\x18\x30 \x03(\x0b\x32!.Data.LandMessage.AdHocObjectData\x12\x13\n\x0b\x63ountryCode\x18\x31 \x01(\t\x12.\n\ttimerData\x18\x32 \x03(\x0b\x32\x1b.Data.LandMessage.TimerData\x12\x44\n\x14jobCensusDataMessage\x18\x33 \x01(\x0b\x32&.Data.LandMessage.JobCensusDataMessage\x12\x30\n\ndnaMessage\x18\x34 \x01(\x0b\x32\x1c.Data.LandMessage.DNAMessage\x12N\n\x19groupStorageBundleMessage\x18\x35 \x01(\x0b\x32+.Data.LandMessage.GroupStorageBundleMessage\x1a\xa8\x03\n\nFriendData\x12\x13\n\x0b\x64\x61taVersion\x18\x01 \x01(\x05\x12\x14\n\x0chasLemonTree\x18\x02 \x01(\x08\x12\x10\n\x08language\x18\x03 \x01(\x05\x12\r\n\x05level\x18\x04 \x01(\x05\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x0e\n\x06rating\x18\x06 \x01(\x05\x12)\n\tspendable\x18\x07 \x03(\x0b\x32\x16.Data.SpendableElement\x12\x13\n\x0blandVersion\x18\x08 \x01(\x05\x12>\n\x0csublandInfos\x18\t \x03(\x0b\x32(.Data.LandMessage.FriendData.SublandInfo\x12\x1a\n\x12\x62oardwalkTileCount\x18\n \x01(\x05\x12\x16\n\x0elastPlayedTime\x18\x0b \x01(\x03\x12\x32\n\x11sharedVariableSet\x18\x0c \x01(\x0b\x32\x17.Data.SharedVariableSet\x1aH\n\x0bSublandInfo\x12\x11\n\tsublandId\x18\x01 \x01(\x05\x12\x0e\n\x06rating\x18\x02 \x01(\x05\x12\x16\n\x07\x63reated\x18\x03 \x01(\x08:\x05\x66\x61lse\x1a\x1a\n\x0c\x45ntityHeader\x12\n\n\x02id\x18\x01 \x01(\r\x1a\xdc\x08\n\x08UserData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x1b\n\x13lastBonusCollection\x18\x02 \x01(\x04\x12\r\n\x05level\x18\x03 \x01(\r\x12\x12\n\nexperience\x18\x04 \x01(\r\x12\r\n\x05money\x18\x05 \x01(\r\x12;\n\x0bsavedRating\x18\x06 \x03(\x0b\x32&.Data.LandMessage.UserData.SavedRating\x12\x11\n\tlastBonus\x18\x07 \x01(\r\x12\x17\n\x0f\x66riendsUnlocked\x18\x08 \x01(\x08\x12\x1b\n\x13memorabiliaUnlocked\x18\t \x01(\x08\x12\x1a\n\x12reorganizeUnlocked\x18\n \x01(\x08\x12\x15\n\rfirstPurchase\x18\x0b \x01(\x08\x12\x1a\n\x12sidebarDefaultOpen\x18\x0c \x01(\x08\x12\x13\n\x0bshowLevelUp\x18\r \x01(\x08\x12\x17\n\x0f\x62onusExperience\x18\x0e \x01(\r\x12\x12\n\nbonusLevel\x18\x0f \x01(\r\x12\x17\n\x0fhasPrestigeData\x18\x10 \x01(\x08\x12\x12\n\nprestigeID\x18\x11 \x01(\r\x12\x1a\n\x12prestigeShownFirst\x18\x12 \x01(\x08\x12\x1b\n\x13prestigeShownSecond\x18\x13 \x01(\x08\x12\x1a\n\x12prestigeShownThird\x18\x14 \x01(\x08\x12\x18\n\x10prestigeSelected\x18\x15 \x01(\r\x12\x1d\n\x15prestigeConsumbableID\x18\x16 \x01(\r\x12\x18\n\x10tutorialComplete\x18\x17 \x01(\x08\x12\x19\n\x11pendingConsumable\x18\x18 \x01(\r\x12\x13\n\x0bvisualLevel\x18\x19 \x01(\r\x12\x16\n\x0etimezoneOffset\x18\x1a \x01(\x05\x12\x17\n\x0fuserPreferences\x18\x1b \x01(\r\x12\x15\n\rshouldAnalyze\x18\x1c \x01(\x08\x12\x17\n\x0fgambleOutcomeID\x18\x1d \x01(\x05\x12\x16\n\x0egambleItemType\x18\x1e \x01(\t\x12\x18\n\x10\x66ullDLCCompleted\x18\x1f \x01(\x08\x12-\n\x0fpowerupDataList\x18 \x01(\x0b\x32\x14.Data.PowerupMessage\x12-\n\rsubscriptions\x18! \x03(\x0b\x32\x16.Data.SubscriptionData\x12G\n\x11stickerUnlockData\x18\" \x03(\x0b\x32,.Data.LandMessage.UserData.StickerUnlockData\x12\x10\n\x08resetAge\x18# \x01(\x08\x1a\x41\n\x0bSavedRating\x12\x19\n\x11savedRatingElemID\x18\x01 \x01(\r\x12\x17\n\x0fsavedRatingElem\x18\x02 \x01(\x05\x1a&\n\x11StickerUnlockData\x12\x11\n\tstickerID\x18\x01 \x01(\r\x1a\xc1\x07\n\rInnerLandData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x12\n\nlandBlocks\x18\x02 \x01(\t\x12\x16\n\x0enextInstanceID\x18\x03 \x01(\r\x12\x10\n\x08numChars\x18\x04 \x01(\r\x12\x14\n\x0cnumBuildings\x18\x05 \x01(\r\x12\x16\n\x0enumConsumables\x18\x06 \x01(\r\x12\x0f\n\x07numJobs\x18\x07 \x01(\r\x12\x11\n\tnumQuests\x18\x08 \x01(\r\x12\x12\n\nnumNotices\x18\t \x01(\r\x12\x19\n\x11numInventoryItems\x18\n \x01(\r\x12\x1b\n\x13numMemorabiliaItems\x18\x0b \x01(\r\x12\x1a\n\x12numEventCountLists\x18\x0c \x01(\r\x12\x19\n\x11numPremiumUnlocks\x18\r \x01(\r\x12\x17\n\x0fnumActionLimits\x18\x0e \x01(\r\x12\x1d\n\x15numRunsSincePromotion\x18\x0f \x01(\r\x12\x16\n\x0elevelOfRateAsk\x18\x10 \x01(\r\x12\x12\n\nupdateTime\x18\x11 \x01(\x03\x12\x18\n\x10timeSpentPlaying\x18\x12 \x01(\x03\x12\x1c\n\x14lastLevelUpSpentTime\x18\x13 \x01(\x03\x12\x1c\n\x14lastLevelUpTimeStamp\x18\x14 \x01(\x03\x12\x17\n\x0finitialSaveDone\x18\x15 \x01(\x08\x12\x1f\n\x17lastVandalismFeedPosted\x18\x16 \x01(\x03\x12#\n\x1blastStealBuildingFeedPosted\x18\x17 \x01(\x03\x12\x1e\n\x16lastSideshowBobSpawned\x18\x18 \x01(\x03\x12\x16\n\x0enextCurrencyID\x18\x19 \x01(\r\x12\x16\n\x0enumQuestGroups\x18\x1a \x01(\r\x12\x1c\n\x14scratcherRewardIndex\x18\x1b \x01(\x05\x12#\n\x1bscratcherRewardConsumableID\x18\x1c \x01(\r\x12\x14\n\x0c\x63reationTime\x18\x1d \x01(\x04\x12\x10\n\x08versions\x18\x1e \x03(\t\x12\x17\n\x0f\x62uildingsSorted\x18\x1f \x01(\x08\x12\x17\n\x0fnumSavedFriends\x18 \x01(\r\x12\x16\n\x0elandBlockWidth\x18! \x01(\r\x12\x17\n\x0flandBlockHeight\x18\" \x01(\r\x12\x1a\n\x12landBlockPositionX\x18# \x01(\x05\x12\x1a\n\x12landBlockPositionY\x18$ \x01(\x05\x1a\xd7\x02\n\x0bTerrainData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x13\n\x0bmapDataSize\x18\x02 \x01(\r\x12\x0f\n\x07mapData\x18\x03 \x01(\t\x12>\n\x0bterrainType\x18\x04 \x01(\x0e\x32).Data.LandMessage.TerrainData.TerrainType\"\xb1\x01\n\x0bTerrainType\x12\x0c\n\x08PAVEMENT\x10\x01\x12\t\n\x05ROADS\x10\x02\x12\n\n\x06RIVERS\x10\x03\x12\x14\n\x10KRUSTYLAND_ROADS\x10\x04\x12\t\n\x05OCEAN\x10\x05\x12\x08\n\x04\x44IRT\x10\x06\x12\x0e\n\nDIRT_ROADS\x10\x07\x12\x0f\n\x0b\x43OBBLESTONE\x10\x08\x12\x0c\n\x08ICERIVER\x10\t\x12\x0b\n\x07KLSROAD\x10\n\x12\x0c\n\x08GOLDROAD\x10\x0b\x12\x08\n\x04SAND\x10\x0c\x1a\x9b\x04\n\x0c\x42uildingData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x10\n\x08\x62uilding\x18\x02 \x01(\r\x12\x14\n\x0c\x63reationTime\x18\x03 \x01(\x03\x12\x12\n\nupdateTime\x18\x04 \x01(\x03\x12\x11\n\tpositionX\x18\x05 \x01(\x02\x12\x11\n\tpositionY\x18\x06 \x01(\x02\x12\x0f\n\x07\x66lipped\x18\x07 \x01(\x08\x12\x12\n\nbuildState\x18\x08 \x01(\x05\x12\r\n\x05hurry\x18\t \x01(\x08\x12\x11\n\tcropState\x18\n \x01(\r\x12\x11\n\tbetActive\x18\x0b \x01(\x08\x12\x14\n\x0c\x62\x65tStartTime\x18\x0c \x01(\x03\x12\x11\n\tbetChoice\x18\r \x01(\r\x12\x12\n\nwinningBet\x18\x0e \x01(\x08\x12\x12\n\nvandalized\x18\x0f \x01(\x08\x12\x0f\n\x07namelen\x18\x10 \x01(\x05\x12\x12\n\nvandalName\x18\x11 \x01(\t\x12\x13\n\x0bisOwnerList\x18\x12 \x01(\x08\x12\"\n\townerList\x18\x13 \x01(\x0b\x32\x0f.Data.OwnerList\x12\x0c\n\x04skin\x18\x14 \x01(\x05\x12\x14\n\x0cgrantRewards\x18\x15 \x01(\x08\x12\x11\n\tflipState\x18\x16 \x01(\r\x12\x11\n\tsubLandID\x18\x17 \x01(\r\x12\x17\n\x0ftimeOfVandalism\x18\x18 \x01(\x03\x12\r\n\x05\x66lags\x18\x19 \x01(\r\x1a#\n\x0bVectorFloat\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x1a\x41\n\x10VectorFloatArray\x12-\n\x06vector\x18\x01 \x03(\x0b\x32\x1d.Data.LandMessage.VectorFloat\x1a\x87\x02\n\rCharacterData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x11\n\tcharacter\x18\x02 \x01(\r\x12\x12\n\nupdateTime\x18\x03 \x01(\x03\x12\x11\n\tpositionX\x18\x04 \x01(\x02\x12\x11\n\tpositionY\x18\x05 \x01(\x02\x12\x0c\n\x04skin\x18\x06 \x01(\x05\x12\x12\n\nskinBackup\x18\x07 \x01(\x05\x12\x11\n\tsubLandID\x18\x08 \x01(\r\x12\r\n\x05\x66lags\x18\t \x01(\r\x12\x35\n\tpathCache\x18\n \x01(\x0b\x32\".Data.LandMessage.VectorFloatArray\x1aj\n\x0e\x43onsumableData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x12\n\nconsumable\x18\x02 \x01(\r\x12\x14\n\x0c\x63onsumedTime\x18\x03 \x01(\x03\x1a\xde\x02\n\x07JobData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x0b\n\x03job\x18\x02 \x01(\r\x12\x0f\n\x07\x63harRef\x18\x03 \x01(\r\x12\x13\n\x0b\x62uildingRef\x18\x04 \x01(\r\x12\x12\n\nupdateTime\x18\x05 \x01(\x03\x12\r\n\x05state\x18\x06 \x01(\x05\x12\r\n\x05hurry\x18\x07 \x01(\x08\x12\x13\n\x0bhasBuilding\x18\x08 \x01(\x08\x12\x0f\n\x07hasChar\x18\t \x01(\x08\x12\x15\n\rmoveToCharRef\x18\n \x01(\r\x12\x17\n\x0fproxyCheckFired\x18\x0b \x01(\x08\x12\x15\n\rgridPositionX\x18\x0c \x01(\x05\x12\x15\n\rgridPositionY\x18\r \x01(\x05\x12\x0f\n\x07hasGrid\x18\x0e \x01(\x08\x12\x11\n\tsubLandID\x18\x0f \x01(\r\x12\x16\n\x0esubBuildingRef\x18\x10 \x01(\r\x1a\xe2\x08\n\tQuestData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x0f\n\x07questID\x18\x02 \x01(\r\x12\x12\n\nquestState\x18\x03 \x01(\x05\x12\x18\n\x10questScriptState\x18\x04 \x01(\x05\x12\x15\n\rnumObjectives\x18\x05 \x01(\x05\x12@\n\robjectiveData\x18\x06 \x03(\x0b\x32).Data.LandMessage.QuestData.ObjectiveData\x12\x16\n\x0etimesCompleted\x18\x07 \x01(\x05\x1a\xf4\x06\n\rObjectiveData\x12\x13\n\x0bobjectiveID\x18\x01 \x01(\x05\x12\x16\n\x0eobjectiveState\x18\x02 \x01(\x05\x12\x15\n\robjectiveType\x18\x03 \x01(\x05\x12\x0f\n\x07version\x18\x04 \x01(\x05\x12\x17\n\x0fquestLastRetVal\x18\x05 \x01(\x08\x12\x12\n\nquestLocal\x18\x06 \x01(\x08\x12\x0e\n\x06rushed\x18\x07 \x01(\x08\x12\x10\n\x08keepDone\x18\x08 \x01(\x08\x12\x17\n\x0f\x62lockDoneScript\x18\t \x01(\x08\x12X\n\x12\x62uildingCustomData\x18\n \x01(\x0b\x32<.Data.LandMessage.QuestData.ObjectiveData.BuildingCustomData\x12Z\n\x13resourcesCustomData\x18\x0b \x01(\x0b\x32=.Data.LandMessage.QuestData.ObjectiveData.ResourcesCustomData\x12Z\n\x13itemCountCustomData\x18\x0c \x01(\x0b\x32=.Data.LandMessage.QuestData.ObjectiveData.ItemCountCustomData\x12^\n\x15visitFriendCustomData\x18\r \x01(\x0b\x32?.Data.LandMessage.QuestData.ObjectiveData.VisitFriendCustomData\x12J\n\x0b\x64ynamicData\x18\x0e \x01(\x0b\x32\x35.Data.LandMessage.QuestData.ObjectiveData.DynamicData\x1a!\n\x12\x42uildingCustomData\x12\x0b\n\x03qty\x18\x01 \x01(\x05\x1a\x35\n\x13ResourcesCustomData\x12\r\n\x05money\x18\x01 \x01(\r\x12\x0f\n\x07premium\x18\x02 \x01(\r\x1a$\n\x13ItemCountCustomData\x12\r\n\x05\x63ount\x18\x01 \x01(\x05\x1aJ\n\x15VisitFriendCustomData\x12\x0b\n\x03num\x18\x01 \x01(\x05\x12\x14\n\x0c\x66\x61keIncluded\x18\x02 \x01(\x08\x12\x0e\n\x06\x66riend\x18\x03 \x03(\t\x1a\x1c\n\x0b\x44ynamicData\x12\r\n\x05value\x18\x01 \x01(\x05\x1a\xc0\x13\n\x10NotificationData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x12\n\nbuildingID\x18\x02 \x01(\r\x12\x13\n\x0b\x63haracterID\x18\x03 \x01(\r\x12\x0c\n\x04type\x18\x04 \x01(\r\x12\x12\n\ncallbackID\x18\x05 \x01(\r\x12\x0e\n\x06startX\x18\x06 \x01(\x02\x12\x0e\n\x06startY\x18\x07 \x01(\x02\x12\x0e\n\x06startZ\x18\x08 \x01(\x02\x12\x0c\n\x04\x65ndX\x18\t \x01(\x02\x12\x0c\n\x04\x65ndY\x18\n \x01(\x02\x12\x0c\n\x04\x65ndZ\x18\x0b \x01(\x02\x12\x10\n\x08moveTime\x18\x0c \x01(\x03\x12\x10\n\x08isStatic\x18\r \x01(\x08\x12\x0f\n\x07isSetup\x18\x0e \x01(\x08\x12\x13\n\x0bhasBuilding\x18\x0f \x01(\x08\x12\x0f\n\x07hasChar\x18\x10 \x01(\x08\x12\x13\n\x0bhistoryType\x18\x11 \x01(\r\x12\x14\n\x0chistoryJobID\x18\x12 \x01(\r\x12\x19\n\x11historyBuildingID\x18\x13 \x01(\r\x12\x1a\n\x12historyCharacterID\x18\x14 \x01(\r\x12\x16\n\x0ehistoryQuestID\x18\x15 \x01(\r\x12!\n\x19historyBuildingInstanceID\x18\x16 \x01(\r\x12Q\n\x12\x63onsumableCallback\x18\x17 \x01(\x0b\x32\x35.Data.LandMessage.NotificationData.ConsumableCallback\x12_\n\x19memorabiliaRewardCallback\x18\x18 \x01(\x0b\x32<.Data.LandMessage.NotificationData.MemorabiliaRewardCallback\x12U\n\x14notificationCallback\x18\x19 \x01(\x0b\x32\x37.Data.LandMessage.NotificationData.NotificationCallback\x12\x63\n\x1bgainCharacterRewardCallback\x18\x1a \x01(\x0b\x32>.Data.LandMessage.NotificationData.GainCharacterRewardCallback\x12[\n\x17gainPrizeRewardCallback\x18\x1b \x01(\x0b\x32:.Data.LandMessage.NotificationData.GainPrizeRewardCallback\x12S\n\x13multiRewardCallback\x18\x1c \x01(\x0b\x32\x36.Data.LandMessage.NotificationData.MultiRewardCallback\x12g\n\x1dresourceAndItemRewardCallback\x18\x1d \x01(\x0b\x32@.Data.LandMessage.NotificationData.ResourceAndItemRewardCallback\x12\x11\n\tsubLandID\x18\x1e \x01(\r\x12\"\n\x1ahistoryCharacterInstanceID\x18\x1f \x01(\r\x1ai\n\x12\x43onsumableCallback\x12\x14\n\x0c\x63onsumableID\x18\x01 \x01(\r\x12\x14\n\x0csourceLength\x18\x02 \x01(\x05\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x17\n\x0f\x63onsumableCount\x18\x04 \x01(\r\x1a\x32\n\x19MemorabiliaRewardCallback\x12\x15\n\rmemorabiliaID\x18\x01 \x01(\r\x1a\xc2\x01\n\x14NotificationCallback\x12\r\n\x05money\x18\x01 \x01(\r\x12\x17\n\x0fpremiumCurrency\x18\x02 \x01(\r\x12\x0b\n\x03\x65xp\x18\x03 \x01(\r\x12\x14\n\x0csourceLength\x18\x04 \x01(\x05\x12\x0e\n\x06source\x18\x05 \x01(\t\x12\x14\n\x0creasonLength\x18\x06 \x01(\x05\x12\x0e\n\x06reason\x18\x07 \x01(\t\x12\x15\n\rspendablesLen\x18\x08 \x01(\x05\x12\x12\n\nspendables\x18\t \x01(\t\x1a\x84\x01\n\x1bGainCharacterRewardCallback\x12\x12\n\nbuildingID\x18\x01 \x01(\r\x12\x13\n\x0b\x63haracterID\x18\x02 \x01(\r\x12\x16\n\x0e\x63haracterCount\x18\x03 \x01(\r\x12\x14\n\x0csourceLength\x18\x04 \x01(\x05\x12\x0e\n\x06source\x18\x05 \x01(\t\x1aI\n\x17GainPrizeRewardCallback\x12\x16\n\x0especialEventID\x18\x01 \x01(\r\x12\x16\n\x0eprizeListIndex\x18\x02 \x01(\r\x1a\xfe\x02\n\x13MultiRewardCallback\x12\r\n\x05money\x18\x01 \x01(\r\x12\x17\n\x0fpremiumCurrency\x18\x02 \x01(\r\x12\x0b\n\x03\x65xp\x18\x03 \x01(\r\x12\x14\n\x0csourceLength\x18\x04 \x01(\x05\x12\x0e\n\x06source\x18\x05 \x01(\t\x12\x14\n\x0creasonLength\x18\x06 \x01(\x05\x12\x0e\n\x06reason\x18\x07 \x01(\t\x12\x12\n\nbuildingID\x18\x08 \x01(\r\x12\x13\n\x0b\x63haracterID\x18\t \x01(\r\x12\x11\n\tpositionX\x18\n \x01(\x02\x12\x11\n\tpositionY\x18\x0b \x01(\x02\x12\x11\n\tpositionZ\x18\x0c \x01(\x02\x12\x15\n\rspendablesLen\x18\r \x01(\x05\x12\x12\n\nspendables\x18\x0e \x01(\t\x12\x14\n\x0c\x63onsumableID\x18\x0f \x01(\r\x12\x17\n\x0f\x63onsumableCount\x18\x10 \x01(\r\x12\x17\n\x0f\x66loatTextLength\x18\x11 \x01(\x05\x12\x11\n\tfloatText\x18\x12 \x01(\t\x1a\xe5\x02\n\x1dResourceAndItemRewardCallback\x12\r\n\x05money\x18\x01 \x01(\r\x12\x17\n\x0fpremiumCurrency\x18\x02 \x01(\r\x12\x0b\n\x03\x65xp\x18\x03 \x01(\r\x12\x14\n\x0csourceLength\x18\x04 \x01(\x05\x12\x0e\n\x06source\x18\x05 \x01(\t\x12\x14\n\x0creasonLength\x18\x06 \x01(\x05\x12\x0e\n\x06reason\x18\x07 \x01(\t\x12\x12\n\nbuildingID\x18\x08 \x01(\r\x12\x13\n\x0b\x63haracterID\x18\t \x01(\r\x12\x15\n\rspendablesLen\x18\n \x01(\x05\x12\x12\n\nspendables\x18\x0b \x01(\t\x12\x18\n\x10rewardBuildingID\x18\x0c \x01(\r\x12\x1a\n\x12rewardConsumableID\x18\r \x01(\r\x12\x17\n\x0f\x66loatTextLength\x18\x0e \x01(\x05\x12\x11\n\tfloatText\x18\x0f \x01(\t\x12\r\n\x05\x66lags\x18\x10 \x01(\x05\x1a\xe2\x01\n\x11InventoryItemData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x10\n\x08itemType\x18\x02 \x01(\x05\x12\x0e\n\x06itemID\x18\x03 \x01(\x05\x12\r\n\x05\x63ount\x18\x04 \x01(\x05\x12\x13\n\x0bisOwnerList\x18\x05 \x01(\x08\x12\"\n\townerList\x18\x06 \x01(\x0b\x32\x0f.Data.OwnerList\x12\x10\n\x08\x66romLand\x18\x07 \x01(\x05\x12\x11\n\tsourceLen\x18\x08 \x01(\x05\x12\x0e\n\x06source\x18\t \x01(\t\x1a\x64\n\x13MemorabiliaItemData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x0e\n\x06itemID\x18\x02 \x01(\r\x12\r\n\x05\x63ount\x18\x03 \x01(\r\x1ai\n\x15PremiumUnlockItemData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x0e\n\x06itemID\x18\x02 \x01(\r\x12\x10\n\x08itemType\x18\x03 \x01(\x05\x1a\xdc\x02\n\x12\x45ventCountListData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x13\n\x0bnumElements\x18\x02 \x01(\x05\x12\x39\n\x05\x65vent\x18\x03 \x03(\x0b\x32*.Data.LandMessage.EventCountListData.Event\x1a\xc5\x01\n\x05\x45vent\x12\r\n\x05\x63ount\x18\x01 \x01(\x05\x12\x0c\n\x04type\x18\x02 \x01(\x05\x12\r\n\x05jobID\x18\x03 \x01(\x05\x12\x0e\n\x06\x63harID\x18\x04 \x01(\x05\x12\x0f\n\x07\x62uildID\x18\x05 \x01(\x05\x12\x11\n\tconsumeID\x18\x06 \x01(\x05\x12\x12\n\nbuildingID\x18\x07 \x01(\x05\x12\x12\n\nfriendLand\x18\x08 \x01(\x05\x12\x13\n\x0b\x63haracterID\x18\t \x01(\x05\x12\x0c\n\x04\x61rg1\x18\n \x01(\x05\x12\x11\n\tupdatedAt\x18\x0b \x01(\x03\x1a\x91\x01\n\x0f\x41\x63tionLimitData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04time\x18\x03 \x01(\x03\x12\r\n\x05\x63ount\x18\x04 \x01(\x05\x12\x0f\n\x07special\x18\x05 \x01(\x05\x12\x12\n\nfakeFriend\x18\x06 \x01(\x08\x1a\xf6\x01\n\x0bSidebarData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x1a\n\x12numSidebarElements\x18\x02 \x01(\x05\x12\x44\n\x0esidebarElement\x18\x03 \x03(\x0b\x32,.Data.LandMessage.SidebarData.SidebarElement\x1aU\n\x0eSidebarElement\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x12\n\nidentifier\x18\x02 \x01(\x05\x12\r\n\x05state\x18\x03 \x01(\x05\x12\x12\n\nupdateTime\x18\x04 \x01(\x03\x1a\xd2\x01\n\x11\x43haracterSetsData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x17\n\x0fnumCompleteSets\x18\x02 \x01(\x05\x12\x46\n\x0c\x63haracterSet\x18\x03 \x03(\x0b\x32\x30.Data.LandMessage.CharacterSetsData.CharacterSet\x1a,\n\x0c\x43haracterSet\x12\x0e\n\x06length\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x1a\x9e\x01\n\x15PushNotificationsData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x0c\n\x04type\x18\x02 \x01(\x05\x12\x14\n\x0cpushIDLength\x18\x03 \x01(\x05\x12\x0e\n\x06pushID\x18\x04 \x01(\t\x12\x11\n\thasSource\x18\x05 \x01(\x08\x12\x0e\n\x06source\x18\x06 \x01(\r\x1a\x97\x02\n\x0fTimedScriptData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x14\n\x0c\x63reationTime\x18\x02 \x01(\x03\x12\x10\n\x08waitTime\x18\x03 \x01(\x05\x12\x15\n\rscriptnamelen\x18\x04 \x01(\x05\x12\x18\n\x10scriptpackagelen\x18\x05 \x01(\x05\x12\x12\n\nscriptname\x18\x06 \x01(\t\x12\x15\n\rscriptpackage\x18\x07 \x01(\t\x12\x18\n\x10scriptobjnamelen\x18\x08 \x01(\x05\x12\x15\n\rscriptobjname\x18\t \x01(\t\x12\x10\n\x08\x65ntityID\x18\n \x01(\x05\x12\r\n\x05\x66lags\x18\x0b \x01(\r\x1a\xc2\x01\n\x10\x42onusUnlocksData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x12\n\nnumEntries\x18\x02 \x01(\x05\x12\x41\n\nbonusEntry\x18\x03 \x03(\x0b\x32-.Data.LandMessage.BonusUnlocksData.BonusEntry\x1a\'\n\nBonusEntry\x12\n\n\x02id\x18\x01 \x01(\x05\x12\r\n\x05value\x18\x02 \x01(\x08\x1a[\n\x14\x43haracterUnlocksData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x13\n\x0b\x63haracterID\x18\x02 \x01(\r\x1a\x9b\x01\n\x0fSkinUnlocksData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x15\n\rskinUnlockLen\x18\x02 \x01(\x05\x12\x12\n\nskinUnlock\x18\x03 \x01(\t\x12\x17\n\x0fskinReceivedLen\x18\x04 \x01(\x05\x12\x14\n\x0cskinReceived\x18\x05 \x01(\t\x1a\x96\x02\n\x11\x44\x65layedActionData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x0c\n\x04type\x18\x02 \x01(\x05\x12\x11\n\tsourceLen\x18\x03 \x01(\x05\x12\x0e\n\x06source\x18\x04 \x01(\t\x12\x11\n\treasonLen\x18\x05 \x01(\x05\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x42\n\nrewardData\x18\x07 \x01(\x0b\x32..Data.LandMessage.DelayedActionData.RewardData\x1a\x39\n\nRewardData\x12\r\n\x05money\x18\x01 \x01(\r\x12\x0b\n\x03\x65xp\x18\x02 \x01(\r\x12\x0f\n\x07premium\x18\x03 \x01(\r\x1ak\n\x0eSpendablesData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12)\n\tspendable\x18\x02 \x03(\x0b\x32\x16.Data.SpendableElement\x1a\xb6\x03\n\x15TimedCharacterDataSet\x12V\n\x12timedCharacterData\x18\x01 \x03(\x0b\x32:.Data.LandMessage.TimedCharacterDataSet.TimedCharacterData\x1a\xc4\x02\n\x12TimedCharacterData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12#\n\x1btimedCharacterInstanceIDLen\x18\x02 \x01(\r\x12 \n\x18timedCharacterInstanceID\x18\x03 \x01(\t\x12\x13\n\x0b\x63haracterID\x18\x04 \x01(\r\x12\x11\n\tsubLandID\x18\x05 \x01(\r\x12\x19\n\x11\x63haracterOwnerLen\x18\x06 \x01(\r\x12\x16\n\x0e\x63haracterOwner\x18\x07 \x01(\t\x12\x14\n\x0clandOwnerLen\x18\x08 \x01(\r\x12\x11\n\tlandOwner\x18\t \x01(\t\x12\x13\n\x0btimeCreated\x18\n \x01(\x03\x12\x10\n\x08lifeSpan\x18\x0b \x01(\x03\x12\x0c\n\x04\x66lag\x18\x0c \x01(\r\x1a\xd1\x03\n\x0b\x42\x61nkDataSet\x12\x38\n\x08\x62\x61nkData\x18\x01 \x03(\x0b\x32&.Data.LandMessage.BankDataSet.BankData\x1a\x8a\x01\n\x07\x44\x65posit\x12$\n\x04\x63ost\x18\x01 \x01(\x0b\x32\x16.Data.CurrencySaveData\x12\x18\n\x10\x64\x65positedByIDLen\x18\x02 \x01(\r\x12\x15\n\rdepositedByID\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65positedAt\x18\x04 \x01(\x03\x12\x13\n\x0b\x62uildingRef\x18\x05 \x01(\r\x1aI\n\x0b\x44\x65positData\x12:\n\x0b\x64\x65positData\x18\x01 \x03(\x0b\x32%.Data.LandMessage.BankDataSet.Deposit\x1a\xaf\x01\n\x08\x42\x61nkData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x13\n\x0b\x62uildingRef\x18\x02 \x01(\r\x12\x11\n\tsubLandID\x18\x03 \x01(\r\x12\x0e\n\x06\x62\x61nkID\x18\x04 \x01(\r\x12;\n\x08\x64\x65posits\x18\x06 \x01(\x0b\x32).Data.LandMessage.BankDataSet.DepositData\x1a\xe2\x08\n\x11SpecialEventsData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x46\n\x0cspecialEvent\x18\x02 \x03(\x0b\x32\x30.Data.LandMessage.SpecialEventsData.SpecialEvent\x1a\xd4\x07\n\x0cSpecialEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x12\n\nupdateTime\x18\x04 \x01(\x03\x12$\n\tvariables\x18\x05 \x01(\x0b\x32\x11.Data.VariableSet\x12_\n\x0cprizeDataSet\x18\x06 \x01(\x0b\x32I.Data.LandMessage.SpecialEventsData.SpecialEvent.SpecialEventPrizeDataSet\x12\x46\n\x15timedCharacterDataSet\x18\x07 \x01(\x0b\x32\'.Data.LandMessage.TimedCharacterDataSet\x12\x32\n\x0b\x62\x61nkDataSet\x18\x08 \x01(\x0b\x32\x1d.Data.LandMessage.BankDataSet\x12\x34\n\x12timedAttackDataSet\x18\t \x01(\x0b\x32\x18.Data.TimedAttackDataSet\x12&\n\x0btimeGateSet\x18\n \x01(\x0b\x32\x11.Data.TimeGateSet\x12Z\n\x0egeneralBuffers\x18\x0b \x01(\x0b\x32\x42.Data.LandMessage.SpecialEventsData.SpecialEvent.GeneralBufferSets\x1a\xc5\x02\n\x18SpecialEventPrizeDataSet\x12r\n\tprizeData\x18\x01 \x03(\x0b\x32_.Data.LandMessage.SpecialEventsData.SpecialEvent.SpecialEventPrizeDataSet.SpecialEventPrizeData\x1a\xb4\x01\n\x15SpecialEventPrizeData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x13\n\x0bprizeListID\x18\x02 \x01(\r\x12\x11\n\tnextPrize\x18\x03 \x01(\r\x12\x13\n\x0bprizeChance\x18\x04 \x01(\x02\x12\x17\n\x0fnextPrizeRushed\x18\x05 \x01(\x08\x12\x15\n\rnextResetTime\x18\x06 \x01(\x03\x1a\x9e\x01\n\x11GeneralBufferSets\x12_\n\tbufferSet\x18\x01 \x03(\x0b\x32L.Data.LandMessage.SpecialEventsData.SpecialEvent.GeneralBufferSets.BufferSet\x1a(\n\tBufferSet\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0f\n\x07\x62uffers\x18\x02 \x03(\x0c\x1a\xd0\x01\n\x0e\x46\x61keFriendData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x11\n\ttownLevel\x18\x02 \x01(\x05\x12\x13\n\x0b\x62uildingLen\x18\x03 \x01(\x05\x12\x10\n\x08\x62uilding\x18\x04 \x01(\t\x12\x15\n\ractionTypeLen\x18\x05 \x01(\x05\x12\x12\n\nactionType\x18\x06 \x01(\t\x12\x15\n\ractionTimeLen\x18\x07 \x01(\x03\x12\x12\n\nactionTime\x18\x08 \x01(\t\x1a\xbc\x02\n\x0eQuestGroupData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x14\n\x0cquestGroupID\x18\x02 \x01(\r\x12\x17\n\x0fquestGroupState\x18\x03 \x01(\x05\x12\x14\n\x0c\x63urrentChild\x18\x04 \x01(\x05\x12\x11\n\tlastChild\x18\x05 \x01(\x05\x12\x13\n\x0bnumChildren\x18\x06 \x01(\x05\x12\x16\n\x0e\x63hildIDListLen\x18\x07 \x01(\x05\x12\x15\n\rweightListLen\x18\x08 \x01(\x05\x12\x13\n\x0b\x63hildIDList\x18\t \x01(\t\x12\x12\n\nweightList\x18\n \x01(\t\x12\x18\n\x10numCompleteDaily\x18\x0b \x01(\r\x12\x1b\n\x13\x64\x61ilyCompletionTime\x18\x0c \x01(\x03\x1az\n\x15ProcessedPurchaseData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x16\n\x0eidAndCountList\x18\x02 \x01(\t\x12\x19\n\x11idAndCountListLen\x18\x03 \x01(\x05\x1a\xcc\x01\n\x16\x43ustomFriendActionData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x18\n\x10\x62uildingInstance\x18\x02 \x01(\r\x12\x12\n\nfriendName\x18\x03 \x01(\t\x12\x15\n\rfriendNameLen\x18\x04 \x01(\x05\x12\x12\n\nactionType\x18\x05 \x01(\t\x12\x15\n\ractionTypeLen\x18\x06 \x01(\x05\x12\x12\n\nisBuilding\x18\x07 \x01(\x08\x1a\xeb\x01\n\x0eGameObjectInfo\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12?\n\ngameObject\x18\x02 \x03(\x0b\x32+.Data.LandMessage.GameObjectInfo.GameObject\x1ah\n\nGameObject\x12\x0e\n\x06\x64\x61taId\x18\x01 \x01(\r\x12\x16\n\x0egameObjectType\x18\x02 \x01(\r\x12\x12\n\nunlockTime\x18\x03 \x01(\x03\x12\x0e\n\x06locked\x18\x04 \x01(\x08\x12\x0e\n\x06viewed\x18\x05 \x01(\x08\x1a\x9a\x02\n\x0bSubLandData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x11\n\tsubLandID\x18\x02 \x01(\r\x12\x12\n\nlandBlocks\x18\x03 \x01(\t\x12\x32\n\x0bterrainData\x18\x04 \x03(\x0b\x32\x1d.Data.LandMessage.TerrainData\x12\x17\n\x0f\x62uildingsSorted\x18\x05 \x01(\x08\x12\x16\n\x0elandBlockWidth\x18\x06 \x01(\r\x12\x17\n\x0flandBlockHeight\x18\x07 \x01(\r\x12\x1a\n\x12landBlockPositionX\x18\x08 \x01(\x05\x12\x1a\n\x12landBlockPositionY\x18\t \x01(\x05\x1a\xe8\x01\n\x0cMinigameData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x12\n\nminigameID\x18\x02 \x01(\r\x12\x15\n\rbuildingRefID\x18\x03 \x01(\r\x12\r\n\x05state\x18\x04 \x01(\r\x12\x12\n\nupdateTime\x18\x05 \x01(\x03\x12\x11\n\tprizeList\x18\x06 \x01(\t\x12\x14\n\x0cprizeListLen\x18\x07 \x01(\x05\x12\x16\n\x0etappedIndecies\x18\x08 \x01(\t\x12\x19\n\x11tappedIndeciesLen\x18\t \x01(\x05\x1ay\n\x13\x43ollectionItemsData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x0e\n\x06itemID\x18\x02 \x01(\r\x12\r\n\x05\x63ount\x18\x03 \x01(\r\x12\x13\n\x0bvisualCount\x18\x04 \x01(\r\x1a\x8f\x01\n\x0e\x46riendListData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x10\n\x08\x66riendID\x18\x02 \x01(\t\x12\x11\n\thideInMap\x18\x03 \x01(\x08\x12\x16\n\x0ehasBeenVisited\x18\x04 \x01(\x08\x12\x10\n\x08isOrigin\x18\x05 \x01(\x08\x1aq\n\x11\x46riendActionCount\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x0c\n\x04time\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x05\x12\x0f\n\x07special\x18\x04 \x01(\x05\x1a\xb8\x01\n\x14SavedRecommendations\x12\x1a\n\x12reccomendationType\x18\x01 \x01(\x05\x12\x11\n\tentryName\x18\x02 \x01(\t\x12\x11\n\tsublandID\x18\x03 \x01(\x05\x12\x0c\n\x04time\x18\x04 \x01(\x03\x12\x15\n\rcharacterName\x18\x05 \x01(\t\x12\x0e\n\x06number\x18\x06 \x01(\x05\x12\x11\n\textraName\x18\x07 \x01(\t\x12\x16\n\x0epopularityTime\x18\x08 \x01(\x02\x1a\xfb\x01\n\x0f\x41mazonDimension\x12R\n\x13\x61mazonDimensionType\x18\x01 \x01(\x0e\x32\x35.Data.LandMessage.AmazonDimension.AmazonDimensionType\x12\x1b\n\x13\x61mazonDimensionName\x18\x02 \x01(\t\x12\x1c\n\x14\x61mazonDimensionValue\x18\x03 \x01(\t\"Y\n\x13\x41mazonDimensionType\x12 \n\x1c\x41MAZON_DIMENSION_TYPE_STRING\x10\x01\x12 \n\x1c\x41MAZON_DIMENSION_TYPE_NUMBER\x10\x02\x1a\xa7\x06\n\x10\x44\x61ilyTaskMessage\x12\x19\n\x11numTasksCompleted\x18\x01 \x01(\x05\x12\x12\n\nlastCancel\x18\x02 \x01(\x03\x12\x16\n\x0enumTasksQueued\x18\x03 \x01(\x05\x12\x13\n\x0btaskSetName\x18\x04 \x01(\t\x12\x46\n\x0ctaskDataList\x18\x05 \x03(\x0b\x32\x30.Data.LandMessage.DailyTaskMessage.DailyTaskData\x12\x12\n\nlastViewed\x18\x06 \x01(\x03\x12R\n\x10TaskCoolDownList\x18\x07 \x03(\x0b\x32\x38.Data.LandMessage.DailyTaskMessage.DailyTaskCoolDownData\x12\x19\n\x11lastTimeTaskAdded\x18\x08 \x01(\x03\x12Z\n\x12rewardCooldownList\x18\t \x03(\x0b\x32>.Data.LandMessage.DailyTaskMessage.DailyTaskRewardCoolDownData\x12\x1a\n\x12\x61\x63tiveMetaRewardID\x18\n \x01(\r\x12\x12\n\nqueuedTask\x18\x0b \x01(\r\x12\x1d\n\x15lastTimeTaskCompleted\x18\x0c \x01(\x03\x12 \n\x18totalChallengesCompleted\x18\r \x01(\x03\x12\x1b\n\x13totalTasksCompleted\x18\x0e \x01(\x03\x1ao\n\rDailyTaskData\x12\x0f\n\x07questID\x18\x01 \x01(\r\x12\x13\n\x0btimeStarted\x18\x02 \x01(\x03\x12\x14\n\x0ctimeFinished\x18\x03 \x01(\x03\x12\x10\n\x08rewardID\x18\x04 \x01(\r\x12\x10\n\x08menuSlot\x18\x05 \x01(\r\x1a\x44\n\x15\x44\x61ilyTaskCoolDownData\x12\x0f\n\x07questID\x18\x01 \x01(\r\x12\x1a\n\x12\x63ooldownExpireTime\x18\x02 \x01(\x03\x1aK\n\x1b\x44\x61ilyTaskRewardCoolDownData\x12\x10\n\x08rewardID\x18\x01 \x01(\r\x12\x1a\n\x12\x63ooldownExpireTime\x18\x02 \x01(\x03\x1aH\n\x12RoadMapDataMessage\x12\x32\n\x0broadMapList\x18\x01 \x03(\x0b\x32\x1d.Data.LandMessage.TerrainData\x1aU\n\x0f\x41\x64HocObjectData\x12.\n\x06header\x18\x01 \x01(\x0b\x32\x1e.Data.LandMessage.EntityHeader\x12\x12\n\nidentifier\x18\x02 \x01(\r\x1at\n\tTimerData\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tdeltaTime\x18\x02 \x01(\x01\x12\x11\n\tstartTime\x18\x03 \x01(\x03\x12\x0f\n\x07\x65ndTime\x18\x04 \x01(\x03\x12\x12\n\nexpiryTime\x18\x05 \x01(\x03\x12\x0e\n\x06paused\x18\x06 \x01(\x08\x1a\xb4\x03\n\x14JobCensusDataMessage\x12K\n\rjobCensusData\x18\x01 \x03(\x0b\x32\x34.Data.LandMessage.JobCensusDataMessage.JobCensusData\x1a\xce\x02\n\rJobCensusData\x12X\n\x07jobData\x18\x01 \x03(\x0b\x32G.Data.LandMessage.JobCensusDataMessage.JobCensusData.JobCensusDataEntry\x12_\n\x0ejobPremiumData\x18\x02 \x03(\x0b\x32G.Data.LandMessage.JobCensusDataMessage.JobCensusData.JobCensusDataEntry\x12\x17\n\x0fjobDataRandSeed\x18\x03 \x01(\r\x12\x12\n\nbuildingID\x18\x04 \x01(\r\x1aU\n\x12JobCensusDataEntry\x12\r\n\x05jobID\x18\x01 \x01(\r\x12\x13\n\x0b\x63haracterID\x18\x02 \x01(\r\x12\x1b\n\x13\x63haracterInstanceID\x18\x03 \x01(\r\x1a\xd1\x04\n\nDNAMessage\x12H\n\x10\x64naSessionEvents\x18\x01 \x03(\x0b\x32..Data.LandMessage.DNAMessage.DNATelemetryEvent\x12\x44\n\x0f\x64naEventsEvents\x18\x02 \x03(\x0b\x32+.Data.LandMessage.DNAMessage.DNAEventsEvent\x12I\n\x11\x64naLifeTimeEvents\x18\x03 \x03(\x0b\x32..Data.LandMessage.DNAMessage.DNATelemetryEvent\x12\x14\n\x0csessionCount\x18\x04 \x01(\x05\x1a\xdf\x01\n\x11\x44NATelemetryEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\x03\x12S\n\tdnaParams\x18\x03 \x03(\x0b\x32@.Data.LandMessage.DNAMessage.DNATelemetryEvent.DNATelemetryParam\x12\x14\n\x0csessioncount\x18\x04 \x01(\r\x1a@\n\x11\x44NATelemetryParam\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x0e\n\x06source\x18\x02 \x01(\x05\x12\r\n\x05\x65xtra\x18\x03 \x01(\x05\x1ap\n\x0e\x44NAEventsEvent\x12\x46\n\x0etelemetryEvent\x18\x01 \x03(\x0b\x32..Data.LandMessage.DNAMessage.DNATelemetryEvent\x12\x16\n\x0especialEventID\x18\x02 \x01(\x05\x1a\xd4\x05\n\x19GroupStorageBundleMessage\x12Z\n\x12groupStorageBundle\x18\x01 \x03(\x0b\x32>.Data.LandMessage.GroupStorageBundleMessage.GroupStorageBundle\x1a\xda\x04\n\x12GroupStorageBundle\x12\x7f\n\x1bgroupStorageBundleEntryData\x18\x01 \x03(\x0b\x32Z.Data.LandMessage.GroupStorageBundleMessage.GroupStorageBundle.GroupStorageBundleEntryData\x12{\n\x19groupStorageBundleRoadMap\x18\x02 \x03(\x0b\x32X.Data.LandMessage.GroupStorageBundleMessage.GroupStorageBundle.GroupStorageBundleRoadMap\x12\x12\n\noriginPosX\x18\x03 \x01(\x05\x12\x12\n\noriginPosY\x18\x04 \x01(\x05\x12\x13\n\x0btimestampId\x18\x05 \x01(\x04\x1ax\n\x1bGroupStorageBundleEntryData\x12\x10\n\x08objectID\x18\x01 \x01(\r\x12\x10\n\x08serverID\x18\x02 \x01(\r\x12\x11\n\tpositionX\x18\x03 \x01(\x05\x12\x11\n\tpositionY\x18\x04 \x01(\x05\x12\x0f\n\x07\x66lipped\x18\x05 \x01(\r\x1a\x8e\x01\n\x19GroupStorageBundleRoadMap\x12\x11\n\tsubLandID\x18\x01 \x01(\r\x12\x14\n\x0cmapDataSizeX\x18\x02 \x01(\r\x12\x14\n\x0cmapDataSizeY\x18\x03 \x01(\r\x12\x32\n\x0bterrainData\x18\x04 \x01(\x0b\x32\x1d.Data.LandMessage.TerrainData\"\xe7\x13\n\x0c\x45ventMessage\x12\n\n\x02id\x18\x01 \x01(\t\x12\x12\n\ntoPlayerId\x18\x02 \x01(\t\x12\x14\n\x0c\x66romPlayerId\x18\x03 \x01(\t\x12\x11\n\teventType\x18\x04 \x01(\t\x12\x11\n\tcreatedAt\x18\x05 \x01(\x03\x12\x11\n\tupdatedAt\x18\n \x01(\x03\x12\x0b\n\x03inc\x18\x06 \x01(\x03\x12/\n\teventData\x18\x07 \x01(\x0b\x32\x1c.Data.EventMessage.EventData\x12\x16\n\x0etargetEntityId\x18\x08 \x01(\t\x12\x13\n\x0buniqueEvent\x18\t \x01(\x08\x1a\xfc\x11\n\tEventData\x12\x1a\n\x12\x62uildingInstanceID\x18\x01 \x01(\x05\x12\x13\n\x0brequestTime\x18\x02 \x01(\x03\x12\x13\n\x0brequestType\x18\x03 \x01(\x05\x12M\n\x13\x63haracterGainedData\x18\x04 \x01(\x0b\x32\x30.Data.EventMessage.EventData.CharacterGainedData\x12I\n\x11\x63haracterLostData\x18\x05 \x01(\x0b\x32..Data.EventMessage.EventData.CharacterLostData\x12S\n\x16stealBuildingEventData\x18\x06 \x01(\x0b\x32\x33.Data.EventMessage.EventData.StealBuildingEventData\x12M\n\x13giftMemorabiliaData\x18\x07 \x01(\x0b\x32\x30.Data.EventMessage.EventData.GiftMemorabiliaData\x12I\n\x11shopCollectedData\x18\x08 \x01(\x0b\x32..Data.EventMessage.EventData.ShopCollectedData\x12K\n\x12vandalismEventData\x18\t \x01(\x0b\x32/.Data.EventMessage.EventData.VandalismEventData\x12I\n\x11sidebarUpdateData\x18\n \x01(\x0b\x32..Data.EventMessage.EventData.SidebarUpdateData\x12K\n\x12returnBuildingData\x18\x0b \x01(\x0b\x32/.Data.EventMessage.EventData.ReturnBuildingData\x12\x43\n\x0eplayScriptData\x18\x0c \x01(\x0b\x32+.Data.EventMessage.EventData.PlayScriptData\x12U\n\x17\x63ustomFriendRequestData\x18\r \x01(\x0b\x32\x34.Data.EventMessage.EventData.CustomFriendRequestData\x12W\n\x18playScriptAtPositionData\x18\x0e \x01(\x0b\x32\x35.Data.EventMessage.EventData.PlayScriptAtPositionData\x12\x16\n\x0e\x64isplayNameLen\x18\x0f \x01(\x05\x12\x13\n\x0b\x64isplayName\x18\x10 \x01(\t\x12\x11\n\tupdatedAt\x18\x11 \x01(\x03\x12W\n\x18loseResourcesRequestData\x18\x12 \x01(\x0b\x32\x35.Data.EventMessage.EventData.LoseResourcesRequestData\x1a*\n\x13\x43haracterGainedData\x12\x13\n\x0b\x63haracterID\x18\x01 \x01(\r\x1a(\n\x11\x43haracterLostData\x12\x13\n\x0b\x63haracterID\x18\x01 \x01(\r\x1al\n\x16StealBuildingEventData\x12\x1a\n\x12\x62uildingInstanceID\x18\x01 \x01(\r\x12\x12\n\nbuildingID\x18\x02 \x01(\r\x12\"\n\townerList\x18\x03 \x01(\x0b\x32\x0f.Data.OwnerList\x1a\x34\n\x13GiftMemorabiliaData\x12\r\n\x05setID\x18\x01 \x01(\x05\x12\x0e\n\x06itemID\x18\x02 \x01(\x05\x1a/\n\x11ShopCollectedData\x12\x1a\n\x12\x62uildingInstanceID\x18\x01 \x01(\r\x1a\x82\x01\n\x12VandalismEventData\x12\x1a\n\x12\x62uildingInstanceID\x18\x01 \x01(\r\x12\x12\n\nvandalized\x18\x02 \x01(\x08\x12\x0f\n\x07namelen\x18\x03 \x01(\x05\x12\x12\n\nvandalName\x18\x04 \x01(\t\x12\x17\n\x0ftimeOfVandalism\x18\x05 \x01(\x03\x1aX\n\x11SidebarUpdateData\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\r\n\x05state\x18\x02 \x01(\x05\x12\x12\n\nidentifier\x18\x03 \x01(\x05\x12\x12\n\nupdateTime\x18\x04 \x01(\x03\x1a\x61\n\x12ReturnBuildingData\x12\x12\n\nbuildingID\x18\x01 \x01(\r\x12\x13\n\x0bisOwnerList\x18\x02 \x01(\x08\x12\"\n\townerList\x18\x03 \x01(\x0b\x32\x0f.Data.OwnerList\x1ak\n\x0ePlayScriptData\x12\x15\n\rplayForFriend\x18\x01 \x01(\x08\x12\x0f\n\x07nameLen\x18\x02 \x01(\x05\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x12\n\npackageLen\x18\x04 \x01(\x05\x12\x0f\n\x07package\x18\x05 \x01(\t\x1a\x97\x01\n\x17\x43ustomFriendRequestData\x12\x12\n\nbuildingID\x18\x01 \x01(\r\x12\x15\n\rfriendNameLen\x18\x02 \x01(\x05\x12\x12\n\nfriendName\x18\x03 \x01(\t\x12\x15\n\ractionTypeLen\x18\x04 \x01(\x05\x12\x12\n\nactionType\x18\x05 \x01(\t\x12\x12\n\nisBuilding\x18\x06 \x01(\x08\x1a\xcd\x01\n\x18PlayScriptAtPositionData\x12\x15\n\rplayForFriend\x18\x01 \x01(\x08\x12\x0f\n\x07nameLen\x18\x02 \x01(\x05\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x12\n\npackageLen\x18\x04 \x01(\x05\x12\x0f\n\x07package\x18\x05 \x01(\t\x12\x0c\n\x04xPos\x18\x06 \x01(\x05\x12\x0c\n\x04yPos\x18\x07 \x01(\x05\x12\x11\n\tsublandId\x18\x08 \x01(\x05\x12\x14\n\x0cvariablesLen\x18\t \x01(\x05\x12\x11\n\tvariables\x18\n \x01(\x0c\x1ai\n\x18LoseResourcesRequestData\x12)\n\tresources\x18\x01 \x01(\x0b\x32\x16.Data.CurrencySaveData\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x12\n\nfriendName\x18\x03 \x01(\t\"2\n\rEventsMessage\x12!\n\x05\x65vent\x18\x01 \x03(\x0b\x32\x12.Data.EventMessage\"\xe5\x06\n\x10\x45xtraLandMessage\x12;\n\rcurrencyDelta\x18\x01 \x03(\x0b\x32$.Data.ExtraLandMessage.CurrencyDelta\x12!\n\x05\x65vent\x18\x02 \x03(\x0b\x32\x12.Data.EventMessage\x12\x41\n\x10pushNotification\x18\x03 \x03(\x0b\x32\'.Data.ExtraLandMessage.PushNotification\x12\x45\n\x12\x63ommunityGoalDelta\x18\x04 \x03(\x0b\x32).Data.ExtraLandMessage.CommunityGoalDelta\x12O\n\x17matchmakingRegistration\x18\x05 \x03(\x0b\x32..Data.ExtraLandMessage.MatchmakingRegistration\x12\x39\n\tdeviceIds\x18\x06 \x03(\x0b\x32&.Data.PurchaseRequestMessage.DeviceIds\x12\x45\n\x0f\x61pplicationInfo\x18\x07 \x01(\x0b\x32,.Data.PurchaseRequestMessage.ApplicationInfo\x12;\n\ndeviceInfo\x18\x08 \x01(\x0b\x32\'.Data.PurchaseRequestMessage.DeviceInfo\x1a\x61\n\rCurrencyDelta\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x0e\n\x06\x61mount\x18\x03 \x01(\x05\x12\x11\n\tupdatedAt\x18\x04 \x01(\x03\x12\x11\n\tproductId\x18\x05 \x01(\t\x1an\n\x10PushNotification\x12\n\n\x02id\x18\x01 \x01(\t\x12\x12\n\ntoPlayerId\x18\x02 \x01(\t\x12\x13\n\x0bscheduledIn\x18\x03 \x01(\x05\x12\x14\n\x0ctemplateName\x18\x04 \x01(\t\x12\x0f\n\x07message\x18\x05 \x01(\t\x1a\x36\n\x12\x43ommunityGoalDelta\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x03\x1aL\n\x17MatchmakingRegistration\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\x12\x1f\n\x06params\x18\x02 \x03(\x0b\x32\x0f.Data.NameValue\"\xd7\x02\n\x11\x45xtraLandResponse\x12\x44\n\x16processedCurrencyDelta\x18\x01 \x03(\x0b\x32$.Data.ExtraLandMessage.CurrencyDelta\x12*\n\x0eprocessedEvent\x18\x02 \x03(\x0b\x32\x12.Data.EventMessage\x12)\n\rreceivedEvent\x18\x03 \x03(\x0b\x32\x12.Data.EventMessage\x12<\n\rcommunityGoal\x18\x04 \x03(\x0b\x32%.Data.ExtraLandResponse.CommunityGoal\x1ag\n\rCommunityGoal\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\x12\x15\n\rprogressTotal\x18\x02 \x01(\x03\x12\x14\n\x0cprogressRate\x18\x03 \x01(\x01\x12\x17\n\x0f\x61wardThresholds\x18\x04 \x03(\x03\"\xc7\x01\n\x19\x46riendInteractionParamSet\x12\x46\n\x06params\x18\x01 \x03(\x0b\x32\x36.Data.FriendInteractionParamSet.FriendInteractionParam\x1a\x62\n\x16\x46riendInteractionParam\x12\x11\n\tstringKey\x18\x01 \x01(\t\x12\x13\n\x0bstringValue\x18\x02 \x01(\t\x12\x0e\n\x06intKey\x18\x03 \x01(\x05\x12\x10\n\x08intValue\x18\x04 \x01(\x05\"\xb9\x01\n\x14KinesisCurrencyDelta\x12;\n\rcurrencyDelta\x18\x01 \x03(\x0b\x32$.Data.ExtraLandMessage.CurrencyDelta\x12\x0e\n\x06userId\x18\x02 \x01(\t\x12\x0c\n\x04time\x18\x03 \x01(\x03\x12+\n\x0foldUserCurrency\x18\x04 \x01(\x0b\x32\x12.Data.CurrencyData\x12\x19\n\x11\x63lientSessionGUID\x18\x05 \x01(\t\"\x8c\x02\n\x14ProjectBoardParamSet\x12\x14\n\x0cnumCompleted\x18\x01 \x01(\x05\x12\x13\n\x0bstartedTime\x18\x02 \x01(\x03\x12\x37\n\x06params\x18\x03 \x03(\x0b\x32\'.Data.ProjectBoardParamSet.ProjectParam\x12\x15\n\rdismissedTime\x18\x04 \x01(\x03\x1ay\n\x0cProjectParam\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05setID\x18\x02 \x01(\x05\x12$\n\x04\x63ost\x18\x03 \x01(\x0b\x32\x16.Data.CurrencySaveData\x12&\n\x06reward\x18\x04 \x01(\x0b\x32\x16.Data.CurrencySaveData\"\xb9\x01\n\x18KinesisLandUpdateMessage\x12\"\n\x07newLand\x18\x01 \x01(\x0b\x32\x11.Data.LandMessage\x12\"\n\x07oldLand\x18\x02 \x01(\x0b\x32\x11.Data.LandMessage\x12\x12\n\nupdateTime\x18\x03 \x01(\x03\x12\x15\n\rclientVersion\x18\x04 \x01(\t\x12\x10\n\x08platform\x18\x05 \x01(\t\x12\x18\n\x10\x65ndOfSessionGUID\x18\x06 \x01(\t\"\xbd\x01\n\x0ePowerupMessage\x12\x35\n\x0bpowerupData\x18\x01 \x03(\x0b\x32 .Data.PowerupMessage.PowerupData\x1at\n\x0bPowerupData\x12\x10\n\x08\x65ntityID\x18\x01 \x01(\r\x12\x15\n\rpowerupTypeID\x18\x02 \x01(\r\x12\x13\n\x0btimeBeganMS\x18\x03 \x01(\x03\x12\x11\n\tstateEnum\x18\x04 \x01(\x05\x12\x14\n\x0ctimePausedMS\x18\x05 \x01(\x03\x42\x16\n\x14\x63om.ea.simpsons.data') 30 | 31 | _globals = globals() 32 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) 33 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'LandData_pb2', _globals) 34 | if not _descriptor._USE_C_DESCRIPTORS: 35 | _globals['DESCRIPTOR']._loaded_options = None 36 | _globals['DESCRIPTOR']._serialized_options = b'\n\024com.ea.simpsons.data' 37 | _globals['_VARIABLESET']._serialized_start=58 38 | _globals['_VARIABLESET']._serialized_end=174 39 | _globals['_VARIABLESET_VARIABLE']._serialized_start=119 40 | _globals['_VARIABLESET_VARIABLE']._serialized_end=174 41 | _globals['_SHAREDVARIABLESET']._serialized_start=177 42 | _globals['_SHAREDVARIABLESET']._serialized_end=314 43 | _globals['_SHAREDVARIABLESET_SHAREDVARIABLE']._serialized_start=256 44 | _globals['_SHAREDVARIABLESET_SHAREDVARIABLE']._serialized_end=314 45 | _globals['_TIMEGATESET']._serialized_start=317 46 | _globals['_TIMEGATESET']._serialized_end=492 47 | _globals['_TIMEGATESET_TIMEGATE']._serialized_start=378 48 | _globals['_TIMEGATESET_TIMEGATE']._serialized_end=492 49 | _globals['_ADVANCEDVARIABLESET']._serialized_start=495 50 | _globals['_ADVANCEDVARIABLESET']._serialized_end=827 51 | _globals['_ADVANCEDVARIABLESET_ADVANCEDVARIABLE']._serialized_start=581 52 | _globals['_ADVANCEDVARIABLESET_ADVANCEDVARIABLE']._serialized_end=827 53 | _globals['_TIMEDATTACKDATA']._serialized_start=830 54 | _globals['_TIMEDATTACKDATA']._serialized_end=1081 55 | _globals['_TIMEDATTACKDATASET']._serialized_start=1083 56 | _globals['_TIMEDATTACKDATASET']._serialized_end=1151 57 | _globals['_OBJECTVARIABLES']._serialized_start=1153 58 | _globals['_OBJECTVARIABLES']._serialized_end=1216 59 | _globals['_SPENDABLEELEMENT']._serialized_start=1218 60 | _globals['_SPENDABLEELEMENT']._serialized_end=1284 61 | _globals['_OWNERLIST']._serialized_start=1286 62 | _globals['_OWNERLIST']._serialized_end=1327 63 | _globals['_CURRENCYSAVEDATA']._serialized_start=1330 64 | _globals['_CURRENCYSAVEDATA']._serialized_end=1484 65 | _globals['_LANDMESSAGE']._serialized_start=1488 66 | _globals['_LANDMESSAGE']._serialized_end=22405 67 | _globals['_LANDMESSAGE_FRIENDDATA']._serialized_start=4518 68 | _globals['_LANDMESSAGE_FRIENDDATA']._serialized_end=4942 69 | _globals['_LANDMESSAGE_FRIENDDATA_SUBLANDINFO']._serialized_start=4870 70 | _globals['_LANDMESSAGE_FRIENDDATA_SUBLANDINFO']._serialized_end=4942 71 | _globals['_LANDMESSAGE_ENTITYHEADER']._serialized_start=4944 72 | _globals['_LANDMESSAGE_ENTITYHEADER']._serialized_end=4970 73 | _globals['_LANDMESSAGE_USERDATA']._serialized_start=4973 74 | _globals['_LANDMESSAGE_USERDATA']._serialized_end=6089 75 | _globals['_LANDMESSAGE_USERDATA_SAVEDRATING']._serialized_start=5984 76 | _globals['_LANDMESSAGE_USERDATA_SAVEDRATING']._serialized_end=6049 77 | _globals['_LANDMESSAGE_USERDATA_STICKERUNLOCKDATA']._serialized_start=6051 78 | _globals['_LANDMESSAGE_USERDATA_STICKERUNLOCKDATA']._serialized_end=6089 79 | _globals['_LANDMESSAGE_INNERLANDDATA']._serialized_start=6092 80 | _globals['_LANDMESSAGE_INNERLANDDATA']._serialized_end=7053 81 | _globals['_LANDMESSAGE_TERRAINDATA']._serialized_start=7056 82 | _globals['_LANDMESSAGE_TERRAINDATA']._serialized_end=7399 83 | _globals['_LANDMESSAGE_TERRAINDATA_TERRAINTYPE']._serialized_start=7222 84 | _globals['_LANDMESSAGE_TERRAINDATA_TERRAINTYPE']._serialized_end=7399 85 | _globals['_LANDMESSAGE_BUILDINGDATA']._serialized_start=7402 86 | _globals['_LANDMESSAGE_BUILDINGDATA']._serialized_end=7941 87 | _globals['_LANDMESSAGE_VECTORFLOAT']._serialized_start=7943 88 | _globals['_LANDMESSAGE_VECTORFLOAT']._serialized_end=7978 89 | _globals['_LANDMESSAGE_VECTORFLOATARRAY']._serialized_start=7980 90 | _globals['_LANDMESSAGE_VECTORFLOATARRAY']._serialized_end=8045 91 | _globals['_LANDMESSAGE_CHARACTERDATA']._serialized_start=8048 92 | _globals['_LANDMESSAGE_CHARACTERDATA']._serialized_end=8311 93 | _globals['_LANDMESSAGE_CONSUMABLEDATA']._serialized_start=8313 94 | _globals['_LANDMESSAGE_CONSUMABLEDATA']._serialized_end=8419 95 | _globals['_LANDMESSAGE_JOBDATA']._serialized_start=8422 96 | _globals['_LANDMESSAGE_JOBDATA']._serialized_end=8772 97 | _globals['_LANDMESSAGE_QUESTDATA']._serialized_start=8775 98 | _globals['_LANDMESSAGE_QUESTDATA']._serialized_end=9897 99 | _globals['_LANDMESSAGE_QUESTDATA_OBJECTIVEDATA']._serialized_start=9013 100 | _globals['_LANDMESSAGE_QUESTDATA_OBJECTIVEDATA']._serialized_end=9897 101 | _globals['_LANDMESSAGE_QUESTDATA_OBJECTIVEDATA_BUILDINGCUSTOMDATA']._serialized_start=9665 102 | _globals['_LANDMESSAGE_QUESTDATA_OBJECTIVEDATA_BUILDINGCUSTOMDATA']._serialized_end=9698 103 | _globals['_LANDMESSAGE_QUESTDATA_OBJECTIVEDATA_RESOURCESCUSTOMDATA']._serialized_start=9700 104 | _globals['_LANDMESSAGE_QUESTDATA_OBJECTIVEDATA_RESOURCESCUSTOMDATA']._serialized_end=9753 105 | _globals['_LANDMESSAGE_QUESTDATA_OBJECTIVEDATA_ITEMCOUNTCUSTOMDATA']._serialized_start=9755 106 | _globals['_LANDMESSAGE_QUESTDATA_OBJECTIVEDATA_ITEMCOUNTCUSTOMDATA']._serialized_end=9791 107 | _globals['_LANDMESSAGE_QUESTDATA_OBJECTIVEDATA_VISITFRIENDCUSTOMDATA']._serialized_start=9793 108 | _globals['_LANDMESSAGE_QUESTDATA_OBJECTIVEDATA_VISITFRIENDCUSTOMDATA']._serialized_end=9867 109 | _globals['_LANDMESSAGE_QUESTDATA_OBJECTIVEDATA_DYNAMICDATA']._serialized_start=9869 110 | _globals['_LANDMESSAGE_QUESTDATA_OBJECTIVEDATA_DYNAMICDATA']._serialized_end=9897 111 | _globals['_LANDMESSAGE_NOTIFICATIONDATA']._serialized_start=9900 112 | _globals['_LANDMESSAGE_NOTIFICATIONDATA']._serialized_end=12396 113 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_CONSUMABLECALLBACK']._serialized_start=11087 114 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_CONSUMABLECALLBACK']._serialized_end=11192 115 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_MEMORABILIAREWARDCALLBACK']._serialized_start=11194 116 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_MEMORABILIAREWARDCALLBACK']._serialized_end=11244 117 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_NOTIFICATIONCALLBACK']._serialized_start=11247 118 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_NOTIFICATIONCALLBACK']._serialized_end=11441 119 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_GAINCHARACTERREWARDCALLBACK']._serialized_start=11444 120 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_GAINCHARACTERREWARDCALLBACK']._serialized_end=11576 121 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_GAINPRIZEREWARDCALLBACK']._serialized_start=11578 122 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_GAINPRIZEREWARDCALLBACK']._serialized_end=11651 123 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_MULTIREWARDCALLBACK']._serialized_start=11654 124 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_MULTIREWARDCALLBACK']._serialized_end=12036 125 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_RESOURCEANDITEMREWARDCALLBACK']._serialized_start=12039 126 | _globals['_LANDMESSAGE_NOTIFICATIONDATA_RESOURCEANDITEMREWARDCALLBACK']._serialized_end=12396 127 | _globals['_LANDMESSAGE_INVENTORYITEMDATA']._serialized_start=12399 128 | _globals['_LANDMESSAGE_INVENTORYITEMDATA']._serialized_end=12625 129 | _globals['_LANDMESSAGE_MEMORABILIAITEMDATA']._serialized_start=12627 130 | _globals['_LANDMESSAGE_MEMORABILIAITEMDATA']._serialized_end=12727 131 | _globals['_LANDMESSAGE_PREMIUMUNLOCKITEMDATA']._serialized_start=12729 132 | _globals['_LANDMESSAGE_PREMIUMUNLOCKITEMDATA']._serialized_end=12834 133 | _globals['_LANDMESSAGE_EVENTCOUNTLISTDATA']._serialized_start=12837 134 | _globals['_LANDMESSAGE_EVENTCOUNTLISTDATA']._serialized_end=13185 135 | _globals['_LANDMESSAGE_EVENTCOUNTLISTDATA_EVENT']._serialized_start=12988 136 | _globals['_LANDMESSAGE_EVENTCOUNTLISTDATA_EVENT']._serialized_end=13185 137 | _globals['_LANDMESSAGE_ACTIONLIMITDATA']._serialized_start=13188 138 | _globals['_LANDMESSAGE_ACTIONLIMITDATA']._serialized_end=13333 139 | _globals['_LANDMESSAGE_SIDEBARDATA']._serialized_start=13336 140 | _globals['_LANDMESSAGE_SIDEBARDATA']._serialized_end=13582 141 | _globals['_LANDMESSAGE_SIDEBARDATA_SIDEBARELEMENT']._serialized_start=13497 142 | _globals['_LANDMESSAGE_SIDEBARDATA_SIDEBARELEMENT']._serialized_end=13582 143 | _globals['_LANDMESSAGE_CHARACTERSETSDATA']._serialized_start=13585 144 | _globals['_LANDMESSAGE_CHARACTERSETSDATA']._serialized_end=13795 145 | _globals['_LANDMESSAGE_CHARACTERSETSDATA_CHARACTERSET']._serialized_start=13751 146 | _globals['_LANDMESSAGE_CHARACTERSETSDATA_CHARACTERSET']._serialized_end=13795 147 | _globals['_LANDMESSAGE_PUSHNOTIFICATIONSDATA']._serialized_start=13798 148 | _globals['_LANDMESSAGE_PUSHNOTIFICATIONSDATA']._serialized_end=13956 149 | _globals['_LANDMESSAGE_TIMEDSCRIPTDATA']._serialized_start=13959 150 | _globals['_LANDMESSAGE_TIMEDSCRIPTDATA']._serialized_end=14238 151 | _globals['_LANDMESSAGE_BONUSUNLOCKSDATA']._serialized_start=14241 152 | _globals['_LANDMESSAGE_BONUSUNLOCKSDATA']._serialized_end=14435 153 | _globals['_LANDMESSAGE_BONUSUNLOCKSDATA_BONUSENTRY']._serialized_start=14396 154 | _globals['_LANDMESSAGE_BONUSUNLOCKSDATA_BONUSENTRY']._serialized_end=14435 155 | _globals['_LANDMESSAGE_CHARACTERUNLOCKSDATA']._serialized_start=14437 156 | _globals['_LANDMESSAGE_CHARACTERUNLOCKSDATA']._serialized_end=14528 157 | _globals['_LANDMESSAGE_SKINUNLOCKSDATA']._serialized_start=14531 158 | _globals['_LANDMESSAGE_SKINUNLOCKSDATA']._serialized_end=14686 159 | _globals['_LANDMESSAGE_DELAYEDACTIONDATA']._serialized_start=14689 160 | _globals['_LANDMESSAGE_DELAYEDACTIONDATA']._serialized_end=14967 161 | _globals['_LANDMESSAGE_DELAYEDACTIONDATA_REWARDDATA']._serialized_start=14910 162 | _globals['_LANDMESSAGE_DELAYEDACTIONDATA_REWARDDATA']._serialized_end=14967 163 | _globals['_LANDMESSAGE_SPENDABLESDATA']._serialized_start=14969 164 | _globals['_LANDMESSAGE_SPENDABLESDATA']._serialized_end=15076 165 | _globals['_LANDMESSAGE_TIMEDCHARACTERDATASET']._serialized_start=15079 166 | _globals['_LANDMESSAGE_TIMEDCHARACTERDATASET']._serialized_end=15517 167 | _globals['_LANDMESSAGE_TIMEDCHARACTERDATASET_TIMEDCHARACTERDATA']._serialized_start=15193 168 | _globals['_LANDMESSAGE_TIMEDCHARACTERDATASET_TIMEDCHARACTERDATA']._serialized_end=15517 169 | _globals['_LANDMESSAGE_BANKDATASET']._serialized_start=15520 170 | _globals['_LANDMESSAGE_BANKDATASET']._serialized_end=15985 171 | _globals['_LANDMESSAGE_BANKDATASET_DEPOSIT']._serialized_start=15594 172 | _globals['_LANDMESSAGE_BANKDATASET_DEPOSIT']._serialized_end=15732 173 | _globals['_LANDMESSAGE_BANKDATASET_DEPOSITDATA']._serialized_start=15734 174 | _globals['_LANDMESSAGE_BANKDATASET_DEPOSITDATA']._serialized_end=15807 175 | _globals['_LANDMESSAGE_BANKDATASET_BANKDATA']._serialized_start=15810 176 | _globals['_LANDMESSAGE_BANKDATASET_BANKDATA']._serialized_end=15985 177 | _globals['_LANDMESSAGE_SPECIALEVENTSDATA']._serialized_start=15988 178 | _globals['_LANDMESSAGE_SPECIALEVENTSDATA']._serialized_end=17110 179 | _globals['_LANDMESSAGE_SPECIALEVENTSDATA_SPECIALEVENT']._serialized_start=16130 180 | _globals['_LANDMESSAGE_SPECIALEVENTSDATA_SPECIALEVENT']._serialized_end=17110 181 | _globals['_LANDMESSAGE_SPECIALEVENTSDATA_SPECIALEVENT_SPECIALEVENTPRIZEDATASET']._serialized_start=16624 182 | _globals['_LANDMESSAGE_SPECIALEVENTSDATA_SPECIALEVENT_SPECIALEVENTPRIZEDATASET']._serialized_end=16949 183 | _globals['_LANDMESSAGE_SPECIALEVENTSDATA_SPECIALEVENT_SPECIALEVENTPRIZEDATASET_SPECIALEVENTPRIZEDATA']._serialized_start=16769 184 | _globals['_LANDMESSAGE_SPECIALEVENTSDATA_SPECIALEVENT_SPECIALEVENTPRIZEDATASET_SPECIALEVENTPRIZEDATA']._serialized_end=16949 185 | _globals['_LANDMESSAGE_SPECIALEVENTSDATA_SPECIALEVENT_GENERALBUFFERSETS']._serialized_start=16952 186 | _globals['_LANDMESSAGE_SPECIALEVENTSDATA_SPECIALEVENT_GENERALBUFFERSETS']._serialized_end=17110 187 | _globals['_LANDMESSAGE_SPECIALEVENTSDATA_SPECIALEVENT_GENERALBUFFERSETS_BUFFERSET']._serialized_start=17070 188 | _globals['_LANDMESSAGE_SPECIALEVENTSDATA_SPECIALEVENT_GENERALBUFFERSETS_BUFFERSET']._serialized_end=17110 189 | _globals['_LANDMESSAGE_FAKEFRIENDDATA']._serialized_start=17113 190 | _globals['_LANDMESSAGE_FAKEFRIENDDATA']._serialized_end=17321 191 | _globals['_LANDMESSAGE_QUESTGROUPDATA']._serialized_start=17324 192 | _globals['_LANDMESSAGE_QUESTGROUPDATA']._serialized_end=17640 193 | _globals['_LANDMESSAGE_PROCESSEDPURCHASEDATA']._serialized_start=17642 194 | _globals['_LANDMESSAGE_PROCESSEDPURCHASEDATA']._serialized_end=17764 195 | _globals['_LANDMESSAGE_CUSTOMFRIENDACTIONDATA']._serialized_start=17767 196 | _globals['_LANDMESSAGE_CUSTOMFRIENDACTIONDATA']._serialized_end=17971 197 | _globals['_LANDMESSAGE_GAMEOBJECTINFO']._serialized_start=17974 198 | _globals['_LANDMESSAGE_GAMEOBJECTINFO']._serialized_end=18209 199 | _globals['_LANDMESSAGE_GAMEOBJECTINFO_GAMEOBJECT']._serialized_start=18105 200 | _globals['_LANDMESSAGE_GAMEOBJECTINFO_GAMEOBJECT']._serialized_end=18209 201 | _globals['_LANDMESSAGE_SUBLANDDATA']._serialized_start=18212 202 | _globals['_LANDMESSAGE_SUBLANDDATA']._serialized_end=18494 203 | _globals['_LANDMESSAGE_MINIGAMEDATA']._serialized_start=18497 204 | _globals['_LANDMESSAGE_MINIGAMEDATA']._serialized_end=18729 205 | _globals['_LANDMESSAGE_COLLECTIONITEMSDATA']._serialized_start=18731 206 | _globals['_LANDMESSAGE_COLLECTIONITEMSDATA']._serialized_end=18852 207 | _globals['_LANDMESSAGE_FRIENDLISTDATA']._serialized_start=18855 208 | _globals['_LANDMESSAGE_FRIENDLISTDATA']._serialized_end=18998 209 | _globals['_LANDMESSAGE_FRIENDACTIONCOUNT']._serialized_start=19000 210 | _globals['_LANDMESSAGE_FRIENDACTIONCOUNT']._serialized_end=19113 211 | _globals['_LANDMESSAGE_SAVEDRECOMMENDATIONS']._serialized_start=19116 212 | _globals['_LANDMESSAGE_SAVEDRECOMMENDATIONS']._serialized_end=19300 213 | _globals['_LANDMESSAGE_AMAZONDIMENSION']._serialized_start=19303 214 | _globals['_LANDMESSAGE_AMAZONDIMENSION']._serialized_end=19554 215 | _globals['_LANDMESSAGE_AMAZONDIMENSION_AMAZONDIMENSIONTYPE']._serialized_start=19465 216 | _globals['_LANDMESSAGE_AMAZONDIMENSION_AMAZONDIMENSIONTYPE']._serialized_end=19554 217 | _globals['_LANDMESSAGE_DAILYTASKMESSAGE']._serialized_start=19557 218 | _globals['_LANDMESSAGE_DAILYTASKMESSAGE']._serialized_end=20364 219 | _globals['_LANDMESSAGE_DAILYTASKMESSAGE_DAILYTASKDATA']._serialized_start=20106 220 | _globals['_LANDMESSAGE_DAILYTASKMESSAGE_DAILYTASKDATA']._serialized_end=20217 221 | _globals['_LANDMESSAGE_DAILYTASKMESSAGE_DAILYTASKCOOLDOWNDATA']._serialized_start=20219 222 | _globals['_LANDMESSAGE_DAILYTASKMESSAGE_DAILYTASKCOOLDOWNDATA']._serialized_end=20287 223 | _globals['_LANDMESSAGE_DAILYTASKMESSAGE_DAILYTASKREWARDCOOLDOWNDATA']._serialized_start=20289 224 | _globals['_LANDMESSAGE_DAILYTASKMESSAGE_DAILYTASKREWARDCOOLDOWNDATA']._serialized_end=20364 225 | _globals['_LANDMESSAGE_ROADMAPDATAMESSAGE']._serialized_start=20366 226 | _globals['_LANDMESSAGE_ROADMAPDATAMESSAGE']._serialized_end=20438 227 | _globals['_LANDMESSAGE_ADHOCOBJECTDATA']._serialized_start=20440 228 | _globals['_LANDMESSAGE_ADHOCOBJECTDATA']._serialized_end=20525 229 | _globals['_LANDMESSAGE_TIMERDATA']._serialized_start=20527 230 | _globals['_LANDMESSAGE_TIMERDATA']._serialized_end=20643 231 | _globals['_LANDMESSAGE_JOBCENSUSDATAMESSAGE']._serialized_start=20646 232 | _globals['_LANDMESSAGE_JOBCENSUSDATAMESSAGE']._serialized_end=21082 233 | _globals['_LANDMESSAGE_JOBCENSUSDATAMESSAGE_JOBCENSUSDATA']._serialized_start=20748 234 | _globals['_LANDMESSAGE_JOBCENSUSDATAMESSAGE_JOBCENSUSDATA']._serialized_end=21082 235 | _globals['_LANDMESSAGE_JOBCENSUSDATAMESSAGE_JOBCENSUSDATA_JOBCENSUSDATAENTRY']._serialized_start=20997 236 | _globals['_LANDMESSAGE_JOBCENSUSDATAMESSAGE_JOBCENSUSDATA_JOBCENSUSDATAENTRY']._serialized_end=21082 237 | _globals['_LANDMESSAGE_DNAMESSAGE']._serialized_start=21085 238 | _globals['_LANDMESSAGE_DNAMESSAGE']._serialized_end=21678 239 | _globals['_LANDMESSAGE_DNAMESSAGE_DNATELEMETRYEVENT']._serialized_start=21341 240 | _globals['_LANDMESSAGE_DNAMESSAGE_DNATELEMETRYEVENT']._serialized_end=21564 241 | _globals['_LANDMESSAGE_DNAMESSAGE_DNATELEMETRYEVENT_DNATELEMETRYPARAM']._serialized_start=21500 242 | _globals['_LANDMESSAGE_DNAMESSAGE_DNATELEMETRYEVENT_DNATELEMETRYPARAM']._serialized_end=21564 243 | _globals['_LANDMESSAGE_DNAMESSAGE_DNAEVENTSEVENT']._serialized_start=21566 244 | _globals['_LANDMESSAGE_DNAMESSAGE_DNAEVENTSEVENT']._serialized_end=21678 245 | _globals['_LANDMESSAGE_GROUPSTORAGEBUNDLEMESSAGE']._serialized_start=21681 246 | _globals['_LANDMESSAGE_GROUPSTORAGEBUNDLEMESSAGE']._serialized_end=22405 247 | _globals['_LANDMESSAGE_GROUPSTORAGEBUNDLEMESSAGE_GROUPSTORAGEBUNDLE']._serialized_start=21803 248 | _globals['_LANDMESSAGE_GROUPSTORAGEBUNDLEMESSAGE_GROUPSTORAGEBUNDLE']._serialized_end=22405 249 | _globals['_LANDMESSAGE_GROUPSTORAGEBUNDLEMESSAGE_GROUPSTORAGEBUNDLE_GROUPSTORAGEBUNDLEENTRYDATA']._serialized_start=22140 250 | _globals['_LANDMESSAGE_GROUPSTORAGEBUNDLEMESSAGE_GROUPSTORAGEBUNDLE_GROUPSTORAGEBUNDLEENTRYDATA']._serialized_end=22260 251 | _globals['_LANDMESSAGE_GROUPSTORAGEBUNDLEMESSAGE_GROUPSTORAGEBUNDLE_GROUPSTORAGEBUNDLEROADMAP']._serialized_start=22263 252 | _globals['_LANDMESSAGE_GROUPSTORAGEBUNDLEMESSAGE_GROUPSTORAGEBUNDLE_GROUPSTORAGEBUNDLEROADMAP']._serialized_end=22405 253 | _globals['_EVENTMESSAGE']._serialized_start=22408 254 | _globals['_EVENTMESSAGE']._serialized_end=24943 255 | _globals['_EVENTMESSAGE_EVENTDATA']._serialized_start=22643 256 | _globals['_EVENTMESSAGE_EVENTDATA']._serialized_end=24943 257 | _globals['_EVENTMESSAGE_EVENTDATA_CHARACTERGAINEDDATA']._serialized_start=23746 258 | _globals['_EVENTMESSAGE_EVENTDATA_CHARACTERGAINEDDATA']._serialized_end=23788 259 | _globals['_EVENTMESSAGE_EVENTDATA_CHARACTERLOSTDATA']._serialized_start=23790 260 | _globals['_EVENTMESSAGE_EVENTDATA_CHARACTERLOSTDATA']._serialized_end=23830 261 | _globals['_EVENTMESSAGE_EVENTDATA_STEALBUILDINGEVENTDATA']._serialized_start=23832 262 | _globals['_EVENTMESSAGE_EVENTDATA_STEALBUILDINGEVENTDATA']._serialized_end=23940 263 | _globals['_EVENTMESSAGE_EVENTDATA_GIFTMEMORABILIADATA']._serialized_start=23942 264 | _globals['_EVENTMESSAGE_EVENTDATA_GIFTMEMORABILIADATA']._serialized_end=23994 265 | _globals['_EVENTMESSAGE_EVENTDATA_SHOPCOLLECTEDDATA']._serialized_start=23996 266 | _globals['_EVENTMESSAGE_EVENTDATA_SHOPCOLLECTEDDATA']._serialized_end=24043 267 | _globals['_EVENTMESSAGE_EVENTDATA_VANDALISMEVENTDATA']._serialized_start=24046 268 | _globals['_EVENTMESSAGE_EVENTDATA_VANDALISMEVENTDATA']._serialized_end=24176 269 | _globals['_EVENTMESSAGE_EVENTDATA_SIDEBARUPDATEDATA']._serialized_start=24178 270 | _globals['_EVENTMESSAGE_EVENTDATA_SIDEBARUPDATEDATA']._serialized_end=24266 271 | _globals['_EVENTMESSAGE_EVENTDATA_RETURNBUILDINGDATA']._serialized_start=24268 272 | _globals['_EVENTMESSAGE_EVENTDATA_RETURNBUILDINGDATA']._serialized_end=24365 273 | _globals['_EVENTMESSAGE_EVENTDATA_PLAYSCRIPTDATA']._serialized_start=24367 274 | _globals['_EVENTMESSAGE_EVENTDATA_PLAYSCRIPTDATA']._serialized_end=24474 275 | _globals['_EVENTMESSAGE_EVENTDATA_CUSTOMFRIENDREQUESTDATA']._serialized_start=24477 276 | _globals['_EVENTMESSAGE_EVENTDATA_CUSTOMFRIENDREQUESTDATA']._serialized_end=24628 277 | _globals['_EVENTMESSAGE_EVENTDATA_PLAYSCRIPTATPOSITIONDATA']._serialized_start=24631 278 | _globals['_EVENTMESSAGE_EVENTDATA_PLAYSCRIPTATPOSITIONDATA']._serialized_end=24836 279 | _globals['_EVENTMESSAGE_EVENTDATA_LOSERESOURCESREQUESTDATA']._serialized_start=24838 280 | _globals['_EVENTMESSAGE_EVENTDATA_LOSERESOURCESREQUESTDATA']._serialized_end=24943 281 | _globals['_EVENTSMESSAGE']._serialized_start=24945 282 | _globals['_EVENTSMESSAGE']._serialized_end=24995 283 | _globals['_EXTRALANDMESSAGE']._serialized_start=24998 284 | _globals['_EXTRALANDMESSAGE']._serialized_end=25867 285 | _globals['_EXTRALANDMESSAGE_CURRENCYDELTA']._serialized_start=25524 286 | _globals['_EXTRALANDMESSAGE_CURRENCYDELTA']._serialized_end=25621 287 | _globals['_EXTRALANDMESSAGE_PUSHNOTIFICATION']._serialized_start=25623 288 | _globals['_EXTRALANDMESSAGE_PUSHNOTIFICATION']._serialized_end=25733 289 | _globals['_EXTRALANDMESSAGE_COMMUNITYGOALDELTA']._serialized_start=25735 290 | _globals['_EXTRALANDMESSAGE_COMMUNITYGOALDELTA']._serialized_end=25789 291 | _globals['_EXTRALANDMESSAGE_MATCHMAKINGREGISTRATION']._serialized_start=25791 292 | _globals['_EXTRALANDMESSAGE_MATCHMAKINGREGISTRATION']._serialized_end=25867 293 | _globals['_EXTRALANDRESPONSE']._serialized_start=25870 294 | _globals['_EXTRALANDRESPONSE']._serialized_end=26213 295 | _globals['_EXTRALANDRESPONSE_COMMUNITYGOAL']._serialized_start=26110 296 | _globals['_EXTRALANDRESPONSE_COMMUNITYGOAL']._serialized_end=26213 297 | _globals['_FRIENDINTERACTIONPARAMSET']._serialized_start=26216 298 | _globals['_FRIENDINTERACTIONPARAMSET']._serialized_end=26415 299 | _globals['_FRIENDINTERACTIONPARAMSET_FRIENDINTERACTIONPARAM']._serialized_start=26317 300 | _globals['_FRIENDINTERACTIONPARAMSET_FRIENDINTERACTIONPARAM']._serialized_end=26415 301 | _globals['_KINESISCURRENCYDELTA']._serialized_start=26418 302 | _globals['_KINESISCURRENCYDELTA']._serialized_end=26603 303 | _globals['_PROJECTBOARDPARAMSET']._serialized_start=26606 304 | _globals['_PROJECTBOARDPARAMSET']._serialized_end=26874 305 | _globals['_PROJECTBOARDPARAMSET_PROJECTPARAM']._serialized_start=26753 306 | _globals['_PROJECTBOARDPARAMSET_PROJECTPARAM']._serialized_end=26874 307 | _globals['_KINESISLANDUPDATEMESSAGE']._serialized_start=26877 308 | _globals['_KINESISLANDUPDATEMESSAGE']._serialized_end=27062 309 | _globals['_POWERUPMESSAGE']._serialized_start=27065 310 | _globals['_POWERUPMESSAGE']._serialized_end=27254 311 | _globals['_POWERUPMESSAGE_POWERUPDATA']._serialized_start=27138 312 | _globals['_POWERUPMESSAGE_POWERUPDATA']._serialized_end=27254 313 | # @@protoc_insertion_point(module_scope) 314 | --------------------------------------------------------------------------------