├── Appicon.png ├── README.md ├── Makefile ├── go.mod ├── .gitignore ├── main.go └── go.sum /Appicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac0d3r/cslauncher/HEAD/Appicon.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cslauncher 2 | 3 | Cobalt Strike Launcher on macOS 4 | 5 | ![](./Appicon.png) 6 | 7 | ## Preview 8 | 9 | ![](https://user-images.githubusercontent.com/26270009/202859817-754293ca-f47e-4400-8dcb-23afbe8162e8.png) 10 | 11 | ## Download 12 | - https://github.com/ac0d3r/cslauncher/releases -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | cslauncher: 2 | CGO_ENABLED=1 GOARCH=amd64 go build -ldflags "-s -w" -trimpath -o cslauncher_amd64 main.go 3 | CGO_ENABLED=1 GOARCH=arm64 go build -ldflags "-s -w" -trimpath -o cslauncher_arm64 main.go 4 | upx cslauncher_amd64 5 | lipo -create cslauncher_amd64 cslauncher_arm64 -output cslauncher 6 | rm cslauncher_amd64 cslauncher_arm64 7 | # TODO 8 | # 查看自己证书签名 security find-identity -v -p codesigning 9 | # 先替换签名{XXX} & 启用强化运行时 10 | # codesign --options runtime -s "{XXX}" cslauncher 11 | 12 | mkdir build/cslauncher.app 13 | mkdir build/cslauncher.app/Contents 14 | mkdir build/cslauncher.app/Contents/MacOS 15 | mkdir build/cslauncher.app/Contents/Resources 16 | 17 | cp build/Info.plist.src build/cslauncher.app/Contents/Info.plist 18 | mv cslauncher build/cslauncher.app/Contents/MacOS/cslauncher 19 | cp build/Appicon.icns build/cslauncher.app/Contents/Resources/Appicon.icns 20 | clean: 21 | rm cslauncher_amd64 cslauncher_arm64 cslauncher 22 | rm -rf build/cslauncher.app -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module cslauncher 2 | 3 | go 1.19 4 | 5 | require ( 6 | github.com/getlantern/systray v1.2.1 7 | github.com/ncruces/zenity v0.9.2 8 | ) 9 | 10 | require ( 11 | github.com/akavel/rsrc v0.10.2 // indirect 12 | github.com/dchest/jsmin v0.0.0-20220218165748-59f39799265f // indirect 13 | github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 // indirect 14 | github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7 // indirect 15 | github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7 // indirect 16 | github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7 // indirect 17 | github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55 // indirect 18 | github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f // indirect 19 | github.com/go-stack/stack v1.8.0 // indirect 20 | github.com/josephspurrier/goversioninfo v1.4.0 // indirect 21 | github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect 22 | github.com/randall77/makefat v0.0.0-20210315173500-7ddd0e42c844 // indirect 23 | golang.org/x/image v0.1.0 // indirect 24 | golang.org/x/sys v0.1.0 // indirect 25 | ) 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 9 | *.xcscmblueprint 10 | *.xccheckout 11 | 12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 13 | DerivedData/ 14 | *.moved-aside 15 | *.pbxuser 16 | !default.pbxuser 17 | *.mode1v3 18 | !default.mode1v3 19 | *.mode2v3 20 | !default.mode2v3 21 | *.perspectivev3 22 | !default.perspectivev3 23 | 24 | ## Obj-C/Swift specific 25 | *.hmap 26 | 27 | ## App packaging 28 | *.ipa 29 | *.dSYM.zip 30 | *.dSYM 31 | 32 | # CocoaPods 33 | # 34 | # We recommend against adding the Pods directory to your .gitignore. However 35 | # you should judge for yourself, the pros and cons are mentioned at: 36 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 37 | # 38 | # Pods/ 39 | # 40 | # Add this line if you want to avoid checking in source code from the Xcode workspace 41 | # *.xcworkspace 42 | 43 | # Carthage 44 | # 45 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 46 | # Carthage/Checkouts 47 | 48 | Carthage/Build/ 49 | 50 | # fastlane 51 | # 52 | # It is recommended to not store the screenshots in the git repo. 53 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 54 | # For more information about the recommended setup visit: 55 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 56 | 57 | fastlane/report.xml 58 | fastlane/Preview.html 59 | fastlane/screenshots/**/*.png 60 | fastlane/test_output 61 | 62 | # Code Injection 63 | # 64 | # After new code Injection tools there's a generated folder /iOSInjectionProject 65 | # https://github.com/johnno1962/injectionforxcode 66 | 67 | iOSInjectionProject/ 68 | 69 | # dev 70 | .DS_Store 71 | *.app -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | _ "embed" 5 | "encoding/json" 6 | "errors" 7 | "fmt" 8 | "os" 9 | "os/exec" 10 | "path" 11 | "strings" 12 | 13 | "github.com/getlantern/systray" 14 | "github.com/ncruces/zenity" 15 | ) 16 | 17 | const ( 18 | csjar = "cobaltstrike.jar" 19 | csexe = "cobaltstrike" 20 | defualtStartCmd = "java -XX:ParallelGCThreads=4 -XX:+AggressiveHeap -XX:+UseParallelGC -jar cobaltstrike.jar $*" 21 | 22 | cnfName = "cslauncher" 23 | ) 24 | 25 | var ( 26 | ErrMissingJar = errors.New("missing cobaltstrike.jar file") 27 | ErrAlreadyRunning = errors.New("already running") 28 | ) 29 | 30 | //go:embed Appicon.png 31 | var icon []byte 32 | 33 | var Config = func() *config { 34 | homeDir, err := os.UserHomeDir() 35 | if err != nil { 36 | homeDir, _ = os.Getwd() 37 | } 38 | 39 | homeDir = path.Join(homeDir, ".config", cnfName) 40 | return &config{ 41 | homeDir: homeDir, 42 | configFile: ".cslauncher", 43 | config: make(map[string]string)} 44 | }() 45 | 46 | type config struct { 47 | homeDir string 48 | configFile string 49 | 50 | config map[string]string 51 | } 52 | 53 | func (c *config) Init() error { 54 | var data []byte 55 | exist, err := pathIsExist(c.homeDir) 56 | if err != nil { 57 | return err 58 | } 59 | if !exist { 60 | if err := os.Mkdir(c.homeDir, os.ModePerm); err != nil { 61 | return err 62 | } 63 | } 64 | 65 | cnf := path.Join(c.homeDir, c.configFile) 66 | exist, err = pathIsExist(cnf) 67 | if err != nil { 68 | return err 69 | } 70 | if !exist { 71 | f, err := os.Create(cnf) 72 | if err != nil { 73 | return err 74 | } 75 | f.Close() 76 | } else if data, err = os.ReadFile(cnf); err != nil { 77 | return err 78 | } 79 | if len(data) == 0 { 80 | return nil 81 | } 82 | return json.Unmarshal(data, &c.config) 83 | } 84 | 85 | func (c *config) Save() error { 86 | if c.config == nil { 87 | return nil 88 | } 89 | data, err := json.Marshal(c.config) 90 | if err != nil { 91 | return err 92 | } 93 | return os.WriteFile(path.Join(c.homeDir, c.configFile), data, os.ModePerm) 94 | } 95 | 96 | func (c *config) Set(k, v string) { 97 | c.config[strings.ToLower(k)] = v 98 | } 99 | 100 | func (c *config) Get(k string) string { 101 | return c.config[strings.ToLower(k)] 102 | } 103 | 104 | func main() { 105 | app := newApp() 106 | systray.Run(app.startup, app.shutdown) 107 | } 108 | 109 | type app struct { 110 | csCmdArgs string 111 | cspath string 112 | } 113 | 114 | func newApp() *app { 115 | return &app{} 116 | } 117 | 118 | func (a *app) selectPath(paths string) error { 119 | if len(paths) == 0 { 120 | return nil 121 | } 122 | files, err := os.ReadDir(paths) 123 | if err != nil { 124 | return err 125 | } 126 | findJar := false 127 | for _, f := range files { 128 | if f.Name() == csexe { 129 | a.csCmdArgs = fmt.Sprintf("/bin/bash %s", path.Join(paths, f.Name())) 130 | } 131 | if f.Name() == csjar { 132 | findJar = true 133 | } 134 | } 135 | if !findJar { 136 | return ErrMissingJar 137 | } 138 | if len(a.csCmdArgs) == 0 { 139 | a.csCmdArgs = defualtStartCmd 140 | } 141 | a.cspath = paths 142 | Config.Set("cs", a.cspath) 143 | Config.Set("csCmdArgs", a.csCmdArgs) 144 | return nil 145 | } 146 | 147 | func (a *app) showinFinder() error { 148 | if len(a.cspath) == 0 { 149 | return os.ErrNotExist 150 | } 151 | return exec.Command("open", a.cspath).Run() 152 | } 153 | 154 | func (a *app) startCS() error { 155 | if len(a.csCmdArgs) == 0 { 156 | return errors.New("must set cobaltstrike path") 157 | } 158 | args := strings.Split(a.csCmdArgs, " ") 159 | cmd := exec.Command(args[0], args[1:]...) 160 | cmd.Dir = a.cspath 161 | return cmd.Start() 162 | } 163 | 164 | func (a *app) startup() { 165 | systray.SetIcon(icon) 166 | systray.SetTitle("cslauncher") 167 | systray.SetTooltip("Cobalt Strike Launcher on macOS - zznQ") 168 | 169 | pathShowMenu := systray.AddMenuItem("Path: ", "") 170 | pathShowMenu.Disable() 171 | cmdArgsMenu := systray.AddMenuItem("CmdArgs: ", "") 172 | systray.AddSeparator() 173 | selectPathMenu := systray.AddMenuItem("Select Path", "") 174 | showinFinderMenu := systray.AddMenuItem("ShowInFinder", "") 175 | startCSMenu := systray.AddMenuItem("Start CS", "") 176 | systray.AddSeparator() 177 | quitMenu := systray.AddMenuItem("Quit", "") 178 | 179 | // config 180 | if err := Config.Init(); err != nil { 181 | zenity.Error(err.Error(), 182 | zenity.Title("Error"), 183 | zenity.ErrorIcon) 184 | } 185 | a.cspath = Config.Get("cs") 186 | a.csCmdArgs = Config.Get("csCmdArgs") 187 | if len(a.cspath) != 0 { 188 | pathShowMenu.SetTitle(fmt.Sprintf("Path: %s", a.cspath)) 189 | } 190 | if len(a.csCmdArgs) != 0 { 191 | cmdArgsMenu.SetTitle(fmt.Sprintf("CmdArgs: %s", a.csCmdArgs)) 192 | } 193 | 194 | go func() { 195 | for { 196 | select { 197 | case <-cmdArgsMenu.ClickedCh: 198 | cmdargs, err := zenity.Entry("set cs start command args", zenity.EntryText(a.csCmdArgs)) 199 | if !errors.Is(err, zenity.ErrCanceled) && err != nil { 200 | zenity.Error(err.Error(), 201 | zenity.Title("Error"), 202 | zenity.ErrorIcon) 203 | } 204 | if len(cmdargs) != 0 { 205 | a.csCmdArgs = cmdargs 206 | cmdArgsMenu.SetTitle(fmt.Sprintf("CmdArgs: %s", a.csCmdArgs)) 207 | Config.Set("csCmdArgs", a.csCmdArgs) 208 | } 209 | case <-selectPathMenu.ClickedCh: 210 | path, err := zenity.SelectFile(zenity.Directory()) 211 | if !errors.Is(err, zenity.ErrCanceled) && err != nil { 212 | zenity.Error(err.Error(), 213 | zenity.Title("Error"), 214 | zenity.ErrorIcon) 215 | } 216 | 217 | if err := a.selectPath(path); err != nil { 218 | zenity.Error(err.Error(), 219 | zenity.Title("Error"), 220 | zenity.ErrorIcon) 221 | } else { 222 | pathShowMenu.SetTitle(fmt.Sprintf("Path: %s", a.cspath)) 223 | cmdArgsMenu.SetTitle(fmt.Sprintf("CmdArgs: %s", a.csCmdArgs)) 224 | } 225 | case <-showinFinderMenu.ClickedCh: 226 | if err := a.showinFinder(); err != nil { 227 | zenity.Error(err.Error(), 228 | zenity.Title("Error"), 229 | zenity.ErrorIcon) 230 | } 231 | case <-startCSMenu.ClickedCh: 232 | err := a.startCS() 233 | if err != nil { 234 | zenity.Error(err.Error(), 235 | zenity.Title("Error"), 236 | zenity.ErrorIcon) 237 | } 238 | case <-quitMenu.ClickedCh: 239 | systray.Quit() 240 | return 241 | } 242 | } 243 | }() 244 | } 245 | 246 | func (a *app) shutdown() { 247 | Config.Save() 248 | } 249 | 250 | func pathIsExist(path string) (bool, error) { 251 | _, err := os.Stat(path) 252 | if errors.Is(err, os.ErrNotExist) { 253 | return false, nil 254 | } else if err == nil { 255 | return true, nil 256 | } else { 257 | return false, err 258 | } 259 | } 260 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw= 2 | github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= 3 | github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 4 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 5 | github.com/dchest/jsmin v0.0.0-20220218165748-59f39799265f h1:OGqDDftRTwrvUoL6pOG7rYTmWsTCvyEWFsMjg+HcOaA= 6 | github.com/dchest/jsmin v0.0.0-20220218165748-59f39799265f/go.mod h1:Dv9D0NUlAsaQcGQZa5kc5mqR9ua72SmA8VXi4cd+cBw= 7 | github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 h1:NRUJuo3v3WGC/g5YiyF790gut6oQr5f3FBI88Wv0dx4= 8 | github.com/getlantern/context v0.0.0-20190109183933-c447772a6520/go.mod h1:L+mq6/vvYHKjCX2oez0CgEAJmbq1fbb/oNJIWQkBybY= 9 | github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7 h1:6uJ+sZ/e03gkbqZ0kUG6mfKoqDb4XMAzMIwlajq19So= 10 | github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7/go.mod h1:l+xpFBrCtDLpK9qNjxs+cHU6+BAdlBaxHqikB6Lku3A= 11 | github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7 h1:guBYzEaLz0Vfc/jv0czrr2z7qyzTOGC9hiQ0VC+hKjk= 12 | github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7/go.mod h1:zx/1xUUeYPy3Pcmet8OSXLbF47l+3y6hIPpyLWoR9oc= 13 | github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7 h1:micT5vkcr9tOVk1FiH8SWKID8ultN44Z+yzd2y/Vyb0= 14 | github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7/go.mod h1:dD3CgOrwlzca8ed61CsZouQS5h5jIzkK9ZWrTcf0s+o= 15 | github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55 h1:XYzSdCbkzOC0FDNrgJqGRo8PCMFOBFL9py72DRs7bmc= 16 | github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55/go.mod h1:6mmzY2kW1TOOrVy+r41Za2MxXM+hhqTtY3oBKd2AgFA= 17 | github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f h1:wrYrQttPS8FHIRSlsrcuKazukx/xqO/PpLZzZXsF+EA= 18 | github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA= 19 | github.com/getlantern/systray v1.2.1 h1:udsC2k98v2hN359VTFShuQW6GGprRprw6kD6539JikI= 20 | github.com/getlantern/systray v1.2.1/go.mod h1:AecygODWIsBquJCJFop8MEQcJbWFfw/1yWbVabNgpCM= 21 | github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= 22 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 23 | github.com/josephspurrier/goversioninfo v1.4.0 h1:Puhl12NSHUSALHSuzYwPYQkqa2E1+7SrtAPJorKK0C8= 24 | github.com/josephspurrier/goversioninfo v1.4.0/go.mod h1:JWzv5rKQr+MmW+LvM412ToT/IkYDZjaclF2pKDss8IY= 25 | github.com/ncruces/zenity v0.9.2 h1:256SIu9MNWDVvblvLHpIh2di9UtSkNwfIjwCIL/aT54= 26 | github.com/ncruces/zenity v0.9.2/go.mod h1:1Y9+ajYCXIlZgMSmBy9YXM0rDqudSFifxyq4CCHOJDY= 27 | github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= 28 | github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= 29 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 30 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 31 | github.com/randall77/makefat v0.0.0-20210315173500-7ddd0e42c844 h1:GranzK4hv1/pqTIhMTXt2X8MmMOuH3hMeUR0o9SP5yc= 32 | github.com/randall77/makefat v0.0.0-20210315173500-7ddd0e42c844/go.mod h1:T1TLSfyWVBRXVGzWd0o9BI4kfoO9InEgfQe4NV3mLz8= 33 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 34 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 35 | github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= 36 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 37 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 38 | go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= 39 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 40 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 41 | golang.org/x/image v0.1.0 h1:r8Oj8ZA2Xy12/b5KZYj3tuv7NG/fBz3TwQVvpJ9l8Rk= 42 | golang.org/x/image v0.1.0/go.mod h1:iyPr49SD/G/TBxYVB/9RRtGUT5eNbo2u4NamWeQcD5c= 43 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 44 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 45 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 46 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 47 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 48 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 49 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 50 | golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 51 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 52 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 53 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 54 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 55 | golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= 56 | golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 57 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 58 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 59 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 60 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 61 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 62 | golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 63 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 64 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 65 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 66 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 67 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 68 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= 69 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 70 | --------------------------------------------------------------------------------