From cd0aafab9f5b1e99d7b209babc250a0dc6985c09 Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Fri, 5 Aug 2022 14:49:53 +0800 Subject: [PATCH] fix viewer backend for convenitnt test and do some frontend work --- SuperScriptViewer/CustomConfig.py | 22 +- SuperScriptViewer/Database.py | 11 + SuperScriptViewer/ServerCore.py | 258 +++++------------- SuperScriptViewer/ServerStruct.py | 82 ------ SuperScriptViewer/static/{ => css}/env.css | 0 SuperScriptViewer/static/css/global.css | 16 ++ .../static/{ => css}/tabcontrol.css | 0 SuperScriptViewer/static/{ => css}/viewer.css | 0 SuperScriptViewer/static/html/about.html | 39 +++ SuperScriptViewer/static/html/help.html | 173 ++++++++++++ SuperScriptViewer/static/html/index.html | 32 +++ SuperScriptViewer/static/icon.png | Bin 1785 -> 0 bytes SuperScriptViewer/static/imgs/document.svg | 3 + SuperScriptViewer/static/imgs/environment.svg | 3 + SuperScriptViewer/static/imgs/folder.svg | 3 + SuperScriptViewer/static/imgs/icon.jpg | Bin 0 -> 12994 bytes SuperScriptViewer/static/imgs/script.svg | 3 + SuperScriptViewer/static/imgs/table.svg | 3 + .../static/{ => js}/converter.js | 0 SuperScriptViewer/static/{ => js}/env.js | 0 SuperScriptViewer/static/js/global.js | 12 + .../static/{ => js}/tabcontrol.js | 0 SuperScriptViewer/static/{ => js}/viewer.js | 0 .../{ => static}/templates/about.html | 0 .../{ => static}/templates/help.html | 0 .../templates/help/converter.html | 0 .../{ => static}/templates/help/env.html | 0 .../static/templates/help/legend.html | 18 ++ .../static/templates/index_entry.tmpl | 8 + .../{ => static}/templates/viewer.html | 0 SuperScriptViewer/templates/help/legend.html | 147 ---------- SuperScriptViewer/templates/index.html | 32 --- 32 files changed, 401 insertions(+), 464 deletions(-) create mode 100644 SuperScriptViewer/Database.py delete mode 100644 SuperScriptViewer/ServerStruct.py rename SuperScriptViewer/static/{ => css}/env.css (100%) create mode 100644 SuperScriptViewer/static/css/global.css rename SuperScriptViewer/static/{ => css}/tabcontrol.css (100%) rename SuperScriptViewer/static/{ => css}/viewer.css (100%) create mode 100644 SuperScriptViewer/static/html/about.html create mode 100644 SuperScriptViewer/static/html/help.html create mode 100644 SuperScriptViewer/static/html/index.html delete mode 100644 SuperScriptViewer/static/icon.png create mode 100644 SuperScriptViewer/static/imgs/document.svg create mode 100644 SuperScriptViewer/static/imgs/environment.svg create mode 100644 SuperScriptViewer/static/imgs/folder.svg create mode 100644 SuperScriptViewer/static/imgs/icon.jpg create mode 100644 SuperScriptViewer/static/imgs/script.svg create mode 100644 SuperScriptViewer/static/imgs/table.svg rename SuperScriptViewer/static/{ => js}/converter.js (100%) rename SuperScriptViewer/static/{ => js}/env.js (100%) create mode 100644 SuperScriptViewer/static/js/global.js rename SuperScriptViewer/static/{ => js}/tabcontrol.js (100%) rename SuperScriptViewer/static/{ => js}/viewer.js (100%) rename SuperScriptViewer/{ => static}/templates/about.html (100%) rename SuperScriptViewer/{ => static}/templates/help.html (100%) rename SuperScriptViewer/{ => static}/templates/help/converter.html (100%) rename SuperScriptViewer/{ => static}/templates/help/env.html (100%) create mode 100644 SuperScriptViewer/static/templates/help/legend.html create mode 100644 SuperScriptViewer/static/templates/index_entry.tmpl rename SuperScriptViewer/{ => static}/templates/viewer.html (100%) delete mode 100644 SuperScriptViewer/templates/help/legend.html delete mode 100644 SuperScriptViewer/templates/index.html diff --git a/SuperScriptViewer/CustomConfig.py b/SuperScriptViewer/CustomConfig.py index 4201536..ef448ea 100644 --- a/SuperScriptViewer/CustomConfig.py +++ b/SuperScriptViewer/CustomConfig.py @@ -1,10 +1,18 @@ import locale -# encoding list -# https://docs.python.org/3/library/codecs.html#standard-encodings -database_encoding = locale.getpreferredencoding() -export_db = "export.db" -decorated_db = "decorate.db" -env_db = "env.db" -force_regenerate = False +class DatabaseType: + SQLite = 0 + MySQL = 1 + +database_type = DatabaseType.SQLite +sqlite_path = "decorated.db" + +''' +database_type = DatabaseType.MySQL +mysql_url = "http://yyc.bkt.moe:10000" +mysql_username = "test" +mysql_password = "test" +mysql_database = "test_database" +''' + debug_mode = False diff --git a/SuperScriptViewer/Database.py b/SuperScriptViewer/Database.py new file mode 100644 index 0000000..029bbb4 --- /dev/null +++ b/SuperScriptViewer/Database.py @@ -0,0 +1,11 @@ +import CustomConfig + +class EmptyDatabase: + def __init__(self): + pass + +def CreateDatabase(): + return EmptyDatabase() + +def CloseDatabase(db): + pass diff --git a/SuperScriptViewer/ServerCore.py b/SuperScriptViewer/ServerCore.py index 66c5701..3af5d29 100644 --- a/SuperScriptViewer/ServerCore.py +++ b/SuperScriptViewer/ServerCore.py @@ -1,4 +1,5 @@ import CustomConfig +import Database from flask import Flask from flask import g @@ -8,228 +9,93 @@ from flask import request from flask import abort from flask import redirect -from functools import reduce -import sqlite3 -import json -import ServerStruct as ss - app = Flask(__name__) # =============================================database def get_db(): db = getattr(g, '_database', None) if db is None: - db = g._database = sqlite3.connect(CustomConfig.decorated_db) + db = g._database = Database.CreateDatabase() return db -def get_env(): - env = getattr(g, '_envDatabase', None) - if env is None: - env = g._envDatabase = sqlite3.connect(CustomConfig.env_db) - env.text_factory = lambda x: x.decode(CustomConfig.database_encoding, errors="ignore") - return env - @app.teardown_appcontext def close_connection(exception): db = getattr(g, '_database', None) if db is not None: - db.close() - -# =============================================template func -@app.template_global(name = 'pinDecoder') -def block_pin_decoder(target): - return json.loads(target) - -@app.template_global(name = 'pinDecoder2') -def block_pin_decoder2(target): - vab = json.loads(target) - return [vab['name'], vab['type']] + Database.CloseDatabase(db) # =============================================route # =========== default @app.route('/', methods=['GET']) -def nospecHandle(): - return redirect(url_for('indexHandle')) +def handle_nospec(): + return redirect(url_for('handle_index')) -# =========== misc page - -@app.route('/help', methods=['GET']) -def helpMainHandle(): - return render_template("help.html") - -@app.route('/about', methods=['GET']) -def aboutHandle(): - return render_template("about.html", static_icon = url_for('static', filename='icon.png')) - -# =========== help page - -@app.route('/help/', methods=['GET']) -def helpHandle(scriptPath): - if scriptPath == 'converter': - return render_template("help/converter.html", - tabcontrol_css = url_for('static', filename='tabcontrol.css'), - tabcontrol_js = url_for('static', filename='tabcontrol.js'), - converter_js = url_for('static', filename='converter.js')) - elif scriptPath == 'env': - return render_template("help/env.html", - tabcontrol_css = url_for('static', filename='tabcontrol.css'), - tabcontrol_js = url_for('static', filename='tabcontrol.js'), - env_js = url_for('static', filename='env.js'), - env_css = url_for('static', filename='env.css'), - database_data = ss.envDatabaseList) - elif scriptPath == 'legend': - return render_template("help/legend.html") - else: - abort(404) - -@app.route('/help/env', methods=['POST']) -def envQueryHandle(): - basicReturn = { - "status": False, - "overflow": False, - "data": [] - } - - # check tag - queryTag = request.form['tag']; - if queryTag not in ss.legalEnvQueryKey: - return basicReturn - - cur = get_env().cursor() - #try: - readyData = json.loads(request.form['data']) - fieldLength = len(readyData.keys()) - if fieldLength == 0: - cur.execute("SELECT * FROM {}".format(queryTag)) - else: - whereStatement = 'AND'.join(map(lambda x: "([" + x + "] = ?)", readyData.keys())) - cur.execute("SELECT * FROM {} WHERE ({})".format(queryTag, whereStatement), list(readyData.values())) - - # iterate - counter = 0 - for i in cur.fetchall(): - if counter == 100: - basicReturn['overflow'] = True - break - basicReturn['data'].append(i) - counter+=1 - - basicReturn['status'] = True - #except Exception as ex: - # basicReturn['status'] = False - # basicReturn['overflow'] = False - # basicReturn['data'] = [] - - return basicReturn - -# =========== index +# =========== basic pages @app.route('/index', methods=['GET']) -def indexHandle(): - cur = get_db().cursor() - cur.execute("SELECT [graph], [graph_name], [belong_to] FROM graph WHERE [index] != -1 ORDER BY [belong_to], [index] ASC;") - data = {} - for i in cur.fetchall(): - if i[2] not in data.keys(): - data[i[2]] = [ss.ScriptItem(i[1], i[0])] - else: - data[i[2]].append(ss.ScriptItem(i[1], i[0])) +def handle_index(): + return app.send_static_file("html/index.html") - return render_template('index.html', scripts = data) +@app.route('/script', methods=['GET']) +def handle_script(): + return redirect(url_for('handle_index')) + +@app.route('/array', methods=['GET']) +def handle_array(): + return redirect(url_for('handle_index')) + +@app.route('/environment', methods=['GET']) +def handle_environment(): + return redirect(url_for('handle_index')) + +@app.route('/help', methods=['GET']) +def handle_help(): + return app.send_static_file("html/help.html") + +@app.route('/about', methods=['GET']) +def handle_about(): + return app.send_static_file("html/about.html") + +# =========== viewer +# script and array should have at least 2 items splitted by slash(/) +# the first one is document id and the second one is the real CK_ID of viewing object. +# however, environment do not have this, environment only allow one item, the id of environment. + +@app.route('/script/', methods=['GET']) +def handle_script_viewer(script_path): + # check invalid url + if len(script_path.split('/')) < 2: + return redirect(url_for('handle_index')) + return app.send_static_file("html/viewer_script.html") + +@app.route('/array/', methods=['GET']) +def handle_array_viewer(array_path): + # check invalid url + if len(script_path.split('/')) < 2: + return redirect(url_for('handle_index')) + return app.send_static_file("html/viewer_array.html") + +@app.route('/environment/', methods=['GET']) +def handle_environment_viewer(environment_path): + # check invalid url + if len(script_path.split('/')) > 1: + return redirect(url_for('handle_index')) + return app.send_static_file("html/viewer_environment.html") # =========== viewer -@app.route('/viewer/', methods=['GET']) -def viewerHandle(scriptPath): - - # comput hamburger - pathSlice = scriptPath.split('/') - cur = get_db().cursor() - cur.execute("SELECT [graph], [graph_name] FROM graph WHERE [graph] IN ({});".format(','.join(pathSlice))) - hamburgerMap = {} - hamburger = [] - for i in cur.fetchall(): - hamburgerMap[str(i[0])] = i[1] - currentHamburger = hamburgerMap[pathSlice[-1]] - - for i in range(len(pathSlice) - 1): - hamburger.append(ss.HamburgerItem(hamburgerMap[pathSlice[i]], reduce(lambda x,y: x + '/' + y, pathSlice[0:i + 1], ''))) - - # gei w/h - cur.execute('SELECT [width], [height] FROM graph WHERE [graph] == ?', (pathSlice[-1], )) - cache = cur.fetchone() - width = cache[0] - height = cache[1] - - # get blocks - cur.execute('SELECT * FROM block WHERE [belong_to_graph] == ?', (pathSlice[-1], )) - dbBlocks = cur.fetchall() - - # get cells - cur.execute("SELECT * FROM cell WHERE [belong_to_graph] == ?", (pathSlice[-1], )) - dbCells = cur.fetchall() - - # get links - cur.execute("SELECT * FROM link WHERE [belong_to_graph] == ?", (pathSlice[-1], )) - dbLinks = cur.fetchall() - - # render - return render_template('viewer.html', - currentPath = scriptPath, - gWidth = width, - gHeight = height, - hamburgerHistory = hamburger, - viewer_css = url_for('static', filename='viewer.css'), - tabcontrol_css = url_for('static', filename='tabcontrol.css'), - viewer_js = url_for('static', filename='viewer.js'), - tabcontrol_js = url_for('static', filename='tabcontrol.js'), - hamburgerCurrent = currentHamburger, - blocks = dbBlocks, - cells = dbCells, - links = dbLinks) - -@app.route('/viewer/', methods=['POST']) -def actionHandle(scriptPath): - cache = request.form['operation'] - if cache == "info": - return infoHandle(request.form['target'], request.form['tag']) - elif cache == "move": - return moveHandle(request.form['target']) - else: - abort(400) - -def infoHandle(target, tag): - cur = get_db().cursor() - - data = {} - existedSet = set() - if tag == '0': - # call from cell - cur.execute("SELECT * FROM info WHERE [target] == ?", (target, )) - elif tag == '1': - # call from bb - cur.execute("SELECT * FROM info WHERE [attach_bb] == ?", (target, )) - else: - return {} - # get data - for i in cur.fetchall(): - if i[0] in existedSet: - data[i[0]]['data'].append((i[4], i[5])) - else: - existedSet.add(i[0]) - data[i[0]] = { - 'name': i[3], - 'is_setting': True if i[2] != 0 else False, - 'data': [(i[4], i[5])] - } - - return data - -def moveHandle(target): - return {} +@app.route('/api/index/getList', methods=['POST']) +def handle_api_index_getList(scriptPath): + return { + "document": [], + "script": [], + "array": [], + "environment": [] + } +# =========== startup def run(): app.run() \ No newline at end of file diff --git a/SuperScriptViewer/ServerStruct.py b/SuperScriptViewer/ServerStruct.py deleted file mode 100644 index 37b5caa..0000000 --- a/SuperScriptViewer/ServerStruct.py +++ /dev/null @@ -1,82 +0,0 @@ -class ScriptItem(object): - def __init__(self, name, id): - self.name = name - self.id = id - -class HamburgerItem(object): - def __init__(self, name, path): - self.name = name - self.path = path - -envDatabaseList = ( - {"name": "Attribute", - "queryKey": "attr", - "data": (("index", "0", "(Integer) Attribute index"), - ("name", "Floor", "(String) Attribute name"), - ("category_index", "0", "(Integer) The category index of this attribute"), - ("category_name", "3DXML", "(String) The category name of this attribute"), - ("flags", "44", "(Integer) Attribute flags"), - ("param_index", "85", "(Integer) Corresponding parameter index"), - ("compatible_classid", "41", "(Integer) Compatible class id"), - ("default_id", "1;NULL", "(String) Default value"))}, - {"name": "Message", - "queryKey": "msg", - "data": (("index", "0", "(Integer) Message index"), - ("name", "OnClick", "(String) Message name"))}, - {"name": "Operation", - "queryKey": "op", - "data": (("funcptr", "615841344", "(Integer) Operation function memory location"), - ("in1_guid", "1910468930,-1003023558", "(String) Input parameter 1 guid"), - ("in2_guid", "-1411304621,-1568456412", "(String) Input parameter 2 guid"), - ("out_guid", "450177678,1584666912", "(String) Output parameter guid"), - ("op_guid", "869034825,898181163", "(String) Operation guid"), - ("op_name", "Addition", "(String) Operation name"), - ("op_code", "51", "(Integer) Operation code"))}, - {"name": "Parameter", - "queryKey": "param", - "data": (("index", "0", "(Integer) Parameter index"), - ("guid", "481363808,1100959941", "(String) Parameter guid"), - ("derived_from", "0,0", "(String) The parameter guid deriving this parameter"), - ("type_name", "None", "(String) Parameter name"), - ("default_size", "4", "(Integer) Default size"), - ("func_CreateDefault", "604002966", "(Integer) CreateDefault function memory location"), - ("func_Delete", "604003366", "(Integer) Delete function memory location"), - ("func_SaveLoad", "603996047", "(Integer) SaveLoad function memory location"), - ("func_Check", "0", "(Integer) Check function memory location"), - ("func_Copy", "604002468", "(Integer) Copy function memory location"), - ("func_String", "0", "(Integer) String function memory location"), - ("func_UICreator", "619055248", "(Integer) UICreator function memory location"), - ("creator_dll_index", "-1", "(Integer) The id of the dll defining this parameter"), - ("creator_plugin_index", "-1", "(Integer) The id of the plugin defining this parameter"), - ("dw_param", "0", "(Integer) An application reserved DWORD for placing parameter type specific data"), - ("dw_flags", "133", "(Integer) Flags specifying special settings for this parameter type"), - ("cid", "0", "(Integer) Special case for parameter types that refer to CKObjects => corresponding class ID of the object"), - ("saver_manager", "1181355948,0", "(String) Int Manager guid"))}, - {"name": "Plugin", - "queryKey": "plugin", - "data": (("dll_index", "18", "(Integer) Dll index"), - ("dll_name", "E:\\Virtools\\Plugins\\ImageReader.dll", "(String) Dll name"), - ("plugin_index", "2", "(Integer) Plugin index"), - ("category", "Bitmap Readers", "(String) Plugin category"), - ("active", "1", "(Integer) For manager and Render engines TRUE if a manager was created, for other plugins this value is not used"), - ("needed_by_file", "0", "(Integer) When saving a file TRUE if at least one object needs this plugin"), - ("guid", "1632248895,1132147523", "(String) Plugin guid"), - ("desc", "Windows Bitmap", "(String) Plugin description"), - ("author", "Virtools", "(String) Plugin author"), - ("summary", "Windows Bitmap", "(String) Plugin summary"), - ("version", "1", "(Integer) Plugin version"), - ("func_init", "103354496", "(Integer) Init function memory location"), - ("func_exit", "624432336", "(Integer) Exit function memory location"))}, - {"name": "Variable", - "queryKey": "variable", - "data": (("name", "3D XML/ExportVersion", "(String) Variable name"), - ("description", "Version of exported 3DXML", "(String) Variable description"), - ("flags", "4", "(Integer) Variable flags"), - ("type", "1", "(Integer) Variable type"), - ("representation", "enum:0= 3DXML 3.0; 1= 3DXML 4.0", "(String) The representation (ie the input format) of a variable type"), - ("data", " 3DXML 3.0", "(String) Variable data"))} -) - -legalEnvQueryKey = list(map(lambda x: x['queryKey'], envDatabaseList)) - - diff --git a/SuperScriptViewer/static/env.css b/SuperScriptViewer/static/css/env.css similarity index 100% rename from SuperScriptViewer/static/env.css rename to SuperScriptViewer/static/css/env.css diff --git a/SuperScriptViewer/static/css/global.css b/SuperScriptViewer/static/css/global.css new file mode 100644 index 0000000..1fbdc5c --- /dev/null +++ b/SuperScriptViewer/static/css/global.css @@ -0,0 +1,16 @@ +body { + background: silver; + font-size: 1rem; +} + +div.simple-menu { + display: flex; + flex-flow: row; +} +div.simple-menu > p { + margin: 5px; +} + +h1 { + margin: 0; +} diff --git a/SuperScriptViewer/static/tabcontrol.css b/SuperScriptViewer/static/css/tabcontrol.css similarity index 100% rename from SuperScriptViewer/static/tabcontrol.css rename to SuperScriptViewer/static/css/tabcontrol.css diff --git a/SuperScriptViewer/static/viewer.css b/SuperScriptViewer/static/css/viewer.css similarity index 100% rename from SuperScriptViewer/static/viewer.css rename to SuperScriptViewer/static/css/viewer.css diff --git a/SuperScriptViewer/static/html/about.html b/SuperScriptViewer/static/html/about.html new file mode 100644 index 0000000..d3b3200 --- /dev/null +++ b/SuperScriptViewer/static/html/about.html @@ -0,0 +1,39 @@ + + + + + + About - SuperScriptMaterializer + + + + + + + + + +

Super Script Materializer

+

There are no secret script behind Virtools. Super Script Materializer will destroy all locks and show you the real code.
+But Super Script Materializer only show you code. It couldn't analyse the result and touch author's heart and intention. This is your work.
+So, let we crack all scripts and destroy close-source illusion.

+ +

SuperScriptMaterializer. All codes are under GPLv3.
+Web frontend is powered by gulp, jQuery, JsRender/JsViews and 98.css.
+Web backend is powered by Flask.
+Ancestor projects: BearKidsTeam/VirtoolsScriptDeobfuscation and BearKidsTeam/Script-Materializer.
+Thank chirs241097 and 2jjy.
+Icon is created by ShadowPower via diffusion.

+ +

Super Script Materializer version: 2.0

+ +
+

Hierarchy

+

|

+

Help

+

|

+

About

+
+ + + \ No newline at end of file diff --git a/SuperScriptViewer/static/html/help.html b/SuperScriptViewer/static/html/help.html new file mode 100644 index 0000000..1a926ee --- /dev/null +++ b/SuperScriptViewer/static/html/help.html @@ -0,0 +1,173 @@ + + + + + + Help - SuperScriptMaterializer + + + + + + + + + +

Help Center

+
+

Hierarchy

+

|

+

Help

+

|

+

About

+
+

This page is help center, providing useful link for some detailed help page. Choose what you want to use and enter corresponding tabs.

+ +
+ + + + + + +
+ +

Layout

+

In viewer page, it can be divided into 3 panels:

+ + + + + + + + +
Navigation panelInformation & tools panel
Graph panel
+
    +
  • Navigation panel: Display current script's hierarchy. And you can click all layers which located in this panel to jump into it.
  • +
  • Information & tools panel: Provide property data, display configuration and some useful tools.
  • +
  • Graph panel: Core panel. Display current browsing behavior graph's data. Some legend will be desscribe in the follwing sector.
  • +
+ +

Graph legend

+

Block

+
+
+
+
pLocal (including arrtibute) (ParameterLocal abbr.)
+
+
+
+
Shortcut (Only shortcut output)
+
+
+
+
bIn / bOut (BehaviorIn / BehaviorOut abbr.)
+
+
+
+
pIn / pOut (ParameterIn / ParameterOut abbr.)
+
+
+
+
pTarget (ParameterTarget abbr.)
+
+
+ + +

Building block

+ +

Building block (abbr. BB)

+

All building block can be devided into 2 types: prototype building block and behavior graph

+ +
+
+ +
+
+
+
+
+
+
+ +

Get Cell

+

Get Cell

+
+
+

This is a typical prototype building block. Some port are attached into this building block.
+ pIn and pTarget are at the top, pOut are at the bottom, bIn are on the left, and bOut are on the right.
+ In the middle of building block, the name of this building block is written in black font, and the name of this building block's prototype is written in white font.

+ +
+
+ +
+
+
+
+
+
+
+
+
+ +

vt2obj

+

+
+
+

This is a typical behavior graph. It is very similar to prototype building block.
+ It don't have the name of prototype. Instead, you can click on the name to see what is inside this graph(jump into this graph).

+ +

Link

+ + + + 0 + bLink (BehaviorLink) + + pLink (ParameterLink) + + eLink (ExportParameterLink) + + + 0 + Highlight bLink + + Highlight pLink + + Highlight eLink + + +

Operation

+
    +
  • You can highlight the associated links by clicking Block or BB, and click again to cancel the highlight.
  • +
  • You can double-click Block or prototoye BB to get the properties associated with it.
  • +
  • You can hover over the Block to view its name and type through tooltip.
  • +
+ +

Properties

+

Properties can be visited in Information & tools panel. It can display the information of the object currently being double-clicked.

+ +
+

SRectangle/Box Mode(176)

+

dump.data

+
0x01, 0x00, 0x00, 0x00
+

dump.length

+
4
+
+

This is a typical property unit. You may see more than 1 property unit in property list. A property unit may contain more than 1 key-value pair to describe it.
+ In the first line, the name of the current property unit (actually a pLocal) will be displayed. The number in brackets is CK_ID. If an S is displayed in front of it (as shown in the figure above), then it is also a setting.

+ +
+ + +
+ + + + \ No newline at end of file diff --git a/SuperScriptViewer/static/html/index.html b/SuperScriptViewer/static/html/index.html new file mode 100644 index 0000000..00119c2 --- /dev/null +++ b/SuperScriptViewer/static/html/index.html @@ -0,0 +1,32 @@ + + + + + + Hierarchy - SuperScriptMaterializer + + + + + + + + + + + +

Hierarchy

+

Choose a script to read it.

+ + +

Generated by SuperScriptMaterializer

+
+

Hierarchy

+

|

+

Help

+

|

+

About

+
+ + + \ No newline at end of file diff --git a/SuperScriptViewer/static/icon.png b/SuperScriptViewer/static/icon.png deleted file mode 100644 index 284b163caf89b7c3ee9829416e316036961ca485..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1785 zcmVC00001b5ch_0Itp) z=>Px#eo#zQMeQ6U`_t9@`TX~rpZATCpQGhQP|yGW{{R30K1j{|=;-evD)U}s@A3Tk zs;qB!+VDF<@=sN_yY1uU_*7ie$ja~i+uhRC^xWR`_JM_~uj%=;w(l%7m7C=M@$p}0 z*89iFy}|DLzrlTl-uIQ6kdTl*NXtY-MDH9Vv$M0W1hnq}00t>ZL_t(|+U=WLd#XAR zhEWo;iim<|t%}yNp8fy-;4WgwX$FRavM!n{Yaw~b%zQJG7Vpo%!}|sJ1&|-ayT`W) z@ZZ}3cHbI+7-TdCSZ=pN0?g)Fmd%&X{oC$d27o7#Ig%$pmWb{1(-rpaB-ynGkk7dqLmu!LCvkXw0x+M~(aZw@Bx)Hm09NuB*+K9O z!<0KnGY4BZ2lwX|p!2 zwnaeCM3a$i1$TWRuDV;yR?d|+QX>E(>@rxIbjXYOtdo5GRqZ2GrsLUxpC;A#wyTtW z%9p~79LqDw^}x(Ru%)F8#SeY?osm+Cbx)kHO3!RkkQ4|Xn6?1~iJ1`!(=CfFJHRQ8RfSWE!=VY{{`hc$0dcC&d4I7iDy%wm|9ID8OjS1!hNfWJJgXJQzF+p~C z)&u}4?AILtPR+6vTr=|y0KDM^>q)1+pgRE6+%)V9Is)XCIRA1x*7pGv=K}{WN2|U- z1ys_Su%i+_0}748mje{eG`WgF05)lgv~_O*2tv>E;!VvguLB4cUOpD%fdJ02SBz*N z0J*-mZv`+)N8JEYxxVLD&oYMq&LsD#1n}kh)1dlqUtp$-N$yh#z=#`gfX*-E_8ofw zsM!FxeV5zEdH~oHW#9ze+yUSz0=09%LC^z0=nV@nq6Q(HuH()C)F6b@b%`If1}KB@ zSSx2hx-RiIodNa)MR(J+ygO{AgrkTtMl>Qah&~7coJ;pFo`F3^GSp(;iIfZwqe1age5X!aP>VSnAT$9| zG%B^NQE@R2$%zaBux+S`(=;^FR1C#MRV}rNjLd=n*fwM;H3f!!QYbP5+)GBGwOph5@ST&mBhd^{in7;=@?Dxq7`Yjdg% zIBMN1M92hGW`-L<24GN=qD4rkd=(;O0w^;hN-l5#?sEH7zcLNfUTpMRfGAW#8i{rQ zKsMZ~l|thdAPOtmOd`P8EfamU(gpo(|RX>C*xL3@Gr%%>X`&N-$5H zj_Th97J4BLKsCV~D1R5Oj=}&?Jz7q<*pL96-Y61w=06Gy07^wSM1?Q_r#H&29PG8{ zk1SWwBq;<^kv?He5F(LIZI6FsL0|R=8{1XN1yqS(c>E3RsE~>%0um>FlB=U4#lQmV zs1N|t2uKHXch^_>$$~aq=t$@bv<7vGHMlpZS;I6(cOgbOB|BRNhmHpqK(yco6Srw2 z0LrlY_^A41c$c9DsxZVZ%`qH=UOrZ)vU48BAeoD`oziImq3@;u-1FSWG@7>#%pZzu7IsJY+z~A5Zj(-9E b6@dQ%&;D90nf+_100000NkvXXu0mjfA7DN? diff --git a/SuperScriptViewer/static/imgs/document.svg b/SuperScriptViewer/static/imgs/document.svg new file mode 100644 index 0000000..526f731 --- /dev/null +++ b/SuperScriptViewer/static/imgs/document.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/SuperScriptViewer/static/imgs/environment.svg b/SuperScriptViewer/static/imgs/environment.svg new file mode 100644 index 0000000..1ae0a78 --- /dev/null +++ b/SuperScriptViewer/static/imgs/environment.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/SuperScriptViewer/static/imgs/folder.svg b/SuperScriptViewer/static/imgs/folder.svg new file mode 100644 index 0000000..689c6cb --- /dev/null +++ b/SuperScriptViewer/static/imgs/folder.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/SuperScriptViewer/static/imgs/icon.jpg b/SuperScriptViewer/static/imgs/icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac1a1e2fb5861c7f0d1fba693a1bcd54823571bf GIT binary patch literal 12994 zcmb8VV{m3c*EV{`wr$(?#F*H&Cbn%%Y~Hb*OzdQ0+cqZl$@6^Y{pvkGPj~NKwQKLa zs(P))bzQx_R=#!s$TAYr5&#eo5P;!#1$?ao!~oEckWi2i&`?lNFfh=t@aPEeaB%QA zsAx#&1h_=r#H93O`1sUZH1y0Y?Ck7BR6GLQto)2@?5zJW0s;dA0}ls} zjevm7N`g#2CFc4AzC<+J|3dq+W01p5F1qA~E{I3ED0s#gN1^WFG z=erkR-`D>tAfRC25MOHm`0sx}k-?Aw01$Jqk<0&l0Ym&d=m%uOaEd*;7DbbEPJSL# zp;Y?!3usCdV)Ab*3OMHcXXAQyUCWgi8uVq3oCvb=$t~c^iAgHPt>V?J@Ew?;h@sO? zYrNn#wzqa5r~njZDF7%;tPX#vnd`}4tnml_KM5v!tHG1u+$S5aL$5aRocRjsDB9Go zPPH22(X}XDVx@EA6D>0MYi)2<9$SE-1m+9?Ksa$Ja4}8tvECx(5<2^`bi6$Z$(-Gt zeSR^T@gWQ48Zx8?9J7_vQQ=^F_=cPewov$E(31xm4j7Is6593EE0oJL{A7 z{g2zSlQM!fb5lLj^x5Vo%#clUvkaXEUaXGv!>pTfw zYiB#4pWuKVZrE*Co^kb)$tfvubz!o6M3i8kY+*q%k*tMlc!WhcT{uDkCgFPl);!u3ujBIt_FXGkI2{7rv={%@uD`I;Me?zR#%z|brHSvL zr`^dU?Xj7EDV?n+mP@hFZ>f3RK|+Bb$=EJ2&n}o^%;bjauqgL58%^sm@(Z=lslc#C z5FCBsNG#1*+VC!iKl4e0JJWy5HLT*K;5xK(^GMS0qMQy3w<5RLokTMWG8e?28cV$% zWEnN)+jv=%u&v5k%dTg0l@WhIr;~#R$SJ@NCSI&qaTU+`aa7Zko+gZIGrd_!4@k)J z@Z3{!>}n}hwk{|6QdMT#PgP5uOdaKJt;3zIh{X2Nk;|ci3L}FM1CD*sbhKw#i@cVy zaG%mpcrj_yi4Su2mek+S@Ly@p+i~ZD-r4FP$iHWBI{EJ)LjWKHg#`6`#sgpg!hj%A z7-+zE`(7tlkiQoZPyhr7G$<$t#P^H`fPsU2KSLs;prWH;5R)*ovaxeuvXGJslTnB$ z8h)=I(BI1n2n6UCU>Sc=7i2|n&|57)7ak$g`KtC^Jr6eHk_-0_Oufu_y@Xg(SB51? z8K{Wj0&DnE0@vWCluT6Uuj;^3b4ffo?e$NHa{=HOB4b&5Ez#(jXm?<*g(zmAvCt6`ib?ye z-}!9udbNw5CH@n2TB_YIp0DAmZnKMS#D2j~1{Y`K$NVxOyqiEN0ZJjpT2;$TxEx@{ zbiSECLSWR}&++2>B{b?Q%sX4fOJpY?c{1{*7P2&#m^jKP(y=wNp2KLHj19hw6fDFmzfC1yWiK4cLPi#;I_7cKp0i{gl~wN;wT~ zb@-#bSnMW;kovN9LsGsl{G^ZN@IsHIe-Q_+D@8DWrQP)~mulnZJw0Mz2^)>g71xF? zI5vGAD$X%6Kn%JDRVp7q|@F5zaY^+`{bL?tDI?I3RPvn@| zq+Dh9gCALQEnz_d>}azb!o+F9^a`g*{8IP2=@4EB3<|2c&?W71gB?M z|JKlNeXua&!?<*|QRgX2&!NA@kE8U%o+Z=l&!U>Ck4YX9a<;{940z_1xhwRWShOck zUjTJl-i#oJ2WyN#b4_P?add+poPfQCEU8oCbM7v{oc2Ih!a%{vV}AJ}2LG^s+&o!$ zWfp`H=j8g zOt`HtJ2=WsvgW@eS-t&>=g7QxB(|k2m(C>oW;LBXlfY8FS%&&9<9nE5sOI?1lXY9@ z5YEj!Q}n=^nw{a5ZfaUw;i0V+7BiJaUWwB|(ukJ$2Or57>mOPJ`Vt80V^hb-kFuTx zZ<-!g2HdVO&4nqJ|Hh^3X`9h7Yi?fbiwrDVGFdLMc;!px2mB>bKSq#ngGjnlLyre@u{@jy9!1WDI zzJ>Eu@^Or(BW;FFGyRmG>;9H$j;M=hF0aw#wkZ$F-M?z)82OVk{vliX1x2f=NYZuY z&&jB}jG6^lgDKcjqg&b@QqQ>B+kY(D^yt(-+j_l&ShjzTv^MF|Lr6bQBl_z~-!FM- zf(O+Q@JPHB1p+JR5uVaglb0x5X$G<4Cb7=ldGFePU{SVO@0g`%H67AkX z9XKg|vdP&Ogua0JD>9BF4+uCilqbd?xSU)~)J)m9Db-GNH)0mw@wTf*G= zZtaMvPyNWg0BEcd2(=p?bYB3nkw@0s&_RuAm_hf<->EEYlFvROPhC?P>pb&(7XPR6 z%6Uge$%qZUb~Wbwr?yP3P9=@EI2XOOTR#^5!|)ae)m<)^z^Q4LIiT${g?G$J$+kod zP7pB3I=JE@nUi*eEhr&qhvVOS0^B(M`wpDAKTr4C{YBM50Ow@?F7om+z3IL}w!AT& zzT_7`%yDWdO6}fQTiFE(cz83*Hm>OGg2qYZ_M_UG^EU@Dj+lS}W3P%d}oylj8nZ0O+SY_Hn) zH8rnlN)j$Ie=>DMmNe5rZLbtijNAP@DXtD$A|>VFjL43DU3-&z$i_Y>Di+{%riLEy zU#49zDss%Rv(1bSR_#pgA?fna2_%Ts0@o(Yu91nb&7H{Ob)EFuVjZU+&$##qu?TG# zUFxxAJzB!(awRBGW41uEJ463b9-jBiaoz0VQWpMCh8EvcJlU>f#^SKuVmGB~O>xo9 z{N$r>Ie0`icP8+bebUK76OtuXE3Kp;3c>pqdJRthMZKD3ez!^HEXQw+=C(f53!8@& zOJP;G9}_>Aq*pHfWY4s5jCq!<6p$qw09__4o0`$*7XoXFd3Q!cG>$LR?zQLj8%k_9 zuf|fURT)ok<8(yFp#Vk>Cfbqp{0Ip~dWvaz&yo<>IPAv+?|S7%3=Rw9%B_{S9_PxJ z7~>cEoi<7-=U;#k|L+}^9OZk51p$Nj<`w?~$3Z|*P?1Skz|e?EnMGKImHxY_exr3E zkUOUWX`$i_PJeQtlYMh}C*=<^TGyM;aHy9ey$i8e^2?dc9F9MlH&lLX#>p;c>KV;_ z8|K@Cx(l=D52er=Zxg#z~t+$dc zV=rXnGK`-$2hIi_ZHdR%h|(e}`KxQD1qRstQ?r5C>d}j_S)<7|Q^<|DJCi5|?agK? z8)Dcg>5Y&kMHF647KgD8GTyKVvFf8bRvnL=X5L;YRHG@LW1JytD??oqnFsa^QOu%h zp9bF!p#84{Kq0^&0AT+C7~d!a6aa>TN`m~|e->s|C2({y5hG#I!2h}d^gnJm*B*x- zE>E^t0HZ<^&A-hEwEP@b-~+GeZ%nQ6wqTC^ElaobhtLT742;b>{E?wTK~tpDWo|8` z&FEQ`xww!qA=25%(8zr9h!uldfSu+JxAh~ANWSt@l$DA`XX2oA@G!Q1;0(-y*?tdX zHJYp>mm>hO5#kD77A!*PXKn)vf*Q!`MyfHi1meq12jF zWAa3s)nm`9ww10Im1Bfp^5?{%)#JF@ZD++0T)h4lz*IZ^`Xsk9G<|!pa{YY!B1OBv z!DOSd=`G=wu1#<&HVu5ucl0^?5UxVc!6>lzsl<;M{5gO@Cy%uQEUx1h99a13F-39p zCoqafB>@D!E7xesJxYpCB-WbgX)`Y8ZJ9WUEz5GI1vAhoR_wRYdBqS>xf$)@Zt>rC`^?E^|r|&RYQaY36 zl+N^X&v&SVkO3fIAQ0ft;NTFTQ2z}T02B-b92u2_1&vfhiI`Q{$k8b&R)6S3~;6U$?9^LO29 zVQHA9Jlz>0FbI|H3lPPJ?^j;mC|oDdY`wl3$#ScD_IIeP>nMP9R0QDwlRokQwvUl? zih&=Qc!5ADpmGCG-(67u8`u2}z?jKVjKU!!=)>e!#ZYLndn^CtWWHy~i>Jd@$JdYr zQFK^#E$K!D^z45zZ+6`f5l<9dC!eR)D&f+sNdrQR9SO(rHXLpp zHI0Aq%By}?+M#PS5 z)7Y{4IcG@#gwEC4v~$=`0Gj+>&YhWQa1U^;bg`-4N_&rg2NYLL4L_e7=J@q7pcZ1~ zHoJzvOHmq?I&qCM6F*T9vCtlXmq+s|y1u5bLj(~8so2Q2m6iL(>a=u0(DQt4v9clC1(;cUKN)e%Y3Jq@TqwNrUNYktV@|B<|B2^-6(>NbI>(M%*7VLYN%Rc z_M-gH2lcMwFHeS_?UmAm<%Jr?1BDCT43Z7Y7tL=B>Xil!5Nj24HLAOAJK7AO6I`pR z9Npte7tMs@XmK{j7`NokskH3Rp_NwSuvR{{-0~{fxH_R?&Sc&2gx;ljWYrRh@Q>?U=YAMxEgh*b`GmQd+(zUyT}d;LB)JM zbvYDGlYB&dSvDl;Z(~g?7{^U1caMWYoQNcsPVucApB%S$(!p9%h=yU?#4W3D<_xg5(Ws>ENx?>1!{`@ELA@W z@dL%+66PWg3_B%zWc2yt7jB_qK&l9nJY#@x%?x1#Skk z+HgMx25?sEL&e7~`lZ5vM(o9mZvy=@iiy=eQqfZ;A3XQ4nMKIxL6wBwyqXRT0*|;F z*+iE)&Is$TOt4(CAJ*#o*z5t<>U*Fz|FXnxfu)X*iA6jCdM$rVlNX&(^l$!Td%Msw zIsFZgmE?)b7v*2jgZq7AM7WFo3#tlXS%qQ6KmOjlt7j@nBlEO5>TvPa zP?khdk7xn;a*mXq_5YSf!&IXu*wVx(x7Efm1ajla>?zAZ;!8AjK>mzR*y$FjjRLls z;Iivcn2bbsN#4{MURU>J2(sm(_9&b^R}ieck?yPl*HmKF5Ay_{$jECdqgb#VuQk+O z4c-@=3|CXFGC`%p;+ZuD0@&{;a0spUtEcX$J9)M7nzS(r=Ybm>3Zt`@>Y@K_VVAJ; zKz%dL+JR7?yAPV%alP3-pWi;}ijAvgc)n?>-o(4v7C)e8?wKF$5#Zo_ukx|8D}Sr) z59;f>z|0Az>tw)D2DAfLEzks#%{d_xuVASJ8TK|s)cW_&%4UU`(ELj&yFia|K?VyT za`{Eu=UH1&O~nt7gUGid9%4rjoBraSI~+K1sU9Fl(F1W)o})=9fE)CTn`vo$`;Ba; zB0yo9*?!)A&f5OTf>#f>@nnfsw0L!LkIIS+*BkVO*K zN)^)Yu%|!9ROp>Aq{{%2o%+?BfJYf%AuCsZMQlLRi~5p5_I2xf-hYrR^0#sh0tycK zExZ38EDr)eAz=|gRx)xV4ooPhzv-K0-n|u8{2!G}h~x_}HG}csDSUiWPuf#Lf^3KP zI>fH1FY7j<#cItOq}PAX>nb zmzg(~!2U~J|N3?xu9Vr64#pwYE5G&@?x~+H@SK2?V9yg4ymFU{3G?YcTI0f{uT(uz zVSg@7_U+4e2Ou@k2l>1GwVRBN`~x2zE=Z`C3gO^El`Sz zx&Tt4eocMOg8=FJT}Rjq&~esV#fuOR5U5QL$28E#`1=?}y~rg$?6)lt-0s4yDs25H zL8KD29p73^z&T-0)h6&M!$G4;m=y+CdP8;aTNeW3kB~znq(v%gz@Om$%0I45$x`#n zyskU!t5xU)Hlt<;fC~p#n2ms$6&ZPXDgZHV!>ZQdnP^V20^AhO*<+TRiu(gKpgwI9 zaieF&FF%5mR5O>L{gP%p;K}_TN&6Np6H9sWplZa!j${E7YQwl%7~iBv=JZ5OzEz>; zTYer$Y`*;bZNiA8AYDSczE)QODkjza!^m4ck?O~nVHQOZH) zb}r@224{*{6?O_OZjhC|`hJLzBsh`|$q9)MqlB;2({aGxrYuYAI}dOTxVjYEdy#<{ zu%D1KOIM_a`Fa>r4zEbxb+%b#?>I9jlUQF% zd^xnQPuX&xAqUpK983KTJp}7=-4d)!Lqt`_Wq4{fWyj51wKTR?3^BPeChy`K-fpq1 zT>)%b?yQ&LZrFz}faa8L{_KuuRl}bSS<4#yH~iA<5fpS**lz5wX-%?1ffDTFd7N}0 zjlB?Zy`~DzN48tI{E1wz@cEc$GY@ifJ}@W>Y%vq<7Ge|kjUN-?tV)*R?mnPQf#pJW z5LUcfF;rRxAw5`8btbhEy~IGL|A7l`>zCYBGK|3wXawjl00^(pkJJ6qdkP(2Dp?#4 z?Di%hgSZ1Wn{;In>5+83?N7lq`BM0vlmsTc;DP5}#;2 zGIlxU5kYCtV?V__k(XkWX2YCv{~oY`ew2s>Lsv;JiPj8r9+k6|yB|m=c{l|pFa;rr ze*vGfOZ~g)lxTF~o!bOgnnKQ?)K8RG|9OEY{6~I%CBS+dRD9lQGZl%Eg~f+4#I(AY zNe$sn&8m|PbBN1Gq2URLjoqv#7G6InT29^E3*~|RTV9?Rp_(ApY)IoR!#rZ>mc#NM zZ>V*9%nwJIld&CK)_UuwChUw9{>NVph%Ck7qm}_Cbs65mk35xTky^+D_7icDG7m@v z#ny)XKj~Nm&e<4>@?nMofqm-CL1rdXzLGqT?UN4Ma(lGfE10OvyG zXVa5?s_!vPFz=`IedqCC!IxXXyKElbZsXW;VNv`h-lEfm(>eXC%cFsNTQJlU%q2j) zGc4|qc(WPkMR&p?^4c$)NrNcva{*B6>GnecYaHLb8xlL?h6QWy_$lwaVQ->|*-NCF zmpt(?<3I0%SP#xf-4L}@w-_H6(}l;-PKLV5xDI7`P{DJUvlNY;>$*}zcr^M<3BL#^ zi45>zkK+XL1r^7g_5}(pgr~Xx{q%mB?mXqKYg^S!kFy`pT%Tc^jD7&oH^od&zQbNs zGclAqtcpw6pA!~q1VJB%9WO!H%Rfo+nVN}zs6Xk!SZ$t)`s3^FigC%pqCL(aveTY& zV@^P!_g6ZL@=;8My<6m?>{vRr&81kihMB6`{}}dT1!BZxSB%wZF3+tW}&UuXkx+pSJQ2mMi`aIecrLGQ;uZO7l7AQKdItA zF8?Pr&7hLb7-K~&cHaKa+tTOx_wrBnF92J>VT@aZbr(OA<+8MyMFCt}ZmPIXm<`+n z6Tz){(EblW&8W-`a@6*$e}`ZqsUGmr!TLUuopne#6XVfcWMd5Cx)rKz+<;CwflDORYVOQ;xKIf5t8YQ@pQw+V-ZszXo+yO zLtO@+<{Ix5$m``5M5;O93+Rk!Gng$bbj!H;y<6U;Eqi8x3_q3f^ibxd!}sMocJ8?9 z`|SJ5X|m)nINi`N&=LuoIg}eX8$U)A$tb`~aUBJ`Fm&C(5SwtckO*jlhJKG~IB=)v zBmF4HH^q~*)D2BuKI6QUxNs0!XdPWS@{OszC0muIhpr@Xq^?q`ncCTZ0c3S+LCF^!LQFy#+E2E2-__> z^gH;4P_-&P02ajNF~8t)#xa+Jf%y||?*zDtgc986*4KW20o1!3q&|+<#Zlun zcajjCyxQs-t7lHcHO5e?GE&9_wF{i)j}KK3b|7KREMsf(M}_h^A5&RK#CDUybCk>y zQ)DJpw5n?!&FO4S{P8N!1X&$W(g_b@X!9q6tX*1fR7j?fAfVIf#+3C)M z#o2CBWi~?cs%MZl*~*;I;CA)zVcA`#Ci|q~F;IhJ)oH)M8iZU6YeGfrZ-6>3)94R7 z&3au`u1arz|EKlIFTl(<%K2|D!GC2v4joE;^ofX9US98URIE& zUbyod@jm^H@Q6{q5gsVm|4NP!p%aB!XRb1aX>n zk=1(?vEKcKG86pkN{34EM`L23ZSnd7hzu$Fm~7l_S#%nG3f(EZP2`O3Df~R+N3i^k z;HulLa#s{Y!`1DA_qg!TSi}>rgaH_+25ie2pb(bXl?z|hhk+9EX1I_JA|NlLWe*>N z3q_mqw0*(LCXgxgpm&!d#v>)(;`f;+^lm1?J4ir^B8OrMyp@!gZJw!^)8WzKcpCCX z>lQs&CHt4hcr_62*DDwivGhfcI zDv^V5_RI7X_H4(mgXxBt1^$2VK-0U*s-U~Q_vgPozNr=P?C?f zoUZ6@CW38kdgJIJRfivO-1D4cZDyf<`!B<03+DKPy#|(FfI)0`-3QD;6nT~oe}*2Y z?>Nx>mzscqfr0;jsmV7p2}J&8CVjIv#LTz5!vB|hRn1|(Hev@ozr18egWb|A4zro zcurULlaqD=+xw`SxVW6)5gZw}T&~p%M}x?s({hJ>da=#u)XzJ>-R|`y&9zod8MFCv z3=2mI^tOHo#naj497a&eBP!bkkL8&n)goT5bc#fM(6CZH=B6O7+Zfx*Z0Vs6+muzD zH3=HpX$fb8$-Ay zeb+R-9|nTgD+EBh348#a{I8clp(F^pW{%WG#a;IuuPje?ac%35(L$9GqPfjVZEG%J zn0AJ1O$sM1bg1fHSJ45zeu2OA)ge0w!Ov04Up}96Hs_C-g z8lzuCDL-Fp%xC8SG9PmUQ{M#cqVNUija_T!OaI+K88D`a+vfuMit!ZK#{_#{#o{p_ zMMET9j@!WmKQGOV7TAHu)hsz47s66&q(}gqWw&+L_A;sna5=aqfw|F!+|sO2Yo0DB zo@jceY*zEGk@kRfI{D||GX`T9wlA5S0!CBH?T@@BKlc{DMotyV_|E4h^@kU-WKkdA z?GwBg-eSQzO5xq5ql zcDH~C#iufpgebfda?olB$NM1O9ZDDEqQd43X;~OKj{jWV)z0e@{;uw zn3%U>7(XN6lWnsMNY>2Wv*HK-V2e`POgghW*Q#EEHi(%9y(d0!WWJ(*eGN92a$;F@ z{dH)?=x(8H7&c#Vx)Z71?%*Z>`aO)0&m$8je-$7}+Cm+`4eUlnMj%FbA5T}yGi-FQ z2iW-Y3UCDD^tAuO)v_8|EvDX>Cz64_pJzO>hJhM%*IC&PCgubIsjxR1}?*CZBi1@N*}z8{;Q^Om7b zy*##|-eyFnj;Byn2+GzhhTgEklJIgi2M}8@d%zx8$J= zb@Ho4|iot_Q%YNd#|M)CEPvXEg22P@LkIx~trQB3b5TGQ+}|>bFk) zRs;ZmL0VOCqj?9V?|*rNugr$|L6y@jsY~HqRdzIiMULK>2%3-7z~UpD-psFPy=F2+$v`G zgT>@d@_$TsCtP|J2=sfmh;J#-?Z<3FKOtro6$YzbLy)b*_D$4-N-4HkVl^nVHJ3*s zy!L8iD}By!hT_#~T=u1vz)?#BF|;v7Tdm}f3@?h&&s&n)*a*%jVv-`_?Tb@4w-D;t z8Eu2Mv$_)&Ms~;C;+A0XEJ9Y}i>MnMoJMvac%J2uL=8{qUAY^7TA7>RZ^Mk7dE0}c3kO=3LfkSohsKp+TG8w4Jn#_uvf^z%r&s_L1@`qf6pfbl z!Xl_wBOQ`GdIhF4l%=3FtC1|wlt3eoAzsYOa^Nav+-$Zqofz>R1dtLnM1DNYbS@Aa z(JpEkr1R<%tCibajYZ6x_{lH*sR)A~%pzBo;DX-Q)bHJNAh2&TJq=Vf{66%B<|}7D z&#l6zGOR8pLD{OV`M07ArG;iFb_?eu%)|?Ir2d{@q-M3YPwt=u+uu$G*ww;?&+~li zRyp)*lYoYP6cJZwlL{Z?pVo{<tge`_-v*L1;X8;P9ezLWOLhLsbS8` zW&SJ@&kr&OEG{paOf?B)TGe4j^Y~obwtegJ+L#ZpOn~)zWxMxXncAv zL>>B>NP$oQygzvb&&hZ2o*^#=qU{7;Vcu73c`^S2BdgdHgS>%d=-t^Owo;149UuNx zL1B!0E!f=ya&K<(s>;lVrqaYNWGw?${!F5Hp-X5UT!TEsyqK|>d%_XS#6~>P#ACNQkFXjwPi2peM;2v`dWA! zyFyt9w-jZsz&xgxAq>i62N;>^FLXNv_#hy#f znN9c`>{r$-C8y3;Z)yFx5OH~$|Cp#$`ImQ6ka?6ESxAGqElgXt3Por^!(#odPtQ!> zvwduQ0VIVs1{>b~surpVk7vbF27AwG4OXVm8YJY{$@P9GYM9ui)1=Zb0~@I~5De`G z*I)hMd(e&lvIF7>fRO4GaSscz!h!O`I^);0;3ShlPRmQTKlS2_@@X;~J13eaKm*I? z|Ac}g%#0ltE97{~{pXetw}2}8-yMjD2La+ zfz074$$oBrK*wC9eD^#QOTjN3`)lZpwH6s66s%X(Ka>o{=HMEj;!+1$TizUsSn&4?g2{Gk6+hBpKITZ!;yC{y~z-w7<+7Ehnb-U~Rp4 zeZs*=o5V99an6XweJVU-O|#9khQP^w$HabF_0K;95_SeS1kSsW5OM`sMf%YtGugU$ z%N2h!{BjCqAfHY?%PVNcDBfQ;T!lP0;7iKa^(HLh!iz*0QqokW>4HbG8Mj&z+2&$= zp%-^uC->o+5p-LtO8{ms_ z_?*leG-3z=FuddWG*O(MALA#O&d5PNHni_Og=Da)cE}Pe+I;e|^o+z9_*F+3f?hMI ztX^r#b4SzkYm`NgEOc$U6DOa*BF?e8^&|zu4ZGWR;nyWN_vKKJq$NR8j=r=SMsq>q zOMXKG!XLuY!cr%6kd#wKdv)v=mHIW6n^&;hjxT_8%*J9wrA5N(C7WzNeYPcH`#_#@ zvx~yCgzrDsY_Nc5Ap=R9dpJ#hJ(>1TG$o`kUW~=$1Q<$Jx;|QDj#JS7EW6HFl;KnB z>(|osb(RfGZ`NBkf5XS{IR;vu(oQHN^fOC-lsgyOdLv5B>M?_0^#UdK5iq;qLI0{? zmGw5Er0%+c2+VvJ=am5hTwqOrx5%DSCx=_R4gA%S%0xW~&kRTWVyAwr$+aZiiCjxF zqArqGoSQKRUd?D`jXLvu@n4z()jk9FCI`l_%BUccD=9ETcXbnVshtBJW6`!l!XX(A zUE`PYj|Vq8H~Po4eK=txA}0$-zPgfpzSv<=(21j)^@p@_(~Zm=^IVb?>v@B$!J?(9 z-w{FP!x;JZ@C{{kWebZ>DL$U5P!f4bHch + + \ No newline at end of file diff --git a/SuperScriptViewer/static/imgs/table.svg b/SuperScriptViewer/static/imgs/table.svg new file mode 100644 index 0000000..3ff1b9e --- /dev/null +++ b/SuperScriptViewer/static/imgs/table.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/SuperScriptViewer/static/converter.js b/SuperScriptViewer/static/js/converter.js similarity index 100% rename from SuperScriptViewer/static/converter.js rename to SuperScriptViewer/static/js/converter.js diff --git a/SuperScriptViewer/static/env.js b/SuperScriptViewer/static/js/env.js similarity index 100% rename from SuperScriptViewer/static/env.js rename to SuperScriptViewer/static/js/env.js diff --git a/SuperScriptViewer/static/js/global.js b/SuperScriptViewer/static/js/global.js new file mode 100644 index 0000000..3b57c7b --- /dev/null +++ b/SuperScriptViewer/static/js/global.js @@ -0,0 +1,12 @@ +// tab switcher +$(document).ready(function() { + // References + // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/Tab_Role + $('[role="tab"]').click(function() { + $('[aria-selected="true"]').attr('aria-selected', false); + $(this).attr('aria-selected', true); + $('[role="tabpanel"]').attr('hidden', true); + $(`#${$(this).attr('aria-controls')}`).removeAttr('hidden'); + }); +}); + diff --git a/SuperScriptViewer/static/tabcontrol.js b/SuperScriptViewer/static/js/tabcontrol.js similarity index 100% rename from SuperScriptViewer/static/tabcontrol.js rename to SuperScriptViewer/static/js/tabcontrol.js diff --git a/SuperScriptViewer/static/viewer.js b/SuperScriptViewer/static/js/viewer.js similarity index 100% rename from SuperScriptViewer/static/viewer.js rename to SuperScriptViewer/static/js/viewer.js diff --git a/SuperScriptViewer/templates/about.html b/SuperScriptViewer/static/templates/about.html similarity index 100% rename from SuperScriptViewer/templates/about.html rename to SuperScriptViewer/static/templates/about.html diff --git a/SuperScriptViewer/templates/help.html b/SuperScriptViewer/static/templates/help.html similarity index 100% rename from SuperScriptViewer/templates/help.html rename to SuperScriptViewer/static/templates/help.html diff --git a/SuperScriptViewer/templates/help/converter.html b/SuperScriptViewer/static/templates/help/converter.html similarity index 100% rename from SuperScriptViewer/templates/help/converter.html rename to SuperScriptViewer/static/templates/help/converter.html diff --git a/SuperScriptViewer/templates/help/env.html b/SuperScriptViewer/static/templates/help/env.html similarity index 100% rename from SuperScriptViewer/templates/help/env.html rename to SuperScriptViewer/static/templates/help/env.html diff --git a/SuperScriptViewer/static/templates/help/legend.html b/SuperScriptViewer/static/templates/help/legend.html new file mode 100644 index 0000000..b3ee5b4 --- /dev/null +++ b/SuperScriptViewer/static/templates/help/legend.html @@ -0,0 +1,18 @@ + + + + + + Help - Viewer legend、 + + + +

Viewer legend

+

This page introduce how to use viewer page.

+
+ + + + + + \ No newline at end of file diff --git a/SuperScriptViewer/static/templates/index_entry.tmpl b/SuperScriptViewer/static/templates/index_entry.tmpl new file mode 100644 index 0000000..8eb99a5 --- /dev/null +++ b/SuperScriptViewer/static/templates/index_entry.tmpl @@ -0,0 +1,8 @@ +{% for key, value in scripts.items() %} +

{{ key|e }}

+
    + {% for i in value %} +
  1. {{ i.name }}
  2. + {% endfor %} +
+{% endfor %} diff --git a/SuperScriptViewer/templates/viewer.html b/SuperScriptViewer/static/templates/viewer.html similarity index 100% rename from SuperScriptViewer/templates/viewer.html rename to SuperScriptViewer/static/templates/viewer.html diff --git a/SuperScriptViewer/templates/help/legend.html b/SuperScriptViewer/templates/help/legend.html deleted file mode 100644 index 7a6ea16..0000000 --- a/SuperScriptViewer/templates/help/legend.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - Help - Viewer legend、 - - - -

Viewer legend

-

This page introduce how to use viewer page.

-
- - - -

Layout

-

In viewer page, it can be divided into 3 panels:

- - - - - - - - -
Navigation panelInformation & tools panel
Graph panel
-
    -
  • Navigation panel: Display current script's hierarchy. And you can click all layers which located in this panel to jump into it.
  • -
  • Information & tools panel: Provide property data, display configuration and some useful tools.
  • -
  • Graph panel: Core panel. Display current browsing behavior graph's data. Some legend will be desscribe in the follwing sector.
  • -
- - - -

Graph legend

-

Block

-
-
-
-
pLocal (including arrtibute) (ParameterLocal abbr.)
-
-
-
-
Shortcut (Only shortcut output)
-
-
-
-
bIn / bOut (BehaviorIn / BehaviorOut abbr.)
-
-
-
-
pIn / pOut (ParameterIn / ParameterOut abbr.)
-
-
-
-
pTarget (ParameterTarget abbr.)
-
-
- - -

Building block

- -

Building block (abbr. BB)

-

All building block can be devided into 2 types: prototype building block and behavior graph

- -
-
- -
-
-
-
-
-
-
- -

Get Cell

-

Get Cell

-
-
-

This is a typical prototype building block. Some port are attached into this building block.
-pIn and pTarget are at the top, pOut are at the bottom, bIn are on the left, and bOut are on the right.
-In the middle of building block, the name of this building block is written in black font, and the name of this building block's prototype is written in white font.

- -
-
- -
-
-
-
-
-
-
-
-
- -

vt2obj

-

-
-
-

This is a typical behavior graph. It is very similar to prototype building block.
-It don't have the name of prototype. Instead, you can click on the name to see what is inside this graph(jump into this graph).

- -

Link

- - - - 0 - bLink (BehaviorLink) - - pLink (ParameterLink) - - eLink (ExportParameterLink) - - - 0 - Highlight bLink - - Highlight pLink - - Highlight eLink - - -

Operation

-
    -
  • You can highlight the associated links by clicking Block or BB, and click again to cancel the highlight.
  • -
  • You can double-click Block or prototoye BB to get the properties associated with it.
  • -
  • You can hover over the Block to view its name and type through tooltip.
  • -
- -

Properties

-

Properties can be visited in Information & tools panel. It can display the information of the object currently being double-clicked.

- -
-

SRectangle/Box Mode(176)

-

dump.data

-
0x01, 0x00, 0x00, 0x00
-

dump.length

-
4
-
-

This is a typical property unit. You may see more than 1 property unit in property list. A property unit may contain more than 1 key-value pair to describe it.
-In the first line, the name of the current property unit (actually a pLocal) will be displayed. The number in brackets is CK_ID. If an S is displayed in front of it (as shown in the figure above), then it is also a setting.

- - - - \ No newline at end of file diff --git a/SuperScriptViewer/templates/index.html b/SuperScriptViewer/templates/index.html deleted file mode 100644 index 92ecbc5..0000000 --- a/SuperScriptViewer/templates/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Script Hierarchy - - - -

Script Hierarchy

-

Choose a script to read it.

-
-
-{% for key, value in scripts.items() %} -

{{ key|e }}

-
    - {% for i in value %} -
  1. {{ i.name }}
  2. - {% endfor %} -
-{% endfor %} -
-
-

Generated by SuperScriptMaterializer

-
-

Help

-

|

-

About

-
- - - \ No newline at end of file