diff --git a/go/vendor/github.com/gobuffalo/packr/.codeclimate.yml b/go/vendor/github.com/gobuffalo/packr/.codeclimate.yml
new file mode 100644
index 0000000..8c914a5
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/.codeclimate.yml
@@ -0,0 +1,20 @@
+---
+engines:
+  golint:
+    enabled: true
+    checks:
+      GoLint/Naming/MixedCaps:
+        enabled: false
+  govet:
+    enabled: true
+  gofmt:
+    enabled: true
+  fixme:
+    enabled: true
+ratings:
+  paths:
+    - "**.go"
+exclude_paths:
+  - "**/*_test.go"
+  - "*_test.go"
+  - "fixtures/"
diff --git a/go/vendor/github.com/gobuffalo/packr/.gitignore b/go/vendor/github.com/gobuffalo/packr/.gitignore
new file mode 100644
index 0000000..ee560f7
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/.gitignore
@@ -0,0 +1,33 @@
+*.log
+.DS_Store
+doc
+tmp
+pkg
+*.gem
+*.pid
+coverage
+coverage.data
+build/*
+*.pbxuser
+*.mode1v3
+.svn
+profile
+.console_history
+.sass-cache/*
+.rake_tasks~
+*.log.lck
+solr/
+.jhw-cache/
+jhw.*
+*.sublime*
+node_modules/
+dist/
+generated/
+.vendor/
+bin/*
+gin-bin
+/packr_darwin_amd64
+/packr_linux_amd64
+.vscode/
+debug.test
+.grifter/
diff --git a/go/vendor/github.com/gobuffalo/packr/.goreleaser.yml b/go/vendor/github.com/gobuffalo/packr/.goreleaser.yml
new file mode 100644
index 0000000..40c09f6
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/.goreleaser.yml
@@ -0,0 +1,25 @@
+builds:
+-
+  goos:
+    - darwin
+    - linux
+    - windows
+  env:
+    - CGO_ENABLED=0
+  main: ./packr/main.go
+  binary: packr
+
+checksum:
+  name_template: 'checksums.txt'
+snapshot:
+  name_template: "{{ .Tag }}-next"
+changelog:
+  sort: asc
+  filters:
+    exclude:
+    - '^docs:'
+    - '^test:'
+brew:
+  github:
+    owner: gobuffalo
+    name: homebrew-tap
diff --git a/go/vendor/github.com/gobuffalo/packr/.travis.yml b/go/vendor/github.com/gobuffalo/packr/.travis.yml
new file mode 100644
index 0000000..d949243
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/.travis.yml
@@ -0,0 +1,16 @@
+language: go
+
+sudo: false
+
+go:
+  - 1.9
+  - "1.10"
+  - "1.11"
+  - tip
+
+matrix:
+  allow_failures:
+    - go: 'tip'
+
+script:
+  - make ci-test
diff --git a/go/vendor/github.com/gobuffalo/packr/LICENSE.txt b/go/vendor/github.com/gobuffalo/packr/LICENSE.txt
new file mode 100644
index 0000000..3ccb336
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/LICENSE.txt
@@ -0,0 +1,8 @@
+The MIT License (MIT)
+Copyright (c) 2016 Mark Bates
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/go/vendor/github.com/gobuffalo/packr/Makefile b/go/vendor/github.com/gobuffalo/packr/Makefile
new file mode 100644
index 0000000..bf29371
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/Makefile
@@ -0,0 +1,36 @@
+TAGS ?= "sqlite"
+GO_BIN ?= go
+
+install: deps
+	packr
+	$(GO_BIN) install -v .
+
+deps:
+	$(GO_BIN) get github.com/gobuffalo/packr/packr
+	$(GO_BIN) get -tags ${TAGS} -t ./...
+
+build: deps
+	packr
+	$(GO_BIN) build -v .
+
+test:
+	packr
+	$(GO_BIN) test -tags ${TAGS} ./...
+
+ci-test: deps
+	$(GO_BIN) test -tags ${TAGS} -race ./...
+
+lint:
+	gometalinter --vendor ./... --deadline=1m --skip=internal
+
+update:
+	$(GO_BIN) get -u
+	$(GO_BIN) mod tidy
+	packr
+	make test
+
+release-test:
+	$(GO_BIN) test -tags ${TAGS} -race ./...
+
+release:
+	release -y -f version.go
diff --git a/go/vendor/github.com/gobuffalo/packr/README.md b/go/vendor/github.com/gobuffalo/packr/README.md
new file mode 100644
index 0000000..a5e0c28
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/README.md
@@ -0,0 +1,196 @@
+# packr
+
+[![GoDoc](https://godoc.org/github.com/gobuffalo/packr?status.svg)](https://godoc.org/github.com/gobuffalo/packr)
+
+Packr is a simple solution for bundling static assets inside of Go binaries. Most importantly it does it in a way that is friendly to developers while they are developing.
+
+## Intro Video
+
+To get an idea of the what and why of packr, please enjoy this short video: [https://vimeo.com/219863271](https://vimeo.com/219863271).
+
+## Installation
+
+```text
+$ go get -u github.com/gobuffalo/packr/...
+```
+
+## Usage
+
+### In Code
+
+The first step in using Packr is to create a new box. A box represents a folder on disk. Once you have a box you can get `string` or `[]byte` representations of the file.
+
+```go
+// set up a new box by giving it a (relative) path to a folder on disk:
+box := packr.NewBox("./templates")
+
+// Get the string representation of a file:
+html := box.String("index.html")
+
+// Get the string representation of a file, or an error if it doesn't exist:
+html, err := box.MustString("index.html")
+
+// Get the []byte representation of a file:
+html := box.Bytes("index.html")
+
+// Get the []byte representation of a file, or an error if it doesn't exist:
+html, err := box.MustBytes("index.html")
+```
+
+### What is a Box?
+
+A box represents a folder, and any sub-folders, on disk that you want to have access to in your binary. When compiling a binary using the `packr` CLI the contents of the folder will be converted into Go files that can be compiled inside of a "standard" go binary. Inside of the compiled binary the files will be read from memory. When working locally the files will be read directly off of disk. This is a seamless switch that doesn't require any special attention on your part.
+
+#### Example
+
+Assume the follow directory structure:
+
+```
+├── main.go
+└── templates
+    ├── admin
+    │   └── index.html
+    └── index.html
+```
+
+The following program will read the `./templates/admin/index.html` file and print it out.
+
+```go
+package main
+
+import (
+	"fmt"
+
+	"github.com/gobuffalo/packr"
+)
+
+func main() {
+	box := packr.NewBox("./templates")
+
+	s := box.String("admin/index.html")
+	fmt.Println(s)
+}
+```
+
+### Development Made Easy
+
+In order to get static files into a Go binary, those files must first be converted to Go code. To do that, Packr, ships with a few tools to help build binaries. See below.
+
+During development, however, it is painful to have to keep running a tool to compile those files.
+
+Packr uses the following resolution rules when looking for a file:
+
+1. Look for the file in-memory (inside a Go binary)
+1. Look for the file on disk (during development)
+
+Because Packr knows how to fall through to the file system, developers don't need to worry about constantly compiling their static files into a binary. They can work unimpeded.
+
+Packr takes file resolution a step further. When declaring a new box you use a relative path, `./templates`. When Packr recieves this call it calculates out the absolute path to that directory. By doing this it means you can be guaranteed that Packr can find your files correctly, even if you're not running in the directory that the box was created in. This helps with the problem of testing, where Go changes the `pwd` for each package, making relative paths difficult to work with. This is not a problem when using Packr.
+
+---
+
+## Usage with HTTP
+
+A box implements the [`http.FileSystem`](https://golang.org/pkg/net/http/#FileSystemhttps://golang.org/pkg/net/http/#FileSystem) interface, meaning it can be used to serve static files.
+
+```go
+package main
+
+import (
+	"net/http"
+
+	"github.com/gobuffalo/packr"
+)
+
+func main() {
+	box := packr.NewBox("./templates")
+
+	http.Handle("/", http.FileServer(box))
+	http.ListenAndServe(":3000", nil)
+}
+```
+
+---
+
+## Building a Binary (the easy way)
+
+When it comes time to build, or install, your Go binary, simply use `packr build` or `packr install` just as you would `go build` or `go install`. All flags for the `go` tool are supported and everything works the way you expect, the only difference is your static assets are now bundled in the generated binary. If you want more control over how this happens, looking at the following section on building binaries (the hard way).
+
+## Building a Binary (the hard way)
+
+Before you build your Go binary, run the `packr` command first. It will look for all the boxes in your code and then generate `.go` files that pack the static files into bytes that can be bundled into the Go binary.
+
+```
+$ packr
+```
+
+Then run your `go build command` like normal.
+
+*NOTE*: It is not recommended to check-in these generated `-packr.go` files. They can be large, and can easily become out of date if not careful. It is recommended that you always run `packr clean` after running the `packr` tool.
+
+#### Cleaning Up
+
+When you're done it is recommended that you run the `packr clean` command. This will remove all of the generated files that Packr created for you.
+
+```
+$ packr clean
+```
+
+Why do you want to do this? Packr first looks to the information stored in these generated files, if the information isn't there it looks to disk. This makes it easy to work with in development.
+
+---
+
+## Building/Moving a portable release
+
+When it comes to building multiple releases you typically want that release to be built in a specific directory.
+
+For example: `./releases`
+
+However, because passing a `.go` file requires absolute paths, we must compile the release in the appropriate absolute path.
+
+```bash
+GOOS=linux GOARCH=amd64 packr build
+```
+
+Now your `project_name` binary will be built at the root of your project dir. Great!
+
+All that is left to do is to move that binary to your release dir:
+
+Linux/macOS/Windows (bash)
+
+```bash
+mv ./project_name ./releases
+```
+
+Windows (cmd): 
+
+```cmd
+move ./project_name ./releases
+```
+
+Powershell:
+
+```powershell
+Move-Item -Path .\project_name -Destination .\releases\
+```
+
+If you _target_ for Windows when building don't forget that it's `project_name.exe`
+
+Now you can make multiple releases and all of your needed static files will be available!
+
+#### Summing it up:
+
+Example Script for building to 3 common targets:
+
+```bash
+GOOS=darwin GOARCH=amd64 packr build && mv ./project_name ./releases/darwin-project_name \
+  && GOOS=linux GOARCH=amd64 packr build && mv ./project_name ./releases/linux-project_name \
+  && GOOS=windows GOARCH=386 packr build && mv ./project_name.exe ./releases/project_name.exe \
+  && packr clean
+```
+
+---
+
+## Debugging
+
+The `packr` command passes all arguments down to the underlying `go` command, this includes the `-v` flag to print out `go build` information. Packr looks for the `-v` flag, and will turn on its own verbose logging. This is very useful for trying to understand what the `packr` command is doing when it is run.
diff --git a/go/vendor/github.com/gobuffalo/packr/box.go b/go/vendor/github.com/gobuffalo/packr/box.go
new file mode 100644
index 0000000..d221101
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/box.go
@@ -0,0 +1,204 @@
+package packr
+
+import (
+	"bytes"
+	"compress/gzip"
+	"io/ioutil"
+	"net/http"
+	"os"
+	"path"
+	"path/filepath"
+	"runtime"
+	"strings"
+
+	"github.com/pkg/errors"
+)
+
+var (
+	// ErrResOutsideBox gets returned in case of the requested resources being outside the box
+	ErrResOutsideBox = errors.New("Can't find a resource outside the box")
+)
+
+// NewBox returns a Box that can be used to
+// retrieve files from either disk or the embedded
+// binary.
+func NewBox(path string) Box {
+	var cd string
+	if !filepath.IsAbs(path) {
+		_, filename, _, _ := runtime.Caller(1)
+		cd = filepath.Dir(filename)
+	}
+
+	// this little hack courtesy of the `-cover` flag!!
+	cov := filepath.Join("_test", "_obj_test")
+	cd = strings.Replace(cd, string(filepath.Separator)+cov, "", 1)
+	if !filepath.IsAbs(cd) && cd != "" {
+		cd = filepath.Join(GoPath(), "src", cd)
+	}
+
+	return Box{
+		Path:       path,
+		callingDir: cd,
+		data:       map[string][]byte{},
+	}
+}
+
+// Box represent a folder on a disk you want to
+// have access to in the built Go binary.
+type Box struct {
+	Path        string
+	callingDir  string
+	data        map[string][]byte
+	directories map[string]bool
+}
+
+// AddString converts t to a byteslice and delegates to AddBytes to add to b.data
+func (b Box) AddString(path string, t string) {
+	b.AddBytes(path, []byte(t))
+}
+
+// AddBytes sets t in b.data by the given path
+func (b Box) AddBytes(path string, t []byte) {
+	b.data[path] = t
+}
+
+// String of the file asked for or an empty string.
+func (b Box) String(name string) string {
+	return string(b.Bytes(name))
+}
+
+// MustString returns either the string of the requested
+// file or an error if it can not be found.
+func (b Box) MustString(name string) (string, error) {
+	bb, err := b.MustBytes(name)
+	return string(bb), err
+}
+
+// Bytes of the file asked for or an empty byte slice.
+func (b Box) Bytes(name string) []byte {
+	bb, _ := b.MustBytes(name)
+	return bb
+}
+
+// MustBytes returns either the byte slice of the requested
+// file or an error if it can not be found.
+func (b Box) MustBytes(name string) ([]byte, error) {
+	f, err := b.find(name)
+	if err == nil {
+		bb := &bytes.Buffer{}
+		bb.ReadFrom(f)
+		return bb.Bytes(), err
+	}
+	return nil, err
+}
+
+// Has returns true if the resource exists in the box
+func (b Box) Has(name string) bool {
+	_, err := b.find(name)
+	if err != nil {
+		return false
+	}
+	return true
+}
+
+func (b Box) decompress(bb []byte) []byte {
+	reader, err := gzip.NewReader(bytes.NewReader(bb))
+	if err != nil {
+		return bb
+	}
+	data, err := ioutil.ReadAll(reader)
+	if err != nil {
+		return bb
+	}
+	return data
+}
+
+func (b Box) find(name string) (File, error) {
+	if bb, ok := b.data[name]; ok {
+		return newVirtualFile(name, bb), nil
+	}
+	if b.directories == nil {
+		b.indexDirectories()
+	}
+
+	cleanName := filepath.ToSlash(filepath.Clean(name))
+	// Ensure name is not outside the box
+	if strings.HasPrefix(cleanName, "../") {
+		return nil, ErrResOutsideBox
+	}
+	// Absolute name is considered as relative to the box root
+	cleanName = strings.TrimPrefix(cleanName, "/")
+
+	// Try to get the resource from the box
+	if _, ok := data[b.Path]; ok {
+		if bb, ok := data[b.Path][cleanName]; ok {
+			bb = b.decompress(bb)
+			return newVirtualFile(cleanName, bb), nil
+		}
+		if _, ok := b.directories[cleanName]; ok {
+			return newVirtualDir(cleanName), nil
+		}
+		if filepath.Ext(cleanName) != "" {
+			// The Handler created by http.FileSystem checks for those errors and
+			// returns http.StatusNotFound instead of http.StatusInternalServerError.
+			return nil, os.ErrNotExist
+		}
+		return nil, os.ErrNotExist
+	}
+
+	// Not found in the box virtual fs, try to get it from the file system
+	cleanName = filepath.FromSlash(cleanName)
+	p := filepath.Join(b.callingDir, b.Path, cleanName)
+	return fileFor(p, cleanName)
+}
+
+// Open returns a File using the http.File interface
+func (b Box) Open(name string) (http.File, error) {
+	return b.find(name)
+}
+
+// List shows "What's in the box?"
+func (b Box) List() []string {
+	var keys []string
+
+	if b.data == nil || len(b.data) == 0 {
+		b.Walk(func(path string, info File) error {
+			finfo, _ := info.FileInfo()
+			if !finfo.IsDir() {
+				keys = append(keys, finfo.Name())
+			}
+			return nil
+		})
+	} else {
+		for k := range b.data {
+			keys = append(keys, k)
+		}
+	}
+	return keys
+}
+
+func (b *Box) indexDirectories() {
+	b.directories = map[string]bool{}
+	if _, ok := data[b.Path]; ok {
+		for name := range data[b.Path] {
+			prefix, _ := path.Split(name)
+			// Even on Windows the suffix appears to be a /
+			prefix = strings.TrimSuffix(prefix, "/")
+			b.directories[prefix] = true
+		}
+	}
+}
+
+func fileFor(p string, name string) (File, error) {
+	fi, err := os.Stat(p)
+	if err != nil {
+		return nil, err
+	}
+	if fi.IsDir() {
+		return newVirtualDir(p), nil
+	}
+	if bb, err := ioutil.ReadFile(p); err == nil {
+		return newVirtualFile(name, bb), nil
+	}
+	return nil, os.ErrNotExist
+}
diff --git a/go/vendor/github.com/gobuffalo/packr/env.go b/go/vendor/github.com/gobuffalo/packr/env.go
new file mode 100644
index 0000000..c52e73a
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/env.go
@@ -0,0 +1,39 @@
+package packr
+
+import (
+	"os"
+	"os/exec"
+	"path/filepath"
+	"strings"
+	"sync"
+)
+
+var goPath = filepath.Join(os.Getenv("HOME"), "go")
+
+func init() {
+	var once sync.Once
+	once.Do(func() {
+		cmd := exec.Command("go", "env", "GOPATH")
+		b, err := cmd.CombinedOutput()
+		if err != nil {
+			return
+		}
+		goPath = strings.TrimSpace(string(b))
+	})
+}
+
+// GoPath returns the current GOPATH env var
+// or if it's missing, the default.
+func GoPath() string {
+	return goPath
+}
+
+// GoBin returns the current GO_BIN env var
+// or if it's missing, a default of "go"
+func GoBin() string {
+	go_bin := os.Getenv("GO_BIN")
+	if go_bin == "" {
+		return "go"
+	}
+	return go_bin
+}
diff --git a/go/vendor/github.com/gobuffalo/packr/file.go b/go/vendor/github.com/gobuffalo/packr/file.go
new file mode 100644
index 0000000..8337d62
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/file.go
@@ -0,0 +1,15 @@
+package packr
+
+import (
+	"io"
+	"os"
+)
+
+type File interface {
+	io.ReadCloser
+	io.Writer
+	FileInfo() (os.FileInfo, error)
+	Readdir(count int) ([]os.FileInfo, error)
+	Seek(offset int64, whence int) (int64, error)
+	Stat() (os.FileInfo, error)
+}
diff --git a/go/vendor/github.com/gobuffalo/packr/file_info.go b/go/vendor/github.com/gobuffalo/packr/file_info.go
new file mode 100644
index 0000000..e7931d2
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/file_info.go
@@ -0,0 +1,38 @@
+package packr
+
+import (
+	"os"
+	"time"
+)
+
+type fileInfo struct {
+	Path     string
+	Contents []byte
+	size     int64
+	modTime  time.Time
+	isDir    bool
+}
+
+func (f fileInfo) Name() string {
+	return f.Path
+}
+
+func (f fileInfo) Size() int64 {
+	return f.size
+}
+
+func (f fileInfo) Mode() os.FileMode {
+	return 0444
+}
+
+func (f fileInfo) ModTime() time.Time {
+	return f.modTime
+}
+
+func (f fileInfo) IsDir() bool {
+	return f.isDir
+}
+
+func (f fileInfo) Sys() interface{} {
+	return nil
+}
diff --git a/go/vendor/github.com/gobuffalo/packr/go.mod b/go/vendor/github.com/gobuffalo/packr/go.mod
new file mode 100644
index 0000000..6066c40
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/go.mod
@@ -0,0 +1,13 @@
+module github.com/gobuffalo/packr
+
+require (
+	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/inconshreveable/mousetrap v1.0.0 // indirect
+	github.com/pkg/errors v0.8.0
+	github.com/pmezard/go-difflib v1.0.0 // indirect
+	github.com/spf13/cobra v0.0.3
+	github.com/spf13/pflag v1.0.2 // indirect
+	github.com/stretchr/testify v1.2.2
+	golang.org/x/net v0.0.0-20180921000356-2f5d2388922f // indirect
+	golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f
+)
diff --git a/go/vendor/github.com/gobuffalo/packr/go.sum b/go/vendor/github.com/gobuffalo/packr/go.sum
new file mode 100644
index 0000000..5c62b92
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/go.sum
@@ -0,0 +1,18 @@
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/pflag v1.0.2 h1:Fy0orTDgHdbnzHcsOgfCN4LtHf0ec3wwtiwJqwvf3Gc=
+github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+golang.org/x/net v0.0.0-20180921000356-2f5d2388922f h1:QM2QVxvDoW9PFSPp/zy9FgxJLfaWTZlS61KEPtBwacM=
+golang.org/x/net v0.0.0-20180921000356-2f5d2388922f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
diff --git a/go/vendor/github.com/gobuffalo/packr/packr.go b/go/vendor/github.com/gobuffalo/packr/packr.go
new file mode 100644
index 0000000..6ccc6c1
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/packr.go
@@ -0,0 +1,74 @@
+package packr
+
+import (
+	"bytes"
+	"compress/gzip"
+	"encoding/json"
+	"runtime"
+	"strings"
+	"sync"
+)
+
+var gil = &sync.Mutex{}
+var data = map[string]map[string][]byte{}
+
+// PackBytes packs bytes for a file into a box.
+func PackBytes(box string, name string, bb []byte) {
+	gil.Lock()
+	defer gil.Unlock()
+	if _, ok := data[box]; !ok {
+		data[box] = map[string][]byte{}
+	}
+	data[box][name] = bb
+}
+
+// PackBytesGzip packets the gzipped compressed bytes into a box.
+func PackBytesGzip(box string, name string, bb []byte) error {
+	var buf bytes.Buffer
+	w := gzip.NewWriter(&buf)
+	_, err := w.Write(bb)
+	if err != nil {
+		return err
+	}
+	err = w.Close()
+	if err != nil {
+		return err
+	}
+	PackBytes(box, name, buf.Bytes())
+	return nil
+}
+
+// PackJSONBytes packs JSON encoded bytes for a file into a box.
+func PackJSONBytes(box string, name string, jbb string) error {
+	var bb []byte
+	err := json.Unmarshal([]byte(jbb), &bb)
+	if err != nil {
+		return err
+	}
+	PackBytes(box, name, bb)
+	return nil
+}
+
+// UnpackBytes unpacks bytes for specific box.
+func UnpackBytes(box string) {
+	gil.Lock()
+	defer gil.Unlock()
+	delete(data, box)
+}
+
+func osPaths(paths ...string) []string {
+	if runtime.GOOS == "windows" {
+		for i, path := range paths {
+			paths[i] = strings.Replace(path, "/", "\\", -1)
+		}
+	}
+
+	return paths
+}
+
+func osPath(path string) string {
+	if runtime.GOOS == "windows" {
+		return strings.Replace(path, "/", "\\", -1)
+	}
+	return path
+}
diff --git a/go/vendor/github.com/gobuffalo/packr/physical_file.go b/go/vendor/github.com/gobuffalo/packr/physical_file.go
new file mode 100644
index 0000000..bf2d817
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/physical_file.go
@@ -0,0 +1,13 @@
+package packr
+
+import "os"
+
+var _ File = physicalFile{}
+
+type physicalFile struct {
+	*os.File
+}
+
+func (p physicalFile) FileInfo() (os.FileInfo, error) {
+	return os.Stat(p.Name())
+}
diff --git a/go/vendor/github.com/gobuffalo/packr/shoulders.md b/go/vendor/github.com/gobuffalo/packr/shoulders.md
new file mode 100644
index 0000000..38ec2a1
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/shoulders.md
@@ -0,0 +1,24 @@
+# github.com/gobuffalo/packr Stands on the Shoulders of Giants
+
+github.com/gobuffalo/packr does not try to reinvent the wheel! Instead, it uses the already great wheels developed by the Go community and puts them all together in the best way possible. Without these giants this project would not be possible. Please make sure to check them out and thank them for all of their hard work.
+
+Thank you to the following **GIANTS**:
+
+
+* [github.com/pkg/errors](https://godoc.org/github.com/pkg/errors)
+
+* [github.com/spf13/cobra](https://godoc.org/github.com/spf13/cobra)
+
+* [github.com/spf13/pflag](https://godoc.org/github.com/spf13/pflag)
+
+* [github.com/stretchr/testify/assert](https://godoc.org/github.com/stretchr/testify/assert)
+
+* [github.com/stretchr/testify/require](https://godoc.org/github.com/stretchr/testify/require)
+
+* [github.com/stretchr/testify/vendor/github.com/davecgh/go-spew/spew](https://godoc.org/github.com/stretchr/testify/vendor/github.com/davecgh/go-spew/spew)
+
+* [github.com/stretchr/testify/vendor/github.com/pmezard/go-difflib/difflib](https://godoc.org/github.com/stretchr/testify/vendor/github.com/pmezard/go-difflib/difflib)
+
+* [golang.org/x/net/context](https://godoc.org/golang.org/x/net/context)
+
+* [golang.org/x/sync/errgroup](https://godoc.org/golang.org/x/sync/errgroup)
diff --git a/go/vendor/github.com/gobuffalo/packr/version.go b/go/vendor/github.com/gobuffalo/packr/version.go
new file mode 100644
index 0000000..537d484
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/version.go
@@ -0,0 +1,3 @@
+package packr
+
+const Version = "v1.13.7"
diff --git a/go/vendor/github.com/gobuffalo/packr/virtual_file.go b/go/vendor/github.com/gobuffalo/packr/virtual_file.go
new file mode 100644
index 0000000..955db8c
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/virtual_file.go
@@ -0,0 +1,57 @@
+package packr
+
+import (
+	"bytes"
+	"fmt"
+	"os"
+	"time"
+)
+
+var virtualFileModTime = time.Now()
+var _ File = virtualFile{}
+
+type virtualFile struct {
+	*bytes.Reader
+	Name string
+	info fileInfo
+}
+
+func (f virtualFile) FileInfo() (os.FileInfo, error) {
+	return f.info, nil
+}
+
+func (f virtualFile) Close() error {
+	return nil
+}
+
+func (f virtualFile) Write(p []byte) (n int, err error) {
+	return 0, fmt.Errorf("not implemented")
+}
+
+func (f virtualFile) Readdir(count int) ([]os.FileInfo, error) {
+	return []os.FileInfo{f.info}, nil
+}
+
+func (f virtualFile) Stat() (os.FileInfo, error) {
+	return f.info, nil
+}
+
+func newVirtualFile(name string, b []byte) File {
+	return virtualFile{
+		Reader: bytes.NewReader(b),
+		Name:   name,
+		info: fileInfo{
+			Path:     name,
+			Contents: b,
+			size:     int64(len(b)),
+			modTime:  virtualFileModTime,
+		},
+	}
+}
+
+func newVirtualDir(name string) File {
+	var b []byte
+	v := newVirtualFile(name, b).(virtualFile)
+	v.info.isDir = true
+	return v
+}
diff --git a/go/vendor/github.com/gobuffalo/packr/walk.go b/go/vendor/github.com/gobuffalo/packr/walk.go
new file mode 100644
index 0000000..21f2563
--- /dev/null
+++ b/go/vendor/github.com/gobuffalo/packr/walk.go
@@ -0,0 +1,63 @@
+package packr
+
+import (
+	"os"
+	"path/filepath"
+	"strings"
+
+	"github.com/pkg/errors"
+)
+
+type WalkFunc func(string, File) error
+
+// Walk will traverse the box and call the WalkFunc for each file in the box/folder.
+func (b Box) Walk(wf WalkFunc) error {
+	if data[b.Path] == nil {
+		base, err := filepath.EvalSymlinks(filepath.Join(b.callingDir, b.Path))
+		if err != nil {
+			return errors.WithStack(err)
+		}
+		return filepath.Walk(base, func(path string, info os.FileInfo, err error) error {
+			cleanName, err := filepath.Rel(base, path)
+			if err != nil {
+				cleanName = strings.TrimPrefix(path, base)
+			}
+			cleanName = filepath.ToSlash(filepath.Clean(cleanName))
+			cleanName = strings.TrimPrefix(cleanName, "/")
+			cleanName = filepath.FromSlash(cleanName)
+			if info == nil || info.IsDir() {
+				return nil
+			}
+
+			file, err := fileFor(path, cleanName)
+			if err != nil {
+				return err
+			}
+			return wf(cleanName, file)
+		})
+	}
+	for n := range data[b.Path] {
+		f, err := b.find(n)
+		if err != nil {
+			return err
+		}
+		err = wf(n, f)
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+// WalkPrefix will call box.Walk and call the WalkFunc when it finds paths that have a matching prefix
+func (b Box) WalkPrefix(prefix string, wf WalkFunc) error {
+	opre := osPath(prefix)
+	return b.Walk(func(path string, f File) error {
+		if strings.HasPrefix(osPath(path), opre) {
+			if err := wf(path, f); err != nil {
+				return errors.WithStack(err)
+			}
+		}
+		return nil
+	})
+}
