commit - 979e0264a3f22ffa56a51a5c16fc664adad3882a
commit + 4c6af851c2b236144371f69a88eaa5d73e9a72c5
blob - 043ed09c3f4329383155971788ee18802aa2399a (mode 644)
blob + /dev/null
--- internal/minutes/go.mod
+++ /dev/null
-module rsc.io/github/internal/minutes
-
-go 1.22
blob - 318c666e3710de6f422cfa4bc7286cd9524b8c06 (mode 644)
blob + /dev/null
--- internal/minutes/minutes.go
+++ /dev/null
-// Copyright 2022 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.
-
-// Minutes is the program we use to post the proposal review minutes.
-// It is a demonstration of the use of the rsc.io/github API, but it is also not great code,
-// which is why it is buried in an internal directory.
-package main
-
-import (
- "fmt"
- "io"
- "log"
- "os"
- "sort"
- "strconv"
- "strings"
- "time"
-
- "rsc.io/github"
-)
-
-func main() {
- r, err := NewReporter()
- if err != nil {
- log.Fatal(err)
- }
-
- data, err := io.ReadAll(os.Stdin)
- if err != nil {
- log.Fatal(err)
- }
- r.Print(r.Update(string(data)))
-}
-
-type Reporter struct {
- Client *github.Client
- Proposals *github.Project
- Items map[int]*github.ProjectItem
- Labels map[string]*github.Label
- Backlog *github.Milestone
-}
-
-func NewReporter() (*Reporter, error) {
- c, err := github.Dial("")
- if err != nil {
- return nil, err
- }
-
- r := &Reporter{Client: c}
-
- ps, err := r.Client.Projects("golang", "")
- if err != nil {
- return nil, err
- }
- for _, p := range ps {
- if p.Title == "Proposals" {
- r.Proposals = p
- break
- }
- }
- if r.Proposals == nil {
- return nil, fmt.Errorf("cannot find Proposals project")
- }
-
- labels, err := r.Client.SearchLabels("golang", "go", "")
- if err != nil {
- return nil, err
- }
- r.Labels = make(map[string]*github.Label)
- for _, label := range labels {
- r.Labels[label.Name] = label
- }
-
- milestones, err := r.Client.SearchMilestones("golang", "go", "Backlog")
- if err != nil {
- return nil, err
- }
- for _, m := range milestones {
- if m.Title == "Backlog" {
- r.Backlog = m
- break
- }
- }
- if r.Backlog == nil {
- return nil, fmt.Errorf("cannot find Backlog milestone")
- }
-
- items, err := r.Client.ProjectItems(r.Proposals)
- if err != nil {
- return nil, err
- }
- r.Items = make(map[int]*github.ProjectItem)
- for _, item := range items {
- if item.Issue == nil {
- log.Printf("warning: unexpected item with no issue")
- continue
- }
- r.Items[item.Issue.Number] = item
- }
-
- return r, nil
-}
-
-type Minutes struct {
- Who []string
- Events []*Event
-}
-
-type Event struct {
- Column string
- Issue string
- Title string
- Actions []string
-}
-
-func (r *Reporter) Update(text string) *Minutes {
- const prefix = "https://github.com/golang/go/issues/"
-
- m := new(Minutes)
- lines := strings.Split(text, "\n")
- for _, line := range lines {
- line = strings.TrimSpace(line)
- line = strings.ReplaceAll(line, "\t", " ")
- if line == "" {
- continue
- }
- if m.Who == nil {
- if strings.HasPrefix(line, prefix) {
- log.Printf("missing attendee list at start of input")
- break
- }
- who := strings.Fields(strings.ReplaceAll(line, ",", " "))
- for i, w := range who {
- who[i] = gitWho(w)
- }
- m.Who = who
- continue
- }
-
- if !strings.HasPrefix(line, prefix) {
- log.Printf("unexpected line: %s", line)
- continue
- }
-
- url, actionstr, _ := strings.Cut(line, " ")
- issuenum := strings.TrimPrefix(url, prefix)
- url = "https://go.dev/issue/" + issuenum
- actionstr = strings.TrimSpace(actionstr)
- if actionstr == "" {
- log.Printf("line missing actions: %s", line)
- continue
- }
-
- actions := strings.Split(actionstr, ";")
- col := "Active"
- reason := ""
- for i, a := range actions {
- a = strings.TrimSpace(a)
- actions[i] = a
- switch a {
- case "accept":
- a = "accepted"
- case "decline":
- a = "declined"
- case "retract":
- a = "retracted"
- }
-
- switch a {
- case "likely accept":
- col = "Likely Accept"
- case "likely decline":
- col = "Likely Decline"
- case "accepted":
- col = "Accepted"
- case "declined":
- col = "Declined"
- case "retracted":
- col = "Declined"
- reason = "retracted"
- case "unhold":
- col = "Active"
- reason = "unhold"
- }
- if strings.HasPrefix(a, "duplicate") {
- col = "Declined"
- reason = "duplicate"
- }
- if strings.HasPrefix(a, "infeasible") {
- col = "Declined"
- reason = "infeasible"
- }
- if strings.HasPrefix(a, "closed") {
- col = "Declined"
- }
- if strings.HasPrefix(a, "hold") || a == "on hold" {
- col = "Hold"
- }
- if r := actionMap[a]; r != "" {
- actions[i] = r
- }
- if strings.HasPrefix(a, "removed") {
- col = "none"
- reason = "removed"
- }
- }
-
- id, err := strconv.Atoi(issuenum)
- if err != nil {
- log.Fatal(err)
- }
- item := r.Items[id]
- if item == nil {
- log.Printf("missing from proposal project: #%d", id)
- continue
- }
- issue := item.Issue
- status := item.FieldByName("Status")
- if status == nil {
- log.Printf("item missing status: #%d", id)
- continue
- }
-
- title := strings.TrimSpace(strings.TrimPrefix(issue.Title, "proposal:"))
- if status.Option.Name != col {
- msg := updateMsg(status.Option.Name, col, reason)
- if msg == "" {
- log.Fatalf("no update message for %s", col)
- }
- f := r.Proposals.FieldByName("Status")
- if col == "none" {
- if err := r.Client.DeleteProjectItem(r.Proposals, item); err != nil {
- log.Printf("%s: deleting proposal item: %v", url, err)
- continue
- }
- } else {
- o := f.OptionByName(col)
- if o == nil {
- log.Printf("%s: moving from %s to %s: no such status\n", url, status.Option.Name, col)
- continue
- }
- if err := r.Client.SetProjectItemFieldOption(r.Proposals, item, f, o); err != nil {
- log.Printf("%s: moving from %s to %s: %v\n", url, status.Option.Name, col, err)
- }
- }
- if err := r.Client.AddIssueComment(issue, msg); err != nil {
- log.Printf("%s: posting comment: %v", url, err)
- }
- }
-
- needLabel := func(name string) {
- if issue.LabelByName(name) == nil {
- lab := r.Labels[name]
- if lab == nil {
- log.Fatalf("%s: cannot find label %s", url, name)
- }
- if err := r.Client.AddIssueLabels(issue, lab); err != nil {
- log.Printf("%s: adding %s: %v", url, name, err)
- }
- }
- }
-
- dropLabel := func(name string) {
- if lab := issue.LabelByName(name); lab != nil {
- if err := r.Client.RemoveIssueLabels(issue, lab); err != nil {
- log.Printf("%s: removing %s: %v", url, name, err)
- }
- }
- }
-
- forceClose := func() {
- if !issue.Closed {
- if err := r.Client.CloseIssue(issue); err != nil {
- log.Printf("%s: closing issue: %v", url, err)
- }
- }
- }
-
- switch col {
- case "Accepted":
- if strings.HasPrefix(issue.Title, "proposal:") {
- if err := r.Client.RetitleIssue(issue, title); err != nil {
- log.Printf("%s: retitling: %v", url, err)
- }
- }
- needLabel("Proposal-Accepted")
- if issue.Milestone == nil || issue.Milestone.Title == "Proposal" {
- if err := r.Client.RemilestoneIssue(issue, r.Backlog); err != nil {
- log.Printf("%s: moving out of Proposal milestone: %v", url, err)
- }
- }
- case "Declined":
- dropLabel("Proposal-FinalCommentPeriod")
- forceClose()
- case "Likely Accept", "Likely Decline":
- needLabel("Proposal-FinalCommentPeriod")
- case "Hold":
- needLabel("Proposal-Hold")
- }
- m.Events = append(m.Events, &Event{Column: col, Issue: issuenum, Title: title, Actions: actions})
- }
-
- sort.Slice(m.Events, func(i, j int) bool {
- return m.Events[i].Title < m.Events[j].Title
- })
- return m
-}
-
-func (r *Reporter) Print(m *Minutes) {
- fmt.Printf("**%s / ", time.Now().Format("2006-01-02"))
- for i, who := range m.Who {
- if i > 0 {
- fmt.Printf(", ")
- }
- fmt.Printf("%s", who)
- }
- fmt.Printf("**\n\n")
-
- columns := []string{
- "Accepted",
- "Declined",
- "Likely Accept",
- "Likely Decline",
- "Active",
- "Hold",
- "Other",
- }
-
- for _, col := range columns {
- n := 0
- for i, e := range m.Events {
- if e == nil || e.Column != col && col != "Other" {
- continue
- }
- if n == 0 {
- fmt.Printf("**%s**\n\n", col)
- }
- n++
- fmt.Printf("- **%s** [#%s](https://go.dev/issue/%s)\n", markdownEscape(strings.TrimSpace(e.Title)), e.Issue, e.Issue)
- for _, a := range e.Actions {
- fmt.Printf(" - %s\n", a)
- }
- m.Events[i] = nil
- }
- if n == 0 && col != "Hold" && col != "Other" {
- fmt.Printf("**%s**\n\n", col)
- fmt.Printf("- none\n")
- }
- fmt.Printf("\n")
- }
-}
-
-var markdownEscaper = strings.NewReplacer(
- "_", `\_`,
- "*", `\*`,
- "`", "\\`",
- "[", `\[`,
-)
-
-func markdownEscape(s string) string {
- return markdownEscaper.Replace(s)
-}
blob - 95140c32854523019807f2d7e73353faad58b497 (mode 644)
blob + /dev/null
--- internal/minutes/tables.go
+++ /dev/null
-// Copyright 2022 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"
-)
-
-var whoMap = map[string]string{
- "andybons": "andybons",
- "bradfitz": "bradfitz",
- "gri": "griesemer",
- "iant": "ianlancetaylor",
- "r": "robpike",
- "rsc": "rsc",
- "sfrancia": "spf13",
- "austin": "aclements",
- "julieqiu": "julieqiu",
-}
-
-func gitWho(who string) string {
- if whoMap[who] != "" {
- return "@" + whoMap[who]
- }
- fmt.Fprintf(os.Stderr, "warning: unknown attendee %s; assuming GitHub @%s\n", who, who)
- return "@" + who
-}
-
-var actionMap = map[string]string{
- "accepted": "no change in consensus; **accepted** π",
- "declined": "no change in consensus; **declined**",
- "retracted": "proposal retracted by author; **declined**",
- "hold": "put on hold",
- "on hold": "put on hold",
- "unhold": "taken off hold",
- "likely accept": "**likely accept**; last call for comments β³",
- "likely decline": "**likely decline**; last call for comments β³",
- "discuss": "discussion ongoing",
- "removed": "removed from proposal process",
- "comment": "commented",
- "infeasible": "declined as infeasible",
-}
-
-func updateMsg(old, new, reason string) string {
- if msg := updateMsgs[reason]; msg != "" {
- return msg
- }
- return updateMsgs[new]
-}
-
-var updateMsgs = map[string]string{
- "duplicate": `
-This proposal is a duplicate of a previously discussed proposal, as noted above,
-and there is no significant new information to justify reopening the discussion.
-The issue has therefore been **[declined as a duplicate](https://go.dev/s/proposal-status#declined-as-duplicate)**.
-β rsc for the proposal review group
-`,
- "retracted": `
-This proposal has been **[declined as retracted](https://go.dev/s/proposal-status#declined-as-retracted)**.
-β rsc for the proposal review group
-`,
- "infeasible": `
-This proposal has been **[declined as infeasible](https://go.dev/s/proposal-status#declined-as-infeasible)**.
-β rsc for the proposal review group
-`,
- "Active": `
-This proposal has been added to the [active column](https://go.dev/s/proposal-status#active) of the proposals project
-and will now be reviewed at the weekly proposal review meetings.
-β rsc for the proposal review group
-`,
- "Likely Accept": `
-Based on the discussion above, this proposal seems like a **[likely accept](https://go.dev/s/proposal-status#likely-accept)**.
-β rsc for the proposal review group
-`,
- "Likely Decline": `
-Based on the discussion above, this proposal seems like a **[likely decline](https://go.dev/s/proposal-status#likely-decline)**.
-β rsc for the proposal review group
-`,
- "Accepted": `
-No change in consensus, so **[accepted](https://go.dev/s/proposal-status#accepted)**. π
-This issue now tracks the work of implementing the proposal.
-β rsc for the proposal review group
-`,
- "Declined": `
-No change in consensus, so **[declined](https://go.dev/s/proposal-status#declined)**.
-β rsc for the proposal review group
-`,
- "Hold": `
-**[Placed on hold](https://go.dev/s/proposal-status#hold)**.
-β rsc for the proposal review group
-`,
- "removed": `
-**Removed from the [proposal process](https://go.dev/s/proposal)**.
-This was determined not to be a βsignificant change to the language, libraries, or toolsβ
-or otherwise of significant importance or interest to the broader Go community.
-β rsc for the proposal review group
-`,
-}
blob - a1a3722f53f8496f8ce32025c2ed31bde3befaa2 (mode 644)
blob + /dev/null
--- internal/minutes2/gdoc.go
+++ /dev/null
-// Copyright 2023 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 (
- "context"
- "encoding/json"
- "log"
- "net/http"
- "os"
- "strconv"
- "strings"
-
- "golang.org/x/oauth2"
- "golang.org/x/oauth2/google"
- "google.golang.org/api/docs/v1"
- "google.golang.org/api/option"
-)
-
-func getClient() *http.Client {
- data, err := os.ReadFile("/Users/rsc/.cred/proposal-minutes-gdoc.json")
- if err != nil {
- log.Fatal(err)
- }
- cfg, err := google.JWTConfigFromJSON(data, "https://www.googleapis.com/auth/documents")
- if err != nil {
- log.Fatal(err)
- }
- return cfg.Client(oauth2.NoContext)
-}
-
-type Doc struct {
- Text []string // top-level text
- Who []string
- Issues []*Issue
-}
-
-type Issue struct {
- Number int
- Title string
- Details string
- Minutes string
- Comment string
- Notes string
-}
-
-func parseDoc() *Doc {
- var doc *docs.Document
- if true {
- client := getClient()
-
- srv, err := docs.NewService(context.Background(), option.WithHTTPClient(client))
- if err != nil {
- log.Fatalf("Unable to retrieve Docs client: %v", err)
- }
-
- docId := "1Ri8QwTL6Scwm1Ke1cd1gIZIYwBffViuOCIRJDYARZU8"
-
- /*
- resp, err := srv.Documents.BatchUpdate(docId, &docs.BatchUpdateDocumentRequest{
- Requests: []*docs.Request{
- {
- InsertText: &docs.InsertTextRequest{
- Location: &docs.Location{
- Index: 1,
- },
- Text: "A",
- },
- },
- {
- InsertText: &docs.InsertTextRequest{
- Location: &docs.Location{
- Index: 2,
- },
- Text: "B",
- },
- },
- },
- }).Do()
- if err != nil {
- log.Fatal(err)
- }
- js, err := json.Marshal(resp)
- js = append(js, '\n')
- os.Stdout.Write(js)
- return nil
- */
-
- doc, err = srv.Documents.Get(docId).Do()
- if err != nil {
- log.Fatalf("Unable to retrieve data from document: %v", err)
- }
- } else {
- doc = new(docs.Document)
- data, err := os.ReadFile("x.json")
- if err != nil {
- log.Fatal(err)
- }
- if err := json.Unmarshal(data, doc); err != nil {
- log.Fatal(err)
- }
- }
-
- d := new(Doc)
- top := ""
- for _, elem := range doc.Body.Content {
- if para := elem.Paragraph; para != nil {
- content := ""
- for _, elem := range para.Elements {
- if run := elem.TextRun; run != nil {
- content += run.Content
- }
- }
- top += strings.Trim(strings.ReplaceAll(content, "\v", "\n"), "\n") + "\n"
- }
- if table := elem.Table; table != nil {
- rest, line := cutLastLine(top)
- if strings.HasPrefix(line, "#NNNNN") {
- continue
- }
- if !strings.HasPrefix(line, "#") {
- log.Fatalf("bad issue: %s", line)
- }
- num, title, ok := strings.Cut(line, " ")
- if !ok {
- log.Fatalf("bad issue2: %s", line)
- }
- n, err := strconv.Atoi(strings.TrimPrefix(num, "#"))
- if err != nil {
- log.Fatalf("bad issue3: %s", line)
- }
- issue := &Issue{
- Number: n,
- Title: title,
- }
- d.Issues = append(d.Issues, issue)
- top = rest
- for _, row := range table.TableRows {
- for _, cell := range row.TableCells {
- content := ""
- for _, elem := range cell.Content {
- if para := elem.Paragraph; para != nil {
- for _, elem := range para.Elements {
- if run := elem.TextRun; run != nil {
- content += run.Content
- }
- }
- }
- }
- content = strings.ReplaceAll(content, "\v", "\n")
- if strings.HasPrefix(content, "Minutes:") {
- issue.Minutes = strings.TrimSpace(strings.TrimPrefix(content, "Minutes:"))
- continue
- }
- first, rest, _ := strings.Cut(content, "\n")
- if !strings.HasSuffix(first, ":") {
- log.Fatalf("missing colon: %s", content)
- }
- rest = strings.Trim(rest, "\n")
- if rest != "" {
- rest += "\n"
- }
- if rest == "None\n" || rest == "TBD\n" {
- rest = ""
- }
- switch {
- case strings.HasPrefix(first, "Proposal details"):
- issue.Details = rest
- case strings.HasPrefix(first, "Comment"):
- issue.Comment = rest
- case strings.HasPrefix(first, "Private notes"), strings.HasPrefix(first, "Discussion notes"):
- issue.Notes = rest
- default:
- log.Fatalf("unknown cell: %s", content)
- }
- }
- }
- }
- }
- for _, line := range strings.Split(top, "\n") {
- line = strings.TrimSpace(line)
- if line == "" {
- continue
- }
- if strings.HasPrefix(line, "Attendees:") {
- d.Who = strings.Fields(strings.TrimPrefix(line, "Attendees:"))
- for i, a := range d.Who {
- d.Who[i] = strings.Trim(a, ",")
- }
- }
- d.Text = append(d.Text, line)
- }
-
- return d
- /*
- content := doc.Body.Content
-
-
- js, err := json.MarshalIndent(doc, "", "\t")
- if err != nil {
- log.Fatal(err)
- }
- os.Stdout.Write(append(js, '\n'))
- */
-}
-
-func cutLastLine(s string) (rest, line string) {
- s = strings.TrimRight(s, "\n")
- i := strings.LastIndex(s, "\n")
- return s[:i+1], s[i+1:]
-}
-
-/*
-func main() {
- doc := parseDoc()
- js, err := json.MarshalIndent(doc, "", "\t")
- if err != nil {
- log.Fatal(err)
- }
- os.Stdout.Write(append(js, '\n'))
-}
-*/
blob - a905e78a4ea5cbaba92df8a1fbd62b0970b63661 (mode 644)
blob + /dev/null
--- internal/minutes2/go.mod
+++ /dev/null
-module rsc.io/github/internal/minutes2
-
-go 1.23
-
-require (
- golang.org/x/oauth2 v0.21.0
- google.golang.org/api v0.185.0
- rsc.io/github v0.4.0
-)
-
-require (
- cloud.google.com/go/auth v0.5.1 // indirect
- cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect
- cloud.google.com/go/compute/metadata v0.3.0 // indirect
- github.com/felixge/httpsnoop v1.0.4 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
- github.com/go-logr/stdr v1.2.2 // indirect
- github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
- github.com/golang/protobuf v1.5.4 // indirect
- github.com/google/s2a-go v0.1.7 // indirect
- github.com/google/uuid v1.6.0 // indirect
- github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
- github.com/googleapis/gax-go/v2 v2.12.5 // indirect
- go.opencensus.io v0.24.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect
- go.opentelemetry.io/otel v1.27.0 // indirect
- go.opentelemetry.io/otel/metric v1.27.0 // indirect
- go.opentelemetry.io/otel/trace v1.27.0 // indirect
- golang.org/x/crypto v0.24.0 // indirect
- golang.org/x/net v0.26.0 // indirect
- golang.org/x/sys v0.21.0 // indirect
- golang.org/x/text v0.16.0 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20240617180043-68d350f18fd4 // indirect
- google.golang.org/grpc v1.64.0 // indirect
- google.golang.org/protobuf v1.34.2 // indirect
-)
blob - 61425e625ee490b217667397ef18244f44743dcc (mode 644)
blob + /dev/null
--- internal/minutes2/go.sum
+++ /dev/null
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go/auth v0.5.1 h1:0QNO7VThG54LUzKiQxv8C6x1YX7lUrzlAa1nVLF8CIw=
-cloud.google.com/go/auth v0.5.1/go.mod h1:vbZT8GjzDf3AVqCcQmqeeM32U9HBFc32vVVAbwDsa6s=
-cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4=
-cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q=
-cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc=
-cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-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/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
-github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
-github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
-github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
-github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
-github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
-github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
-github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
-github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=
-github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
-github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA=
-github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E=
-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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
-github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
-github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
-github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
-github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
-go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
-go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0=
-go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg=
-go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ=
-go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik=
-go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak=
-go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw=
-go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI=
-golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
-golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
-golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
-golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
-golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
-golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/api v0.185.0 h1:ENEKk1k4jW8SmmaT6RE+ZasxmxezCrD5Vw4npvr+pAU=
-google.golang.org/api v0.185.0/go.mod h1:HNfvIkJGlgrIlrbYkAm9W9IdkmKZjOTVh33YltygGbg=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20240617180043-68d350f18fd4 h1:CUiCqkPw1nNrNQzCCG4WA65m0nAmQiwXHpub3dNyruU=
-google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3 h1:QW9+G6Fir4VcRXVH8x3LilNAb6cxBGLa6+GM4hRwexE=
-google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3/go.mod h1:kdrSS/OiLkPrNUpzD4aHgCq2rVuC/YRxok32HXZ4vRE=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240617180043-68d350f18fd4 h1:Di6ANFilr+S60a4S61ZM00vLdw0IrQOSMS2/6mrnOU0=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240617180043-68d350f18fd4/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY=
-google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
-google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
-google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
-gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-rsc.io/github v0.4.0 h1:vVC+/jLa5MGo4DemcM5iME66Xg7RRqMnDe3ToHlmqV0=
-rsc.io/github v0.4.0/go.mod h1:0OrXF7wdKg4IvgqAXIaeSWBj+1Ef07bTa1ZnkKntrn4=
blob - d5378261ab7a8a1d4f457305e563776c8adfee59 (mode 644)
blob + /dev/null
--- internal/minutes2/go.work
+++ /dev/null
-go 1.23
-
-use (
- .
- ../..
-)
blob - e250e61fa020cb30a9ad75e6330ce84a6c6c3695 (mode 644)
blob + /dev/null
--- internal/minutes2/go.work.sum
+++ /dev/null
-cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw=
-cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME=
-cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk=
-cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68=
-cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo=
-cloud.google.com/go/aiplatform v1.50.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4=
-cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo=
-cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA=
-cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs=
-cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw=
-cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8=
-cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY=
-cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg=
-cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E=
-cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ=
-cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0=
-cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE=
-cloud.google.com/go/baremetalsolution v1.2.0/go.mod h1:68wi9AwPYkEWIUT4SvSGS9UJwKzNpshjHsH4lzk8iOw=
-cloud.google.com/go/batch v1.4.1/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk=
-cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4=
-cloud.google.com/go/bigquery v1.55.0/go.mod h1:9Y5I3PN9kQWuid6183JFhOGOW3GcirA5LpsKCUn+2ec=
-cloud.google.com/go/billing v1.17.0/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64=
-cloud.google.com/go/binaryauthorization v1.7.0/go.mod h1:Zn+S6QqTMn6odcMU1zDZCJxPjU2tZPV1oDl45lWY154=
-cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI=
-cloud.google.com/go/channel v1.17.0/go.mod h1:RpbhJsGi/lXWAUM1eF4IbQGbsfVlg2o8Iiy2/YLfVT0=
-cloud.google.com/go/cloudbuild v1.14.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU=
-cloud.google.com/go/clouddms v1.7.0/go.mod h1:MW1dC6SOtI/tPNCciTsXtsGNEM0i0OccykPvv3hiYeM=
-cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM=
-cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU=
-cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI=
-cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM=
-cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM=
-cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY=
-cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM=
-cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
-cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
-cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM=
-cloud.google.com/go/container v1.26.0/go.mod h1:YJCmRet6+6jnYYRS000T6k0D0xUXQgBSaJ7VwI8FBj4=
-cloud.google.com/go/containeranalysis v0.11.0/go.mod h1:4n2e99ZwpGxpNcz+YsFT1dfOHPQFGcAC8FN2M2/ne/U=
-cloud.google.com/go/datacatalog v1.17.1/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE=
-cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw=
-cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M=
-cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI=
-cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY=
-cloud.google.com/go/dataplex v1.9.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE=
-cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4=
-cloud.google.com/go/dataproc/v2 v2.2.0/go.mod h1:lZR7AQtwZPvmINx5J87DSOOpTfof9LVZju6/Qo4lmcY=
-cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8=
-cloud.google.com/go/datastore v1.14.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8=
-cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q=
-cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g=
-cloud.google.com/go/dialogflow v1.43.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M=
-cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI=
-cloud.google.com/go/documentai v1.22.1/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc=
-cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE=
-cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk=
-cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU=
-cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4=
-cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI=
-cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4=
-cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8=
-cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE=
-cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0=
-cloud.google.com/go/gkebackup v1.3.1/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU=
-cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw=
-cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY=
-cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw=
-cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8=
-cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY=
-cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0=
-cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU=
-cloud.google.com/go/iap v1.9.0/go.mod h1:01OFxd1R+NFrg78S+hoPV5PxEzv22HXaNqUUlmNHFuY=
-cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw=
-cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk=
-cloud.google.com/go/kms v1.15.2/go.mod h1:3hopT4+7ooWRCjc2DxgnpESFxhIraaI2IpAVUEhbT/w=
-cloud.google.com/go/language v1.11.0/go.mod h1:uDx+pFDdAKTY8ehpWbiXyQdz8tDSYLJbQcXsCkjYyvQ=
-cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc=
-cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI=
-cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc=
-cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc=
-cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak=
-cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s=
-cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig=
-cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA=
-cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA=
-cloud.google.com/go/monitoring v1.16.0/go.mod h1:Ptp15HgAyM1fNICAojDMoNc/wUmn67mLHQfyqbw+poY=
-cloud.google.com/go/networkconnectivity v1.13.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk=
-cloud.google.com/go/networkmanagement v1.9.0/go.mod h1:UTUaEU9YwbCAhhz3jEOHr+2/K/MrBk2XxOLS89LQzFw=
-cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ=
-cloud.google.com/go/notebooks v1.10.0/go.mod h1:SOPYMZnttHxqot0SGSFSkRrwE29eqnKPBJFqgWmiK2k=
-cloud.google.com/go/optimization v1.5.0/go.mod h1:evo1OvTxeBRBu6ydPlrIRizKY/LJKo/drDMMRKqGEUU=
-cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8=
-cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE=
-cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE=
-cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs=
-cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I=
-cloud.google.com/go/policytroubleshooter v1.9.0/go.mod h1:+E2Lga7TycpeSTj2FsH4oXxTnrbHJGRlKhVZBLGgU64=
-cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA=
-cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc=
-cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0=
-cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU=
-cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE=
-cloud.google.com/go/recommender v1.11.0/go.mod h1:kPiRQhPyTJ9kyXPCG6u/dlPLbYfFlkwHNRwdzPVAoII=
-cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg=
-cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8=
-cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw=
-cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE=
-cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo=
-cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo=
-cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw=
-cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA=
-cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ=
-cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk=
-cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ=
-cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4=
-cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA=
-cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g=
-cloud.google.com/go/spanner v1.49.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM=
-cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo=
-cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4=
-cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E=
-cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA=
-cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24=
-cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk=
-cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E=
-cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk=
-cloud.google.com/go/translate v1.9.0/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs=
-cloud.google.com/go/video v1.20.0/go.mod h1:U3G3FTnsvAGqglq9LxgqzOiBc/Nt8zis8S+850N2DUM=
-cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo=
-cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU=
-cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro=
-cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0=
-cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs=
-cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc=
-cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg=
-cloud.google.com/go/workflows v1.12.0/go.mod h1:PYhSk2b6DhZ508tj8HXKaBh+OFe+xdl0dHF/tJdzPQM=
-github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
-github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
-github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg=
-github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU=
-github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
-github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
-github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
-github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
-github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g=
-github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE=
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
-github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ=
-github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
-github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
-github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY=
-github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
-github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM=
-github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A=
-github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
-github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
-github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
-github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI=
-github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w=
-github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
-github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
-github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
-github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk=
-github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY=
-github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
-github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
-github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
-github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
-github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
-github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
-go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
-go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
-golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
-golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
-golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
-golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
-golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
-golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
-golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
-golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
-golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
-golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE=
-golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
-golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
-golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM=
-golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
-google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E=
-google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw=
-google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750=
-google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
-google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64=
-google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0=
-google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU=
-google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk=
-google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
-google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ=
-google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U=
-google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0=
-google.golang.org/genproto/googleapis/bytestream v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:+34luvCflYKiKylNwGJfn9cFBbcL/WrkciMmDmsTQ/A=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA=
-google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
-google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
-google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8=
-google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
-google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo=
-google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
-google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
blob - f2d13d8ff855b9a686fcfb862ac05609f5aef02e (mode 644)
blob + /dev/null
--- internal/minutes2/minutes.go
+++ /dev/null
-// Copyright 2022 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.
-
-// Minutes is the program we use to post the proposal review minutes.
-// It is a demonstration of the use of the rsc.io/github API, but it is also not great code,
-// which is why it is buried in an internal directory.
-package main
-
-import (
- "encoding/json"
- "flag"
- "fmt"
- "log"
- "os"
- "sort"
- "strings"
- "time"
-
- "rsc.io/github"
-)
-
-var docjson = flag.Bool("docjson", false, "print google doc info in json")
-
-func main() {
- flag.Parse()
-
- doc := parseDoc()
- if *docjson {
- js, err := json.MarshalIndent(doc, "", "\t")
- if err != nil {
- log.Fatal(err)
- }
- os.Stdout.Write(append(js, '\n'))
- return
- }
-
- r, err := NewReporter()
- if err != nil {
- log.Fatal(err)
- }
- r.RetireOld()
-
- r.Print(r.Update(doc))
-}
-
-type Reporter struct {
- Client *github.Client
- Proposals *github.Project
- Items map[int]*github.ProjectItem
- Labels map[string]*github.Label
- Backlog *github.Milestone
-}
-
-func NewReporter() (*Reporter, error) {
- c, err := github.Dial("")
- if err != nil {
- return nil, err
- }
-
- r := &Reporter{Client: c}
-
- ps, err := r.Client.Projects("golang", "")
- if err != nil {
- return nil, err
- }
- for _, p := range ps {
- if p.Title == "Proposals" {
- r.Proposals = p
- break
- }
- }
- if r.Proposals == nil {
- return nil, fmt.Errorf("cannot find Proposals project")
- }
-
- labels, err := r.Client.SearchLabels("golang", "go", "")
- if err != nil {
- return nil, err
- }
- r.Labels = make(map[string]*github.Label)
- for _, label := range labels {
- r.Labels[label.Name] = label
- }
-
- milestones, err := r.Client.SearchMilestones("golang", "go", "Backlog")
- if err != nil {
- return nil, err
- }
- for _, m := range milestones {
- if m.Title == "Backlog" {
- r.Backlog = m
- break
- }
- }
- if r.Backlog == nil {
- return nil, fmt.Errorf("cannot find Backlog milestone")
- }
-
- items, err := r.Client.ProjectItems(r.Proposals)
- if err != nil {
- return nil, err
- }
- r.Items = make(map[int]*github.ProjectItem)
- for _, item := range items {
- if item.Issue == nil {
- log.Printf("warning: unexpected item with no issue")
- continue
- }
- r.Items[item.Issue.Number] = item
- }
-
- return r, nil
-}
-
-type Minutes struct {
- Who []string
- Events []*Event
-}
-
-type Event struct {
- Column string
- Issue string
- Title string
- Actions []string
-}
-
-const checkQuestion = "Have all remaining concerns about this proposal been addressed?"
-
-func (r *Reporter) Update(doc *Doc) *Minutes {
- const prefix = "https://github.com/golang/go/issues/"
-
- m := new(Minutes)
-
- // Attendees
- if len(doc.Who) == 0 {
- log.Fatalf("missing attendees")
- }
- m.Who = make([]string, len(doc.Who))
- for i, w := range doc.Who {
- m.Who[i] = gitWho(w)
- }
- sort.Strings(m.Who)
-
- seen := make(map[int]bool)
-Issues:
- for _, di := range doc.Issues {
- item := r.Items[di.Number]
- if item == nil {
- log.Printf("missing from proposal project: #%d", di.Number)
- continue
- }
- seen[di.Number] = true
- issue := item.Issue
- status := item.FieldByName("Status")
- if status == nil {
- log.Printf("item missing status: #%d", di.Number)
- continue
- }
-
- title := strings.TrimSpace(strings.TrimPrefix(issue.Title, "proposal:"))
- if title != di.Title {
- log.Printf("#%d title mismatch:\nGH: %s\nDoc: %s", di.Number, issue.Title, di.Title)
- }
-
- url := "https://go.dev/issue/" + fmt.Sprint(di.Number)
- actions := strings.Split(di.Minutes, ";")
- col := "Active"
- reason := ""
- check := false
- for i, a := range actions {
- a = strings.TrimSpace(a)
- actions[i] = a
- switch a {
- case "TODO":
- log.Printf("%s: minutes TODO", url)
- continue Issues
- case "accept":
- a = "accepted"
- case "decline":
- a = "declined"
- case "retract":
- a = "retracted"
- case "declined as infeasible":
- a = "infeasible"
- case "check":
- check = true
- a = "comment"
- }
-
- switch a {
- case "likely accept":
- col = "Likely Accept"
- case "likely decline":
- col = "Likely Decline"
- case "accepted":
- col = "Accepted"
- case "declined":
- col = "Declined"
- case "retracted":
- col = "Declined"
- reason = "retracted"
- case "unhold":
- col = "Active"
- reason = "unhold"
- }
- if strings.HasPrefix(a, "declined") {
- col = "Declined"
- }
- if strings.HasPrefix(a, "duplicate") {
- col = "Declined"
- reason = "duplicate"
- }
- if strings.Contains(a, "infeasible") {
- col = "Declined"
- reason = "infeasible"
- }
- if a == "obsolete" || strings.Contains(a, "obsoleted") {
- col = "Declined"
- reason = "obsolete"
- }
- if strings.HasPrefix(a, "closed") {
- col = "Declined"
- }
- if strings.HasPrefix(a, "hold") || a == "on hold" {
- col = "Hold"
- }
- if r := actionMap[a]; r != "" {
- actions[i] = r
- }
- if strings.HasPrefix(a, "removed") {
- col = "none"
- reason = "removed"
- }
- }
-
- if check {
- comments, err := r.Client.IssueComments(issue)
- if err != nil {
- log.Printf("%s: cannot read issue comments\n", url)
- continue
- }
- for i := len(comments) - 1; i >= 0; i-- {
- c := comments[i]
- if time.Since(c.CreatedAt) < 5*24*time.Hour && strings.Contains(c.Body, checkQuestion) {
- log.Printf("%s: recently checked", url)
- continue Issues
- }
- }
-
- if di.Details == "" {
- log.Printf("%s: missing proposal details", url)
- continue Issues
- }
- msg := fmt.Sprintf("%s\n\n%s", checkQuestion, di.Details)
- // log.Fatalf("wouldpost %s\n%s", url, msg)
- if err := r.Client.AddIssueComment(issue, msg); err != nil {
- log.Printf("%s: posting comment: %v", url, err)
- }
- log.Printf("posted %s", url)
- }
-
- if status.Option.Name != col {
- msg := updateMsg(status.Option.Name, col, reason)
- if msg == "" {
- log.Fatalf("no update message for %s", col)
- }
- if col == "Likely Accept" || col == "Accepted" {
- if di.Details == "" {
- log.Printf("%s: missing proposal details", url)
- continue Issues
- }
- msg += "\n\n" + di.Details
- }
- f := r.Proposals.FieldByName("Status")
- if col == "none" {
- if err := r.Client.DeleteProjectItem(r.Proposals, item); err != nil {
- log.Printf("%s: deleting proposal item: %v", url, err)
- continue
- }
- } else {
- o := f.OptionByName(col)
- if o == nil {
- log.Printf("%s: moving from %s to %s: no such status\n", url, status.Option.Name, col)
- continue
- }
- if err := r.Client.SetProjectItemFieldOption(r.Proposals, item, f, o); err != nil {
- log.Printf("%s: moving from %s to %s: %v\n", url, status.Option.Name, col, err)
- }
- }
- if err := r.Client.AddIssueComment(issue, msg); err != nil {
- log.Printf("%s: posting comment: %v", url, err)
- }
- }
-
- needLabel := func(name string) {
- if issue.LabelByName(name) == nil {
- lab := r.Labels[name]
- if lab == nil {
- log.Fatalf("%s: cannot find label %s", url, name)
- }
- if err := r.Client.AddIssueLabels(issue, lab); err != nil {
- log.Printf("%s: adding %s: %v", url, name, err)
- }
- }
- }
-
- dropLabel := func(name string) {
- if lab := issue.LabelByName(name); lab != nil {
- if err := r.Client.RemoveIssueLabels(issue, lab); err != nil {
- log.Printf("%s: removing %s: %v", url, name, err)
- }
- }
- }
-
- setLabel := func(name string, val bool) {
- if val {
- needLabel(name)
- } else {
- dropLabel(name)
- }
- }
-
- forceClose := func() {
- if !issue.Closed {
- if err := r.Client.CloseIssue(issue); err != nil {
- log.Printf("%s: closing issue: %v", url, err)
- }
- }
- }
-
- if col == "Accepted" {
- if strings.HasPrefix(issue.Title, "proposal:") {
- if err := r.Client.RetitleIssue(issue, title); err != nil {
- log.Printf("%s: retitling: %v", url, err)
- }
- }
- if issue.Milestone == nil || issue.Milestone.Title == "Proposal" {
- if err := r.Client.RemilestoneIssue(issue, r.Backlog); err != nil {
- log.Printf("%s: moving out of Proposal milestone: %v", url, err)
- }
- }
- }
- if col == "Declined" {
- forceClose()
- }
-
- setLabel("Proposal-Accepted", col == "Accepted")
- setLabel("Proposal-FinalCommentPeriod", col == "Likely Accept" || col == "Likely Decline")
- setLabel("Proposal-Hold", col == "Hold")
-
- m.Events = append(m.Events, &Event{Column: col, Issue: fmt.Sprint(di.Number), Title: title, Actions: actions})
- }
-
- for id, item := range r.Items {
- status := item.FieldByName("Status")
- if status != nil {
- switch status.Option.Name {
- case "Active", "Likely Accept", "Likely Decline":
- if !seen[id] {
- log.Printf("#%d: missing from doc", id)
- }
- }
- }
- }
-
- sort.Slice(m.Events, func(i, j int) bool {
- return m.Events[i].Title < m.Events[j].Title
- })
- return m
-}
-
-func (r *Reporter) Print(m *Minutes) {
- fmt.Printf("**%s / ", time.Now().Format("2006-01-02"))
- for i, who := range m.Who {
- if i > 0 {
- fmt.Printf(", ")
- }
- fmt.Printf("%s", who)
- }
- fmt.Printf("**\n\n")
-
- disc, err := r.Client.Discussions("golang", "go")
- if err != nil {
- log.Fatal(err)
- }
- first := true
- for _, d := range disc {
- if d.Locked {
- continue
- }
- if first {
- fmt.Printf("**Discussions (not yet proposals)**\n\n")
- first = false
- }
- fmt.Printf("- **%s** [#%d](https://go.dev/issue/%d)\n", markdownEscape(strings.TrimSpace(d.Title)), d.Number, d.Number)
- }
- if !first {
- fmt.Printf("\n")
- }
-
- columns := []string{
- "Accepted",
- "Declined",
- "Likely Accept",
- "Likely Decline",
- "Active",
- "Hold",
- "Other",
- }
-
- for _, col := range columns {
- n := 0
- for i, e := range m.Events {
- if e == nil || e.Column != col && col != "Other" {
- continue
- }
- if n == 0 {
- fmt.Printf("**%s**\n\n", col)
- }
- n++
- fmt.Printf("- **%s** [#%s](https://go.dev/issue/%s)\n", markdownEscape(strings.TrimSpace(e.Title)), e.Issue, e.Issue)
- for _, a := range e.Actions {
- fmt.Printf(" - %s\n", a)
- }
- m.Events[i] = nil
- }
- if n == 0 && col != "Hold" && col != "Other" {
- fmt.Printf("**%s**\n\n", col)
- fmt.Printf("- none\n")
- }
- fmt.Printf("\n")
- }
-}
-
-var markdownEscaper = strings.NewReplacer(
- "_", `\_`,
- "*", `\*`,
- "`", "\\`",
- "[", `\[`,
-)
-
-func markdownEscape(s string) string {
- return markdownEscaper.Replace(s)
-}
-
-func (r *Reporter) RetireOld() {
- for _, item := range r.Items {
- issue := item.Issue
- if issue.Closed && !issue.ClosedAt.IsZero() && time.Since(issue.ClosedAt) > 365*24*time.Hour {
- log.Printf("retire #%d", issue.Number)
- if err := r.Client.DeleteProjectItem(r.Proposals, item); err != nil {
- log.Printf("#%d: deleting proposal item: %v", issue.Number, err)
- }
- }
- }
-}
blob - 088a0de1899b2db2c41f02c57f430f08bb47fe92 (mode 644)
blob + /dev/null
--- internal/minutes2/tables.go
+++ /dev/null
-// Copyright 2022 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"
-)
-
-var whoMap = map[string]string{
- "andybons": "andybons",
- "bradfitz": "bradfitz",
- "gri": "griesemer",
- "iant": "ianlancetaylor",
- "r": "robpike",
- "rsc": "rsc",
- "sfrancia": "spf13",
- "austin": "aclements",
- "julieqiu": "julieqiu",
- "adonovan": "adonovan",
- "bracewell": "rolandshoemaker",
- "roland": "rolandshoemaker",
- "cherryyz": "cherrymui",
- "cherry": "cherrymui",
-}
-
-func gitWho(who string) string {
- if whoMap[who] != "" {
- return "@" + whoMap[who]
- }
- fmt.Fprintf(os.Stderr, "warning: unknown attendee %s; assuming GitHub @%s\n", who, who)
- return "@" + who
-}
-
-var actionMap = map[string]string{
- "accepted": "no change in consensus; **accepted** π",
- "declined": "no change in consensus; **declined**",
- "retracted": "proposal retracted by author; **declined**",
- "hold": "put on hold",
- "on hold": "put on hold",
- "unhold": "taken off hold",
- "likely accept": "**likely accept**; last call for comments β³",
- "likely decline": "**likely decline**; last call for comments β³",
- "discuss": "discussion ongoing",
- "add": "added to minutes",
- "removed": "removed from proposal process",
- "comment": "commented",
- "infeasible": "declined as infeasible",
-}
-
-func updateMsg(old, new, reason string) string {
- if msg := updateMsgs[reason]; msg != "" {
- return msg
- }
- return updateMsgs[new]
-}
-
-var updateMsgs = map[string]string{
- "duplicate": `
-This proposal is a duplicate of a previously discussed proposal, as noted above,
-and there is no significant new information to justify reopening the discussion.
-The issue has therefore been **[declined as a duplicate](https://go.dev/s/proposal-status#declined-as-duplicate)**.
-β rsc for the proposal review group
-`,
- "retracted": `
-This proposal has been **[declined as retracted](https://go.dev/s/proposal-status#declined-as-retracted)**.
-β rsc for the proposal review group
-`,
- "infeasible": `
-This proposal has been **[declined as infeasible](https://go.dev/s/proposal-status#declined-as-infeasible)**.
-β rsc for the proposal review group
-`,
- "obsolete": `
-This proposal has been **[declined as obsolete](https://go.dev/s/proposal-status#declined-as-obsolete)**.
-β rsc for the proposal review group
-`,
- "Active": `
-This proposal has been added to the [active column](https://go.dev/s/proposal-status#active) of the proposals project
-and will now be reviewed at the weekly proposal review meetings.
-β rsc for the proposal review group
-`,
- "Likely Accept": `
-Based on the discussion above, this proposal seems like a **[likely accept](https://go.dev/s/proposal-status#likely-accept)**.
-β rsc for the proposal review group
-`,
- "Likely Decline": `
-Based on the discussion above, this proposal seems like a **[likely decline](https://go.dev/s/proposal-status#likely-decline)**.
-β rsc for the proposal review group
-`,
- "Accepted": `
-No change in consensus, so **[accepted](https://go.dev/s/proposal-status#accepted)**. π
-This issue now tracks the work of implementing the proposal.
-β rsc for the proposal review group
-`,
- "Declined": `
-No change in consensus, so **[declined](https://go.dev/s/proposal-status#declined)**.
-β rsc for the proposal review group
-`,
- "Hold": `
-**[Placed on hold](https://go.dev/s/proposal-status#hold)**.
-β rsc for the proposal review group
-`,
- "removed": `
-**Removed from the [proposal process](https://go.dev/s/proposal)**.
-This was determined not to be a βsignificant change to the language, libraries, or toolsβ
-or otherwise of significant importance or interest to the broader Go community.
-β rsc for the proposal review group
-`,
-}