diff --git a/zaquestion/main.go b/zaquestion/main.go
new file mode 100644
index 0000000..f9e3243
--- /dev/null
+++ b/zaquestion/main.go
@@ -0,0 +1,18 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"fmt"
+	"os"
+
+	"github.com/adamryman/gophersay/gopher"
+)
+
+func main() {
+	fmt.Println("Learning to contribute to your favorite language at Gophercon 2018 is rad!")
+	fmt.Printf("Heres a proverb:\n\n")
+	gopher.Proverb(os.Stdout)
+}
diff --git a/zaquestion/vendor/github.com/adamryman/gophersay/LICENSE.md b/zaquestion/vendor/github.com/adamryman/gophersay/LICENSE.md
new file mode 100644
index 0000000..68a49da
--- /dev/null
+++ b/zaquestion/vendor/github.com/adamryman/gophersay/LICENSE.md
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+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 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.
+
+For more information, please refer to <http://unlicense.org/>
diff --git a/zaquestion/vendor/github.com/adamryman/gophersay/gopher/say.go b/zaquestion/vendor/github.com/adamryman/gophersay/gopher/say.go
new file mode 100644
index 0000000..8bd32d1
--- /dev/null
+++ b/zaquestion/vendor/github.com/adamryman/gophersay/gopher/say.go
@@ -0,0 +1,58 @@
+package gopher
+
+import (
+	"fmt"
+	"io"
+	"log"
+	"math/rand"
+	"time"
+
+	"github.com/adamryman/gophersay/gopherart"
+)
+
+var (
+	sayings   []string
+	gopherArt string
+)
+
+func init() {
+	// Load in gopher ascii art from go-bindata
+	gopherArtBytes, err := gopherart.Asset("gopherart/gopher.ascii")
+	if err != nil {
+		log.Fatal(err)
+	}
+	gopherArt = string(gopherArtBytes)
+	sayings = []string{
+		"Don't communicate by sharing memory, share memory by communicating.", "Concurrency is not parallelism.",
+		"Channels orchestrate; mutexes serialize.",
+		"The bigger the interface, the weaker the abstraction.",
+		"Make the zero value useful.",
+		"interface{} says nothing.",
+		"Gofmt's style is no one's favorite, yet gofmt is everyone's favorite.",
+		"A little copying is better than a little dependency.",
+		"Syscall must always be guarded with build tags.",
+		"Cgo must always be guarded with build tags.",
+		"Cgo is not Go.",
+		"With the unsafe package there are no guarantees.",
+		"Clear is better than clever.",
+		"Reflection is never clear.",
+		"Errors are values.",
+		"Don't just check errors, handle them gracefully.",
+		"Design the architecture, name the components, document the details.",
+		"Documentation is for users.",
+		"Don't panic.",
+	}
+}
+
+func Proverb(w io.Writer) {
+	rand.Seed(time.Now().UnixNano())
+	saying := sayings[rand.Intn(len(sayings))]
+	Say(w, saying)
+}
+
+func Say(w io.Writer, saying string) {
+	fmt.Fprintf(w, " ------------------------\n%s\n%s",
+		saying,
+		gopherArt,
+	)
+}
diff --git a/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopher.ascii b/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopher.ascii
new file mode 100644
index 0000000..afc915a
--- /dev/null
+++ b/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopher.ascii
@@ -0,0 +1,15 @@
+ ------------------------
+   \
+    \
+     \   ,_---~~~~~----._         
+  _,,_,*^____      _____``*g*\"*, 
+ / __/ /'     ^.  /      \ ^@q   f 
+[  @f | @))    |  | @))   l  0 _/  
+ \`/   \~____ / __ \_____/    \   
+  |           _l__l_           I   
+  }          [______]           I  
+  ]            | | |            |  
+  ]             ~ ~             |  
+  |                            |   
+   |                           |   
+
diff --git a/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopherart.go b/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopherart.go
new file mode 100644
index 0000000..8f2bffa
--- /dev/null
+++ b/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopherart.go
@@ -0,0 +1,237 @@
+// Code generated by go-bindata.
+// sources:
+// gopherart/gopher.ascii
+// DO NOT EDIT!
+
+package gopherart
+
+import (
+	"bytes"
+	"compress/gzip"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"os"
+	"path/filepath"
+	"strings"
+	"time"
+)
+
+func bindataRead(data []byte, name string) ([]byte, error) {
+	gz, err := gzip.NewReader(bytes.NewBuffer(data))
+	if err != nil {
+		return nil, fmt.Errorf("Read %q: %v", name, err)
+	}
+
+	var buf bytes.Buffer
+	_, err = io.Copy(&buf, gz)
+	clErr := gz.Close()
+
+	if err != nil {
+		return nil, fmt.Errorf("Read %q: %v", name, err)
+	}
+	if clErr != nil {
+		return nil, err
+	}
+
+	return buf.Bytes(), nil
+}
+
+type asset struct {
+	bytes []byte
+	info  os.FileInfo
+}
+
+type bindataFileInfo struct {
+	name    string
+	size    int64
+	mode    os.FileMode
+	modTime time.Time
+}
+
+func (fi bindataFileInfo) Name() string {
+	return fi.name
+}
+func (fi bindataFileInfo) Size() int64 {
+	return fi.size
+}
+func (fi bindataFileInfo) Mode() os.FileMode {
+	return fi.mode
+}
+func (fi bindataFileInfo) ModTime() time.Time {
+	return fi.modTime
+}
+func (fi bindataFileInfo) IsDir() bool {
+	return false
+}
+func (fi bindataFileInfo) Sys() interface{} {
+	return nil
+}
+
+var _gopherartGopherAscii = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x7c\x8e\x3d\x16\x82\x30\x10\x84\xfb\x9c\x62\x9e\x8d\x8f\xbc\x48\x3c\x02\xad\x67\x20\xb2\x54\xd8\xd0\xd8\x47\xce\xee\xec\xf2\x23\xc1\xa7\x03\x84\x64\xf6\xdb\xc9\xe2\xf2\x43\x0e\x40\xd2\x65\x59\x91\xf8\x05\x61\x65\x52\x29\x52\x0b\x56\x11\x91\x10\x24\xf8\x4e\xa8\xd9\xd3\x9d\xf4\xbd\x7f\xf8\x74\xf2\x81\x48\xa4\x15\x11\xcf\x56\xed\x6a\xd0\x58\x92\xbb\xe6\xc9\xff\x00\xd7\x02\xcd\x80\x8c\xa6\xaa\xb4\x92\xb1\xed\x47\xe0\x0a\xb6\x33\x27\xf5\xda\x98\x26\xbb\x4a\x43\x91\xec\xae\xb8\x8e\xe9\xac\x73\x93\x8c\xc2\x77\x67\xdc\x66\xe6\xf5\x71\x5a\x0b\x90\x7b\x09\x91\xd9\x3b\x0c\xcd\x45\xb0\x1e\x8e\x0c\x26\x3e\xdf\x4c\xd1\x76\x54\x9e\xe7\xf9\x0b\x19\xe3\xde\x01\x00\x00\xff\xff\xe9\x5c\x37\x0d\xaf\x01\x00\x00")
+
+func gopherartGopherAsciiBytes() ([]byte, error) {
+	return bindataRead(
+		_gopherartGopherAscii,
+		"gopherart/gopher.ascii",
+	)
+}
+
+func gopherartGopherAscii() (*asset, error) {
+	bytes, err := gopherartGopherAsciiBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "gopherart/gopher.ascii", size: 431, mode: os.FileMode(436), modTime: time.Unix(1468565140, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+// Asset loads and returns the asset for the given name.
+// It returns an error if the asset could not be found or
+// could not be loaded.
+func Asset(name string) ([]byte, error) {
+	cannonicalName := strings.Replace(name, "\\", "/", -1)
+	if f, ok := _bindata[cannonicalName]; ok {
+		a, err := f()
+		if err != nil {
+			return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
+		}
+		return a.bytes, nil
+	}
+	return nil, fmt.Errorf("Asset %s not found", name)
+}
+
+// MustAsset is like Asset but panics when Asset would return an error.
+// It simplifies safe initialization of global variables.
+func MustAsset(name string) []byte {
+	a, err := Asset(name)
+	if err != nil {
+		panic("asset: Asset(" + name + "): " + err.Error())
+	}
+
+	return a
+}
+
+// AssetInfo loads and returns the asset info for the given name.
+// It returns an error if the asset could not be found or
+// could not be loaded.
+func AssetInfo(name string) (os.FileInfo, error) {
+	cannonicalName := strings.Replace(name, "\\", "/", -1)
+	if f, ok := _bindata[cannonicalName]; ok {
+		a, err := f()
+		if err != nil {
+			return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
+		}
+		return a.info, nil
+	}
+	return nil, fmt.Errorf("AssetInfo %s not found", name)
+}
+
+// AssetNames returns the names of the assets.
+func AssetNames() []string {
+	names := make([]string, 0, len(_bindata))
+	for name := range _bindata {
+		names = append(names, name)
+	}
+	return names
+}
+
+// _bindata is a table, holding each asset generator, mapped to its name.
+var _bindata = map[string]func() (*asset, error){
+	"gopherart/gopher.ascii": gopherartGopherAscii,
+}
+
+// AssetDir returns the file names below a certain
+// directory embedded in the file by go-bindata.
+// For example if you run go-bindata on data/... and data contains the
+// following hierarchy:
+//     data/
+//       foo.txt
+//       img/
+//         a.png
+//         b.png
+// then AssetDir("data") would return []string{"foo.txt", "img"}
+// AssetDir("data/img") would return []string{"a.png", "b.png"}
+// AssetDir("foo.txt") and AssetDir("notexist") would return an error
+// AssetDir("") will return []string{"data"}.
+func AssetDir(name string) ([]string, error) {
+	node := _bintree
+	if len(name) != 0 {
+		cannonicalName := strings.Replace(name, "\\", "/", -1)
+		pathList := strings.Split(cannonicalName, "/")
+		for _, p := range pathList {
+			node = node.Children[p]
+			if node == nil {
+				return nil, fmt.Errorf("Asset %s not found", name)
+			}
+		}
+	}
+	if node.Func != nil {
+		return nil, fmt.Errorf("Asset %s not found", name)
+	}
+	rv := make([]string, 0, len(node.Children))
+	for childName := range node.Children {
+		rv = append(rv, childName)
+	}
+	return rv, nil
+}
+
+type bintree struct {
+	Func     func() (*asset, error)
+	Children map[string]*bintree
+}
+
+var _bintree = &bintree{nil, map[string]*bintree{
+	"gopherart": &bintree{nil, map[string]*bintree{
+		"gopher.ascii": &bintree{gopherartGopherAscii, map[string]*bintree{}},
+	}},
+}}
+
+// RestoreAsset restores an asset under the given directory
+func RestoreAsset(dir, name string) error {
+	data, err := Asset(name)
+	if err != nil {
+		return err
+	}
+	info, err := AssetInfo(name)
+	if err != nil {
+		return err
+	}
+	err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
+	if err != nil {
+		return err
+	}
+	err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
+	if err != nil {
+		return err
+	}
+	err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// RestoreAssets restores an asset under the given directory recursively
+func RestoreAssets(dir, name string) error {
+	children, err := AssetDir(name)
+	// File
+	if err != nil {
+		return RestoreAsset(dir, name)
+	}
+	// Dir
+	for _, child := range children {
+		err = RestoreAssets(dir, filepath.Join(name, child))
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func _filePath(dir, name string) string {
+	cannonicalName := strings.Replace(name, "\\", "/", -1)
+	return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
+}
