├── __init__.py ├── circle.yml ├── .sandstorm ├── stack ├── pgp-keyring ├── pgp-signature ├── .gitignore ├── screenshots │ ├── permanote-screen-0.png │ ├── permanote-screen-1.png │ ├── permanote-screen-2.png │ ├── permanote-screen-3.png │ ├── permanote-screen-4.png │ ├── permanote-screen-5.png │ └── permanote-screen-6.png ├── .gitattributes ├── app-graphics │ ├── permanote-dolphin24.png │ ├── permanote-dolphin48.png │ ├── permanote-dolphin128.png │ ├── permanote-dolphin150.png │ ├── permanote-dolphin300.png │ └── permanote-dolphin.svg ├── setup.sh ├── build.sh ├── launcher.sh ├── description.md ├── CHANGELOG.md ├── global-setup.sh ├── service-config │ └── mime.types ├── Vagrantfile ├── sandstorm-pkgdef.capnp └── sandstorm-files.list ├── static ├── robots.txt ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.svg ├── css │ └── hilite.css └── js │ ├── jquery.inline-attachment.min.js │ ├── jquery.hotkeys.js │ └── bootstrap.min.js ├── requirements.txt ├── main.py ├── templates ├── taglist.html ├── detail.html ├── includes │ └── pagination.html ├── index.html ├── create.html ├── edit.html └── base.html ├── LICENSE ├── .gitignore ├── app.py ├── README.md ├── models.py └── views.py /__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /circle.yml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.sandstorm/stack: -------------------------------------------------------------------------------- 1 | uwsgi 2 | -------------------------------------------------------------------------------- /static/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | -------------------------------------------------------------------------------- /.sandstorm/pgp-keyring: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/pgp-keyring -------------------------------------------------------------------------------- /.sandstorm/pgp-signature: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/pgp-signature -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | werkzeug 2 | flask 3 | beautifulsoup4 4 | pygments 5 | markdown 6 | peewee 7 | # flask-images 8 | -------------------------------------------------------------------------------- /.sandstorm/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | 3 | # This file stores a list of sub-paths of .sandstorm/ that should be ignored by git. 4 | .vagrant 5 | 6 | -------------------------------------------------------------------------------- /.sandstorm/screenshots/permanote-screen-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/screenshots/permanote-screen-0.png -------------------------------------------------------------------------------- /.sandstorm/screenshots/permanote-screen-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/screenshots/permanote-screen-1.png -------------------------------------------------------------------------------- /.sandstorm/screenshots/permanote-screen-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/screenshots/permanote-screen-2.png -------------------------------------------------------------------------------- /.sandstorm/screenshots/permanote-screen-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/screenshots/permanote-screen-3.png -------------------------------------------------------------------------------- /.sandstorm/screenshots/permanote-screen-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/screenshots/permanote-screen-4.png -------------------------------------------------------------------------------- /.sandstorm/screenshots/permanote-screen-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/screenshots/permanote-screen-5.png -------------------------------------------------------------------------------- /.sandstorm/screenshots/permanote-screen-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/screenshots/permanote-screen-6.png -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /.sandstorm/.gitattributes: -------------------------------------------------------------------------------- 1 | 2 | 3 | # vagrant-spk creates shell scripts, which must end in \n, even on a \r\n system. 4 | *.sh text eol=lf 5 | 6 | -------------------------------------------------------------------------------- /.sandstorm/app-graphics/permanote-dolphin24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/app-graphics/permanote-dolphin24.png -------------------------------------------------------------------------------- /.sandstorm/app-graphics/permanote-dolphin48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/app-graphics/permanote-dolphin48.png -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /.sandstorm/app-graphics/permanote-dolphin128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/app-graphics/permanote-dolphin128.png -------------------------------------------------------------------------------- /.sandstorm/app-graphics/permanote-dolphin150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/app-graphics/permanote-dolphin150.png -------------------------------------------------------------------------------- /.sandstorm/app-graphics/permanote-dolphin300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keybits/permanote/HEAD/.sandstorm/app-graphics/permanote-dolphin300.png -------------------------------------------------------------------------------- /.sandstorm/setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | export DEBIAN_FRONTEND=noninteractive 5 | apt-get update 6 | apt-get install -y sqlite3 build-essential python-dev python-virtualenv 7 | -------------------------------------------------------------------------------- /.sandstorm/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | VENV=/opt/app/env 4 | if [ ! -d $VENV ] ; then 5 | virtualenv $VENV 6 | else 7 | echo "$VENV exists, moving on" 8 | fi 9 | 10 | if [ -f /opt/app/requirements.txt ] ; then 11 | $VENV/bin/pip install -r /opt/app/requirements.txt 12 | fi 13 | -------------------------------------------------------------------------------- /.sandstorm/launcher.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | mkdir -p /var/log 5 | mkdir -p /var/uploads 6 | # Wipe /var/run, since pidfiles and socket files from previous launches should go away 7 | # TODO someday: I'd prefer a tmpfs for these. 8 | rm -rf /var/run 9 | mkdir -p /var/run 10 | 11 | set +o nounset 12 | source /opt/app/env/bin/activate 13 | set -o nounset 14 | cd /opt/app && python main.py 15 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from app import application, flask_db, database 2 | 3 | from models import * 4 | from views import * 5 | 6 | def create_tables(): 7 | # Create table for each model if it does not exist. 8 | database.create_tables([Entry, Tag, EntryTags, FTSEntry], safe=True) 9 | 10 | 11 | if __name__ == '__main__': 12 | create_tables() 13 | # Run on port 8000 for Sandstorm 14 | application.run(host='0.0.0.0', port=8000) 15 | -------------------------------------------------------------------------------- /templates/taglist.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}{{ entry.title }}{% endblock %} 4 | 5 | {% block content_title %}All Tags{% endblock %} 6 | 7 | {% block extra_header %} 8 | {% endblock %} 9 | 10 | {% block content %} 11 | {% for tag in object_list %} 12 |

{{ tag.tag }} ( {{ tag.entry_count}} )

13 | {% else %} 14 |

No tags found.

15 | {% endfor %} 16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /templates/detail.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}{{ entry.title }}{% endblock %} 4 | 5 | {% block extra_header %} 6 |
  • Edit Note
  • 7 | {% endblock %} 8 | 9 | {% block content_title %}{{ entry.title }}{% endblock %} 10 | 11 | 12 | 13 | {% block content %} 14 | {{ entry.html_content }} 15 |

    Tags:

    16 |

    {{ tags }}

    17 |

    Created {{ entry.timestamp.strftime('%Y-%m-%d at %H:%M') }}{% if entry.lastedited.strftime('%Y-%m-%d at %H:%M') != entry.timestamp.strftime('%Y-%m-%d at %H:%M') %} | Last edited {{ entry.lastedited.strftime('%Y-%m-%d at %H:%M') }} 18 | {% endif %} 19 |

    20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /.sandstorm/description.md: -------------------------------------------------------------------------------- 1 | # Permanote Description 2 | 3 | A personal note-taking application designed to be clean and easy to use. 4 | 5 | ## Features 6 | 7 | - Markdown editing for notes 8 | - Copy and paste or drag and drop image uploading 9 | - Full text search 10 | - Tags 11 | - Syntax highlighting 12 | - Rich media embeds (e.g. YouTube videos) 13 | - Archive old notes 14 | - Keyboard shortcuts to create new note and submit note when done editing 15 | 16 | ## Non-features 17 | 18 | - No notebooks - create a new Sandstorm grain 19 | - No user accounts or access control ([because it's a Sandstorm app](https://docs.sandstorm.io/en/latest/developing/handbook/#does-not-implement-user-accounts-or-access-control)) 20 | - No WYSIWIG editing - you need to write your own Markdown 21 | - No syncing or offline capability 22 | -------------------------------------------------------------------------------- /templates/includes/pagination.html: -------------------------------------------------------------------------------- 1 | {% if pagination.get_page_count() > 1 %} 2 | 14 | {% endif %} 15 | -------------------------------------------------------------------------------- /.sandstorm/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 0.1.4 Fix bug when editing 2 | 3 | - Bug fix - vagrant-spk hadn't picked up all the files so Permanote crashed on note editing 4 | 5 | # 0.1.3 Back to Python 2 6 | 7 | - To make Python 3 work it the spk becomes very large as it needs to pull in the whole Python 3 runtime and Debian pure-python packages. So I'm going back to Python 2. 8 | 9 | # 0.1.2 Remove Micawber and change to Python 3 10 | 11 | - for some reason Micawber doesn't work on Sandstorm (will attempt to add again in the future) 12 | - change to Python 3 13 | 14 | # 0.1.1 Fixes for app market submission 15 | 16 | - fix location header bug so that app works in both HTTP and HTTPS environments 17 | - tab directly from Title to Content inputs (bypass 'Help' link) 18 | - change Sandstorm action title to 'New Notebook' 19 | 20 | # 0.1.0 Initial release 21 | 22 | - Functional version for private testing on Sandstorm 23 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}Notes{% endblock %} 4 | 5 | {% block content_title %} 6 | {% if search %}Search "{{ search }}" 7 | {% elif tag %}Notes tagged {{ tag }} 8 | {% elif archive %}Archived Notes 9 | {% else %} Notes {% endif %} 10 | {% endblock %} 11 | 12 | {% block content %} 13 | {% for entry in object_list %} 14 | {% if search %} 15 | {% set entry = entry.entry %} 16 | {% endif %} 17 |

    18 | 19 | {{ entry.title }} 20 | 21 |

    22 |

    Created {{ entry.timestamp.strftime('%Y-%m-%d at %H:%M') }}{% if entry.lastedited.strftime('%Y-%m-%d at %H:%M') != entry.timestamp.strftime('%Y-%m-%d at %H:%M') %} | Last edited {{ entry.lastedited.strftime('%Y-%m-%d at %H:%M') }} 23 | {% endif %} 24 |

    25 | {% else %} 26 |

    No notes to display.

    27 | {% endfor %} 28 | {% include "includes/pagination.html" %} 29 | {% endblock %} 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Tom Atkins 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.db 2 | *.sublime-workspace 3 | *.sublime-project 4 | uploads/ 5 | env/ 6 | *.pyc 7 | PLAN.md 8 | .idea 9 | sandstorm-keyring 10 | .vagrant/ 11 | 12 | # Byte-compiled / optimized / DLL files 13 | __pycache__/ 14 | *.py[cod] 15 | *$py.class 16 | 17 | # C extensions 18 | *.so 19 | 20 | # Distribution / packaging 21 | .Python 22 | env/ 23 | build/ 24 | develop-eggs/ 25 | dist/ 26 | downloads/ 27 | eggs/ 28 | .eggs/ 29 | lib/ 30 | lib64/ 31 | parts/ 32 | sdist/ 33 | var/ 34 | *.egg-info/ 35 | .installed.cfg 36 | *.egg 37 | 38 | # PyInstaller 39 | # Usually these files are written by a python script from a template 40 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 41 | *.manifest 42 | *.spec 43 | 44 | # Installer logs 45 | pip-log.txt 46 | pip-delete-this-directory.txt 47 | 48 | # Unit test / coverage reports 49 | htmlcov/ 50 | .tox/ 51 | .coverage 52 | .coverage.* 53 | .cache 54 | nosetests.xml 55 | coverage.xml 56 | *,cover 57 | .hypothesis/ 58 | 59 | # Translations 60 | *.mo 61 | *.pot 62 | 63 | # Django stuff: 64 | *.log 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | #Ipython Notebook 73 | .ipynb_checkpoints 74 | -------------------------------------------------------------------------------- /.sandstorm/app-graphics/permanote-dolphin.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from flask import Flask 4 | from playhouse.flask_utils import FlaskDB 5 | 6 | # Configuration values. 7 | APP_DIR = os.path.dirname(os.path.realpath(__file__)) 8 | 9 | # The playhouse.flask_utils.FlaskDB object accepts database URL configuration 10 | # set db location and debug depending on if the app is running locally or 11 | # in production on Sandstorm 12 | if os.getenv('SANDSTORM'): 13 | DATABASE = 'sqliteext:////var/permanote.db' 14 | else: 15 | DATABASE = 'sqliteext:///%s' % os.path.join(APP_DIR, 'permanote.db') 16 | 17 | application = Flask(__name__) 18 | application.config.from_object(__name__) 19 | 20 | # FlaskDB is a wrapper for a peewee database that sets up pre/post-request 21 | # hooks for managing database connections. 22 | flask_db = FlaskDB(application) 23 | 24 | # The `database` is the actual peewee database, as opposed to flask_db which is 25 | # the wrapper. 26 | database = flask_db.database 27 | 28 | # Upload folder and file allowed extensions 29 | if os.getenv('SANDSTORM'): 30 | application.config['UPLOAD_FOLDER'] = '/var/uploads' 31 | application.config['DEBUG'] = False 32 | else: 33 | application.config['UPLOAD_FOLDER'] = '%s/uploads' % os.path.join(APP_DIR) 34 | application.config['DEBUG'] = True 35 | 36 | # file types allowed for upload 37 | application.config['ALLOWED_EXTENSIONS'] = set(['jpg', 'jpeg', 'png', 'gif', 'webp']) 38 | 39 | # This is used by micawber, which will attempt to generate rich media 40 | # embedded objects with maxwidth=800. 41 | application.config['SITE_WIDTH'] = 800 42 | 43 | # The secret key is used internally by Flask to encrypt session data stored 44 | # in cookies. Make this unique for your app. 45 | application.config['SECRET_KEY'] = 'asdfkj23kjdflkj23lkjs' 46 | -------------------------------------------------------------------------------- /static/css/hilite.css: -------------------------------------------------------------------------------- 1 | .highlight { 2 | background: #040400; 3 | color: #FFFFFF; 4 | } 5 | 6 | .highlight span.selection { color: #323232; } 7 | .highlight span.gp { color: #9595FF; } 8 | .highlight span.vi { color: #9595FF; } 9 | .highlight span.kn { color: #00C0D1; } 10 | .highlight span.cp { color: #AEE674; } 11 | .highlight span.caret { color: #FFFFFF; } 12 | .highlight span.no { color: #AEE674; } 13 | .highlight span.s2 { color: #BBFB8D; } 14 | .highlight span.nb { color: #A7FDB2; } 15 | .highlight span.nc { color: #C2ABFF; } 16 | .highlight span.nd { color: #AEE674; } 17 | .highlight span.s { color: #BBFB8D; } 18 | .highlight span.nf { color: #AEE674; } 19 | .highlight span.nx { color: #AEE674; } 20 | .highlight span.kp { color: #00C0D1; } 21 | .highlight span.nt { color: #C2ABFF; } 22 | .highlight span.s1 { color: #BBFB8D; } 23 | .highlight span.bg { color: #040400; } 24 | .highlight span.kt { color: #00C0D1; } 25 | .highlight span.support_function { color: #81B864; } 26 | .highlight span.ow { color: #EBE1B4; } 27 | .highlight span.mf { color: #A1FF24; } 28 | .highlight span.bp { color: #9595FF; } 29 | .highlight span.fg { color: #FFFFFF; } 30 | .highlight span.c1 { color: #3379FF; } 31 | .highlight span.kc { color: #9595FF; } 32 | .highlight span.c { color: #3379FF; } 33 | .highlight span.sx { color: #BBFB8D; } 34 | .highlight span.kd { color: #00C0D1; } 35 | .highlight span.ss { color: #A1FF24; } 36 | .highlight span.sr { color: #BBFB8D; } 37 | .highlight span.mo { color: #A1FF24; } 38 | .highlight span.mi { color: #A1FF24; } 39 | .highlight span.mh { color: #A1FF24; } 40 | .highlight span.o { color: #EBE1B4; } 41 | .highlight span.si { color: #DA96A3; } 42 | .highlight span.sh { color: #BBFB8D; } 43 | .highlight span.na { color: #AEE674; } 44 | .highlight span.sc { color: #BBFB8D; } 45 | .highlight span.k { color: #00C0D1; } 46 | .highlight span.se { color: #DA96A3; } 47 | .highlight span.sd { color: #54F79C; } 48 | -------------------------------------------------------------------------------- /.sandstorm/global-setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | CURL_OPTS="--silent --show-error" 5 | echo localhost > /etc/hostname 6 | hostname localhost 7 | curl $CURL_OPTS https://install.sandstorm.io/ > /host-dot-sandstorm/caches/install.sh 8 | SANDSTORM_CURRENT_VERSION=$(curl $CURL_OPTS -f "https://install.sandstorm.io/dev?from=0&type=install") 9 | SANDSTORM_PACKAGE="sandstorm-$SANDSTORM_CURRENT_VERSION.tar.xz" 10 | if [[ ! -f /host-dot-sandstorm/caches/$SANDSTORM_PACKAGE ]] ; then 11 | echo -n "Downloading Sandstorm version ${SANDSTORM_CURRENT_VERSION}..." 12 | curl $CURL_OPTS --output "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE.partial" "https://dl.sandstorm.io/$SANDSTORM_PACKAGE" 13 | mv "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE.partial" "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE" 14 | echo "...done." 15 | fi 16 | if [ ! -e /opt/sandstorm/latest/sandstorm ] ; then 17 | echo -n "Installing Sandstorm version ${SANDSTORM_CURRENT_VERSION}..." 18 | bash /host-dot-sandstorm/caches/install.sh -d -e "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE" >/dev/null 19 | echo "...done." 20 | fi 21 | modprobe ip_tables 22 | # Make the vagrant user part of the sandstorm group so that commands like 23 | # `spk dev` work. 24 | usermod -a -G 'sandstorm' 'vagrant' 25 | # Bind to all addresses, so the vagrant port-forward works. 26 | sudo sed --in-place='' \ 27 | --expression='s/^BIND_IP=.*/BIND_IP=0.0.0.0/' \ 28 | /opt/sandstorm/sandstorm.conf 29 | sudo service sandstorm restart 30 | # Enable apt-cacher-ng proxy to make things faster if one appears to be running on the gateway IP 31 | GATEWAY_IP=$(ip route | grep ^default | cut -d ' ' -f 3) 32 | if nc -z "$GATEWAY_IP" 3142 ; then 33 | echo "Acquire::http::Proxy \"http://$GATEWAY_IP:3142\";" > /etc/apt/apt.conf.d/80httpproxy 34 | fi 35 | # Configure apt to retry fetching things that fail to download. 36 | echo "APT::Acquire::Retries \"10\";" > /etc/apt/apt.conf.d/80sandstorm-retry 37 | -------------------------------------------------------------------------------- /templates/create.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}Create Note{% endblock %} 4 | 5 | {% block content_title %}Create Note{% endblock %} 6 | 7 | {% block content %} 8 |
    9 |
    10 | 11 |
    12 | 13 |
    14 |
    15 |
    16 | 17 |
    18 | 19 |
    20 |
    21 | 22 |
    23 | 24 |
    25 | 26 |
    27 |
    28 | 29 |
    30 |
    31 | 32 | Cancel 33 |
    34 |
    35 | 36 |
    37 |
    38 |
    39 | 42 |
    43 |
    44 |
    45 |
    46 | {% endblock %} 47 | -------------------------------------------------------------------------------- /templates/edit.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}Edit Note{% endblock %} 4 | 5 | {% block content_title %}Edit Note{% endblock %} 6 | 7 | {% block content %} 8 |
    9 |
    10 | 11 |
    12 | 13 |
    14 |
    15 |
    16 | 17 |
    18 | 19 |
    20 |
    21 | 22 |
    23 | 24 |
    25 | 26 |
    27 |
    28 | 29 |
    30 |
    31 | 32 | Cancel 33 |
    34 |
    35 | 36 |
    37 |
    38 |
    39 | 42 |
    43 |
    44 |
    45 | 46 |
    47 | {% endblock %} 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ARCHIVED 2 | 3 | The code in this project is no longer maintained. Leaving it here in case it is of interest to anyone making something similar. 4 | 5 | # Permanote 6 | 7 | Permanote dolphin logo 8 | 9 | A personal note-taking application designed for Sandstorm. 10 | 11 | It has the features I want. I use it for keeping a journal and recording technical tips and documentation when I need longer form notes. For me it has replaced Evernote and Google Keep - although it clearly doesn't have many of Evernote's features. I still use Google Keep for small quick notes that I need to be synced with mobile devices. 12 | 13 | ## Installation 14 | 15 | If you have a Sandstorm account on [Oasis](https://oasis.sandstorm.io/) or a self-hosted Sandstorm instance, it's simple to [install Permanote from the Sandstorm app market](https://apps.sandstorm.io/app/svwrpwnd3c380d1f99ge7g0qnjdq6y785c36s7qtqryxwkmn20qh). 16 | 17 | If you want to run it locally for development, you can clone this repo into a Python 2 virtualenv. Then just `pip install -r requirements.txt` and `python main.py` 18 | 19 | ## Warning and help appreciated 20 | 21 | This was hacked together over a weekend - please consider it Beta software and don't trust important data just yet. The code is horrible in many places! Pull requests gratefully received if you'd like to clean anything up before I get there. 22 | 23 | ## Features 24 | 25 | - Markdown editing for notes 26 | - Copy and paste or drag and drop image uploading 27 | - Full text search 28 | - Tags 29 | - Syntax highlighting 30 | - ~~Rich media embeds (e.g. YouTube videos)~~ removed for now 31 | - Archive old notes 32 | - Keyboard shortcuts to create new note and submit note when done editing 33 | 34 | ## Non-features 35 | 36 | - No notebooks - create a new Sandstorm grain 37 | - No user accounts or access control ([because it's a Sandstorm app](https://docs.sandstorm.io/en/latest/developing/handbook/#does-not-implement-user-accounts-or-access-control)) 38 | - No WYSIWIG editing - you need to write your own Markdown 39 | - No syncing or offline capability 40 | 41 | ## Technology 42 | 43 | - [Flask](http://flask.pocoo.org/) 44 | - [Peewee](http://docs.peewee-orm.com/en/latest/) 45 | - [SQLite](https://www.sqlite.org/) 46 | - [jquery inline-attachment](https://github.com/Rovak/InlineAttachment) 47 | 48 | ## Credits 49 | 50 | ### Charles Leifer 51 | 52 | A lot of the code for this application was lifted directly from [this blog post by Charles Leifer](http://charlesleifer.com/blog/how-to-make-a-flask-blog-in-one-hour-or-less). 53 | 54 | Many thanks to Charles for his helpful blog posts and for creating excellent [support for SQLite](http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#sqlite-extensions) from his [Peewee](http://docs.peewee-orm.com/en/latest/) ORM. This makes a great choice for developing lightweight Sandstorm apps that are easy to develop and fast to load. 55 | 56 | ### Logo 57 | 58 | The dolphin logo is from the [Twitter twemoji collection](https://github.com/twitter/twemoji) ([Creative Commons Attribution License](https://github.com/twitter/twemoji/blob/gh-pages/LICENSE-GRAPHICS)) 59 | 60 | And because this gif exists! 61 | 62 | ![Spinning dolphin](http://media0.giphy.com/media/M6lYPX5nDwcHm/giphy.gif) 63 | 64 | **Why a dolphin for the logo?** Evernote use an elephant for their logo because elephants are known to have good memory. 65 | 66 | Apparently [dolphins have even better memory](http://news.nationalgeographic.com/news/2013/08/130806-dolphins-memories-animals-science-longest/) than elephants. I like how the twemoji dolphin icon has a big head - lots of room to remember stuff in there. 67 | -------------------------------------------------------------------------------- /models.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | 3 | from flask import Markup 4 | from markdown import markdown 5 | from markdown.extensions.codehilite import CodeHiliteExtension 6 | from markdown.extensions.extra import ExtraExtension 7 | from playhouse.sqlite_ext import * 8 | from playhouse.fields import ManyToManyField 9 | 10 | from app import application, flask_db, database 11 | 12 | 13 | class Entry(flask_db.Model): 14 | title = CharField() 15 | slug = CharField(unique=True) 16 | content = TextField() 17 | timestamp = DateTimeField(default=datetime.datetime.now, index=True) 18 | lastedited = DateTimeField(default=datetime.datetime.now, index=True) 19 | archived = BooleanField(default=False) 20 | 21 | @property 22 | def html_content(self): 23 | """ 24 | Generate HTML representation of the markdown-formatted note, 25 | and also convert any media URLs into rich media objects such as video 26 | players or images. 27 | """ 28 | hilite = CodeHiliteExtension(linenums=False, css_class='highlight') 29 | extras = ExtraExtension() 30 | markdown_content = markdown(self.content, extensions=[hilite, extras]) 31 | return Markup(markdown_content) 32 | 33 | def save(self, *args, **kwargs): 34 | # Generate a URL-friendly representation of the entry's title. 35 | if not self.slug: 36 | self.slug = re.sub('[^\w]+', '-', self.title.lower()).strip('-') 37 | ret = super(Entry, self).save(*args, **kwargs) 38 | 39 | # Store search content. 40 | self.update_search_index() 41 | return ret 42 | 43 | def update_search_index(self): 44 | # Create a row in the FTSEntry table with the post content. This will 45 | # allow us to use SQLite's awesome full-text search extension to 46 | # search our entries. 47 | try: 48 | fts_entry = FTSEntry.get(FTSEntry.entry_id == self.id) 49 | except FTSEntry.DoesNotExist: 50 | fts_entry = FTSEntry(entry_id=self.id) 51 | force_insert = True 52 | else: 53 | query = FTSEntry.delete().where(FTSEntry.entry_id == self.id) 54 | query.execute() 55 | force_insert = True 56 | fts_entry.content = '\n'.join((self.title, self.content)) 57 | fts_entry.save(force_insert=force_insert) 58 | 59 | @classmethod 60 | def public(cls): 61 | return Entry.select().where(Entry.archived == False) 62 | 63 | @classmethod 64 | def all(cls): 65 | return Entry.select() 66 | 67 | @classmethod 68 | def archive(cls): 69 | return Entry.select().where(Entry.archived == True) 70 | 71 | @classmethod 72 | def search(cls, query): 73 | words = [word.strip() for word in query.split() if word.strip()] 74 | if not words: 75 | # Return an empty query. 76 | return Entry.select().where(Entry.id == 0) 77 | else: 78 | search = ' '.join(words) 79 | 80 | # Query the full-text search index for entries matching the given 81 | # search query, then join the actual Entry data on the matching 82 | # search result. 83 | return (FTSEntry 84 | .select( 85 | FTSEntry, 86 | Entry, 87 | FTSEntry.rank().alias('score')) 88 | .join(Entry, on=(FTSEntry.entry_id == Entry.id).alias('entry')) 89 | .where( 90 | (Entry.archived == False) & 91 | (FTSEntry.match(search))) 92 | .order_by(SQL('score').desc())) 93 | 94 | 95 | class Tag(flask_db.Model): 96 | tag = CharField() 97 | entries = ManyToManyField(Entry, related_name='tags') 98 | 99 | 100 | EntryTags = Tag.entries.get_through_model() 101 | 102 | 103 | class FTSEntry(FTSModel): 104 | entry_id = IntegerField(Entry) 105 | content = TextField() 106 | 107 | class Meta: 108 | database = database 109 | -------------------------------------------------------------------------------- /.sandstorm/service-config/mime.types: -------------------------------------------------------------------------------- 1 | 2 | types { 3 | text/html html htm shtml; 4 | text/css css; 5 | text/xml xml; 6 | image/gif gif; 7 | image/jpeg jpeg jpg; 8 | application/javascript js; 9 | application/atom+xml atom; 10 | application/rss+xml rss; 11 | 12 | text/mathml mml; 13 | text/plain txt; 14 | text/vnd.sun.j2me.app-descriptor jad; 15 | text/vnd.wap.wml wml; 16 | text/x-component htc; 17 | 18 | image/png png; 19 | image/tiff tif tiff; 20 | image/vnd.wap.wbmp wbmp; 21 | image/x-icon ico; 22 | image/x-jng jng; 23 | image/x-ms-bmp bmp; 24 | image/svg+xml svg svgz; 25 | image/webp webp; 26 | 27 | application/font-woff woff; 28 | application/java-archive jar war ear; 29 | application/json json; 30 | application/mac-binhex40 hqx; 31 | application/msword doc; 32 | application/pdf pdf; 33 | application/postscript ps eps ai; 34 | application/rtf rtf; 35 | application/vnd.apple.mpegurl m3u8; 36 | application/vnd.ms-excel xls; 37 | application/vnd.ms-fontobject eot; 38 | application/vnd.ms-powerpoint ppt; 39 | application/vnd.wap.wmlc wmlc; 40 | application/vnd.google-earth.kml+xml kml; 41 | application/vnd.google-earth.kmz kmz; 42 | application/x-7z-compressed 7z; 43 | application/x-cocoa cco; 44 | application/x-java-archive-diff jardiff; 45 | application/x-java-jnlp-file jnlp; 46 | application/x-makeself run; 47 | application/x-perl pl pm; 48 | application/x-pilot prc pdb; 49 | application/x-rar-compressed rar; 50 | application/x-redhat-package-manager rpm; 51 | application/x-sea sea; 52 | application/x-shockwave-flash swf; 53 | application/x-stuffit sit; 54 | application/x-tcl tcl tk; 55 | application/x-x509-ca-cert der pem crt; 56 | application/x-xpinstall xpi; 57 | application/xhtml+xml xhtml; 58 | application/xspf+xml xspf; 59 | application/zip zip; 60 | 61 | application/octet-stream bin exe dll; 62 | application/octet-stream deb; 63 | application/octet-stream dmg; 64 | application/octet-stream iso img; 65 | application/octet-stream msi msp msm; 66 | 67 | application/vnd.openxmlformats-officedocument.wordprocessingml.document docx; 68 | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx; 69 | application/vnd.openxmlformats-officedocument.presentationml.presentation pptx; 70 | 71 | audio/midi mid midi kar; 72 | audio/mpeg mp3; 73 | audio/ogg ogg; 74 | audio/x-m4a m4a; 75 | audio/x-realaudio ra; 76 | 77 | video/3gpp 3gpp 3gp; 78 | video/mp2t ts; 79 | video/mp4 mp4; 80 | video/mpeg mpeg mpg; 81 | video/quicktime mov; 82 | video/webm webm; 83 | video/x-flv flv; 84 | video/x-m4v m4v; 85 | video/x-mng mng; 86 | video/x-ms-asf asx asf; 87 | video/x-ms-wmv wmv; 88 | video/x-msvideo avi; 89 | } 90 | -------------------------------------------------------------------------------- /static/js/jquery.inline-attachment.min.js: -------------------------------------------------------------------------------- 1 | /*! inline-attachment - v2.0.2 - 2015-11-03 */ 2 | !function(a,b){"use strict";var c=function(a,b){this.settings=c.util.merge(a,c.defaults),this.editor=b,this.filenameTag="{filename}",this.lastValue=null};c.editors={},c.util={merge:function(){for(var a={},b=arguments.length-1;b>=0;b--){var c=arguments[b];for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}return a},appendInItsOwnLine:function(a,b){return(a+"\n\n[[D]]"+b).replace(/(\n{2,})\[\[D\]\]/,"\n\n").replace(/^(\n*)/,"")},insertTextAtCursor:function(b,c){var d,e=b.scrollTop,f=0,g=!1;b.selectionStart||"0"===b.selectionStart?g="ff":a.selection&&(g="ie"),"ie"===g?(b.focus(),d=a.selection.createRange(),d.moveStart("character",-b.value.length),f=d.text.length):"ff"===g&&(f=b.selectionStart);var h=b.value.substring(0,f),i=b.value.substring(f,b.value.length);b.value=h+c+i,f+=c.length,"ie"===g?(b.focus(),d=a.selection.createRange(),d.moveStart("character",-b.value.length),d.moveStart("character",f),d.moveEnd("character",0),d.select()):"ff"===g&&(b.selectionStart=f,b.selectionEnd=f,b.focus()),b.scrollTop=e}},c.defaults={uploadUrl:"upload_attachment.php",uploadMethod:"POST",uploadFieldName:"file",defaultExtension:"png",jsonFieldName:"filename",allowedTypes:["image/jpeg","image/png","image/jpg","image/gif"],progressText:"![Uploading file...]()",urlText:"![file]({filename})",errorText:"Error uploading file",extraParams:{},extraHeaders:{},beforeFileUpload:function(){return!0},onFileReceived:function(){},onFileUploadResponse:function(){return!0},onFileUploadError:function(){return!0},onFileUploaded:function(){}},c.prototype.uploadFile=function(a){var b=this,c=new FormData,d=new XMLHttpRequest,e=this.settings,f=e.defaultExtension||e.defualtExtension;if("function"==typeof e.setupFormData&&e.setupFormData(c,a),a.name){var g=a.name.match(/\.(.+)$/);g&&(f=g[1])}var h="image-"+Date.now()+"."+f;if("function"==typeof e.remoteFilename&&(h=e.remoteFilename(a)),c.append(e.uploadFieldName,a,h),"object"==typeof e.extraParams)for(var i in e.extraParams)e.extraParams.hasOwnProperty(i)&&c.append(i,e.extraParams[i]);if(d.open("POST",e.uploadUrl),"object"==typeof e.extraHeaders)for(var j in e.extraHeaders)e.extraHeaders.hasOwnProperty(j)&&d.setRequestHeader(j,e.extraHeaders[j]);return d.onload=function(){200===d.status||201===d.status?b.onFileUploadResponse(d):b.onFileUploadError(d)},e.beforeFileUpload(d)!==!1&&d.send(c),d},c.prototype.isFileAllowed=function(a){return 0===this.settings.allowedTypes.indexOf("*")?!0:this.settings.allowedTypes.indexOf(a.type)>=0},c.prototype.onFileUploadResponse=function(a){if(this.settings.onFileUploadResponse.call(this,a)!==!1){var b=JSON.parse(a.responseText),c=b[this.settings.jsonFieldName];if(b&&c){var d=this.settings.urlText.replace(this.filenameTag,c),e=this.editor.getValue().replace(this.lastValue,d);this.editor.setValue(e),this.settings.onFileUploaded.call(this,c)}}},c.prototype.onFileUploadError=function(a){if(this.settings.onFileUploadError.call(this,a)!==!1){var b=this.editor.getValue().replace(this.lastValue,"");this.editor.setValue(b)}},c.prototype.onFileInserted=function(a){this.settings.onFileReceived.call(this,a)!==!1&&(this.lastValue=this.settings.progressText,this.editor.insertValue(this.lastValue))},c.prototype.onPaste=function(a){var b,c=!1,d=a.clipboardData;if("object"==typeof d){b=d.items||d.files||[];for(var e=0;e 2 | 3 | 4 | Permanote 5 | 6 | 7 | 8 | 9 | 10 | 11 | {% block extra_head %}{% endblock %} 12 | 13 | 14 | 15 | 16 | {% block extra_scripts %}{% endblock %} 17 | 18 | 19 | 20 | 48 | 49 |
    50 | {% for category, message in get_flashed_messages(with_categories=true) %} 51 |
    52 | 53 |

    {{ message }}

    54 |
    55 | {% endfor %} 56 | 57 | {% block page_header %} 58 | 61 | {% endblock %} 62 | 63 | {% block content %}{% endblock %} 64 | 65 |
    66 |
    67 |
    68 |
    69 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /.sandstorm/Vagrantfile: -------------------------------------------------------------------------------- 1 | # -*- mode: ruby -*- 2 | # vi: set ft=ruby : 3 | 4 | # Guess at a reasonable name for the VM based on the folder vagrant-spk is 5 | # run from. The timestamp is there to avoid conflicts if you have multiple 6 | # folders with the same name. 7 | VM_NAME = File.basename(File.dirname(File.dirname(__FILE__))) + "_sandstorm_#{Time.now.utc.to_i}" 8 | 9 | # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! 10 | VAGRANTFILE_API_VERSION = "2" 11 | 12 | Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 13 | # Base on the Sandstorm snapshots of the official Debian 8 (jessie) box. 14 | config.vm.box = "sandstorm/debian-jessie64" 15 | 16 | if Vagrant.has_plugin?("vagrant-vbguest") then 17 | # vagrant-vbguest is a Vagrant plugin that upgrades 18 | # the version of VirtualBox Guest Additions within each 19 | # guest. If you have the vagrant-vbguest plugin, then it 20 | # needs to know how to compile kernel modules, etc., and so 21 | # we give it this hint about operating system type. 22 | config.vm.guest = "debian" 23 | end 24 | 25 | # We forward port 6080, the Sandstorm web port, so that developers can 26 | # visit their sandstorm app from their browser as local.sandstorm.io:6080 27 | # (aka 127.0.0.1:6080). 28 | config.vm.network :forwarded_port, guest: 6080, host: 6080 29 | 30 | # Use a shell script to "provision" the box. This installs Sandstorm using 31 | # the bundled installer. 32 | config.vm.provision "shell", inline: "sudo bash /opt/app/.sandstorm/global-setup.sh", keep_color: true 33 | # Then, do stack-specific and app-specific setup. 34 | config.vm.provision "shell", inline: "sudo bash /opt/app/.sandstorm/setup.sh", keep_color: true 35 | 36 | # Shared folders are configured per-provider since vboxsf can't handle >4096 open files, 37 | # NFS requires privilege escalation every time you bring a VM up, 38 | # and 9p is only available on libvirt. 39 | 40 | # Calculate the number of CPUs and the amount of RAM the system has, 41 | # in a platform-dependent way; further logic below. 42 | cpus = nil 43 | total_kB_ram = nil 44 | 45 | host = RbConfig::CONFIG['host_os'] 46 | if host =~ /darwin/ 47 | cpus = `sysctl -n hw.ncpu`.to_i 48 | total_kB_ram = `sysctl -n hw.memsize`.to_i / 1024 49 | elsif host =~ /linux/ 50 | cpus = `nproc`.to_i 51 | total_kB_ram = `grep MemTotal /proc/meminfo | awk '{print $2}'`.to_i 52 | elsif host =~ /mingw/ 53 | # powershell may not be available on Windows XP and Vista, so wrap this in a rescue block 54 | begin 55 | cpus = `powershell -Command "(Get-WmiObject Win32_Processor -Property NumberOfLogicalProcessors | Select-Object -Property NumberOfLogicalProcessors | Measure-Object NumberOfLogicalProcessors -Sum).Sum"`.to_i 56 | total_kB_ram = `powershell -Command "Get-CimInstance -class cim_physicalmemory | % $_.Capacity}"`.to_i / 1024 57 | rescue 58 | end 59 | end 60 | # Use the same number of CPUs within Vagrant as the system, with 1 61 | # as a default. 62 | # 63 | # Use at least 512MB of RAM, and if the system has more than 2GB of 64 | # RAM, use 1/4 of the system RAM. This seems a reasonable compromise 65 | # between having the Vagrant guest operating system not run out of 66 | # RAM entirely (which it basically would if we went much lower than 67 | # 512MB) and also allowing it to use up a healthily large amount of 68 | # RAM so it can run faster on systems that can afford it. 69 | if cpus.nil? or cpus.zero? 70 | cpus = 1 71 | end 72 | if total_kB_ram.nil? or total_kB_ram < 2048000 73 | assign_ram_mb = 512 74 | else 75 | assign_ram_mb = (total_kB_ram / 1024 / 4) 76 | end 77 | # Actually apply these CPU/memory values to the providers. 78 | config.vm.provider :virtualbox do |vb, override| 79 | vb.cpus = cpus 80 | vb.memory = assign_ram_mb 81 | vb.name = VM_NAME 82 | vb.customize ["modifyvm", :id, "--nictype1", "Am79C973"] 83 | 84 | override.vm.synced_folder "..", "/opt/app" 85 | override.vm.synced_folder ENV["HOME"] + "/.sandstorm", "/host-dot-sandstorm" 86 | override.vm.synced_folder "..", "/vagrant", disabled: true 87 | end 88 | config.vm.provider :libvirt do |libvirt, override| 89 | libvirt.cpus = cpus 90 | libvirt.memory = assign_ram_mb 91 | libvirt.default_prefix = VM_NAME 92 | 93 | override.vm.synced_folder "..", "/opt/app", type: "9p", accessmode: "passthrough" 94 | override.vm.synced_folder ENV["HOME"] + "/.sandstorm", "/host-dot-sandstorm", type: "9p", accessmode: "passthrough" 95 | override.vm.synced_folder "..", "/vagrant", type: "9p", accessmode: "passthrough", disabled: true 96 | end 97 | end 98 | -------------------------------------------------------------------------------- /static/js/jquery.hotkeys.js: -------------------------------------------------------------------------------- 1 | /*jslint browser: true*/ 2 | /*jslint jquery: true*/ 3 | 4 | /* 5 | * jQuery Hotkeys Plugin 6 | * Copyright 2010, John Resig 7 | * Dual licensed under the MIT or GPL Version 2 licenses. 8 | * 9 | * Based upon the plugin by Tzury Bar Yochay: 10 | * https://github.com/tzuryby/jquery.hotkeys 11 | * 12 | * Original idea by: 13 | * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/ 14 | */ 15 | 16 | /* 17 | * One small change is: now keys are passed by object { keys: '...' } 18 | * Might be useful, when you want to pass some other data to your handler 19 | */ 20 | 21 | (function(jQuery) { 22 | 23 | jQuery.hotkeys = { 24 | version: "0.2.0", 25 | 26 | specialKeys: { 27 | 8: "backspace", 28 | 9: "tab", 29 | 10: "return", 30 | 13: "return", 31 | 16: "shift", 32 | 17: "ctrl", 33 | 18: "alt", 34 | 19: "pause", 35 | 20: "capslock", 36 | 27: "esc", 37 | 32: "space", 38 | 33: "pageup", 39 | 34: "pagedown", 40 | 35: "end", 41 | 36: "home", 42 | 37: "left", 43 | 38: "up", 44 | 39: "right", 45 | 40: "down", 46 | 45: "insert", 47 | 46: "del", 48 | 59: ";", 49 | 61: "=", 50 | 96: "0", 51 | 97: "1", 52 | 98: "2", 53 | 99: "3", 54 | 100: "4", 55 | 101: "5", 56 | 102: "6", 57 | 103: "7", 58 | 104: "8", 59 | 105: "9", 60 | 106: "*", 61 | 107: "+", 62 | 109: "-", 63 | 110: ".", 64 | 111: "/", 65 | 112: "f1", 66 | 113: "f2", 67 | 114: "f3", 68 | 115: "f4", 69 | 116: "f5", 70 | 117: "f6", 71 | 118: "f7", 72 | 119: "f8", 73 | 120: "f9", 74 | 121: "f10", 75 | 122: "f11", 76 | 123: "f12", 77 | 144: "numlock", 78 | 145: "scroll", 79 | 173: "-", 80 | 186: ";", 81 | 187: "=", 82 | 188: ",", 83 | 189: "-", 84 | 190: ".", 85 | 191: "/", 86 | 192: "`", 87 | 219: "[", 88 | 220: "\\", 89 | 221: "]", 90 | 222: "'" 91 | }, 92 | 93 | shiftNums: { 94 | "`": "~", 95 | "1": "!", 96 | "2": "@", 97 | "3": "#", 98 | "4": "$", 99 | "5": "%", 100 | "6": "^", 101 | "7": "&", 102 | "8": "*", 103 | "9": "(", 104 | "0": ")", 105 | "-": "_", 106 | "=": "+", 107 | ";": ": ", 108 | "'": "\"", 109 | ",": "<", 110 | ".": ">", 111 | "/": "?", 112 | "\\": "|" 113 | }, 114 | 115 | // excludes: button, checkbox, file, hidden, image, password, radio, reset, search, submit, url 116 | textAcceptingInputTypes: [ 117 | "text", "password", "number", "email", "url", "range", "date", "month", "week", "time", "datetime", 118 | "datetime-local", "search", "color", "tel"], 119 | 120 | // default input types not to bind to unless bound directly 121 | textInputTypes: /textarea|input|select/i, 122 | 123 | options: { 124 | filterInputAcceptingElements: true, 125 | filterTextInputs: true, 126 | filterContentEditable: true 127 | } 128 | }; 129 | 130 | function keyHandler(handleObj) { 131 | if (typeof handleObj.data === "string") { 132 | handleObj.data = { 133 | keys: handleObj.data 134 | }; 135 | } 136 | 137 | // Only care when a possible input has been specified 138 | if (!handleObj.data || !handleObj.data.keys || typeof handleObj.data.keys !== "string") { 139 | return; 140 | } 141 | 142 | var origHandler = handleObj.handler, 143 | keys = handleObj.data.keys.toLowerCase().split(" "); 144 | 145 | handleObj.handler = function(event) { 146 | // Don't fire in text-accepting inputs that we didn't directly bind to 147 | if (this !== event.target && 148 | (jQuery.hotkeys.options.filterInputAcceptingElements && 149 | jQuery.hotkeys.textInputTypes.test(event.target.nodeName) || 150 | (jQuery.hotkeys.options.filterContentEditable && jQuery(event.target).attr('contenteditable')) || 151 | (jQuery.hotkeys.options.filterTextInputs && 152 | jQuery.inArray(event.target.type, jQuery.hotkeys.textAcceptingInputTypes) > -1))) { 153 | return; 154 | } 155 | 156 | var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[event.which], 157 | character = String.fromCharCode(event.which).toLowerCase(), 158 | modif = "", 159 | possible = {}; 160 | 161 | jQuery.each(["alt", "ctrl", "shift"], function(index, specialKey) { 162 | 163 | if (event[specialKey + 'Key'] && special !== specialKey) { 164 | modif += specialKey + '+'; 165 | } 166 | }); 167 | 168 | // metaKey is triggered off ctrlKey erronously 169 | if (event.metaKey && !event.ctrlKey && special !== "meta") { 170 | modif += "meta+"; 171 | } 172 | 173 | if (event.metaKey && special !== "meta" && modif.indexOf("alt+ctrl+shift+") > -1) { 174 | modif = modif.replace("alt+ctrl+shift+", "hyper+"); 175 | } 176 | 177 | if (special) { 178 | possible[modif + special] = true; 179 | } 180 | else { 181 | possible[modif + character] = true; 182 | possible[modif + jQuery.hotkeys.shiftNums[character]] = true; 183 | 184 | // "$" can be triggered as "Shift+4" or "Shift+$" or just "$" 185 | if (modif === "shift+") { 186 | possible[jQuery.hotkeys.shiftNums[character]] = true; 187 | } 188 | } 189 | 190 | for (var i = 0, l = keys.length; i < l; i++) { 191 | if (possible[keys[i]]) { 192 | return origHandler.apply(this, arguments); 193 | } 194 | } 195 | }; 196 | } 197 | 198 | jQuery.each(["keydown", "keyup", "keypress"], function() { 199 | jQuery.event.special[this] = { 200 | add: keyHandler 201 | }; 202 | }); 203 | 204 | })(jQuery || this.jQuery || window.jQuery); 205 | -------------------------------------------------------------------------------- /views.py: -------------------------------------------------------------------------------- 1 | import os 2 | import datetime 3 | import urllib 4 | 5 | from flask import (flash, redirect, render_template, request, 6 | Response, url_for, jsonify, send_from_directory) 7 | from flask import url_for as flask_url_for 8 | from werkzeug.utils import secure_filename 9 | from playhouse.flask_utils import get_object_or_404, object_list 10 | from playhouse.sqlite_ext import * 11 | 12 | from app import application 13 | from models import Entry, Tag, EntryTags 14 | 15 | # Make url_for use https when hosted on Sandstorm with SSL 16 | def url_for(endpoint, **kwargs): 17 | if os.getenv('SANDSTORM'): 18 | kwargs.setdefault('_external', True) 19 | if request.headers.get('X-Forwarded-Proto') == "https": 20 | kwargs.setdefault('_scheme', 'https') 21 | else: 22 | kwargs.setdefault('_scheme', 'http') 23 | return flask_url_for(endpoint, **kwargs) 24 | 25 | @application.route('/') 26 | def index(): 27 | search_query = request.args.get('q') 28 | if search_query: 29 | query = Entry.search(search_query) 30 | else: 31 | query = Entry.public().order_by(Entry.timestamp.desc()) 32 | 33 | # The `object_list` helper will take a base query and then handle 34 | # paginating the results if there are more than 20. For more info see 35 | # the docs: 36 | # http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#object_list 37 | return object_list( 38 | 'index.html', 39 | query, 40 | search=search_query, 41 | check_bounds=False) 42 | 43 | @application.route('/archive/') 44 | def archive(): 45 | query = Entry.archive().order_by(Entry.timestamp.desc()) 46 | return object_list( 47 | 'index.html', 48 | query, 49 | archive=archive, 50 | check_bounds=False) 51 | 52 | @application.route('/create/', methods=['GET', 'POST']) 53 | def create(): 54 | if request.method == 'POST': 55 | if request.form.get('title') and request.form.get('content'): 56 | try: 57 | entry = Entry.create( 58 | title=request.form['title'], 59 | content=request.form['content'], 60 | archived=request.form.get('archived') or False) 61 | tags = request.form['tags'].split() 62 | # present is a check to see if the tag exists 63 | present = 0 64 | # add or create tags 65 | for tag in tags: 66 | for entrytag in entry.tags: 67 | if tag == entrytag.tag: 68 | present = 1 69 | if present == 0: 70 | try: 71 | thistag = Tag.get(Tag.tag == tag) 72 | entry.tags.add(thistag) 73 | except: 74 | tag_obj, was_created = Tag.create_or_get(tag=tag) 75 | EntryTags.create(tag=tag_obj, entry=entry) 76 | present = 0 77 | flash('Entry created successfully.', 'success') 78 | return redirect(url_for('detail', slug=entry.slug)) 79 | except: 80 | flash('Note title already exists', 'danger') 81 | return render_template('create.html') 82 | # TODO Refactor the below and above to make it more DRY or not 83 | # to need to display seconds (e.g. add some kind of suffix if entry 84 | # already exists) 85 | elif request.form.get('content'): 86 | entry = Entry.create( 87 | title="{:%a %d %b %Y at %H:%M:%S}".format(datetime.datetime.now()), 88 | content=request.form['content']) 89 | flash('Note created successfully.', 'success') 90 | return redirect(url_for('detail', slug=entry.slug)) 91 | else: 92 | flash('Content is required.', 'danger') 93 | return render_template('create.html') 94 | 95 | 96 | @application.route('//') 97 | def detail(slug): 98 | query = Entry.all() 99 | entry = get_object_or_404(query, Entry.slug == slug) 100 | tags = "" 101 | for tag in entry.tags: 102 | tags = tags + " " + tag.tag 103 | return render_template('detail.html', entry=entry, tags=tags) 104 | 105 | 106 | @application.route('//edit/', methods=['GET', 'POST']) 107 | def edit(slug): 108 | entry = get_object_or_404(Entry, Entry.slug == slug) 109 | tags = "" 110 | for tag in entry.tags: 111 | tags = tags + " " + tag.tag 112 | if request.method == 'POST': 113 | if request.form.get('title') and request.form.get('content'): 114 | try: 115 | entry.title = request.form['title'] 116 | entry.content = request.form['content'] 117 | entry.archived = request.form.get('archived') or False 118 | entry.lastedited = datetime.datetime.now() 119 | # convert the string of tags to a list 120 | tags = request.form['tags'].split() 121 | # present is a check to see if the tag exists 122 | present = 0 123 | # add or create tags 124 | for tag in tags: 125 | for entrytag in entry.tags: 126 | if tag == entrytag.tag: 127 | present = 1 128 | if present == 0: 129 | try: 130 | thistag = Tag.get(Tag.tag == tag) 131 | entry.tags.add(thistag) 132 | except: 133 | tag_obj, was_created = Tag.create_or_get(tag=tag) 134 | EntryTags.create(tag=tag_obj, entry=entry) 135 | present = 0 136 | # remove tags 137 | for entrytag in entry.tags: 138 | for tag in tags: 139 | if entrytag.tag == tag: 140 | present = 1 141 | if present == 0: 142 | thistag = Tag.get(Tag.tag == entrytag.tag) 143 | entry.tags.remove(thistag) 144 | present = 0 145 | entry.save() 146 | 147 | flash('Note updated successfully.', 'success') 148 | return redirect(url_for('detail', slug=entry.slug)) 149 | except: 150 | flash('Note title already exists', 'danger') 151 | return render_template('create.html') 152 | else: 153 | flash('Title and Content are required.', 'danger') 154 | 155 | return render_template('edit.html', entry=entry, tags=tags) 156 | 157 | 158 | @application.route('/tags/') 159 | def taglist(): 160 | count = fn.COUNT(EntryTags.id) 161 | tags_with_counts = (Tag 162 | .select(Tag, count.alias('entry_count')) 163 | .join(EntryTags) 164 | .join(Entry) 165 | .where(Entry.archived==False) 166 | .group_by(Tag) 167 | .order_by(count.desc(), Tag.tag)) 168 | return object_list('taglist.html', tags_with_counts, check_bounds=False) 169 | 170 | 171 | @application.route('/tag//') 172 | def thistag(tag): 173 | search_query = request.args.get('q') 174 | query = (Entry.public() 175 | .select() 176 | .join(EntryTags) 177 | .join(Tag) 178 | .where( 179 | (Tag.tag == tag)) 180 | .order_by(Entry.timestamp.desc())) 181 | return object_list( 182 | 'index.html', 183 | query, 184 | tag=tag, 185 | search=search_query, 186 | check_bounds=False) 187 | 188 | 189 | @application.route('/upload/', methods=['GET', 'POST']) 190 | def upload_file(): 191 | if request.method == 'POST': 192 | file = request.files['file'] 193 | if file and allowed_file(file.filename): 194 | filename = secure_filename(file.filename) 195 | file.save(os.path.join(application.config['UPLOAD_FOLDER'], filename)) 196 | filenamedict = dict([("filename", os.path.join('/uploads/', filename))]) 197 | else: 198 | filenamedict = dict([("error", "Error while uploading file")]) 199 | # see http://stackoverflow.com/a/13089975/94908 for explanation of the below 200 | return jsonify(**filenamedict) 201 | 202 | 203 | def allowed_file(filename): 204 | return '.' in filename and \ 205 | filename.rsplit('.', 1)[1] in application.config['ALLOWED_EXTENSIONS'] 206 | 207 | 208 | @application.route('/uploads/') 209 | def uploaded_file(filename): 210 | return send_from_directory(application.config['UPLOAD_FOLDER'], 211 | filename) 212 | 213 | 214 | @application.template_filter('clean_querystring') 215 | def clean_querystring(request_args, *keys_to_remove, **new_values): 216 | # We'll use this template filter in the pagination include. This filter 217 | # will take the current URL and allow us to preserve the arguments in the 218 | # querystring while replacing any that we need to overwrite. For instance 219 | # if your URL is /?q=search+query&page=2 and we want to preserve the search 220 | # term but make a link to page 3, this filter will allow us to do that. 221 | querystring = dict((key, value) for key, value in request_args.items()) 222 | for key in keys_to_remove: 223 | querystring.pop(key, None) 224 | querystring.update(new_values) 225 | return urllib.urlencode(querystring) 226 | 227 | 228 | @application.errorhandler(404) 229 | def not_found(exc): 230 | return Response('

    Not found

    '), 404 231 | -------------------------------------------------------------------------------- /.sandstorm/sandstorm-pkgdef.capnp: -------------------------------------------------------------------------------- 1 | @0xa821a41ffa687175; 2 | 3 | using Spk = import "/sandstorm/package.capnp"; 4 | # This imports: 5 | # $SANDSTORM_HOME/latest/usr/include/sandstorm/package.capnp 6 | # Check out that file to see the full, documented package definition format. 7 | 8 | const pkgdef :Spk.PackageDefinition = ( 9 | # The package definition. Note that the spk tool looks specifically for the 10 | # "pkgdef" constant. 11 | 12 | id = "svwrpwnd3c380d1f99ge7g0qnjdq6y785c36s7qtqryxwkmn20qh", 13 | # Your app ID is actually its public key. The private key was placed in 14 | # your keyring. All updates must be signed with the same key. 15 | 16 | manifest = ( 17 | # This manifest is included in your app package to tell Sandstorm 18 | # about your app. 19 | 20 | appTitle = (defaultText = "Permanote"), 21 | 22 | appVersion = 5, # Increment this for every release. 23 | 24 | appMarketingVersion = (defaultText = "0.1.4"), 25 | # Human-readable representation of appVersion. Should match the way you 26 | # identify versions of your app in documentation and marketing. 27 | 28 | actions = [ 29 | # Define your "new document" handlers here. 30 | ( title = (defaultText = "New Notebook"), 31 | command = .myCommand 32 | # The command to run when starting for the first time. (".myCommand" 33 | # is just a constant defined at the bottom of the file.) 34 | ) 35 | ], 36 | 37 | continueCommand = .myCommand, 38 | # This is the command called to start your app back up after it has been 39 | # shut down for inactivity. Here we're using the same command as for 40 | # starting a new instance, but you could use different commands for each 41 | # case. 42 | 43 | metadata = ( 44 | icons = ( 45 | appGrid = (png = (dpi1x = embed "app-graphics/permanote-dolphin128.png")), 46 | grain = (png = (dpi1x = embed "app-graphics/permanote-dolphin24.png", 47 | dpi2x = embed "app-graphics/permanote-dolphin48.png")), 48 | market = (png = (dpi1x = embed "app-graphics/permanote-dolphin150.png")), 49 | marketBig = (png = (dpi1x = embed "app-graphics/permanote-dolphin300.png")) 50 | ), 51 | website = "https://github.com/keybits/permanote", 52 | codeUrl = "https://github.com/keybits/permanote", 53 | license = (openSource = mit), 54 | categories = [productivity], 55 | author = ( 56 | contactEmail = "tom@keybits.net", 57 | pgpSignature = embed "pgp-signature", 58 | ), 59 | pgpKeyring = embed "pgp-keyring", 60 | description = (defaultText = embed "description.md"), 61 | shortDescription = (defaultText = "Note-taking"), 62 | screenshots = [ 63 | # Screenshots to use for marketing purposes. Examples below. 64 | # Sizes are given in device-independent pixels, so if you took these 65 | # screenshots on a Retina-style high DPI screen, divide each dimension by two. 66 | 67 | (width = 841, height = 618, png = embed "screenshots/permanote-screen-0.png"), 68 | (width = 870, height = 765, png = embed "screenshots/permanote-screen-1.png"), 69 | (width = 883, height = 548, png = embed "screenshots/permanote-screen-2.png"), 70 | (width = 842, height = 536, png = embed "screenshots/permanote-screen-3.png"), 71 | (width = 858, height = 804, png = embed "screenshots/permanote-screen-4.png"), 72 | (width = 869, height = 813, png = embed "screenshots/permanote-screen-5.png"), 73 | (width = 858, height = 467, png = embed "screenshots/permanote-screen-6.png"), 74 | ], 75 | changeLog = (defaultText = embed "CHANGELOG.md"), 76 | # Documents the history of changes in Github-flavored markdown format (with the same restrictions 77 | # as govern `description`). We recommend formatting this with an H1 heading for each version 78 | # followed by a bullet list of changes. 79 | ), 80 | ), 81 | 82 | sourceMap = ( 83 | # Here we defined where to look for files to copy into your package. The 84 | # `spk dev` command actually figures out what files your app needs 85 | # automatically by running it on a FUSE filesystem. So, the mappings 86 | # here are only to tell it where to find files that the app wants. 87 | searchPath = [ 88 | ( sourcePath = "." ), # Search this directory first. 89 | ( sourcePath = "/", # Then search the system root directory. 90 | hidePaths = [ "home", "proc", "sys", 91 | "etc/passwd", "etc/hosts", "etc/host.conf", 92 | "etc/nsswitch.conf", "etc/resolv.conf" ] 93 | # You probably don't want the app pulling files from these places, 94 | # so we hide them. Note that /dev, /var, and /tmp are implicitly 95 | # hidden because Sandstorm itself provides them. 96 | ) 97 | ] 98 | ), 99 | 100 | fileList = "sandstorm-files.list", 101 | # `spk dev` will write a list of all the files your app uses to this file. 102 | # You should review it later, before shipping your app. 103 | 104 | alwaysInclude = [], 105 | # Fill this list with more names of files or directories that should be 106 | # included in your package, even if not listed in sandstorm-files.list. 107 | # Use this to force-include stuff that you know you need but which may 108 | # not have been detected as a dependency during `spk dev`. If you list 109 | # a directory here, its entire contents will be included recursively. 110 | 111 | #bridgeConfig = ( 112 | # # Used for integrating permissions and roles into the Sandstorm shell 113 | # # and for sandstorm-http-bridge to pass to your app. 114 | # # Uncomment this block and adjust the permissions and roles to make 115 | # # sense for your app. 116 | # # For more information, see high-level documentation at 117 | # # https://docs.sandstorm.io/en/latest/developing/auth/ 118 | # # and advanced details in the "BridgeConfig" section of 119 | # # https://github.com/sandstorm-io/sandstorm/blob/master/src/sandstorm/package.capnp 120 | # viewInfo = ( 121 | # # For details on the viewInfo field, consult "ViewInfo" in 122 | # # https://github.com/sandstorm-io/sandstorm/blob/master/src/sandstorm/grain.capnp 123 | # 124 | # permissions = [ 125 | # # Permissions which a user may or may not possess. A user's current 126 | # # permissions are passed to the app as a comma-separated list of `name` 127 | # # fields in the X-Sandstorm-Permissions header with each request. 128 | # # 129 | # # IMPORTANT: only ever append to this list! Reordering or removing fields 130 | # # will change behavior and permissions for existing grains! To deprecate a 131 | # # permission, or for more information, see "PermissionDef" in 132 | # # https://github.com/sandstorm-io/sandstorm/blob/master/src/sandstorm/grain.capnp 133 | # ( 134 | # name = "editor", 135 | # # Name of the permission, used as an identifier for the permission in cases where string 136 | # # names are preferred. Used in sandstorm-http-bridge's X-Sandstorm-Permissions HTTP header. 137 | # 138 | # title = (defaultText = "editor"), 139 | # # Display name of the permission, e.g. to display in a checklist of permissions 140 | # # that may be assigned when sharing. 141 | # 142 | # description = (defaultText = "grants ability to modify data"), 143 | # # Prose describing what this role means, suitable for a tool tip or similar help text. 144 | # ), 145 | # ], 146 | # roles = [ 147 | # # Roles are logical collections of permissions. For instance, your app may have 148 | # # a "viewer" role and an "editor" role 149 | # ( 150 | # title = (defaultText = "editor"), 151 | # # Name of the role. Shown in the Sandstorm UI to indicate which users have which roles. 152 | # 153 | # permissions = [true], 154 | # # An array indicating which permissions this role carries. 155 | # # It should be the same length as the permissions array in 156 | # # viewInfo, and the order of the lists must match. 157 | # 158 | # verbPhrase = (defaultText = "can make changes to the document"), 159 | # # Brief explanatory text to show in the sharing UI indicating 160 | # # what a user assigned this role will be able to do with the grain. 161 | # 162 | # description = (defaultText = "editors may view all site data and change settings."), 163 | # # Prose describing what this role means, suitable for a tool tip or similar help text. 164 | # ), 165 | # ( 166 | # title = (defaultText = "viewer"), 167 | # permissions = [false], 168 | # verbPhrase = (defaultText = "can view the document"), 169 | # description = (defaultText = "viewers may view what other users have written."), 170 | # ), 171 | # ], 172 | # ), 173 | # #apiPath = "/api", 174 | # # Apps can export an API to the world. The API is to be used primarily by Javascript 175 | # # code and native apps, so it can't serve out regular HTML to browsers. If a request 176 | # # comes in to your app's API, sandstorm-http-bridge will prefix the request's path with 177 | # # this string, if specified. 178 | #), 179 | ); 180 | 181 | const myCommand :Spk.Manifest.Command = ( 182 | # Here we define the command used to start up your server. 183 | argv = ["/sandstorm-http-bridge", "8000", "--", "/opt/app/.sandstorm/launcher.sh"], 184 | environ = [ 185 | # Note that this defines the *entire* environment seen by your app. 186 | (key = "PATH", value = "/usr/local/bin:/usr/bin:/bin"), 187 | (key = "PYTHONPATH", value = "/opt/app"), 188 | (key = "HOME", value = "/var"), 189 | (key = "SANDSTORM", value = "1"), 190 | ] 191 | ); 192 | -------------------------------------------------------------------------------- /static/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.1.1 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")),f&&this.cycle(),this)};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("collapse in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);!e&&f.toggle&&"show"==c&&(c=!c),e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(b){a(d).remove(),a(e).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(a(c).is("body")?window:c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);{var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})}},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(b.RESET).addClass("affix");var a=this.$window.scrollTop(),c=this.$element.offset();return this.pinnedOffset=c.top-a},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"top"==this.affixed&&(e.top+=d),"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(b.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:c-h-this.$element.height()}))}}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); -------------------------------------------------------------------------------- /.sandstorm/sandstorm-files.list: -------------------------------------------------------------------------------- 1 | # *** WARNING: GENERATED FILE *** 2 | # This file is automatically updated and rewritten in sorted order every time 3 | # the app runs in dev mode. You may manually add or remove files, but don't 4 | # expect comments or ordering to be retained. 5 | bin/bash 6 | bin/dash 7 | bin/mkdir 8 | bin/rm 9 | bin/sh 10 | etc/ld.so.cache 11 | etc/localtime 12 | etc/mime.types 13 | etc/python2.7/sitecustomize.py 14 | lib/x86_64-linux-gnu/ld-2.19.so 15 | lib/x86_64-linux-gnu/libbz2.so.1.0 16 | lib/x86_64-linux-gnu/libbz2.so.1.0.4 17 | lib/x86_64-linux-gnu/libc-2.19.so 18 | lib/x86_64-linux-gnu/libc.so.6 19 | lib/x86_64-linux-gnu/libdl-2.19.so 20 | lib/x86_64-linux-gnu/libdl.so.2 21 | lib/x86_64-linux-gnu/libexpat.so.1 22 | lib/x86_64-linux-gnu/libexpat.so.1.6.0 23 | lib/x86_64-linux-gnu/libm-2.19.so 24 | lib/x86_64-linux-gnu/libm.so.6 25 | lib/x86_64-linux-gnu/libncurses.so.5 26 | lib/x86_64-linux-gnu/libncurses.so.5.9 27 | lib/x86_64-linux-gnu/libnsl-2.19.so 28 | lib/x86_64-linux-gnu/libnsl.so.1 29 | lib/x86_64-linux-gnu/libnss_compat-2.19.so 30 | lib/x86_64-linux-gnu/libnss_compat.so.2 31 | lib/x86_64-linux-gnu/libnss_dns-2.19.so 32 | lib/x86_64-linux-gnu/libnss_dns.so.2 33 | lib/x86_64-linux-gnu/libnss_files-2.19.so 34 | lib/x86_64-linux-gnu/libnss_files.so.2 35 | lib/x86_64-linux-gnu/libnss_nis-2.19.so 36 | lib/x86_64-linux-gnu/libnss_nis.so.2 37 | lib/x86_64-linux-gnu/libpcre.so.3 38 | lib/x86_64-linux-gnu/libpcre.so.3.13.1 39 | lib/x86_64-linux-gnu/libpthread-2.19.so 40 | lib/x86_64-linux-gnu/libpthread.so.0 41 | lib/x86_64-linux-gnu/libresolv-2.19.so 42 | lib/x86_64-linux-gnu/libresolv.so.2 43 | lib/x86_64-linux-gnu/libselinux.so.1 44 | lib/x86_64-linux-gnu/libtinfo.so.5 45 | lib/x86_64-linux-gnu/libtinfo.so.5.9 46 | lib/x86_64-linux-gnu/libutil-2.19.so 47 | lib/x86_64-linux-gnu/libutil.so.1 48 | lib/x86_64-linux-gnu/libuuid.so.1 49 | lib/x86_64-linux-gnu/libuuid.so.1.3.0 50 | lib/x86_64-linux-gnu/libz.so.1 51 | lib/x86_64-linux-gnu/libz.so.1.2.8 52 | lib64/ld-linux-x86-64.so.2 53 | opt/app 54 | opt/app/.sandstorm/launcher.sh 55 | opt/app/app.py 56 | opt/app/app.pyc 57 | opt/app/env/bin/activate 58 | opt/app/env/bin/python 59 | opt/app/env/bin/python2 60 | opt/app/env/lib/python2.7 61 | opt/app/env/lib/python2.7/UserDict.py 62 | opt/app/env/lib/python2.7/UserDict.pyc 63 | opt/app/env/lib/python2.7/_abcoll.py 64 | opt/app/env/lib/python2.7/_abcoll.pyc 65 | opt/app/env/lib/python2.7/_weakrefset.py 66 | opt/app/env/lib/python2.7/_weakrefset.pyc 67 | opt/app/env/lib/python2.7/abc.py 68 | opt/app/env/lib/python2.7/abc.pyc 69 | opt/app/env/lib/python2.7/codecs.py 70 | opt/app/env/lib/python2.7/codecs.pyc 71 | opt/app/env/lib/python2.7/copy_reg.py 72 | opt/app/env/lib/python2.7/copy_reg.pyc 73 | opt/app/env/lib/python2.7/encodings 74 | opt/app/env/lib/python2.7/fnmatch.py 75 | opt/app/env/lib/python2.7/fnmatch.pyc 76 | opt/app/env/lib/python2.7/genericpath.py 77 | opt/app/env/lib/python2.7/genericpath.pyc 78 | opt/app/env/lib/python2.7/lib-dynload 79 | opt/app/env/lib/python2.7/linecache.py 80 | opt/app/env/lib/python2.7/linecache.pyc 81 | opt/app/env/lib/python2.7/locale.py 82 | opt/app/env/lib/python2.7/locale.pyc 83 | opt/app/env/lib/python2.7/no-global-site-packages.txt 84 | opt/app/env/lib/python2.7/orig-prefix.txt 85 | opt/app/env/lib/python2.7/os.py 86 | opt/app/env/lib/python2.7/os.pyc 87 | opt/app/env/lib/python2.7/posixpath.py 88 | opt/app/env/lib/python2.7/posixpath.pyc 89 | opt/app/env/lib/python2.7/re.py 90 | opt/app/env/lib/python2.7/re.pyc 91 | opt/app/env/lib/python2.7/site-packages 92 | opt/app/env/lib/python2.7/site-packages/Jinja2-2.8.dist-info/entry_points.txt 93 | opt/app/env/lib/python2.7/site-packages/Pygments-2.1.1.dist-info/entry_points.txt 94 | opt/app/env/lib/python2.7/site-packages/flask/__init__.py 95 | opt/app/env/lib/python2.7/site-packages/flask/__init__.pyc 96 | opt/app/env/lib/python2.7/site-packages/flask/_compat.py 97 | opt/app/env/lib/python2.7/site-packages/flask/_compat.pyc 98 | opt/app/env/lib/python2.7/site-packages/flask/app.py 99 | opt/app/env/lib/python2.7/site-packages/flask/app.pyc 100 | opt/app/env/lib/python2.7/site-packages/flask/blueprints.py 101 | opt/app/env/lib/python2.7/site-packages/flask/blueprints.pyc 102 | opt/app/env/lib/python2.7/site-packages/flask/config.py 103 | opt/app/env/lib/python2.7/site-packages/flask/config.pyc 104 | opt/app/env/lib/python2.7/site-packages/flask/ctx.py 105 | opt/app/env/lib/python2.7/site-packages/flask/ctx.pyc 106 | opt/app/env/lib/python2.7/site-packages/flask/debughelpers.py 107 | opt/app/env/lib/python2.7/site-packages/flask/debughelpers.pyc 108 | opt/app/env/lib/python2.7/site-packages/flask/globals.py 109 | opt/app/env/lib/python2.7/site-packages/flask/globals.pyc 110 | opt/app/env/lib/python2.7/site-packages/flask/helpers.py 111 | opt/app/env/lib/python2.7/site-packages/flask/helpers.pyc 112 | opt/app/env/lib/python2.7/site-packages/flask/json.py 113 | opt/app/env/lib/python2.7/site-packages/flask/json.pyc 114 | opt/app/env/lib/python2.7/site-packages/flask/module.py 115 | opt/app/env/lib/python2.7/site-packages/flask/module.pyc 116 | opt/app/env/lib/python2.7/site-packages/flask/sessions.py 117 | opt/app/env/lib/python2.7/site-packages/flask/sessions.pyc 118 | opt/app/env/lib/python2.7/site-packages/flask/signals.py 119 | opt/app/env/lib/python2.7/site-packages/flask/signals.pyc 120 | opt/app/env/lib/python2.7/site-packages/flask/templating.py 121 | opt/app/env/lib/python2.7/site-packages/flask/templating.pyc 122 | opt/app/env/lib/python2.7/site-packages/flask/wrappers.py 123 | opt/app/env/lib/python2.7/site-packages/flask/wrappers.pyc 124 | opt/app/env/lib/python2.7/site-packages/itsdangerous.py 125 | opt/app/env/lib/python2.7/site-packages/itsdangerous.pyc 126 | opt/app/env/lib/python2.7/site-packages/jinja2/__init__.py 127 | opt/app/env/lib/python2.7/site-packages/jinja2/__init__.pyc 128 | opt/app/env/lib/python2.7/site-packages/jinja2/_compat.py 129 | opt/app/env/lib/python2.7/site-packages/jinja2/_compat.pyc 130 | opt/app/env/lib/python2.7/site-packages/jinja2/bccache.py 131 | opt/app/env/lib/python2.7/site-packages/jinja2/bccache.pyc 132 | opt/app/env/lib/python2.7/site-packages/jinja2/compiler.py 133 | opt/app/env/lib/python2.7/site-packages/jinja2/compiler.pyc 134 | opt/app/env/lib/python2.7/site-packages/jinja2/defaults.py 135 | opt/app/env/lib/python2.7/site-packages/jinja2/defaults.pyc 136 | opt/app/env/lib/python2.7/site-packages/jinja2/environment.py 137 | opt/app/env/lib/python2.7/site-packages/jinja2/environment.pyc 138 | opt/app/env/lib/python2.7/site-packages/jinja2/exceptions.py 139 | opt/app/env/lib/python2.7/site-packages/jinja2/exceptions.pyc 140 | opt/app/env/lib/python2.7/site-packages/jinja2/ext.py 141 | opt/app/env/lib/python2.7/site-packages/jinja2/ext.pyc 142 | opt/app/env/lib/python2.7/site-packages/jinja2/filters.py 143 | opt/app/env/lib/python2.7/site-packages/jinja2/filters.pyc 144 | opt/app/env/lib/python2.7/site-packages/jinja2/lexer.py 145 | opt/app/env/lib/python2.7/site-packages/jinja2/lexer.pyc 146 | opt/app/env/lib/python2.7/site-packages/jinja2/loaders.py 147 | opt/app/env/lib/python2.7/site-packages/jinja2/loaders.pyc 148 | opt/app/env/lib/python2.7/site-packages/jinja2/nodes.py 149 | opt/app/env/lib/python2.7/site-packages/jinja2/nodes.pyc 150 | opt/app/env/lib/python2.7/site-packages/jinja2/optimizer.py 151 | opt/app/env/lib/python2.7/site-packages/jinja2/optimizer.pyc 152 | opt/app/env/lib/python2.7/site-packages/jinja2/parser.py 153 | opt/app/env/lib/python2.7/site-packages/jinja2/parser.pyc 154 | opt/app/env/lib/python2.7/site-packages/jinja2/runtime.py 155 | opt/app/env/lib/python2.7/site-packages/jinja2/runtime.pyc 156 | opt/app/env/lib/python2.7/site-packages/jinja2/tests.py 157 | opt/app/env/lib/python2.7/site-packages/jinja2/tests.pyc 158 | opt/app/env/lib/python2.7/site-packages/jinja2/utils.py 159 | opt/app/env/lib/python2.7/site-packages/jinja2/utils.pyc 160 | opt/app/env/lib/python2.7/site-packages/jinja2/visitor.py 161 | opt/app/env/lib/python2.7/site-packages/jinja2/visitor.pyc 162 | opt/app/env/lib/python2.7/site-packages/markdown/__init__.py 163 | opt/app/env/lib/python2.7/site-packages/markdown/__init__.pyc 164 | opt/app/env/lib/python2.7/site-packages/markdown/__version__.py 165 | opt/app/env/lib/python2.7/site-packages/markdown/__version__.pyc 166 | opt/app/env/lib/python2.7/site-packages/markdown/blockparser.py 167 | opt/app/env/lib/python2.7/site-packages/markdown/blockparser.pyc 168 | opt/app/env/lib/python2.7/site-packages/markdown/blockprocessors.py 169 | opt/app/env/lib/python2.7/site-packages/markdown/blockprocessors.pyc 170 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/__init__.py 171 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/__init__.pyc 172 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/abbr.py 173 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/abbr.pyc 174 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/attr_list.py 175 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/attr_list.pyc 176 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/codehilite.py 177 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/codehilite.pyc 178 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/def_list.py 179 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/def_list.pyc 180 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/extra.py 181 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/extra.pyc 182 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/fenced_code.py 183 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/fenced_code.pyc 184 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/footnotes.py 185 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/footnotes.pyc 186 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/smart_strong.py 187 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/smart_strong.pyc 188 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/tables.py 189 | opt/app/env/lib/python2.7/site-packages/markdown/extensions/tables.pyc 190 | opt/app/env/lib/python2.7/site-packages/markdown/inlinepatterns.py 191 | opt/app/env/lib/python2.7/site-packages/markdown/inlinepatterns.pyc 192 | opt/app/env/lib/python2.7/site-packages/markdown/odict.py 193 | opt/app/env/lib/python2.7/site-packages/markdown/odict.pyc 194 | opt/app/env/lib/python2.7/site-packages/markdown/postprocessors.py 195 | opt/app/env/lib/python2.7/site-packages/markdown/postprocessors.pyc 196 | opt/app/env/lib/python2.7/site-packages/markdown/preprocessors.py 197 | opt/app/env/lib/python2.7/site-packages/markdown/preprocessors.pyc 198 | opt/app/env/lib/python2.7/site-packages/markdown/serializers.py 199 | opt/app/env/lib/python2.7/site-packages/markdown/serializers.pyc 200 | opt/app/env/lib/python2.7/site-packages/markdown/treeprocessors.py 201 | opt/app/env/lib/python2.7/site-packages/markdown/treeprocessors.pyc 202 | opt/app/env/lib/python2.7/site-packages/markdown/util.py 203 | opt/app/env/lib/python2.7/site-packages/markdown/util.pyc 204 | opt/app/env/lib/python2.7/site-packages/markupsafe/__init__.py 205 | opt/app/env/lib/python2.7/site-packages/markupsafe/__init__.pyc 206 | opt/app/env/lib/python2.7/site-packages/markupsafe/_compat.py 207 | opt/app/env/lib/python2.7/site-packages/markupsafe/_compat.pyc 208 | opt/app/env/lib/python2.7/site-packages/markupsafe/_speedups.so 209 | opt/app/env/lib/python2.7/site-packages/peewee.py 210 | opt/app/env/lib/python2.7/site-packages/peewee.pyc 211 | opt/app/env/lib/python2.7/site-packages/pip-1.5.6.dist-info/entry_points.txt 212 | opt/app/env/lib/python2.7/site-packages/pkg_resources.py 213 | opt/app/env/lib/python2.7/site-packages/pkg_resources.pyc 214 | opt/app/env/lib/python2.7/site-packages/playhouse/__init__.py 215 | opt/app/env/lib/python2.7/site-packages/playhouse/__init__.pyc 216 | opt/app/env/lib/python2.7/site-packages/playhouse/apsw_ext.py 217 | opt/app/env/lib/python2.7/site-packages/playhouse/apsw_ext.pyc 218 | opt/app/env/lib/python2.7/site-packages/playhouse/berkeleydb.py 219 | opt/app/env/lib/python2.7/site-packages/playhouse/berkeleydb.pyc 220 | opt/app/env/lib/python2.7/site-packages/playhouse/db_url.py 221 | opt/app/env/lib/python2.7/site-packages/playhouse/db_url.pyc 222 | opt/app/env/lib/python2.7/site-packages/playhouse/fields.py 223 | opt/app/env/lib/python2.7/site-packages/playhouse/fields.pyc 224 | opt/app/env/lib/python2.7/site-packages/playhouse/flask_utils.py 225 | opt/app/env/lib/python2.7/site-packages/playhouse/flask_utils.pyc 226 | opt/app/env/lib/python2.7/site-packages/playhouse/pool.py 227 | opt/app/env/lib/python2.7/site-packages/playhouse/pool.pyc 228 | opt/app/env/lib/python2.7/site-packages/playhouse/postgres_ext.py 229 | opt/app/env/lib/python2.7/site-packages/playhouse/postgres_ext.pyc 230 | opt/app/env/lib/python2.7/site-packages/playhouse/sqlite_ext.py 231 | opt/app/env/lib/python2.7/site-packages/playhouse/sqlite_ext.pyc 232 | opt/app/env/lib/python2.7/site-packages/pygments/__init__.py 233 | opt/app/env/lib/python2.7/site-packages/pygments/__init__.pyc 234 | opt/app/env/lib/python2.7/site-packages/pygments/filter.py 235 | opt/app/env/lib/python2.7/site-packages/pygments/filter.pyc 236 | opt/app/env/lib/python2.7/site-packages/pygments/filters/__init__.py 237 | opt/app/env/lib/python2.7/site-packages/pygments/filters/__init__.pyc 238 | opt/app/env/lib/python2.7/site-packages/pygments/formatter.py 239 | opt/app/env/lib/python2.7/site-packages/pygments/formatter.pyc 240 | opt/app/env/lib/python2.7/site-packages/pygments/formatters/__init__.py 241 | opt/app/env/lib/python2.7/site-packages/pygments/formatters/__init__.pyc 242 | opt/app/env/lib/python2.7/site-packages/pygments/formatters/_mapping.py 243 | opt/app/env/lib/python2.7/site-packages/pygments/formatters/_mapping.pyc 244 | opt/app/env/lib/python2.7/site-packages/pygments/formatters/html.py 245 | opt/app/env/lib/python2.7/site-packages/pygments/formatters/html.pyc 246 | opt/app/env/lib/python2.7/site-packages/pygments/lexer.py 247 | opt/app/env/lib/python2.7/site-packages/pygments/lexer.pyc 248 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/__init__.py 249 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/__init__.pyc 250 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_csound_builtins.py 251 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_csound_builtins.pyc 252 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_mapping.py 253 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_mapping.pyc 254 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_mql_builtins.py 255 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_mql_builtins.pyc 256 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_openedge_builtins.py 257 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_openedge_builtins.pyc 258 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_postgres_builtins.py 259 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_postgres_builtins.pyc 260 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_scilab_builtins.py 261 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_scilab_builtins.pyc 262 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_stan_builtins.py 263 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/_stan_builtins.pyc 264 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/actionscript.py 265 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/actionscript.pyc 266 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/algebra.py 267 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/algebra.pyc 268 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/ambient.py 269 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/ambient.pyc 270 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/apl.py 271 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/apl.pyc 272 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/archetype.py 273 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/archetype.pyc 274 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/asm.py 275 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/asm.pyc 276 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/automation.py 277 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/automation.pyc 278 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/basic.py 279 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/basic.pyc 280 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/business.py 281 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/business.pyc 282 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/c_cpp.py 283 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/c_cpp.pyc 284 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/c_like.py 285 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/c_like.pyc 286 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/chapel.py 287 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/chapel.pyc 288 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/configs.py 289 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/configs.pyc 290 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/console.py 291 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/console.pyc 292 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/csound.py 293 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/csound.pyc 294 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/css.py 295 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/css.pyc 296 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/d.py 297 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/d.pyc 298 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/dalvik.py 299 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/dalvik.pyc 300 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/data.py 301 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/data.pyc 302 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/diff.py 303 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/diff.pyc 304 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/dotnet.py 305 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/dotnet.pyc 306 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/dsls.py 307 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/dsls.pyc 308 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/dylan.py 309 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/dylan.pyc 310 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/ecl.py 311 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/ecl.pyc 312 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/eiffel.py 313 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/eiffel.pyc 314 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/elm.py 315 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/elm.pyc 316 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/erlang.py 317 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/erlang.pyc 318 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/esoteric.py 319 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/esoteric.pyc 320 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/ezhil.py 321 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/ezhil.pyc 322 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/factor.py 323 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/factor.pyc 324 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/fantom.py 325 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/fantom.pyc 326 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/felix.py 327 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/felix.pyc 328 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/fortran.py 329 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/fortran.pyc 330 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/foxpro.py 331 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/foxpro.pyc 332 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/go.py 333 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/go.pyc 334 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/grammar_notation.py 335 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/grammar_notation.pyc 336 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/graph.py 337 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/graph.pyc 338 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/graphics.py 339 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/graphics.pyc 340 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/haskell.py 341 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/haskell.pyc 342 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/haxe.py 343 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/haxe.pyc 344 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/hdl.py 345 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/hdl.pyc 346 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/hexdump.py 347 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/hexdump.pyc 348 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/html.py 349 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/html.pyc 350 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/idl.py 351 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/idl.pyc 352 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/igor.py 353 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/igor.pyc 354 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/inferno.py 355 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/inferno.pyc 356 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/installers.py 357 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/installers.pyc 358 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/int_fiction.py 359 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/int_fiction.pyc 360 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/iolang.py 361 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/iolang.pyc 362 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/j.py 363 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/j.pyc 364 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/javascript.py 365 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/javascript.pyc 366 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/julia.py 367 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/julia.pyc 368 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/jvm.py 369 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/jvm.pyc 370 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/lisp.py 371 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/lisp.pyc 372 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/make.py 373 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/make.pyc 374 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/markup.py 375 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/markup.pyc 376 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/matlab.py 377 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/matlab.pyc 378 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/ml.py 379 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/ml.pyc 380 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/modeling.py 381 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/modeling.pyc 382 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/modula2.py 383 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/modula2.pyc 384 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/nimrod.py 385 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/nimrod.pyc 386 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/nit.py 387 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/nit.pyc 388 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/nix.py 389 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/nix.pyc 390 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/oberon.py 391 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/oberon.pyc 392 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/objective.py 393 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/objective.pyc 394 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/ooc.py 395 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/ooc.pyc 396 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/parasail.py 397 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/parasail.pyc 398 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/parsers.py 399 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/parsers.pyc 400 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/pascal.py 401 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/pascal.pyc 402 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/pawn.py 403 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/pawn.pyc 404 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/perl.py 405 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/perl.pyc 406 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/php.py 407 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/php.pyc 408 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/praat.py 409 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/praat.pyc 410 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/prolog.py 411 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/prolog.pyc 412 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/python.py 413 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/python.pyc 414 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/qvt.py 415 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/qvt.pyc 416 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/r.py 417 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/r.pyc 418 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/rdf.py 419 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/rdf.pyc 420 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/rebol.py 421 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/rebol.pyc 422 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/resource.py 423 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/resource.pyc 424 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/roboconf.py 425 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/roboconf.pyc 426 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/robotframework.py 427 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/robotframework.pyc 428 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/ruby.py 429 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/ruby.pyc 430 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/rust.py 431 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/rust.pyc 432 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/scripting.py 433 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/scripting.pyc 434 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/shell.py 435 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/shell.pyc 436 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/smalltalk.py 437 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/smalltalk.pyc 438 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/snobol.py 439 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/snobol.pyc 440 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/special.py 441 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/special.pyc 442 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/sql.py 443 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/sql.pyc 444 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/supercollider.py 445 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/supercollider.pyc 446 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/tcl.py 447 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/tcl.pyc 448 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/templates.py 449 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/templates.pyc 450 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/testing.py 451 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/testing.pyc 452 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/textedit.py 453 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/textedit.pyc 454 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/textfmts.py 455 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/textfmts.pyc 456 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/theorem.py 457 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/theorem.pyc 458 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/trafficscript.py 459 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/trafficscript.pyc 460 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/urbi.py 461 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/urbi.pyc 462 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/webmisc.py 463 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/webmisc.pyc 464 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/x10.py 465 | opt/app/env/lib/python2.7/site-packages/pygments/lexers/x10.pyc 466 | opt/app/env/lib/python2.7/site-packages/pygments/modeline.py 467 | opt/app/env/lib/python2.7/site-packages/pygments/modeline.pyc 468 | opt/app/env/lib/python2.7/site-packages/pygments/plugin.py 469 | opt/app/env/lib/python2.7/site-packages/pygments/plugin.pyc 470 | opt/app/env/lib/python2.7/site-packages/pygments/regexopt.py 471 | opt/app/env/lib/python2.7/site-packages/pygments/regexopt.pyc 472 | opt/app/env/lib/python2.7/site-packages/pygments/scanner.py 473 | opt/app/env/lib/python2.7/site-packages/pygments/scanner.pyc 474 | opt/app/env/lib/python2.7/site-packages/pygments/style.py 475 | opt/app/env/lib/python2.7/site-packages/pygments/style.pyc 476 | opt/app/env/lib/python2.7/site-packages/pygments/styles/__init__.py 477 | opt/app/env/lib/python2.7/site-packages/pygments/styles/__init__.pyc 478 | opt/app/env/lib/python2.7/site-packages/pygments/styles/default.py 479 | opt/app/env/lib/python2.7/site-packages/pygments/styles/default.pyc 480 | opt/app/env/lib/python2.7/site-packages/pygments/token.py 481 | opt/app/env/lib/python2.7/site-packages/pygments/token.pyc 482 | opt/app/env/lib/python2.7/site-packages/pygments/unistring.py 483 | opt/app/env/lib/python2.7/site-packages/pygments/unistring.pyc 484 | opt/app/env/lib/python2.7/site-packages/pygments/util.py 485 | opt/app/env/lib/python2.7/site-packages/pygments/util.pyc 486 | opt/app/env/lib/python2.7/site-packages/setuptools-5.5.1.dist-info/entry_points.txt 487 | opt/app/env/lib/python2.7/site-packages/werkzeug/__init__.py 488 | opt/app/env/lib/python2.7/site-packages/werkzeug/__init__.pyc 489 | opt/app/env/lib/python2.7/site-packages/werkzeug/_compat.py 490 | opt/app/env/lib/python2.7/site-packages/werkzeug/_compat.pyc 491 | opt/app/env/lib/python2.7/site-packages/werkzeug/_internal.py 492 | opt/app/env/lib/python2.7/site-packages/werkzeug/_internal.pyc 493 | opt/app/env/lib/python2.7/site-packages/werkzeug/datastructures.py 494 | opt/app/env/lib/python2.7/site-packages/werkzeug/datastructures.pyc 495 | opt/app/env/lib/python2.7/site-packages/werkzeug/exceptions.py 496 | opt/app/env/lib/python2.7/site-packages/werkzeug/exceptions.pyc 497 | opt/app/env/lib/python2.7/site-packages/werkzeug/filesystem.py 498 | opt/app/env/lib/python2.7/site-packages/werkzeug/filesystem.pyc 499 | opt/app/env/lib/python2.7/site-packages/werkzeug/formparser.py 500 | opt/app/env/lib/python2.7/site-packages/werkzeug/formparser.pyc 501 | opt/app/env/lib/python2.7/site-packages/werkzeug/http.py 502 | opt/app/env/lib/python2.7/site-packages/werkzeug/http.pyc 503 | opt/app/env/lib/python2.7/site-packages/werkzeug/local.py 504 | opt/app/env/lib/python2.7/site-packages/werkzeug/local.pyc 505 | opt/app/env/lib/python2.7/site-packages/werkzeug/routing.py 506 | opt/app/env/lib/python2.7/site-packages/werkzeug/routing.pyc 507 | opt/app/env/lib/python2.7/site-packages/werkzeug/serving.py 508 | opt/app/env/lib/python2.7/site-packages/werkzeug/serving.pyc 509 | opt/app/env/lib/python2.7/site-packages/werkzeug/urls.py 510 | opt/app/env/lib/python2.7/site-packages/werkzeug/urls.pyc 511 | opt/app/env/lib/python2.7/site-packages/werkzeug/utils.py 512 | opt/app/env/lib/python2.7/site-packages/werkzeug/utils.pyc 513 | opt/app/env/lib/python2.7/site-packages/werkzeug/wrappers.py 514 | opt/app/env/lib/python2.7/site-packages/werkzeug/wrappers.pyc 515 | opt/app/env/lib/python2.7/site-packages/werkzeug/wsgi.py 516 | opt/app/env/lib/python2.7/site-packages/werkzeug/wsgi.pyc 517 | opt/app/env/lib/python2.7/site.py 518 | opt/app/env/lib/python2.7/site.pyc 519 | opt/app/env/lib/python2.7/sre_compile.py 520 | opt/app/env/lib/python2.7/sre_compile.pyc 521 | opt/app/env/lib/python2.7/sre_constants.py 522 | opt/app/env/lib/python2.7/sre_constants.pyc 523 | opt/app/env/lib/python2.7/sre_parse.py 524 | opt/app/env/lib/python2.7/sre_parse.pyc 525 | opt/app/env/lib/python2.7/stat.py 526 | opt/app/env/lib/python2.7/stat.pyc 527 | opt/app/env/lib/python2.7/types.py 528 | opt/app/env/lib/python2.7/types.pyc 529 | opt/app/env/lib/python2.7/warnings.py 530 | opt/app/env/lib/python2.7/warnings.pyc 531 | opt/app/env/local/lib 532 | opt/app/main.py 533 | opt/app/models.py 534 | opt/app/models.pyc 535 | opt/app/static/css/hilite.css 536 | opt/app/static/css/note.min.css 537 | opt/app/static/js/bootstrap.min.js 538 | opt/app/static/js/jquery-1.12.0.min.js 539 | opt/app/static/js/jquery.hotkeys.js 540 | opt/app/static/js/jquery.inline-attachment.min.js 541 | opt/app/templates/base.html 542 | opt/app/templates/create.html 543 | opt/app/templates/detail.html 544 | opt/app/templates/edit.html 545 | opt/app/templates/includes/pagination.html 546 | opt/app/templates/index.html 547 | opt/app/templates/taglist.html 548 | opt/app/views.py 549 | opt/app/views.pyc 550 | proc/cpuinfo 551 | sandstorm-http-bridge 552 | sandstorm-http-bridge-config 553 | sandstorm-manifest 554 | sbin/ldconfig 555 | sbin/ldconfig.real 556 | usr/bin/basename 557 | usr/lib/python2.7 558 | usr/lib/python2.7/BaseHTTPServer.py 559 | usr/lib/python2.7/BaseHTTPServer.pyc 560 | usr/lib/python2.7/SocketServer.py 561 | usr/lib/python2.7/SocketServer.pyc 562 | usr/lib/python2.7/StringIO.py 563 | usr/lib/python2.7/StringIO.pyc 564 | usr/lib/python2.7/UserDict.py 565 | usr/lib/python2.7/__future__.py 566 | usr/lib/python2.7/__future__.pyc 567 | usr/lib/python2.7/_abcoll.py 568 | usr/lib/python2.7/_strptime.py 569 | usr/lib/python2.7/_strptime.pyc 570 | usr/lib/python2.7/_weakrefset.py 571 | usr/lib/python2.7/abc.py 572 | usr/lib/python2.7/atexit.py 573 | usr/lib/python2.7/atexit.pyc 574 | usr/lib/python2.7/base64.py 575 | usr/lib/python2.7/base64.pyc 576 | usr/lib/python2.7/bisect.py 577 | usr/lib/python2.7/bisect.pyc 578 | usr/lib/python2.7/calendar.py 579 | usr/lib/python2.7/calendar.pyc 580 | usr/lib/python2.7/codecs.py 581 | usr/lib/python2.7/collections.py 582 | usr/lib/python2.7/collections.pyc 583 | usr/lib/python2.7/contextlib.py 584 | usr/lib/python2.7/contextlib.pyc 585 | usr/lib/python2.7/copy.py 586 | usr/lib/python2.7/copy.pyc 587 | usr/lib/python2.7/copy_reg.py 588 | usr/lib/python2.7/ctypes/__init__.py 589 | usr/lib/python2.7/ctypes/__init__.pyc 590 | usr/lib/python2.7/ctypes/_endian.py 591 | usr/lib/python2.7/ctypes/_endian.pyc 592 | usr/lib/python2.7/ctypes/util.py 593 | usr/lib/python2.7/ctypes/util.pyc 594 | usr/lib/python2.7/decimal.py 595 | usr/lib/python2.7/decimal.pyc 596 | usr/lib/python2.7/difflib.py 597 | usr/lib/python2.7/difflib.pyc 598 | usr/lib/python2.7/dis.py 599 | usr/lib/python2.7/dis.pyc 600 | usr/lib/python2.7/email/__init__.py 601 | usr/lib/python2.7/email/__init__.pyc 602 | usr/lib/python2.7/email/_parseaddr.py 603 | usr/lib/python2.7/email/_parseaddr.pyc 604 | usr/lib/python2.7/email/base64mime.py 605 | usr/lib/python2.7/email/base64mime.pyc 606 | usr/lib/python2.7/email/charset.py 607 | usr/lib/python2.7/email/charset.pyc 608 | usr/lib/python2.7/email/encoders.py 609 | usr/lib/python2.7/email/encoders.pyc 610 | usr/lib/python2.7/email/errors.py 611 | usr/lib/python2.7/email/errors.pyc 612 | usr/lib/python2.7/email/feedparser.py 613 | usr/lib/python2.7/email/feedparser.pyc 614 | usr/lib/python2.7/email/iterators.py 615 | usr/lib/python2.7/email/iterators.pyc 616 | usr/lib/python2.7/email/message.py 617 | usr/lib/python2.7/email/message.pyc 618 | usr/lib/python2.7/email/mime/__init__.py 619 | usr/lib/python2.7/email/mime/__init__.pyc 620 | usr/lib/python2.7/email/parser.py 621 | usr/lib/python2.7/email/parser.pyc 622 | usr/lib/python2.7/email/quoprimime.py 623 | usr/lib/python2.7/email/quoprimime.pyc 624 | usr/lib/python2.7/email/utils.py 625 | usr/lib/python2.7/email/utils.pyc 626 | usr/lib/python2.7/encodings/__init__.py 627 | usr/lib/python2.7/encodings/__init__.pyc 628 | usr/lib/python2.7/encodings/aliases.py 629 | usr/lib/python2.7/encodings/aliases.pyc 630 | usr/lib/python2.7/encodings/ascii.py 631 | usr/lib/python2.7/encodings/ascii.pyc 632 | usr/lib/python2.7/encodings/hex_codec.py 633 | usr/lib/python2.7/encodings/hex_codec.pyc 634 | usr/lib/python2.7/encodings/idna.py 635 | usr/lib/python2.7/encodings/idna.pyc 636 | usr/lib/python2.7/encodings/latin_1.py 637 | usr/lib/python2.7/encodings/latin_1.pyc 638 | usr/lib/python2.7/encodings/unicode_escape.py 639 | usr/lib/python2.7/encodings/unicode_escape.pyc 640 | usr/lib/python2.7/encodings/utf_8.py 641 | usr/lib/python2.7/encodings/utf_8.pyc 642 | usr/lib/python2.7/fnmatch.py 643 | usr/lib/python2.7/functools.py 644 | usr/lib/python2.7/functools.pyc 645 | usr/lib/python2.7/genericpath.py 646 | usr/lib/python2.7/glob.py 647 | usr/lib/python2.7/glob.pyc 648 | usr/lib/python2.7/hashlib.py 649 | usr/lib/python2.7/hashlib.pyc 650 | usr/lib/python2.7/heapq.py 651 | usr/lib/python2.7/heapq.pyc 652 | usr/lib/python2.7/hmac.py 653 | usr/lib/python2.7/hmac.pyc 654 | usr/lib/python2.7/htmlentitydefs.py 655 | usr/lib/python2.7/htmlentitydefs.pyc 656 | usr/lib/python2.7/httplib.py 657 | usr/lib/python2.7/httplib.pyc 658 | usr/lib/python2.7/importlib/__init__.py 659 | usr/lib/python2.7/importlib/__init__.pyc 660 | usr/lib/python2.7/inspect.py 661 | usr/lib/python2.7/inspect.pyc 662 | usr/lib/python2.7/io.py 663 | usr/lib/python2.7/io.pyc 664 | usr/lib/python2.7/json/__init__.py 665 | usr/lib/python2.7/json/__init__.pyc 666 | usr/lib/python2.7/json/decoder.py 667 | usr/lib/python2.7/json/decoder.pyc 668 | usr/lib/python2.7/json/encoder.py 669 | usr/lib/python2.7/json/encoder.pyc 670 | usr/lib/python2.7/json/scanner.py 671 | usr/lib/python2.7/json/scanner.pyc 672 | usr/lib/python2.7/keyword.py 673 | usr/lib/python2.7/keyword.pyc 674 | usr/lib/python2.7/lib-dynload 675 | usr/lib/python2.7/lib-dynload/_ctypes.x86_64-linux-gnu.so 676 | usr/lib/python2.7/lib-dynload/_elementtree.x86_64-linux-gnu.so 677 | usr/lib/python2.7/lib-dynload/_hashlib.x86_64-linux-gnu.so 678 | usr/lib/python2.7/lib-dynload/_json.x86_64-linux-gnu.so 679 | usr/lib/python2.7/lib-dynload/_sqlite3.x86_64-linux-gnu.so 680 | usr/lib/python2.7/lib-dynload/_ssl.x86_64-linux-gnu.so 681 | usr/lib/python2.7/lib-dynload/bz2.x86_64-linux-gnu.so 682 | usr/lib/python2.7/lib-dynload/parser.x86_64-linux-gnu.so 683 | usr/lib/python2.7/lib-dynload/pyexpat.x86_64-linux-gnu.so 684 | usr/lib/python2.7/lib-tk 685 | usr/lib/python2.7/linecache.py 686 | usr/lib/python2.7/locale.py 687 | usr/lib/python2.7/logging/__init__.py 688 | usr/lib/python2.7/logging/__init__.pyc 689 | usr/lib/python2.7/mimetools.py 690 | usr/lib/python2.7/mimetools.pyc 691 | usr/lib/python2.7/mimetypes.py 692 | usr/lib/python2.7/mimetypes.pyc 693 | usr/lib/python2.7/numbers.py 694 | usr/lib/python2.7/numbers.pyc 695 | usr/lib/python2.7/opcode.py 696 | usr/lib/python2.7/opcode.pyc 697 | usr/lib/python2.7/os.py 698 | usr/lib/python2.7/pkgutil.py 699 | usr/lib/python2.7/pkgutil.pyc 700 | usr/lib/python2.7/plat-x86_64-linux-gnu 701 | usr/lib/python2.7/platform.py 702 | usr/lib/python2.7/platform.pyc 703 | usr/lib/python2.7/plistlib.py 704 | usr/lib/python2.7/plistlib.pyc 705 | usr/lib/python2.7/posixpath.py 706 | usr/lib/python2.7/pprint.py 707 | usr/lib/python2.7/pprint.pyc 708 | usr/lib/python2.7/quopri.py 709 | usr/lib/python2.7/quopri.pyc 710 | usr/lib/python2.7/random.py 711 | usr/lib/python2.7/random.pyc 712 | usr/lib/python2.7/re.py 713 | usr/lib/python2.7/rfc822.py 714 | usr/lib/python2.7/rfc822.pyc 715 | usr/lib/python2.7/shutil.py 716 | usr/lib/python2.7/shutil.pyc 717 | usr/lib/python2.7/sitecustomize.py 718 | usr/lib/python2.7/sitecustomize.pyc 719 | usr/lib/python2.7/socket.py 720 | usr/lib/python2.7/socket.pyc 721 | usr/lib/python2.7/sqlite3/__init__.py 722 | usr/lib/python2.7/sqlite3/__init__.pyc 723 | usr/lib/python2.7/sqlite3/dbapi2.py 724 | usr/lib/python2.7/sqlite3/dbapi2.pyc 725 | usr/lib/python2.7/sre_compile.py 726 | usr/lib/python2.7/sre_constants.py 727 | usr/lib/python2.7/sre_parse.py 728 | usr/lib/python2.7/ssl.py 729 | usr/lib/python2.7/ssl.pyc 730 | usr/lib/python2.7/stat.py 731 | usr/lib/python2.7/string.py 732 | usr/lib/python2.7/string.pyc 733 | usr/lib/python2.7/stringprep.py 734 | usr/lib/python2.7/stringprep.pyc 735 | usr/lib/python2.7/struct.py 736 | usr/lib/python2.7/struct.pyc 737 | usr/lib/python2.7/symbol.py 738 | usr/lib/python2.7/symbol.pyc 739 | usr/lib/python2.7/sysconfig.py 740 | usr/lib/python2.7/sysconfig.pyc 741 | usr/lib/python2.7/tempfile.py 742 | usr/lib/python2.7/tempfile.pyc 743 | usr/lib/python2.7/textwrap.py 744 | usr/lib/python2.7/textwrap.pyc 745 | usr/lib/python2.7/threading.py 746 | usr/lib/python2.7/threading.pyc 747 | usr/lib/python2.7/token.py 748 | usr/lib/python2.7/token.pyc 749 | usr/lib/python2.7/tokenize.py 750 | usr/lib/python2.7/tokenize.pyc 751 | usr/lib/python2.7/traceback.py 752 | usr/lib/python2.7/traceback.pyc 753 | usr/lib/python2.7/types.py 754 | usr/lib/python2.7/urllib.py 755 | usr/lib/python2.7/urllib.pyc 756 | usr/lib/python2.7/urllib2.py 757 | usr/lib/python2.7/urllib2.pyc 758 | usr/lib/python2.7/urlparse.py 759 | usr/lib/python2.7/urlparse.pyc 760 | usr/lib/python2.7/uu.py 761 | usr/lib/python2.7/uu.pyc 762 | usr/lib/python2.7/uuid.py 763 | usr/lib/python2.7/uuid.pyc 764 | usr/lib/python2.7/warnings.py 765 | usr/lib/python2.7/weakref.py 766 | usr/lib/python2.7/weakref.pyc 767 | usr/lib/python2.7/xml/__init__.py 768 | usr/lib/python2.7/xml/__init__.pyc 769 | usr/lib/python2.7/xml/etree/ElementPath.py 770 | usr/lib/python2.7/xml/etree/ElementPath.pyc 771 | usr/lib/python2.7/xml/etree/ElementTree.py 772 | usr/lib/python2.7/xml/etree/ElementTree.pyc 773 | usr/lib/python2.7/xml/etree/__init__.py 774 | usr/lib/python2.7/xml/etree/__init__.pyc 775 | usr/lib/python2.7/xml/etree/cElementTree.py 776 | usr/lib/python2.7/xml/etree/cElementTree.pyc 777 | usr/lib/python2.7/zipfile.py 778 | usr/lib/python2.7/zipfile.pyc 779 | usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 780 | usr/lib/x86_64-linux-gnu/libffi.so.6 781 | usr/lib/x86_64-linux-gnu/libffi.so.6.0.2 782 | usr/lib/x86_64-linux-gnu/libsqlite3.so.0 783 | usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6 784 | usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 785 | -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | --------------------------------------------------------------------------------