├── README.md
├── Test.ipynb
├── keystroke-flow
├── keystroke_flow_diagram.html
├── keystroke_flow.py
└── sankey.js
├── alexa_todos_parser.py
├── dissecting_snowflakes.py
└── browser-structures
└── all_edge_profiles.json
/README.md:
--------------------------------------------------------------------------------
1 | # dfir.blog Scripts
2 | Small scripts and POCs related to digital forensics
3 |
--------------------------------------------------------------------------------
/Test.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "Untitled0.ipynb",
7 | "version": "0.3.2",
8 | "provenance": [],
9 | "include_colab_link": true
10 | },
11 | "kernelspec": {
12 | "name": "python3",
13 | "display_name": "Python 3"
14 | }
15 | },
16 | "cells": [
17 | {
18 | "cell_type": "markdown",
19 | "metadata": {
20 | "id": "view-in-github",
21 | "colab_type": "text"
22 | },
23 | "source": [
24 | ""
25 | ]
26 | },
27 | {
28 | "metadata": {
29 | "id": "Yjl1B7yLOyPf",
30 | "colab_type": "code",
31 | "colab": {}
32 | },
33 | "cell_type": "code",
34 | "source": [
35 | "import pandas as pd"
36 | ],
37 | "execution_count": 0,
38 | "outputs": []
39 | },
40 | {
41 | "metadata": {
42 | "id": "JXP6qd7CPBfu",
43 | "colab_type": "text"
44 | },
45 | "cell_type": "markdown",
46 | "source": [
47 | "## Test 1234\n",
48 | "Test test test"
49 | ]
50 | },
51 | {
52 | "metadata": {
53 | "id": "TR7GbtotPFYe",
54 | "colab_type": "code",
55 | "colab": {
56 | "base_uri": "https://localhost:8080/",
57 | "height": 108
58 | },
59 | "outputId": "391e403f-ba12-40cc-ec36-2d0e728e6673"
60 | },
61 | "cell_type": "code",
62 | "source": [
63 | "for i in range(5):\n",
64 | " print(i)"
65 | ],
66 | "execution_count": 4,
67 | "outputs": [
68 | {
69 | "output_type": "stream",
70 | "text": [
71 | "0\n",
72 | "1\n",
73 | "2\n",
74 | "3\n",
75 | "4\n"
76 | ],
77 | "name": "stdout"
78 | }
79 | ]
80 | }
81 | ]
82 | }
--------------------------------------------------------------------------------
/keystroke-flow/keystroke_flow_diagram.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
This Sankey chart was created from a "Network Action Predictor" database from a Google Chrome (or other Chromium-based browser) user profile.
36 |38 | 39 | 40 | 41 | 153 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /alexa_todos_parser.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | import json 3 | import xlsxwriter 4 | import sys 5 | import datetime 6 | import time 7 | 8 | 9 | def to_human_timestamp(timestamp): 10 | if timestamp: 11 | new_timestamp = datetime.datetime.utcfromtimestamp(float(timestamp) / 1000) 12 | return new_timestamp.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] 13 | else: 14 | return "" 15 | 16 | print("="*78) 17 | print("| {:^74} |".format("Alexa To-Dos Parser v0.1")) 18 | print("="*78) 19 | 20 | if len(sys.argv) < 2: 21 | print("Usage: alexa_todos_parser.py LocalData.sqlite") 22 | sys.exit(0) 23 | 24 | if len(sys.argv) >= [2]: 25 | output = sys.argv[2] 26 | else: 27 | output = "Alexa To-Do List Items ({})".format(time.strftime('%Y-%m-%dT%H-%M-%S')) 28 | 29 | local_data_path = sys.argv[1] 30 | print("\n * Reading data from {}\n".format(sys.argv[1])) 31 | 32 | workbook = xlsxwriter.Workbook("{}.xlsx".format(output)) 33 | w = workbook.add_worksheet('Items') 34 | 35 | # Define cell formats 36 | title_header_format = workbook.add_format({'font_color': 'white', 'bg_color': 'gray', 'bold': 'true'}) 37 | header_format = workbook.add_format({'font_color': 'black', 'bg_color': 'gray', 'bold': 'true'}) 38 | black_type_format = workbook.add_format({'font_color': 'black', 'align': 'left'}) 39 | black_date_format = workbook.add_format({'font_color': 'black', 'num_format': 'yyyy-mm-dd hh:mm:ss.000'}) 40 | 41 | # Title bar 42 | w.merge_range('A1:M1', "Alexa To-Do List Items", title_header_format) 43 | 44 | # Write column headers 45 | w.write(1, 0, "Item", header_format) 46 | w.write(1, 1, "nBestItems", header_format) 47 | w.write(1, 2, "Complete", header_format) 48 | w.write(1, 3, "Deleted", header_format) 49 | w.write(1, 4, "Type", header_format) 50 | w.write(1, 5, "Created Date", header_format) 51 | w.write(1, 6, "Last Updated Date", header_format) 52 | w.write(1, 7, "Last Local Updated Date", header_format) 53 | w.write(1, 8, "Reminder Time", header_format) 54 | w.write(1, 9, "Item ID", header_format) 55 | w.write(1, 10, "Customer ID", header_format) 56 | w.write(1, 11, "Utterance ID", header_format) 57 | w.write(1, 12, "Original Audio ID", header_format) 58 | 59 | # Set column widths 60 | w.set_column('A:A', 32) 61 | w.set_column('B:B', 40) 62 | w.set_column('C:C', 12) 63 | w.set_column('D:D', 12) 64 | w.set_column('E:E', 16) 65 | w.set_column('F:F', 22) 66 | w.set_column('G:G', 22) 67 | w.set_column('H:H', 22) 68 | w.set_column('I:I', 22) 69 | w.set_column('J:J', 56) 70 | w.set_column('K:K', 18) 71 | w.set_column('L:L', 22) 72 | w.set_column('M:M', 108) 73 | 74 | local_data_db = sqlite3.connect(local_data_path) 75 | local_data_db.row_factory = sqlite3.Row 76 | 77 | row_number = 2 78 | 79 | display_row_format = "| {:<36} | {:^16} | {:^16} |" 80 | 81 | print("-"*78) 82 | print(display_row_format.format("ToDo Text", "Created", "LastUpdated")) 83 | print("-"*78) 84 | 85 | # Open the 'LocalData.sqlite file 86 | with local_data_db: 87 | c = local_data_db.cursor() 88 | 89 | # Select the rows where ZKEY starts with 'ToDoCollections' - there should only be two, ToDoCollection.TASK and 90 | # ToDoCollection.SHOPPING_ITEM 91 | c.execute("SELECT ZVALUE FROM ZDATAITEM WHERE ZKEY LIKE 'ToDoCollection%'") 92 | 93 | # For both the rows we selected with the above query, we want to: 94 | for row in c.fetchall(): 95 | # load the contents of ZDATAITEM as a JSON, since it makes it easy to work with 96 | row_json = json.loads(row[0]) 97 | 98 | # for each item in the JSON, write values to XLSX file 99 | for item in row_json: 100 | # the text that was added to the ToDoCollection 101 | w.write(row_number, 0, item['text'], black_type_format) 102 | 103 | # the nbestItems seem to be the "runner-up" translations that Alexa heard but decided against using. If text 104 | # was entered via app, this will be empty. 105 | if item['nbestItems']: 106 | # there are often more than one of these, so join them all together for display 107 | nbestItems_string = ", ".join(item['nbestItems']) 108 | w.write(row_number, 1, nbestItems_string, black_type_format) 109 | 110 | # if the item has been completed - TRUE or FALSE 111 | w.write(row_number, 2, item['complete'], black_type_format) 112 | 113 | # if the item has been deleted - TRUE or FALSE 114 | w.write(row_number, 3, item['deleted'], black_type_format) 115 | 116 | # the item type - either TASK or SHOPPING_ITEM 117 | w.write(row_number, 4, item['type'], black_type_format) 118 | 119 | # item creation timestamp - in JSON as 1463950942522, but gets converted to 2016-05-22 21:02:22.522 120 | w.write(row_number, 5, to_human_timestamp(item['createdDate']), black_date_format) 121 | 122 | # item update timestamp - in JSON as 1463950942522, but gets converted to 2016-05-22 21:02:22.522 123 | w.write(row_number, 6, to_human_timestamp(item['lastUpdatedDate']), black_date_format) 124 | 125 | # item local update timestamp - presumably is set if the item is checked off/changed on the mobile device 126 | w.write(row_number, 7, to_human_timestamp(item['lastLocalUpdatedDate']), black_date_format) 127 | 128 | # reminder time - I presume this is the same as others, but I hadn't used this feature so no data 129 | w.write(row_number, 8, to_human_timestamp(item['reminderTime']), black_date_format) 130 | 131 | # long string, appears to be customer ID concatenated with a GUID separated by # 132 | # example: A1C9VTA5F7ZW1N#28a70937-7525-313f-a58c-374d73f91505 133 | w.write(row_number, 9, item['itemId'], black_type_format) 134 | 135 | # customer ID, same as above - A1C9VTA5F7ZW1N - was static for all my test data (which is expected) 136 | w.write(row_number, 10, item['customerId'], black_type_format) 137 | 138 | # not quite sure - was null for all my entries 139 | w.write(row_number, 11, item['utteranceId'], black_type_format) # record_type 140 | 141 | # originalAudioId - looks to be unique per entry. Not sure of make up; 2016/04/18/19 correspond to 142 | # YYYY/MM/DD/HH of createdDate, first string (up to #) is static but != customerId, and GUID toward 143 | # end != itemId. Example: 144 | # AB72C64C86AW2:1.0/2016/04/18/19/B0F00715549602C4/04:29::TNIH_2V.275ba59c-49a7-45fa-b484-b21435c8ebc7ZXV/0 145 | w.write(row_number, 12, item['originalAudioId'], black_type_format) # record_type 146 | 147 | row_number += 1 148 | try: 149 | print(display_row_format.format(item['text'], to_human_timestamp(item['createdDate'])[:16], to_human_timestamp(item['lastUpdatedDate'])[:16])) 150 | except: 151 | print("| {:^74} |".format("< Error printing row; check XLSX output >")) 152 | 153 | print("-" * 78) 154 | print(" * Parsed {} ToDo items".format(row_number-1)) 155 | print(" * Saved XLSX output to {}".format(output)) 156 | 157 | # Formatting 158 | w.freeze_panes(2, 0) # Freeze top row 159 | w.autofilter(1, 0, row_number, 16) # Add autofilter 160 | 161 | workbook.close() 162 | -------------------------------------------------------------------------------- /keystroke-flow/keystroke_flow.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import json 3 | import logging 4 | import sqlite3 5 | 6 | # Set up logging 7 | logging.basicConfig( 8 | level=logging.INFO, 9 | format='%(asctime)s | %(levelname).01s | %(message)s', 10 | datefmt='%Y-%m-%d %H:%M:%S') 11 | 12 | # Set up parsing arguments 13 | parser = argparse.ArgumentParser() 14 | parser.add_argument( 15 | '-i', '--input', 16 | help='Path to the input "Network Action Predictor" database', 17 | required=True) 18 | parser.add_argument( 19 | '-t', '--threshold', 20 | help='Threshold value for filtering links. URLs with a max incoming ' 21 | 'link value below this threshold will not be shown.', 22 | default='2.0') 23 | 24 | # Read the inputs 25 | args = parser.parse_args() 26 | db_name = args.input 27 | threshold = args.threshold 28 | 29 | logging.info('Using Network Action Predictor database: {}'.format(db_name)) 30 | logging.info('Using a threshold of {}. URLs with a max incoming link value ' 31 | 'below this threshold will not be shown.'.format(threshold)) 32 | logging.info('Default is 2; lower it to 1 at your own risk (the data is ' 33 | 'often noisy).') 34 | logging.info('-'*60) 35 | 36 | # Connect to the database and read all the rows 37 | con = sqlite3.connect(db_name) 38 | con.row_factory = sqlite3.Row 39 | rows = con.execute('SELECT * from network_action_predictor;') 40 | links = [] 41 | 42 | for row in rows: 43 | 44 | # If the row is just a suggestion that didn't lead to a url 45 | if row['number_of_hits'] == 0: 46 | logging.debug('Skipping 0-hit row {}'.format(row['url'])) 47 | continue 48 | 49 | # If the text is the same as the url (copy/paste, dedicated typist, etc) 50 | if row['user_text'] == row['url']: 51 | logging.debug('Skipping same text/url row {}'.format(row['url'])) 52 | continue 53 | 54 | # Transform each remaining row into a 'link' dict, made up of a source 55 | # (the 'user_text' value), a target (the url), and a value (# of hits). 56 | links.append({'source': str(row['user_text']), 'target': str(row['url']), 57 | 'value': '{:.1f}'.format(row['number_of_hits'])}) 58 | 59 | shared_links = {} 60 | for link in links: 61 | # If the url (link['target']) doesn't exist as a key in the shared_links 62 | # dict, make an entry with the url as key and an empty dict ({}) as value. 63 | shared_links.setdefault(link['target'], {}) 64 | 65 | # Next we want to group the user_text entries by what url they point at. 66 | # 67 | # Populate each url's dict with a key/value containing the user_text that 68 | # eventually led to it being visited, and the number of times it was typed. 69 | # 70 | # Example: 71 | # 'https://www.youtube.com/': { 72 | # 'y': 5.0, 73 | # 'yo': 5.0, 74 | # 'you': 3.0 75 | # } 76 | shared_links[link['target']][link['source']] = float(link['value']) 77 | 78 | 79 | sankey_links = [] 80 | 81 | for url in shared_links: 82 | 83 | # There often are a lot of urls that have only been visited a few times. 84 | # These can make the graphic 'noisy', so we add the ability to filter out 85 | # any entries that are below a user-defined 'threshold' value. 86 | if max(shared_links[url].values()) < float(threshold): 87 | logging.debug('Skipping url ({}) that has link values ' 88 | 'below the threshold'.format(url)) 89 | continue 90 | 91 | # Now we have many user_text entries all pointing to the url they eventually 92 | # pointed to. This would result in a graph that's only two 'levels' deep. 93 | # We want to modify the links so that user_text entries that eventually 94 | # point to the same url and that are subsets point to each other instead, 95 | # showing the flow (and not over counting the end result). 96 | # 97 | # Using the same YouTube data as the example, we have these links: 98 | # 'y' -> youtube.com (5), 99 | # 'yo' -> youtube.com (5) 100 | # 'you' -> youtube.com (3) 101 | # 102 | # Instead of three links to youtube.com, we want to show the chain: 103 | # 'y' -> 'yo' (5) 104 | # 'yo' -> youtube.com (2) 105 | # 'yo' -> 'you' (3) 106 | # 'you' -> youtube.com (3) 107 | # 108 | # (hard to illustrate in ascii :/) 109 | 110 | # Get a sorted list of all the user_text items that point to a given url 111 | user_text_items = sorted(shared_links[url]) 112 | for i, user_text in enumerate(user_text_items): 113 | 114 | # If this isn't the last item in the list 115 | if len(user_text_items)-1 > i: 116 | next_user_text = user_text_items[i+1] 117 | 118 | # Check if the next user_text item is the same as the current 119 | # user_text, but with one letter added at the end. 120 | # 121 | # Examples: 122 | # y & yo 123 | # yo & you 124 | if next_user_text[:-1] == user_text: 125 | # Find the overlap in 'weight' between i and i+1 126 | user_text_weight = shared_links[url][user_text] 127 | next_user_text_weight = shared_links[url][next_user_text] 128 | overlap = min(user_text_weight, next_user_text_weight) 129 | 130 | # Make a link from i -> i+1 with the value = overlap weight 131 | sankey_links.append( 132 | { 133 | 'source': user_text, 134 | 'target': next_user_text, 135 | 'value': overlap 136 | } 137 | ) 138 | logging.info('Added link: {} -> {} ({})' 139 | .format(user_text, next_user_text, overlap)) 140 | 141 | # If any weight is non-overlapping, make a link to the url with 142 | # that remaining, unused weight 143 | unassigned_weight = user_text_weight - overlap 144 | if unassigned_weight > 0: 145 | sankey_links.append( 146 | { 147 | 'source': user_text, 148 | 'target': url, 149 | 'value': unassigned_weight 150 | } 151 | ) 152 | logging.info('Added link: {} -> {} ({})' 153 | .format(user_text, url, unassigned_weight)) 154 | 155 | # There might be a discontinuity (user might have pasted in a string or something) 156 | # and the prev item might not == current[:-1]. If so, append user_text->url link. 157 | # Example: y & youtube 158 | else: 159 | sankey_links.append( 160 | { 161 | 'source': user_text, 162 | 'target': url, 163 | 'value': shared_links[url][user_text] 164 | } 165 | ) 166 | logging.info('Added link: {} -> {} ({})' 167 | .format(user_text, url, shared_links[url][user_text])) 168 | 169 | # If this is the last text in the list, it can't be a subset, so just 170 | # make the link to the url 171 | else: 172 | sankey_links.append( 173 | { 174 | 'source': user_text, 175 | 'target': url, 176 | 'value': shared_links[url][user_text] 177 | } 178 | ) 179 | logging.info('Added link: {} -> {} ({})' 180 | .format(user_text, url, shared_links[url][user_text])) 181 | 182 | # Start constructing the output JSON for the graphic 183 | output = {'links': sankey_links} 184 | 185 | # The JSON needs both the links (which we already have) and a separate list of 186 | # all the nodes. To easily make the node list, we'll loop through the links 187 | # and extract each source and target, then de-dupe them down using sets. 188 | source_nodes = set([d['source'] for d in sankey_links]) 189 | target_nodes = set([d['target'] for d in sankey_links]) 190 | unique_nodes = source_nodes.union(target_nodes) 191 | 192 | # Now do some massaging to get it in the right output format 193 | json_nodes = [] 194 | for item in unique_nodes: 195 | json_nodes.append({'name': item}) 196 | output['nodes'] = json_nodes 197 | 198 | # Save out the JSON 199 | with open('sankey_nap.json', 'w') as j_out: 200 | json.dump(output, j_out, indent=2) 201 | 202 | logging.info('-'*60) 203 | logging.info('Total number of links: {}'.format(len(output['links']))) 204 | logging.info('Total number of nodes: {}'.format(len(output['nodes']))) 205 | -------------------------------------------------------------------------------- /keystroke-flow/sankey.js: -------------------------------------------------------------------------------- 1 | d3.sankey = function() { 2 | var sankey = {}, 3 | nodeWidth = 24, 4 | nodePadding = 8, 5 | size = [1, 1], 6 | nodes = [], 7 | links = []; 8 | 9 | sankey.nodeWidth = function(_) { 10 | if (!arguments.length) return nodeWidth; 11 | nodeWidth = +_; 12 | return sankey; 13 | }; 14 | 15 | sankey.nodePadding = function(_) { 16 | if (!arguments.length) return nodePadding; 17 | nodePadding = +_; 18 | return sankey; 19 | }; 20 | 21 | sankey.nodes = function(_) { 22 | if (!arguments.length) return nodes; 23 | nodes = _; 24 | return sankey; 25 | }; 26 | 27 | sankey.links = function(_) { 28 | if (!arguments.length) return links; 29 | links = _; 30 | return sankey; 31 | }; 32 | 33 | sankey.size = function(_) { 34 | if (!arguments.length) return size; 35 | size = _; 36 | return sankey; 37 | }; 38 | 39 | sankey.layout = function(iterations) { 40 | computeNodeLinks(); 41 | computeNodeValues(); 42 | computeNodeBreadths(); 43 | computeNodeDepths(iterations); 44 | computeLinkDepths(); 45 | return sankey; 46 | }; 47 | 48 | sankey.relayout = function() { 49 | computeLinkDepths(); 50 | return sankey; 51 | }; 52 | 53 | sankey.link = function() { 54 | var curvature = .5; 55 | 56 | function link(d) { 57 | var x0 = d.source.x + d.source.dx, 58 | x1 = d.target.x, 59 | xi = d3.interpolateNumber(x0, x1), 60 | x2 = xi(curvature), 61 | x3 = xi(1 - curvature), 62 | y0 = d.source.y + d.sy + d.dy / 2, 63 | y1 = d.target.y + d.ty + d.dy / 2; 64 | return "M" + x0 + "," + y0 65 | + "C" + x2 + "," + y0 66 | + " " + x3 + "," + y1 67 | + " " + x1 + "," + y1; 68 | } 69 | 70 | link.curvature = function(_) { 71 | if (!arguments.length) return curvature; 72 | curvature = +_; 73 | return link; 74 | }; 75 | 76 | return link; 77 | }; 78 | 79 | // Populate the sourceLinks and targetLinks for each node. 80 | // Also, if the source and target are not objects, assume they are indices. 81 | function computeNodeLinks() { 82 | nodes.forEach(function(node) { 83 | node.sourceLinks = []; 84 | node.targetLinks = []; 85 | }); 86 | links.forEach(function(link) { 87 | var source = link.source, 88 | target = link.target; 89 | console.log(source, target); 90 | if (typeof source === "number") source = link.source = nodes[link.source]; 91 | if (typeof target === "number") target = link.target = nodes[link.target]; 92 | source.sourceLinks.push(link); 93 | target.targetLinks.push(link); 94 | }); 95 | } 96 | 97 | // Compute the value (size) of each node by summing the associated links. 98 | function computeNodeValues() { 99 | nodes.forEach(function(node) { 100 | node.value = Math.max( 101 | d3.sum(node.sourceLinks, value), 102 | d3.sum(node.targetLinks, value) 103 | ); 104 | }); 105 | } 106 | 107 | // Iteratively assign the breadth (x-position) for each node. 108 | // Nodes are assigned the maximum breadth of incoming neighbors plus one; 109 | // nodes with no incoming links are assigned breadth zero, while 110 | // nodes with no outgoing links are assigned the maximum breadth. 111 | function computeNodeBreadths() { 112 | var remainingNodes = nodes, 113 | nextNodes, 114 | x = 0; 115 | 116 | while (remainingNodes.length) { 117 | nextNodes = []; 118 | remainingNodes.forEach(function(node) { 119 | node.x = x; 120 | node.dx = nodeWidth; 121 | node.sourceLinks.forEach(function(link) { 122 | nextNodes.push(link.target); 123 | }); 124 | }); 125 | remainingNodes = nextNodes; 126 | ++x; 127 | } 128 | 129 | // 130 | moveSinksRight(x); 131 | scaleNodeBreadths((size[0] - nodeWidth) / (x - 1)); 132 | } 133 | 134 | function moveSourcesRight() { 135 | nodes.forEach(function(node) { 136 | if (!node.targetLinks.length) { 137 | node.x = d3.min(node.sourceLinks, function(d) { return d.target.x; }) - 1; 138 | } 139 | }); 140 | } 141 | 142 | function moveSinksRight(x) { 143 | nodes.forEach(function(node) { 144 | if (!node.sourceLinks.length) { 145 | node.x = x - 1; 146 | } 147 | }); 148 | } 149 | 150 | function scaleNodeBreadths(kx) { 151 | nodes.forEach(function(node) { 152 | node.x *= kx; 153 | }); 154 | } 155 | 156 | function computeNodeDepths(iterations) { 157 | var nodesByBreadth = d3.nest() 158 | .key(function(d) { return d.x; }) 159 | .sortKeys(d3.ascending) 160 | .entries(nodes) 161 | .map(function(d) { return d.values; }); 162 | 163 | // 164 | initializeNodeDepth(); 165 | resolveCollisions(); 166 | for (var alpha = 1; iterations > 0; --iterations) { 167 | relaxRightToLeft(alpha *= .99); 168 | resolveCollisions(); 169 | relaxLeftToRight(alpha); 170 | resolveCollisions(); 171 | } 172 | 173 | function initializeNodeDepth() { 174 | var ky = d3.min(nodesByBreadth, function(nodes) { 175 | return (size[1] - (nodes.length - 1) * nodePadding) / d3.sum(nodes, value); 176 | }); 177 | 178 | nodesByBreadth.forEach(function(nodes) { 179 | nodes.forEach(function(node, i) { 180 | node.y = i; 181 | node.dy = node.value * ky; 182 | }); 183 | }); 184 | 185 | links.forEach(function(link) { 186 | link.dy = link.value * ky; 187 | }); 188 | } 189 | 190 | function relaxLeftToRight(alpha) { 191 | nodesByBreadth.forEach(function(nodes, breadth) { 192 | nodes.forEach(function(node) { 193 | if (node.targetLinks.length) { 194 | var y = d3.sum(node.targetLinks, weightedSource) / d3.sum(node.targetLinks, value); 195 | node.y += (y - center(node)) * alpha; 196 | } 197 | }); 198 | }); 199 | 200 | function weightedSource(link) { 201 | return center(link.source) * link.value; 202 | } 203 | } 204 | 205 | function relaxRightToLeft(alpha) { 206 | nodesByBreadth.slice().reverse().forEach(function(nodes) { 207 | nodes.forEach(function(node) { 208 | if (node.sourceLinks.length) { 209 | var y = d3.sum(node.sourceLinks, weightedTarget) / d3.sum(node.sourceLinks, value); 210 | node.y += (y - center(node)) * alpha; 211 | } 212 | }); 213 | }); 214 | 215 | function weightedTarget(link) { 216 | return center(link.target) * link.value; 217 | } 218 | } 219 | 220 | function resolveCollisions() { 221 | nodesByBreadth.forEach(function(nodes) { 222 | var node, 223 | dy, 224 | y0 = 0, 225 | n = nodes.length, 226 | i; 227 | 228 | // Push any overlapping nodes down. 229 | nodes.sort(ascendingDepth); 230 | for (i = 0; i < n; ++i) { 231 | node = nodes[i]; 232 | dy = y0 - node.y; 233 | if (dy > 0) node.y += dy; 234 | y0 = node.y + node.dy + nodePadding; 235 | } 236 | 237 | // If the bottommost node goes outside the bounds, push it back up. 238 | dy = y0 - nodePadding - size[1]; 239 | if (dy > 0) { 240 | y0 = node.y -= dy; 241 | 242 | // Push any overlapping nodes back up. 243 | for (i = n - 2; i >= 0; --i) { 244 | node = nodes[i]; 245 | dy = node.y + node.dy + nodePadding - y0; 246 | if (dy > 0) node.y -= dy; 247 | y0 = node.y; 248 | } 249 | } 250 | }); 251 | } 252 | 253 | function ascendingDepth(a, b) { 254 | return a.y - b.y; 255 | } 256 | } 257 | 258 | function computeLinkDepths() { 259 | nodes.forEach(function(node) { 260 | node.sourceLinks.sort(ascendingTargetDepth); 261 | node.targetLinks.sort(ascendingSourceDepth); 262 | }); 263 | nodes.forEach(function(node) { 264 | var sy = 0, ty = 0; 265 | node.sourceLinks.forEach(function(link) { 266 | link.sy = sy; 267 | sy += link.dy; 268 | }); 269 | node.targetLinks.forEach(function(link) { 270 | link.ty = ty; 271 | ty += link.dy; 272 | }); 273 | }); 274 | 275 | function ascendingSourceDepth(a, b) { 276 | return a.source.y - b.source.y; 277 | } 278 | 279 | function ascendingTargetDepth(a, b) { 280 | return a.target.y - b.target.y; 281 | } 282 | } 283 | 284 | function center(node) { 285 | return node.y + node.dy / 2; 286 | } 287 | 288 | function value(link) { 289 | return link.value; 290 | } 291 | 292 | return sankey; 293 | }; -------------------------------------------------------------------------------- /dissecting_snowflakes.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import base64 3 | import datetime 4 | import re 5 | 6 | CONSOLE_WIDTH = 70 7 | 8 | parser = argparse.ArgumentParser() 9 | 10 | parser.add_argument('snowflake', help='the snowflake value to parse') 11 | parser.add_argument('--type', type=str, required=True, choices=['twitter', 'linkedin', 'discord', 'manual']) 12 | parser.add_argument('--ts_bits', type=int, help='The number of bits that compromise the timestamp') 13 | parser.add_argument( 14 | '--offset', type=int, default=0, help='The offset from the Unix epoch to apply to the extracted timestamp') 15 | 16 | args = parser.parse_args() 17 | 18 | 19 | snowflake = args.snowflake 20 | number_of_ts_bits = args.ts_bits 21 | epoch_offset = args.offset 22 | 23 | if args.type == 'twitter': 24 | number_of_ts_bits = 42 25 | epoch_offset = 1288834974657 26 | 27 | elif args.type == 'linkedin': 28 | number_of_ts_bits = 42 29 | epoch_offset = 0 30 | 31 | elif args.type == 'discord': 32 | number_of_ts_bits = 42 33 | epoch_offset = 1420070400000 34 | 35 | elif args.type == 'tiktok': 36 | number_of_ts_bits = 32 37 | epoch_offset = 0 38 | 39 | elif args.type == 'manual': 40 | if not number_of_ts_bits: 41 | print("In manual mode, --ts_bits is required.") 42 | exit() 43 | 44 | 45 | def center_on_console(console_line): 46 | return f'{console_line:^{CONSOLE_WIDTH}}' 47 | 48 | 49 | def center_with_offset(console_line, offset): 50 | return f'{str(console_line)+" "*offset:^{CONSOLE_WIDTH}}' 51 | 52 | 53 | def center_arrow_with_offset(console_line, offset): 54 | adjusted_offset = offset - len(console_line) 55 | return f'{str(console_line)+" "*adjusted_offset:^{CONSOLE_WIDTH}}' 56 | 57 | 58 | def trim_zero_fractional_seconds(timestamp_string, number_to_trim): 59 | """Timestamp formats have different levels of precision; trim off extra 0s. 60 | 61 | Different formats may have less precision that the microseconds datetime returns. 62 | Trim off the appropriate number of trailing zeros from a value to not add extra, 63 | incorrect precision to it. 64 | 65 | """ 66 | if re.search(rf'\.\d{{{6 - number_to_trim}}}0{{{number_to_trim}}}$', timestamp_string): 67 | return timestamp_string[:-number_to_trim] 68 | return timestamp_string 69 | 70 | 71 | def decode_epoch_seconds(seconds): 72 | """Decode a numeric timestamp in Epoch seconds format to a human-readable timestamp. 73 | 74 | An Epoch timestamp (1-10 digits) is an integer that counts the number of seconds since Jan 1 1970. 75 | 76 | Useful values for ranges (all Jan-1 00:00:00): 77 | 1970: 0 78 | 2015: 1420070400 79 | 2025: 1735689600 80 | 2030: 1900000000 81 | 82 | """ 83 | return datetime.datetime.utcfromtimestamp(float(seconds)), 'Epoch seconds' 84 | 85 | 86 | def decode_epoch_centiseconds(centiseconds): 87 | """Decode a numeric timestamp in Epoch centiseconds (10 ms) format to a human-readable timestamp. 88 | 89 | An Epoch centisecond timestamp (1-12 digits) is an integer that counts the number of centiseconds (10 ms) 90 | since Jan 1 1970. 91 | 92 | Useful values for ranges (all Jan-1 00:00:00): 93 | 1970: 0 94 | 2015: 142007040000 95 | 2025: 173568960000 96 | 2030: 190000000000 97 | 98 | """ 99 | # Trim off the 4 trailing 0s (don't add precision that wasn't in the timestamp) 100 | converted_ts = trim_zero_fractional_seconds( 101 | str(datetime.datetime.utcfromtimestamp(float(centiseconds) / 100)), 4) 102 | return converted_ts, 'Epoch centiseconds' 103 | 104 | 105 | def decode_epoch_milliseconds(milliseconds): 106 | """Decode a numeric timestamp in Epoch milliseconds format to a human-readable timestamp. 107 | 108 | An Epoch millisecond timestamp (1-13 digits) is an integer that counts the number of milliseconds since Jan 1 1970. 109 | 110 | Useful values for ranges (all Jan-1 00:00:00): 111 | 1970: 0 112 | 2015: 1420070400000 113 | 2025: 1735689600000 114 | 2030: 1900000000000 115 | 116 | """ 117 | converted_dt = datetime.datetime(1970, 1, 1) + datetime.timedelta(milliseconds=float(milliseconds)) 118 | # Trim off the 3 trailing 0s (don't add precision that wasn't in the timestamp) 119 | converted_ts = trim_zero_fractional_seconds(str(converted_dt), 3) 120 | return converted_ts, 'Epoch milliseconds' 121 | 122 | 123 | def decode_epoch_ten_microseconds(ten_microseconds): 124 | """Decode a numeric timestamp in Epoch ten-millisecond increments to a human-readable timestamp. 125 | 126 | An Epoch ten-microsecond increments timestamp (1-15 digits) is an integer that counts the number of ten-microsecond 127 | increments since Jan 1 1970. 128 | 129 | Useful values for ranges (all Jan-1 00:00:00): 130 | 1970: 0 131 | 2015: 142007040000000 132 | 2025: 173568960000000 133 | 2030: 190000000000000 134 | 135 | """ 136 | # Trim off the trailing 0 (don't add precision that wasn't in the timestamp) 137 | converted_ts = trim_zero_fractional_seconds( 138 | str(datetime.datetime.utcfromtimestamp(float(ten_microseconds) / 100000)), 1) 139 | return converted_ts, 'Epoch ten-microsecond increments' 140 | 141 | 142 | def decode_epoch_microseconds(microseconds): 143 | """Decode a numeric timestamp in Epoch microseconds format to a human-readable timestamp. 144 | 145 | An Epoch millisecond timestamp (1-16 digits) is an integer that counts the number of milliseconds since Jan 1 1970. 146 | 147 | Useful values for ranges (all Jan-1 00:00:00): 148 | 1970: 0 149 | 2015: 1420070400000000 150 | 2025: 1735689600000000 151 | 2030: 1900000000000000 152 | 153 | """ 154 | converted_ts = str(datetime.datetime.utcfromtimestamp(float(microseconds) / 1000000)) 155 | return converted_ts, 'Epoch microseconds' 156 | 157 | 158 | def decode_webkit(microseconds): 159 | """Decode a numeric timestamp in Webkit format to a human-readable timestamp. 160 | 161 | A Webkit timestamp (17 digits) is an integer that counts the number of microseconds since 12:00AM Jan 1 1601 UTC. 162 | 163 | Useful values for ranges (all Jan-1 00:00:00): 164 | 1970: 11644473600000000 165 | 2015: 13064544000000000 166 | 2025: 13380163200000000 167 | 168 | """ 169 | return datetime.datetime.utcfromtimestamp((float(microseconds) / 1000000) - 11644473600), 'Webkit' 170 | 171 | 172 | def decode_windows_filetime(intervals): 173 | """Decode a numeric timestamp in Windows FileTime format to a human-readable timestamp. 174 | 175 | A Windows FileTime timestamp (18 digits) is a 64-bit value that represents the number of 100-nanosecond intervals 176 | since 12:00AM Jan 1 1601 UTC. 177 | 178 | Useful values for ranges (all Jan-1 00:00:00): 179 | 1970: 116444736000000000 180 | 2015: 130645440000000000 181 | 2025: 133801632000000000 182 | 2065: 146424672000000000 183 | 184 | """ 185 | return datetime.datetime.utcfromtimestamp((float(intervals) / 10000000) - 11644473600), 'Windows FileTime' 186 | 187 | 188 | def decode_datetime_ticks(ticks): 189 | """Decode a numeric timestamp in .Net/C# DateTime ticks format to a human-readable timestamp. 190 | 191 | A .Net/C# DateTime ticks timestamp (18 digits) is the number of 100-nanosecond intervals that have elapsed since 192 | 12:00:00 midnight, January 1, 0001 (0:00:00 UTC on January 1, 0001, in the Gregorian calendar), which represents 193 | DateTime.MinValue. It does not include the number of ticks that are attributable to leap seconds. 194 | 195 | A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a 196 | millisecond, or 10 million ticks in a second. 197 | 198 | (^ from https://docs.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=netframework-4.8) 199 | 200 | Useful values for ranges (all Jan-1 00:00:00): 201 | 1970: 621355968000000000 202 | 2015: 635556672000000000 203 | 2025: 638712864000000000 204 | 2038: 642815136000000000 205 | 206 | """ 207 | seconds = (ticks - 621355968000000000) / 10000000 208 | return (datetime.datetime.fromtimestamp(seconds)), 'DateTime ticks' 209 | 210 | 211 | def guess_timestamp_format(timestamp): 212 | # Windows FileTime (18 digits) 213 | if 130645440000000000 <= timestamp <= 133801632000000000: # 2015 <= ts <= 2025 214 | new_timestamp = decode_windows_filetime(timestamp) 215 | 216 | # .Net/C# DateTime ticks (18 digits) 217 | elif 635556672000000000 <= timestamp <= 638712864000000000: # 2015 <= ts <= 2025 218 | new_timestamp = decode_datetime_ticks(timestamp) 219 | 220 | # WebKit (17 digits) 221 | elif 13064544000000000 <= timestamp <= 13380163200000000: # 2015 <= ts <= 2025 222 | new_timestamp = decode_webkit(timestamp) 223 | 224 | # Epoch microseconds (16 digits) 225 | elif 1400070400000000 <= timestamp <= 1735689600000000: # 2014 <= ts <= 2025 226 | new_timestamp = decode_epoch_microseconds(timestamp) 227 | 228 | # Epoch ten microsecond increments (15 digits) 229 | elif 140007040000000 <= timestamp <= 173568960000000: # 2014 <= ts <= 2025 230 | new_timestamp = decode_epoch_microseconds(timestamp) 231 | 232 | # Epoch milliseconds (13 digits) 233 | elif 1000070400000 <= timestamp <= 1735689600000: # 2014 <= ts <= 2025 234 | new_timestamp = decode_epoch_milliseconds(timestamp) 235 | 236 | # Epoch seconds (10 digits) 237 | # elif 1420070400 <= timestamp <= 1735689600: # 2015 <= ts <= 2025 238 | else: 239 | new_timestamp = decode_epoch_seconds(timestamp) 240 | 241 | return new_timestamp 242 | 243 | 244 | snowflake_length = 64 245 | 246 | try: 247 | snowflake_int = int(snowflake) 248 | 249 | except: 250 | snowflake_bytes = base64.urlsafe_b64decode(snowflake+'==') 251 | snowflake_length = len(snowflake_bytes) * 8 252 | snowflake_int = int.from_bytes(snowflake_bytes, 'big') 253 | 254 | print_type = 'not specified' 255 | if args.type: 256 | print_type = args.type 257 | 258 | print(f'snowflake type: {print_type} | # of total bits: {snowflake_length} |' 259 | f' # of timestamp bits: {number_of_ts_bits} | epoch offset: {epoch_offset}\n') 260 | 261 | print(center_on_console(snowflake)) 262 | print(center_arrow_with_offset('↓ to binary', 0)) 263 | print(center_on_console(f'{snowflake_int:>0{snowflake_length}b}')) 264 | 265 | ts_split_offset = snowflake_length-number_of_ts_bits 266 | 267 | print(center_arrow_with_offset(f'↓ taking upper {number_of_ts_bits} bits', ts_split_offset)) 268 | 269 | # Total length is 64 bits; we want the left-most x number, 270 | # so shift the bits right 64-x to leave just what we want. 271 | ts_bits = snowflake_int >> (snowflake_length - number_of_ts_bits) 272 | 273 | print(center_with_offset(f'{ts_bits:>0{number_of_ts_bits}b}', ts_split_offset)) 274 | 275 | print(center_arrow_with_offset('↓ to decimal', ts_split_offset)) 276 | 277 | print(center_with_offset(int(ts_bits), ts_split_offset)) 278 | 279 | print(center_arrow_with_offset(f'↓ add epoch offset ({epoch_offset})', ts_split_offset)) 280 | 281 | epoch_adjusted_ts = int(ts_bits) + epoch_offset 282 | 283 | print(center_with_offset(epoch_adjusted_ts, ts_split_offset)) 284 | 285 | print(center_arrow_with_offset('↓ to timestamp', ts_split_offset)) 286 | 287 | try: 288 | human_ts, ts_name = guess_timestamp_format(epoch_adjusted_ts) 289 | print(center_with_offset(f'{human_ts} ({ts_name})', ts_split_offset)) 290 | except OSError: 291 | print(center_with_offset('TS too big', ts_split_offset)) 292 | -------------------------------------------------------------------------------- /browser-structures/all_edge_profiles.json: -------------------------------------------------------------------------------- 1 | { 2 | "74": { 3 | "type": "version 74-dev", 4 | "name": "Edge Profile Directory", 5 | "children": [ 6 | { 7 | "type": "LevelDB Log File", 8 | "name": "000003.log" 9 | }, 10 | { 11 | "type": "directory", 12 | "name": "AutofillStrikeDatabase", 13 | "children": [ 14 | { 15 | "type": "LevelDB Log File", 16 | "name": "000003.log" 17 | }, 18 | { 19 | "type": "LevelDB Current Manifest", 20 | "name": "CURRENT" 21 | }, 22 | { 23 | "type": "empty file", 24 | "name": "LOCK" 25 | }, 26 | { 27 | "type": "LevelDB Info Log", 28 | "name": "LOG" 29 | }, 30 | { 31 | "type": "LevelDB Manifest", 32 | "name": "MANIFEST-000001" 33 | } 34 | ] 35 | }, 36 | { 37 | "type": "JSON", 38 | "name": "Bookmarks" 39 | }, 40 | { 41 | "type": "LevelDB Current Manifest", 42 | "name": "CURRENT" 43 | }, 44 | { 45 | "type": "directory", 46 | "name": "Cache", 47 | "children": [ 48 | { 49 | "type": "Chrome Data Block v2.0", 50 | "name": "data_0" 51 | }, 52 | { 53 | "type": "Chrome Data Block v2.0", 54 | "name": "data_1" 55 | }, 56 | { 57 | "type": "Chrome Data Block v2.0", 58 | "name": "data_2" 59 | }, 60 | { 61 | "type": "Chrome Data Block v2.0", 62 | "name": "data_3" 63 | }, 64 | { 65 | "type": "unknown", 66 | "name": "f_000001" 67 | }, 68 | { 69 | "type": "unknown", 70 | "name": "f_000002" 71 | }, 72 | { 73 | "type": "unknown", 74 | "name": "f_000003" 75 | }, 76 | { 77 | "type": "unknown", 78 | "name": "f_000005" 79 | }, 80 | { 81 | "type": "unknown", 82 | "name": "f_000006" 83 | }, 84 | { 85 | "type": "249 cache files removed", 86 | "name": "..." 87 | }, 88 | { 89 | "type": "unknown", 90 | "name": "f_000101" 91 | }, 92 | { 93 | "type": "unknown", 94 | "name": "f_000102" 95 | }, 96 | { 97 | "type": "unknown", 98 | "name": "f_000103" 99 | }, 100 | { 101 | "type": "unknown", 102 | "name": "f_000104" 103 | }, 104 | { 105 | "type": "Chrome Index v2.1", 106 | "name": "index" 107 | } 108 | ] 109 | }, 110 | { 111 | "type": "directory", 112 | "name": "Code Cache", 113 | "children": [ 114 | { 115 | "type": "directory", 116 | "name": "js", 117 | "children": [ 118 | { 119 | "type": "Simple Cache Entry v5", 120 | "name": "00cced52835f165a_0" 121 | }, 122 | { 123 | "type": "Simple Cache Entry v5", 124 | "name": "02409a79bfd5bad1_0" 125 | }, 126 | { 127 | "type": "Simple Cache Entry v5", 128 | "name": "03a6fcedb712b5aa_0" 129 | }, 130 | { 131 | "type": "Simple Cache Entry v5", 132 | "name": "03bd883cac08f48d_0" 133 | }, 134 | { 135 | "type": "Simple Cache Entry v5", 136 | "name": "03d5424d241ef8a2_0" 137 | }, 138 | { 139 | "type": "Simple Cache Entry v5", 140 | "name": "04f114918bc05fc2_0" 141 | }, 142 | { 143 | "type": "Simple Cache Entry v5", 144 | "name": "04f257bf1f393d57_0" 145 | }, 146 | { 147 | "type": "Simple Cache Entry v5", 148 | "name": "062350e072977505_0" 149 | }, 150 | { 151 | "type": "Simple Cache Entry v5", 152 | "name": "064df65b2912c6e5_0" 153 | }, 154 | { 155 | "type": "290 items removed", 156 | "name": "..." 157 | }, 158 | { 159 | "type": "Simple Cache Entry v5", 160 | "name": "f89552906817f76e_0" 161 | }, 162 | { 163 | "type": "Simple Cache Entry v5", 164 | "name": "f8c415e1d58158f1_0" 165 | }, 166 | { 167 | "type": "Simple Cache Entry v5", 168 | "name": "f919f28c986ec8b1_0" 169 | }, 170 | { 171 | "type": "Simple Cache Entry v5", 172 | "name": "f955e126a1cdee58_0" 173 | }, 174 | { 175 | "type": "Simple Cache Entry v5", 176 | "name": "f9c86cb15b62f8ed_0" 177 | }, 178 | { 179 | "type": "Simple Cache Entry v5", 180 | "name": "fb62749cc42f89e1_0" 181 | }, 182 | { 183 | "type": "Simple Cache Entry v5", 184 | "name": "feb5efac6eeeb1ba_0" 185 | }, 186 | { 187 | "type": "Simple Cache Entry v5", 188 | "name": "ffaf5a3165d23f70_0" 189 | }, 190 | { 191 | "type": "Simple Cache Entry v9", 192 | "name": "index" 193 | }, 194 | { 195 | "type": "directory", 196 | "name": "index-dir", 197 | "children": [ 198 | { 199 | "type": "unknown", 200 | "name": "the-real-index" 201 | } 202 | ] 203 | } 204 | ] 205 | } 206 | ] 207 | }, 208 | { 209 | "type": "SQLite3 database", 210 | "name": "Cookies", 211 | "children": [ 212 | { 213 | "type": "SQLite3 Table", 214 | "name": "meta", 215 | "children": [ 216 | { 217 | "type": "SQLite3 Column", 218 | "name": "key" 219 | }, 220 | { 221 | "type": "SQLite3 Column", 222 | "name": "value" 223 | } 224 | ] 225 | }, 226 | { 227 | "type": "SQLite3 Table", 228 | "name": "cookies", 229 | "children": [ 230 | { 231 | "type": "SQLite3 Column", 232 | "name": "creation_utc" 233 | }, 234 | { 235 | "type": "SQLite3 Column", 236 | "name": "host_key" 237 | }, 238 | { 239 | "type": "SQLite3 Column", 240 | "name": "name" 241 | }, 242 | { 243 | "type": "SQLite3 Column", 244 | "name": "value" 245 | }, 246 | { 247 | "type": "SQLite3 Column", 248 | "name": "path" 249 | }, 250 | { 251 | "type": "SQLite3 Column", 252 | "name": "expires_utc" 253 | }, 254 | { 255 | "type": "SQLite3 Column", 256 | "name": "is_secure" 257 | }, 258 | { 259 | "type": "SQLite3 Column", 260 | "name": "is_httponly" 261 | }, 262 | { 263 | "type": "SQLite3 Column", 264 | "name": "last_access_utc" 265 | }, 266 | { 267 | "type": "SQLite3 Column", 268 | "name": "has_expires" 269 | }, 270 | { 271 | "type": "SQLite3 Column", 272 | "name": "is_persistent" 273 | }, 274 | { 275 | "type": "SQLite3 Column", 276 | "name": "priority" 277 | }, 278 | { 279 | "type": "SQLite3 Column", 280 | "name": "encrypted_value" 281 | }, 282 | { 283 | "type": "SQLite3 Column", 284 | "name": "firstpartyonly" 285 | }, 286 | { 287 | "type": "SQLite3 Column", 288 | "name": "is_edgelegacycookie" 289 | } 290 | ] 291 | } 292 | ] 293 | }, 294 | { 295 | "type": "SNSS", 296 | "name": "Current Session" 297 | }, 298 | { 299 | "type": "SNSS", 300 | "name": "Current Tabs" 301 | }, 302 | { 303 | "type": "Icon Image file", 304 | "name": "Edge Profile.ico" 305 | }, 306 | { 307 | "type": "directory", 308 | "name": "Extension State", 309 | "children": [ 310 | { 311 | "type": "LevelDB Log File", 312 | "name": "000003.log" 313 | }, 314 | { 315 | "type": "LevelDB Current Manifest", 316 | "name": "CURRENT" 317 | }, 318 | { 319 | "type": "empty file", 320 | "name": "LOCK" 321 | }, 322 | { 323 | "type": "LevelDB Info Log", 324 | "name": "LOG" 325 | }, 326 | { 327 | "type": "LevelDB Manifest", 328 | "name": "MANIFEST-000001" 329 | } 330 | ] 331 | }, 332 | { 333 | "type": "SQLite3 database", 334 | "name": "Favicons", 335 | "children": [ 336 | { 337 | "type": "SQLite3 Table", 338 | "name": "meta", 339 | "children": [ 340 | { 341 | "type": "SQLite3 Column", 342 | "name": "key" 343 | }, 344 | { 345 | "type": "SQLite3 Column", 346 | "name": "value" 347 | } 348 | ] 349 | }, 350 | { 351 | "type": "SQLite3 Table", 352 | "name": "icon_mapping", 353 | "children": [ 354 | { 355 | "type": "SQLite3 Column", 356 | "name": "id" 357 | }, 358 | { 359 | "type": "SQLite3 Column", 360 | "name": "page_url" 361 | }, 362 | { 363 | "type": "SQLite3 Column", 364 | "name": "icon_id" 365 | } 366 | ] 367 | }, 368 | { 369 | "type": "SQLite3 Table", 370 | "name": "favicons", 371 | "children": [ 372 | { 373 | "type": "SQLite3 Column", 374 | "name": "id" 375 | }, 376 | { 377 | "type": "SQLite3 Column", 378 | "name": "url" 379 | }, 380 | { 381 | "type": "SQLite3 Column", 382 | "name": "icon_type" 383 | } 384 | ] 385 | }, 386 | { 387 | "type": "SQLite3 Table", 388 | "name": "favicon_bitmaps", 389 | "children": [ 390 | { 391 | "type": "SQLite3 Column", 392 | "name": "id" 393 | }, 394 | { 395 | "type": "SQLite3 Column", 396 | "name": "icon_id" 397 | }, 398 | { 399 | "type": "SQLite3 Column", 400 | "name": "last_updated" 401 | }, 402 | { 403 | "type": "SQLite3 Column", 404 | "name": "image_data" 405 | }, 406 | { 407 | "type": "SQLite3 Column", 408 | "name": "width" 409 | }, 410 | { 411 | "type": "SQLite3 Column", 412 | "name": "height" 413 | }, 414 | { 415 | "type": "SQLite3 Column", 416 | "name": "last_requested" 417 | } 418 | ] 419 | } 420 | ] 421 | }, 422 | { 423 | "type": "directory", 424 | "name": "Feature Engagement Tracker", 425 | "children": [ 426 | { 427 | "type": "directory", 428 | "name": "AvailabilityDB", 429 | "children": [ 430 | { 431 | "type": "LevelDB Log File", 432 | "name": "000003.log" 433 | }, 434 | { 435 | "type": "LevelDB Current Manifest", 436 | "name": "CURRENT" 437 | }, 438 | { 439 | "type": "empty file", 440 | "name": "LOCK" 441 | }, 442 | { 443 | "type": "LevelDB Info Log", 444 | "name": "LOG" 445 | }, 446 | { 447 | "type": "LevelDB Manifest", 448 | "name": "MANIFEST-000001" 449 | } 450 | ] 451 | }, 452 | { 453 | "type": "directory", 454 | "name": "EventDB", 455 | "children": [ 456 | { 457 | "type": "empty file", 458 | "name": "000003.log" 459 | }, 460 | { 461 | "type": "LevelDB Current Manifest", 462 | "name": "CURRENT" 463 | }, 464 | { 465 | "type": "empty file", 466 | "name": "LOCK" 467 | }, 468 | { 469 | "type": "LevelDB Info Log", 470 | "name": "LOG" 471 | }, 472 | { 473 | "type": "LevelDB Manifest", 474 | "name": "MANIFEST-000001" 475 | } 476 | ] 477 | } 478 | ] 479 | }, 480 | { 481 | "type": "directory", 482 | "name": "GPUCache", 483 | "children": [ 484 | { 485 | "type": "Chrome Data Block v2.0", 486 | "name": "data_0" 487 | }, 488 | { 489 | "type": "Chrome Data Block v2.0", 490 | "name": "data_1" 491 | }, 492 | { 493 | "type": "Chrome Data Block v2.0", 494 | "name": "data_2" 495 | }, 496 | { 497 | "type": "Chrome Data Block v2.0", 498 | "name": "data_3" 499 | }, 500 | { 501 | "type": "Chrome Index v2.0", 502 | "name": "index" 503 | } 504 | ] 505 | }, 506 | { 507 | "type": "SQLite3 database", 508 | "name": "History", 509 | "children": [ 510 | { 511 | "type": "SQLite3 Table", 512 | "name": "meta", 513 | "children": [ 514 | { 515 | "type": "SQLite3 Column", 516 | "name": "key" 517 | }, 518 | { 519 | "type": "SQLite3 Column", 520 | "name": "value" 521 | } 522 | ] 523 | }, 524 | { 525 | "type": "SQLite3 Table", 526 | "name": "downloads", 527 | "children": [ 528 | { 529 | "type": "SQLite3 Column", 530 | "name": "id" 531 | }, 532 | { 533 | "type": "SQLite3 Column", 534 | "name": "guid" 535 | }, 536 | { 537 | "type": "SQLite3 Column", 538 | "name": "current_path" 539 | }, 540 | { 541 | "type": "SQLite3 Column", 542 | "name": "target_path" 543 | }, 544 | { 545 | "type": "SQLite3 Column", 546 | "name": "start_time" 547 | }, 548 | { 549 | "type": "SQLite3 Column", 550 | "name": "received_bytes" 551 | }, 552 | { 553 | "type": "SQLite3 Column", 554 | "name": "total_bytes" 555 | }, 556 | { 557 | "type": "SQLite3 Column", 558 | "name": "state" 559 | }, 560 | { 561 | "type": "SQLite3 Column", 562 | "name": "danger_type" 563 | }, 564 | { 565 | "type": "SQLite3 Column", 566 | "name": "interrupt_reason" 567 | }, 568 | { 569 | "type": "SQLite3 Column", 570 | "name": "hash" 571 | }, 572 | { 573 | "type": "SQLite3 Column", 574 | "name": "end_time" 575 | }, 576 | { 577 | "type": "SQLite3 Column", 578 | "name": "opened" 579 | }, 580 | { 581 | "type": "SQLite3 Column", 582 | "name": "last_access_time" 583 | }, 584 | { 585 | "type": "SQLite3 Column", 586 | "name": "transient" 587 | }, 588 | { 589 | "type": "SQLite3 Column", 590 | "name": "referrer" 591 | }, 592 | { 593 | "type": "SQLite3 Column", 594 | "name": "site_url" 595 | }, 596 | { 597 | "type": "SQLite3 Column", 598 | "name": "tab_url" 599 | }, 600 | { 601 | "type": "SQLite3 Column", 602 | "name": "tab_referrer_url" 603 | }, 604 | { 605 | "type": "SQLite3 Column", 606 | "name": "http_method" 607 | }, 608 | { 609 | "type": "SQLite3 Column", 610 | "name": "by_ext_id" 611 | }, 612 | { 613 | "type": "SQLite3 Column", 614 | "name": "by_ext_name" 615 | }, 616 | { 617 | "type": "SQLite3 Column", 618 | "name": "etag" 619 | }, 620 | { 621 | "type": "SQLite3 Column", 622 | "name": "last_modified" 623 | }, 624 | { 625 | "type": "SQLite3 Column", 626 | "name": "mime_type" 627 | }, 628 | { 629 | "type": "SQLite3 Column", 630 | "name": "original_mime_type" 631 | } 632 | ] 633 | }, 634 | { 635 | "type": "SQLite3 Table", 636 | "name": "downloads_url_chains", 637 | "children": [ 638 | { 639 | "type": "SQLite3 Column", 640 | "name": "id" 641 | }, 642 | { 643 | "type": "SQLite3 Column", 644 | "name": "chain_index" 645 | }, 646 | { 647 | "type": "SQLite3 Column", 648 | "name": "url" 649 | } 650 | ] 651 | }, 652 | { 653 | "type": "SQLite3 Table", 654 | "name": "downloads_slices", 655 | "children": [ 656 | { 657 | "type": "SQLite3 Column", 658 | "name": "download_id" 659 | }, 660 | { 661 | "type": "SQLite3 Column", 662 | "name": "offset" 663 | }, 664 | { 665 | "type": "SQLite3 Column", 666 | "name": "received_bytes" 667 | }, 668 | { 669 | "type": "SQLite3 Column", 670 | "name": "finished" 671 | } 672 | ] 673 | }, 674 | { 675 | "type": "SQLite3 Table", 676 | "name": "typed_url_sync_metadata", 677 | "children": [ 678 | { 679 | "type": "SQLite3 Column", 680 | "name": "storage_key" 681 | }, 682 | { 683 | "type": "SQLite3 Column", 684 | "name": "value" 685 | } 686 | ] 687 | }, 688 | { 689 | "type": "SQLite3 Table", 690 | "name": "urls", 691 | "children": [ 692 | { 693 | "type": "SQLite3 Column", 694 | "name": "id" 695 | }, 696 | { 697 | "type": "SQLite3 Column", 698 | "name": "url" 699 | }, 700 | { 701 | "type": "SQLite3 Column", 702 | "name": "title" 703 | }, 704 | { 705 | "type": "SQLite3 Column", 706 | "name": "visit_count" 707 | }, 708 | { 709 | "type": "SQLite3 Column", 710 | "name": "typed_count" 711 | }, 712 | { 713 | "type": "SQLite3 Column", 714 | "name": "last_visit_time" 715 | }, 716 | { 717 | "type": "SQLite3 Column", 718 | "name": "hidden" 719 | } 720 | ] 721 | }, 722 | { 723 | "type": "SQLite3 Table", 724 | "name": "sqlite_sequence", 725 | "children": [ 726 | { 727 | "type": "SQLite3 Column", 728 | "name": "name" 729 | }, 730 | { 731 | "type": "SQLite3 Column", 732 | "name": "seq" 733 | } 734 | ] 735 | }, 736 | { 737 | "type": "SQLite3 Table", 738 | "name": "visits", 739 | "children": [ 740 | { 741 | "type": "SQLite3 Column", 742 | "name": "id" 743 | }, 744 | { 745 | "type": "SQLite3 Column", 746 | "name": "url" 747 | }, 748 | { 749 | "type": "SQLite3 Column", 750 | "name": "visit_time" 751 | }, 752 | { 753 | "type": "SQLite3 Column", 754 | "name": "from_visit" 755 | }, 756 | { 757 | "type": "SQLite3 Column", 758 | "name": "transition" 759 | }, 760 | { 761 | "type": "SQLite3 Column", 762 | "name": "segment_id" 763 | }, 764 | { 765 | "type": "SQLite3 Column", 766 | "name": "visit_duration" 767 | }, 768 | { 769 | "type": "SQLite3 Column", 770 | "name": "incremented_omnibox_typed_score" 771 | } 772 | ] 773 | }, 774 | { 775 | "type": "SQLite3 Table", 776 | "name": "visit_source", 777 | "children": [ 778 | { 779 | "type": "SQLite3 Column", 780 | "name": "id" 781 | }, 782 | { 783 | "type": "SQLite3 Column", 784 | "name": "source" 785 | } 786 | ] 787 | }, 788 | { 789 | "type": "SQLite3 Table", 790 | "name": "keyword_search_terms", 791 | "children": [ 792 | { 793 | "type": "SQLite3 Column", 794 | "name": "keyword_id" 795 | }, 796 | { 797 | "type": "SQLite3 Column", 798 | "name": "url_id" 799 | }, 800 | { 801 | "type": "SQLite3 Column", 802 | "name": "lower_term" 803 | }, 804 | { 805 | "type": "SQLite3 Column", 806 | "name": "term" 807 | } 808 | ] 809 | }, 810 | { 811 | "type": "SQLite3 Table", 812 | "name": "segments", 813 | "children": [ 814 | { 815 | "type": "SQLite3 Column", 816 | "name": "id" 817 | }, 818 | { 819 | "type": "SQLite3 Column", 820 | "name": "name" 821 | }, 822 | { 823 | "type": "SQLite3 Column", 824 | "name": "url_id" 825 | } 826 | ] 827 | }, 828 | { 829 | "type": "SQLite3 Table", 830 | "name": "segment_usage", 831 | "children": [ 832 | { 833 | "type": "SQLite3 Column", 834 | "name": "id" 835 | }, 836 | { 837 | "type": "SQLite3 Column", 838 | "name": "segment_id" 839 | }, 840 | { 841 | "type": "SQLite3 Column", 842 | "name": "time_slot" 843 | }, 844 | { 845 | "type": "SQLite3 Column", 846 | "name": "visit_count" 847 | } 848 | ] 849 | } 850 | ] 851 | }, 852 | { 853 | "type": "unknown", 854 | "name": "History Provider Cache" 855 | }, 856 | { 857 | "type": "directory", 858 | "name": "IndexedDB", 859 | "children": [ 860 | { 861 | "type": "directory", 862 | "name": "https_ntp.msn.com_0.indexeddb.leveldb", 863 | "children": [ 864 | { 865 | "type": "LevelDB Log File", 866 | "name": "000003.log" 867 | }, 868 | { 869 | "type": "LevelDB Current Manifest", 870 | "name": "CURRENT" 871 | }, 872 | { 873 | "type": "empty file", 874 | "name": "LOCK" 875 | }, 876 | { 877 | "type": "LevelDB Info Log", 878 | "name": "LOG" 879 | }, 880 | { 881 | "type": "LevelDB Info Log", 882 | "name": "LOG.old" 883 | }, 884 | { 885 | "type": "LevelDB Manifest", 886 | "name": "MANIFEST-000001" 887 | } 888 | ] 889 | } 890 | ] 891 | }, 892 | { 893 | "type": "empty file", 894 | "name": "LOCK" 895 | }, 896 | { 897 | "type": "LevelDB Info Log", 898 | "name": "LOG" 899 | }, 900 | { 901 | "type": "directory", 902 | "name": "Local Storage", 903 | "children": [ 904 | { 905 | "type": "directory", 906 | "name": "leveldb", 907 | "children": [ 908 | { 909 | "type": "LevelDB Sorted Table File", 910 | "name": "000005.ldb" 911 | }, 912 | { 913 | "type": "LevelDB Sorted Table File", 914 | "name": "000007.ldb" 915 | }, 916 | { 917 | "type": "unknown", 918 | "name": "000009.sst" 919 | }, 920 | { 921 | "type": "empty file", 922 | "name": "000010.log" 923 | }, 924 | { 925 | "type": "LevelDB Current Manifest", 926 | "name": "CURRENT" 927 | }, 928 | { 929 | "type": "empty file", 930 | "name": "LOCK" 931 | }, 932 | { 933 | "type": "LevelDB Info Log", 934 | "name": "LOG" 935 | }, 936 | { 937 | "type": "LevelDB Info Log", 938 | "name": "LOG.old" 939 | }, 940 | { 941 | "type": "LevelDB Manifest", 942 | "name": "MANIFEST-000008" 943 | } 944 | ] 945 | } 946 | ] 947 | }, 948 | { 949 | "type": "SQLite3 database", 950 | "name": "Login Data", 951 | "children": [ 952 | { 953 | "type": "SQLite3 Table", 954 | "name": "meta", 955 | "children": [ 956 | { 957 | "type": "SQLite3 Column", 958 | "name": "key" 959 | }, 960 | { 961 | "type": "SQLite3 Column", 962 | "name": "value" 963 | } 964 | ] 965 | }, 966 | { 967 | "type": "SQLite3 Table", 968 | "name": "logins", 969 | "children": [ 970 | { 971 | "type": "SQLite3 Column", 972 | "name": "origin_url" 973 | }, 974 | { 975 | "type": "SQLite3 Column", 976 | "name": "action_url" 977 | }, 978 | { 979 | "type": "SQLite3 Column", 980 | "name": "username_element" 981 | }, 982 | { 983 | "type": "SQLite3 Column", 984 | "name": "username_value" 985 | }, 986 | { 987 | "type": "SQLite3 Column", 988 | "name": "password_element" 989 | }, 990 | { 991 | "type": "SQLite3 Column", 992 | "name": "password_value" 993 | }, 994 | { 995 | "type": "SQLite3 Column", 996 | "name": "submit_element" 997 | }, 998 | { 999 | "type": "SQLite3 Column", 1000 | "name": "signon_realm" 1001 | }, 1002 | { 1003 | "type": "SQLite3 Column", 1004 | "name": "preferred" 1005 | }, 1006 | { 1007 | "type": "SQLite3 Column", 1008 | "name": "date_created" 1009 | }, 1010 | { 1011 | "type": "SQLite3 Column", 1012 | "name": "blacklisted_by_user" 1013 | }, 1014 | { 1015 | "type": "SQLite3 Column", 1016 | "name": "scheme" 1017 | }, 1018 | { 1019 | "type": "SQLite3 Column", 1020 | "name": "password_type" 1021 | }, 1022 | { 1023 | "type": "SQLite3 Column", 1024 | "name": "times_used" 1025 | }, 1026 | { 1027 | "type": "SQLite3 Column", 1028 | "name": "form_data" 1029 | }, 1030 | { 1031 | "type": "SQLite3 Column", 1032 | "name": "date_synced" 1033 | }, 1034 | { 1035 | "type": "SQLite3 Column", 1036 | "name": "display_name" 1037 | }, 1038 | { 1039 | "type": "SQLite3 Column", 1040 | "name": "icon_url" 1041 | }, 1042 | { 1043 | "type": "SQLite3 Column", 1044 | "name": "federation_url" 1045 | }, 1046 | { 1047 | "type": "SQLite3 Column", 1048 | "name": "skip_zero_click" 1049 | }, 1050 | { 1051 | "type": "SQLite3 Column", 1052 | "name": "generation_upload_status" 1053 | }, 1054 | { 1055 | "type": "SQLite3 Column", 1056 | "name": "possible_username_pairs" 1057 | }, 1058 | { 1059 | "type": "SQLite3 Column", 1060 | "name": "id" 1061 | } 1062 | ] 1063 | }, 1064 | { 1065 | "type": "SQLite3 Table", 1066 | "name": "sync_entities_metadata", 1067 | "children": [ 1068 | { 1069 | "type": "SQLite3 Column", 1070 | "name": "storage_key" 1071 | }, 1072 | { 1073 | "type": "SQLite3 Column", 1074 | "name": "metadata" 1075 | } 1076 | ] 1077 | }, 1078 | { 1079 | "type": "SQLite3 Table", 1080 | "name": "sync_model_metadata", 1081 | "children": [ 1082 | { 1083 | "type": "SQLite3 Column", 1084 | "name": "id" 1085 | }, 1086 | { 1087 | "type": "SQLite3 Column", 1088 | "name": "model_metadata" 1089 | } 1090 | ] 1091 | }, 1092 | { 1093 | "type": "SQLite3 Table", 1094 | "name": "stats", 1095 | "children": [ 1096 | { 1097 | "type": "SQLite3 Column", 1098 | "name": "origin_domain" 1099 | }, 1100 | { 1101 | "type": "SQLite3 Column", 1102 | "name": "username_value" 1103 | }, 1104 | { 1105 | "type": "SQLite3 Column", 1106 | "name": "dismissal_count" 1107 | }, 1108 | { 1109 | "type": "SQLite3 Column", 1110 | "name": "update_time" 1111 | } 1112 | ] 1113 | } 1114 | ] 1115 | }, 1116 | { 1117 | "type": "LevelDB Manifest", 1118 | "name": "MANIFEST-000002" 1119 | }, 1120 | { 1121 | "type": "SQLite3 database", 1122 | "name": "Network Action Predictor", 1123 | "children": [ 1124 | { 1125 | "type": "SQLite3 Table", 1126 | "name": "network_action_predictor", 1127 | "children": [ 1128 | { 1129 | "type": "SQLite3 Column", 1130 | "name": "id" 1131 | }, 1132 | { 1133 | "type": "SQLite3 Column", 1134 | "name": "user_text" 1135 | }, 1136 | { 1137 | "type": "SQLite3 Column", 1138 | "name": "url" 1139 | }, 1140 | { 1141 | "type": "SQLite3 Column", 1142 | "name": "number_of_hits" 1143 | }, 1144 | { 1145 | "type": "SQLite3 Column", 1146 | "name": "number_of_misses" 1147 | } 1148 | ] 1149 | }, 1150 | { 1151 | "type": "SQLite3 Table", 1152 | "name": "resource_prefetch_predictor_metadata", 1153 | "children": [ 1154 | { 1155 | "type": "SQLite3 Column", 1156 | "name": "key" 1157 | }, 1158 | { 1159 | "type": "SQLite3 Column", 1160 | "name": "value" 1161 | } 1162 | ] 1163 | }, 1164 | { 1165 | "type": "SQLite3 Table", 1166 | "name": "resource_prefetch_predictor_host_redirect", 1167 | "children": [ 1168 | { 1169 | "type": "SQLite3 Column", 1170 | "name": "key" 1171 | }, 1172 | { 1173 | "type": "SQLite3 Column", 1174 | "name": "proto" 1175 | } 1176 | ] 1177 | }, 1178 | { 1179 | "type": "SQLite3 Table", 1180 | "name": "resource_prefetch_predictor_origin", 1181 | "children": [ 1182 | { 1183 | "type": "SQLite3 Column", 1184 | "name": "key" 1185 | }, 1186 | { 1187 | "type": "SQLite3 Column", 1188 | "name": "proto" 1189 | } 1190 | ] 1191 | } 1192 | ] 1193 | }, 1194 | { 1195 | "type": "JSON", 1196 | "name": "Network Persistent State" 1197 | }, 1198 | { 1199 | "type": "directory", 1200 | "name": "Platform Notifications", 1201 | "children": [ 1202 | { 1203 | "type": "empty file", 1204 | "name": "000003.log" 1205 | }, 1206 | { 1207 | "type": "LevelDB Current Manifest", 1208 | "name": "CURRENT" 1209 | }, 1210 | { 1211 | "type": "empty file", 1212 | "name": "LOCK" 1213 | }, 1214 | { 1215 | "type": "LevelDB Info Log", 1216 | "name": "LOG" 1217 | }, 1218 | { 1219 | "type": "LevelDB Manifest", 1220 | "name": "MANIFEST-000001" 1221 | } 1222 | ] 1223 | }, 1224 | { 1225 | "type": "JSON", 1226 | "name": "Preferences" 1227 | }, 1228 | { 1229 | "type": "SQLite3 database", 1230 | "name": "QuotaManager", 1231 | "children": [ 1232 | { 1233 | "type": "SQLite3 Table", 1234 | "name": "meta", 1235 | "children": [ 1236 | { 1237 | "type": "SQLite3 Column", 1238 | "name": "key" 1239 | }, 1240 | { 1241 | "type": "SQLite3 Column", 1242 | "name": "value" 1243 | } 1244 | ] 1245 | }, 1246 | { 1247 | "type": "SQLite3 Table", 1248 | "name": "HostQuotaTable", 1249 | "children": [ 1250 | { 1251 | "type": "SQLite3 Column", 1252 | "name": "host" 1253 | }, 1254 | { 1255 | "type": "SQLite3 Column", 1256 | "name": "type" 1257 | }, 1258 | { 1259 | "type": "SQLite3 Column", 1260 | "name": "quota" 1261 | } 1262 | ] 1263 | }, 1264 | { 1265 | "type": "SQLite3 Table", 1266 | "name": "OriginInfoTable", 1267 | "children": [ 1268 | { 1269 | "type": "SQLite3 Column", 1270 | "name": "origin" 1271 | }, 1272 | { 1273 | "type": "SQLite3 Column", 1274 | "name": "type" 1275 | }, 1276 | { 1277 | "type": "SQLite3 Column", 1278 | "name": "used_count" 1279 | }, 1280 | { 1281 | "type": "SQLite3 Column", 1282 | "name": "last_access_time" 1283 | }, 1284 | { 1285 | "type": "SQLite3 Column", 1286 | "name": "last_modified_time" 1287 | } 1288 | ] 1289 | }, 1290 | { 1291 | "type": "SQLite3 Table", 1292 | "name": "EvictionInfoTable", 1293 | "children": [ 1294 | { 1295 | "type": "SQLite3 Column", 1296 | "name": "origin" 1297 | }, 1298 | { 1299 | "type": "SQLite3 Column", 1300 | "name": "type" 1301 | }, 1302 | { 1303 | "type": "SQLite3 Column", 1304 | "name": "last_eviction_time" 1305 | } 1306 | ] 1307 | } 1308 | ] 1309 | }, 1310 | { 1311 | "type": "unknown", 1312 | "name": "README" 1313 | }, 1314 | { 1315 | "type": "JSON", 1316 | "name": "Secure Preferences" 1317 | }, 1318 | { 1319 | "type": "directory", 1320 | "name": "Service Worker", 1321 | "children": [ 1322 | { 1323 | "type": "directory", 1324 | "name": "CacheStorage", 1325 | "children": [ 1326 | { 1327 | "type": "directory", 1328 | "name": "3cedfb74d44f2e84198d23075aef16c34a668ceb", 1329 | "children": [ 1330 | { 1331 | "type": "directory", 1332 | "name": "a20c8c49-bf9a-4f8a-b4eb-f58d51b4857a", 1333 | "children": [ 1334 | { 1335 | "type": "Simple Cache Entry v5", 1336 | "name": "026bc0a752af4708_0" 1337 | }, 1338 | { 1339 | "type": "Simple Cache Entry v5", 1340 | "name": "026bc0a752af4708_1" 1341 | }, 1342 | { 1343 | "type": "Simple Cache Entry v5", 1344 | "name": "1c6e1cc8d1f2ce75_0" 1345 | }, 1346 | { 1347 | "type": "Simple Cache Entry v5", 1348 | "name": "1c6e1cc8d1f2ce75_1" 1349 | }, 1350 | { 1351 | "type": "Simple Cache Entry v5", 1352 | "name": "300ea242779d5cb1_0" 1353 | }, 1354 | { 1355 | "type": "Simple Cache Entry v5", 1356 | "name": "31297cdd5a81ba44_0" 1357 | }, 1358 | { 1359 | "type": "Simple Cache Entry v5", 1360 | "name": "3c5be6920b706dee_0" 1361 | }, 1362 | { 1363 | "type": "Simple Cache Entry v5", 1364 | "name": "46a7c9d57a04a0ba_0" 1365 | }, 1366 | { 1367 | "type": "Simple Cache Entry v5", 1368 | "name": "4700df71907496b4_0" 1369 | }, 1370 | { 1371 | "type": "Simple Cache Entry v5", 1372 | "name": "4a55b16858b02a39_0" 1373 | }, 1374 | { 1375 | "type": "Simple Cache Entry v5", 1376 | "name": "4b731e561a93f571_0" 1377 | }, 1378 | { 1379 | "type": "Simple Cache Entry v5", 1380 | "name": "5096818b23bb234c_0" 1381 | }, 1382 | { 1383 | "type": "Simple Cache Entry v5", 1384 | "name": "54f980c88cfe79c9_0" 1385 | }, 1386 | { 1387 | "type": "Simple Cache Entry v5", 1388 | "name": "6e29a411a4b61e2c_0" 1389 | }, 1390 | { 1391 | "type": "Simple Cache Entry v5", 1392 | "name": "6fa062957b1ebd6e_0" 1393 | }, 1394 | { 1395 | "type": "Simple Cache Entry v5", 1396 | "name": "76b705c04485d5f8_0" 1397 | }, 1398 | { 1399 | "type": "Simple Cache Entry v5", 1400 | "name": "ba6c5ea31a5acd96_0" 1401 | }, 1402 | { 1403 | "type": "Simple Cache Entry v5", 1404 | "name": "d2533f5e5737f012_0" 1405 | }, 1406 | { 1407 | "type": "Simple Cache Entry v5", 1408 | "name": "d7be50355a896f12_0" 1409 | }, 1410 | { 1411 | "type": "Simple Cache Entry v5", 1412 | "name": "ee2f5652533d9473_0" 1413 | }, 1414 | { 1415 | "type": "Simple Cache Entry v5", 1416 | "name": "f618e09cc2508ade_0" 1417 | }, 1418 | { 1419 | "type": "Simple Cache Entry v5", 1420 | "name": "f618e09cc2508ade_1" 1421 | }, 1422 | { 1423 | "type": "Simple Cache Entry v5", 1424 | "name": "f92528632505cb20_0" 1425 | }, 1426 | { 1427 | "type": "Simple Cache Entry v9", 1428 | "name": "index" 1429 | }, 1430 | { 1431 | "type": "directory", 1432 | "name": "index-dir", 1433 | "children": [ 1434 | { 1435 | "type": "unknown", 1436 | "name": "the-real-index" 1437 | } 1438 | ] 1439 | } 1440 | ] 1441 | }, 1442 | { 1443 | "type": "unknown", 1444 | "name": "index.txt" 1445 | } 1446 | ] 1447 | } 1448 | ] 1449 | }, 1450 | { 1451 | "type": "directory", 1452 | "name": "Database", 1453 | "children": [ 1454 | { 1455 | "type": "LevelDB Log File", 1456 | "name": "000003.log" 1457 | }, 1458 | { 1459 | "type": "LevelDB Current Manifest", 1460 | "name": "CURRENT" 1461 | }, 1462 | { 1463 | "type": "empty file", 1464 | "name": "LOCK" 1465 | }, 1466 | { 1467 | "type": "LevelDB Info Log", 1468 | "name": "LOG" 1469 | }, 1470 | { 1471 | "type": "LevelDB Manifest", 1472 | "name": "MANIFEST-000001" 1473 | } 1474 | ] 1475 | }, 1476 | { 1477 | "type": "directory", 1478 | "name": "ScriptCache", 1479 | "children": [ 1480 | { 1481 | "type": "Simple Cache Entry v5", 1482 | "name": "4cb013792b196a35_0" 1483 | }, 1484 | { 1485 | "type": "Simple Cache Entry v5", 1486 | "name": "4cb013792b196a35_1" 1487 | }, 1488 | { 1489 | "type": "Simple Cache Entry v5", 1490 | "name": "fa813c9ad67834ac_0" 1491 | }, 1492 | { 1493 | "type": "Simple Cache Entry v5", 1494 | "name": "fa813c9ad67834ac_1" 1495 | }, 1496 | { 1497 | "type": "Simple Cache Entry v9", 1498 | "name": "index" 1499 | }, 1500 | { 1501 | "type": "directory", 1502 | "name": "index-dir", 1503 | "children": [ 1504 | { 1505 | "type": "unknown", 1506 | "name": "the-real-index" 1507 | } 1508 | ] 1509 | } 1510 | ] 1511 | } 1512 | ] 1513 | }, 1514 | { 1515 | "type": "directory", 1516 | "name": "Session Storage", 1517 | "children": [ 1518 | { 1519 | "type": "LevelDB Log File", 1520 | "name": "000004.log" 1521 | }, 1522 | { 1523 | "type": "LevelDB Sorted Table File", 1524 | "name": "000005.ldb" 1525 | }, 1526 | { 1527 | "type": "LevelDB Current Manifest", 1528 | "name": "CURRENT" 1529 | }, 1530 | { 1531 | "type": "empty file", 1532 | "name": "LOCK" 1533 | }, 1534 | { 1535 | "type": "LevelDB Info Log", 1536 | "name": "LOG" 1537 | }, 1538 | { 1539 | "type": "LevelDB Manifest", 1540 | "name": "MANIFEST-000001" 1541 | } 1542 | ] 1543 | }, 1544 | { 1545 | "type": "SQLite3 database", 1546 | "name": "Shortcuts", 1547 | "children": [ 1548 | { 1549 | "type": "SQLite3 Table", 1550 | "name": "omni_box_shortcuts", 1551 | "children": [ 1552 | { 1553 | "type": "SQLite3 Column", 1554 | "name": "id" 1555 | }, 1556 | { 1557 | "type": "SQLite3 Column", 1558 | "name": "text" 1559 | }, 1560 | { 1561 | "type": "SQLite3 Column", 1562 | "name": "fill_into_edit" 1563 | }, 1564 | { 1565 | "type": "SQLite3 Column", 1566 | "name": "url" 1567 | }, 1568 | { 1569 | "type": "SQLite3 Column", 1570 | "name": "contents" 1571 | }, 1572 | { 1573 | "type": "SQLite3 Column", 1574 | "name": "contents_class" 1575 | }, 1576 | { 1577 | "type": "SQLite3 Column", 1578 | "name": "description" 1579 | }, 1580 | { 1581 | "type": "SQLite3 Column", 1582 | "name": "description_class" 1583 | }, 1584 | { 1585 | "type": "SQLite3 Column", 1586 | "name": "transition" 1587 | }, 1588 | { 1589 | "type": "SQLite3 Column", 1590 | "name": "type" 1591 | }, 1592 | { 1593 | "type": "SQLite3 Column", 1594 | "name": "keyword" 1595 | }, 1596 | { 1597 | "type": "SQLite3 Column", 1598 | "name": "last_access_time" 1599 | }, 1600 | { 1601 | "type": "SQLite3 Column", 1602 | "name": "number_of_hits" 1603 | } 1604 | ] 1605 | } 1606 | ] 1607 | }, 1608 | { 1609 | "type": "directory", 1610 | "name": "Site Characteristics Database", 1611 | "children": [ 1612 | { 1613 | "type": "LevelDB Log File", 1614 | "name": "000003.log" 1615 | }, 1616 | { 1617 | "type": "LevelDB Current Manifest", 1618 | "name": "CURRENT" 1619 | }, 1620 | { 1621 | "type": "empty file", 1622 | "name": "LOCK" 1623 | }, 1624 | { 1625 | "type": "LevelDB Info Log", 1626 | "name": "LOG" 1627 | }, 1628 | { 1629 | "type": "LevelDB Manifest", 1630 | "name": "MANIFEST-000001" 1631 | } 1632 | ] 1633 | }, 1634 | { 1635 | "type": "directory", 1636 | "name": "Storage", 1637 | "children": [ 1638 | { 1639 | "type": "directory", 1640 | "name": "ext", 1641 | "children": [ 1642 | { 1643 | "type": "directory", 1644 | "name": "ihmafllikibpmigkcoadcmckbfhibefp", 1645 | "children": [ 1646 | { 1647 | "type": "directory", 1648 | "name": "def", 1649 | "children": [ 1650 | { 1651 | "type": "directory", 1652 | "name": "Code Cache", 1653 | "children": [ 1654 | { 1655 | "type": "directory", 1656 | "name": "js", 1657 | "children": [ 1658 | { 1659 | "type": "Simple Cache Entry v9", 1660 | "name": "index" 1661 | }, 1662 | { 1663 | "type": "directory", 1664 | "name": "index-dir", 1665 | "children": [ 1666 | { 1667 | "type": "unknown", 1668 | "name": "the-real-index" 1669 | } 1670 | ] 1671 | } 1672 | ] 1673 | } 1674 | ] 1675 | }, 1676 | { 1677 | "type": "directory", 1678 | "name": "GPUCache", 1679 | "children": [ 1680 | { 1681 | "type": "Chrome Data Block v2.0", 1682 | "name": "data_0" 1683 | }, 1684 | { 1685 | "type": "Chrome Data Block v2.0", 1686 | "name": "data_1" 1687 | }, 1688 | { 1689 | "type": "Chrome Data Block v2.0", 1690 | "name": "data_2" 1691 | }, 1692 | { 1693 | "type": "Chrome Data Block v2.0", 1694 | "name": "data_3" 1695 | }, 1696 | { 1697 | "type": "Chrome Index v2.0", 1698 | "name": "index" 1699 | } 1700 | ] 1701 | }, 1702 | { 1703 | "type": "JSON", 1704 | "name": "Network Persistent State" 1705 | }, 1706 | { 1707 | "type": "directory", 1708 | "name": "Platform Notifications", 1709 | "children": [ 1710 | { 1711 | "type": "empty file", 1712 | "name": "000003.log" 1713 | }, 1714 | { 1715 | "type": "LevelDB Current Manifest", 1716 | "name": "CURRENT" 1717 | }, 1718 | { 1719 | "type": "empty file", 1720 | "name": "LOCK" 1721 | }, 1722 | { 1723 | "type": "LevelDB Info Log", 1724 | "name": "LOG" 1725 | }, 1726 | { 1727 | "type": "LevelDB Manifest", 1728 | "name": "MANIFEST-000001" 1729 | } 1730 | ] 1731 | } 1732 | ] 1733 | } 1734 | ] 1735 | } 1736 | ] 1737 | } 1738 | ] 1739 | }, 1740 | { 1741 | "type": "directory", 1742 | "name": "Sync Data", 1743 | "children": [ 1744 | { 1745 | "type": "directory", 1746 | "name": "LevelDB", 1747 | "children": [ 1748 | { 1749 | "type": "LevelDB Log File", 1750 | "name": "000003.log" 1751 | }, 1752 | { 1753 | "type": "LevelDB Current Manifest", 1754 | "name": "CURRENT" 1755 | }, 1756 | { 1757 | "type": "empty file", 1758 | "name": "LOCK" 1759 | }, 1760 | { 1761 | "type": "LevelDB Info Log", 1762 | "name": "LOG" 1763 | }, 1764 | { 1765 | "type": "LevelDB Manifest", 1766 | "name": "MANIFEST-000001" 1767 | } 1768 | ] 1769 | } 1770 | ] 1771 | }, 1772 | { 1773 | "type": "SQLite3 database", 1774 | "name": "Top Sites", 1775 | "children": [ 1776 | { 1777 | "type": "SQLite3 Table", 1778 | "name": "meta", 1779 | "children": [ 1780 | { 1781 | "type": "SQLite3 Column", 1782 | "name": "key" 1783 | }, 1784 | { 1785 | "type": "SQLite3 Column", 1786 | "name": "value" 1787 | } 1788 | ] 1789 | }, 1790 | { 1791 | "type": "SQLite3 Table", 1792 | "name": "top_sites", 1793 | "children": [ 1794 | { 1795 | "type": "SQLite3 Column", 1796 | "name": "url" 1797 | }, 1798 | { 1799 | "type": "SQLite3 Column", 1800 | "name": "url_rank" 1801 | }, 1802 | { 1803 | "type": "SQLite3 Column", 1804 | "name": "title" 1805 | }, 1806 | { 1807 | "type": "SQLite3 Column", 1808 | "name": "redirects" 1809 | } 1810 | ] 1811 | } 1812 | ] 1813 | }, 1814 | { 1815 | "type": "JSON", 1816 | "name": "TransportSecurity" 1817 | }, 1818 | { 1819 | "type": "directory", 1820 | "name": "VideoDecodeStats", 1821 | "children": [ 1822 | { 1823 | "type": "LevelDB Log File", 1824 | "name": "000003.log" 1825 | }, 1826 | { 1827 | "type": "LevelDB Current Manifest", 1828 | "name": "CURRENT" 1829 | }, 1830 | { 1831 | "type": "empty file", 1832 | "name": "LOCK" 1833 | }, 1834 | { 1835 | "type": "LevelDB Info Log", 1836 | "name": "LOG" 1837 | }, 1838 | { 1839 | "type": "LevelDB Manifest", 1840 | "name": "MANIFEST-000001" 1841 | } 1842 | ] 1843 | }, 1844 | { 1845 | "type": "Chrome Visited Links", 1846 | "name": "Visited Links" 1847 | }, 1848 | { 1849 | "type": "SQLite3 database", 1850 | "name": "Web Data", 1851 | "children": [ 1852 | { 1853 | "type": "SQLite3 Table", 1854 | "name": "meta", 1855 | "children": [ 1856 | { 1857 | "type": "SQLite3 Column", 1858 | "name": "key" 1859 | }, 1860 | { 1861 | "type": "SQLite3 Column", 1862 | "name": "value" 1863 | } 1864 | ] 1865 | }, 1866 | { 1867 | "type": "SQLite3 Table", 1868 | "name": "autofill", 1869 | "children": [ 1870 | { 1871 | "type": "SQLite3 Column", 1872 | "name": "guid" 1873 | }, 1874 | { 1875 | "type": "SQLite3 Column", 1876 | "name": "name" 1877 | }, 1878 | { 1879 | "type": "SQLite3 Column", 1880 | "name": "value" 1881 | }, 1882 | { 1883 | "type": "SQLite3 Column", 1884 | "name": "value_lower" 1885 | }, 1886 | { 1887 | "type": "SQLite3 Column", 1888 | "name": "date_created" 1889 | }, 1890 | { 1891 | "type": "SQLite3 Column", 1892 | "name": "date_last_used" 1893 | }, 1894 | { 1895 | "type": "SQLite3 Column", 1896 | "name": "count" 1897 | } 1898 | ] 1899 | }, 1900 | { 1901 | "type": "SQLite3 Table", 1902 | "name": "credit_cards", 1903 | "children": [ 1904 | { 1905 | "type": "SQLite3 Column", 1906 | "name": "guid" 1907 | }, 1908 | { 1909 | "type": "SQLite3 Column", 1910 | "name": "name_on_card" 1911 | }, 1912 | { 1913 | "type": "SQLite3 Column", 1914 | "name": "expiration_month" 1915 | }, 1916 | { 1917 | "type": "SQLite3 Column", 1918 | "name": "expiration_year" 1919 | }, 1920 | { 1921 | "type": "SQLite3 Column", 1922 | "name": "card_number_encrypted" 1923 | }, 1924 | { 1925 | "type": "SQLite3 Column", 1926 | "name": "date_modified" 1927 | }, 1928 | { 1929 | "type": "SQLite3 Column", 1930 | "name": "origin" 1931 | }, 1932 | { 1933 | "type": "SQLite3 Column", 1934 | "name": "use_count" 1935 | }, 1936 | { 1937 | "type": "SQLite3 Column", 1938 | "name": "use_date" 1939 | }, 1940 | { 1941 | "type": "SQLite3 Column", 1942 | "name": "billing_address_id" 1943 | } 1944 | ] 1945 | }, 1946 | { 1947 | "type": "SQLite3 Table", 1948 | "name": "autofill_profiles", 1949 | "children": [ 1950 | { 1951 | "type": "SQLite3 Column", 1952 | "name": "guid" 1953 | }, 1954 | { 1955 | "type": "SQLite3 Column", 1956 | "name": "company_name" 1957 | }, 1958 | { 1959 | "type": "SQLite3 Column", 1960 | "name": "street_address" 1961 | }, 1962 | { 1963 | "type": "SQLite3 Column", 1964 | "name": "dependent_locality" 1965 | }, 1966 | { 1967 | "type": "SQLite3 Column", 1968 | "name": "city" 1969 | }, 1970 | { 1971 | "type": "SQLite3 Column", 1972 | "name": "state" 1973 | }, 1974 | { 1975 | "type": "SQLite3 Column", 1976 | "name": "zipcode" 1977 | }, 1978 | { 1979 | "type": "SQLite3 Column", 1980 | "name": "sorting_code" 1981 | }, 1982 | { 1983 | "type": "SQLite3 Column", 1984 | "name": "country_code" 1985 | }, 1986 | { 1987 | "type": "SQLite3 Column", 1988 | "name": "date_modified" 1989 | }, 1990 | { 1991 | "type": "SQLite3 Column", 1992 | "name": "origin" 1993 | }, 1994 | { 1995 | "type": "SQLite3 Column", 1996 | "name": "language_code" 1997 | }, 1998 | { 1999 | "type": "SQLite3 Column", 2000 | "name": "use_count" 2001 | }, 2002 | { 2003 | "type": "SQLite3 Column", 2004 | "name": "use_date" 2005 | }, 2006 | { 2007 | "type": "SQLite3 Column", 2008 | "name": "validity_bitfield" 2009 | }, 2010 | { 2011 | "type": "SQLite3 Column", 2012 | "name": "is_client_validity_states_updated" 2013 | } 2014 | ] 2015 | }, 2016 | { 2017 | "type": "SQLite3 Table", 2018 | "name": "autofill_profile_names", 2019 | "children": [ 2020 | { 2021 | "type": "SQLite3 Column", 2022 | "name": "guid" 2023 | }, 2024 | { 2025 | "type": "SQLite3 Column", 2026 | "name": "first_name" 2027 | }, 2028 | { 2029 | "type": "SQLite3 Column", 2030 | "name": "middle_name" 2031 | }, 2032 | { 2033 | "type": "SQLite3 Column", 2034 | "name": "last_name" 2035 | }, 2036 | { 2037 | "type": "SQLite3 Column", 2038 | "name": "full_name" 2039 | } 2040 | ] 2041 | }, 2042 | { 2043 | "type": "SQLite3 Table", 2044 | "name": "autofill_profile_emails", 2045 | "children": [ 2046 | { 2047 | "type": "SQLite3 Column", 2048 | "name": "guid" 2049 | }, 2050 | { 2051 | "type": "SQLite3 Column", 2052 | "name": "email" 2053 | } 2054 | ] 2055 | }, 2056 | { 2057 | "type": "SQLite3 Table", 2058 | "name": "autofill_profile_phones", 2059 | "children": [ 2060 | { 2061 | "type": "SQLite3 Column", 2062 | "name": "guid" 2063 | }, 2064 | { 2065 | "type": "SQLite3 Column", 2066 | "name": "number" 2067 | } 2068 | ] 2069 | }, 2070 | { 2071 | "type": "SQLite3 Table", 2072 | "name": "autofill_profiles_trash", 2073 | "children": [ 2074 | { 2075 | "type": "SQLite3 Column", 2076 | "name": "guid" 2077 | } 2078 | ] 2079 | }, 2080 | { 2081 | "type": "SQLite3 Table", 2082 | "name": "masked_credit_cards", 2083 | "children": [ 2084 | { 2085 | "type": "SQLite3 Column", 2086 | "name": "id" 2087 | }, 2088 | { 2089 | "type": "SQLite3 Column", 2090 | "name": "status" 2091 | }, 2092 | { 2093 | "type": "SQLite3 Column", 2094 | "name": "name_on_card" 2095 | }, 2096 | { 2097 | "type": "SQLite3 Column", 2098 | "name": "network" 2099 | }, 2100 | { 2101 | "type": "SQLite3 Column", 2102 | "name": "last_four" 2103 | }, 2104 | { 2105 | "type": "SQLite3 Column", 2106 | "name": "exp_month" 2107 | }, 2108 | { 2109 | "type": "SQLite3 Column", 2110 | "name": "exp_year" 2111 | }, 2112 | { 2113 | "type": "SQLite3 Column", 2114 | "name": "bank_name" 2115 | }, 2116 | { 2117 | "type": "SQLite3 Column", 2118 | "name": "type" 2119 | } 2120 | ] 2121 | }, 2122 | { 2123 | "type": "SQLite3 Table", 2124 | "name": "unmasked_credit_cards", 2125 | "children": [ 2126 | { 2127 | "type": "SQLite3 Column", 2128 | "name": "id" 2129 | }, 2130 | { 2131 | "type": "SQLite3 Column", 2132 | "name": "card_number_encrypted" 2133 | }, 2134 | { 2135 | "type": "SQLite3 Column", 2136 | "name": "use_count" 2137 | }, 2138 | { 2139 | "type": "SQLite3 Column", 2140 | "name": "use_date" 2141 | }, 2142 | { 2143 | "type": "SQLite3 Column", 2144 | "name": "unmask_date" 2145 | } 2146 | ] 2147 | }, 2148 | { 2149 | "type": "SQLite3 Table", 2150 | "name": "server_card_metadata", 2151 | "children": [ 2152 | { 2153 | "type": "SQLite3 Column", 2154 | "name": "id" 2155 | }, 2156 | { 2157 | "type": "SQLite3 Column", 2158 | "name": "use_count" 2159 | }, 2160 | { 2161 | "type": "SQLite3 Column", 2162 | "name": "use_date" 2163 | }, 2164 | { 2165 | "type": "SQLite3 Column", 2166 | "name": "billing_address_id" 2167 | } 2168 | ] 2169 | }, 2170 | { 2171 | "type": "SQLite3 Table", 2172 | "name": "server_addresses", 2173 | "children": [ 2174 | { 2175 | "type": "SQLite3 Column", 2176 | "name": "id" 2177 | }, 2178 | { 2179 | "type": "SQLite3 Column", 2180 | "name": "company_name" 2181 | }, 2182 | { 2183 | "type": "SQLite3 Column", 2184 | "name": "street_address" 2185 | }, 2186 | { 2187 | "type": "SQLite3 Column", 2188 | "name": "address_1" 2189 | }, 2190 | { 2191 | "type": "SQLite3 Column", 2192 | "name": "address_2" 2193 | }, 2194 | { 2195 | "type": "SQLite3 Column", 2196 | "name": "address_3" 2197 | }, 2198 | { 2199 | "type": "SQLite3 Column", 2200 | "name": "address_4" 2201 | }, 2202 | { 2203 | "type": "SQLite3 Column", 2204 | "name": "postal_code" 2205 | }, 2206 | { 2207 | "type": "SQLite3 Column", 2208 | "name": "sorting_code" 2209 | }, 2210 | { 2211 | "type": "SQLite3 Column", 2212 | "name": "country_code" 2213 | }, 2214 | { 2215 | "type": "SQLite3 Column", 2216 | "name": "language_code" 2217 | }, 2218 | { 2219 | "type": "SQLite3 Column", 2220 | "name": "recipient_name" 2221 | }, 2222 | { 2223 | "type": "SQLite3 Column", 2224 | "name": "phone_number" 2225 | } 2226 | ] 2227 | }, 2228 | { 2229 | "type": "SQLite3 Table", 2230 | "name": "server_address_metadata", 2231 | "children": [ 2232 | { 2233 | "type": "SQLite3 Column", 2234 | "name": "id" 2235 | }, 2236 | { 2237 | "type": "SQLite3 Column", 2238 | "name": "use_count" 2239 | }, 2240 | { 2241 | "type": "SQLite3 Column", 2242 | "name": "use_date" 2243 | }, 2244 | { 2245 | "type": "SQLite3 Column", 2246 | "name": "has_converted" 2247 | } 2248 | ] 2249 | }, 2250 | { 2251 | "type": "SQLite3 Table", 2252 | "name": "autofill_sync_metadata", 2253 | "children": [ 2254 | { 2255 | "type": "SQLite3 Column", 2256 | "name": "model_type" 2257 | }, 2258 | { 2259 | "type": "SQLite3 Column", 2260 | "name": "storage_key" 2261 | }, 2262 | { 2263 | "type": "SQLite3 Column", 2264 | "name": "value" 2265 | } 2266 | ] 2267 | }, 2268 | { 2269 | "type": "SQLite3 Table", 2270 | "name": "autofill_model_type_state", 2271 | "children": [ 2272 | { 2273 | "type": "SQLite3 Column", 2274 | "name": "model_type" 2275 | }, 2276 | { 2277 | "type": "SQLite3 Column", 2278 | "name": "value" 2279 | } 2280 | ] 2281 | }, 2282 | { 2283 | "type": "SQLite3 Table", 2284 | "name": "payments_customer_data", 2285 | "children": [ 2286 | { 2287 | "type": "SQLite3 Column", 2288 | "name": "customer_id" 2289 | } 2290 | ] 2291 | }, 2292 | { 2293 | "type": "SQLite3 Table", 2294 | "name": "keywords", 2295 | "children": [ 2296 | { 2297 | "type": "SQLite3 Column", 2298 | "name": "id" 2299 | }, 2300 | { 2301 | "type": "SQLite3 Column", 2302 | "name": "short_name" 2303 | }, 2304 | { 2305 | "type": "SQLite3 Column", 2306 | "name": "keyword" 2307 | }, 2308 | { 2309 | "type": "SQLite3 Column", 2310 | "name": "favicon_url" 2311 | }, 2312 | { 2313 | "type": "SQLite3 Column", 2314 | "name": "url" 2315 | }, 2316 | { 2317 | "type": "SQLite3 Column", 2318 | "name": "safe_for_autoreplace" 2319 | }, 2320 | { 2321 | "type": "SQLite3 Column", 2322 | "name": "originating_url" 2323 | }, 2324 | { 2325 | "type": "SQLite3 Column", 2326 | "name": "date_created" 2327 | }, 2328 | { 2329 | "type": "SQLite3 Column", 2330 | "name": "usage_count" 2331 | }, 2332 | { 2333 | "type": "SQLite3 Column", 2334 | "name": "input_encodings" 2335 | }, 2336 | { 2337 | "type": "SQLite3 Column", 2338 | "name": "suggest_url" 2339 | }, 2340 | { 2341 | "type": "SQLite3 Column", 2342 | "name": "prepopulate_id" 2343 | }, 2344 | { 2345 | "type": "SQLite3 Column", 2346 | "name": "created_by_policy" 2347 | }, 2348 | { 2349 | "type": "SQLite3 Column", 2350 | "name": "last_modified" 2351 | }, 2352 | { 2353 | "type": "SQLite3 Column", 2354 | "name": "sync_guid" 2355 | }, 2356 | { 2357 | "type": "SQLite3 Column", 2358 | "name": "alternate_urls" 2359 | }, 2360 | { 2361 | "type": "SQLite3 Column", 2362 | "name": "image_url" 2363 | }, 2364 | { 2365 | "type": "SQLite3 Column", 2366 | "name": "search_url_post_params" 2367 | }, 2368 | { 2369 | "type": "SQLite3 Column", 2370 | "name": "suggest_url_post_params" 2371 | }, 2372 | { 2373 | "type": "SQLite3 Column", 2374 | "name": "image_url_post_params" 2375 | }, 2376 | { 2377 | "type": "SQLite3 Column", 2378 | "name": "new_tab_url" 2379 | }, 2380 | { 2381 | "type": "SQLite3 Column", 2382 | "name": "last_visited" 2383 | } 2384 | ] 2385 | }, 2386 | { 2387 | "type": "SQLite3 Table", 2388 | "name": "payment_method_manifest", 2389 | "children": [ 2390 | { 2391 | "type": "SQLite3 Column", 2392 | "name": "expire_date" 2393 | }, 2394 | { 2395 | "type": "SQLite3 Column", 2396 | "name": "method_name" 2397 | }, 2398 | { 2399 | "type": "SQLite3 Column", 2400 | "name": "web_app_id" 2401 | } 2402 | ] 2403 | }, 2404 | { 2405 | "type": "SQLite3 Table", 2406 | "name": "web_app_manifest_section", 2407 | "children": [ 2408 | { 2409 | "type": "SQLite3 Column", 2410 | "name": "expire_date" 2411 | }, 2412 | { 2413 | "type": "SQLite3 Column", 2414 | "name": "id" 2415 | }, 2416 | { 2417 | "type": "SQLite3 Column", 2418 | "name": "min_version" 2419 | }, 2420 | { 2421 | "type": "SQLite3 Column", 2422 | "name": "fingerprints" 2423 | } 2424 | ] 2425 | }, 2426 | { 2427 | "type": "SQLite3 Table", 2428 | "name": "token_service", 2429 | "children": [ 2430 | { 2431 | "type": "SQLite3 Column", 2432 | "name": "service" 2433 | }, 2434 | { 2435 | "type": "SQLite3 Column", 2436 | "name": "encrypted_token" 2437 | } 2438 | ] 2439 | } 2440 | ] 2441 | }, 2442 | { 2443 | "type": "directory", 2444 | "name": "blob_storage", 2445 | "children": [ 2446 | { 2447 | "type": "directory", 2448 | "name": "3dde1771-bc37-44ae-9d2b-967ba6ef5e8a", 2449 | "children": [] 2450 | } 2451 | ] 2452 | }, 2453 | { 2454 | "type": "directory", 2455 | "name": "data_reduction_proxy_leveldb", 2456 | "children": [ 2457 | { 2458 | "type": "empty file", 2459 | "name": "000003.log" 2460 | }, 2461 | { 2462 | "type": "LevelDB Current Manifest", 2463 | "name": "CURRENT" 2464 | }, 2465 | { 2466 | "type": "empty file", 2467 | "name": "LOCK" 2468 | }, 2469 | { 2470 | "type": "LevelDB Info Log", 2471 | "name": "LOG" 2472 | }, 2473 | { 2474 | "type": "LevelDB Manifest", 2475 | "name": "MANIFEST-000002" 2476 | } 2477 | ] 2478 | }, 2479 | { 2480 | "type": "directory", 2481 | "name": "databases", 2482 | "children": [ 2483 | { 2484 | "type": "SQLite database file", 2485 | "name": "Databases.db", 2486 | "children": [ 2487 | { 2488 | "type": "SQLite3 Table", 2489 | "name": "meta", 2490 | "children": [ 2491 | { 2492 | "type": "SQLite3 Column", 2493 | "name": "key" 2494 | }, 2495 | { 2496 | "type": "SQLite3 Column", 2497 | "name": "value" 2498 | } 2499 | ] 2500 | }, 2501 | { 2502 | "type": "SQLite3 Table", 2503 | "name": "Databases", 2504 | "children": [ 2505 | { 2506 | "type": "SQLite3 Column", 2507 | "name": "id" 2508 | }, 2509 | { 2510 | "type": "SQLite3 Column", 2511 | "name": "origin" 2512 | }, 2513 | { 2514 | "type": "SQLite3 Column", 2515 | "name": "name" 2516 | }, 2517 | { 2518 | "type": "SQLite3 Column", 2519 | "name": "description" 2520 | }, 2521 | { 2522 | "type": "SQLite3 Column", 2523 | "name": "estimated_size" 2524 | } 2525 | ] 2526 | }, 2527 | { 2528 | "type": "SQLite3 Table", 2529 | "name": "sqlite_sequence", 2530 | "children": [ 2531 | { 2532 | "type": "SQLite3 Column", 2533 | "name": "name" 2534 | }, 2535 | { 2536 | "type": "SQLite3 Column", 2537 | "name": "seq" 2538 | } 2539 | ] 2540 | } 2541 | ] 2542 | } 2543 | ] 2544 | }, 2545 | { 2546 | "type": "SQLite database file", 2547 | "name": "page_load_capping_opt_out.db", 2548 | "children": [ 2549 | { 2550 | "type": "SQLite3 Table", 2551 | "name": "previews_v1", 2552 | "children": [ 2553 | { 2554 | "type": "SQLite3 Column", 2555 | "name": "host_name" 2556 | }, 2557 | { 2558 | "type": "SQLite3 Column", 2559 | "name": "time" 2560 | }, 2561 | { 2562 | "type": "SQLite3 Column", 2563 | "name": "opt_out" 2564 | }, 2565 | { 2566 | "type": "SQLite3 Column", 2567 | "name": "type" 2568 | } 2569 | ] 2570 | }, 2571 | { 2572 | "type": "SQLite3 Table", 2573 | "name": "enabled_previews_v1", 2574 | "children": [ 2575 | { 2576 | "type": "SQLite3 Column", 2577 | "name": "type" 2578 | }, 2579 | { 2580 | "type": "SQLite3 Column", 2581 | "name": "version" 2582 | } 2583 | ] 2584 | } 2585 | ] 2586 | }, 2587 | { 2588 | "type": "SQLite database file", 2589 | "name": "previews_opt_out.db", 2590 | "children": [ 2591 | { 2592 | "type": "SQLite3 Table", 2593 | "name": "previews_v1", 2594 | "children": [ 2595 | { 2596 | "type": "SQLite3 Column", 2597 | "name": "host_name" 2598 | }, 2599 | { 2600 | "type": "SQLite3 Column", 2601 | "name": "time" 2602 | }, 2603 | { 2604 | "type": "SQLite3 Column", 2605 | "name": "opt_out" 2606 | }, 2607 | { 2608 | "type": "SQLite3 Column", 2609 | "name": "type" 2610 | } 2611 | ] 2612 | }, 2613 | { 2614 | "type": "SQLite3 Table", 2615 | "name": "enabled_previews_v1", 2616 | "children": [ 2617 | { 2618 | "type": "SQLite3 Column", 2619 | "name": "type" 2620 | }, 2621 | { 2622 | "type": "SQLite3 Column", 2623 | "name": "version" 2624 | } 2625 | ] 2626 | } 2627 | ] 2628 | }, 2629 | { 2630 | "type": "directory", 2631 | "name": "shared_proto_db", 2632 | "children": [ 2633 | { 2634 | "type": "empty file", 2635 | "name": "LOCK" 2636 | }, 2637 | { 2638 | "type": "empty file", 2639 | "name": "LOG" 2640 | }, 2641 | { 2642 | "type": "directory", 2643 | "name": "metadata", 2644 | "children": [ 2645 | { 2646 | "type": "LevelDB Log File", 2647 | "name": "000003.log" 2648 | }, 2649 | { 2650 | "type": "LevelDB Current Manifest", 2651 | "name": "CURRENT" 2652 | }, 2653 | { 2654 | "type": "empty file", 2655 | "name": "LOCK" 2656 | }, 2657 | { 2658 | "type": "LevelDB Info Log", 2659 | "name": "LOG" 2660 | }, 2661 | { 2662 | "type": "LevelDB Manifest", 2663 | "name": "MANIFEST-000001" 2664 | } 2665 | ] 2666 | } 2667 | ] 2668 | } 2669 | ] 2670 | } 2671 | } --------------------------------------------------------------------------------