Skip to content

firebase schema.md

FactorioBlueprints edited this page Jan 2, 2025 · 2 revisions

The easiest way to demonstrate the schema is to show real snippets of the database. Let's look at a nightly backup of the database.

cp /Volumes/Public/NAS/Factorio/facorio-blueprints-backups/2025-01-01T04:18:30Z_facorio-blueprints_data.json.gz .gunzip 2025-01-01T04:18:30Z_facorio-blueprints_data.json.gz

Firebase databases are a single enormous json document.

du -sh 2025-01-01T04:18:30Z_facorio-blueprints_data.json
1.5G	2025-01-01T04:18:30Z_facorio-blueprints_data.json

The database is too big to share in its entirety. First, let's filter the big collections in sample-entries.jq. We'll filter user data to just my user, "H3QlaVpvadfVuTpGGxs7016oR2K3". We'll filter blueprint data to just two of my blueprints, an old one at "-KYVL2qnlOpHomJAj-eB" which was created by uploading an image, and a newer one "-OAP4_bHqhbjQeqbPjxu" which was created with an Imgur url.

def take_sample_with_keys(keys):
  to_entries |
  map(select(.key as $k | keys | contains([$k]))) |
  unique_by(.key) |
  from_entries;

# Sample the first and last key of an object
def sample_nested:
  if type == "object" then
    to_entries |
    map(.value |= if type == "object" then sample_nested else . end) |
    .[:1] + .[-1:] |
    from_entries
  else
    .
  end;

.byTag |= map_values(sample_nested) |
.blueprints         |= take_sample_with_keys(["-KYVL2qnlOpHomJAj-eB", "-OAP4_bHqhbjQeqbPjxu"]) |
.blueprintSummaries |= take_sample_with_keys(["-KYVL2qnlOpHomJAj-eB", "-OAP4_bHqhbjQeqbPjxu"]) |
.blueprintsPrivate  |= take_sample_with_keys(["-KYVL2qnlOpHomJAj-eB", "-OAP4_bHqhbjQeqbPjxu"]) |
.thumbnails         |= take_sample_with_keys(["-KYVL2qnlOpHomJAj-eB", "-OAP4_bHqhbjQeqbPjxu"]) |
.users              |= take_sample_with_keys(["H3QlaVpvadfVuTpGGxs7016oR2K3"])

The actual blueprint data appears in the database. They are extremely long strings, so we'll truncate them so we can focus on the schema, in truncate.jq and truncate2.jq.

walk(
  if type == "object" then
    with_entries(
      if .key == "blueprintString" or .key == "thumbnail" then
        .value |= (
          if type == "string" then
            if length > 80 then
              .[0:80] + "...<truncated>"
            else
              .
            end
          else
            .
          end
        )
      else
        .
      end
    )
  else
    .
  end
)
.thumbnails |= with_entries(
  if .value | type == "string" and length > 80 then
    .value |= .[0:80] + "...<truncated>"
  else
    .
  end
)

The database includes two secrets, Imgur delete hashes and users' email addresses. Display names aren't really secret, but I'll avoid sharing them here. My display name isn't secret (Factorio Prints) and my email isn't secret (factorio.prints@gmail.com) but I'll consistently redact these fields using redact.jq to be safe.

walk(
  if type == "object" then
    with_entries(
      if .key == "deletehash" or .key == "email" or .key == "displayName" or .key == "providerDisplayName" then
        .value = "<redacted>"
      else
        .
      end
    )
  else
    .
  end
)

Let's apply the scripts to the database backup.

jq -f sample-entries.jq 2025-01-01T04:18:30Z_facorio-blueprints_data.json | jq -f truncate.jq | jq -f truncate2.jq | jq -f redact.jq > example.json

Now we can see the json schema:

{
  "blueprintSummaries": {
    "-KYVL2qnlOpHomJAj-eB": {
      "title": "☀️ MadZuri's Mk3 Solar Build",
      "imgurId": "RLRq4nd",
      "imgurType": "image/jpeg",
      "lastUpdatedDate": 1679692871101,
      "numberOfFavorites": 89,
      "height": 1728,
      "width": 1728
    },
    "-OAP4_bHqhbjQeqbPjxu": {
      "imgurId": "QbepqZa",
      "imgurType": "image/png",
      "lastUpdatedDate": 1732672006842,
      "numberOfFavorites": 3,
      "title": "Factorio 2.0 torture test"
    }
  },
  "blueprints": {
    "-KYVL2qnlOpHomJAj-eB": {
      "favorites": {
        "xeBFS9ETsPON41fzFuKhq1Zg9D33": true,
        "hQouHB4fCjZGA3npyyiW6MdGmfq2": true,
        "gikbOCGvWwY7hiFgsIoZrxMh4x93": true,
        "zuzzQ4UJUleX2sWuorCTBET66Tq1": true,
        "yEkV5AJi4TdlypuvUIb1yqbiznG3": true,
        "7pHjf9fy20XCQDf98Q7gmZMFeVX2": true,
        "TO9F2VuZSpNbC7CdnrdbGPm0d0r2": true,
        "NzinW3ImrSOidr50COVDjViOqUk2": true,
        "EuA0qrMegObNUi83yFVJllIgCAO2": true,
        "YZ79eCKXovfsxXD9fmNAuyd9mlc2": true,
        "0fGlHnZ5NJYZXl7YtKNGQGTjQAw2": true,
        "3iXo1kJA1uMmdAInrBJE5SbZbu93": true,
        "IsbhMPeVEKdruws7yqTZeHcMYV73": true,
        "PqrgHNLOm6c6v0xcTdZMtLMw3QE2": true,
        "9TBNroDEaIeRUNnVmHJhOymNvLy1": true,
        "VIjpHWltOIXviHbWTtgleef5yek2": true,
        "PhX25s1CD6VRwRZxRNqdd3anLAl2": true,
        "oDs7ZPRTUob2eeaRdBX2qXN9LGI2": true,
        "AvgfLfpEHASioDLs7N95kY0V12i1": true,
        "9O6qYAb980Qe3wE84Ig5CvmQDrI2": true,
        "vnZrg9gVKOVNggaZJ9TjIbjILzr2": true,
        "Mrz1YNBd8Gb8y9YnUCLBbK88LB93": true,
        "YS09FjZlfbdnQvQac5eFyaXMjyZ2": true,
        "FgXOManp7FNKzAnxETfZQcO4OWu2": true,
        "kX2ghFV7gAVebNBHRokcmXuNG6G2": true,
        "dnhUPoukvxWWLVQBm9TmNf1VlJv1": true
      },
      "image": {
        "deletehash": "<redacted>",
        "height": 1728,
        "id": "RLRq4nd",
        "type": "image/jpeg",
        "width": 1728
      },
      "lastUpdatedDate": 1679692871101,
      "numberOfFavorites": 89,
      "title": "☀️ MadZuri's Mk3 Solar Build",
      "descriptionMarkdown": "*Pretty* close to perfect ratios, tileable, 100% space efficient.\n\nYou can remove the roboports and replace them with accumulators to improve the ratio.",
      "imageUrl": "https://firebasestorage.googleapis.com/v0/b/facorio-blueprints.appspot.com/o/%E2%98%80%EF%B8%8F%20MadZuris%20Mk3%20Solar%20Build.png?alt=media&token=464ee572-f04d-4f34-ba9f-6c421c6525a4",
      "tags": {
        "3": "/version/0,15/",
        "0": "/power/solar/",
        "1": "/general/tileable/",
        "2": "/mods/vanilla/"
      },
      "author": {
        "userId": "H3QlaVpvadfVuTpGGxs7016oR2K3"
      },
      "authorId": "H3QlaVpvadfVuTpGGxs7016oR2K3",
      "blueprintString": "0eNqVnc1uG8sRhV/F4JoOpv97tMz+rrJLYASUTThEZFKgpItrXAjIG2SbR8nz5AXyCuGIlm1EdXrqWwk...<truncated>",
      "createdDate": 1481232629231,
      "fileName": "☀️ MadZuris Mk3 Solar Build.png"
    },
    "-OAP4_bHqhbjQeqbPjxu": {
      "author": {
        "userId": "H3QlaVpvadfVuTpGGxs7016oR2K3"
      },
      "authorId": "H3QlaVpvadfVuTpGGxs7016oR2K3",
      "blueprintString": "0eNrtfdmO48iV6K8QuriAPSO2uS+Fzgbs7gvMAGNPX7dncIEsXYGSQhKRFClzyay0kR/QfzEP9o/1l0w...<truncated>",
      "createdDate": 1730235750950,
      "descriptionMarkdown": "I'm using this blueprint as a test of factorioprints.com and factorio.school. I'll gradually add more features from 2.0 to make sure they all work ok.",
      "image": {
        "id": "QbepqZa",
        "type": "image/png"
      },
      "imageUrl": "https://imgur.com/QbepqZa",
      "lastUpdatedDate": 1732672006842,
      "numberOfFavorites": 3,
      "tags": {
        "0": "/version/2,0/"
      },
      "title": "Factorio 2.0 torture test",
      "favorites": {
        "ThmGKWuHFvRbykypnsGSTeRQIUm1": true,
        "Lt5dRUgbrHaYmGoeIN8K6e2ha3f2": true,
        "1LML7TCc7OeMr16aQJRbx2JTjwe2": true
      }
    }
  },
  "blueprintsPrivate": {
    "-KYVL2qnlOpHomJAj-eB": {
      "deletehash": "<redacted>",
      "imageUrl": "https://firebasestorage.googleapis.com/v0/b/facorio-blueprints.appspot.com/o/%E2%98%80%EF%B8%8F%20MadZuris%20Mk3%20Solar%20Build.png?alt=media&token=464ee572-f04d-4f34-ba9f-6c421c6525a4",
      "thumbnail": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIA...<truncated>"
    },
    "-OAP4_bHqhbjQeqbPjxu": {
      "imageUrl": "https://imgur.com/QbepqZa"
    }
  },
  "byTag": {
    "belt": {
      "balancer": {
        "-KZHkJVwXEomI2oYz0gR": true,
        "-OFOtM3JUtZ7aZ8Nm2hF": true
      },
      "transport belt (yellow)": {
        "-KdDy33xxo8bNcEuP7CR": true,
        "-OEtXccOmOWLFFgUbrno": true
      }
    },
    "circuit": {
      "indicator": {
        "-LMM2fE8dI21w8LWy0Ry": true,
        "-OF7Nb93Ip6jkg1v6FHu": true
      },
      "counter": {
        "-MRoH3Ym0GLAgOFJsa46": true,
        "-OF7Nb93Ip6jkg1v6FHu": true
      }
    },
    "combat": {
      "defense": {
        "-NpngVxBm0LTFvDv2N-e": true,
        "-OFECIbbNQlbS6o8TntG": true
      },
      "offense": {
        "-NrHhFEkVkbka0ZIg9Ks": true,
        "-OFECIbbNQlbS6o8TntG": true
      }
    },
    "general": {
      "art": {
        "-NT8xenoXR_guokVxzja": true,
        "-Nm399Ese4tJ6zjlI-Wx": true
      },
      "ups friendly": {
        "-LE-h4IHgdWBkSSmyuv0": true,
        "-OBNF7RfBZP9weZkQ5yT": true
      }
    },
    "moderation": {
      "add english translation": {
        "-Kn-3OCDShPOKF0Re2xB": true,
        "-NvxmZ_BKhKhFjr8dVhA": true
      },
      "duplicate": {
        "-OBWb8-6LnADEeCzE0aE": true
      }
    },
    "mods": {
      "5dim": {
        "-LXTfZxo2lMrWWuu8pn8": true,
        "-N11xOxWskpuLDXSEoSL": true
      },
      "warehousing": {
        "-LqXDjtoOn6ZvEf1oCbX": true,
        "-Ndc4iUgJ9kHRAzBP_Ot": true
      }
    },
    "planets": {
      "aquilo": {
        "-OACBs_9PZJoUwg0RGal": true,
        "-OFLE8CAd9PjPJ60YngA": true
      },
      "gleba": {
        "-OAGNIBmQFPe8mXMkOFg": true,
        "-OFQS_eVW_HP230tKefa": true
      }
    },
    "power": {
      "accumulator": {
        "-Klak7Q_4a5EBfRX_BB8": true,
        "-OFKpJLMAIR81L--j608": true
      },
      "steam": {
        "-KjKk9oQG6o-ZxbPIeNv": true,
        "-OEeFVyuLKZuwhKuXphl": true
      }
    },
    "production": {
      "advanced circuit (red)": {
        "-Kr1HRMdmtj5kAKr-SV7": true,
        "-OEoitoKC6UD6HquaY1O": true
      },
      "uranium": {
        "-Kvr99fYRBxry-knIX81": true,
        "-OEh-Q8iwm7XA2wm7vGt": true
      }
    },
    "train": {
      "crossing": {
        "-Lm1mSvdox91H7kPWYq0": true,
        "-OFKKrBxWlzQ03Mzp_q5": true
      },
      "unloading station": {
        "-Lrng9O17zeQCAn37dmf": true,
        "-OFSqY3dfkPr-JRP46UP": true
      }
    },
    "version": {
      "0,14": {
        "-KZHTgi4h1mNDTvBGf0E": true,
        "-NW_ZpIgWOqt5vXiUvfH": true
      },
      "unknown": {
        "-LVPiumb3bKwb174XeoE": true,
        "-ODcmeRnRRf3-TTVOZ0c": true
      }
    }
  },
  "moderators": {
    "H3QlaVpvadfVuTpGGxs7016oR2K3": true,
    "k9zbSt8hH4W5IKR5UnaKrPhEAVw2": true
  },
  "tags": {
    "belt": {
      "2": "tap",
      "3": "transport belt (yellow)",
      "4": "fast transport belt (red)",
      "5": "express transport belt (blue)",
      "0": "balancer",
      "1": "prioritizer"
    },
    "power": {
      "0": "nuclear",
      "1": "kovarex enrichment",
      "2": "solar",
      "3": "steam",
      "4": "accumulator"
    },
    "train": {
      "4": "roundabout",
      "5": "crossing",
      "6": "stacker",
      "7": "track",
      "9": "right-hand-drive",
      "0": "loading station",
      "1": "unloading station",
      "2": "pax",
      "3": "junction",
      "8": "left-hand-drive"
    },
    "mods": {
      "6": "other",
      "10": "5dim",
      "1": "bobs",
      "4": "warehousing",
      "5": "lighted-electric-poles",
      "11": "seablock",
      "13": "krastorio",
      "14": "transport drones",
      "0": "angels",
      "8": "ltn",
      "9": "aai",
      "2": "creative",
      "3": "factorissimo",
      "7": "vanilla",
      "12": "industrial revolution",
      "15": "space-exploration",
      "16": "space-age",
      "17": "quality",
      "18": "elevated-rails"
    },
    "production": {
      "10": "smelting",
      "14": "modules",
      "15": "mall (make everything)",
      "17": "guns and ammo",
      "19": "other",
      "0": "oil processing",
      "1": "coal liquification",
      "6": "rocket parts",
      "7": "science",
      "11": "mining",
      "16": "inserters",
      "21": "logistic (bot) based",
      "3": "advanced circuit (red)",
      "5": "batteries",
      "18": "robots",
      "4": "processing unit (blue)",
      "12": "uranium",
      "9": "belts",
      "13": "plastic",
      "20": "belt based",
      "2": "electronic circuit (green)",
      "8": "research (labs)",
      "22": "scrap processing"
    },
    "version": {
      "3": "unknown",
      "4": "0,17",
      "5": "0,18",
      "6": "1,0",
      "0": "0,14",
      "1": "0,15",
      "2": "0,16",
      "7": "1,1",
      "8": "2,0"
    },
    "circuit": {
      "0": "indicator",
      "1": "counter"
    },
    "general": {
      "0": "early game",
      "5": "compact",
      "6": "marathon",
      "7": "storage",
      "1": "mid game",
      "2": "late game (megabase)",
      "3": "beaconized",
      "4": "tileable",
      "8": "chunk aligned",
      "9": "ups friendly",
      "10": "art",
      "11": "scenario"
    },
    "moderation": {
      "0": "scheduled for deletion",
      "1": "screenshot missing alt info",
      "2": "uncropped screenshot",
      "3": "add english translation",
      "4": "duplicate"
    },
    "combat": {
      "0": "offense",
      "1": "defense"
    },
    "planets": {
      "0": "nauvis",
      "1": "gleba",
      "2": "fulgora",
      "3": "vulcanus",
      "4": "aquilo",
      "5": "space-platform"
    }
  },
  "thumbnails": {
    "-KYVL2qnlOpHomJAj-eB": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIA...<truncated>"
  },
  "users": {
    "H3QlaVpvadfVuTpGGxs7016oR2K3": {
      "favorites": {
        "-LZY1wBZZ_C8xGihqShH": true,
        "-KirzcTXTs8F0kmF97t3": true,
        "-Kom7vIXGFDk6OnGnxwc": true,
        "-LFIJt4xoswm3w3v2Uie": true,
        "-LHU3_dQxXvciLmAsayo": true,
        "-LZrA2MkOQYKw5Wklea4": true,
        "-MEbTqQQ7og2aoLNB9NY": true,
        "-KZIxbfGGbAU8gsAComj": true,
        "-KqL01NxGMeXG-5OtMwm": true,
        "-Kp6eLXuhwCqXBXr0ltW": true,
        "-Lg_tDuWgrU-EcagIUNV": true,
        "-LbP47CtKAiwauLskTo2": true,
        "-KpX1-lyYhE-3-DfxTba": true,
        "-Kv8rBZzEyPORtZh4nz4": true,
        "-L5biXRj9KWhGWykcGCd": true,
        "-L9i5YbpIL2sBKskFH6b": true,
        "-LWY-DinCSVmp1fy3OVa": true,
        "-MSxZBtxc29rg0OfAtxl": true,
        "-Kj2j-yx09kZtQs9VRk4": true,
        "-KkH7gQIEcuri6zZBl_x": true,
        "-LACl7rLp9aPqXAv_dQ6": true,
        "-LIFZsL0KQWRA-kxiCYq": true,
        "-LJOW5psPU7up0e70tH6": true,
        "-KoltGTOcRBjmz4tieoA": true,
        "-LTBbTA9DZBtWaWGcHIl": true,
        "-KYpTULTDIvDOsJfgjeS": true,
        "-KkqSHSzoglhvgRVfwkM": true,
        "-L1loYqb9chYad0ckXTq": true,
        "-LJxNEq5fc_XxobQk9ZW": true,
        "-M11Z7Srp7y981iVrebS": true,
        "-KjJ5UZV4h2cHSIUU0pF": true,
        "-Km1lkj01tpm3xAupmp_": true,
        "-MFIYLSH60wmZ-pNvcL_": true,
        "-LQ-CPuQp6mSlb07bsjR": true,
        "-Ku9vWt1ziiuxYUGBKTl": true,
        "-LHJv0mq3EuAoeWPyXz8": true,
        "-LhfYgob1FIcIvTKNUtC": true,
        "-KjYrExrE7G37qFgncRJ": true,
        "-KvBxFfq4ocbn4G6moB6": true,
        "-LBmXdOjVpK1gtDRK85T": true,
        "-LmtG8BAsNkbjqH5F5h-": true,
        "-LrFllkfPIG1IAjKRIF5": true,
        "-KkcSxXO4Frc0CMCV_kL": true,
        "-KnQ865j-qQ21WoUPbd3": true,
        "-LaIPNgh8f16V8EwXXpW": true,
        "-KpbH6bzIae1s5eo0g3s": true,
        "-L0AA-VH9GlXbgWAffhU": true,
        "-LbVEPJboC3QkYCKDU8F": true,
        "-Kj93r_vJv1WfD1SIOfU": true,
        "-KjcT8FkYRMzsnu9Qguq": true,
        "-LJ4t3Mo_wos0_pauYnU": true,
        "-MNbT33juix3PWHJ44Ks": true,
        "-LGlgiF7mtzxe_WqOH4K": true,
        "-KadypAjwMoeyBCRPsWY": true,
        "-Kiv3NhwBH4fE2mAx-6q": true,
        "-KoqizrS1hTxeWQP9JKD": true,
        "-LJ1yGYd0Rex-FPTqnnk": true,
        "-LYcavglsqwjxJARy_nK": true,
        "-KjYTvoB1LYe4F470yhz": true,
        "-KkCImFv4o1c-Z-1QCaK": true,
        "-KkulJJaar31G61YdqUQ": true,
        "-L9sMnI9prR83xg54NjG": true,
        "-MSe6VJ_slR1BSgsLvF6": true,
        "-LQbassgmiwkqEVfS0Vf": true,
        "-L5LF1_hgqswJ7ZKsJyk": true,
        "-LcJg0b8cfoioyLPANQ6": true,
        "-LfpQ63zCDlI03H8sH8_": true,
        "-KqEl1liCIOhZty7TTfl": true,
        "-Kr1N0HkhWzgP6P6pxku": true,
        "-LzxvgM4eHDdjm6KSvnl": true,
        "-Kkum-Ibmu5-R7ULTAFz": true,
        "-KpX1djs7n5xYzmeAytv": true,
        "-MNbVD0oWaDgT8HUvNjT": true,
        "-Kp0qDX-EMl5TqgFAPVN": true,
        "-LJ2A1S7ciqdngYf-HnR": true,
        "-Kp6dNEnTZ7BaQaY42iU": true,
        "-KpxUat4ZrpUWPS69u4Z": true,
        "-Lffm8_s911-lrQLT3tM": true,
        "-K_Me61B1oQ_Dmjbde9B": true,
        "-KjEMCewunRtmK5dCvyT": true,
        "-KjJ6MvDSt-GWrthi9Z4": true,
        "-KjYAnqi971rVjBFIJMg": true,
        "-LaQE4ZclSJZGlRf9sq0": true,
        "-KjZ0Rk_VXbdnxJ9jmUj": true,
        "-Km1lMqoXMRF3SBtTIwR": true,
        "-LGE-iYK15_699MGsTdL": true,
        "-MNOoFMI54rZbF9xrBxB": true,
        "-Kp6dxRcQbpr7UrzJC6x": true,
        "-MRwUZfJmz4ei1bGaGD-": true,
        "-MEwX_Kkwe_x3j6vk7ve": true,
        "-KYg56ks0BIqpNvpIHFm": true,
        "-LG6lG4ros7_dUCGICUW": true,
        "-Lb-tJDy1OPcbJg461j0": true,
        "-LwQwRpItPyExs--nj6p": true,
        "-Kl_20pb9-jOGrDYzibk": true,
        "-Kroion4ELi9I7EiJ9XC": true,
        "-LYc_FNSdjQppvTjdc5K": true,
        "-L3VemzAMbGPtLOvKClr": true,
        "-LXKpp9bZjQA2f2HjAjU": true,
        "-LeToocfxpYPF4lubetX": true,
        "-M2u_Tr8kYSjKBG8uxfN": true,
        "-Kh2AuoZIjaPjde1Ir8E": true,
        "-KkpBR-fJ3nVtzBNAokY": true,
        "-KmItumMrZRnXq4d0_54": true,
        "-KoqgcmWqjJGLf6csjL4": true,
        "-LE0_ttF6cJPoiFi5l6u": true,
        "-K_jADWYOzVoz7tNRFf0": true,
        "-LDlQMrud7HVDYIkCLNK": true,
        "-KchGba0-3T6MfY8DPBX": true,
        "-Kq5f2hya_bo88b_gSw0": true,
        "-Ku29XkaYu1utbw82kaK": true,
        "-LlwTbS7OPiK6bqkp2KW": true,
        "-LwQzxkjNldW5RF7Z-jW": true,
        "-KZGMoiKxO8HsEngq0B7": true,
        "-KokIkNBIAQqMufVlmsh": true,
        "-LOAVA6Unf_1BxVkbbSk": true,
        "-L1vgQ0fBiOlX8RJTvBx": true,
        "-LX0DrUrauJqH8cVAq6A": true,
        "-LaBW5bbDMIhZqd8-HDT": true,
        "-Kgi16PP8mnB_XcUO0Kv": true,
        "-LK11Ia95Ae5ETlQ0UvR": true,
        "-KpogKKQfbmOMH2yBmfu": true,
        "-L_8DyIV76Y2r4WELfly": true,
        "-L_iwM-JoVx_qQcBP8xZ": true,
        "-LibYRx___wDOSUO32wl": true,
        "-LDCTy1HOtQwp7eQVPFP": true,
        "-MNtMBLHG4FgqkdvmxPL": true,
        "-KabXCwKQ7Dd-xz_G5fv": true,
        "-Kp6n2r3DU3cHiwngJaf": true,
        "-Ku5n4tLfmkZN8twwx-k": true,
        "-Kv98Ua8jl-tzglA7cp6": true,
        "-L0YeuRvGzI2Msir-scF": true,
        "-KYpWpPzU2MW56wDabTt": true,
        "-KpqsLxKjSE-l6QOuQCP": true,
        "-L-AH-1ky1OVEvqy8_ti": true,
        "-Lb-ZMZd1sQ3iy1_vKdl": true,
        "-KYeNAYQVgk2DcbuORde": true,
        "-KYpSfx8hRix5nVPBLwS": true,
        "-KlhUi32p9g-WK-ABDKB": true,
        "-KrAnxu3fGvSLy71To1V": true,
        "-LKXklpxxqUmd52D4bW5": true,
        "-KZHT0kmt-nElk2jnBoZ": true,
        "-Kae4b16Zd0Dz-qyBwzo": true,
        "-Km3O-6daMY2OZru9ipg": true,
        "-LI0gc-a-2_VLWR-tx1d": true,
        "-KvBwAqpMt6Lx3DZS-lU": true,
        "-KkGzYI8tNoP3FGung5J": true,
        "-KoqhnFNxKU7FZqEi79w": true,
        "-LbQ7q3QRGqrkJpNgH0-": true,
        "-L__rz-kvFeoJr6KsnHh": true,
        "-Lnlz97OfIxXawtlNJoi": true,
        "-KuGj0uUTKl8VpIau-_l": true,
        "-LKIZarSTTZaO1_YpKXw": true,
        "-KjmRXj1uY-0VKIPzJuB": true,
        "-Kjcg1sW24lC-juNOFE4": true,
        "-L9ULAOB2MrsHEaFuMot": true,
        "-KipClGfrJ9Bntuimft_": true,
        "-Kithz64hpglt1c8E13L": true,
        "-Ko4Un71BhDDTUvorRv5": true,
        "-LpN6Yp2O9qB2vNzoR4R": true,
        "-MBR5HNT3t0HZUKTxAiN": true,
        "-LdMNzyMJ55lfVUMupmP": true,
        "-KaN1pFBYXqMIJd32qal": true,
        "-KjnB9gSKdPC3cu4Xvjj": true,
        "-KpR9g5xwpke0jOV4pQ1": true,
        "-Kr03fSKDQqr6dK3e7xU": true,
        "-KmIMtB_eb-yw1cPHqpn": true,
        "-LZpCwcZo6mMnV7TZdG1": true,
        "-LbVFfKRqneY24dTj7aT": true,
        "-KmBhjHu957siliKWFy7": true,
        "-Kmgi76ZPE3g7nWt2lTU": true,
        "-LHxJpPuyYEXqhfxW40f": true,
        "-LJ0TJHYi0M-6udXlI-S": true,
        "-KjELJNoIpt6pewqi-Fz": true,
        "-L1UzzYrh9DHh7iL5mGn": true,
        "-L9sLuHUYlFdANTKZKfZ": true,
        "-L55NOZFkwWJHjCSGovS": true,
        "-MFZBYU1KbCFxdypbKmX": true,
        "-KjZIX7kOZQkjNigDi9o": true,
        "-LXatze8crbgeIP9kvNR": true,
        "-K_lJ5MpCw1gwNCBYugG": true,
        "-Kk8AGN4T4jNhFHDORpL": true,
        "-LaWb28Xc7IXJDmoSB81": true,
        "-Klak7Q_4a5EBfRX_BB8": true,
        "-Kr7zJE8fm_kUM2LzXY7": true,
        "-L1S7lorEClmf_q7_Hzi": true,
        "-LGXhoki0ySlElw1H62N": true,
        "-LW6jFklIvbTruKnJHmJ": true,
        "-LE6iD_E5eUUyd9LJf14": true,
        "-LXbIUFG7ube0oKnTPVM": true,
        "-L_AkQ1EHHr7M_x4BuPj": true,
        "-Lmttv4WdqMMuy8HaAg7": true,
        "-MFCJEOVr6WTuc4sL6Vc": true,
        "-KdBoBGOUEls9y-GN1LW": true,
        "-KkfdBfOpOJ3Ty-mA5bR": true,
        "-MNtOC6qw78QmK3-SPkK": true,
        "-Knx4_Nx8mZgbZQfmcdQ": true,
        "-LBQ4DJAJ_5aPtIdnm57": true,
        "-LE2dRmBW6JxdhmmMRf2": true,
        "-MSJtnaSWVU456zeFvtJ": true,
        "-KrA8pZ_IlObQRuTeXYQ": true,
        "-LECiLPF2thrl9ujXDSq": true,
        "-Laacl_XwFQzxFuJy50E": true,
        "-L1e7dhrf6BWHXBmCOxm": true,
        "-LAmDZ6Mt-usgxGnIxOd": true,
        "-L7RYGSpZU_hnqxK4TjB": true,
        "-MMBcsdsl3_dnhtr4mle": true,
        "-LZqEY3DcOLBx_kiyjim": true,
        "-KkfMB9sDjnYEVv2A7h7": true,
        "-LV4ZJpfgpKKUkyodKiz": true,
        "-KkOMhxwVGemt2uQNpXe": true,
        "-M4L50cK-zVXr8QEV4qA": true,
        "-L8EWC3eaQfu76kF1K4Y": true,
        "-LFSB1nQpv_RiVtP3pMb": true,
        "-LJ-4mFkMBF1eUEhMJPp": true,
        "-MV9haXkg0dbrvFU_kKk": true,
        "-MXf9AqWz0wZ3sS4bF_J": true,
        "-LptRp-aqaW9qqHGzR5k": true,
        "-ML5RsMXhj7tnbbzs02H": true,
        "-M8N1Tl2UoXTE4xKY_6_": true,
        "-Mma-ITJcS2X3STQ22RP": true,
        "-MK-xIWwMHTIBuSh3ZWQ": true,
        "-N1ia5uWUT016PqBaS4P": true,
        "-LRJE1kgeesiD8Djqa4C": true,
        "-L2y6VQhM7NWukPtSsPv": true,
        "-Ld_Aek4jcDsbn8TV7GK": true,
        "-LmX7Wv397nenI_lILBD": true,
        "-LGHi7ojCPQofDsZb7Ug": true,
        "-N2J4MgVL8BCqhkUu38e": true,
        "-NDtdz_T0qZyfhMdUvMa": true,
        "-NEr0AlVdJxZoB7mY4l9": true,
        "-NGufMbXDeP2dBjr_lrk": true,
        "-Lr1EMRsMFcK4N-Im6Df": true,
        "-LsNsm3bPG3I5y9i56It": true,
        "-MKjG_WGMofYRTjqKl97": true,
        "-MLEBkcCkOPK0I7GcNLG": true,
        "-N5-s6MKiBr9g9oH8Qsv": true,
        "-LdLRLLGp5Y2ifQLQ8CN": true,
        "-LccPo-ppxTLIbu30I0F": true,
        "-NJG040KiPTvS3fE-Zwc": true,
        "-N1-ekMYWx_pPmZepQep": true,
        "-NMgI94UsnreeRwEvuUo": true,
        "-NOcjb9JM9wfyKeerIgk": true,
        "-L5F2qiGFzcnPhWeSDtn": true,
        "-Ktb4reYTE5yDa34BXBo": true,
        "-Lhn8AjBro01pcrdmbIC": true,
        "-NQ9T9T2FqhD_1VSRJl7": true,
        "-MU7mFF7E6QeTOGUndIG": true,
        "-Ln7bpxs1Mmtyv9yx8x5": true,
        "-MKMaZ2MpCYf7tMYFKMZ": true,
        "-LPg7BaSAJw7kbK7DAln": true,
        "-NR7KN5IimmaWpnjjVc-": true,
        "-Lf0b4uUCaZIl5TQBiAa": true,
        "-Lf0ahHeoyGQ2-voUJSG": true,
        "-Lf0bYTLhXmCtdpZsns4": true,
        "-Lf0c35FRXPtxyau6-Mf": true,
        "-L54aOI7dNzQ9fB_R1kR": true,
        "-LgzY48u8PEe8_dxU6Sa": true,
        "-NTANIDclxj6058Fium7": true,
        "-NRM0ayUKI-90JBEzCqc": true,
        "-LZctOX7lLwO8Rcn9IoC": true,
        "-LEC_ATSTbwMEneZeHNM": true,
        "-L8zcLKIaAbt3nihmij5": true,
        "-LZclMpbadvz8P5MxpWr": true,
        "-NfTYT_f1XATK_h5dfoz": true,
        "-O062S829UXeMk5vw-7W": true,
        "-NbpwV60x70HXqjwugHG": true,
        "-L_03eJDny3Oir_K2sv-": true,
        "-L1Cr41JsxbtqjTv6I7I": true,
        "-NNSIeDYbMJy_6DaibB2": true,
        "-O9l7m997ViJR_obxBXK": true,
        "-O9VOykV4CirECeCrQdq": true,
        "-O9VRJfQs93GnPuihM2B": true,
        "-LvWjwX1U25krBg-auKR": true,
        "-OA-H3adh7Q6zhzjbkvY": true,
        "-OA-LyAyRffo4a6lBXZ0": true,
        "-O9upp8CftLA0vajZgd2": true,
        "-O9x_8xI0Y9Mw1K-gWO3": true,
        "-O9yCmrj3r1RDXJz_NZv": true,
        "-OA2ysn1JLKUs32syS-O": true,
        "-OA2Y5wpGsBswVdLFBeS": true,
        "-OA7UgYKDG0HgpZru3xh": true,
        "-O9ol48Km8FeH3RkiEaZ": true,
        "-OA7TpLENioalciKNOTr": true,
        "-OACMOxFVPfSe7wZiV8G": true,
        "-OAB9SWlPpyTTWRrYlUZ": true,
        "-OAE_oEuS98AHKOD96zB": true,
        "-OAE5NQQkYDUMGovt5dd": true,
        "-OADS3jVt4MVBPN_xUs4": true,
        "-OAFwU6UNn-uhBY5JJkX": true,
        "-OAJv3BH3qChqUg0MJVi": true,
        "-OA8A9ML7FEWLrhaRE7t": true,
        "-OA49nAXMWrCxr1c5vIC": true,
        "-OA7pqw3IABaT1GuOsxp": true,
        "-OAFK7WWabOEfuCxkmug": true,
        "-M5PZvxZVXEZnmg4V7Hy": true,
        "-MJURcCFL-9L_cbihLys": true,
        "-O9tU00H1GqEfUehDZYW": true,
        "-LZ32cSNYn9_J1PHsVMa": true,
        "-MWtHkD-2ATJdVx5KgsN": true,
        "-OAA94aHsDaXcxqAAjKo": true,
        "-OAFyMVCQy1ZxVYH0vhN": true,
        "-OAT0pighcqh0MWqS9ny": true,
        "-OAXAPwWWZylCArXeA-S": true,
        "-OAW4J9BVnfQ9GnARy4m": true,
        "-MoyXC9fdcm8DigXIT33": true,
        "-OAeo-Q2LnwdtJrP2CMv": true,
        "-OAruo0yj-8JqCELlRTu": true,
        "-OAfTiV5p_5PSV_OrSWA": true,
        "-OAwBPY2d5ZjI26Twlfy": true,
        "-OAtv61-UolIn_C4Q9Ci": true,
        "-OA2UzaNshgrFm_0XU7g": true,
        "-OAoImOGxX3WGQDm0ox9": true,
        "-OBA6ev5gbJk1lGhsmxA": true,
        "-OAdOX4kckC-NitbpBrr": true,
        "-OBHkOJjppimm2tcUE0r": true,
        "-OAdPDSbwdUI3zIuvUze": true,
        "-NDrsfTDeKR_hZ1k_-QF": true,
        "-OA9_M7J8ilsB47DRsDs": true,
        "-OBOWAb7an5T8ak9Gd3m": true,
        "-OAjOz4bGjyJdIo5eMRl": true,
        "-OBNNkKwGZfO0BX89sDo": true,
        "-OBM-LoRxzZKXi8dvphv": true,
        "-OBU-bOGO7Yi5uAWlAKj": true,
        "-OAOEo9pdmReRKP3Njyi": true,
        "-MAVC7F30j19kLOh4cwO": true,
        "-OBUHJnkshGV3rGETQZk": true,
        "-OBrcQdLsOJHRw-kxLJF": true,
        "-OBH8naTGfDlmsNRjxfZ": true,
        "-OBm2OMax-6NqrqVUBE_": true,
        "-OC-_UpszTAgkyjWkGIS": true,
        "-OBdq3vJ2slIWEDAXEeM": true,
        "-OAjxHVkwRp6DeQBzEeX": true,
        "-OC5u5DqXGeUOiO_SCrd": true,
        "-OB5KXE-d0y05K7L1Wt1": true,
        "-OBAyDy9PnXey5SMeUra": true,
        "-OB_iNUWGUZLHb8sm9ko": true,
        "-OAnZodIYZhf7N57SdpC": true,
        "-OAYRP4w8X9aG0LlslMV": true,
        "-OCKKQl_DmLTGpEgXORM": true,
        "-OCcmXigH7iua8lnEYuZ": true,
        "-OBYG-xv8_P81wBwG_pA": true,
        "-OCWFa772lH2KKUPq9qi": true,
        "-OCVzXHfoRwqzUj2g0cV": true,
        "-OBglj-IqaWEXKZEgA4g": true,
        "-OCk44SfT2n9IqnPfnmi": true,
        "-OCh5sRoZLTRfE0sVA0d": true,
        "-OCacSzYrhKA-lagb7jl": true,
        "-OCrUAy32fm7tM8w37Bs": true,
        "-OAlyskVrmzN9CWRFNv2": true,
        "-OCA_rLhEF-peJ7-ISpY": true,
        "-OCwwCDnl1W1Q3Vj6Cm2": true,
        "-OCDxgDZJm3Wq6ADTIrG": true,
        "-OBuERtPdm2_2an2RSMS": true,
        "-MIMpsZJa9WHxI4H6fcD": true,
        "-OAkeD2ofZOoG-2_byXQ": true,
        "-ODYO1sZAXRHLTyo01z1": true,
        "-OAgszIIxPPz7M7Zi5VE": true,
        "-OAct8HtnIjPl4-g26BR": true,
        "-OAmQQiFRuJmuxVgLy2C": true,
        "-OC8iUzZFEyI1IOocz8a": true,
        "-OA_9g0_glVrDzTqT3WK": true,
        "-Kn2afLokZdBO-uHcIAF": true,
        "-ODmnuKrSPxwGcHXuDYH": true,
        "-OAYkVuqnDwsgcEQ2ck0": true,
        "-Ncb1TvRoj5Wfz4RCqOn": true,
        "-OECgBiW3CEFkjs9-41E": true,
        "-OEouOFoD9FjBzspii-9": true
      },
      "photoURL": "https://lh3.googleusercontent.com/-XdUIqdMkCWA/AAAAAAAAAAI/AAAAAAAAAAA/4252rscbv5M/photo.jpg",
      "providerDisplayName": "<redacted>",
      "providerId": "google.com",
      "blueprints": {
        "-KjYZeRSDZ5gJrR46RYy": true,
        "-Kl-j3TSb1wV9zvr66LY": true,
        "-Kue-bWps_dyCmxGyhBn": true,
        "-Kifx85ww99ZWLB-n-9S": true,
        "-KufOvAr2WaVc-mVmEn5": true,
        "-LZgUrroDctm4vZtwq71": true,
        "-Kn1XhlDX1I162XfhLxL": true,
        "-Kudx5-85B_iov8YoAgL": true,
        "-LZgSIRO1ZZO3AiT3dYi": true,
        "-MEs0OccaAQ61Acfr9qT": true,
        "-K_VpUtsGAlQeBuZ1oez": true,
        "-Kl-UBR-bwCP_K3qFXzf": true,
        "-Kl-a5-7hM9UdJQEYzjU": true,
        "-Kl-NTpuTXPVfk0N0EMo": true,
        "-KueBFbovf7EpMFUr3g0": true,
        "-KietyiL1H-mqf01qnxZ": true,
        "-KjJ3CtQJvF3lWYrJTXV": true,
        "-KjYZyOEXtpW0OyjrC0D": true,
        "-KufLIo2-ljdVW6E68eK": true,
        "-KYVL2qnlOpHomJAj-eB": true,
        "-KihRz97l2eDN-av-BXC": true,
        "-KiowDcfTg5Tl9Yj-5wl": true,
        "-KududYggxC00_tYS0ku": true,
        "-KudzGB86nFE7YTo2Mag": true,
        "-MSB8Z0GY_AJjqbUQiKY": true,
        "-KioxPCe3zEvkTMzU2KN": true,
        "-KjNkrxQS1mrYCg1bE0N": true,
        "-KjUiaibx5dJBC9svbMy": true,
        "-Kj8bHstSx0LnWi6rqhU": true,
        "-KjmZa8RznafImLVCmO1": true,
        "-Kl-cSRdWCenc8Q3Qqv4": true,
        "-L3VpEZ2-nV5Adh0Qbh1": true,
        "-KY_A4qxNbkiBv1yNPI5": true,
        "-KY_BySvaQCx8DR0S_NZ": true,
        "-K_Vev0GbQVyAe0fteYU": true,
        "-LL7qyWtXdVlRPe-Sv2-": true,
        "-NR5CebXEP_hJ8qeNN8u": true,
        "-NR69PrlC-fp-d-mapq4": true,
        "-NRFOPCYzuyttD_OG1sL": true,
        "-NRM0ayUKI-90JBEzCqc": true,
        "-NRxAdnG9stXsbD-mOVr": true,
        "-NY9FWK1C0riHZ5o0Qjz": true,
        "-NYALE_zTYegah8amu0h": true,
        "-NYAV8n19qoJJIRaAbxD": true,
        "-NYAW4t62KK1uRHCvkk2": true,
        "-NvvuG0zAgn98B6AUuMY": true,
        "-Nvw-FiNomMz2HyY8JiH": true,
        "-NvxHKMpv7esFo3hrG10": true,
        "-OA7pqw3IABaT1GuOsxp": true,
        "-OAP4_bHqhbjQeqbPjxu": true,
        "-OBQPM5IcEur_OTfkIv6": true,
        "-OBRge22JrbTOc11WuyJ": true,
        "-OBVcew0RCgurKXn6PhR": true,
        "-OBkfGanhIWhlp69X0k8": true,
        "-OCTfI_EKeIvtTZ6CjDX": true,
        "-OCTmhGxA7X-ILIW5Xwt": true,
        "-OFNGP9uf5GiQuxfyVKV": true,
        "-OFODk8NwP-_J18h-alx": true
      },
      "displayName": "<redacted>",
      "email": "<redacted>",
      "emailVerified": true
    }
  }
}

Clone this wiki locally