Merge branch 'master' of ../../dev/EDDN

This commit is contained in:
Athanasius 2022-01-11 12:31:20 +00:00
commit fb81c51a12
22 changed files with 7913 additions and 42 deletions

View File

@ -1,13 +1,72 @@
## EDDN - Elite: Dangerous Data Network
# EDDN - Elite Dangerous Data Network
The **Elite: Dangerous Data Network** is a system for willing Commanders to share dynamic data about the galaxy with others.
By pooling data in a common format, tools and analyses can be produced that add an even greater depth and vibrancy to the in-game universe.
## About EDDN
Elite Dangerous Data Network is a tool that facilitates the players of the game
[Elite Dangerous](https://www.elitedangerous.com/), including its
expansions, sharing data about the game galaxy with others.
By pooling data in a common format, tools and analyses can be produced that add
an even greater depth and vibrancy to the in-game universe.
EDDN is not run by or affiliated with [Frontier Developments](http://www.frontier.co.uk/).
EDDN is not run by or affiliated with the developer of the game - [Frontier
Developments](http://www.frontier.co.uk/).
Hosting has been very generously provided by [Vivio Technologies](https://www.viviotech.net/), until 2017.
Hosting is now provided by the [EDCD community](https://edcd.github.io/).
The live EDDN service itself does not store any data, and thus makes no
archive or "current state" available to anyone. What it provides is a
stream of live data to any interested parties. Some of those then make
aggregated data available for general use.
### [Using EDDN](https://github.com/EDSM-NET/EDDN/wiki)
---
## Using EDDN
### Game players
If you are a player of the game and only want to help out by sharing the
data available to you over EDDN then please consult the
[EDCD Cmdr's Guide](https://edcd.github.io/cmdrs-guide.html). For the most
part if you want to share data then you will need to be playing the game on a
PC, but there are some tools that utilise an API provided by the game
developer that can supply some data if you are playing on a console.
If you're looking for tools that utilise EDDN data to enhance your experience
then you're probably looking for one of the sites listed below. NB: These are
listed in name-alphabetical order and no particular ranking or endorsement is
intended.
- [EDDB](https://eddb.io/) - a website which tries to act as a database of all
the data available in the game. In general EDDB tries to help finding
stuff which players are looking for.
- [EDSM](https://www.edsm.net/) - originally focused on being a 'Star Map',
but has since expanded its functionality. Of particular interest to
in-game explorers.
- [Inara](https://inara.cz/) - a popular alternative to EDDB, with a lot of
its own unique functionality.
- [Spansh](https://www.spansh.co.uk/plotter) - originally this had one tool,
a 'Neutron Star' route plotter, but has since expanded into offering many
other route plotting tools and general data searching.
There are many other third-party tools for Elite Dangerous listed on
[Elite: Dangerous Codex](https://edcodex.info/), some of which will
interact with EDDN. Check the [EDDN tag](https://edcodex.info/?m=tools&cat=9).
### Developers
If you are a developer of a third-party tool that could be enhanced by
uploading data to EDDN then please consult
[the live branch documentation](https://github.com/EDCD/EDDN/blob/live/schemas/README-EDDN-schemas.md)
.
**DO NOT** assume that any code or documentation in the `master` (or
any other) branch on GitHub truly reflects the current live service!
### Misc
There is also a [wiki page](https://github.com/EDSM-NET/EDDN/wiki), but its
contents are currently being migrated into the source code tree (so that
they always match the in-use code).
Consult [EDDN Status](https://eddn.edcd.io/) for some information about,
and statistics for, the live service.
---
## Hosting of the live service
Hosting is currently provided by the
[Elite: Dangerous Community Developers](https://edcd.github.io/).
### [EDDN Status](https://eddn.edcd.io/)

27
contrib/test-schema.py Normal file
View File

@ -0,0 +1,27 @@
"""Check if a file's JSON message passes the given schema."""
import simplejson
import sys
from jsonschema import FormatChecker, ValidationError
from jsonschema import validate as json_validate
if len(sys.argv) < 2:
print(
f"""
Usage: {sys.argv[0]} <schema file name> <test data file name>
Note that the entire file will be loaded by simpljson.load() and should
only contain one JSON object.
"""
)
sys.exit(-1)
schema_file_name = sys.argv[1]
test_file_name = sys.argv[2]
with open(test_file_name, 'r') as test_file:
test_event = simplejson.load(test_file)
with open(schema_file_name, 'r') as schema_file:
schema = simplejson.load(schema_file)
json_validate(test_event, schema, format_checker=FormatChecker())

View File

@ -98,24 +98,71 @@ value, e.g.
"$schemaRef": "https://eddn.edcd.io/schemas/shipyard/2/test",
You MUST also utilise these test forms of the schemas when first testing your
code. There might also be a beta.eddn.edcd.io, or dev.eddn.edcd.io, service
code.
There might also be a beta.eddn.edcd.io, or dev.eddn.edcd.io, service
available from time to time as necessary, e.g. for testing new schemas or
changes to existing ones.
changes to existing ones. Ask on the `#eddn` channel of the EDCD Discord
(see https://edcd.github.io/ for an invite link).
Alternatively you could attempt
[running your own test instance of EDDN](../docs/Running-this-software.md).
### Sending data
To upload market data to EDDN, you'll need to make a POST request to the URL:
Messages sent to EDDN **MUST**:
* https://eddn.edcd.io:4430/upload/
- Use the URL: `https://eddn.edcd.io:4430/upload/`. Note the use of
TLS-encrypted HTTPS. A plain HTTP request will elicit a `400 Bad
Request` response.
- Use the HTTP 1.1 protocol. HTTP/2 is not supported at this time.
- Use a **POST** request, with the body containing the EDDN message. No
query parameters in the URL are supported or necessary.
The body of this is a JSON object, so you SHOULD set a `Content-Type` header of
`applicaton/json`, and NOT any of:
The body of an EDDN message is a JSON object in UTF-8 encoding. You SHOULD
set a `Content-Type` header of `applicaton/json`, and NOT any of:
* `application/x-www-form-urlencoded`
* `multipart/form-data`
* `text/plain`
For historical reasons URL form-encoded data *is* supported, **but this is
deprecated and no new software should attempt this method**. We
purposefully do not further document the exact format for this.
You *MAY* use gzip compression on the body of the message, but it is not
required.
You should be prepared to handle all scenarios where sending of a message
fails:
1. Connection refused.
2. Connection timed out.
3. Other possible responses as documented in
[Server responses](#server-responses).
Carefully consider whether you should queue a 'failed' message for later
retry. In particular, you should ensure that one 'bad' message does not
block other messages from being successfully sent.
You **MUST** wait some reasonable time (minimum 1 minute) before retrying
any failed message.
You **MUST NOT** retry any message that received a HTTP `400` or `426` code.
An exception can be made if, **and only if**, *you have manually verified that
you have fixed the issues with it (i.e. updated the schema/version to a
currently supported one and adjusted the data to fit that schema/version).*
You **MAY** retry a message that initially received a `413` response (in
the hopes that the EDDN service admins decided to increase the maximum
allowed request size), but should not do so too quickly or in perpetuity.
In general:
- No data is better than bad data.
- *Delayed* good data is better than degrading the EDDN service for others.
### Format of uploaded messages
Each message is a JSON object in utf-8 encoding containing the following
Each message is a JSON object in UTF-8 encoding containing the following
key+value pairs:
1. `$schemaRef` - Which schema (including version) this message is for.
@ -169,38 +216,157 @@ For example, a shipyard message, version 2, might look like:
```
### Contents of `message`
Every message MUST comply with the schema its `$schemaRef` value cites.
Apart from short time windows during deployment of a new version the live
EDDN service should always be using
[the schemas as present in the live branch](https://github.com/EDCD/EDDN/tree/live/schemas).
So, be sure you're checking the live versions and not, e.g. those in the
`master` or other branches.
Each `message` object must have, at bare minimum:
1. `timestamp` - string date and time in ISO8601 format. Whilst that
1. `timestamp` - string date and time in ISO8601 format. Whilst this
technically allows for any timezone to be cited you SHOULD provide this in
UTC, aka 'Zulu Time' as in the example above. You MUST ensure that you are
doing this properly. Do not claim 'Z' whilst actually using a local time
that is offset from UTC.
If you are only utilising Journal-sourced data then simply using the
value from there should be sufficient as the PC game client is meant to
always be correctly citing UTC for this. Indeed it has been observed,
in the Odyssey 4.0.0.1002 client, that with the Windows clock behind UTC
by 21 seconds both the in-game UI clock *and* the Journal event
timestamps are still properly UTC to the nearest second.
Listeners MAY make decisions on accepting data based on this time stamp,
i.e. "too old".
2. One other key/value pair representing the data. In general there will be
much more than this. Again, consult the
2. At least one other key/value pair representing the data. In general there
will be much more than this. Consult the
[schemas and their documentation](./).
Note that many of the key names chosen in the schemas are based on the CAPI
data, not Journal events, because the CAPI came first. This means renaming
many of the keys from Journal events to match the schema.
Because the first versions of some schemas were defined when only the CAPI
data was available, before Journal files existed, many of the key names chosen
in the schemas are based on the equivalent in CAPI data, not Journal events.
This means ouy MUST rename many of the keys from Journal events to match the
schemas.
EDDN is intended to transport generic data not specific to any particular Cmdr
and to reflect the data that a player would see in-game in station services or
the local map. To that end, uploading applications MUST ensure that messages do
not contain any Cmdr-specific data (other than "uploaderID" and the "horizons"
flag).
and to reflect only the data that every player would see in-game in station
services or the local map. To that end, uploading applications MUST ensure
that messages do not contain any Cmdr-specific data (other than "uploaderID",
the "horizons" flag, and the "odyssey" flag).
The individual schemas will instruct you on various elisions (removals) to
be made to comply with this.
Some of these requirements are also enforced by the schemas, and some things
the schemas enforce might not be explicitly called out here, so **do**
check what you're sending against the schema when implementing sending new
events.
the schemas enforce might not be explicitly called out here. So, **do**
check what you're sending against the relevant schema(s) when making any
changes to your code.
It is also advisable to Watch this repository on GitHub so as to be aware
of any changes to schemas.
### Server responses
There are three possible sources of HTTP responses when sending an upload
to EDDN.
1. The reverse proxy that initially accepts the request.
2. The python `bottle` module that the Gateway uses to process the
forwarded requests. This might object to a message before the actual
EDDN code gets to process it at all.
3. The actual EDDN Gateway code.
Once a message has cleared the EDDN Gateway then there is no mechanism for any
further issue (such as a message being detected as a duplicate in the
Monitor downstream of the Gateway) to be reported back to the sender.
To state the obvious, if there are no issues with a request then an HTTP
200 response will be received by the sender. The body of the response
should be the string `OK`.
#### Reverse Proxy responses
In addition to generic "you typoed the URL" and other such "you just didn't
make a valid request" responses you might experience the following:
1. `408` - `Request Timed Out` - the sender took too long to make/complete
its request and the reverse proxy rejected it as a result.
2. `503` - `Service Unavailable` - the EDDN Gateway process is either not
running, or not responding.
#### bottle responses
1. `413` - `Payload Too Large` - `bottle` enforces a maximum request size
and the request exceeds that. As of 2022-01-07 the limit is 1MiB, and
pertains to the plain-text size, not after gzip compression if used.
To verify the current limit check for the line that looks like:
```
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024 # 1MiB, default is/was 100KiB
```
in
[src/eddn/Gateway.py](https://github.com/EDCD/EDDN/blob/master/src/eddn/Gateway.py),
as added in
[commit 0e80c76cb564771465f61825e694227dcc3be312](https://github.com/EDCD/EDDN/commit/0e80c76cb564771465f61825e694227dcc3be312).
#### EDDN Gateway responses
For all failures the response body will contain text that begins `FAIL: `. Currently two different HTTP status codes are utilised:
1. `400` - `Bad Request` - This indicates something wrong with the request
body. Possibly due to a format issue (compression, form encoding), or
the actual content of the EDDN message:
1. `FAIL: zlib.error: <detail>` - A failure to decompress a message that
claimed to be compressed.
2. `FAIL: Malformed Upload: <detail>` - the message appeared to be
form-encoded, but either the format was bad or there was no `data`
key.
3. `FAIL: JSON parsing: <detail>` - the
message couldn't be parsed as valid JSON. e.g.
```
FAIL: JSON parsing: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
```
4. `FAIL: Schema Validation: <detail>` - the message failed to validate
against the cited schema. e.g.
```
FAIL: Schema Validation: [<ValidationError: "'StarPos' is a required property">]
```
The exact detail will be very much dependent on both the schema the
message cited and the contents of the message that failed to pass the
validation.
In particular, if the message contains a key that is tagged 'disallowed' in
the schema the response will look like:
```
FAIL: Schema Validation: "[<ValidationError: "{'type': ['array', 'boolean', 'integer', 'number', 'null', 'object', 'string']} is not allowed for 'BadKey'">]"
```
This is due to the use of a JSON schema stanza that says "don't allow
any valid type for the value of this key" to trigger the error for such
disallowed keys.
2. `426` - `Upgrade Required` - This indicates that the cited schema, or
version thereof, is outdated. The body of the response will be:
```
FAIL: Oudated Schema: The schema you have used is no longer supported. Please check for an updated version of your application.
```
The wording here is aimed at users of applications that send messages
over EDDN. If you're the developer of such an application then
obviously you need to update your code to use a currently supported
schema and version thereof.
There shouldn't be any other variants of a 'FAIL' message. If you find
any then please
[open an issue on GitHub](https://github.com/EDCD/EDDN/issues/new)
with as much detail as possible so that we can update this documentation.
## Receiving messages

191
scripts/eddn-report-log-errors Executable file
View File

@ -0,0 +1,191 @@
#!/usr/bin/env python3
# vim: wrapmargin=0 textwidth=0 smarttab expandtab tabstop=2 shiftwidth=2
"""Produce a report on the provided EDDN Gateway log file's ERRORs."""
import argparse
import re
def parse_cl_args() -> str:
"""
Check command-line arguments for input file name.
:returns: str - input file name
"""
parser = argparse.ArgumentParser(
prog='eddn-report-log-errors',
description='Process an EDDN Gateway log file and report on any ERROR lines found'
)
parser.add_argument(
'inputfile',
metavar='<input file name>',
help='Name of an EDDN Gateway log file'
)
args = parser.parse_args()
return args.inputfile
def process_file(input_file: str) -> None:
print(f'Input file: {input_file}')
_RE_ERROR = re.compile(
r'^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[\.,][0-9]{3} - ERROR - Gateway:[0-9]+:'
r' (?P<err_msg>.+)'
r' \((?P<request_size>[0-9]+),'
r' "(?P<uploader_id>[^"]*)",'
r' "(?P<software_name>[^"]*)",'
r' "(?P<software_version>[^"]*)",'
r' "(?P<schema_ref>[^"]*)",'
r' "(?P<journal_event>[^"]*)"\)'
r' from (?P<sender_ip>.+)$'
)
# TODO: Make this handle gzipped files
with open(input_file, 'r') as input:
line = input.readline()
while line:
line = line.strip()
matches = _RE_ERROR.search(line)
if matches:
# print(matches.group('err_msg'))
# print(matches.group('request_size'))
# print(matches.group('uploader_id'))
# print(matches.group('software_name'))
# print(matches.group('software_version'))
# print(matches.group('schema_ref'))
# print(matches.group('journal_event'))
# print(matches.group('sender_ip'))
# print('')
###################################################################
# Issues we know about and HAVE already alerted their
# developers to.
###################################################################
if matches.group('software_name') == 'EDDiscovery':
# https://github.com/EDDiscovery/EDDiscovery/releases/latest
if matches.group('software_version') == '12.1.7.0':
if matches.group('schema_ref') in (
'https://eddn.edcd.io/schemas/shipyard/2',
'https://eddn.edcd.io/schemas/outfitting/2',
):
# Reported via Discord PM to Robby 2022-01-07
if matches.group('err_msg') != 'Failed Validation "[<ValidationError: \'[] is too short\'>]"':
print(line)
else:
print(line)
elif matches.group('software_name') == 'EDDLite':
# https://github.com/EDDiscovery/EDDLite/releases/tag/latest
if matches.group('software_version') == '2.0.0':
if matches.group('schema_ref') in (
'https://eddn.edcd.io/schemas/shipyard/2',
'https://eddn.edcd.io/schemas/outfitting/2',
):
# Reported via Discord PM to Robby 2022-01-07
if matches.group('err_msg') != 'Failed Validation "[<ValidationError: \'[] is too short\'>]"':
print(line)
else:
print(line)
elif matches.group('software_name') == 'EDDI':
# https://github.com/EDCD/EDDI/releases/latest
if matches.group('software_version') == '4.0.1':
print(line)
elif matches.group('software_name') == 'E:D Market Connector [Windows]':
# https://github.com/EDCD/EDMarketConnector/releases/latest
if matches.group('software_version') == '5.2.4':
if matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/codexentry/1':
# <https://github.com/EDCD/EDMarketConnector/issues/1393>
if matches.group('err_msg') != 'Failed Validation "[<ValidationError: "\'\' is too short">]"':
print(matches.group('err_msg'))
print(line)
else:
print(line)
elif matches.group('software_name') == 'Elite G19s Companion App':
# <https://edcodex.info/?m=tools&entry=212>
if matches.group('software_version') == '3.7.7888.21039':
if matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/commodity/3':
# Reported via Frontier forums: <https://forums.frontier.co.uk/threads/elite-g19s-companion-app-with-simulated-space-traffic-control.226782/post-9690204>
if matches.group('err_msg') != 'Failed Validation "[<ValidationError: "Additional properties are not allowed (\'Proportion\', \'Name\' were unexpected)">]"':
print(matches.group('err_msg'))
print(line)
else:
print(line)
elif matches.group('software_name') == 'EDSM':
# It's in-browser, no public source/releases
if matches.group('software_version') == '1.0.1':
if matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/journal/1':
if matches.group('journal_event') == 'Scan':
# <https://github.com/EDSM-NET/FrontEnd/issues/466>
if not matches.group('err_msg').startswith(
'Failed Validation "[<ValidationError: "{\'type\': [\'array\', \'boolean\', \'integer\', \'number\', \'null\', \'object\', \'string\']} is not allowed for '
):
print(matches.group('err_msg'))
print(line)
else:
print(line)
else:
print(line)
elif matches.group('software_name') == 'EDSM - Console':
# It's in-browser, no public source/releases
if matches.group('software_version') == '1.0':
if matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/journal/1':
if matches.group('journal_event') == 'Scan':
# <https://github.com/EDSM-NET/FrontEnd/issues/466>
if not matches.group('err_msg').startswith(
'Failed Validation "[<ValidationError: "{\'type\': [\'array\', \'boolean\', \'integer\', \'number\', \'null\', \'object\', \'string\']} is not allowed for '
):
print(matches.group('err_msg'))
print(line)
else:
print(line)
else:
print(line)
elif matches.group('software_name') == 'EDAOS':
# Apparently a Barry Carylon project, but no home page ?
if matches.group('software_version') == '1.2.3':
if matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/journal/1':
if matches.group('journal_event') == 'Docked':
# <https://discord.com/channels/164411426939600896/205369618284544000/929102478954340372>
if not matches.group('err_msg').startswith(
'Failed Validation "[<ValidationError: "{\'type\': [\'array\', \'boolean\', \'integer\', \'number\', \'null\', \'object\', \'string\']} is not allowed for '
):
print(matches.group('err_msg'))
print(line)
else:
print(line)
else:
print(line)
###################################################################
# Issues we know about, but haven't yet alerted developers to
###################################################################
###################################################################
else:
print(line)
line = input.readline()
if __name__ == "__main__":
input_file = parse_cl_args()
process_file(input_file)

View File

@ -0,0 +1,330 @@
{ "timestamp":"2022-01-06T11:19:27Z", "event":"Market", "MarketID":128008448, "StationName":"Freeport", "StationType":"Coriolis", "StarSystem":"LP 98-132", "Items":[
{ "id":128049152, "Name":"$platinum_name;", "Name_Localised":"Platinum", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":39557, "SellPrice":39555, "MeanPrice":58263, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049153, "Name":"$palladium_name;", "Name_Localised":"Palladium", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":47901, "SellPrice":47360, "MeanPrice":50639, "StockBracket":1, "DemandBracket":0, "Stock":2, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049154, "Name":"$gold_name;", "Name_Localised":"Gold", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":44874, "SellPrice":44362, "MeanPrice":47610, "StockBracket":1, "DemandBracket":0, "Stock":2, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049155, "Name":"$silver_name;", "Name_Localised":"Silver", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":34289, "SellPrice":33471, "MeanPrice":37223, "StockBracket":1, "DemandBracket":0, "Stock":8, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049156, "Name":"$bertrandite_name;", "Name_Localised":"Bertrandite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":21216, "MeanPrice":18817, "StockBracket":0, "DemandBracket":2, "Stock":0, "Demand":1047, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049157, "Name":"$indite_name;", "Name_Localised":"Indite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":10508, "SellPrice":10238, "MeanPrice":11389, "StockBracket":1, "DemandBracket":0, "Stock":296, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049158, "Name":"$gallite_name;", "Name_Localised":"Gallite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":13829, "MeanPrice":11915, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":1765, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049159, "Name":"$coltan_name;", "Name_Localised":"Coltan", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":7849, "MeanPrice":6163, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":2063, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049160, "Name":"$uraninite_name;", "Name_Localised":"Uraninite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":4202, "MeanPrice":2957, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":2899, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049161, "Name":"$lepidolite_name;", "Name_Localised":"Lepidolite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":4193, "SellPrice":3999, "MeanPrice":771, "StockBracket":1, "DemandBracket":0, "Stock":1271, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049162, "Name":"$cobalt_name;", "Name_Localised":"Cobalt", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":13474, "SellPrice":12870, "MeanPrice":3762, "StockBracket":1, "DemandBracket":0, "Stock":724, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049163, "Name":"$rutile_name;", "Name_Localised":"Rutile", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":11056, "MeanPrice":2083, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":1306, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049165, "Name":"$bauxite_name;", "Name_Localised":"Bauxite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":10730, "SellPrice":10270, "MeanPrice":1140, "StockBracket":1, "DemandBracket":0, "Stock":595, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049166, "Name":"$water_name;", "Name_Localised":"Water", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":0, "SellPrice":599, "MeanPrice":278, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":336, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049168, "Name":"$beryllium_name;", "Name_Localised":"Beryllium", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":8041, "SellPrice":7948, "MeanPrice":8243, "StockBracket":1, "DemandBracket":0, "Stock":2, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049169, "Name":"$indium_name;", "Name_Localised":"Indium", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":5894, "SellPrice":5824, "MeanPrice":5845, "StockBracket":1, "DemandBracket":0, "Stock":8, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049170, "Name":"$gallium_name;", "Name_Localised":"Gallium", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":5165, "SellPrice":5042, "MeanPrice":5203, "StockBracket":1, "DemandBracket":0, "Stock":11, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049171, "Name":"$tantalum_name;", "Name_Localised":"Tantalum", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":4099, "SellPrice":3999, "MeanPrice":4044, "StockBracket":1, "DemandBracket":0, "Stock":2, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049172, "Name":"$uranium_name;", "Name_Localised":"Uranium", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":3139, "SellPrice":3060, "MeanPrice":2827, "StockBracket":1, "DemandBracket":0, "Stock":24, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049173, "Name":"$lithium_name;", "Name_Localised":"Lithium", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":1906, "SellPrice":1855, "MeanPrice":1772, "StockBracket":1, "DemandBracket":0, "Stock":6, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049174, "Name":"$titanium_name;", "Name_Localised":"Titanium", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":1377, "SellPrice":1319, "MeanPrice":1208, "StockBracket":2, "DemandBracket":0, "Stock":122, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049175, "Name":"$copper_name;", "Name_Localised":"Copper", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":1115, "SellPrice":1042, "MeanPrice":689, "StockBracket":2, "DemandBracket":0, "Stock":474, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049176, "Name":"$aluminium_name;", "Name_Localised":"Aluminium", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":1127, "SellPrice":1045, "MeanPrice":551, "StockBracket":2, "DemandBracket":0, "Stock":352, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049177, "Name":"$algae_name;", "Name_Localised":"Algae", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":23, "SellPrice":22, "MeanPrice":356, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049178, "Name":"$fruitandvegetables_name;", "Name_Localised":"Fruit and Vegetables", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":0, "SellPrice":1060, "MeanPrice":509, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":1637, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049180, "Name":"$grain_name;", "Name_Localised":"Grain", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":0, "SellPrice":919, "MeanPrice":410, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":2980, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049182, "Name":"$animalmeat_name;", "Name_Localised":"Animal Meat", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":0, "SellPrice":1695, "MeanPrice":1539, "StockBracket":0, "DemandBracket":1, "Stock":0, "Demand":26, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049183, "Name":"$fish_name;", "Name_Localised":"Fish", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":0, "SellPrice":1008, "MeanPrice":650, "StockBracket":0, "DemandBracket":2, "Stock":0, "Demand":481, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049184, "Name":"$foodcartridges_name;", "Name_Localised":"Food Cartridges", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":0, "SellPrice":767, "MeanPrice":265, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":1094, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049185, "Name":"$syntheticmeat_name;", "Name_Localised":"Synthetic Meat", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":0, "SellPrice":872, "MeanPrice":440, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":496, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049188, "Name":"$tea_name;", "Name_Localised":"Tea", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":0, "SellPrice":1923, "MeanPrice":1696, "StockBracket":0, "DemandBracket":2, "Stock":0, "Demand":43, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049189, "Name":"$coffee_name;", "Name_Localised":"Coffee", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":0, "SellPrice":2303, "MeanPrice":1499, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":527, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049190, "Name":"$leather_name;", "Name_Localised":"Leather", "Category":"$MARKET_category_textiles;", "Category_Localised":"Textiles", "BuyPrice":57, "SellPrice":56, "MeanPrice":435, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049191, "Name":"$naturalfabrics_name;", "Name_Localised":"Natural Fabrics", "Category":"$MARKET_category_textiles;", "Category_Localised":"Textiles", "BuyPrice":351, "SellPrice":350, "MeanPrice":688, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049193, "Name":"$syntheticfabrics_name;", "Name_Localised":"Synthetic Fabrics", "Category":"$MARKET_category_textiles;", "Category_Localised":"Textiles", "BuyPrice":1705, "SellPrice":1435, "MeanPrice":416, "StockBracket":1, "DemandBracket":0, "Stock":197, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049197, "Name":"$polymers_name;", "Name_Localised":"Polymers", "Category":"$MARKET_category_industrial_materials;", "Category_Localised":"Industrial materials", "BuyPrice":2614, "SellPrice":1960, "MeanPrice":376, "StockBracket":1, "DemandBracket":0, "Stock":272, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049199, "Name":"$semiconductors_name;", "Name_Localised":"Semiconductors", "Category":"$MARKET_category_industrial_materials;", "Category_Localised":"Industrial materials", "BuyPrice":1415, "SellPrice":1355, "MeanPrice":1136, "StockBracket":1, "DemandBracket":0, "Stock":42, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049200, "Name":"$superconductors_name;", "Name_Localised":"Superconductors", "Category":"$MARKET_category_industrial_materials;", "Category_Localised":"Industrial materials", "BuyPrice":6809, "SellPrice":6729, "MeanPrice":6679, "StockBracket":1, "DemandBracket":0, "Stock":14, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049202, "Name":"$hydrogenfuel_name;", "Name_Localised":"Hydrogen Fuel", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":126, "SellPrice":120, "MeanPrice":113, "StockBracket":1, "DemandBracket":0, "Stock":379, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049203, "Name":"$mineraloil_name;", "Name_Localised":"Mineral Oil", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":0, "SellPrice":1483, "MeanPrice":423, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":3336, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049204, "Name":"$explosives_name;", "Name_Localised":"Explosives", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":0, "SellPrice":2101, "MeanPrice":512, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":3964, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049205, "Name":"$pesticides_name;", "Name_Localised":"Pesticides", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":82, "SellPrice":81, "MeanPrice":437, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049208, "Name":"$agriculturalmedicines_name;", "Name_Localised":"Agri-Medicines", "Category":"$MARKET_category_medicines;", "Category_Localised":"Medicines", "BuyPrice":543, "SellPrice":542, "MeanPrice":1231, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049209, "Name":"$performanceenhancers_name;", "Name_Localised":"Performance Enhancers", "Category":"$MARKET_category_medicines;", "Category_Localised":"Medicines", "BuyPrice":0, "SellPrice":6907, "MeanPrice":6790, "StockBracket":0, "DemandBracket":1, "Stock":0, "Demand":40, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049210, "Name":"$basicmedicines_name;", "Name_Localised":"Basic Medicines", "Category":"$MARKET_category_medicines;", "Category_Localised":"Medicines", "BuyPrice":0, "SellPrice":963, "MeanPrice":493, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":904, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049213, "Name":"$tobacco_name;", "Name_Localised":"Tobacco", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":0, "SellPrice":5568, "MeanPrice":5325, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":398, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049214, "Name":"$beer_name;", "Name_Localised":"Beer", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":0, "SellPrice":799, "MeanPrice":430, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":1777, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049215, "Name":"$wine_name;", "Name_Localised":"Wine", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":0, "SellPrice":411, "MeanPrice":507, "StockBracket":0, "DemandBracket":1, "Stock":0, "Demand":0, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049216, "Name":"$liquor_name;", "Name_Localised":"Liquor", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":0, "SellPrice":1331, "MeanPrice":879, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":453, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049217, "Name":"$powergenerators_name;", "Name_Localised":"Power Generators", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":0, "SellPrice":3475, "MeanPrice":2466, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":613, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049218, "Name":"$waterpurifiers_name;", "Name_Localised":"Water Purifiers", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":0, "SellPrice":2101, "MeanPrice":484, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":1256, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049220, "Name":"$heliostaticfurnaces_name;", "Name_Localised":"Microbial Furnaces", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":0, "SellPrice":2010, "MeanPrice":434, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":537, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049221, "Name":"$mineralextractors_name;", "Name_Localised":"Mineral Extractors", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":0, "SellPrice":2647, "MeanPrice":801, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":1698, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049222, "Name":"$cropharvesters_name;", "Name_Localised":"Crop Harvesters", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":1564, "SellPrice":1563, "MeanPrice":2230, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049223, "Name":"$marinesupplies_name;", "Name_Localised":"Marine Equipment", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":2745, "SellPrice":2744, "MeanPrice":4135, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049225, "Name":"$computercomponents_name;", "Name_Localised":"Computer Components", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":267, "SellPrice":266, "MeanPrice":776, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049226, "Name":"$hazardousenvironmentsuits_name;", "Name_Localised":"H.E. Suits", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":0, "SellPrice":915, "MeanPrice":570, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":4363, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049227, "Name":"$robotics_name;", "Name_Localised":"Robotics", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":1447, "SellPrice":1446, "MeanPrice":2020, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049228, "Name":"$autofabricators_name;", "Name_Localised":"Auto-Fabricators", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":2685, "SellPrice":2684, "MeanPrice":3827, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049229, "Name":"$animalmonitors_name;", "Name_Localised":"Animal Monitors", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":630, "SellPrice":629, "MeanPrice":537, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049230, "Name":"$aquaponicsystems_name;", "Name_Localised":"Aquaponic Systems", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":321, "SellPrice":320, "MeanPrice":524, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049231, "Name":"$advancedcatalysers_name;", "Name_Localised":"Advanced Catalysers", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":0, "SellPrice":3756, "MeanPrice":3039, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":936, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049232, "Name":"$terrainenrichmentsystems_name;", "Name_Localised":"Land Enrichment Systems", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":3005, "SellPrice":3004, "MeanPrice":4928, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049234, "Name":"$battleweapons_name;", "Name_Localised":"Battle Weapons", "Category":"$MARKET_category_weapons;", "Category_Localised":"Weapons", "BuyPrice":4463, "SellPrice":4462, "MeanPrice":7451, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128049235, "Name":"$reactivearmour_name;", "Name_Localised":"Reactive Armour", "Category":"$MARKET_category_weapons;", "Category_Localised":"Weapons", "BuyPrice":0, "SellPrice":2669, "MeanPrice":2224, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":150, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049236, "Name":"$nonlethalweapons_name;", "Name_Localised":"Non-Lethal Weapons", "Category":"$MARKET_category_weapons;", "Category_Localised":"Weapons", "BuyPrice":0, "SellPrice":2417, "MeanPrice":1943, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":274, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049238, "Name":"$domesticappliances_name;", "Name_Localised":"Domestic Appliances", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":0, "SellPrice":1216, "MeanPrice":740, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":575, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049240, "Name":"$consumertechnology_name;", "Name_Localised":"Consumer Technology", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":0, "SellPrice":6883, "MeanPrice":6690, "StockBracket":0, "DemandBracket":1, "Stock":0, "Demand":0, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049241, "Name":"$clothing_name;", "Name_Localised":"Clothing", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":0, "SellPrice":963, "MeanPrice":546, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":955, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049244, "Name":"$biowaste_name;", "Name_Localised":"Biowaste", "Category":"$MARKET_category_waste;", "Category_Localised":"Waste", "BuyPrice":145, "SellPrice":87, "MeanPrice":358, "StockBracket":1, "DemandBracket":0, "Stock":103, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128049246, "Name":"$chemicalwaste_name;", "Name_Localised":"Chemical Waste", "Category":"$MARKET_category_waste;", "Category_Localised":"Waste", "BuyPrice":0, "SellPrice":599, "MeanPrice":672, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":159, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049248, "Name":"$scrap_name;", "Name_Localised":"Scrap", "Category":"$MARKET_category_waste;", "Category_Localised":"Waste", "BuyPrice":0, "SellPrice":625, "MeanPrice":300, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":182, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049669, "Name":"$progenitorcells_name;", "Name_Localised":"Progenitor Cells", "Category":"$MARKET_category_medicines;", "Category_Localised":"Medicines", "BuyPrice":0, "SellPrice":7529, "MeanPrice":6752, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":6, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049671, "Name":"$resonatingseparators_name;", "Name_Localised":"Resonating Separators", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":0, "SellPrice":7158, "MeanPrice":5937, "StockBracket":0, "DemandBracket":2, "Stock":0, "Demand":491, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128049672, "Name":"$bioreducinglichen_name;", "Name_Localised":"Bioreducing Lichen", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":0, "SellPrice":1703, "MeanPrice":1204, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":5473, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128064028, "Name":"$atmosphericextractors_name;", "Name_Localised":"Atmospheric Processors", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":331, "SellPrice":330, "MeanPrice":571, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128666746, "Name":"$eraninpearlwhisky_name;", "Name_Localised":"Eranin Pearl Whisky", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":2058, "SellPrice":2057, "MeanPrice":9040, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128666747, "Name":"$lavianbrandy_name;", "Name_Localised":"Lavian Brandy", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":3614, "SellPrice":3613, "MeanPrice":10365, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128666757, "Name":"$usscargorareartwork_name;", "Name_Localised":"Rare Artwork", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":15150, "SellPrice":15149, "MeanPrice":16807, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128667019, "Name":"$hip10175bushmeat_name;", "Name_Localised":"HIP 10175 Bush Meat", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2246, "SellPrice":2245, "MeanPrice":9382, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667020, "Name":"$albinoquechuamammoth_name;", "Name_Localised":"Albino Quechua Mammoth Meat", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2663, "SellPrice":2662, "MeanPrice":9687, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667021, "Name":"$utgaroarmillenialeggs_name;", "Name_Localised":"Utgaroar Millennial Eggs", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2217, "SellPrice":2216, "MeanPrice":9163, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667022, "Name":"$witchhaulkobebeef_name;", "Name_Localised":"Witchhaul Kobe Beef", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":4313, "SellPrice":4312, "MeanPrice":11085, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667023, "Name":"$karsukilocusts_name;", "Name_Localised":"Karsuki Locusts", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1583, "SellPrice":1582, "MeanPrice":8543, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667024, "Name":"$giantirukamasnails_name;", "Name_Localised":"Giant Irukama Snails", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2131, "SellPrice":2130, "MeanPrice":9174, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667025, "Name":"$baltahsinevacuumkrill_name;", "Name_Localised":"Baltah'sine Vacuum Krill", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1502, "SellPrice":1501, "MeanPrice":8479, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667026, "Name":"$cetirabbits_name;", "Name_Localised":"Ceti Rabbits", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2068, "SellPrice":2067, "MeanPrice":9079, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667027, "Name":"$kachiriginleaches_name;", "Name_Localised":"Kachirigin Filter Leeches", "Category":"$MARKET_category_medicines;", "Category_Localised":"Medicines", "BuyPrice":1359, "SellPrice":1358, "MeanPrice":8227, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667029, "Name":"$onionhead_name;", "Name_Localised":"Onionhead", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":1814, "SellPrice":1813, "MeanPrice":8437, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667034, "Name":"$konggaale_name;", "Name_Localised":"Kongga Ale", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":1578, "SellPrice":1577, "MeanPrice":8310, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667035, "Name":"$wuthielokufroth_name;", "Name_Localised":"Wuthielo Ku Froth", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":1558, "SellPrice":1557, "MeanPrice":8194, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667036, "Name":"$alacarakmoskinart_name;", "Name_Localised":"Alacarakmo Skin Art", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":1858, "SellPrice":1857, "MeanPrice":8899, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667037, "Name":"$eleuthermals_name;", "Name_Localised":"Eleu Thermals", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":1571, "SellPrice":1570, "MeanPrice":8507, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667038, "Name":"$eshuumbrellas_name;", "Name_Localised":"Eshu Umbrellas", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":2187, "SellPrice":2186, "MeanPrice":9343, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667039, "Name":"$karetiicouture_name;", "Name_Localised":"Karetii Couture", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":4748, "SellPrice":4747, "MeanPrice":11582, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667040, "Name":"$njangarisaddles_name;", "Name_Localised":"Njangari Saddles", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":1639, "SellPrice":1638, "MeanPrice":8356, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667041, "Name":"$anynacoffee_name;", "Name_Localised":"Any Na Coffee", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2165, "SellPrice":2164, "MeanPrice":9160, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667042, "Name":"$cd75catcoffee_name;", "Name_Localised":"CD-75 Kitten Brand Coffee", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2452, "SellPrice":2451, "MeanPrice":9571, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667043, "Name":"$gomanyauponcoffee_name;", "Name_Localised":"Goman Yaupon Coffee", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1843, "SellPrice":1842, "MeanPrice":8921, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667044, "Name":"$volkhabbeedrones_name;", "Name_Localised":"Volkhab Bee Drones", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":3849, "SellPrice":3848, "MeanPrice":10198, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667045, "Name":"$kinagoinstruments_name;", "Name_Localised":"Kinago Violins", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":6570, "SellPrice":6569, "MeanPrice":13030, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667046, "Name":"$ngunamodernantiques_name;", "Name_Localised":"Nguna Modern Antiques", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":1989, "SellPrice":1988, "MeanPrice":8545, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667047, "Name":"$rajukrustoves_name;", "Name_Localised":"Rajukru Multi-Stoves", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":2346, "SellPrice":2345, "MeanPrice":8378, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667048, "Name":"$tiolcewaste2pasteunits_name;", "Name_Localised":"Tiolce Waste2Paste Units", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":1648, "SellPrice":1647, "MeanPrice":8710, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667049, "Name":"$chieridanimarinepaste_name;", "Name_Localised":"Chi Eridani Marine Paste", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1426, "SellPrice":1425, "MeanPrice":8450, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667050, "Name":"$esusekucaviar_name;", "Name_Localised":"Esuseku Caviar", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2573, "SellPrice":2572, "MeanPrice":9625, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667051, "Name":"$livehecateseaworms_name;", "Name_Localised":"Live Hecate Sea Worms", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1899, "SellPrice":1898, "MeanPrice":8737, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667052, "Name":"$helvetitjpearls_name;", "Name_Localised":"Helvetitj Pearls", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":3507, "SellPrice":3506, "MeanPrice":10450, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667053, "Name":"$hip41181squid_name;", "Name_Localised":"HIP Proto-Squid", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1891, "SellPrice":1890, "MeanPrice":8947, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667054, "Name":"$coquimspongiformvictuals_name;", "Name_Localised":"Coquim Spongiform Victuals", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":10924, "SellPrice":10923, "MeanPrice":8077, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667055, "Name":"$aerialedenapple_name;", "Name_Localised":"Eden Apples Of Aerial", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1660, "SellPrice":1659, "MeanPrice":8331, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667056, "Name":"$neritusberries_name;", "Name_Localised":"Neritus Berries", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1616, "SellPrice":1615, "MeanPrice":8497, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667057, "Name":"$ochoengchillies_name;", "Name_Localised":"Ochoeng Chillies", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1659, "SellPrice":1658, "MeanPrice":8601, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667058, "Name":"$deuringastruffles_name;", "Name_Localised":"Deuringas Truffles", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2335, "SellPrice":2334, "MeanPrice":9232, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667059, "Name":"$hr7221wheat_name;", "Name_Localised":"HR 7221 Wheat", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1540, "SellPrice":1539, "MeanPrice":8190, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667060, "Name":"$jarouarice_name;", "Name_Localised":"Jaroua Rice", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2711, "SellPrice":2710, "MeanPrice":8169, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667061, "Name":"$belalansrayleather_name;", "Name_Localised":"Belalans Ray Leather", "Category":"$MARKET_category_textiles;", "Category_Localised":"Textiles", "BuyPrice":1605, "SellPrice":1604, "MeanPrice":8519, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667062, "Name":"$damnacarapaces_name;", "Name_Localised":"Damna Carapaces", "Category":"$MARKET_category_textiles;", "Category_Localised":"Textiles", "BuyPrice":2925, "SellPrice":2924, "MeanPrice":8120, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667063, "Name":"$rapabaosnakeskins_name;", "Name_Localised":"Rapa Bao Snake Skins", "Category":"$MARKET_category_textiles;", "Category_Localised":"Textiles", "BuyPrice":1726, "SellPrice":1725, "MeanPrice":8285, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667064, "Name":"$vanayequirhinofur_name;", "Name_Localised":"Vanayequi Ceratomorpha Fur", "Category":"$MARKET_category_textiles;", "Category_Localised":"Textiles", "BuyPrice":1660, "SellPrice":1659, "MeanPrice":8331, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667065, "Name":"$bastsnakegin_name;", "Name_Localised":"Bast Snake Gin", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":1724, "SellPrice":1723, "MeanPrice":8659, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667066, "Name":"$thrutiscream_name;", "Name_Localised":"Thrutis Cream", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":1538, "SellPrice":1537, "MeanPrice":8550, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667067, "Name":"$wulpahyperboresystems_name;", "Name_Localised":"Wulpa Hyperbore Systems", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":2294, "SellPrice":2293, "MeanPrice":8726, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667073, "Name":"$deltaphoenicispalms_name;", "Name_Localised":"Delta Phoenicis Palms", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":1528, "SellPrice":1527, "MeanPrice":8188, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667074, "Name":"$toxandjivirocide_name;", "Name_Localised":"Toxandji Virocide", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":1678, "SellPrice":1677, "MeanPrice":8275, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667075, "Name":"$xihecompanions_name;", "Name_Localised":"Xihe Biomorphic Companions", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":4277, "SellPrice":4276, "MeanPrice":11058, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667076, "Name":"$sanumameat_name;", "Name_Localised":"Sanuma Decorative Meat", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1319, "SellPrice":1318, "MeanPrice":8504, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667077, "Name":"$ethgrezeteabuds_name;", "Name_Localised":"Ethgreze Tea Buds", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":3212, "SellPrice":3211, "MeanPrice":10197, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667078, "Name":"$ceremonialheiketea_name;", "Name_Localised":"Ceremonial Heike Tea", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2161, "SellPrice":2160, "MeanPrice":9251, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667079, "Name":"$tanmarktranquiltea_name;", "Name_Localised":"Tanmark Tranquil Tea", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2041, "SellPrice":2040, "MeanPrice":9177, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667080, "Name":"$azcancriformula42_name;", "Name_Localised":"AZ Cancri Formula 42", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":6106, "SellPrice":6105, "MeanPrice":12440, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667081, "Name":"$kamitracigars_name;", "Name_Localised":"Kamitra Cigars", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":5522, "SellPrice":5521, "MeanPrice":12282, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667082, "Name":"$rusanioldsmokey_name;", "Name_Localised":"Rusani Old Smokey", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":5179, "SellPrice":5178, "MeanPrice":11994, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667083, "Name":"$yasokondileaf_name;", "Name_Localised":"Yaso Kondi Leaf", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":5381, "SellPrice":5380, "MeanPrice":12171, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667084, "Name":"$chateaudeaegaeon_name;", "Name_Localised":"Chateau De Aegaeon", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":1610, "SellPrice":1609, "MeanPrice":8791, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667085, "Name":"$watersofshintara_name;", "Name_Localised":"The Waters Of Shintara", "Category":"$MARKET_category_medicines;", "Category_Localised":"Medicines", "BuyPrice":7070, "SellPrice":7069, "MeanPrice":13711, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667668, "Name":"$ophiuchiexinoartefacts_name;", "Name_Localised":"Ophiuch Exino Artefacts", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":4072, "SellPrice":4071, "MeanPrice":10969, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667669, "Name":"$bakedgreebles_name;", "Name_Localised":"Baked Greebles", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1056, "SellPrice":1055, "MeanPrice":8211, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667670, "Name":"$cetiaepyornisegg_name;", "Name_Localised":"Aepyornis Egg", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2741, "SellPrice":2740, "MeanPrice":9769, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667671, "Name":"$saxonwine_name;", "Name_Localised":"Saxon Wine", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":1863, "SellPrice":1862, "MeanPrice":8983, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667672, "Name":"$centaurimegagin_name;", "Name_Localised":"Centauri Mega Gin", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":3239, "SellPrice":3238, "MeanPrice":10217, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667673, "Name":"$anduligafireworks_name;", "Name_Localised":"Anduliga Fire Works", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":1574, "SellPrice":1573, "MeanPrice":8519, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667674, "Name":"$bankiamphibiousleather_name;", "Name_Localised":"Banki Amphibious Leather", "Category":"$MARKET_category_textiles;", "Category_Localised":"Textiles", "BuyPrice":1138, "SellPrice":1137, "MeanPrice":8338, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667675, "Name":"$cherbonesbloodcrystals_name;", "Name_Localised":"Cherbones Blood Crystals", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":10207, "SellPrice":10206, "MeanPrice":16714, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667678, "Name":"$gerasiangueuzebeer_name;", "Name_Localised":"Gerasian Gueuze Beer", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":1067, "SellPrice":1066, "MeanPrice":8215, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667679, "Name":"$haidneblackbrew_name;", "Name_Localised":"Haiden Black Brew", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1693, "SellPrice":1692, "MeanPrice":8837, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667680, "Name":"$havasupaidreamcatcher_name;", "Name_Localised":"Havasupai Dream Catcher", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":8056, "SellPrice":8055, "MeanPrice":14639, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667682, "Name":"$hiporganophosphates_name;", "Name_Localised":"Hip Organophosphates", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":1039, "SellPrice":1038, "MeanPrice":8169, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667683, "Name":"$jaradharrepuzzlebox_name;", "Name_Localised":"Jaradharre Puzzle Box", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":10325, "SellPrice":10324, "MeanPrice":16816, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667684, "Name":"$korrokungpellets_name;", "Name_Localised":"Koro Kung Pellets", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":1190, "SellPrice":1189, "MeanPrice":8067, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667685, "Name":"$lftvoidextractcoffee_name;", "Name_Localised":"Void Extract Coffee", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2506, "SellPrice":2505, "MeanPrice":9554, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667686, "Name":"$honestypills_name;", "Name_Localised":"Honesty Pills", "Category":"$MARKET_category_medicines;", "Category_Localised":"Medicines", "BuyPrice":1686, "SellPrice":1685, "MeanPrice":8860, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667687, "Name":"$noneuclidianexotanks_name;", "Name_Localised":"Non Euclidian Exotanks", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":1326, "SellPrice":1325, "MeanPrice":8526, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667688, "Name":"$ltthypersweet_name;", "Name_Localised":"LTT Hyper Sweet", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1233, "SellPrice":1232, "MeanPrice":8054, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667689, "Name":"$mechucoshightea_name;", "Name_Localised":"Mechucos High Tea", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1709, "SellPrice":1708, "MeanPrice":8846, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667690, "Name":"$medbstarlube_name;", "Name_Localised":"Medb Starlube", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":1953, "SellPrice":1952, "MeanPrice":8191, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667691, "Name":"$mokojingbeastfeast_name;", "Name_Localised":"Mokojing Beast Feast", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":2770, "SellPrice":2769, "MeanPrice":9788, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667692, "Name":"$mukusubiichitinos_name;", "Name_Localised":"Mukusubii Chitin-os", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1190, "SellPrice":1189, "MeanPrice":8359, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667693, "Name":"$mulachigiantfungus_name;", "Name_Localised":"Mulachi Giant Fungus", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":8230, "SellPrice":8229, "MeanPrice":7957, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667694, "Name":"$ngadandarifireopals_name;", "Name_Localised":"Ngadandari Fire Opals", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":12751, "SellPrice":12750, "MeanPrice":19112, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667695, "Name":"$tiegfriessynthsilk_name;", "Name_Localised":"Tiegfries Synth Silk", "Category":"$MARKET_category_textiles;", "Category_Localised":"Textiles", "BuyPrice":1263, "SellPrice":1262, "MeanPrice":8478, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667696, "Name":"$uzumokulowgwings_name;", "Name_Localised":"Uzumoku Low-G Wings", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":7233, "SellPrice":7232, "MeanPrice":13845, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667697, "Name":"$vherculisbodyrub_name;", "Name_Localised":"V Herculis Body Rub", "Category":"$MARKET_category_medicines;", "Category_Localised":"Medicines", "BuyPrice":1730, "SellPrice":1729, "MeanPrice":8010, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667698, "Name":"$wheemetewheatcakes_name;", "Name_Localised":"Wheemete Wheat Cakes", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1164, "SellPrice":1163, "MeanPrice":8081, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667699, "Name":"$vegaslimweed_name;", "Name_Localised":"Vega Slimweed", "Category":"$MARKET_category_medicines;", "Category_Localised":"Medicines", "BuyPrice":2518, "SellPrice":2517, "MeanPrice":9588, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667700, "Name":"$altairianskin_name;", "Name_Localised":"Altairian Skin", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":1262, "SellPrice":1261, "MeanPrice":8432, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667702, "Name":"$jotunmookah_name;", "Name_Localised":"Jotun Mookah", "Category":"$MARKET_category_textiles;", "Category_Localised":"Textiles", "BuyPrice":1637, "SellPrice":1636, "MeanPrice":8780, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667703, "Name":"$giantverrix_name;", "Name_Localised":"Giant Verrix", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":5713, "SellPrice":5712, "MeanPrice":12496, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667704, "Name":"$indibourbon_name;", "Name_Localised":"Indi Bourbon", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":1638, "SellPrice":1637, "MeanPrice":8806, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667705, "Name":"$aroucaconventualsweets_name;", "Name_Localised":"Arouca Conventual Sweets", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1557, "SellPrice":1556, "MeanPrice":8737, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667706, "Name":"$taurichimes_name;", "Name_Localised":"Tauri Chimes", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":1374, "SellPrice":1373, "MeanPrice":8549, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667707, "Name":"$zeesszeantglue_name;", "Name_Localised":"Zeessze Ant Grub Glue", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":1089, "SellPrice":1088, "MeanPrice":8161, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667708, "Name":"$pantaaprayersticks_name;", "Name_Localised":"Pantaa Prayer Sticks", "Category":"$MARKET_category_medicines;", "Category_Localised":"Medicines", "BuyPrice":2043, "SellPrice":2042, "MeanPrice":9177, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667709, "Name":"$fujintea_name;", "Name_Localised":"Fujin Tea", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1418, "SellPrice":1417, "MeanPrice":8597, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667710, "Name":"$chameleoncloth_name;", "Name_Localised":"Chameleon Cloth", "Category":"$MARKET_category_textiles;", "Category_Localised":"Textiles", "BuyPrice":1959, "SellPrice":1958, "MeanPrice":9071, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667711, "Name":"$orrerianviciousbrew_name;", "Name_Localised":"Orrerian Vicious Brew", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1146, "SellPrice":1145, "MeanPrice":8342, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667712, "Name":"$uszaiantreegrub_name;", "Name_Localised":"Uszaian Tree Grub", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1379, "SellPrice":1378, "MeanPrice":8578, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667713, "Name":"$momusbogspaniel_name;", "Name_Localised":"Momus Bog Spaniel", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":2054, "SellPrice":2053, "MeanPrice":9184, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667714, "Name":"$disomacorn_name;", "Name_Localised":"Diso Ma Corn", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":1053, "SellPrice":1052, "MeanPrice":8134, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667715, "Name":"$leestianeviljuice_name;", "Name_Localised":"Leestian Evil Juice", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":1086, "SellPrice":1085, "MeanPrice":8220, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667716, "Name":"$bluemilk_name;", "Name_Localised":"Azure Milk", "Category":"$MARKET_category_foods;", "Category_Localised":"Foods", "BuyPrice":3912, "SellPrice":3911, "MeanPrice":10805, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667717, "Name":"$alieneggs_name;", "Name_Localised":"Leathery Eggs", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":19095, "SellPrice":19094, "MeanPrice":25067, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667718, "Name":"$alyabodilysoap_name;", "Name_Localised":"Alya Body Soap", "Category":"$MARKET_category_medicines;", "Category_Localised":"Medicines", "BuyPrice":1078, "SellPrice":1077, "MeanPrice":8218, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667719, "Name":"$vidavantianlace_name;", "Name_Localised":"Vidavantian Lace", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":5861, "SellPrice":5860, "MeanPrice":12615, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128667760, "Name":"$transgeniconionhead_name;", "Name_Localised":"Lucan Onionhead", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":1483, "SellPrice":1482, "MeanPrice":8472, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128668017, "Name":"$jaquesquinentianstill_name;", "Name_Localised":"Jaques Quinentian Still", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":7233, "SellPrice":7232, "MeanPrice":13845, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128668018, "Name":"$soontillrelics_name;", "Name_Localised":"Soontill Relics", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":13602, "SellPrice":13601, "MeanPrice":19885, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128668547, "Name":"$unknownartifact_name;", "Name_Localised":"Thargoid Sensor", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":234627, "SellPrice":234615, "MeanPrice":306252, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128668550, "Name":"$painite_name;", "Name_Localised":"Painite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":192955, "MeanPrice":53016, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":4, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128671118, "Name":"$osmium_name;", "Name_Localised":"Osmium", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":23482, "SellPrice":23480, "MeanPrice":45198, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128671119, "Name":"$advert1_name;", "Name_Localised":"Ultra-Compact Processor Prototypes", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":15267, "SellPrice":15266, "MeanPrice":21542, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128671443, "Name":"$sap8corecontainer_name;", "Name_Localised":"SAP 8 Core Container", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":49112, "SellPrice":49109, "MeanPrice":67593, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672121, "Name":"$thehuttonmug_name;", "Name_Localised":"The Hutton Mug", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":2751, "SellPrice":2750, "MeanPrice":7986, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128672122, "Name":"$sothiscrystallinegold_name;", "Name_Localised":"Sothis Crystalline Gold", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":12751, "SellPrice":12750, "MeanPrice":19112, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128672124, "Name":"$encripteddatastorage_name;", "Name_Localised":"Encrypted Data Storage", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":4049, "SellPrice":4048, "MeanPrice":8313, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672127, "Name":"$comercialsamples_name;", "Name_Localised":"Commercial Samples", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":656, "SellPrice":655, "MeanPrice":1815, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672128, "Name":"$tacticaldata_name;", "Name_Localised":"Tactical Data", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":2170, "SellPrice":2169, "MeanPrice":15622, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672129, "Name":"$assaultplans_name;", "Name_Localised":"Assault Plans", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":3294, "SellPrice":3293, "MeanPrice":26074, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672130, "Name":"$encryptedcorrespondence_name;", "Name_Localised":"Encrypted Correspondence", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":3935, "SellPrice":3934, "MeanPrice":8226, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672131, "Name":"$diplomaticbag_name;", "Name_Localised":"Diplomatic Bag", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":4265, "SellPrice":4264, "MeanPrice":28625, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672132, "Name":"$scientificresearch_name;", "Name_Localised":"Scientific Research", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":13394, "SellPrice":13393, "MeanPrice":20151, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672133, "Name":"$scientificsamples_name;", "Name_Localised":"Scientific Samples", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":10878, "SellPrice":10877, "MeanPrice":7955, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672136, "Name":"$largeexplorationdatacash_name;", "Name_Localised":"Large Survey Data Cache", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":225210, "SellPrice":225198, "MeanPrice":255841, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672137, "Name":"$smallexplorationdatacash_name;", "Name_Localised":"Small Survey Data Cache", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":40615, "SellPrice":40612, "MeanPrice":25005, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672159, "Name":"$antiquejewellery_name;", "Name_Localised":"Antique Jewellery", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":158957, "SellPrice":158949, "MeanPrice":183163, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672160, "Name":"$preciousgems_name;", "Name_Localised":"Precious Gems", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":138850, "SellPrice":138843, "MeanPrice":160280, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672161, "Name":"$earthrelics_name;", "Name_Localised":"Earth Relics", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":14640, "SellPrice":14639, "MeanPrice":15161, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672162, "Name":"$genebank_name;", "Name_Localised":"Gene Bank", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":46704, "SellPrice":46701, "MeanPrice":59082, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672163, "Name":"$timecapsule_name;", "Name_Localised":"Time Capsule", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":2926, "SellPrice":2925, "MeanPrice":5364, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672294, "Name":"$cryolite_name;", "Name_Localised":"Cryolite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":14970, "MeanPrice":12173, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":1166, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128672295, "Name":"$goslarite_name;", "Name_Localised":"Goslarite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":8024, "MeanPrice":5979, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":1290, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128672296, "Name":"$moissanite_name;", "Name_Localised":"Moissanite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":16662, "SellPrice":16661, "MeanPrice":24833, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672297, "Name":"$pyrophyllite_name;", "Name_Localised":"Pyrophyllite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":13777, "MeanPrice":11538, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":341, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128672298, "Name":"$lanthanum_name;", "Name_Localised":"Lanthanum", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":6087, "SellPrice":6086, "MeanPrice":8707, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672299, "Name":"$thallium_name;", "Name_Localised":"Thallium", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":2539, "SellPrice":2538, "MeanPrice":3745, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672300, "Name":"$bismuth_name;", "Name_Localised":"Bismuth", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":1607, "SellPrice":1606, "MeanPrice":2441, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672301, "Name":"$thorium_name;", "Name_Localised":"Thorium", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":7969, "SellPrice":7968, "MeanPrice":11317, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672302, "Name":"$ceramiccomposites_name;", "Name_Localised":"Ceramic Composites", "Category":"$MARKET_category_industrial_materials;", "Category_Localised":"Industrial materials", "BuyPrice":424, "SellPrice":423, "MeanPrice":415, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672303, "Name":"$syntheticreagents_name;", "Name_Localised":"Synthetic Reagents", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":4463, "SellPrice":4462, "MeanPrice":6651, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672305, "Name":"$surfacestabilisers_name;", "Name_Localised":"Surface Stabilisers", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":1656, "SellPrice":1550, "MeanPrice":726, "StockBracket":1, "DemandBracket":0, "Stock":67, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128672307, "Name":"$geologicalequipment_name;", "Name_Localised":"Geological Equipment", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":1186, "SellPrice":1185, "MeanPrice":1886, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672308, "Name":"$thermalcoolingunits_name;", "Name_Localised":"Thermal Cooling Units", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":2516, "SellPrice":2515, "MeanPrice":3760, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672309, "Name":"$buildingfabricators_name;", "Name_Localised":"Building Fabricators", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":1448, "SellPrice":1447, "MeanPrice":2312, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672310, "Name":"$mutomimager_name;", "Name_Localised":"Muon Imager", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":4218, "SellPrice":4217, "MeanPrice":6311, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672311, "Name":"$structuralregulators_name;", "Name_Localised":"Structural Regulators", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":1186, "SellPrice":1185, "MeanPrice":1932, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672313, "Name":"$skimercomponents_name;", "Name_Localised":"Skimmer Components", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":530, "SellPrice":529, "MeanPrice":1119, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672314, "Name":"$evacuationshelter_name;", "Name_Localised":"Evacuation Shelter", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":138, "SellPrice":137, "MeanPrice":522, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672315, "Name":"$geologicalsamples_name;", "Name_Localised":"Geological Samples", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":12144, "SellPrice":12143, "MeanPrice":8313, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672431, "Name":"$personalgifts_name;", "Name_Localised":"Personal Gifts", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":10000, "SellPrice":9999, "MeanPrice":16535, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128672432, "Name":"$crystallinespheres_name;", "Name_Localised":"Crystalline Spheres", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":5438, "SellPrice":5437, "MeanPrice":12216, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128672701, "Name":"$metaalloys_name;", "Name_Localised":"Meta-Alloys", "Category":"$MARKET_category_industrial_materials;", "Category_Localised":"Industrial materials", "BuyPrice":162685, "SellPrice":162676, "MeanPrice":195453, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672775, "Name":"$taaffeite_name;", "Name_Localised":"Taaffeite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":51665, "SellPrice":51662, "MeanPrice":52089, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672776, "Name":"$jadeite_name;", "Name_Localised":"Jadeite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":40631, "SellPrice":40628, "MeanPrice":42383, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672810, "Name":"$unstabledatacore_name;", "Name_Localised":"Unstable Data Core", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":2371, "SellPrice":2370, "MeanPrice":4516, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128672812, "Name":"$onionheada_name;", "Name_Localised":"Onionhead Alpha Strain", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":1272, "SellPrice":1271, "MeanPrice":8437, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128673069, "Name":"$onionheadb_name;", "Name_Localised":"Onionhead Beta Strain", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":1272, "SellPrice":1271, "MeanPrice":8437, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128673845, "Name":"$praseodymium_name;", "Name_Localised":"Praseodymium", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":6708, "SellPrice":6707, "MeanPrice":8620, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673846, "Name":"$bromellite_name;", "Name_Localised":"Bromellite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":70950, "SellPrice":70946, "MeanPrice":30424, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673847, "Name":"$samarium_name;", "Name_Localised":"Samarium", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":31195, "SellPrice":31193, "MeanPrice":25852, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673848, "Name":"$lowtemperaturediamond_name;", "Name_Localised":"Low Temp. Diamonds", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":293785, "MeanPrice":106353, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":2, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128673850, "Name":"$hydrogenperoxide_name;", "Name_Localised":"Hydrogen Peroxide", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":0, "SellPrice":3301, "MeanPrice":3160, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":548, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128673851, "Name":"$liquidoxygen_name;", "Name_Localised":"Liquid oxygen", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":957, "SellPrice":850, "MeanPrice":1474, "StockBracket":1, "DemandBracket":0, "Stock":22, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128673852, "Name":"$methanolmonohydratecrystals_name;", "Name_Localised":"Methanol Monohydrate Crystals", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":1290, "SellPrice":1289, "MeanPrice":2478, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673853, "Name":"$lithiumhydroxide_name;", "Name_Localised":"Lithium Hydroxide", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":7350, "MeanPrice":5673, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":99, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128673854, "Name":"$methaneclathrate_name;", "Name_Localised":"Methane Clathrate", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":1740, "MeanPrice":1650, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":2873, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128673855, "Name":"$insulatingmembrane_name;", "Name_Localised":"Insulating Membrane", "Category":"$MARKET_category_industrial_materials;", "Category_Localised":"Industrial materials", "BuyPrice":10137, "SellPrice":10021, "MeanPrice":10724, "StockBracket":2, "DemandBracket":0, "Stock":2, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128673856, "Name":"$cmmcomposite_name;", "Name_Localised":"CMM Composite", "Category":"$MARKET_category_industrial_materials;", "Category_Localised":"Industrial materials", "BuyPrice":3907, "SellPrice":3906, "MeanPrice":5988, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673857, "Name":"$coolinghoses_name;", "Name_Localised":"Micro-weave Cooling Hoses", "Category":"$MARKET_category_industrial_materials;", "Category_Localised":"Industrial materials", "BuyPrice":707, "SellPrice":706, "MeanPrice":1886, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673858, "Name":"$neofabricinsulation_name;", "Name_Localised":"Neofabric Insulation", "Category":"$MARKET_category_industrial_materials;", "Category_Localised":"Industrial materials", "BuyPrice":3380, "SellPrice":3379, "MeanPrice":5978, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673859, "Name":"$articulationmotors_name;", "Name_Localised":"Articulation Motors", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":4463, "SellPrice":4462, "MeanPrice":7588, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673860, "Name":"$hnshockmount_name;", "Name_Localised":"HN Shock Mount", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":1075, "SellPrice":1074, "MeanPrice":1922, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673861, "Name":"$emergencypowercells_name;", "Name_Localised":"Emergency Power Cells", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":1338, "SellPrice":1337, "MeanPrice":2368, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673862, "Name":"$powerconverter_name;", "Name_Localised":"Power Converter", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":707, "SellPrice":706, "MeanPrice":1433, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673863, "Name":"$powergridassembly_name;", "Name_Localised":"Energy Grid Assembly", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":1543, "SellPrice":1542, "MeanPrice":2659, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673864, "Name":"$powertransferconduits_name;", "Name_Localised":"Power Transfer Bus", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":1254, "SellPrice":1253, "MeanPrice":2212, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673865, "Name":"$radiationbaffle_name;", "Name_Localised":"Radiation Baffle", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":935, "SellPrice":934, "MeanPrice":1787, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673866, "Name":"$exhaustmanifold_name;", "Name_Localised":"Exhaust Manifold", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":1009, "SellPrice":1008, "MeanPrice":1873, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673867, "Name":"$reinforcedmountingplate_name;", "Name_Localised":"Reinforced Mounting Plate", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":1446, "SellPrice":1445, "MeanPrice":2454, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673868, "Name":"$heatsinkinterlink_name;", "Name_Localised":"Heatsink Interlink", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":1161, "SellPrice":1160, "MeanPrice":2100, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673869, "Name":"$magneticemittercoil_name;", "Name_Localised":"Magnetic Emitter Coil", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":656, "SellPrice":655, "MeanPrice":1357, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673870, "Name":"$modularterminals_name;", "Name_Localised":"Modular Terminals", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":1075, "SellPrice":1074, "MeanPrice":2475, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673871, "Name":"$nanobreakers_name;", "Name_Localised":"Nanobreakers", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":1009, "SellPrice":1008, "MeanPrice":2366, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673872, "Name":"$telemetrysuite_name;", "Name_Localised":"Telemetry Suite", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":1543, "SellPrice":1542, "MeanPrice":3214, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673873, "Name":"$microcontrollers_name;", "Name_Localised":"Micro Controllers", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":3612, "SellPrice":3611, "MeanPrice":5590, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673874, "Name":"$iondistributor_name;", "Name_Localised":"Ion Distributor", "Category":"$MARKET_category_machinery;", "Category_Localised":"Machinery", "BuyPrice":1338, "SellPrice":1337, "MeanPrice":2363, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673875, "Name":"$diagnosticsensor_name;", "Name_Localised":"Hardware Diagnostic Sensor", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":4463, "SellPrice":4462, "MeanPrice":6727, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128673876, "Name":"$unknownartifact2_name;", "Name_Localised":"Thargoid Probe", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":344560, "SellPrice":344542, "MeanPrice":443535, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128682044, "Name":"$conductivefabrics_name;", "Name_Localised":"Conductive Fabrics", "Category":"$MARKET_category_textiles;", "Category_Localised":"Textiles", "BuyPrice":1937, "SellPrice":1810, "MeanPrice":709, "StockBracket":1, "DemandBracket":0, "Stock":55, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128682045, "Name":"$militarygradefabrics_name;", "Name_Localised":"Military Grade Fabrics", "Category":"$MARKET_category_textiles;", "Category_Localised":"Textiles", "BuyPrice":3690, "SellPrice":3527, "MeanPrice":984, "StockBracket":1, "DemandBracket":0, "Stock":46, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128682046, "Name":"$advancedmedicines_name;", "Name_Localised":"Advanced Medicines", "Category":"$MARKET_category_medicines;", "Category_Localised":"Medicines", "BuyPrice":0, "SellPrice":1726, "MeanPrice":1485, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":296, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128682047, "Name":"$medicaldiagnosticequipment_name;", "Name_Localised":"Medical Diagnostic Equipment", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":1779, "SellPrice":1778, "MeanPrice":3075, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128682048, "Name":"$survivalequipment_name;", "Name_Localised":"Survival Equipment", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":533, "SellPrice":532, "MeanPrice":684, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128682049, "Name":"$datacore_name;", "Name_Localised":"Data Core", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":3907, "SellPrice":3906, "MeanPrice":6791, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128682050, "Name":"$galactictravelguide_name;", "Name_Localised":"Galactic Travel Guide", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":359, "SellPrice":358, "MeanPrice":8627, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128682051, "Name":"$mysteriousidol_name;", "Name_Localised":"Mysterious Idol", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":13815, "SellPrice":13814, "MeanPrice":20863, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128682054, "Name":"$spacepioneerrelics_name;", "Name_Localised":"Space Pioneer Relics", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":5967, "SellPrice":5966, "MeanPrice":9780, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128682055, "Name":"$fossilremnants_name;", "Name_Localised":"Fossil Remnants", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":7379, "SellPrice":7378, "MeanPrice":11785, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128732183, "Name":"$ancientrelic_name;", "Name_Localised":"Guardian Relic", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":9126, "SellPrice":9125, "MeanPrice":24962, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128732184, "Name":"$ancientorb_name;", "Name_Localised":"Guardian Orb", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":5967, "SellPrice":5966, "MeanPrice":17415, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128732185, "Name":"$ancientcasket_name;", "Name_Localised":"Guardian Casket", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":5581, "SellPrice":5580, "MeanPrice":16294, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128732186, "Name":"$ancienttablet_name;", "Name_Localised":"Guardian Tablet", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":5967, "SellPrice":5966, "MeanPrice":17415, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128732187, "Name":"$ancienturn_name;", "Name_Localised":"Guardian Urn", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":3907, "SellPrice":3906, "MeanPrice":14907, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128732188, "Name":"$ancienttotem_name;", "Name_Localised":"Guardian Totem", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":7379, "SellPrice":7378, "MeanPrice":20437, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128732551, "Name":"$shanscharisorchid_name;", "Name_Localised":"Shan's Charis Orchid", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":1914, "SellPrice":1913, "MeanPrice":9043, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128737287, "Name":"$unknownresin_name;", "Name_Localised":"Thargoid Resin", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":22634, "SellPrice":22632, "MeanPrice":32825, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128737288, "Name":"$unknownbiologicalmatter_name;", "Name_Localised":"Thargoid Biological Matter", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":37090, "SellPrice":37088, "MeanPrice":51920, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128737289, "Name":"$unknowntechnologysamples_name;", "Name_Localised":"Thargoid Technology Samples", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":28012, "SellPrice":28010, "MeanPrice":39930, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128740752, "Name":"$unknownartifact3_name;", "Name_Localised":"Thargoid Link", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":37090, "SellPrice":37088, "MeanPrice":51920, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128748428, "Name":"$buckyballbeermats_name;", "Name_Localised":"Buckyball Beer Mats", "Category":"$MARKET_category_consumer_items;", "Category_Localised":"Consumer items", "BuyPrice":8230, "SellPrice":8229, "MeanPrice":7957, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128793113, "Name":"$harmasilversearum_name;", "Name_Localised":"Harma Silver Sea Rum", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":4217, "SellPrice":4216, "MeanPrice":9762, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128793114, "Name":"$platinumaloy_name;", "Name_Localised":"Platinum Alloy", "Category":"$MARKET_category_metals;", "Category_Localised":"Metals", "BuyPrice":12009, "SellPrice":12008, "MeanPrice":18333, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128793127, "Name":"$thargoidheart_name;", "Name_Localised":"Thargoid Heart", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":104381, "SellPrice":104375, "MeanPrice":140275, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128793128, "Name":"$thargoidtissuesampletype1_name;", "Name_Localised":"Thargoid Cyclops Tissue Sample", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":45421, "SellPrice":45418, "MeanPrice":63272, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128793129, "Name":"$thargoidtissuesampletype2_name;", "Name_Localised":"Thargoid Basilisk Tissue Sample", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":52545, "SellPrice":52542, "MeanPrice":72212, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128793130, "Name":"$thargoidtissuesampletype3_name;", "Name_Localised":"Thargoid Medusa Tissue Sample", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":60149, "SellPrice":60145, "MeanPrice":82435, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128824468, "Name":"$thargoidscouttissuesample_name;", "Name_Localised":"Thargoid Scout Tissue Sample", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":15982, "SellPrice":15981, "MeanPrice":23731, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128888499, "Name":"$ancientkey_name;", "Name_Localised":"Ancient Key", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":9760, "SellPrice":9759, "MeanPrice":29931, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128902652, "Name":"$thargoidtissuesampletype4_name;", "Name_Localised":"Thargoid Hydra Tissue Sample", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":79648, "SellPrice":79644, "MeanPrice":107495, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128913661, "Name":"$nanomedicines_name;", "Name_Localised":"Nanomedicines", "Category":"$MARKET_category_medicines;", "Category_Localised":"Medicines", "BuyPrice":2227, "SellPrice":2226, "MeanPrice":9859, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128922517, "Name":"$m_tissuesample_fluid_name;", "Name_Localised":"Mollusc Fluid", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":3380, "SellPrice":3379, "MeanPrice":6031, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128922518, "Name":"$m_tissuesample_soft_name;", "Name_Localised":"Mollusc Soft Tissue", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":11290, "SellPrice":11289, "MeanPrice":17216, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128922519, "Name":"$m_tissuesample_nerves_name;", "Name_Localised":"Mollusc Brain Tissue", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":22634, "SellPrice":22632, "MeanPrice":32825, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128922520, "Name":"$s_tissuesample_cells_name;", "Name_Localised":"Pod Core Tissue", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":2532, "SellPrice":2531, "MeanPrice":4780, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128922521, "Name":"$s_tissuesample_surface_name;", "Name_Localised":"Pod Dead Tissue", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":8438, "SellPrice":8437, "MeanPrice":13361, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128922522, "Name":"$s_tissuesample_core_name;", "Name_Localised":"Pod Surface Tissue", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":19777, "SellPrice":19776, "MeanPrice":28819, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128922523, "Name":"$p_particulatesample_name;", "Name_Localised":"Anomaly Particles", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":32061, "SellPrice":32059, "MeanPrice":45525, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128922524, "Name":"$duradrives_name;", "Name_Localised":"Duradrives", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":13002, "SellPrice":13001, "MeanPrice":19356, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128922781, "Name":"$s9_tissuesample_shell_name;", "Name_Localised":"Pod Tissue", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":7890, "SellPrice":7889, "MeanPrice":12546, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128922782, "Name":"$m3_tissuesample_membrane_name;", "Name_Localised":"Mollusc Membrane", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":12075, "SellPrice":12074, "MeanPrice":18352, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128922783, "Name":"$m3_tissuesample_mycelium_name;", "Name_Localised":"Mollusc Mycelium", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":22634, "SellPrice":22632, "MeanPrice":32825, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128922784, "Name":"$m3_tissuesample_spores_name;", "Name_Localised":"Mollusc Spores", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":3380, "SellPrice":3379, "MeanPrice":6031, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128922785, "Name":"$s6_tissuesample_mesoglea_name;", "Name_Localised":"Pod Mesoglea", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":18488, "SellPrice":18487, "MeanPrice":27009, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128922786, "Name":"$s6_tissuesample_cells_name;", "Name_Localised":"Pod Outer Tissue", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":4175, "SellPrice":4174, "MeanPrice":7210, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128922787, "Name":"$s6_tissuesample_coenosarc_name;", "Name_Localised":"Pod Shell Tissue", "Category":"$MARKET_category_salvage;", "Category_Localised":"Salvage", "BuyPrice":37090, "SellPrice":37088, "MeanPrice":51920, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128924325, "Name":"$rhodplumsite_name;", "Name_Localised":"Rhodplumsite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":275688, "MeanPrice":176839, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":2, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128924326, "Name":"$serendibite_name;", "Name_Localised":"Serendibite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":560027, "MeanPrice":172711, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":2, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128924327, "Name":"$monazite_name;", "Name_Localised":"Monazite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":840306, "MeanPrice":200975, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":1, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128924328, "Name":"$musgravite_name;", "Name_Localised":"Musgravite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":382972, "MeanPrice":198613, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":2, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128924329, "Name":"$benitoite_name;", "Name_Localised":"Benitoite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":570449, "MeanPrice":149395, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":2, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128924330, "Name":"$grandidierite_name;", "Name_Localised":"Grandidierite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":458141, "MeanPrice":197292, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":2, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128924331, "Name":"$alexandrite_name;", "Name_Localised":"Alexandrite", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":357530, "MeanPrice":217277, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":2, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128924332, "Name":"$opal_name;", "Name_Localised":"Void Opal", "Category":"$MARKET_category_minerals;", "Category_Localised":"Minerals", "BuyPrice":0, "SellPrice":525075, "MeanPrice":135284, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":1, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128924333, "Name":"$rockforthfertiliser_name;", "Name_Localised":"Rockforth Fertiliser", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":6, "SellPrice":5, "MeanPrice":9, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":false },
{ "id":128924334, "Name":"$agronomictreatment_name;", "Name_Localised":"Agronomic Treatment", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":0, "SellPrice":15596, "MeanPrice":3105, "StockBracket":0, "DemandBracket":3, "Stock":0, "Demand":2, "Consumer":true, "Producer":false, "Rare":false },
{ "id":128958679, "Name":"$apavietii_name;", "Name_Localised":"Apa Vietii", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":3386, "SellPrice":3385, "MeanPrice":10362, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true },
{ "id":128961249, "Name":"$tritium_name;", "Name_Localised":"Tritium", "Category":"$MARKET_category_chemicals;", "Category_Localised":"Chemicals", "BuyPrice":56235, "SellPrice":55627, "MeanPrice":51707, "StockBracket":1, "DemandBracket":0, "Stock":2, "Demand":1, "Consumer":false, "Producer":true, "Rare":false },
{ "id":128983059, "Name":"$onionheadc_name;", "Name_Localised":"Onionhead Gamma Strain", "Category":"$MARKET_category_drugs;", "Category_Localised":"Legal drugs", "BuyPrice":0, "SellPrice":5755, "MeanPrice":4828, "StockBracket":0, "DemandBracket":1, "Stock":0, "Demand":0, "Consumer":true, "Producer":false, "Rare":false },
{ "id":129002574, "Name":"$classifiedexperimentalequipment_name;", "Name_Localised":"Classified Experimental Equipment", "Category":"$MARKET_category_technology;", "Category_Localised":"Technology", "BuyPrice":4002, "SellPrice":4001, "MeanPrice":11423, "StockBracket":0, "DemandBracket":0, "Stock":0, "Demand":0, "Consumer":false, "Producer":false, "Rare":true }
] }

View File

@ -0,0 +1,18 @@
# Gateway Testing Scripts
## Introduction
This directory contains some very "rough and ready" scripts, plus
supporting files, that can be utilised to test that the EDDN Gateway code
is properly responding in the face of a variety of bad messages.
Ultimately the plan is to use these as a basis for implementing some proper
automated tests.
## Use
The scripts are mostly written against Python 3.x and expect a single
filename to be passed on the commandline. The exception is `test-bad-gzip.
sh` which is a Bourne Shell script, using `curl` to send a request that
claims to be gzipped, but isn't valid.
They all have the beta EDDN Gateway URL hard-coded. **NEVER** change this
to run them against the live service!

View File

@ -0,0 +1,46 @@
{
"$schemaRef": "http://schemas.elite-markets.net/eddn/commodity/2",
"message": {
"timestamp": "2022-01-06T11:19:27Z",
"systemName": "LP 98-132",
"stationName": "Freeport",
"marketId": 128008448,
"commodities": [
{
"name": "advancedcatalysers",
"meanPrice": 3039,
"buyPrice": 0,
"stock": 0,
"stockBracket": 0,
"sellPrice": 3756,
"demand": 936,
"demandBracket": 3
},
{
"name": "advancedmedicines",
"meanPrice": 1485,
"buyPrice": 0,
"stock": 0,
"stockBracket": 0,
"sellPrice": 1726,
"demand": 296,
"demandBracket": 3
},
{
"name": "advert1",
"meanPrice": 21542,
"buyPrice": 15267,
"stock": 0,
"stockBracket": 0,
"sellPrice": 15266,
"demand": 0,
"demandBracket": 0
}
]
},
"header": {
"uploaderID": "Athanasius Testing",
"softwareName": "Athanasius Testing",
"softwareVersion": "v0.0.1"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,50 @@
#!/usr/bin/env python3
import json
import re
import sys
from collections import OrderedDict
if len(sys.argv) != 2:
print('<script> Market.json')
sys.exit(-1)
CANONICALISE_RE = re.compile(r'\$(.+)_name;')
def canonicalise(item) -> str:
match = CANONICALISE_RE.match(item)
return match and match.group(1) or item
entry = json.load(open(sys.argv[1], 'r'))
items = entry.get('Items')
commodities = sorted((OrderedDict([
('name', canonicalise(commodity['Name'])),
('meanPrice', commodity['MeanPrice']),
('buyPrice', commodity['BuyPrice']),
('stock', commodity['Stock']),
('stockBracket', commodity['StockBracket']),
('sellPrice', commodity['SellPrice']),
('demand', commodity['Demand']),
('demandBracket', commodity['DemandBracket']),
]) for commodity in items), key=lambda c: c['name'])
msg = {
'$schemaRef': 'https://eddn.edcd.io/schemas/commodity/3',
'message': OrderedDict([
('timestamp', entry['timestamp']),
('systemName', entry['StarSystem']),
('stationName', entry['StationName']),
('marketId', entry['MarketID']),
('commodities', commodities),
]),
}
msg['header'] = {
'uploaderID': 'Athanasius Testing',
'softwareName': 'Athanasius Testing',
'softwareVersion': 'v0.0.1',
}
print(json.dumps(msg, indent=2))

View File

@ -0,0 +1,37 @@
{]
"$schemaRef": "https://eddn.edcd.io/schemas/journal/1",
"header": {
"uploaderID": "Athanasius Testing",
"softwareName": "Athanasius Testing",
"softwareVersion": "v0.0.1"
},
"message": {
"timestamp":"2021-11-05T15:46:28Z",
"event":"Scan",
"ScanType":"AutoScan",
"BodyName":"Elphin",
"BodyID":1,
"Parents":[ {"Null":0} ],
"StarSystem":"Elphin",
"StarPos":[-30.12500,8.18750,-17.00000],
"SystemAddress":3932076118738,
"DistanceFromArrivalLS":0.000000,
"StarType":"K",
"Subclass":3,
"StellarMass":0.769531,
"Radius":587464832.000000,
"AbsoluteMagnitude":6.294067,
"Age_MY":9558,
"SurfaceTemperature":4796.000000,
"Luminosity":"V",
"SemiMajorAxis":1704360246658.325195,
"Eccentricity":0.348740,
"OrbitalInclination":-72.647343,
"Periapsis":86.347190,
"OrbitalPeriod":7189218699.932098,
"AscendingNode":0.000000,
"MeanAnomaly":351.262353,
"RotationPeriod":248957.736717,
"AxialTilt":-0.126915
}
}

View File

@ -0,0 +1,36 @@
{
"$schemaRef": "https://eddn.edcd.io/schemas/journal/1",
"message": {
"timestamp":"2021-11-05T15:46:28Z",
"event":"Scan",
"ScanType":"AutoScan",
"BodyName":"Elphin",
"BodyID":1,
"Parents":[ {"Null":0} ],
"StarSystem":"Elphin",
"StarPos":[-30.12500,8.18750,-17.00000],
"SystemAddress":3932076118738,
"DistanceFromArrivalLS":0.000000,
"StarType":"K",
"Subclass":3,
"StellarMass":0.769531,
"Radius":587464832.000000,
"AbsoluteMagnitude":6.294067,
"Age_MY":9558,
"SurfaceTemperature":4796.000000,
"Luminosity":"V",
"SemiMajorAxis":1704360246658.325195,
"Eccentricity":0.348740,
"OrbitalInclination":-72.647343,
"Periapsis":86.347190,
"OrbitalPeriod":7189218699.932098,
"AscendingNode":0.000000,
"MeanAnomaly":351.262353,
"RotationPeriod":248957.736717,
"AxialTilt":-0.126915
},
"header": {
"uploaderID": "Athanasius Testing",
"softwareVersion": "v0.0.1"
}
}

View File

@ -0,0 +1,37 @@
{
"$schemaRef": "https://eddn.edcd.io/schemas/journal/1",
"message": {
"timestamp":"2021-11-05T15:46:28Z",
"event":"Scan",
"ScanType":"AutoScan",
"BodyName":"Elphin",
"BodyID":1,
"Parents":[ {"Null":0} ],
"StarSystem":"Elphin",
"NOTStarPos":[-30.12500,8.18750,-17.00000],
"SystemAddress":3932076118738,
"DistanceFromArrivalLS":0.000000,
"StarType":"K",
"Subclass":3,
"StellarMass":0.769531,
"Radius":587464832.000000,
"AbsoluteMagnitude":6.294067,
"Age_MY":9558,
"SurfaceTemperature":4796.000000,
"Luminosity":"V",
"SemiMajorAxis":1704360246658.325195,
"Eccentricity":0.348740,
"OrbitalInclination":-72.647343,
"Periapsis":86.347190,
"OrbitalPeriod":7189218699.932098,
"AscendingNode":0.000000,
"MeanAnomaly":351.262353,
"RotationPeriod":248957.736717,
"AxialTilt":-0.126915
},
"header": {
"uploaderID": "Athanasius Testing",
"softwareName": "Athanasius Testing",
"softwareVersion": "v0.0.1"
}
}

View File

@ -0,0 +1,37 @@
{
"$schemaRef": "https://eddn.edcd.io/schemas/journal/1",
"message": {
"timestamp":"2021-11-05T15:46:28Z",
"event":"Scan",
"ScanType":"AutoScan",
"BodyName":"Elphin",
"BodyID":1,
"Parents":[ {"Null":0} ],
"StarSystem":"Elphin",
"StarPos":[-30.12500,8.18750,-17.00000],
"SystemAddress":3932076118738,
"DistanceFromArrivalLS":0.000000,
"StarType":"K",
"Subclass":3,
"StellarMass":0.769531,
"Radius":587464832.000000,
"AbsoluteMagnitude":6.294067,
"Age_MY":9558,
"SurfaceTemperature":4796.000000,
"Luminosity":"V",
"SemiMajorAxis":1704360246658.325195,
"Eccentricity":0.348740,
"OrbitalInclination":-72.647343,
"Periapsis":86.347190,
"OrbitalPeriod":7189218699.932098,
"AscendingNode":0.000000,
"MeanAnomaly":351.262353,
"RotationPeriod":248957.736717,
"AxialTilt":-0.126915
},
"header": {
"uploaderID": "from Athanasius Testing",
"softwareName": "Athanasius Testing script",
"softwareVersion": "v0.0.1"
}
}

View File

@ -0,0 +1,38 @@
#!/usr/bin/env python3
#
# 2022-01-10: THIS SCRIPT DOES NOT PERFORM THE INTENDED PURPOSE
# BECAUSE IT SEEMS THAT `requests` (or underlying modules) IS TOO CLEVER
# AND APPLIES COMPRESSION WHEN WE SET THE `Content-Encoding: gzip`
# HEADER
import json
import requests
import sys
print('''
DO NOT USE THIS SCRIPT, IT DOES NOT PERFORM THE INTENDED PURPOSE.
USE THE `test-bad-gzip.sh` SCRIPT INSTEAD.
''')
sys.exit(-1)
if len(sys.argv) != 2:
print('test-sender.py <filename>')
sys.exit(-1)
with open(sys.argv[1], 'r') as f:
msg = f.read()
s = requests.Session()
# This apparently causes compression to actually happen
s.headers['Content-Encoding'] = 'gzip'
r = s.post(
'https://beta.eddn.edcd.io:4431/upload/',
data=msg,
)
print(f'Response: {r!r}')
print(f'Body: {r.content.decode()}')

View File

@ -0,0 +1,6 @@
#!/bin/sh
#
# python `requests` appears to perform compression when you set the
# 'Content-Encoding: gzip' header, so do this with curl.
curl --verbose -d 'wegiuweuygtfawgep9aqe8fpq2387lfbr;iufvypq38764tpgf' -H 'Content-Encoding: gzip' 'https://beta.eddn.edcd.io:4431/upload/'

View File

@ -0,0 +1,37 @@
#!/usr/bin/env python3
import json
import requests
import sys
import urllib3
import zlib
if len(sys.argv) != 2:
print('test-sender.py <filename>')
sys.exit(-1)
with open(sys.argv[1], 'r') as f:
# Read from provided file
msg = f.read()
# Fake form-encode it
msg = 'wibble=' + msg
# Compress it
msg_gzip = zlib.compress(msg.encode('utf-8'))
http = urllib3.PoolManager()
# Send that compressed data as a POST body
r = http.request(
'POST',
'https://beta.eddn.edcd.io:4431/upload/',
headers={
'Content-Encoding': 'gzip'
},
body=msg_gzip
)
print(f'Response: {r.status!r}')
print(f'Body:\n{r.data.decode()}\n')

View File

@ -0,0 +1,37 @@
#!/usr/bin/env python3
import json
import requests
import sys
import urllib3
import zlib
if len(sys.argv) != 2:
print('test-sender.py <filename>')
sys.exit(-1)
with open(sys.argv[1], 'r') as f:
# Read from provided file
msg = f.read()
# Fake form-encode it
msg = 'data=' + msg
# Compress it
msg_gzip = zlib.compress(msg.encode('utf-8'))
http = urllib3.PoolManager()
# Send that compressed data as a POST body
r = http.request(
'POST',
'https://beta.eddn.edcd.io:4431/upload/',
headers={
'Content-Encoding': 'gzip'
},
body=msg_gzip
)
print(f'Response: {r.status!r}')
print(f'Body:\n{r.data.decode()}\n')

View File

@ -0,0 +1,29 @@
#!/usr/bin/env python3
import json
import sys
import urllib3
if len(sys.argv) != 2:
print('test-sender.py <filename>')
sys.exit(-1)
with open(sys.argv[1], 'r') as f:
# Read from provided file
msg = f.read()
# Fake form-encode it
msg = 'wibble=' + msg
http = urllib3.PoolManager()
# Send that data as a POST body
r = http.request(
'POST',
'https://beta.eddn.edcd.io:4431/upload/',
body=msg
)
print(f'Response: {r.status!r}')
print(f'Body:\n{r.data.decode()}\n')

View File

@ -0,0 +1,29 @@
#!/usr/bin/env python3
import json
import sys
import urllib3
if len(sys.argv) != 2:
print('test-sender.py <filename>')
sys.exit(-1)
with open(sys.argv[1], 'r') as f:
# Read from provided file
msg = f.read()
# Fake form-encode it
msg = 'data=' + msg
http = urllib3.PoolManager()
# Send that data as a POST body
r = http.request(
'POST',
'https://beta.eddn.edcd.io:4431/upload/',
body=msg
)
print(f'Response: {r.status!r}')
print(f'Body:\n{r.data.decode()}\n')

View File

@ -0,0 +1,20 @@
#!/usr/bin/env python3
import json
import requests
import sys
if len(sys.argv) != 2:
print('test-sender.py <filename>')
sys.exit(-1)
with open(sys.argv[1], 'r') as f:
msg = f.read()
s = requests.Session()
r = s.post('https://beta.eddn.edcd.io:4431/upload/', data=msg)
print(f'Response: {r!r}')
print(f'Body: {r.content.decode()}')

View File

@ -2,9 +2,10 @@ import glob
import os
import re
import shutil
import subprocess
import sys
from setuptools import setup, find_packages
VERSIONFILE = "src/eddn/conf/Version.py"
verstr = "unknown"
try:
@ -20,6 +21,44 @@ except EnvironmentError:
# Read environment-specific settings
import setup_env
###########################################################################
# Enforce the git status being "branch 'live' checked out, at its HEAD"
# if setup_env.py says this is the live environment.
#
# The idea is to have the `live` branch, *which includes documentation*
# always match what is actually running as the live service (modulo the
# small window between pull/install/restart). Thus it shouldn't use
# `master`, or any other branch than `live`, which may have changes merged
# some time before they become live.
###########################################################################
cwd = os.getcwd()
# e.g. /home/eddn/live/EDDN.git
if setup_env.EDDN_ENV == 'live':
try:
git_cmd = subprocess.Popen(
'git symbolic-ref -q --short HEAD'.split(),
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT
)
out, err = git_cmd.communicate()
except Exception as e:
print("Couldn't run git command to check branch: %s" % (e))
else:
branch = out.decode().rstrip('\n')
# - For any other branch checked out at its HEAD this will be a
# different name.
# - For any 'detached HEAD' (i.e. specific commit ID, or tag) it
# will be empty.
if branch != 'live':
print("EDDN_ENV is '%s' (and CWD is %s), but branch is '%s', aborting!" % (setup_env.EDDN_ENV, cwd, branch))
sys.exit(-1)
###########################################################################
# Location of start-eddn-service script and its config file
START_SCRIPT_BIN='%s/.local/bin' % ( os.environ['HOME'] )
# Location of web files

View File

@ -128,22 +128,28 @@ def get_decompressed_message():
:returns: The de-compressed request body.
"""
content_encoding = request.headers.get('Content-Encoding', '')
logger.debug('Content-Encoding: ' + content_encoding)
if content_encoding in ['gzip', 'deflate']:
logger.debug('Content-Encoding of gzip or deflate...')
# Compressed request. We have to decompress the body, then figure out
# if it's form-encoded.
try:
# Auto header checking.
logger.debug('Trying zlib.decompress (15 + 32)...')
message_body = zlib.decompress(request.body.read(), 15 + 32)
except zlib.error:
logger.error('zlib.error, trying zlib.decompress (-15)')
# Negative wbits suppresses adler32 checksumming.
message_body = zlib.decompress(request.body.read(), -15)
logger.debug('Resulting message_body:\n%s\n' % (message_body))
# At this point, we're not sure whether we're dealing with a straight
# un-encoded POST body, or a form-encoded POST. Attempt to parse the
# body. If it's not form-encoded, this will return an empty dict.
form_enc_parsed = urlparse.parse_qs(message_body)
if form_enc_parsed:
logger.debug('Request is form-encoded')
# This is a form-encoded POST. The value of the data attrib will
# be the body we're looking for.
try:
@ -153,14 +159,33 @@ def get_decompressed_message():
"No 'data' POST key/value found. Check your POST key "
"name for spelling, and make sure you're passing a value."
)
else:
# Uncompressed request. Bottle handles all of the parsing of the
# POST key/vals, or un-encoded body.
data_key = request.forms.get('data')
if data_key:
# This is a form-encoded POST. Support the silly people.
message_body = data_key
else:
logger.debug('Request is *NOT* form-encoded')
else:
logger.debug('Content-Encoding indicates *not* compressed...')
form_enc_parsed = urlparse.parse_qs(request.body.read())
if form_enc_parsed:
logger.debug('Request is form-encoded')
# Uncompressed request. Bottle handles all of the parsing of the
# POST key/vals, or un-encoded body.
data_key = request.forms.get('data')
if data_key:
logger.debug('form-encoded POST request detected...')
# This is a form-encoded POST. Support the silly people.
message_body = data_key
else:
raise MalformedUploadError(
"No 'data' POST key/value found. Check your POST key "
"name for spelling, and make sure you're passing a value."
)
else:
logger.debug('Plain POST request detected...')
# This is a non form-encoded POST body.
message_body = request.body.read()
@ -171,7 +196,7 @@ def parse_and_error_handle(data):
try:
parsed_message = simplejson.loads(data)
except (
MalformedUploadError, TypeError, ValueError
TypeError, ValueError
) as exc:
# Something bad happened. We know this will return at least a
# semi-useful error message, so do so.
@ -192,13 +217,14 @@ def parse_and_error_handle(data):
pass
response.status = 400
return 'FAIL: ' + str(exc)
return 'FAIL: JSON parsing: ' + str(exc)
# Here we check if an outdated schema has been passed
if parsed_message["$schemaRef"] in Settings.GATEWAY_OUTDATED_SCHEMAS:
response.status = '426 Upgrade Required' # Bottle (and underlying httplib) don't know this one
statsCollector.tally("outdated")
return "FAIL: The schema you have used is no longer supported. Please check for an updated version of your application."
return "FAIL: Outdated Schema: The schema you have used is no longer supported. Please check for an updated " \
"version of your application."
validationResults = validator.validate(parsed_message)
@ -239,7 +265,7 @@ def parse_and_error_handle(data):
response.status = 400
statsCollector.tally("invalid")
return "FAIL: " + str(validationResults.messages)
return "FAIL: Schema Validation: " + str(validationResults.messages)
@app.route('/upload/', method=['OPTIONS', 'POST'])
@ -268,14 +294,14 @@ def upload():
print('Logging of "gzip error" failed: %s' % (e.message))
pass
return exc.message
return 'FAIL: zlib.error: ' + exc.message
except MalformedUploadError as exc:
# They probably sent an encoded POST, but got the key/val wrong.
response.status = 400
logger.error("MalformedUploadError from %s: %s" % (get_remote_address(), exc.message))
return exc.message
return 'FAIL: Malformed Upload: ' + exc.message
statsCollector.tally("inbound")
return parse_and_error_handle(message_body)