Browse Source

create an installer for doit

bryanl 3 years ago
parent
commit
73e2476ae3
8 changed files with 416 additions and 4 deletions
  1. 1
    0
      .gitignore
  2. 147
    0
      cmd/install-doit/main.go
  3. 8
    4
      glide.lock
  4. 2
    0
      glide.yaml
  5. 79
    0
      install/download.go
  6. 25
    0
      install/download_test.go
  7. 154
    0
      sammy.txt
  8. 0
    0
      vendor/.keep

+ 1
- 0
.gitignore View File

@@ -3,3 +3,4 @@ cmd/doit/doit
3 3
 .DS_Store
4 4
 builds
5 5
 doit
6
+vendor

+ 147
- 0
cmd/install-doit/main.go View File

@@ -0,0 +1,147 @@
1
+package main
2
+
3
+import (
4
+	"bufio"
5
+	"fmt"
6
+	"io/ioutil"
7
+	"log"
8
+	"os"
9
+	"os/user"
10
+	"path/filepath"
11
+	"runtime"
12
+	"strings"
13
+
14
+	"github.com/bryanl/doit/install"
15
+	"github.com/fatih/color"
16
+)
17
+
18
+var (
19
+	ver = "0.6.0"
20
+)
21
+
22
+func main() {
23
+
24
+	var err error
25
+	defer func() {
26
+		if err != nil {
27
+			log.Fatalf("error encountered: %v", err)
28
+		}
29
+	}()
30
+
31
+	bold := color.New(color.Bold, color.FgWhite).SprintfFunc()
32
+
33
+	// get install directory
34
+	home, err := homeDir()
35
+	if err != nil {
36
+		return
37
+	}
38
+
39
+	reader := bufio.NewReader(os.Stdin)
40
+	fmt.Printf("doit installation directory (this will create a doit subdirectory) (%s): ", bold(home))
41
+	installDir, err := reader.ReadString('\n')
42
+	if err != nil {
43
+		return
44
+	}
45
+
46
+	installDir = strings.TrimSpace(installDir)
47
+
48
+	if installDir == "" {
49
+		installDir = home
50
+	}
51
+
52
+	// create install directory
53
+	fmt.Printf("creating %s/doit directory...\n\n", installDir)
54
+	err = os.MkdirAll(filepath.Join(installDir, "bin"), 0755)
55
+	if err != nil {
56
+		return
57
+	}
58
+
59
+	// create temp directory
60
+	tmpDir, err := ioutil.TempDir("", "doit-install-")
61
+	if err != nil {
62
+		return
63
+	}
64
+	defer func() {
65
+		err := os.Remove(tmpDir)
66
+		if err != nil {
67
+			fmt.Printf("could not remove temp directory (%s): %v", tmpDir, err)
68
+		}
69
+	}()
70
+
71
+	// retrieve doit binary
72
+	filename := archiveName(ver)
73
+
74
+	fmt.Println("retrieving doit...")
75
+	doitPath := filepath.Join(tmpDir, filename)
76
+	file, err := install.Download(doitPath, install.URL(ver, filename))
77
+	if err != nil {
78
+		return
79
+	}
80
+	file.Close()
81
+	fmt.Println()
82
+
83
+	fmt.Println("retrieving doit checksum...")
84
+	checksumPath := filepath.Join(tmpDir, filename+".sha256")
85
+	checksumFile, err := install.Download(checksumPath, install.URL(ver, filename+".sha256"))
86
+	if err != nil {
87
+		log.Fatalf("could not download doit checksum file: %v", err)
88
+	}
89
+	checksumFile.Close()
90
+	fmt.Println("\n")
91
+
92
+	// validate binary
93
+	fmt.Println("validating doit checksum...")
94
+	f, err := os.Open(doitPath)
95
+	if err != nil {
96
+		return
97
+	}
98
+	defer f.Close()
99
+
100
+	cs, err := os.Open(checksumPath)
101
+	if err != nil {
102
+		return
103
+	}
104
+	defer func() {
105
+		cs.Close()
106
+		os.Remove(checksumPath)
107
+	}()
108
+
109
+	err = install.Validate(f, cs)
110
+	if err != nil {
111
+		return
112
+	}
113
+
114
+	fmt.Println("checksum was valid\n")
115
+
116
+	// place binary in install directory
117
+	doitInstallPath := filepath.Join(installDir, "bin", "doit")
118
+	fmt.Println("placing doit in install path...")
119
+	err = os.Rename(doitPath, doitInstallPath)
120
+	if err != nil {
121
+		return
122
+	}
123
+	os.Chmod(doitInstallPath, 0755)
124
+
125
+	fmt.Println("install complete!\n")
126
+}
127
+
128
+func homeDir() (string, error) {
129
+	usr, err := user.Current()
130
+	if err != nil {
131
+		return "", err
132
+	}
133
+
134
+	return usr.HomeDir, nil
135
+}
136
+
137
+func archiveName(ver string) string {
138
+	var suffix string
139
+
140
+	if runtime.GOOS == "darwin" {
141
+		suffix = "darwin-10.6-amd64"
142
+	} else {
143
+		suffix = fmt.Sprintf("%s-%s", runtime.GOOS, runtime.GOARCH)
144
+	}
145
+
146
+	return fmt.Sprintf("doit-%s-%s", ver, suffix)
147
+}

+ 8
- 4
glide.lock View File

@@ -1,5 +1,5 @@
1 1
 hash: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
2
-updated: 2015-12-13T16:31:28.717387319-05:00
2
+updated: 2015-12-14T01:01:50.534893293-05:00
3 3
 imports:
4 4
 - name: github.com/armon/consul-api
5 5
   version: dcfedd50ed5334f96adee43fc88518a4f095e15c
@@ -55,10 +55,12 @@ imports:
55 55
   version: 3dac7b4f76f6e17fb39b768b89e3783d16e237fe
56 56
 - name: github.com/mattn/go-isatty
57 57
   version: 56b76bdf51f7708750eac80fa38b952bb9f32639
58
+- name: github.com/mitchellh/ioprogress
59
+  version: 8163955264568045f462ae7e2d6d07b2001fc997
58 60
 - name: github.com/mitchellh/mapstructure
59 61
   version: 281073eb9eb092240d33ef253c404f1cca550309
60 62
 - name: github.com/mrjones/oauth
61
-  version: 08f4af202e479e3caee4c7d4119066d76fd2e83e
63
+  version: fdd43ab9ffd4adbedbecf59a0ec6a7e0d3ef3970
62 64
 - name: github.com/pmezard/go-difflib
63 65
   version: e8554b8641db39598be7f6342874b958f12ae1d4
64 66
 - name: github.com/russross/blackfriday
@@ -67,6 +69,8 @@ imports:
67 69
   version: d41af8bb6a7704f00bc3b7cba9355ae6a5a80048
68 70
 - name: github.com/shurcooL/sanitized_anchor_name
69 71
   version: 10ef21a441db47d8b13ebcc5fd2310f636973c77
72
+- name: github.com/spf13/afero
73
+  version: 9d44c3003b295701ee0989a37d51d15271f7a6a1
70 74
 - name: github.com/spf13/cast
71 75
   version: ee815aaf958c707ad07547cd62150d973710f747
72 76
 - name: github.com/spf13/cobra
@@ -98,9 +102,9 @@ imports:
98 102
 - name: golang.org/x/text
99 103
   version: 87ad79f47ac96edbf2568691d123d113fd7ac535
100 104
 - name: google.golang.org/api
101
-  version: 80b32e23dd3e75da09373e0566232a3fe91ec43e
105
+  version: fb9a762b1ba5eb828d4c3ea6b53755f290ca27ad
102 106
 - name: google.golang.org/appengine
103
-  version: 7bed6a18ea6f00deda4ea0b2797f715c7c555a6c
107
+  version: ea2803184885858bb094b58ddeac06b3675b9994
104 108
 - name: google.golang.org/cloud
105 109
   version: ec5efcc6a7862ae410e34d8de21fdec12e367732
106 110
 - name: google.golang.org/grpc

+ 2
- 0
glide.yaml View File

@@ -26,3 +26,5 @@ import:
26 26
 - package: github.com/stretchr/testify
27 27
   subpackages:
28 28
   - /assert
29
+- package: github.com/spf13/afero
30
+- package: github.com/mitchellh/ioprogress

+ 79
- 0
install/download.go View File

@@ -0,0 +1,79 @@
1
+package install
2
+
3
+import (
4
+	"bufio"
5
+	"crypto/sha256"
6
+	"encoding/hex"
7
+	"fmt"
8
+	"io"
9
+	"net/http"
10
+	"net/url"
11
+	"os"
12
+	"strconv"
13
+
14
+	"github.com/mitchellh/ioprogress"
15
+)
16
+
17
+func Download(localPath, remoteURL string) (*os.File, error) {
18
+	f, err := os.Create(localPath)
19
+	if err != nil {
20
+		return nil, err
21
+	}
22
+
23
+	resp, err := http.Get(remoteURL)
24
+	if err != nil {
25
+		return nil, err
26
+	}
27
+	defer resp.Body.Close()
28
+
29
+	size, _ := strconv.Atoi(resp.Header.Get("Content-Length"))
30
+
31
+	progressR := &ioprogress.Reader{
32
+		Reader: resp.Body,
33
+		Size:   int64(size),
34
+	}
35
+
36
+	_, err = io.Copy(f, progressR)
37
+	if err != nil {
38
+		return nil, err
39
+	}
40
+
41
+	err = f.Close()
42
+	if err != nil {
43
+		return nil, err
44
+	}
45
+
46
+	return os.Open(localPath)
47
+}
48
+
49
+func Validate(f, cs io.Reader) error {
50
+	h := sha256.New()
51
+
52
+	if _, err := io.Copy(h, f); err != nil {
53
+		return err
54
+	}
55
+
56
+	scanner := bufio.NewScanner(cs)
57
+	scanner.Split(bufio.ScanWords)
58
+
59
+	var words []string
60
+	for scanner.Scan() {
61
+		words = append(words, scanner.Text())
62
+	}
63
+
64
+	if sum, wantedSum := hex.EncodeToString(h.Sum(nil)), words[0]; sum != wantedSum {
65
+		return fmt.Errorf("invalid checksum: %s != %s", sum, wantedSum)
66
+	}
67
+
68
+	return nil
69
+}
70
+
71
+func URL(ver, filename string) string {
72
+	u := url.URL{
73
+		Scheme: "http",
74
+		Host:   "github.com",
75
+		Path:   fmt.Sprintf("/bryanl/doit/releases/download/v%s/%s", ver, filename),
76
+	}
77
+
78
+	return u.String()
79
+}

+ 25
- 0
install/download_test.go View File

@@ -0,0 +1,25 @@
1
+package install
2
+
3
+import (
4
+	"testing"
5
+
6
+	"github.com/spf13/afero"
7
+	"github.com/stretchr/testify/assert"
8
+)
9
+
10
+func TestValidate(t *testing.T) {
11
+	appFS := &afero.MemMapFs{}
12
+
13
+	appFS.Mkdir("test", 0755)
14
+	afero.WriteFile(appFS, "test/dl", []byte("dl"), 0644)
15
+	afero.WriteFile(appFS, "test/dl.sha256", []byte("2ca69efd4ea5af91a637f19ba0bab8b081d2c03773c4a72fcbf8817c856b33ef  /test/dl.sha256"), 0644)
16
+
17
+	dl, err := appFS.Open("test/dl")
18
+	assert.NoError(t, err)
19
+
20
+	cs, err := appFS.Open("test/dl.sha256")
21
+	assert.NoError(t, err)
22
+
23
+	err = Validate(dl, cs)
24
+	assert.NoError(t, err)
25
+}

+ 154
- 0
sammy.txt View File

@@ -0,0 +1,154 @@
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
+

+ 0
- 0
vendor/.keep View File