Skip to content

Commit 074e648

Browse files
authored
Merge pull request #705 from iotaledger/initial-glazed
initial glazed integration
2 parents 0540dc6 + abd5fec commit 074e648

File tree

16 files changed

+1362
-105
lines changed

16 files changed

+1362
-105
lines changed

tools/cluster/tests/wasp-cli_test.go

Lines changed: 175 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,76 @@ import (
2828
)
2929

3030
func TestWaspAuth(t *testing.T) {
31-
t.Skip("TODO: fix test")
3231
w := newWaspCLITest(t, waspClusterOpts{
3332
modifyConfig: func(nodeIndex int, configParams cluster.WaspConfigParams) cluster.WaspConfigParams {
3433
configParams.AuthScheme = "jwt"
3534
return configParams
3635
},
3736
})
38-
_, err := w.Run("chain", "list", "--node=0", "--node=0")
37+
_, err := w.Run("chain", "info")
3938
require.Error(t, err)
40-
out := w.MustRun("auth", "login", "--node=0", "-u=wasp", "-p=wasp")
41-
require.Equal(t, "Successfully authenticated", out[1])
42-
out = w.MustRun("chain", "list", "--node=0", "--node=0")
43-
require.Contains(t, out[0], "Total 0 chain(s)")
39+
40+
t.Run("table format output", func(t *testing.T) {
41+
//t.Skip()
42+
out := w.MustRun("auth", "login", "--node=0", "-u=wasp", "-p=wasp")
43+
// Check for table output format with SUCCESS status
44+
found := false
45+
for _, line := range out {
46+
if strings.Contains(line, "success") && strings.Contains(line, "wasp") {
47+
found = true
48+
break
49+
}
50+
// Check for the table format
51+
if strings.Contains(line, "| success") {
52+
found = true
53+
break
54+
}
55+
}
56+
require.True(t, found, "Expected to find SUCCESS status in table output, got: %v", out)
57+
})
58+
59+
t.Run("json format output", func(t *testing.T) {
60+
out := w.MustRun("auth", "login", "--node=0", "-u=wasp", "-p=wasp", "--json")
61+
62+
// Join all output lines to get the complete JSON
63+
jsonOutput := strings.Join(out, "")
64+
65+
// Parse the JSON output to verify it's valid JSON
66+
var authResult map[string]interface{}
67+
err := json.Unmarshal([]byte(jsonOutput), &authResult)
68+
require.NoError(t, err, "Expected valid JSON output, got: %v", jsonOutput)
69+
70+
// Verify the standardized JSON structure contains required top-level fields
71+
require.Contains(t, authResult, "type", "JSON output should contain 'type' field")
72+
require.Contains(t, authResult, "status", "JSON output should contain 'status' field")
73+
require.Contains(t, authResult, "timestamp", "JSON output should contain 'timestamp' field")
74+
require.Contains(t, authResult, "data", "JSON output should contain 'data' field")
75+
76+
// Verify top-level field values
77+
require.Equal(t, "auth", authResult["type"], "Expected type to be 'auth'")
78+
require.Equal(t, "success", authResult["status"], "Expected status to be 'success'")
79+
require.NotEmpty(t, authResult["timestamp"], "Timestamp should not be empty")
80+
81+
// Verify the data structure contains auth-specific fields
82+
data, ok := authResult["data"].(map[string]interface{})
83+
require.True(t, ok, "Data field should be an object")
84+
require.Contains(t, data, "node", "Auth data should contain 'node' field")
85+
require.Contains(t, data, "username", "Auth data should contain 'username' field")
86+
87+
// Verify the auth data values are correct
88+
require.Equal(t, "0", data["node"], "Expected node to be '0'")
89+
require.Equal(t, "wasp", data["username"], "Expected username to be 'wasp'")
90+
91+
// Check if the message field exists in data (it's optional)
92+
if message, exists := data["message"]; exists {
93+
require.NotEmpty(t, message, "Message field should not be empty if present")
94+
}
95+
96+
// Validate timestamp format (should be ISO 8601)
97+
timestamp, ok := authResult["timestamp"].(string)
98+
require.True(t, ok, "Timestamp should be a string")
99+
require.Regexp(t, `^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?$`, timestamp, "Timestamp should be in ISO 8601 format")
100+
})
44101
}
45102

46103
func TestZeroGasFee(t *testing.T) {
@@ -57,7 +114,7 @@ func TestZeroGasFee(t *testing.T) {
57114
w.ActivateChainOnAllNodes(chainName, 0)
58115

59116
w.MustRun("wallet", "address")
60-
alternativeAddress := getAddress(w.MustRun("wallet", "address"))
117+
alternativeAddress := getAddressFromJSON(w.MustRun("wallet", "address", "--json"))
61118
w.MustRun("chain", "deposit", alternativeAddress, "base|2000000", "--node=0")
62119
w.MustRun("chain", "balance", alternativeAddress, "--node=0")
63120
outs, err := w.Run("chain", "info", "--node=0", "--node=0")
@@ -75,7 +132,7 @@ func TestZeroGasFee(t *testing.T) {
75132
})
76133

77134
t.Run("deposit directly to EVM", func(t *testing.T) {
78-
alternativeAddress := getAddress(w.MustRun("wallet", "address", "--address-index=1"))
135+
alternativeAddress := getAddressFromJSON(w.MustRun("wallet", "address", "--address-index=1", "--json"))
79136
w.MustRun("wallet", "send-funds", "-s", alternativeAddress, "base|1000000")
80137
outs := w.MustRun("wallet", "balance", "--address-index=1")
81138
_, eth := newEthereumAccount()
@@ -85,15 +142,59 @@ func TestZeroGasFee(t *testing.T) {
85142
})
86143
}
87144

88-
func checkL1Balance(t *testing.T, out []string, expected int) {
145+
// checkL1BalanceJSON checks the balance using JSON output format
146+
func checkL1BalanceJSON(t *testing.T, out []string, expected int) {
89147
t.Helper()
90-
r := regexp.MustCompile(`- 0x[0]{0,63}2+::iota::IOTA: (\d+)`).FindStringSubmatch(strings.Join(out, ""))
91-
if r == nil {
92-
panic("couldn't check balance")
148+
149+
// Join all output lines to get the complete JSON
150+
jsonOutput := strings.Join(out, "")
151+
152+
// Parse the JSON output
153+
var balanceResult map[string]interface{}
154+
err := json.Unmarshal([]byte(jsonOutput), &balanceResult)
155+
require.NoError(t, err, "Expected valid JSON output, got: %v", jsonOutput)
156+
157+
// Verify the JSON structure
158+
require.Contains(t, balanceResult, "type", "JSON output should contain 'type' field")
159+
require.Contains(t, balanceResult, "status", "JSON output should contain 'status' field")
160+
require.Contains(t, balanceResult, "data", "JSON output should contain 'data' field")
161+
162+
// Verify type and status
163+
require.Equal(t, "wallet_balance", balanceResult["type"], "Expected type to be 'wallet_balance'")
164+
require.Equal(t, "success", balanceResult["status"], "Expected status to be 'success'")
165+
166+
// Extract the data section
167+
data, ok := balanceResult["data"].(map[string]interface{})
168+
require.True(t, ok, "Data field should be an object")
169+
require.Contains(t, data, "balances", "Data should contain 'balances' field")
170+
171+
// Extract balances array
172+
balances, ok := data["balances"].([]interface{})
173+
require.True(t, ok, "Balances should be an array")
174+
175+
// Find the IOTA balance
176+
var iotaBalance uint64
177+
found := false
178+
for _, balanceItem := range balances {
179+
balance, ok := balanceItem.(map[string]interface{})
180+
require.True(t, ok, "Each balance item should be an object")
181+
coinType, ok := balance["coinType"].(string)
182+
require.True(t, ok, "coinType should be a string")
183+
184+
// Look for IOTA coin type (matches the regex pattern from original test)
185+
if strings.Contains(coinType, "::iota::IOTA") {
186+
totalBalanceStr, ok := balance["totalBalance"].(string)
187+
require.True(t, ok, "totalBalance should be a string")
188+
totalBalance, err := strconv.ParseUint(totalBalanceStr, 10, 64)
189+
require.NoError(t, err, "totalBalance should be a valid number string")
190+
iotaBalance = totalBalance
191+
found = true
192+
break
193+
}
93194
}
94-
amount, err := strconv.Atoi(r[1])
95-
require.NoError(t, err)
96-
require.EqualValues(t, expected, amount)
195+
196+
require.True(t, found, "IOTA balance not found in response")
197+
require.EqualValues(t, expected, iotaBalance, "Expected IOTA balance to be %d, got %d", expected, iotaBalance)
97198
}
98199

99200
func checkL2Balance(t *testing.T, out []string, expected int) {
@@ -107,23 +208,54 @@ func checkL2Balance(t *testing.T, out []string, expected int) {
107208
require.EqualValues(t, expected, amount)
108209
}
109210

110-
func getAddress(out []string) string {
111-
r := regexp.MustCompile(`.*Address:\s+(\w*).*`).FindStringSubmatch(strings.Join(out, ""))
112-
if r == nil {
113-
panic("couldn't get address")
211+
// getAddressFromJSON extracts the address from JSON output
212+
func getAddressFromJSON(out []string) string {
213+
// Join all output lines to get the complete JSON
214+
jsonOutput := strings.Join(out, "")
215+
216+
// Parse the JSON output
217+
var addressResult map[string]interface{}
218+
err := json.Unmarshal([]byte(jsonOutput), &addressResult)
219+
if err != nil {
220+
panic(fmt.Sprintf("couldn't parse JSON output: %v", err))
221+
}
222+
223+
// Verify the JSON structure
224+
if addressResult["type"] != "wallet_address" {
225+
panic(fmt.Sprintf("expected type 'wallet_address', got: %v", addressResult["type"]))
226+
}
227+
228+
if addressResult["status"] != "success" {
229+
panic(fmt.Sprintf("expected status 'success', got: %v", addressResult["status"]))
230+
}
231+
232+
// Extract the data section
233+
data, ok := addressResult["data"].(map[string]interface{})
234+
if !ok {
235+
panic("data field should be an object")
236+
}
237+
238+
// Extract the address
239+
address, ok := data["address"].(string)
240+
if !ok || address == "" {
241+
panic("address field should be a non-empty string")
114242
}
115-
return r[1]
243+
244+
return address
116245
}
117246

118247
func TestWaspCLISendFunds(t *testing.T) {
119248
w := newWaspCLITest(t)
120249

121-
alternativeAddress := getAddress(w.MustRun("wallet", "address", "--address-index=1"))
250+
alternativeAddress := getAddressFromJSON(w.MustRun("wallet", "address", "--address-index=1", "--json"))
122251

123252
w.MustRun("wallet", "request-funds")
124253
w.MustRun("wallet", "send-funds", alternativeAddress, "base|1000")
125-
outs := w.MustRun("wallet", "balance", "--address-index=1")
126-
checkL1Balance(t, outs, 1000)
254+
255+
outs := w.MustRun("wallet", "balance", "--address-index=1", "--json")
256+
fmt.Println(strings.Join(outs, ""))
257+
checkL1BalanceJSON(t, outs, 1000)
258+
127259
}
128260

129261
func TestWaspCLIDeposit(t *testing.T) {
@@ -139,7 +271,7 @@ func TestWaspCLIDeposit(t *testing.T) {
139271

140272
// fund an alternative address to deposit from (so we can test the fees,
141273
// since --address-index=0 is the chain admin / default payoutAddress)
142-
alternativeAddress := getAddress(w.MustRun("wallet", "address", "--address-index=1"))
274+
alternativeAddress := getAddressFromJSON(w.MustRun("wallet", "address", "--address-index=1", "--json"))
143275
w.MustRun("wallet", "send-funds", "-s", alternativeAddress, "base|10000000", "--address-index=1")
144276

145277
outs = w.MustRun("wallet", "balance")
@@ -382,10 +514,16 @@ func TestWaspCLITrustListImport(t *testing.T) {
382514

383515
// set cluster2/node0 to trust all nodes from cluster 1
384516
for _, nodeIndex := range w.Cluster.Config.AllNodes() {
385-
peeringInfoOutput := w.MustRun("peering", "info", fmt.Sprintf("--node=%d", nodeIndex))
386-
pubKey := regexp.MustCompile(`PubKey:\s+([[:alnum:]]+)$`).FindStringSubmatch(peeringInfoOutput[0])[1]
387-
peeringURL := regexp.MustCompile(`PeeringURL:\s+(.+)$`).FindStringSubmatch(peeringInfoOutput[1])[1]
388-
w2.MustRun("peering", "trust", fmt.Sprintf("x%d", nodeIndex), pubKey, peeringURL, "--node=0")
517+
peeringInfoOutput := w.MustRun("peering", "info", fmt.Sprintf("--node=%d", nodeIndex), "--json")
518+
require.Len(t, peeringInfoOutput, 1, "Expected single line of JSON output")
519+
520+
var peeringInfo struct {
521+
PubKey string `json:"pubKey"`
522+
PeeringURL string `json:"peeringURL"`
523+
}
524+
require.NoError(t, json.Unmarshal([]byte(peeringInfoOutput[0]), &peeringInfo))
525+
526+
w2.MustRun("peering", "trust", fmt.Sprintf("x%d", nodeIndex), peeringInfo.PubKey, peeringInfo.PeeringURL, "--node=0")
389527
}
390528

391529
// import the trust from cluster2/node0 to cluster2/node1
@@ -428,8 +566,15 @@ func TestWaspCLICantPeerWithSelf(t *testing.T) {
428566
nNodes: 1,
429567
})
430568

431-
peeringInfoOutput := w.MustRun("peering", "info")
432-
pubKey := regexp.MustCompile(`PubKey:\s+([[:alnum:]]+)$`).FindStringSubmatch(peeringInfoOutput[0])[1]
569+
peeringInfoOutput := w.MustRun("peering", "info", "--json")
570+
require.Len(t, peeringInfoOutput, 1, "Expected single line of JSON output")
571+
572+
var peeringInfo struct {
573+
PubKey string `json:"pubKey"`
574+
PeeringURL string `json:"peeringURL"`
575+
}
576+
require.NoError(t, json.Unmarshal([]byte(peeringInfoOutput[0]), &peeringInfo))
577+
pubKey := peeringInfo.PubKey
433578

434579
require.Panics(
435580
t,

tools/evm/evmemulator/go.mod

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/iotaledger/wasp/v2/tools/evm/evmemulator
22

3-
go 1.23.8
3+
go 1.24.2
44

55
toolchain go1.24.4
66

@@ -51,7 +51,7 @@ require (
5151
github.com/go-logr/logr v1.4.2 // indirect
5252
github.com/go-logr/stdr v1.2.2 // indirect
5353
github.com/go-ole/go-ole v1.3.0 // indirect
54-
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
54+
github.com/go-viper/mapstructure/v2 v2.3.0 // indirect
5555
github.com/gofrs/flock v0.8.1 // indirect
5656
github.com/gogo/protobuf v1.3.2 // indirect
5757
github.com/golang/snappy v1.0.0 // indirect
@@ -82,7 +82,7 @@ require (
8282
github.com/kr/text v0.2.0 // indirect
8383
github.com/lufia/plan9stats v0.0.0-20250303091104-876f3ea5145d // indirect
8484
github.com/magiconair/properties v1.8.9 // indirect
85-
github.com/mattn/go-runewidth v0.0.15 // indirect
85+
github.com/mattn/go-runewidth v0.0.16 // indirect
8686
github.com/mitchellh/copystructure v1.2.0 // indirect
8787
github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect
8888
github.com/mitchellh/reflectwalk v1.0.2 // indirect
@@ -116,7 +116,7 @@ require (
116116
github.com/prometheus/client_model v0.6.2 // indirect
117117
github.com/prometheus/common v0.64.0 // indirect
118118
github.com/prometheus/procfs v0.16.1 // indirect
119-
github.com/rivo/uniseg v0.4.4 // indirect
119+
github.com/rivo/uniseg v0.4.7 // indirect
120120
github.com/samber/lo v1.49.1 // indirect
121121
github.com/sasha-s/go-deadlock v0.3.5 // indirect
122122
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
@@ -143,12 +143,12 @@ require (
143143
go.opentelemetry.io/otel/metric v1.35.0 // indirect
144144
go.opentelemetry.io/otel/trace v1.35.0 // indirect
145145
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
146-
golang.org/x/crypto v0.39.0 // indirect
146+
golang.org/x/crypto v0.40.0 // indirect
147147
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
148-
golang.org/x/net v0.41.0 // indirect
149-
golang.org/x/sync v0.15.0 // indirect
150-
golang.org/x/sys v0.33.0 // indirect
151-
golang.org/x/text v0.26.0 // indirect
148+
golang.org/x/net v0.42.0 // indirect
149+
golang.org/x/sync v0.16.0 // indirect
150+
golang.org/x/sys v0.34.0 // indirect
151+
golang.org/x/text v0.27.0 // indirect
152152
google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 // indirect
153153
google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8 // indirect
154154
google.golang.org/grpc v1.67.3 // indirect

tools/evm/evmemulator/go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78
179179
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
180180
github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
181181
github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
182+
github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
182183
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
183184
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
184185
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
@@ -362,6 +363,7 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky
362363
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
363364
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
364365
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
366+
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
365367
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
366368
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
367369
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
@@ -497,6 +499,7 @@ github.com/rhnvrm/simples3 v0.6.1/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8d
497499
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
498500
github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
499501
github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
502+
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
500503
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
501504
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
502505
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
@@ -612,6 +615,7 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y
612615
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
613616
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
614617
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
618+
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
615619
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
616620
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
617621
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
@@ -654,6 +658,7 @@ golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
654658
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
655659
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
656660
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
661+
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
657662
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
658663
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
659664
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -670,6 +675,7 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
670675
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
671676
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
672677
golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
678+
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
673679
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
674680
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
675681
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -724,6 +730,7 @@ golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
724730
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
725731
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
726732
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
733+
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
727734
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
728735
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
729736
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -746,6 +753,7 @@ golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
746753
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
747754
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
748755
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
756+
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
749757
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
750758
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
751759
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=

0 commit comments

Comments
 (0)