diff --git a/.gitignore b/.gitignore
index 9564fbd42..739c63e91 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,7 +10,6 @@
.DS_Store
.coverprofile
.dropbox
-CLAUDE.md
/.idea
/build
/dist
diff --git a/README.md b/README.md
index d4726ecb7..f76091a60 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,14 @@
The watermint toolbox is the multi-purpose utility command-line tool for web services including Dropbox, Figma, GitHub, etc. The purpose of the tool is to provide users of cloud services and system administrators with a way to automate workflows and provide a work-around for some issues.
+# ⚠️ Maintenance Status
+
+**⚠️ Important Notice: This project is no longer actively maintained.**
+
+As of August 2025, this project has entered Keep The Lights On (KTLO) mode. While the current version will continue to function, no new features, bug fixes, or API updates will be implemented. Only minimal security updates may be applied as needed.
+
+For more details about this decision and recommendations for alternatives, please see: [Project Maintenance Status - Discussion #911](https://github.com/watermint/toolbox/discussions/911)
+
# Licensing & Disclaimers
watermint toolbox is licensed under the Apache License, Version 2.0.
@@ -45,8 +53,8 @@ In general, new security issues are discovered every day. To avoid leaving these
# Announcements
+* [#911 watermint toolbox will no longer be actively maintained](https://github.com/watermint/toolbox/discussions/911)
* [#906 AI Powered Q&A Bot on ChatGPT](https://github.com/watermint/toolbox/discussions/906)
-* [#905 Deprecation: Some of utilities command will be removed after release of 2025-08-01](https://github.com/watermint/toolbox/discussions/905)
# Security and privacy
@@ -91,6 +99,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Tools for Dropbox and Dropbox for Teams
Usage:
@@ -411,11 +421,6 @@ Available commands:
| [util text case up](docs/commands/util-text-case-up.md) | Print upper case text |
| [util text encoding from](docs/commands/util-text-encoding-from.md) | Convert text encoding to UTF-8 text file from specified encoding. |
| [util text encoding to](docs/commands/util-text-encoding-to.md) | Convert text encoding to specified encoding from UTF-8 text file. |
-| [util text nlp english entity](docs/commands/util-text-nlp-english-entity.md) | Split English text into entities |
-| [util text nlp english sentence](docs/commands/util-text-nlp-english-sentence.md) | Split English text into sentences |
-| [util text nlp english token](docs/commands/util-text-nlp-english-token.md) | Split English text into tokens |
-| [util text nlp japanese token](docs/commands/util-text-nlp-japanese-token.md) | Tokenize Japanese text |
-| [util text nlp japanese wakati](docs/commands/util-text-nlp-japanese-wakati.md) | Wakachigaki (tokenize Japanese text) |
| [util tidy move dispatch](docs/commands/util-tidy-move-dispatch.md) | Dispatch files |
| [util tidy move simple](docs/commands/util-tidy-move-simple.md) | Archive local files |
| [util time now](docs/commands/util-time-now.md) | Display current time |
diff --git a/README_ja.md b/README_ja.md
index 152bed3b5..064a41e14 100644
--- a/README_ja.md
+++ b/README_ja.md
@@ -9,6 +9,14 @@
watermint toolboxは、Dropbox、Figma、GitHubなどのウェブサービス用の多目的ユーティリティコマンドラインツールです。このツールの目的は、クラウドサービスのユーザーやシステム管理者に、ワークフローを自動化する方法を提供し、いくつかの問題に対する回避策を提供することです。
+# ⚠️ メンテナンス状況
+
+**⚠️ 重要なお知らせ:このプロジェクトは積極的にメンテナンスされていません。**
+
+2025年8月より、このプロジェクトはKTLO(Keep The Lights On)モードに移行しました。現在のバージョンは引き続き機能しますが、新機能、バグ修正、API更新は実装されません。必要に応じて最小限のセキュリティ更新のみが適用される場合があります。
+
+この決定の詳細と代替案の推奨については、[プロジェクトメンテナンス状況 - ディスカッション #911](https://github.com/watermint/toolbox/discussions/911) をご覧ください。
+
# ライセンスと免責条項
watermint toolboxはApache License, Version 2.0でライセンスされています。
@@ -58,8 +66,8 @@ brew install toolbox
# お知らせ
+* [#911 watermint toolbox will no longer be actively maintained](https://github.com/watermint/toolbox/discussions/911)
* [#906 AI Powered Q&A Bot on ChatGPT](https://github.com/watermint/toolbox/discussions/906)
-* [#905 Deprecation: Some of utilities command will be removed after release of 2025-08-01](https://github.com/watermint/toolbox/discussions/905)
# セキュリティとプライバシー
@@ -105,6 +113,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
Dropbox用ツールとDropbox for teams
使い方:
@@ -425,11 +435,6 @@ Dropbox用ツールとDropbox for teams
| [util text case up](docs/ja/commands/util-text-case-up.md) | 大文字のテキストを表示する |
| [util text encoding from](docs/ja/commands/util-text-encoding-from.md) | 指定されたエンコーディングからUTF-8テキストファイルに変換します. |
| [util text encoding to](docs/ja/commands/util-text-encoding-to.md) | UTF-8テキストファイルから指定されたエンコーディングに変換する. |
-| [util text nlp english entity](docs/ja/commands/util-text-nlp-english-entity.md) | 英文をエンティティに分割する |
-| [util text nlp english sentence](docs/ja/commands/util-text-nlp-english-sentence.md) | 英文を文章に分割する |
-| [util text nlp english token](docs/ja/commands/util-text-nlp-english-token.md) | 英文をトークンに分割する |
-| [util text nlp japanese token](docs/ja/commands/util-text-nlp-japanese-token.md) | 日本語テキストのトークン化 |
-| [util text nlp japanese wakati](docs/ja/commands/util-text-nlp-japanese-wakati.md) | 分かち書き(日本語テキストのトークン化) |
| [util tidy move dispatch](docs/ja/commands/util-tidy-move-dispatch.md) | ファイルを整理 |
| [util tidy move simple](docs/ja/commands/util-tidy-move-simple.md) | ローカルファイルをアーカイブします |
| [util time now](docs/ja/commands/util-time-now.md) | 現在の時刻を表示 |
diff --git a/catalogue/module_test.go b/catalogue/module_test.go
index f6454081f..db5db3877 100644
--- a/catalogue/module_test.go
+++ b/catalogue/module_test.go
@@ -1,7 +1,7 @@
package catalogue
import (
- "github.com/watermint/toolbox/essentials/go/es_module"
+ "github.com/watermint/toolbox/essentials/es_go/es_module"
"testing"
)
diff --git a/catalogue/recipe.go b/catalogue/recipe.go
index b762d31b1..95aec582d 100644
--- a/catalogue/recipe.go
+++ b/catalogue/recipe.go
@@ -51,8 +51,6 @@ import (
recipeutiltableformat "github.com/watermint/toolbox/recipe/util/table/format"
recipeutiltextcase "github.com/watermint/toolbox/recipe/util/text/case"
recipeutiltextencoding "github.com/watermint/toolbox/recipe/util/text/encoding"
- recipeutiltextnlpenglish "github.com/watermint/toolbox/recipe/util/text/nlp/english"
- recipeutiltextnlpjapanese "github.com/watermint/toolbox/recipe/util/text/nlp/japanese"
recipeutiltidymove "github.com/watermint/toolbox/recipe/util/tidy/move"
recipeutiltidypack "github.com/watermint/toolbox/recipe/util/tidy/pack"
recipeutiltime "github.com/watermint/toolbox/recipe/util/time"
@@ -172,11 +170,6 @@ func AutoDetectedRecipesClassic() []infra_recipe_rc_recipe.Recipe {
&recipeutiltextcase.Up{},
&recipeutiltextencoding.From{},
&recipeutiltextencoding.To{},
- &recipeutiltextnlpenglish.Entity{},
- &recipeutiltextnlpenglish.Sentence{},
- &recipeutiltextnlpenglish.Token{},
- &recipeutiltextnlpjapanese.Token{},
- &recipeutiltextnlpjapanese.Wakati{},
&recipeutiltidymove.Dispatch{},
&recipeutiltidymove.Simple{},
&recipeutiltidypack.Remote{},
diff --git a/citron/dropbox/team/admin/group/role/delete.go b/citron/dropbox/team/admin/group/role/delete.go
index c2b4bfdce..84222e390 100644
--- a/citron/dropbox/team/admin/group/role/delete.go
+++ b/citron/dropbox/team/admin/group/role/delete.go
@@ -10,7 +10,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/service/sv_group"
"github.com/watermint/toolbox/domain/dropbox/service/sv_group_member"
"github.com/watermint/toolbox/domain/dropbox/service/sv_member"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/recipe/rc_exec"
diff --git a/citron/dropbox/team/content/member/list.go b/citron/dropbox/team/content/member/list.go
index 7e5beb296..ecdb4b725 100644
--- a/citron/dropbox/team/content/member/list.go
+++ b/citron/dropbox/team/content/member/list.go
@@ -12,7 +12,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_member_folder"
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_team_content"
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_teamfolder_scanner"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/kvs/kv_kvs"
"github.com/watermint/toolbox/essentials/kvs/kv_storage"
"github.com/watermint/toolbox/essentials/log/esl"
diff --git a/citron/dropbox/team/content/member/size.go b/citron/dropbox/team/content/member/size.go
index 99c1ee966..a561fa6c6 100644
--- a/citron/dropbox/team/content/member/size.go
+++ b/citron/dropbox/team/content/member/size.go
@@ -11,7 +11,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_member_folder"
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_team_content"
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_teamfolder_scanner"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/kvs/kv_kvs"
"github.com/watermint/toolbox/essentials/kvs/kv_storage"
"github.com/watermint/toolbox/essentials/log/esl"
diff --git a/citron/dropbox/team/group/batch/add.go b/citron/dropbox/team/group/batch/add.go
index d64504882..5f8545e7c 100644
--- a/citron/dropbox/team/group/batch/add.go
+++ b/citron/dropbox/team/group/batch/add.go
@@ -6,7 +6,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/api/dbx_error"
"github.com/watermint/toolbox/domain/dropbox/model/mo_group"
"github.com/watermint/toolbox/domain/dropbox/service/sv_group"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/citron/dropbox/team/group/member/list.go b/citron/dropbox/team/group/member/list.go
index 95276db96..0e46a0bee 100644
--- a/citron/dropbox/team/group/member/list.go
+++ b/citron/dropbox/team/group/member/list.go
@@ -9,7 +9,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/model/mo_group_member"
"github.com/watermint/toolbox/domain/dropbox/service/sv_group"
"github.com/watermint/toolbox/domain/dropbox/service/sv_group_member"
- "github.com/watermint/toolbox/essentials/go/es_goroutine"
+ "github.com/watermint/toolbox/essentials/es_go/es_goroutine"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/citron/dropbox/team/insight/scan.go b/citron/dropbox/team/insight/scan.go
index a57343493..ebf03593e 100644
--- a/citron/dropbox/team/insight/scan.go
+++ b/citron/dropbox/team/insight/scan.go
@@ -4,7 +4,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/api/dbx_conn"
"github.com/watermint/toolbox/domain/dropbox/api/dbx_filesystem"
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_insight"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/model/mo_int"
"github.com/watermint/toolbox/essentials/model/mo_path"
"github.com/watermint/toolbox/essentials/model/mo_string"
diff --git a/citron/dropbox/team/insight/scanretry.go b/citron/dropbox/team/insight/scanretry.go
index 4df2e6470..5f19554ef 100644
--- a/citron/dropbox/team/insight/scanretry.go
+++ b/citron/dropbox/team/insight/scanretry.go
@@ -7,7 +7,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/api/dbx_conn"
"github.com/watermint/toolbox/domain/dropbox/api/dbx_filesystem"
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_insight"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/model/mo_path"
"github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/citron/dropbox/team/member/batch/delete.go b/citron/dropbox/team/member/batch/delete.go
index 863c53af6..7eb953533 100644
--- a/citron/dropbox/team/member/batch/delete.go
+++ b/citron/dropbox/team/member/batch/delete.go
@@ -5,7 +5,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/api/dbx_auth"
"github.com/watermint/toolbox/domain/dropbox/api/dbx_conn"
"github.com/watermint/toolbox/domain/dropbox/service/sv_member"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/citron/dropbox/team/member/batch/invite.go b/citron/dropbox/team/member/batch/invite.go
index 99bca9fe0..858a31e7b 100644
--- a/citron/dropbox/team/member/batch/invite.go
+++ b/citron/dropbox/team/member/batch/invite.go
@@ -6,7 +6,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/api/dbx_conn"
"github.com/watermint/toolbox/domain/dropbox/model/mo_member"
"github.com/watermint/toolbox/domain/dropbox/service/sv_member"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/feed/fd_file"
diff --git a/citron/dropbox/team/member/batch/suspend.go b/citron/dropbox/team/member/batch/suspend.go
index 00ab6bcb7..d1919f12e 100644
--- a/citron/dropbox/team/member/batch/suspend.go
+++ b/citron/dropbox/team/member/batch/suspend.go
@@ -4,7 +4,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/api/dbx_auth"
"github.com/watermint/toolbox/domain/dropbox/api/dbx_conn"
"github.com/watermint/toolbox/domain/dropbox/service/sv_member"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/citron/dropbox/team/member/batch/unsuspend.go b/citron/dropbox/team/member/batch/unsuspend.go
index ed289a63a..416f9c6d8 100644
--- a/citron/dropbox/team/member/batch/unsuspend.go
+++ b/citron/dropbox/team/member/batch/unsuspend.go
@@ -4,7 +4,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/api/dbx_auth"
"github.com/watermint/toolbox/domain/dropbox/api/dbx_conn"
"github.com/watermint/toolbox/domain/dropbox/service/sv_member"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/citron/dropbox/team/member/quota/list.go b/citron/dropbox/team/member/quota/list.go
index 15161c9e2..d40498702 100644
--- a/citron/dropbox/team/member/quota/list.go
+++ b/citron/dropbox/team/member/quota/list.go
@@ -8,7 +8,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/model/mo_member_quota"
"github.com/watermint/toolbox/domain/dropbox/service/sv_member"
"github.com/watermint/toolbox/domain/dropbox/service/sv_member_quota"
- "github.com/watermint/toolbox/essentials/go/es_goroutine"
+ "github.com/watermint/toolbox/essentials/es_go/es_goroutine"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/citron/dropbox/team/namespace/models_test.go b/citron/dropbox/team/namespace/models_test.go
index f7eb2fd21..1f4fad35e 100644
--- a/citron/dropbox/team/namespace/models_test.go
+++ b/citron/dropbox/team/namespace/models_test.go
@@ -16,7 +16,7 @@ func TestMemberNamespaceSummary_Fields(t *testing.T) {
ExternalFolders: 1,
AppFolders: 4,
}
-
+
if summary.Email != "test@example.com" {
t.Errorf("Expected email 'test@example.com', got %s", summary.Email)
}
@@ -48,7 +48,7 @@ func TestTeamNamespaceSummary_Fields(t *testing.T) {
NamespaceType: "shared_folder",
NamespaceCount: 42,
}
-
+
if summary.NamespaceType != "shared_folder" {
t.Errorf("Expected namespace type 'shared_folder', got %s", summary.NamespaceType)
}
@@ -62,7 +62,7 @@ func TestTeamFolderSummary_Fields(t *testing.T) {
Name: "Engineering Team Folder",
NumNamespacesInside: 15,
}
-
+
if summary.Name != "Engineering Team Folder" {
t.Errorf("Expected name 'Engineering Team Folder', got %s", summary.Name)
}
@@ -77,4 +77,4 @@ func TestFolderWithoutParent_Type(t *testing.T) {
SharedFolderId: "test_id",
Name: "Test Folder",
}
-}
\ No newline at end of file
+}
diff --git a/citron/dropbox/team/namespace/simple_test.go b/citron/dropbox/team/namespace/simple_test.go
index 67a4ca5c3..bcff2677f 100644
--- a/citron/dropbox/team/namespace/simple_test.go
+++ b/citron/dropbox/team/namespace/simple_test.go
@@ -2,7 +2,7 @@ package namespace
import (
"testing"
-
+
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
)
@@ -49,12 +49,12 @@ func TestSummary_TestMethod(t *testing.T) {
func TestSummary_SkipMemberSummaryFlag(t *testing.T) {
summary := &Summary{}
-
+
// Test default value
if summary.SkipMemberSummary {
t.Error("Expected SkipMemberSummary to be false by default")
}
-
+
// Test setting value
summary.SkipMemberSummary = true
if !summary.SkipMemberSummary {
@@ -66,13 +66,13 @@ func TestNamespaceTypes(t *testing.T) {
// Test various namespace type strings used in the code
namespaceTypes := []string{
"app_folder",
- "team_member_folder",
+ "team_member_folder",
"team_member_root",
"shared_folder",
"team_folder",
"team_folder (inside team folder)",
}
-
+
for _, nt := range namespaceTypes {
// Verify the strings are valid (non-empty)
if nt == "" {
@@ -87,7 +87,7 @@ func TestSummaryStructInitialization(t *testing.T) {
SkipMemberSummary: true,
// Other fields would be initialized by Preset()
}
-
+
if !summary.SkipMemberSummary {
t.Error("Expected SkipMemberSummary to be true")
}
@@ -96,9 +96,9 @@ func TestSummaryStructInitialization(t *testing.T) {
func TestListStructInitialization(t *testing.T) {
// Test that List struct can be initialized
list := &List{}
-
+
// Verify the struct is not nil
if list == nil {
t.Error("Expected List struct to be initialized")
}
-}
\ No newline at end of file
+}
diff --git a/citron/dropbox/team/runas/file/batch/copy.go b/citron/dropbox/team/runas/file/batch/copy.go
index 5b64318f7..0eeecca5f 100644
--- a/citron/dropbox/team/runas/file/batch/copy.go
+++ b/citron/dropbox/team/runas/file/batch/copy.go
@@ -8,8 +8,8 @@ import (
"github.com/watermint/toolbox/domain/dropbox/model/mo_path"
"github.com/watermint/toolbox/domain/dropbox/service/sv_member"
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_file_relocation"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/file/es_filepath"
- "github.com/watermint/toolbox/essentials/go/es_lang"
"github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/citron/dropbox/team/runas/sharedfolder/batch/leave.go b/citron/dropbox/team/runas/sharedfolder/batch/leave.go
index 9fe1a43bd..67eb8b593 100644
--- a/citron/dropbox/team/runas/sharedfolder/batch/leave.go
+++ b/citron/dropbox/team/runas/sharedfolder/batch/leave.go
@@ -10,7 +10,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/service/sv_member"
"github.com/watermint/toolbox/domain/dropbox/service/sv_sharedfolder"
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_sharedfolder"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/citron/dropbox/team/runas/sharedfolder/batch/share.go b/citron/dropbox/team/runas/sharedfolder/batch/share.go
index d94f089a1..9f33497ff 100644
--- a/citron/dropbox/team/runas/sharedfolder/batch/share.go
+++ b/citron/dropbox/team/runas/sharedfolder/batch/share.go
@@ -9,7 +9,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/model/mo_sharedfolder"
"github.com/watermint/toolbox/domain/dropbox/service/sv_member"
"github.com/watermint/toolbox/domain/dropbox/service/sv_sharedfolder"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/citron/dropbox/team/runas/sharedfolder/batch/unshare.go b/citron/dropbox/team/runas/sharedfolder/batch/unshare.go
index ca905cfa2..7209d6995 100644
--- a/citron/dropbox/team/runas/sharedfolder/batch/unshare.go
+++ b/citron/dropbox/team/runas/sharedfolder/batch/unshare.go
@@ -10,7 +10,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/service/sv_member"
"github.com/watermint/toolbox/domain/dropbox/service/sv_sharedfolder"
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_sharedfolder"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/citron/dropbox/team/runas/sharedfolder/member/batch/add.go b/citron/dropbox/team/runas/sharedfolder/member/batch/add.go
index 5233478aa..15ec79d17 100644
--- a/citron/dropbox/team/runas/sharedfolder/member/batch/add.go
+++ b/citron/dropbox/team/runas/sharedfolder/member/batch/add.go
@@ -9,7 +9,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/service/sv_member"
"github.com/watermint/toolbox/domain/dropbox/service/sv_sharedfolder_member"
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_sharedfolder"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/citron/dropbox/team/runas/sharedfolder/member/batch/delete.go b/citron/dropbox/team/runas/sharedfolder/member/batch/delete.go
index 054dc7014..9e87a0536 100644
--- a/citron/dropbox/team/runas/sharedfolder/member/batch/delete.go
+++ b/citron/dropbox/team/runas/sharedfolder/member/batch/delete.go
@@ -9,7 +9,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/service/sv_member"
"github.com/watermint/toolbox/domain/dropbox/service/sv_sharedfolder_member"
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_sharedfolder"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/citron/dropbox/team/teamfolder/member/list.go b/citron/dropbox/team/teamfolder/member/list.go
index 9cefb6e2e..60b5f2067 100644
--- a/citron/dropbox/team/teamfolder/member/list.go
+++ b/citron/dropbox/team/teamfolder/member/list.go
@@ -12,7 +12,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_folder_member"
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_team_content"
"github.com/watermint/toolbox/domain/dropbox/usecase/uc_teamfolder_scanner"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/kvs/kv_kvs"
"github.com/watermint/toolbox/essentials/kvs/kv_storage"
"github.com/watermint/toolbox/essentials/model/mo_filter"
diff --git a/docs/_posts/2022-09-18-release-111.md b/docs/_posts/2022-09-18-release-111.md
deleted file mode 100644
index 82d0ac42b..000000000
--- a/docs/_posts/2022-09-18-release-111.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-layout: post
-title: Release 111
-lang: en
-release_page: https://github.com/watermint/toolbox/releases/tag/111.8.775
-release: 111
----
-
-# Release theme
-
-## Incompatible changes
-
-* #653 : Renaming `file archive local` and `file dispatch local`
-
-## Changes
-
-* #624 : Team space commands
-* #652 : File tidy utility
-* #655 : Template utility
-* #656 : File tags command
-
-# Changes
-
-* [Specification changes](https://github.com/watermint/toolbox/blob/111.8.775/docs/releases/changes111.md) (English)
-* [Specification changes](https://github.com/watermint/toolbox/blob/111.8.775/docs/releases/changes111.md) (日本語)
-
-# Documents
-
-* [README.md](https://github.com/watermint/toolbox/blob/111.8.775/README.md) (English)
-* [README_ja.md](https://github.com/watermint/toolbox/blob/111.8.775/README_ja.md) (日本語)
-
-# Binary
-
-| File name | File size | MD5 hash | SHA256 hash |
-|-----------------------------|-----------|----------------------------------|------------------------------------------------------------------|
-| tbx-111.8.775-linux-arm.zip | 20177585 | 8e3523f6df3aee9ab57e431ffefcc817 | 19bb9f1df1c240d3175641358f9fc62e42984d42f83249c00178ec7bc182af2d |
-| tbx-111.8.775-linux.zip | 21612338 | d536e2afb2f49c9f66669e370903e994 | e23c7af88dc21cc7597463d924d00b8917976fe22a2702d37e989989a4296f15 |
-| tbx-111.8.775-mac-arm.zip | 12351247 | d7326c1a45eb46255c0b3440e5111807 | eb5bd64ed488411e6f3d1b93ac219e985bb23a324c67bc00a31eb1ece92a748a |
-| tbx-111.8.775-mac.zip | 12351259 | eedb2366b16d9bb262cc31a37f829e79 | 317c19b9c250ed607414cad3239073cbd467a79352b71072bf6291f8db1a2f6a |
-| tbx-111.8.775-win.zip | 22265552 | aa42c1fb8751fb6e94f12ffee0992dd7 | 613137e2b48f4ca03cc0303ca5f5999caac6660b51aa91bcb9714f1b9d9f9e7e |
-
-
diff --git a/docs/_posts/2025-06-17-release-142.md b/docs/_posts/2025-06-17-release-142.md
index 46c0f829e..a5396cd90 100644
--- a/docs/_posts/2025-06-17-release-142.md
+++ b/docs/_posts/2025-06-17-release-142.md
@@ -2,8 +2,29 @@
layout: post
title: Release 142
lang: en
-release_page: https://github.com/watermint/toolbox/releases/latest
+release_page: https://github.com/watermint/toolbox/releases/tag/142.8.328
release: 142
---
+# Release theme
+
+# Changes
+
+* [Specification changes](https://github.com/watermint/toolbox/blob/142.8.328/docs/releases/changes142.md) (English)
+* [Specification changes](https://github.com/watermint/toolbox/blob/142.8.328/docs/releases/changes142.md) (日本語)
+
+# Documents
+
+* [README.md](https://github.com/watermint/toolbox/blob/142.8.328/README.md) (English)
+* [README_ja.md](https://github.com/watermint/toolbox/blob/142.8.328/README_ja.md) (日本語)
+
+# Binary
+
+| File name | File size | MD5 hash | SHA256 hash |
+|------------------------------------|-----------|----------------------------------|------------------------------------------------------------------|
+| tbx-142.8.328-linux-arm.zip | 22404636 | b31afcf4638c879735f5c065ef54c0cb | 3bc3f0905f641f7feb74d1cc2e7363a3376fb0af368be39d29c5552ced7adc23 |
+| tbx-142.8.328-linux-intel.zip | 23753686 | dc2c6f7aae73763923289ede87200f1e | 12690b433e09f08c06f871bbf4f52b848ad35541312cf0e00b73942e79069850 |
+| tbx-142.8.328-mac-applesilicon.zip | 22956673 | 1ccf551b99fc3bc6d370b4913bd4a202 | f90b2a23d2fbcd5cc9900df37b711b8caf1bb17e8395c45688d31c4c85b9c7f0 |
+| tbx-142.8.328-win.zip | 24022681 | a484559a6407cc91165051a8fbb91ac2 | b973b7c874eafaa3f9ecd06f3428abc8367ac7b2a3c01c6eadccadf1bb802140 |
+
diff --git a/docs/_posts/2025-08-18-release-142.md b/docs/_posts/2025-08-18-release-142.md
new file mode 100644
index 000000000..46c0f829e
--- /dev/null
+++ b/docs/_posts/2025-08-18-release-142.md
@@ -0,0 +1,9 @@
+---
+layout: post
+title: Release 142
+lang: en
+release_page: https://github.com/watermint/toolbox/releases/latest
+release: 142
+---
+
+
diff --git a/docs/commands/asana-team-list.md b/docs/commands/asana-team-list.md
index 529854359..903c27535 100644
--- a/docs/commands/asana-team-list.md
+++ b/docs/commands/asana-team-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://app.asana.com/-/oauth_authorize?client_id=xxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=default&state=xxxxxxxx
diff --git a/docs/commands/asana-team-project-list.md b/docs/commands/asana-team-project-list.md
index 34222300e..87fc98681 100644
--- a/docs/commands/asana-team-project-list.md
+++ b/docs/commands/asana-team-project-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://app.asana.com/-/oauth_authorize?client_id=xxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=default&state=xxxxxxxx
diff --git a/docs/commands/asana-team-task-list.md b/docs/commands/asana-team-task-list.md
index b0c16d587..f2b91a6c4 100644
--- a/docs/commands/asana-team-task-list.md
+++ b/docs/commands/asana-team-task-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://app.asana.com/-/oauth_authorize?client_id=xxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=default&state=xxxxxxxx
diff --git a/docs/commands/asana-workspace-list.md b/docs/commands/asana-workspace-list.md
index 98160dd98..bb5eeaeaf 100644
--- a/docs/commands/asana-workspace-list.md
+++ b/docs/commands/asana-workspace-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://app.asana.com/-/oauth_authorize?client_id=xxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=default&state=xxxxxxxx
diff --git a/docs/commands/asana-workspace-project-list.md b/docs/commands/asana-workspace-project-list.md
index c2f07fb31..f4c0b8392 100644
--- a/docs/commands/asana-workspace-project-list.md
+++ b/docs/commands/asana-workspace-project-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://app.asana.com/-/oauth_authorize?client_id=xxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=default&state=xxxxxxxx
diff --git a/docs/commands/deepl-translate-text.md b/docs/commands/deepl-translate-text.md
index 5e7b984c6..90d77ec93 100644
--- a/docs/commands/deepl-translate-text.md
+++ b/docs/commands/deepl-translate-text.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Please enter your API key(s).
```
diff --git a/docs/commands/dev-benchmark-upload.md b/docs/commands/dev-benchmark-upload.md
index 183b66158..e2e6b53d6 100644
--- a/docs/commands/dev-benchmark-upload.md
+++ b/docs/commands/dev-benchmark-upload.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dev-benchmark-uploadlink.md b/docs/commands/dev-benchmark-uploadlink.md
index 4b754583f..0e6880e38 100644
--- a/docs/commands/dev-benchmark-uploadlink.md
+++ b/docs/commands/dev-benchmark-uploadlink.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dev-license-issue.md b/docs/commands/dev-license-issue.md
index 6bf81aa09..a59011bbe 100644
--- a/docs/commands/dev-license-issue.md
+++ b/docs/commands/dev-license-issue.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/dev-lifecycle-assets.md b/docs/commands/dev-lifecycle-assets.md
index a7557c746..d092cb0ee 100644
--- a/docs/commands/dev-lifecycle-assets.md
+++ b/docs/commands/dev-lifecycle-assets.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/dev-release-announcement.md b/docs/commands/dev-release-announcement.md
index f986198ff..fbb747317 100644
--- a/docs/commands/dev-release-announcement.md
+++ b/docs/commands/dev-release-announcement.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/dev-release-asset.md b/docs/commands/dev-release-asset.md
index a6378548d..e23f35bad 100644
--- a/docs/commands/dev-release-asset.md
+++ b/docs/commands/dev-release-asset.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/dev-release-asseturl.md b/docs/commands/dev-release-asseturl.md
index 4aa17fc85..b5697a478 100644
--- a/docs/commands/dev-release-asseturl.md
+++ b/docs/commands/dev-release-asseturl.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/dev-release-candidate.md b/docs/commands/dev-release-candidate.md
index f11e64a71..6b41d6cab 100644
--- a/docs/commands/dev-release-candidate.md
+++ b/docs/commands/dev-release-candidate.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/dev-release-checkin.md b/docs/commands/dev-release-checkin.md
index cd16933a3..b39fbaf62 100644
--- a/docs/commands/dev-release-checkin.md
+++ b/docs/commands/dev-release-checkin.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/dev-release-doc.md b/docs/commands/dev-release-doc.md
index eced8eaed..33ad0c5d0 100644
--- a/docs/commands/dev-release-doc.md
+++ b/docs/commands/dev-release-doc.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/dev-release-publish.md b/docs/commands/dev-release-publish.md
index 209b71d39..7bd5e29ee 100644
--- a/docs/commands/dev-release-publish.md
+++ b/docs/commands/dev-release-publish.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-account-feature.md b/docs/commands/dropbox-file-account-feature.md
index 9372db023..c0bb100bf 100644
--- a/docs/commands/dropbox-file-account-feature.md
+++ b/docs/commands/dropbox-file-account-feature.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-account-filesystem.md b/docs/commands/dropbox-file-account-filesystem.md
index 96e545ea8..db4275e1f 100644
--- a/docs/commands/dropbox-file-account-filesystem.md
+++ b/docs/commands/dropbox-file-account-filesystem.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-account-info.md b/docs/commands/dropbox-file-account-info.md
index 12f6643d7..f1543853a 100644
--- a/docs/commands/dropbox-file-account-info.md
+++ b/docs/commands/dropbox-file-account-info.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-compare-account.md b/docs/commands/dropbox-file-compare-account.md
index ad2cd8282..714085ee0 100644
--- a/docs/commands/dropbox-file-compare-account.md
+++ b/docs/commands/dropbox-file-compare-account.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-compare-local.md b/docs/commands/dropbox-file-compare-local.md
index 1fbcddde9..ccbd4318e 100644
--- a/docs/commands/dropbox-file-compare-local.md
+++ b/docs/commands/dropbox-file-compare-local.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-copy.md b/docs/commands/dropbox-file-copy.md
index e080b4d60..7f7d50aa4 100644
--- a/docs/commands/dropbox-file-copy.md
+++ b/docs/commands/dropbox-file-copy.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-delete.md b/docs/commands/dropbox-file-delete.md
index bdaadf7c0..d0ddc1260 100644
--- a/docs/commands/dropbox-file-delete.md
+++ b/docs/commands/dropbox-file-delete.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-export-doc.md b/docs/commands/dropbox-file-export-doc.md
index 99369c7d5..219cf7f8f 100644
--- a/docs/commands/dropbox-file-export-doc.md
+++ b/docs/commands/dropbox-file-export-doc.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-export-url.md b/docs/commands/dropbox-file-export-url.md
index 7443a79c5..8c24b4c0d 100644
--- a/docs/commands/dropbox-file-export-url.md
+++ b/docs/commands/dropbox-file-export-url.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-import-batch-url.md b/docs/commands/dropbox-file-import-batch-url.md
index be3603bbc..4411ebe3c 100644
--- a/docs/commands/dropbox-file-import-batch-url.md
+++ b/docs/commands/dropbox-file-import-batch-url.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-import-url.md b/docs/commands/dropbox-file-import-url.md
index be56aac2b..8a84e99f0 100644
--- a/docs/commands/dropbox-file-import-url.md
+++ b/docs/commands/dropbox-file-import-url.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-info.md b/docs/commands/dropbox-file-info.md
index 9d3202a8a..12d41b478 100644
--- a/docs/commands/dropbox-file-info.md
+++ b/docs/commands/dropbox-file-info.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-list.md b/docs/commands/dropbox-file-list.md
index 76b9d33e6..b514b5fca 100644
--- a/docs/commands/dropbox-file-list.md
+++ b/docs/commands/dropbox-file-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-lock-acquire.md b/docs/commands/dropbox-file-lock-acquire.md
index 3bce4d6a4..45cfa2e35 100644
--- a/docs/commands/dropbox-file-lock-acquire.md
+++ b/docs/commands/dropbox-file-lock-acquire.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-lock-all-release.md b/docs/commands/dropbox-file-lock-all-release.md
index cad7177d7..537dc4ea7 100644
--- a/docs/commands/dropbox-file-lock-all-release.md
+++ b/docs/commands/dropbox-file-lock-all-release.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-lock-batch-acquire.md b/docs/commands/dropbox-file-lock-batch-acquire.md
index b49f94b7a..a61756f29 100644
--- a/docs/commands/dropbox-file-lock-batch-acquire.md
+++ b/docs/commands/dropbox-file-lock-batch-acquire.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-lock-batch-release.md b/docs/commands/dropbox-file-lock-batch-release.md
index ae5e72ab9..63a1febb2 100644
--- a/docs/commands/dropbox-file-lock-batch-release.md
+++ b/docs/commands/dropbox-file-lock-batch-release.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-lock-list.md b/docs/commands/dropbox-file-lock-list.md
index 4facb0e3b..eb985518c 100644
--- a/docs/commands/dropbox-file-lock-list.md
+++ b/docs/commands/dropbox-file-lock-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-lock-release.md b/docs/commands/dropbox-file-lock-release.md
index 49cd7417b..d923a272a 100644
--- a/docs/commands/dropbox-file-lock-release.md
+++ b/docs/commands/dropbox-file-lock-release.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-merge.md b/docs/commands/dropbox-file-merge.md
index 5c69434c9..725038756 100644
--- a/docs/commands/dropbox-file-merge.md
+++ b/docs/commands/dropbox-file-merge.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-move.md b/docs/commands/dropbox-file-move.md
index 3ceb3e054..21c41805d 100644
--- a/docs/commands/dropbox-file-move.md
+++ b/docs/commands/dropbox-file-move.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-replication.md b/docs/commands/dropbox-file-replication.md
index 088592fb4..fa0e7df42 100644
--- a/docs/commands/dropbox-file-replication.md
+++ b/docs/commands/dropbox-file-replication.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-request-create.md b/docs/commands/dropbox-file-request-create.md
index 4f31d6738..e14465aac 100644
--- a/docs/commands/dropbox-file-request-create.md
+++ b/docs/commands/dropbox-file-request-create.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-request-delete-closed.md b/docs/commands/dropbox-file-request-delete-closed.md
index 054175040..2c4af2d7e 100644
--- a/docs/commands/dropbox-file-request-delete-closed.md
+++ b/docs/commands/dropbox-file-request-delete-closed.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-request-delete-url.md b/docs/commands/dropbox-file-request-delete-url.md
index 7c0a7ea1b..732f84a66 100644
--- a/docs/commands/dropbox-file-request-delete-url.md
+++ b/docs/commands/dropbox-file-request-delete-url.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-request-list.md b/docs/commands/dropbox-file-request-list.md
index d6b0526b1..42e9c095a 100644
--- a/docs/commands/dropbox-file-request-list.md
+++ b/docs/commands/dropbox-file-request-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-restore-all.md b/docs/commands/dropbox-file-restore-all.md
index 027d4f327..f748b0e75 100644
--- a/docs/commands/dropbox-file-restore-all.md
+++ b/docs/commands/dropbox-file-restore-all.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-restore-ext.md b/docs/commands/dropbox-file-restore-ext.md
index 76b320505..77a167d8a 100644
--- a/docs/commands/dropbox-file-restore-ext.md
+++ b/docs/commands/dropbox-file-restore-ext.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-revision-download.md b/docs/commands/dropbox-file-revision-download.md
index 75cb0417c..e0e6f6a72 100644
--- a/docs/commands/dropbox-file-revision-download.md
+++ b/docs/commands/dropbox-file-revision-download.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-revision-list.md b/docs/commands/dropbox-file-revision-list.md
index f30ec80c3..ed642028a 100644
--- a/docs/commands/dropbox-file-revision-list.md
+++ b/docs/commands/dropbox-file-revision-list.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-revision-restore.md b/docs/commands/dropbox-file-revision-restore.md
index 89f5db008..afce360ef 100644
--- a/docs/commands/dropbox-file-revision-restore.md
+++ b/docs/commands/dropbox-file-revision-restore.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-search-content.md b/docs/commands/dropbox-file-search-content.md
index c85a59bf7..0fb44205a 100644
--- a/docs/commands/dropbox-file-search-content.md
+++ b/docs/commands/dropbox-file-search-content.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-search-name.md b/docs/commands/dropbox-file-search-name.md
index de3dce8b1..8e39b42c9 100644
--- a/docs/commands/dropbox-file-search-name.md
+++ b/docs/commands/dropbox-file-search-name.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-share-info.md b/docs/commands/dropbox-file-share-info.md
index 7e3fde989..a1a939e88 100644
--- a/docs/commands/dropbox-file-share-info.md
+++ b/docs/commands/dropbox-file-share-info.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedfolder-info.md b/docs/commands/dropbox-file-sharedfolder-info.md
index cb41fb726..13ff25e85 100644
--- a/docs/commands/dropbox-file-sharedfolder-info.md
+++ b/docs/commands/dropbox-file-sharedfolder-info.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedfolder-leave.md b/docs/commands/dropbox-file-sharedfolder-leave.md
index 028cf3ccc..1cc54ce63 100644
--- a/docs/commands/dropbox-file-sharedfolder-leave.md
+++ b/docs/commands/dropbox-file-sharedfolder-leave.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedfolder-list.md b/docs/commands/dropbox-file-sharedfolder-list.md
index fef672a0a..daa6b5950 100644
--- a/docs/commands/dropbox-file-sharedfolder-list.md
+++ b/docs/commands/dropbox-file-sharedfolder-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedfolder-member-add.md b/docs/commands/dropbox-file-sharedfolder-member-add.md
index f877f6a82..a1b5dd38e 100644
--- a/docs/commands/dropbox-file-sharedfolder-member-add.md
+++ b/docs/commands/dropbox-file-sharedfolder-member-add.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedfolder-member-delete.md b/docs/commands/dropbox-file-sharedfolder-member-delete.md
index 881db881b..f6753afb5 100644
--- a/docs/commands/dropbox-file-sharedfolder-member-delete.md
+++ b/docs/commands/dropbox-file-sharedfolder-member-delete.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedfolder-member-list.md b/docs/commands/dropbox-file-sharedfolder-member-list.md
index 6d5d43bc3..f67d36b10 100644
--- a/docs/commands/dropbox-file-sharedfolder-member-list.md
+++ b/docs/commands/dropbox-file-sharedfolder-member-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedfolder-mount-add.md b/docs/commands/dropbox-file-sharedfolder-mount-add.md
index aa4518bd6..98191d412 100644
--- a/docs/commands/dropbox-file-sharedfolder-mount-add.md
+++ b/docs/commands/dropbox-file-sharedfolder-mount-add.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedfolder-mount-delete.md b/docs/commands/dropbox-file-sharedfolder-mount-delete.md
index 0f599d70c..860589a8d 100644
--- a/docs/commands/dropbox-file-sharedfolder-mount-delete.md
+++ b/docs/commands/dropbox-file-sharedfolder-mount-delete.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedfolder-mount-list.md b/docs/commands/dropbox-file-sharedfolder-mount-list.md
index 7d75ab303..bb1935620 100644
--- a/docs/commands/dropbox-file-sharedfolder-mount-list.md
+++ b/docs/commands/dropbox-file-sharedfolder-mount-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedfolder-mount-mountable.md b/docs/commands/dropbox-file-sharedfolder-mount-mountable.md
index 5d68e3f06..c235a1205 100644
--- a/docs/commands/dropbox-file-sharedfolder-mount-mountable.md
+++ b/docs/commands/dropbox-file-sharedfolder-mount-mountable.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedfolder-share.md b/docs/commands/dropbox-file-sharedfolder-share.md
index 044985ccd..8652265fd 100644
--- a/docs/commands/dropbox-file-sharedfolder-share.md
+++ b/docs/commands/dropbox-file-sharedfolder-share.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedfolder-unshare.md b/docs/commands/dropbox-file-sharedfolder-unshare.md
index aab5f6001..5451015e7 100644
--- a/docs/commands/dropbox-file-sharedfolder-unshare.md
+++ b/docs/commands/dropbox-file-sharedfolder-unshare.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedlink-create.md b/docs/commands/dropbox-file-sharedlink-create.md
index 67c2eb609..d7b6f1f63 100644
--- a/docs/commands/dropbox-file-sharedlink-create.md
+++ b/docs/commands/dropbox-file-sharedlink-create.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedlink-delete.md b/docs/commands/dropbox-file-sharedlink-delete.md
index 2c10bb136..1f07d3702 100644
--- a/docs/commands/dropbox-file-sharedlink-delete.md
+++ b/docs/commands/dropbox-file-sharedlink-delete.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedlink-file-list.md b/docs/commands/dropbox-file-sharedlink-file-list.md
index c90469f6b..1cda83e60 100644
--- a/docs/commands/dropbox-file-sharedlink-file-list.md
+++ b/docs/commands/dropbox-file-sharedlink-file-list.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedlink-info.md b/docs/commands/dropbox-file-sharedlink-info.md
index 04f89b64f..a47722c43 100644
--- a/docs/commands/dropbox-file-sharedlink-info.md
+++ b/docs/commands/dropbox-file-sharedlink-info.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sharedlink-list.md b/docs/commands/dropbox-file-sharedlink-list.md
index 523ffcefe..8e29c93f7 100644
--- a/docs/commands/dropbox-file-sharedlink-list.md
+++ b/docs/commands/dropbox-file-sharedlink-list.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-size.md b/docs/commands/dropbox-file-size.md
index 63d2e7934..848d6e95a 100644
--- a/docs/commands/dropbox-file-size.md
+++ b/docs/commands/dropbox-file-size.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sync-down.md b/docs/commands/dropbox-file-sync-down.md
index b91fdb817..f9d8ad6a0 100644
--- a/docs/commands/dropbox-file-sync-down.md
+++ b/docs/commands/dropbox-file-sync-down.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sync-online.md b/docs/commands/dropbox-file-sync-online.md
index e523a2fc0..227ee4dd8 100644
--- a/docs/commands/dropbox-file-sync-online.md
+++ b/docs/commands/dropbox-file-sync-online.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-sync-up.md b/docs/commands/dropbox-file-sync-up.md
index 700cbe3f2..209316744 100644
--- a/docs/commands/dropbox-file-sync-up.md
+++ b/docs/commands/dropbox-file-sync-up.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-tag-add.md b/docs/commands/dropbox-file-tag-add.md
index 3fdf90f38..d0f9b9466 100644
--- a/docs/commands/dropbox-file-tag-add.md
+++ b/docs/commands/dropbox-file-tag-add.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-tag-delete.md b/docs/commands/dropbox-file-tag-delete.md
index 4171c6277..2a4a2bcea 100644
--- a/docs/commands/dropbox-file-tag-delete.md
+++ b/docs/commands/dropbox-file-tag-delete.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-tag-list.md b/docs/commands/dropbox-file-tag-list.md
index 619fb1f91..020c64c2e 100644
--- a/docs/commands/dropbox-file-tag-list.md
+++ b/docs/commands/dropbox-file-tag-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-template-apply.md b/docs/commands/dropbox-file-template-apply.md
index 8485d48fb..9e8ce4863 100644
--- a/docs/commands/dropbox-file-template-apply.md
+++ b/docs/commands/dropbox-file-template-apply.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-template-capture.md b/docs/commands/dropbox-file-template-capture.md
index b53f982be..ebaab0742 100644
--- a/docs/commands/dropbox-file-template-capture.md
+++ b/docs/commands/dropbox-file-template-capture.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-file-watch.md b/docs/commands/dropbox-file-watch.md
index d2ecbcb57..5e35b9ca7 100644
--- a/docs/commands/dropbox-file-watch.md
+++ b/docs/commands/dropbox-file-watch.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-paper-append.md b/docs/commands/dropbox-paper-append.md
index 4cecafa05..cb4d58f04 100644
--- a/docs/commands/dropbox-paper-append.md
+++ b/docs/commands/dropbox-paper-append.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-paper-create.md b/docs/commands/dropbox-paper-create.md
index 681657d42..911562af3 100644
--- a/docs/commands/dropbox-paper-create.md
+++ b/docs/commands/dropbox-paper-create.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-paper-overwrite.md b/docs/commands/dropbox-paper-overwrite.md
index c27c1dc59..0c9fdf9f9 100644
--- a/docs/commands/dropbox-paper-overwrite.md
+++ b/docs/commands/dropbox-paper-overwrite.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-paper-prepend.md b/docs/commands/dropbox-paper-prepend.md
index 498a5f686..864e117f5 100644
--- a/docs/commands/dropbox-paper-prepend.md
+++ b/docs/commands/dropbox-paper-prepend.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-sign-account-info.md b/docs/commands/dropbox-sign-account-info.md
index a6920864b..5be6f668e 100644
--- a/docs/commands/dropbox-sign-account-info.md
+++ b/docs/commands/dropbox-sign-account-info.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Please enter your credential(s).
```
diff --git a/docs/commands/dropbox-sign-request-list.md b/docs/commands/dropbox-sign-request-list.md
index cbfcc0e37..687f6348c 100644
--- a/docs/commands/dropbox-sign-request-list.md
+++ b/docs/commands/dropbox-sign-request-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Please enter your credential(s).
```
diff --git a/docs/commands/dropbox-sign-request-signature-list.md b/docs/commands/dropbox-sign-request-signature-list.md
index 15786d53c..a605d234b 100644
--- a/docs/commands/dropbox-sign-request-signature-list.md
+++ b/docs/commands/dropbox-sign-request-signature-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Please enter your credential(s).
```
diff --git a/docs/commands/dropbox-team-activity-batch-user.md b/docs/commands/dropbox-team-activity-batch-user.md
index 5352159b8..6f592197c 100644
--- a/docs/commands/dropbox-team-activity-batch-user.md
+++ b/docs/commands/dropbox-team-activity-batch-user.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-activity-daily-event.md b/docs/commands/dropbox-team-activity-daily-event.md
index f69a3f6d5..de93982e9 100644
--- a/docs/commands/dropbox-team-activity-daily-event.md
+++ b/docs/commands/dropbox-team-activity-daily-event.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-activity-event.md b/docs/commands/dropbox-team-activity-event.md
index 7b5936bb7..121ade774 100644
--- a/docs/commands/dropbox-team-activity-event.md
+++ b/docs/commands/dropbox-team-activity-event.md
@@ -71,6 +71,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-activity-user.md b/docs/commands/dropbox-team-activity-user.md
index 0940f4383..823c410d3 100644
--- a/docs/commands/dropbox-team-activity-user.md
+++ b/docs/commands/dropbox-team-activity-user.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-admin-group-role-add.md b/docs/commands/dropbox-team-admin-group-role-add.md
index 8acc251a2..2f57978fd 100644
--- a/docs/commands/dropbox-team-admin-group-role-add.md
+++ b/docs/commands/dropbox-team-admin-group-role-add.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-admin-group-role-delete.md b/docs/commands/dropbox-team-admin-group-role-delete.md
index f42467f81..a7f2970e7 100644
--- a/docs/commands/dropbox-team-admin-group-role-delete.md
+++ b/docs/commands/dropbox-team-admin-group-role-delete.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-admin-list.md b/docs/commands/dropbox-team-admin-list.md
index c6933db62..ab2c4b33c 100644
--- a/docs/commands/dropbox-team-admin-list.md
+++ b/docs/commands/dropbox-team-admin-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-admin-role-add.md b/docs/commands/dropbox-team-admin-role-add.md
index cdd86310b..2063592f5 100644
--- a/docs/commands/dropbox-team-admin-role-add.md
+++ b/docs/commands/dropbox-team-admin-role-add.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-admin-role-clear.md b/docs/commands/dropbox-team-admin-role-clear.md
index 2a0fe8584..6b16f02c6 100644
--- a/docs/commands/dropbox-team-admin-role-clear.md
+++ b/docs/commands/dropbox-team-admin-role-clear.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-admin-role-delete.md b/docs/commands/dropbox-team-admin-role-delete.md
index d978281d2..8a916c9c6 100644
--- a/docs/commands/dropbox-team-admin-role-delete.md
+++ b/docs/commands/dropbox-team-admin-role-delete.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-admin-role-list.md b/docs/commands/dropbox-team-admin-role-list.md
index 5bd5cf600..d3a6ca82a 100644
--- a/docs/commands/dropbox-team-admin-role-list.md
+++ b/docs/commands/dropbox-team-admin-role-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-backup-device-status.md b/docs/commands/dropbox-team-backup-device-status.md
index 52afed7e5..b71728019 100644
--- a/docs/commands/dropbox-team-backup-device-status.md
+++ b/docs/commands/dropbox-team-backup-device-status.md
@@ -52,6 +52,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-content-legacypaper-count.md b/docs/commands/dropbox-team-content-legacypaper-count.md
index 05a5e42ab..b1624392f 100644
--- a/docs/commands/dropbox-team-content-legacypaper-count.md
+++ b/docs/commands/dropbox-team-content-legacypaper-count.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-content-legacypaper-export.md b/docs/commands/dropbox-team-content-legacypaper-export.md
index 37cb8262d..ba67caa1e 100644
--- a/docs/commands/dropbox-team-content-legacypaper-export.md
+++ b/docs/commands/dropbox-team-content-legacypaper-export.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-content-legacypaper-list.md b/docs/commands/dropbox-team-content-legacypaper-list.md
index fe685f7f8..784ad40ea 100644
--- a/docs/commands/dropbox-team-content-legacypaper-list.md
+++ b/docs/commands/dropbox-team-content-legacypaper-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-content-member-list.md b/docs/commands/dropbox-team-content-member-list.md
index 388838aa2..a3aaec9e1 100644
--- a/docs/commands/dropbox-team-content-member-list.md
+++ b/docs/commands/dropbox-team-content-member-list.md
@@ -50,6 +50,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-content-member-size.md b/docs/commands/dropbox-team-content-member-size.md
index 53163a036..2c397800e 100644
--- a/docs/commands/dropbox-team-content-member-size.md
+++ b/docs/commands/dropbox-team-content-member-size.md
@@ -50,6 +50,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-content-mount-list.md b/docs/commands/dropbox-team-content-mount-list.md
index a5e330cd9..d996c13b9 100644
--- a/docs/commands/dropbox-team-content-mount-list.md
+++ b/docs/commands/dropbox-team-content-mount-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-content-policy-list.md b/docs/commands/dropbox-team-content-policy-list.md
index d87bc68e0..c9a4a5169 100644
--- a/docs/commands/dropbox-team-content-policy-list.md
+++ b/docs/commands/dropbox-team-content-policy-list.md
@@ -50,6 +50,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-device-list.md b/docs/commands/dropbox-team-device-list.md
index 24722efaf..6b9eb02b9 100644
--- a/docs/commands/dropbox-team-device-list.md
+++ b/docs/commands/dropbox-team-device-list.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-device-unlink.md b/docs/commands/dropbox-team-device-unlink.md
index da2733e7d..18918f9c1 100644
--- a/docs/commands/dropbox-team-device-unlink.md
+++ b/docs/commands/dropbox-team-device-unlink.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-feature.md b/docs/commands/dropbox-team-feature.md
index ab34f7e16..5839a1682 100644
--- a/docs/commands/dropbox-team-feature.md
+++ b/docs/commands/dropbox-team-feature.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-filerequest-clone.md b/docs/commands/dropbox-team-filerequest-clone.md
index cf7ac6fc9..9ae776aad 100644
--- a/docs/commands/dropbox-team-filerequest-clone.md
+++ b/docs/commands/dropbox-team-filerequest-clone.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-filerequest-list.md b/docs/commands/dropbox-team-filerequest-list.md
index 0eb733b40..a0e21b5b1 100644
--- a/docs/commands/dropbox-team-filerequest-list.md
+++ b/docs/commands/dropbox-team-filerequest-list.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-filesystem.md b/docs/commands/dropbox-team-filesystem.md
index d3212c951..d9b08cf91 100644
--- a/docs/commands/dropbox-team-filesystem.md
+++ b/docs/commands/dropbox-team-filesystem.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-add.md b/docs/commands/dropbox-team-group-add.md
index 9ba4c415e..4ffbd9497 100644
--- a/docs/commands/dropbox-team-group-add.md
+++ b/docs/commands/dropbox-team-group-add.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-batch-add.md b/docs/commands/dropbox-team-group-batch-add.md
index 42c6d1c26..50ee0cce9 100644
--- a/docs/commands/dropbox-team-group-batch-add.md
+++ b/docs/commands/dropbox-team-group-batch-add.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-batch-delete.md b/docs/commands/dropbox-team-group-batch-delete.md
index f797fac34..84661411c 100644
--- a/docs/commands/dropbox-team-group-batch-delete.md
+++ b/docs/commands/dropbox-team-group-batch-delete.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-clear-externalid.md b/docs/commands/dropbox-team-group-clear-externalid.md
index 77c0c79f6..2b85c4f2c 100644
--- a/docs/commands/dropbox-team-group-clear-externalid.md
+++ b/docs/commands/dropbox-team-group-clear-externalid.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-delete.md b/docs/commands/dropbox-team-group-delete.md
index 0f2937605..6ba695fc4 100644
--- a/docs/commands/dropbox-team-group-delete.md
+++ b/docs/commands/dropbox-team-group-delete.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-folder-list.md b/docs/commands/dropbox-team-group-folder-list.md
index 79f1c4278..f23e7f1c7 100644
--- a/docs/commands/dropbox-team-group-folder-list.md
+++ b/docs/commands/dropbox-team-group-folder-list.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-list.md b/docs/commands/dropbox-team-group-list.md
index 75cc3e6e4..198e4752d 100644
--- a/docs/commands/dropbox-team-group-list.md
+++ b/docs/commands/dropbox-team-group-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-member-add.md b/docs/commands/dropbox-team-group-member-add.md
index 67a4a5344..7bff67dd4 100644
--- a/docs/commands/dropbox-team-group-member-add.md
+++ b/docs/commands/dropbox-team-group-member-add.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-member-batch-add.md b/docs/commands/dropbox-team-group-member-batch-add.md
index 53f848f4a..ef0ce8c94 100644
--- a/docs/commands/dropbox-team-group-member-batch-add.md
+++ b/docs/commands/dropbox-team-group-member-batch-add.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-member-batch-delete.md b/docs/commands/dropbox-team-group-member-batch-delete.md
index 794e942f3..b76ded17d 100644
--- a/docs/commands/dropbox-team-group-member-batch-delete.md
+++ b/docs/commands/dropbox-team-group-member-batch-delete.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-member-batch-update.md b/docs/commands/dropbox-team-group-member-batch-update.md
index bb6c71c34..dad3a89d4 100644
--- a/docs/commands/dropbox-team-group-member-batch-update.md
+++ b/docs/commands/dropbox-team-group-member-batch-update.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-member-delete.md b/docs/commands/dropbox-team-group-member-delete.md
index 990133b84..6931069c6 100644
--- a/docs/commands/dropbox-team-group-member-delete.md
+++ b/docs/commands/dropbox-team-group-member-delete.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-member-list.md b/docs/commands/dropbox-team-group-member-list.md
index 93020b2b1..12b1b21c0 100644
--- a/docs/commands/dropbox-team-group-member-list.md
+++ b/docs/commands/dropbox-team-group-member-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-rename.md b/docs/commands/dropbox-team-group-rename.md
index 470267bd0..c161bfc1a 100644
--- a/docs/commands/dropbox-team-group-rename.md
+++ b/docs/commands/dropbox-team-group-rename.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-group-update-type.md b/docs/commands/dropbox-team-group-update-type.md
index 16b371bba..2251ba130 100644
--- a/docs/commands/dropbox-team-group-update-type.md
+++ b/docs/commands/dropbox-team-group-update-type.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-info.md b/docs/commands/dropbox-team-info.md
index 4ba98d191..63ae6035c 100644
--- a/docs/commands/dropbox-team-info.md
+++ b/docs/commands/dropbox-team-info.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-insight-scan.md b/docs/commands/dropbox-team-insight-scan.md
index 7fa64de69..6febbaf39 100644
--- a/docs/commands/dropbox-team-insight-scan.md
+++ b/docs/commands/dropbox-team-insight-scan.md
@@ -62,6 +62,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-insight-scanretry.md b/docs/commands/dropbox-team-insight-scanretry.md
index af35e06e7..90a4dc2b8 100644
--- a/docs/commands/dropbox-team-insight-scanretry.md
+++ b/docs/commands/dropbox-team-insight-scanretry.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-legalhold-add.md b/docs/commands/dropbox-team-legalhold-add.md
index 39c339a32..974574575 100644
--- a/docs/commands/dropbox-team-legalhold-add.md
+++ b/docs/commands/dropbox-team-legalhold-add.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-legalhold-list.md b/docs/commands/dropbox-team-legalhold-list.md
index 3415a0298..5e57c5d72 100644
--- a/docs/commands/dropbox-team-legalhold-list.md
+++ b/docs/commands/dropbox-team-legalhold-list.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-legalhold-member-batch-update.md b/docs/commands/dropbox-team-legalhold-member-batch-update.md
index b312706cd..5100e589e 100644
--- a/docs/commands/dropbox-team-legalhold-member-batch-update.md
+++ b/docs/commands/dropbox-team-legalhold-member-batch-update.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-legalhold-member-list.md b/docs/commands/dropbox-team-legalhold-member-list.md
index 458883cb7..db7a5e6ae 100644
--- a/docs/commands/dropbox-team-legalhold-member-list.md
+++ b/docs/commands/dropbox-team-legalhold-member-list.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-legalhold-release.md b/docs/commands/dropbox-team-legalhold-release.md
index 69965a373..a57eab2d3 100644
--- a/docs/commands/dropbox-team-legalhold-release.md
+++ b/docs/commands/dropbox-team-legalhold-release.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-legalhold-revision-list.md b/docs/commands/dropbox-team-legalhold-revision-list.md
index 93d5a3c8c..46ab80199 100644
--- a/docs/commands/dropbox-team-legalhold-revision-list.md
+++ b/docs/commands/dropbox-team-legalhold-revision-list.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-legalhold-update-desc.md b/docs/commands/dropbox-team-legalhold-update-desc.md
index c2d9815c9..ff2e4a8cd 100644
--- a/docs/commands/dropbox-team-legalhold-update-desc.md
+++ b/docs/commands/dropbox-team-legalhold-update-desc.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-legalhold-update-name.md b/docs/commands/dropbox-team-legalhold-update-name.md
index 56c9a5845..f959c097b 100644
--- a/docs/commands/dropbox-team-legalhold-update-name.md
+++ b/docs/commands/dropbox-team-legalhold-update-name.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-linkedapp-list.md b/docs/commands/dropbox-team-linkedapp-list.md
index 8bfd69df9..047bc6f19 100644
--- a/docs/commands/dropbox-team-linkedapp-list.md
+++ b/docs/commands/dropbox-team-linkedapp-list.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-batch-delete.md b/docs/commands/dropbox-team-member-batch-delete.md
index 7c79f24f8..7c687b2f2 100644
--- a/docs/commands/dropbox-team-member-batch-delete.md
+++ b/docs/commands/dropbox-team-member-batch-delete.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-batch-detach.md b/docs/commands/dropbox-team-member-batch-detach.md
index ccc01e0e6..2f0452678 100644
--- a/docs/commands/dropbox-team-member-batch-detach.md
+++ b/docs/commands/dropbox-team-member-batch-detach.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-batch-invite.md b/docs/commands/dropbox-team-member-batch-invite.md
index e60b77909..f97a7bca4 100644
--- a/docs/commands/dropbox-team-member-batch-invite.md
+++ b/docs/commands/dropbox-team-member-batch-invite.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-batch-reinvite.md b/docs/commands/dropbox-team-member-batch-reinvite.md
index 673146c07..0ed24ae05 100644
--- a/docs/commands/dropbox-team-member-batch-reinvite.md
+++ b/docs/commands/dropbox-team-member-batch-reinvite.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-batch-suspend.md b/docs/commands/dropbox-team-member-batch-suspend.md
index 48a2788aa..744de0d61 100644
--- a/docs/commands/dropbox-team-member-batch-suspend.md
+++ b/docs/commands/dropbox-team-member-batch-suspend.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-batch-unsuspend.md b/docs/commands/dropbox-team-member-batch-unsuspend.md
index 3409f8f9f..360432c2d 100644
--- a/docs/commands/dropbox-team-member-batch-unsuspend.md
+++ b/docs/commands/dropbox-team-member-batch-unsuspend.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-clear-externalid.md b/docs/commands/dropbox-team-member-clear-externalid.md
index fea44775f..db3ffc10b 100644
--- a/docs/commands/dropbox-team-member-clear-externalid.md
+++ b/docs/commands/dropbox-team-member-clear-externalid.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-feature.md b/docs/commands/dropbox-team-member-feature.md
index 0b9a807eb..57d2fcac9 100644
--- a/docs/commands/dropbox-team-member-feature.md
+++ b/docs/commands/dropbox-team-member-feature.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-file-lock-all-release.md b/docs/commands/dropbox-team-member-file-lock-all-release.md
index 64329f55d..af354df12 100644
--- a/docs/commands/dropbox-team-member-file-lock-all-release.md
+++ b/docs/commands/dropbox-team-member-file-lock-all-release.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-file-lock-list.md b/docs/commands/dropbox-team-member-file-lock-list.md
index bf2edc6a1..780f67e26 100644
--- a/docs/commands/dropbox-team-member-file-lock-list.md
+++ b/docs/commands/dropbox-team-member-file-lock-list.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-file-lock-release.md b/docs/commands/dropbox-team-member-file-lock-release.md
index 3937c1cba..b6c58ef61 100644
--- a/docs/commands/dropbox-team-member-file-lock-release.md
+++ b/docs/commands/dropbox-team-member-file-lock-release.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-file-permdelete.md b/docs/commands/dropbox-team-member-file-permdelete.md
index 7ff85e176..d56008fe9 100644
--- a/docs/commands/dropbox-team-member-file-permdelete.md
+++ b/docs/commands/dropbox-team-member-file-permdelete.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-folder-list.md b/docs/commands/dropbox-team-member-folder-list.md
index 9b6f66a4e..6336359b5 100644
--- a/docs/commands/dropbox-team-member-folder-list.md
+++ b/docs/commands/dropbox-team-member-folder-list.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-folder-replication.md b/docs/commands/dropbox-team-member-folder-replication.md
index a4658a88d..0d09d0548 100644
--- a/docs/commands/dropbox-team-member-folder-replication.md
+++ b/docs/commands/dropbox-team-member-folder-replication.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-list.md b/docs/commands/dropbox-team-member-list.md
index 34fa700aa..1f178733c 100644
--- a/docs/commands/dropbox-team-member-list.md
+++ b/docs/commands/dropbox-team-member-list.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-quota-batch-update.md b/docs/commands/dropbox-team-member-quota-batch-update.md
index efbdf6e52..17b1b4b43 100644
--- a/docs/commands/dropbox-team-member-quota-batch-update.md
+++ b/docs/commands/dropbox-team-member-quota-batch-update.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-quota-list.md b/docs/commands/dropbox-team-member-quota-list.md
index 09ab78129..1f76ba50d 100644
--- a/docs/commands/dropbox-team-member-quota-list.md
+++ b/docs/commands/dropbox-team-member-quota-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-quota-usage.md b/docs/commands/dropbox-team-member-quota-usage.md
index 55a0deb83..ee1314128 100644
--- a/docs/commands/dropbox-team-member-quota-usage.md
+++ b/docs/commands/dropbox-team-member-quota-usage.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-replication.md b/docs/commands/dropbox-team-member-replication.md
index 008d4044a..531dbd018 100644
--- a/docs/commands/dropbox-team-member-replication.md
+++ b/docs/commands/dropbox-team-member-replication.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-suspend.md b/docs/commands/dropbox-team-member-suspend.md
index 076bbce77..abed335bb 100644
--- a/docs/commands/dropbox-team-member-suspend.md
+++ b/docs/commands/dropbox-team-member-suspend.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-unsuspend.md b/docs/commands/dropbox-team-member-unsuspend.md
index a755c8d7b..60e502a6f 100644
--- a/docs/commands/dropbox-team-member-unsuspend.md
+++ b/docs/commands/dropbox-team-member-unsuspend.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-update-batch-email.md b/docs/commands/dropbox-team-member-update-batch-email.md
index 29b9b6e03..c51c39902 100644
--- a/docs/commands/dropbox-team-member-update-batch-email.md
+++ b/docs/commands/dropbox-team-member-update-batch-email.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-update-batch-externalid.md b/docs/commands/dropbox-team-member-update-batch-externalid.md
index 70a95a7a0..4fe7c61db 100644
--- a/docs/commands/dropbox-team-member-update-batch-externalid.md
+++ b/docs/commands/dropbox-team-member-update-batch-externalid.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-update-batch-invisible.md b/docs/commands/dropbox-team-member-update-batch-invisible.md
index ae932daa6..1f7844242 100644
--- a/docs/commands/dropbox-team-member-update-batch-invisible.md
+++ b/docs/commands/dropbox-team-member-update-batch-invisible.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-update-batch-profile.md b/docs/commands/dropbox-team-member-update-batch-profile.md
index 1032b8d4e..4312b9737 100644
--- a/docs/commands/dropbox-team-member-update-batch-profile.md
+++ b/docs/commands/dropbox-team-member-update-batch-profile.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-member-update-batch-visible.md b/docs/commands/dropbox-team-member-update-batch-visible.md
index a7a21b5a5..8dbfcb66f 100644
--- a/docs/commands/dropbox-team-member-update-batch-visible.md
+++ b/docs/commands/dropbox-team-member-update-batch-visible.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-namespace-file-list.md b/docs/commands/dropbox-team-namespace-file-list.md
index a419643f4..019a303f7 100644
--- a/docs/commands/dropbox-team-namespace-file-list.md
+++ b/docs/commands/dropbox-team-namespace-file-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-namespace-file-size.md b/docs/commands/dropbox-team-namespace-file-size.md
index 9ec71ff65..25f53c63d 100644
--- a/docs/commands/dropbox-team-namespace-file-size.md
+++ b/docs/commands/dropbox-team-namespace-file-size.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-namespace-list.md b/docs/commands/dropbox-team-namespace-list.md
index 39aa64058..d25410564 100644
--- a/docs/commands/dropbox-team-namespace-list.md
+++ b/docs/commands/dropbox-team-namespace-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-namespace-member-list.md b/docs/commands/dropbox-team-namespace-member-list.md
index 1f520b8ed..fa61885cb 100644
--- a/docs/commands/dropbox-team-namespace-member-list.md
+++ b/docs/commands/dropbox-team-namespace-member-list.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-namespace-summary.md b/docs/commands/dropbox-team-namespace-summary.md
index defe7443a..39909f31f 100644
--- a/docs/commands/dropbox-team-namespace-summary.md
+++ b/docs/commands/dropbox-team-namespace-summary.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-report-activity.md b/docs/commands/dropbox-team-report-activity.md
index d4d72f40d..4dcea5678 100644
--- a/docs/commands/dropbox-team-report-activity.md
+++ b/docs/commands/dropbox-team-report-activity.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-report-devices.md b/docs/commands/dropbox-team-report-devices.md
index a30588bd2..b6f4e482e 100644
--- a/docs/commands/dropbox-team-report-devices.md
+++ b/docs/commands/dropbox-team-report-devices.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-report-membership.md b/docs/commands/dropbox-team-report-membership.md
index 0604859ed..a4a556a1a 100644
--- a/docs/commands/dropbox-team-report-membership.md
+++ b/docs/commands/dropbox-team-report-membership.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-report-storage.md b/docs/commands/dropbox-team-report-storage.md
index 473c1972b..af0ceafaf 100644
--- a/docs/commands/dropbox-team-report-storage.md
+++ b/docs/commands/dropbox-team-report-storage.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-file-batch-copy.md b/docs/commands/dropbox-team-runas-file-batch-copy.md
index e60c93cfa..2afe0ed9a 100644
--- a/docs/commands/dropbox-team-runas-file-batch-copy.md
+++ b/docs/commands/dropbox-team-runas-file-batch-copy.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-file-list.md b/docs/commands/dropbox-team-runas-file-list.md
index c95944206..1cb52df94 100644
--- a/docs/commands/dropbox-team-runas-file-list.md
+++ b/docs/commands/dropbox-team-runas-file-list.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-file-sync-batch-up.md b/docs/commands/dropbox-team-runas-file-sync-batch-up.md
index ac80e6aa7..9a694a51d 100644
--- a/docs/commands/dropbox-team-runas-file-sync-batch-up.md
+++ b/docs/commands/dropbox-team-runas-file-sync-batch-up.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-sharedfolder-batch-leave.md b/docs/commands/dropbox-team-runas-sharedfolder-batch-leave.md
index 49c9a9c13..15e4e215c 100644
--- a/docs/commands/dropbox-team-runas-sharedfolder-batch-leave.md
+++ b/docs/commands/dropbox-team-runas-sharedfolder-batch-leave.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-sharedfolder-batch-share.md b/docs/commands/dropbox-team-runas-sharedfolder-batch-share.md
index dced41d4a..804f5469e 100644
--- a/docs/commands/dropbox-team-runas-sharedfolder-batch-share.md
+++ b/docs/commands/dropbox-team-runas-sharedfolder-batch-share.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-sharedfolder-batch-unshare.md b/docs/commands/dropbox-team-runas-sharedfolder-batch-unshare.md
index 0f88ad888..b22324701 100644
--- a/docs/commands/dropbox-team-runas-sharedfolder-batch-unshare.md
+++ b/docs/commands/dropbox-team-runas-sharedfolder-batch-unshare.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-sharedfolder-isolate.md b/docs/commands/dropbox-team-runas-sharedfolder-isolate.md
index f9114f9c9..05bdb4d9d 100644
--- a/docs/commands/dropbox-team-runas-sharedfolder-isolate.md
+++ b/docs/commands/dropbox-team-runas-sharedfolder-isolate.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-sharedfolder-list.md b/docs/commands/dropbox-team-runas-sharedfolder-list.md
index 1a28d321a..88d5aa183 100644
--- a/docs/commands/dropbox-team-runas-sharedfolder-list.md
+++ b/docs/commands/dropbox-team-runas-sharedfolder-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-sharedfolder-member-batch-add.md b/docs/commands/dropbox-team-runas-sharedfolder-member-batch-add.md
index 24ce0fde2..e97f298f2 100644
--- a/docs/commands/dropbox-team-runas-sharedfolder-member-batch-add.md
+++ b/docs/commands/dropbox-team-runas-sharedfolder-member-batch-add.md
@@ -50,6 +50,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-sharedfolder-member-batch-delete.md b/docs/commands/dropbox-team-runas-sharedfolder-member-batch-delete.md
index f352cc2e4..e02418420 100644
--- a/docs/commands/dropbox-team-runas-sharedfolder-member-batch-delete.md
+++ b/docs/commands/dropbox-team-runas-sharedfolder-member-batch-delete.md
@@ -50,6 +50,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-sharedfolder-mount-add.md b/docs/commands/dropbox-team-runas-sharedfolder-mount-add.md
index 2d377aa7e..d3bb6c85e 100644
--- a/docs/commands/dropbox-team-runas-sharedfolder-mount-add.md
+++ b/docs/commands/dropbox-team-runas-sharedfolder-mount-add.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-sharedfolder-mount-delete.md b/docs/commands/dropbox-team-runas-sharedfolder-mount-delete.md
index 27925a742..5ce676b02 100644
--- a/docs/commands/dropbox-team-runas-sharedfolder-mount-delete.md
+++ b/docs/commands/dropbox-team-runas-sharedfolder-mount-delete.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-sharedfolder-mount-list.md b/docs/commands/dropbox-team-runas-sharedfolder-mount-list.md
index 28f346fe4..ea0384d98 100644
--- a/docs/commands/dropbox-team-runas-sharedfolder-mount-list.md
+++ b/docs/commands/dropbox-team-runas-sharedfolder-mount-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-runas-sharedfolder-mount-mountable.md b/docs/commands/dropbox-team-runas-sharedfolder-mount-mountable.md
index 44fd13472..3862122e2 100644
--- a/docs/commands/dropbox-team-runas-sharedfolder-mount-mountable.md
+++ b/docs/commands/dropbox-team-runas-sharedfolder-mount-mountable.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-sharedlink-cap-expiry.md b/docs/commands/dropbox-team-sharedlink-cap-expiry.md
index 917da9814..4186e1d82 100644
--- a/docs/commands/dropbox-team-sharedlink-cap-expiry.md
+++ b/docs/commands/dropbox-team-sharedlink-cap-expiry.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-sharedlink-cap-visibility.md b/docs/commands/dropbox-team-sharedlink-cap-visibility.md
index d31c0b0a6..c35ac359b 100644
--- a/docs/commands/dropbox-team-sharedlink-cap-visibility.md
+++ b/docs/commands/dropbox-team-sharedlink-cap-visibility.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-sharedlink-delete-links.md b/docs/commands/dropbox-team-sharedlink-delete-links.md
index b0c7fd72f..7e947f7e3 100644
--- a/docs/commands/dropbox-team-sharedlink-delete-links.md
+++ b/docs/commands/dropbox-team-sharedlink-delete-links.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-sharedlink-delete-member.md b/docs/commands/dropbox-team-sharedlink-delete-member.md
index 781313909..ebcd86522 100644
--- a/docs/commands/dropbox-team-sharedlink-delete-member.md
+++ b/docs/commands/dropbox-team-sharedlink-delete-member.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-sharedlink-list.md b/docs/commands/dropbox-team-sharedlink-list.md
index a21bb086a..8255b1cf9 100644
--- a/docs/commands/dropbox-team-sharedlink-list.md
+++ b/docs/commands/dropbox-team-sharedlink-list.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-sharedlink-update-expiry.md b/docs/commands/dropbox-team-sharedlink-update-expiry.md
index 777bfb8bc..93652a599 100644
--- a/docs/commands/dropbox-team-sharedlink-update-expiry.md
+++ b/docs/commands/dropbox-team-sharedlink-update-expiry.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-sharedlink-update-password.md b/docs/commands/dropbox-team-sharedlink-update-password.md
index 6692b92b8..b2ecb62cf 100644
--- a/docs/commands/dropbox-team-sharedlink-update-password.md
+++ b/docs/commands/dropbox-team-sharedlink-update-password.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-sharedlink-update-visibility.md b/docs/commands/dropbox-team-sharedlink-update-visibility.md
index a0146aa3f..a6d090538 100644
--- a/docs/commands/dropbox-team-sharedlink-update-visibility.md
+++ b/docs/commands/dropbox-team-sharedlink-update-visibility.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-add.md b/docs/commands/dropbox-team-teamfolder-add.md
index e1608bdba..977df7681 100644
--- a/docs/commands/dropbox-team-teamfolder-add.md
+++ b/docs/commands/dropbox-team-teamfolder-add.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-archive.md b/docs/commands/dropbox-team-teamfolder-archive.md
index 548b9e3ac..76ca524e8 100644
--- a/docs/commands/dropbox-team-teamfolder-archive.md
+++ b/docs/commands/dropbox-team-teamfolder-archive.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-batch-archive.md b/docs/commands/dropbox-team-teamfolder-batch-archive.md
index 21f020c15..164b0b39f 100644
--- a/docs/commands/dropbox-team-teamfolder-batch-archive.md
+++ b/docs/commands/dropbox-team-teamfolder-batch-archive.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-batch-permdelete.md b/docs/commands/dropbox-team-teamfolder-batch-permdelete.md
index 4f1e83a76..e501fc75e 100644
--- a/docs/commands/dropbox-team-teamfolder-batch-permdelete.md
+++ b/docs/commands/dropbox-team-teamfolder-batch-permdelete.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-batch-replication.md b/docs/commands/dropbox-team-teamfolder-batch-replication.md
index ccbccfec1..6c4975b3c 100644
--- a/docs/commands/dropbox-team-teamfolder-batch-replication.md
+++ b/docs/commands/dropbox-team-teamfolder-batch-replication.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-file-list.md b/docs/commands/dropbox-team-teamfolder-file-list.md
index 5b713d240..20ac8527d 100644
--- a/docs/commands/dropbox-team-teamfolder-file-list.md
+++ b/docs/commands/dropbox-team-teamfolder-file-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-file-lock-all-release.md b/docs/commands/dropbox-team-teamfolder-file-lock-all-release.md
index 3beafc3a1..89ca406ef 100644
--- a/docs/commands/dropbox-team-teamfolder-file-lock-all-release.md
+++ b/docs/commands/dropbox-team-teamfolder-file-lock-all-release.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-file-lock-list.md b/docs/commands/dropbox-team-teamfolder-file-lock-list.md
index b818d50b1..e22033a3a 100644
--- a/docs/commands/dropbox-team-teamfolder-file-lock-list.md
+++ b/docs/commands/dropbox-team-teamfolder-file-lock-list.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-file-lock-release.md b/docs/commands/dropbox-team-teamfolder-file-lock-release.md
index 20deb33de..aefc89dc6 100644
--- a/docs/commands/dropbox-team-teamfolder-file-lock-release.md
+++ b/docs/commands/dropbox-team-teamfolder-file-lock-release.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-file-size.md b/docs/commands/dropbox-team-teamfolder-file-size.md
index 61a71ee7b..d4431ef3e 100644
--- a/docs/commands/dropbox-team-teamfolder-file-size.md
+++ b/docs/commands/dropbox-team-teamfolder-file-size.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-list.md b/docs/commands/dropbox-team-teamfolder-list.md
index f9b8ed5a3..067e722c9 100644
--- a/docs/commands/dropbox-team-teamfolder-list.md
+++ b/docs/commands/dropbox-team-teamfolder-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-member-add.md b/docs/commands/dropbox-team-teamfolder-member-add.md
index 8befc67d3..b38c3c792 100644
--- a/docs/commands/dropbox-team-teamfolder-member-add.md
+++ b/docs/commands/dropbox-team-teamfolder-member-add.md
@@ -52,6 +52,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-member-delete.md b/docs/commands/dropbox-team-teamfolder-member-delete.md
index b2699963c..b658dad21 100644
--- a/docs/commands/dropbox-team-teamfolder-member-delete.md
+++ b/docs/commands/dropbox-team-teamfolder-member-delete.md
@@ -52,6 +52,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-member-list.md b/docs/commands/dropbox-team-teamfolder-member-list.md
index edfe0af44..e5b143a1b 100644
--- a/docs/commands/dropbox-team-teamfolder-member-list.md
+++ b/docs/commands/dropbox-team-teamfolder-member-list.md
@@ -50,6 +50,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-partial-replication.md b/docs/commands/dropbox-team-teamfolder-partial-replication.md
index 9afeaa780..5193ad5f7 100644
--- a/docs/commands/dropbox-team-teamfolder-partial-replication.md
+++ b/docs/commands/dropbox-team-teamfolder-partial-replication.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-permdelete.md b/docs/commands/dropbox-team-teamfolder-permdelete.md
index cecd4b8de..395b96385 100644
--- a/docs/commands/dropbox-team-teamfolder-permdelete.md
+++ b/docs/commands/dropbox-team-teamfolder-permdelete.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-policy-list.md b/docs/commands/dropbox-team-teamfolder-policy-list.md
index b7db5534d..4a6b48bd4 100644
--- a/docs/commands/dropbox-team-teamfolder-policy-list.md
+++ b/docs/commands/dropbox-team-teamfolder-policy-list.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-replication.md b/docs/commands/dropbox-team-teamfolder-replication.md
index 29a27dc3e..362b3097c 100644
--- a/docs/commands/dropbox-team-teamfolder-replication.md
+++ b/docs/commands/dropbox-team-teamfolder-replication.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-sync-setting-list.md b/docs/commands/dropbox-team-teamfolder-sync-setting-list.md
index 5bc88a3e5..e200636cb 100644
--- a/docs/commands/dropbox-team-teamfolder-sync-setting-list.md
+++ b/docs/commands/dropbox-team-teamfolder-sync-setting-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/dropbox-team-teamfolder-sync-setting-update.md b/docs/commands/dropbox-team-teamfolder-sync-setting-update.md
index 4df1759b6..fa914dc9b 100644
--- a/docs/commands/dropbox-team-teamfolder-sync-setting-update.md
+++ b/docs/commands/dropbox-team-teamfolder-sync-setting-update.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/commands/figma-account-info.md b/docs/commands/figma-account-info.md
index eea98b365..81093ab34 100644
--- a/docs/commands/figma-account-info.md
+++ b/docs/commands/figma-account-info.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/commands/figma-file-export-all-page.md b/docs/commands/figma-file-export-all-page.md
index a10477e25..78e10b713 100644
--- a/docs/commands/figma-file-export-all-page.md
+++ b/docs/commands/figma-file-export-all-page.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/commands/figma-file-export-frame.md b/docs/commands/figma-file-export-frame.md
index 410af875f..338681795 100644
--- a/docs/commands/figma-file-export-frame.md
+++ b/docs/commands/figma-file-export-frame.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/commands/figma-file-export-node.md b/docs/commands/figma-file-export-node.md
index 1137bcfa8..77b8d903d 100644
--- a/docs/commands/figma-file-export-node.md
+++ b/docs/commands/figma-file-export-node.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/commands/figma-file-export-page.md b/docs/commands/figma-file-export-page.md
index 600a46e9e..e3342d45d 100644
--- a/docs/commands/figma-file-export-page.md
+++ b/docs/commands/figma-file-export-page.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/commands/figma-file-info.md b/docs/commands/figma-file-info.md
index 8dd43d36a..d3477bec0 100644
--- a/docs/commands/figma-file-info.md
+++ b/docs/commands/figma-file-info.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/commands/figma-file-list.md b/docs/commands/figma-file-list.md
index cc5dca083..843f0e893 100644
--- a/docs/commands/figma-file-list.md
+++ b/docs/commands/figma-file-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/commands/figma-project-list.md b/docs/commands/figma-project-list.md
index d04ac19ca..8344fbe3d 100644
--- a/docs/commands/figma-project-list.md
+++ b/docs/commands/figma-project-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/commands/github-content-get.md b/docs/commands/github-content-get.md
index 1fff97bd0..040506d4d 100644
--- a/docs/commands/github-content-get.md
+++ b/docs/commands/github-content-get.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/github-content-put.md b/docs/commands/github-content-put.md
index 64364a04a..084c99ca4 100644
--- a/docs/commands/github-content-put.md
+++ b/docs/commands/github-content-put.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/github-issue-list.md b/docs/commands/github-issue-list.md
index 034548202..e52da917d 100644
--- a/docs/commands/github-issue-list.md
+++ b/docs/commands/github-issue-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/github-profile.md b/docs/commands/github-profile.md
index 4152c0f25..335c4d9ab 100644
--- a/docs/commands/github-profile.md
+++ b/docs/commands/github-profile.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/github-release-asset-download.md b/docs/commands/github-release-asset-download.md
index bf7661e3c..ad3adbe17 100644
--- a/docs/commands/github-release-asset-download.md
+++ b/docs/commands/github-release-asset-download.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/github-release-asset-list.md b/docs/commands/github-release-asset-list.md
index e072038a7..523a63232 100644
--- a/docs/commands/github-release-asset-list.md
+++ b/docs/commands/github-release-asset-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/github-release-asset-upload.md b/docs/commands/github-release-asset-upload.md
index 26b5fa219..04c641683 100644
--- a/docs/commands/github-release-asset-upload.md
+++ b/docs/commands/github-release-asset-upload.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/github-release-draft.md b/docs/commands/github-release-draft.md
index ca8710e39..f0db61032 100644
--- a/docs/commands/github-release-draft.md
+++ b/docs/commands/github-release-draft.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/github-release-list.md b/docs/commands/github-release-list.md
index f2e694db4..e9b576f1d 100644
--- a/docs/commands/github-release-list.md
+++ b/docs/commands/github-release-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/github-tag-create.md b/docs/commands/github-tag-create.md
index 199f79b69..3ed6920c8 100644
--- a/docs/commands/github-tag-create.md
+++ b/docs/commands/github-tag-create.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/slack-conversation-history.md b/docs/commands/slack-conversation-history.md
index e3fa2ef58..c6a89e0f0 100644
--- a/docs/commands/slack-conversation-history.md
+++ b/docs/commands/slack-conversation-history.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://slack.com/oauth/v2/authorize?client_id=&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=channels%3Aread&state=xxxxxxxx
diff --git a/docs/commands/slack-conversation-list.md b/docs/commands/slack-conversation-list.md
index 6b15c2158..80ae1e917 100644
--- a/docs/commands/slack-conversation-list.md
+++ b/docs/commands/slack-conversation-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://slack.com/oauth/v2/authorize?client_id=&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=channels%3Aread&state=xxxxxxxx
diff --git a/docs/commands/toc.md b/docs/commands/toc.md
index 07ea49079..5c4e5ef82 100644
--- a/docs/commands/toc.md
+++ b/docs/commands/toc.md
@@ -297,11 +297,6 @@ lang: en
| [util text case up]({{ site.baseurl }}/commands/util-text-case-up.html) | Print upper case text |
| [util text encoding from]({{ site.baseurl }}/commands/util-text-encoding-from.html) | Convert text encoding to UTF-8 text file from specified encoding. |
| [util text encoding to]({{ site.baseurl }}/commands/util-text-encoding-to.html) | Convert text encoding to specified encoding from UTF-8 text file. |
-| [util text nlp english entity]({{ site.baseurl }}/commands/util-text-nlp-english-entity.html) | Split English text into entities |
-| [util text nlp english sentence]({{ site.baseurl }}/commands/util-text-nlp-english-sentence.html) | Split English text into sentences |
-| [util text nlp english token]({{ site.baseurl }}/commands/util-text-nlp-english-token.html) | Split English text into tokens |
-| [util text nlp japanese token]({{ site.baseurl }}/commands/util-text-nlp-japanese-token.html) | Tokenize Japanese text |
-| [util text nlp japanese wakati]({{ site.baseurl }}/commands/util-text-nlp-japanese-wakati.html) | Wakachigaki (tokenize Japanese text) |
| [util tidy move dispatch]({{ site.baseurl }}/commands/util-tidy-move-dispatch.html) | Dispatch files |
| [util tidy move simple]({{ site.baseurl }}/commands/util-tidy-move-simple.html) | Archive local files |
| [util time now]({{ site.baseurl }}/commands/util-time-now.html) | Display current time |
diff --git a/docs/commands/util-release-install.md b/docs/commands/util-release-install.md
index 03a9be0a9..4653524bc 100644
--- a/docs/commands/util-release-install.md
+++ b/docs/commands/util-release-install.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
Opening the authorization URL:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/commands/util-text-nlp-english-entity.md b/docs/commands/util-text-nlp-english-entity.md
deleted file mode 100644
index 9f125e713..000000000
--- a/docs/commands/util-text-nlp-english-entity.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-layout: command
-title: Command `util text nlp english entity` will be discontinued
-lang: en
----
-
-# Command `util text nlp english entity` will be deprecated
-
-The command `util text nlp english entity` will be deprecated.
-This command is available during the transition period for builds released before 2025-07-30T15:00:00Z. If you are using this version of the program, this command will remain available after this date.
-
-For more details, please see the [announcement](https://github.com/watermint/toolbox/discussions/905).
-
-
diff --git a/docs/commands/util-text-nlp-english-sentence.md b/docs/commands/util-text-nlp-english-sentence.md
deleted file mode 100644
index 07710bb4c..000000000
--- a/docs/commands/util-text-nlp-english-sentence.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-layout: command
-title: Command `util text nlp english sentence` will be discontinued
-lang: en
----
-
-# Command `util text nlp english sentence` will be deprecated
-
-The command `util text nlp english sentence` will be deprecated.
-This command is available during the transition period for builds released before 2025-07-30T15:00:00Z. If you are using this version of the program, this command will remain available after this date.
-
-For more details, please see the [announcement](https://github.com/watermint/toolbox/discussions/905).
-
-
diff --git a/docs/commands/util-text-nlp-english-token.md b/docs/commands/util-text-nlp-english-token.md
deleted file mode 100644
index 4af6673d3..000000000
--- a/docs/commands/util-text-nlp-english-token.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-layout: command
-title: Command `util text nlp english token` will be discontinued
-lang: en
----
-
-# Command `util text nlp english token` will be deprecated
-
-The command `util text nlp english token` will be deprecated.
-This command is available during the transition period for builds released before 2025-07-30T15:00:00Z. If you are using this version of the program, this command will remain available after this date.
-
-For more details, please see the [announcement](https://github.com/watermint/toolbox/discussions/905).
-
-
diff --git a/docs/commands/util-text-nlp-japanese-token.md b/docs/commands/util-text-nlp-japanese-token.md
deleted file mode 100644
index d7e2bbdf1..000000000
--- a/docs/commands/util-text-nlp-japanese-token.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-layout: command
-title: Command `util text nlp japanese token` will be discontinued
-lang: en
----
-
-# Command `util text nlp japanese token` will be deprecated
-
-The command `util text nlp japanese token` will be deprecated.
-This command is available during the transition period for builds released before 2025-07-30T15:00:00Z. If you are using this version of the program, this command will remain available after this date.
-
-For more details, please see the [announcement](https://github.com/watermint/toolbox/discussions/905).
-
-
diff --git a/docs/commands/util-text-nlp-japanese-wakati.md b/docs/commands/util-text-nlp-japanese-wakati.md
deleted file mode 100644
index e834db983..000000000
--- a/docs/commands/util-text-nlp-japanese-wakati.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-layout: command
-title: Command `util text nlp japanese wakati` will be discontinued
-lang: en
----
-
-# Command `util text nlp japanese wakati` will be deprecated
-
-The command `util text nlp japanese wakati` will be deprecated.
-This command is available during the transition period for builds released before 2025-07-30T15:00:00Z. If you are using this version of the program, this command will remain available after this date.
-
-For more details, please see the [announcement](https://github.com/watermint/toolbox/discussions/905).
-
-
diff --git a/docs/commands/util-tidy-pack-remote.md b/docs/commands/util-tidy-pack-remote.md
index f2c486098..87f60398f 100644
--- a/docs/commands/util-tidy-pack-remote.md
+++ b/docs/commands/util-tidy-pack-remote.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
Licensed under open source licenses. Use the `license` command for more detail.
+This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911
+
1. Visit the URL for the auth dialogue:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/guides/spec-change.md b/docs/guides/spec-change.md
index 184e0778a..a89f864a6 100644
--- a/docs/guides/spec-change.md
+++ b/docs/guides/spec-change.md
@@ -17,12 +17,7 @@ Details about path changes in the spec
Details about prune changes in the spec
-| CLI path for prune | Description of prune | Prune after build date |
-|----------------------------------------------------------------------------------------|--------------------------------------|------------------------|
-| [util text nlp english entity](https://github.com/watermint/toolbox/discussions/905) | Split English text into entities | 2025-07-30T15:00:00Z |
-| [util text nlp english sentence](https://github.com/watermint/toolbox/discussions/905) | Split English text into sentences | 2025-07-30T15:00:00Z |
-| [util text nlp english token](https://github.com/watermint/toolbox/discussions/905) | Split English text into tokens | 2025-07-30T15:00:00Z |
-| [util text nlp japanese token](https://github.com/watermint/toolbox/discussions/905) | Tokenize Japanese text | 2025-07-30T15:00:00Z |
-| [util text nlp japanese wakati](https://github.com/watermint/toolbox/discussions/905) | Wakachigaki (tokenize Japanese text) | 2025-07-30T15:00:00Z |
+| CLI path for prune | Description of prune | Prune after build date |
+|--------------------|----------------------|------------------------|
diff --git a/docs/home.md b/docs/home.md
index 7dc472978..95b0179fd 100644
--- a/docs/home.md
+++ b/docs/home.md
@@ -6,7 +6,7 @@ The multi-purpose utility command-line tool for web services including Dropbox,
# Do more with the watermint toolbox
-The watermint toolbox has 277 commands to solve your daily tasks. For example, if you are an admin of Dropbox for teams and need to manage a group. You can bulk create groups or bulk add members to groups via group commands.
+The watermint toolbox has 272 commands to solve your daily tasks. For example, if you are an admin of Dropbox for teams and need to manage a group. You can bulk create groups or bulk add members to groups via group commands.

@@ -41,8 +41,8 @@ Please carefully note:
# Announcements
+* [#911 watermint toolbox will no longer be actively maintained](https://github.com/watermint/toolbox/discussions/911)
* [#906 AI Powered Q&A Bot on ChatGPT](https://github.com/watermint/toolbox/discussions/906)
-* [#905 Deprecation: Some of utilities command will be removed after release of 2025-08-01](https://github.com/watermint/toolbox/discussions/905)
# Security and privacy
diff --git a/docs/index.html b/docs/index.html
index 9d529e2da..8cdbfcc8a 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -16,6 +16,19 @@
{% include anchor_headings.html html=home_content beforeHeading=true anchorBody='' %}
+
+ {% include anchor_headings.html html='
Q&A Chatbot
' beforeHeading=true anchorBody='
' %}
+
Need help with watermint toolbox commands and options? Try our AI-powered Q&A chatbot that can answer questions based on the knowledge of all commands and their options.
+
Ask the watermint toolbox Q&A chatbot
+
+
+
+ {% include anchor_headings.html html='
Project Status
' beforeHeading=true anchorBody='
' %}
+
+
Important Notice: watermint toolbox is no longer actively maintained as of August 2025. The program will continue to function as before, but no new features, API updates, or bug fixes will be implemented. Only minimal security updates may be provided as needed. Please consider alternative options for future use. Read the full announcement.
+
+
+
{% include anchor_headings.html html='
Recent releases
' beforeHeading=true anchorBody='
' %}
diff --git a/docs/ja/commands/asana-team-list.md b/docs/ja/commands/asana-team-list.md
index 7f8bb0b54..5b42ab568 100644
--- a/docs/ja/commands/asana-team-list.md
+++ b/docs/ja/commands/asana-team-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://app.asana.com/-/oauth_authorize?client_id=xxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=default&state=xxxxxxxx
diff --git a/docs/ja/commands/asana-team-project-list.md b/docs/ja/commands/asana-team-project-list.md
index fc3b4f0a5..b5a197890 100644
--- a/docs/ja/commands/asana-team-project-list.md
+++ b/docs/ja/commands/asana-team-project-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://app.asana.com/-/oauth_authorize?client_id=xxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=default&state=xxxxxxxx
diff --git a/docs/ja/commands/asana-team-task-list.md b/docs/ja/commands/asana-team-task-list.md
index 7c1ae94a5..b936c9b8a 100644
--- a/docs/ja/commands/asana-team-task-list.md
+++ b/docs/ja/commands/asana-team-task-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://app.asana.com/-/oauth_authorize?client_id=xxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=default&state=xxxxxxxx
diff --git a/docs/ja/commands/asana-workspace-list.md b/docs/ja/commands/asana-workspace-list.md
index 80a53d127..d3892a69b 100644
--- a/docs/ja/commands/asana-workspace-list.md
+++ b/docs/ja/commands/asana-workspace-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://app.asana.com/-/oauth_authorize?client_id=xxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=default&state=xxxxxxxx
diff --git a/docs/ja/commands/asana-workspace-project-list.md b/docs/ja/commands/asana-workspace-project-list.md
index 1cce33621..8566e10b0 100644
--- a/docs/ja/commands/asana-workspace-project-list.md
+++ b/docs/ja/commands/asana-workspace-project-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://app.asana.com/-/oauth_authorize?client_id=xxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=default&state=xxxxxxxx
diff --git a/docs/ja/commands/deepl-translate-text.md b/docs/ja/commands/deepl-translate-text.md
index 9348e8d1f..822d03311 100644
--- a/docs/ja/commands/deepl-translate-text.md
+++ b/docs/ja/commands/deepl-translate-text.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
APIキーを入力してください。
```
diff --git a/docs/ja/commands/dev-benchmark-upload.md b/docs/ja/commands/dev-benchmark-upload.md
index 694dee96c..3980a8cdc 100644
--- a/docs/ja/commands/dev-benchmark-upload.md
+++ b/docs/ja/commands/dev-benchmark-upload.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dev-benchmark-uploadlink.md b/docs/ja/commands/dev-benchmark-uploadlink.md
index fd7d63c60..43d60c3f6 100644
--- a/docs/ja/commands/dev-benchmark-uploadlink.md
+++ b/docs/ja/commands/dev-benchmark-uploadlink.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dev-license-issue.md b/docs/ja/commands/dev-license-issue.md
index ad7f83f17..da5efd347 100644
--- a/docs/ja/commands/dev-license-issue.md
+++ b/docs/ja/commands/dev-license-issue.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/dev-lifecycle-assets.md b/docs/ja/commands/dev-lifecycle-assets.md
index 02a884355..ef9af16ea 100644
--- a/docs/ja/commands/dev-lifecycle-assets.md
+++ b/docs/ja/commands/dev-lifecycle-assets.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/dev-release-announcement.md b/docs/ja/commands/dev-release-announcement.md
index c77225d5f..e575c97f1 100644
--- a/docs/ja/commands/dev-release-announcement.md
+++ b/docs/ja/commands/dev-release-announcement.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/dev-release-asset.md b/docs/ja/commands/dev-release-asset.md
index 770b23105..d57bf3496 100644
--- a/docs/ja/commands/dev-release-asset.md
+++ b/docs/ja/commands/dev-release-asset.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/dev-release-asseturl.md b/docs/ja/commands/dev-release-asseturl.md
index 168b081e3..c1bae0d5b 100644
--- a/docs/ja/commands/dev-release-asseturl.md
+++ b/docs/ja/commands/dev-release-asseturl.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/dev-release-candidate.md b/docs/ja/commands/dev-release-candidate.md
index 000bcf31c..c6056923d 100644
--- a/docs/ja/commands/dev-release-candidate.md
+++ b/docs/ja/commands/dev-release-candidate.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/dev-release-checkin.md b/docs/ja/commands/dev-release-checkin.md
index c297cdf56..5a06a689e 100644
--- a/docs/ja/commands/dev-release-checkin.md
+++ b/docs/ja/commands/dev-release-checkin.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/dev-release-doc.md b/docs/ja/commands/dev-release-doc.md
index 1dc899afd..13a0ebea2 100644
--- a/docs/ja/commands/dev-release-doc.md
+++ b/docs/ja/commands/dev-release-doc.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/dev-release-publish.md b/docs/ja/commands/dev-release-publish.md
index 06cdd3dfa..992b1dedb 100644
--- a/docs/ja/commands/dev-release-publish.md
+++ b/docs/ja/commands/dev-release-publish.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-account-feature.md b/docs/ja/commands/dropbox-file-account-feature.md
index 982b093c4..b910a5e1f 100644
--- a/docs/ja/commands/dropbox-file-account-feature.md
+++ b/docs/ja/commands/dropbox-file-account-feature.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-account-filesystem.md b/docs/ja/commands/dropbox-file-account-filesystem.md
index bf640b8b8..3a8d2c438 100644
--- a/docs/ja/commands/dropbox-file-account-filesystem.md
+++ b/docs/ja/commands/dropbox-file-account-filesystem.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-account-info.md b/docs/ja/commands/dropbox-file-account-info.md
index 4999ca39e..ef0abc3c2 100644
--- a/docs/ja/commands/dropbox-file-account-info.md
+++ b/docs/ja/commands/dropbox-file-account-info.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-compare-account.md b/docs/ja/commands/dropbox-file-compare-account.md
index 83557413b..96b202e60 100644
--- a/docs/ja/commands/dropbox-file-compare-account.md
+++ b/docs/ja/commands/dropbox-file-compare-account.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-compare-local.md b/docs/ja/commands/dropbox-file-compare-local.md
index 8e88ebb28..8e01f7d65 100644
--- a/docs/ja/commands/dropbox-file-compare-local.md
+++ b/docs/ja/commands/dropbox-file-compare-local.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-copy.md b/docs/ja/commands/dropbox-file-copy.md
index e8c609bec..89498dbed 100644
--- a/docs/ja/commands/dropbox-file-copy.md
+++ b/docs/ja/commands/dropbox-file-copy.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-delete.md b/docs/ja/commands/dropbox-file-delete.md
index 33f3bdbaf..c45f36299 100644
--- a/docs/ja/commands/dropbox-file-delete.md
+++ b/docs/ja/commands/dropbox-file-delete.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-export-doc.md b/docs/ja/commands/dropbox-file-export-doc.md
index 29e039506..2d8528d49 100644
--- a/docs/ja/commands/dropbox-file-export-doc.md
+++ b/docs/ja/commands/dropbox-file-export-doc.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-export-url.md b/docs/ja/commands/dropbox-file-export-url.md
index 4f2e0e7e5..a834bb87c 100644
--- a/docs/ja/commands/dropbox-file-export-url.md
+++ b/docs/ja/commands/dropbox-file-export-url.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-import-batch-url.md b/docs/ja/commands/dropbox-file-import-batch-url.md
index d1d5f90cb..d3b723c4b 100644
--- a/docs/ja/commands/dropbox-file-import-batch-url.md
+++ b/docs/ja/commands/dropbox-file-import-batch-url.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-import-url.md b/docs/ja/commands/dropbox-file-import-url.md
index a450434c2..a96a7688e 100644
--- a/docs/ja/commands/dropbox-file-import-url.md
+++ b/docs/ja/commands/dropbox-file-import-url.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-info.md b/docs/ja/commands/dropbox-file-info.md
index 89d1db14b..0205166a2 100644
--- a/docs/ja/commands/dropbox-file-info.md
+++ b/docs/ja/commands/dropbox-file-info.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-list.md b/docs/ja/commands/dropbox-file-list.md
index 0cace4be7..b6947f605 100644
--- a/docs/ja/commands/dropbox-file-list.md
+++ b/docs/ja/commands/dropbox-file-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-lock-acquire.md b/docs/ja/commands/dropbox-file-lock-acquire.md
index b19c5359e..9b0b7074d 100644
--- a/docs/ja/commands/dropbox-file-lock-acquire.md
+++ b/docs/ja/commands/dropbox-file-lock-acquire.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-lock-all-release.md b/docs/ja/commands/dropbox-file-lock-all-release.md
index d892a3bcf..207785efc 100644
--- a/docs/ja/commands/dropbox-file-lock-all-release.md
+++ b/docs/ja/commands/dropbox-file-lock-all-release.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-lock-batch-acquire.md b/docs/ja/commands/dropbox-file-lock-batch-acquire.md
index 5c2316552..b1870f46c 100644
--- a/docs/ja/commands/dropbox-file-lock-batch-acquire.md
+++ b/docs/ja/commands/dropbox-file-lock-batch-acquire.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-lock-batch-release.md b/docs/ja/commands/dropbox-file-lock-batch-release.md
index b6111523c..1d52c18e7 100644
--- a/docs/ja/commands/dropbox-file-lock-batch-release.md
+++ b/docs/ja/commands/dropbox-file-lock-batch-release.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-lock-list.md b/docs/ja/commands/dropbox-file-lock-list.md
index 44c1a9326..21f38c661 100644
--- a/docs/ja/commands/dropbox-file-lock-list.md
+++ b/docs/ja/commands/dropbox-file-lock-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-lock-release.md b/docs/ja/commands/dropbox-file-lock-release.md
index 8b24277d3..37fc9076a 100644
--- a/docs/ja/commands/dropbox-file-lock-release.md
+++ b/docs/ja/commands/dropbox-file-lock-release.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-merge.md b/docs/ja/commands/dropbox-file-merge.md
index 55ac426ac..bdd573b9a 100644
--- a/docs/ja/commands/dropbox-file-merge.md
+++ b/docs/ja/commands/dropbox-file-merge.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-move.md b/docs/ja/commands/dropbox-file-move.md
index cc059328b..fc38fdcb5 100644
--- a/docs/ja/commands/dropbox-file-move.md
+++ b/docs/ja/commands/dropbox-file-move.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-replication.md b/docs/ja/commands/dropbox-file-replication.md
index 583ad33d6..82264d7d5 100644
--- a/docs/ja/commands/dropbox-file-replication.md
+++ b/docs/ja/commands/dropbox-file-replication.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-request-create.md b/docs/ja/commands/dropbox-file-request-create.md
index 52af7d9ca..c5ea42325 100644
--- a/docs/ja/commands/dropbox-file-request-create.md
+++ b/docs/ja/commands/dropbox-file-request-create.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-request-delete-closed.md b/docs/ja/commands/dropbox-file-request-delete-closed.md
index 70c647929..6d754c440 100644
--- a/docs/ja/commands/dropbox-file-request-delete-closed.md
+++ b/docs/ja/commands/dropbox-file-request-delete-closed.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-request-delete-url.md b/docs/ja/commands/dropbox-file-request-delete-url.md
index 4d6d0f629..17163a3c9 100644
--- a/docs/ja/commands/dropbox-file-request-delete-url.md
+++ b/docs/ja/commands/dropbox-file-request-delete-url.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-request-list.md b/docs/ja/commands/dropbox-file-request-list.md
index f3206552d..8a29f837c 100644
--- a/docs/ja/commands/dropbox-file-request-list.md
+++ b/docs/ja/commands/dropbox-file-request-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-restore-all.md b/docs/ja/commands/dropbox-file-restore-all.md
index 0d264238c..e25bd1ccc 100644
--- a/docs/ja/commands/dropbox-file-restore-all.md
+++ b/docs/ja/commands/dropbox-file-restore-all.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-restore-ext.md b/docs/ja/commands/dropbox-file-restore-ext.md
index e085dc9c1..599324e00 100644
--- a/docs/ja/commands/dropbox-file-restore-ext.md
+++ b/docs/ja/commands/dropbox-file-restore-ext.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-revision-download.md b/docs/ja/commands/dropbox-file-revision-download.md
index e278a4821..3af6b5bd0 100644
--- a/docs/ja/commands/dropbox-file-revision-download.md
+++ b/docs/ja/commands/dropbox-file-revision-download.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-revision-list.md b/docs/ja/commands/dropbox-file-revision-list.md
index 76cb8842f..60365f205 100644
--- a/docs/ja/commands/dropbox-file-revision-list.md
+++ b/docs/ja/commands/dropbox-file-revision-list.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-revision-restore.md b/docs/ja/commands/dropbox-file-revision-restore.md
index 874cded4f..0b5c25d96 100644
--- a/docs/ja/commands/dropbox-file-revision-restore.md
+++ b/docs/ja/commands/dropbox-file-revision-restore.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-search-content.md b/docs/ja/commands/dropbox-file-search-content.md
index d5dcfacd4..53750b19e 100644
--- a/docs/ja/commands/dropbox-file-search-content.md
+++ b/docs/ja/commands/dropbox-file-search-content.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-search-name.md b/docs/ja/commands/dropbox-file-search-name.md
index 339e737c6..ae863c9a5 100644
--- a/docs/ja/commands/dropbox-file-search-name.md
+++ b/docs/ja/commands/dropbox-file-search-name.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-share-info.md b/docs/ja/commands/dropbox-file-share-info.md
index 66bfb952a..156ac57cb 100644
--- a/docs/ja/commands/dropbox-file-share-info.md
+++ b/docs/ja/commands/dropbox-file-share-info.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedfolder-info.md b/docs/ja/commands/dropbox-file-sharedfolder-info.md
index 6040378fe..8b7161f79 100644
--- a/docs/ja/commands/dropbox-file-sharedfolder-info.md
+++ b/docs/ja/commands/dropbox-file-sharedfolder-info.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedfolder-leave.md b/docs/ja/commands/dropbox-file-sharedfolder-leave.md
index a0152e11e..a9bd54180 100644
--- a/docs/ja/commands/dropbox-file-sharedfolder-leave.md
+++ b/docs/ja/commands/dropbox-file-sharedfolder-leave.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedfolder-list.md b/docs/ja/commands/dropbox-file-sharedfolder-list.md
index 45875d7a3..07af6df18 100644
--- a/docs/ja/commands/dropbox-file-sharedfolder-list.md
+++ b/docs/ja/commands/dropbox-file-sharedfolder-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedfolder-member-add.md b/docs/ja/commands/dropbox-file-sharedfolder-member-add.md
index b75b7ecd2..cbd0c7f5e 100644
--- a/docs/ja/commands/dropbox-file-sharedfolder-member-add.md
+++ b/docs/ja/commands/dropbox-file-sharedfolder-member-add.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedfolder-member-delete.md b/docs/ja/commands/dropbox-file-sharedfolder-member-delete.md
index 075d025bf..65e5ec4f7 100644
--- a/docs/ja/commands/dropbox-file-sharedfolder-member-delete.md
+++ b/docs/ja/commands/dropbox-file-sharedfolder-member-delete.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedfolder-member-list.md b/docs/ja/commands/dropbox-file-sharedfolder-member-list.md
index 95a7c46d3..97fe9303c 100644
--- a/docs/ja/commands/dropbox-file-sharedfolder-member-list.md
+++ b/docs/ja/commands/dropbox-file-sharedfolder-member-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedfolder-mount-add.md b/docs/ja/commands/dropbox-file-sharedfolder-mount-add.md
index e9833b045..ef6937af4 100644
--- a/docs/ja/commands/dropbox-file-sharedfolder-mount-add.md
+++ b/docs/ja/commands/dropbox-file-sharedfolder-mount-add.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedfolder-mount-delete.md b/docs/ja/commands/dropbox-file-sharedfolder-mount-delete.md
index 6cb663882..16597238f 100644
--- a/docs/ja/commands/dropbox-file-sharedfolder-mount-delete.md
+++ b/docs/ja/commands/dropbox-file-sharedfolder-mount-delete.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedfolder-mount-list.md b/docs/ja/commands/dropbox-file-sharedfolder-mount-list.md
index 7ce9cf79b..3c01f83c5 100644
--- a/docs/ja/commands/dropbox-file-sharedfolder-mount-list.md
+++ b/docs/ja/commands/dropbox-file-sharedfolder-mount-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedfolder-mount-mountable.md b/docs/ja/commands/dropbox-file-sharedfolder-mount-mountable.md
index e7f45fa4a..eac962d6a 100644
--- a/docs/ja/commands/dropbox-file-sharedfolder-mount-mountable.md
+++ b/docs/ja/commands/dropbox-file-sharedfolder-mount-mountable.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedfolder-share.md b/docs/ja/commands/dropbox-file-sharedfolder-share.md
index 4d3376415..ad7e5bdd3 100644
--- a/docs/ja/commands/dropbox-file-sharedfolder-share.md
+++ b/docs/ja/commands/dropbox-file-sharedfolder-share.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedfolder-unshare.md b/docs/ja/commands/dropbox-file-sharedfolder-unshare.md
index fa42dcec9..ac3814211 100644
--- a/docs/ja/commands/dropbox-file-sharedfolder-unshare.md
+++ b/docs/ja/commands/dropbox-file-sharedfolder-unshare.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedlink-create.md b/docs/ja/commands/dropbox-file-sharedlink-create.md
index 1cb3f2df9..a79e541f6 100644
--- a/docs/ja/commands/dropbox-file-sharedlink-create.md
+++ b/docs/ja/commands/dropbox-file-sharedlink-create.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedlink-delete.md b/docs/ja/commands/dropbox-file-sharedlink-delete.md
index b76295477..e5510393f 100644
--- a/docs/ja/commands/dropbox-file-sharedlink-delete.md
+++ b/docs/ja/commands/dropbox-file-sharedlink-delete.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedlink-file-list.md b/docs/ja/commands/dropbox-file-sharedlink-file-list.md
index bfd7af8c7..dbdd16196 100644
--- a/docs/ja/commands/dropbox-file-sharedlink-file-list.md
+++ b/docs/ja/commands/dropbox-file-sharedlink-file-list.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedlink-info.md b/docs/ja/commands/dropbox-file-sharedlink-info.md
index dbe95db93..bc68aba24 100644
--- a/docs/ja/commands/dropbox-file-sharedlink-info.md
+++ b/docs/ja/commands/dropbox-file-sharedlink-info.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sharedlink-list.md b/docs/ja/commands/dropbox-file-sharedlink-list.md
index d86946e37..74b925d2e 100644
--- a/docs/ja/commands/dropbox-file-sharedlink-list.md
+++ b/docs/ja/commands/dropbox-file-sharedlink-list.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-size.md b/docs/ja/commands/dropbox-file-size.md
index e1518505b..149320416 100644
--- a/docs/ja/commands/dropbox-file-size.md
+++ b/docs/ja/commands/dropbox-file-size.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sync-down.md b/docs/ja/commands/dropbox-file-sync-down.md
index ce1e82ab9..21f26148c 100644
--- a/docs/ja/commands/dropbox-file-sync-down.md
+++ b/docs/ja/commands/dropbox-file-sync-down.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sync-online.md b/docs/ja/commands/dropbox-file-sync-online.md
index 1f010e151..883c82347 100644
--- a/docs/ja/commands/dropbox-file-sync-online.md
+++ b/docs/ja/commands/dropbox-file-sync-online.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-sync-up.md b/docs/ja/commands/dropbox-file-sync-up.md
index b83138dc8..de84101ec 100644
--- a/docs/ja/commands/dropbox-file-sync-up.md
+++ b/docs/ja/commands/dropbox-file-sync-up.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-tag-add.md b/docs/ja/commands/dropbox-file-tag-add.md
index 8492c6890..90edd268b 100644
--- a/docs/ja/commands/dropbox-file-tag-add.md
+++ b/docs/ja/commands/dropbox-file-tag-add.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-tag-delete.md b/docs/ja/commands/dropbox-file-tag-delete.md
index f07c16c9f..9b281b88d 100644
--- a/docs/ja/commands/dropbox-file-tag-delete.md
+++ b/docs/ja/commands/dropbox-file-tag-delete.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-tag-list.md b/docs/ja/commands/dropbox-file-tag-list.md
index 790bed442..9af48c4e6 100644
--- a/docs/ja/commands/dropbox-file-tag-list.md
+++ b/docs/ja/commands/dropbox-file-tag-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-template-apply.md b/docs/ja/commands/dropbox-file-template-apply.md
index 531eaf3c2..667528cdd 100644
--- a/docs/ja/commands/dropbox-file-template-apply.md
+++ b/docs/ja/commands/dropbox-file-template-apply.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-template-capture.md b/docs/ja/commands/dropbox-file-template-capture.md
index f176ec13b..46f73fc70 100644
--- a/docs/ja/commands/dropbox-file-template-capture.md
+++ b/docs/ja/commands/dropbox-file-template-capture.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-file-watch.md b/docs/ja/commands/dropbox-file-watch.md
index eb2181653..fb9b1003c 100644
--- a/docs/ja/commands/dropbox-file-watch.md
+++ b/docs/ja/commands/dropbox-file-watch.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-paper-append.md b/docs/ja/commands/dropbox-paper-append.md
index b70b41a75..e954f9bc6 100644
--- a/docs/ja/commands/dropbox-paper-append.md
+++ b/docs/ja/commands/dropbox-paper-append.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-paper-create.md b/docs/ja/commands/dropbox-paper-create.md
index 82334a578..cb414ccab 100644
--- a/docs/ja/commands/dropbox-paper-create.md
+++ b/docs/ja/commands/dropbox-paper-create.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-paper-overwrite.md b/docs/ja/commands/dropbox-paper-overwrite.md
index cf5af1fc7..edd7ae36a 100644
--- a/docs/ja/commands/dropbox-paper-overwrite.md
+++ b/docs/ja/commands/dropbox-paper-overwrite.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-paper-prepend.md b/docs/ja/commands/dropbox-paper-prepend.md
index 33636056a..fe3f08960 100644
--- a/docs/ja/commands/dropbox-paper-prepend.md
+++ b/docs/ja/commands/dropbox-paper-prepend.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-sign-account-info.md b/docs/ja/commands/dropbox-sign-account-info.md
index 6b8439d69..fddf8b1f8 100644
--- a/docs/ja/commands/dropbox-sign-account-info.md
+++ b/docs/ja/commands/dropbox-sign-account-info.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
クレデンシャルを入力してください.
```
diff --git a/docs/ja/commands/dropbox-sign-request-list.md b/docs/ja/commands/dropbox-sign-request-list.md
index e0a10c8f7..97b91eee9 100644
--- a/docs/ja/commands/dropbox-sign-request-list.md
+++ b/docs/ja/commands/dropbox-sign-request-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
クレデンシャルを入力してください.
```
diff --git a/docs/ja/commands/dropbox-sign-request-signature-list.md b/docs/ja/commands/dropbox-sign-request-signature-list.md
index 42bf23446..cb3dcf10f 100644
--- a/docs/ja/commands/dropbox-sign-request-signature-list.md
+++ b/docs/ja/commands/dropbox-sign-request-signature-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
クレデンシャルを入力してください.
```
diff --git a/docs/ja/commands/dropbox-team-activity-batch-user.md b/docs/ja/commands/dropbox-team-activity-batch-user.md
index 585ead0f7..f9f01d631 100644
--- a/docs/ja/commands/dropbox-team-activity-batch-user.md
+++ b/docs/ja/commands/dropbox-team-activity-batch-user.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-activity-daily-event.md b/docs/ja/commands/dropbox-team-activity-daily-event.md
index c9122598d..2ddb81ab0 100644
--- a/docs/ja/commands/dropbox-team-activity-daily-event.md
+++ b/docs/ja/commands/dropbox-team-activity-daily-event.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-activity-event.md b/docs/ja/commands/dropbox-team-activity-event.md
index ec986f97f..def937f22 100644
--- a/docs/ja/commands/dropbox-team-activity-event.md
+++ b/docs/ja/commands/dropbox-team-activity-event.md
@@ -71,6 +71,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-activity-user.md b/docs/ja/commands/dropbox-team-activity-user.md
index 9b14e1f34..a7f643a2e 100644
--- a/docs/ja/commands/dropbox-team-activity-user.md
+++ b/docs/ja/commands/dropbox-team-activity-user.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-admin-group-role-add.md b/docs/ja/commands/dropbox-team-admin-group-role-add.md
index 85511f1de..da6baa917 100644
--- a/docs/ja/commands/dropbox-team-admin-group-role-add.md
+++ b/docs/ja/commands/dropbox-team-admin-group-role-add.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-admin-group-role-delete.md b/docs/ja/commands/dropbox-team-admin-group-role-delete.md
index 22c51c5d4..85d541e55 100644
--- a/docs/ja/commands/dropbox-team-admin-group-role-delete.md
+++ b/docs/ja/commands/dropbox-team-admin-group-role-delete.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-admin-list.md b/docs/ja/commands/dropbox-team-admin-list.md
index 23a738ac8..85f30b562 100644
--- a/docs/ja/commands/dropbox-team-admin-list.md
+++ b/docs/ja/commands/dropbox-team-admin-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-admin-role-add.md b/docs/ja/commands/dropbox-team-admin-role-add.md
index 689a36305..8e47b6791 100644
--- a/docs/ja/commands/dropbox-team-admin-role-add.md
+++ b/docs/ja/commands/dropbox-team-admin-role-add.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-admin-role-clear.md b/docs/ja/commands/dropbox-team-admin-role-clear.md
index ef16fa1d3..6b710903c 100644
--- a/docs/ja/commands/dropbox-team-admin-role-clear.md
+++ b/docs/ja/commands/dropbox-team-admin-role-clear.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-admin-role-delete.md b/docs/ja/commands/dropbox-team-admin-role-delete.md
index 3776a0186..a1d06c4e3 100644
--- a/docs/ja/commands/dropbox-team-admin-role-delete.md
+++ b/docs/ja/commands/dropbox-team-admin-role-delete.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-admin-role-list.md b/docs/ja/commands/dropbox-team-admin-role-list.md
index 5b99c1eae..b898c4aac 100644
--- a/docs/ja/commands/dropbox-team-admin-role-list.md
+++ b/docs/ja/commands/dropbox-team-admin-role-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-backup-device-status.md b/docs/ja/commands/dropbox-team-backup-device-status.md
index d304dfc9d..21e6b4135 100644
--- a/docs/ja/commands/dropbox-team-backup-device-status.md
+++ b/docs/ja/commands/dropbox-team-backup-device-status.md
@@ -52,6 +52,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-content-legacypaper-count.md b/docs/ja/commands/dropbox-team-content-legacypaper-count.md
index 101384fbc..d6c6aafe2 100644
--- a/docs/ja/commands/dropbox-team-content-legacypaper-count.md
+++ b/docs/ja/commands/dropbox-team-content-legacypaper-count.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-content-legacypaper-export.md b/docs/ja/commands/dropbox-team-content-legacypaper-export.md
index 0927e73ab..e156abcd4 100644
--- a/docs/ja/commands/dropbox-team-content-legacypaper-export.md
+++ b/docs/ja/commands/dropbox-team-content-legacypaper-export.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-content-legacypaper-list.md b/docs/ja/commands/dropbox-team-content-legacypaper-list.md
index 3d93c19c6..1875702ce 100644
--- a/docs/ja/commands/dropbox-team-content-legacypaper-list.md
+++ b/docs/ja/commands/dropbox-team-content-legacypaper-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-content-member-list.md b/docs/ja/commands/dropbox-team-content-member-list.md
index 7811456ee..65f72b868 100644
--- a/docs/ja/commands/dropbox-team-content-member-list.md
+++ b/docs/ja/commands/dropbox-team-content-member-list.md
@@ -50,6 +50,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-content-member-size.md b/docs/ja/commands/dropbox-team-content-member-size.md
index 9bede100d..5df83326e 100644
--- a/docs/ja/commands/dropbox-team-content-member-size.md
+++ b/docs/ja/commands/dropbox-team-content-member-size.md
@@ -50,6 +50,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-content-mount-list.md b/docs/ja/commands/dropbox-team-content-mount-list.md
index 54c260fc3..043a995a1 100644
--- a/docs/ja/commands/dropbox-team-content-mount-list.md
+++ b/docs/ja/commands/dropbox-team-content-mount-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-content-policy-list.md b/docs/ja/commands/dropbox-team-content-policy-list.md
index e6d86c81a..ebd045c1c 100644
--- a/docs/ja/commands/dropbox-team-content-policy-list.md
+++ b/docs/ja/commands/dropbox-team-content-policy-list.md
@@ -50,6 +50,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-device-list.md b/docs/ja/commands/dropbox-team-device-list.md
index 9a175b0a4..156fc357c 100644
--- a/docs/ja/commands/dropbox-team-device-list.md
+++ b/docs/ja/commands/dropbox-team-device-list.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-device-unlink.md b/docs/ja/commands/dropbox-team-device-unlink.md
index b64f7c34b..bfa587ab5 100644
--- a/docs/ja/commands/dropbox-team-device-unlink.md
+++ b/docs/ja/commands/dropbox-team-device-unlink.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-feature.md b/docs/ja/commands/dropbox-team-feature.md
index c32272438..e851ec190 100644
--- a/docs/ja/commands/dropbox-team-feature.md
+++ b/docs/ja/commands/dropbox-team-feature.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-filerequest-clone.md b/docs/ja/commands/dropbox-team-filerequest-clone.md
index 5dc7eb51b..ff68f6085 100644
--- a/docs/ja/commands/dropbox-team-filerequest-clone.md
+++ b/docs/ja/commands/dropbox-team-filerequest-clone.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-filerequest-list.md b/docs/ja/commands/dropbox-team-filerequest-list.md
index bbb59273d..7273636b8 100644
--- a/docs/ja/commands/dropbox-team-filerequest-list.md
+++ b/docs/ja/commands/dropbox-team-filerequest-list.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-filesystem.md b/docs/ja/commands/dropbox-team-filesystem.md
index f2d138db3..02fdb4f06 100644
--- a/docs/ja/commands/dropbox-team-filesystem.md
+++ b/docs/ja/commands/dropbox-team-filesystem.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-add.md b/docs/ja/commands/dropbox-team-group-add.md
index 2ebc91105..33b302bd3 100644
--- a/docs/ja/commands/dropbox-team-group-add.md
+++ b/docs/ja/commands/dropbox-team-group-add.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-batch-add.md b/docs/ja/commands/dropbox-team-group-batch-add.md
index 0379dc2fb..5dbd6f8ef 100644
--- a/docs/ja/commands/dropbox-team-group-batch-add.md
+++ b/docs/ja/commands/dropbox-team-group-batch-add.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-batch-delete.md b/docs/ja/commands/dropbox-team-group-batch-delete.md
index e532ceecc..c53c37d1a 100644
--- a/docs/ja/commands/dropbox-team-group-batch-delete.md
+++ b/docs/ja/commands/dropbox-team-group-batch-delete.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-clear-externalid.md b/docs/ja/commands/dropbox-team-group-clear-externalid.md
index 69efcd477..ee3ab6720 100644
--- a/docs/ja/commands/dropbox-team-group-clear-externalid.md
+++ b/docs/ja/commands/dropbox-team-group-clear-externalid.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-delete.md b/docs/ja/commands/dropbox-team-group-delete.md
index 39020f273..e7ebe6250 100644
--- a/docs/ja/commands/dropbox-team-group-delete.md
+++ b/docs/ja/commands/dropbox-team-group-delete.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-folder-list.md b/docs/ja/commands/dropbox-team-group-folder-list.md
index d12ee3172..6dc06c253 100644
--- a/docs/ja/commands/dropbox-team-group-folder-list.md
+++ b/docs/ja/commands/dropbox-team-group-folder-list.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-list.md b/docs/ja/commands/dropbox-team-group-list.md
index 991a6c769..b4b6cbf99 100644
--- a/docs/ja/commands/dropbox-team-group-list.md
+++ b/docs/ja/commands/dropbox-team-group-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-member-add.md b/docs/ja/commands/dropbox-team-group-member-add.md
index 03451d141..b83b69483 100644
--- a/docs/ja/commands/dropbox-team-group-member-add.md
+++ b/docs/ja/commands/dropbox-team-group-member-add.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-member-batch-add.md b/docs/ja/commands/dropbox-team-group-member-batch-add.md
index 833f959e8..b09afde1e 100644
--- a/docs/ja/commands/dropbox-team-group-member-batch-add.md
+++ b/docs/ja/commands/dropbox-team-group-member-batch-add.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-member-batch-delete.md b/docs/ja/commands/dropbox-team-group-member-batch-delete.md
index c19085750..ef40912f7 100644
--- a/docs/ja/commands/dropbox-team-group-member-batch-delete.md
+++ b/docs/ja/commands/dropbox-team-group-member-batch-delete.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-member-batch-update.md b/docs/ja/commands/dropbox-team-group-member-batch-update.md
index fb1ee7a7a..3ee96b922 100644
--- a/docs/ja/commands/dropbox-team-group-member-batch-update.md
+++ b/docs/ja/commands/dropbox-team-group-member-batch-update.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-member-delete.md b/docs/ja/commands/dropbox-team-group-member-delete.md
index 746e1b8f2..4ac0c2e8d 100644
--- a/docs/ja/commands/dropbox-team-group-member-delete.md
+++ b/docs/ja/commands/dropbox-team-group-member-delete.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-member-list.md b/docs/ja/commands/dropbox-team-group-member-list.md
index f5bc2dc89..910070ffb 100644
--- a/docs/ja/commands/dropbox-team-group-member-list.md
+++ b/docs/ja/commands/dropbox-team-group-member-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-rename.md b/docs/ja/commands/dropbox-team-group-rename.md
index 375e867e9..da0df46fb 100644
--- a/docs/ja/commands/dropbox-team-group-rename.md
+++ b/docs/ja/commands/dropbox-team-group-rename.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-group-update-type.md b/docs/ja/commands/dropbox-team-group-update-type.md
index c7a1f5a78..218469578 100644
--- a/docs/ja/commands/dropbox-team-group-update-type.md
+++ b/docs/ja/commands/dropbox-team-group-update-type.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-info.md b/docs/ja/commands/dropbox-team-info.md
index 5c25f25ac..d6628165f 100644
--- a/docs/ja/commands/dropbox-team-info.md
+++ b/docs/ja/commands/dropbox-team-info.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-insight-scan.md b/docs/ja/commands/dropbox-team-insight-scan.md
index 5ac1e30b5..0a2bb2d5e 100644
--- a/docs/ja/commands/dropbox-team-insight-scan.md
+++ b/docs/ja/commands/dropbox-team-insight-scan.md
@@ -62,6 +62,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-insight-scanretry.md b/docs/ja/commands/dropbox-team-insight-scanretry.md
index 380cf5220..f9fa8b961 100644
--- a/docs/ja/commands/dropbox-team-insight-scanretry.md
+++ b/docs/ja/commands/dropbox-team-insight-scanretry.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-legalhold-add.md b/docs/ja/commands/dropbox-team-legalhold-add.md
index d1cf464ed..8842f8382 100644
--- a/docs/ja/commands/dropbox-team-legalhold-add.md
+++ b/docs/ja/commands/dropbox-team-legalhold-add.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-legalhold-list.md b/docs/ja/commands/dropbox-team-legalhold-list.md
index 2a7b0a400..fcccaf202 100644
--- a/docs/ja/commands/dropbox-team-legalhold-list.md
+++ b/docs/ja/commands/dropbox-team-legalhold-list.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-legalhold-member-batch-update.md b/docs/ja/commands/dropbox-team-legalhold-member-batch-update.md
index f37daf09c..90eb77ce5 100644
--- a/docs/ja/commands/dropbox-team-legalhold-member-batch-update.md
+++ b/docs/ja/commands/dropbox-team-legalhold-member-batch-update.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-legalhold-member-list.md b/docs/ja/commands/dropbox-team-legalhold-member-list.md
index 651379fc1..58ccb3ecc 100644
--- a/docs/ja/commands/dropbox-team-legalhold-member-list.md
+++ b/docs/ja/commands/dropbox-team-legalhold-member-list.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-legalhold-release.md b/docs/ja/commands/dropbox-team-legalhold-release.md
index 757de12e3..44672d4eb 100644
--- a/docs/ja/commands/dropbox-team-legalhold-release.md
+++ b/docs/ja/commands/dropbox-team-legalhold-release.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-legalhold-revision-list.md b/docs/ja/commands/dropbox-team-legalhold-revision-list.md
index 416b08992..f1f2a6f85 100644
--- a/docs/ja/commands/dropbox-team-legalhold-revision-list.md
+++ b/docs/ja/commands/dropbox-team-legalhold-revision-list.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-legalhold-update-desc.md b/docs/ja/commands/dropbox-team-legalhold-update-desc.md
index d312b6526..d92db8bc1 100644
--- a/docs/ja/commands/dropbox-team-legalhold-update-desc.md
+++ b/docs/ja/commands/dropbox-team-legalhold-update-desc.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-legalhold-update-name.md b/docs/ja/commands/dropbox-team-legalhold-update-name.md
index 73e9c3f91..a1bf08730 100644
--- a/docs/ja/commands/dropbox-team-legalhold-update-name.md
+++ b/docs/ja/commands/dropbox-team-legalhold-update-name.md
@@ -41,6 +41,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-linkedapp-list.md b/docs/ja/commands/dropbox-team-linkedapp-list.md
index d0412f45c..8c762ba1b 100644
--- a/docs/ja/commands/dropbox-team-linkedapp-list.md
+++ b/docs/ja/commands/dropbox-team-linkedapp-list.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-batch-delete.md b/docs/ja/commands/dropbox-team-member-batch-delete.md
index b0d951550..00c150905 100644
--- a/docs/ja/commands/dropbox-team-member-batch-delete.md
+++ b/docs/ja/commands/dropbox-team-member-batch-delete.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-batch-detach.md b/docs/ja/commands/dropbox-team-member-batch-detach.md
index 3b5bdd722..c609fb119 100644
--- a/docs/ja/commands/dropbox-team-member-batch-detach.md
+++ b/docs/ja/commands/dropbox-team-member-batch-detach.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-batch-invite.md b/docs/ja/commands/dropbox-team-member-batch-invite.md
index 55e1cb99b..801bf25fb 100644
--- a/docs/ja/commands/dropbox-team-member-batch-invite.md
+++ b/docs/ja/commands/dropbox-team-member-batch-invite.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-batch-reinvite.md b/docs/ja/commands/dropbox-team-member-batch-reinvite.md
index bf069f751..55db69240 100644
--- a/docs/ja/commands/dropbox-team-member-batch-reinvite.md
+++ b/docs/ja/commands/dropbox-team-member-batch-reinvite.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-batch-suspend.md b/docs/ja/commands/dropbox-team-member-batch-suspend.md
index 4e4e31b83..75eab5cf4 100644
--- a/docs/ja/commands/dropbox-team-member-batch-suspend.md
+++ b/docs/ja/commands/dropbox-team-member-batch-suspend.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-batch-unsuspend.md b/docs/ja/commands/dropbox-team-member-batch-unsuspend.md
index 283636fc3..5ae270d17 100644
--- a/docs/ja/commands/dropbox-team-member-batch-unsuspend.md
+++ b/docs/ja/commands/dropbox-team-member-batch-unsuspend.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-clear-externalid.md b/docs/ja/commands/dropbox-team-member-clear-externalid.md
index 43de8db4b..47e868888 100644
--- a/docs/ja/commands/dropbox-team-member-clear-externalid.md
+++ b/docs/ja/commands/dropbox-team-member-clear-externalid.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-feature.md b/docs/ja/commands/dropbox-team-member-feature.md
index 811ba7745..259aa18de 100644
--- a/docs/ja/commands/dropbox-team-member-feature.md
+++ b/docs/ja/commands/dropbox-team-member-feature.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-file-lock-all-release.md b/docs/ja/commands/dropbox-team-member-file-lock-all-release.md
index 11dfe701c..080465648 100644
--- a/docs/ja/commands/dropbox-team-member-file-lock-all-release.md
+++ b/docs/ja/commands/dropbox-team-member-file-lock-all-release.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-file-lock-list.md b/docs/ja/commands/dropbox-team-member-file-lock-list.md
index 2c63c645d..aeff3f608 100644
--- a/docs/ja/commands/dropbox-team-member-file-lock-list.md
+++ b/docs/ja/commands/dropbox-team-member-file-lock-list.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-file-lock-release.md b/docs/ja/commands/dropbox-team-member-file-lock-release.md
index 92b082483..cca1ad03e 100644
--- a/docs/ja/commands/dropbox-team-member-file-lock-release.md
+++ b/docs/ja/commands/dropbox-team-member-file-lock-release.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-file-permdelete.md b/docs/ja/commands/dropbox-team-member-file-permdelete.md
index 7cba989a6..077e1499f 100644
--- a/docs/ja/commands/dropbox-team-member-file-permdelete.md
+++ b/docs/ja/commands/dropbox-team-member-file-permdelete.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-folder-list.md b/docs/ja/commands/dropbox-team-member-folder-list.md
index 8762a3f29..17322b780 100644
--- a/docs/ja/commands/dropbox-team-member-folder-list.md
+++ b/docs/ja/commands/dropbox-team-member-folder-list.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-folder-replication.md b/docs/ja/commands/dropbox-team-member-folder-replication.md
index 91bb4a89e..16089ad59 100644
--- a/docs/ja/commands/dropbox-team-member-folder-replication.md
+++ b/docs/ja/commands/dropbox-team-member-folder-replication.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-list.md b/docs/ja/commands/dropbox-team-member-list.md
index bca6d9024..8e944bd97 100644
--- a/docs/ja/commands/dropbox-team-member-list.md
+++ b/docs/ja/commands/dropbox-team-member-list.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-quota-batch-update.md b/docs/ja/commands/dropbox-team-member-quota-batch-update.md
index b44fbf8db..aba6e5f02 100644
--- a/docs/ja/commands/dropbox-team-member-quota-batch-update.md
+++ b/docs/ja/commands/dropbox-team-member-quota-batch-update.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-quota-list.md b/docs/ja/commands/dropbox-team-member-quota-list.md
index 7e1fe9164..faa49695b 100644
--- a/docs/ja/commands/dropbox-team-member-quota-list.md
+++ b/docs/ja/commands/dropbox-team-member-quota-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-quota-usage.md b/docs/ja/commands/dropbox-team-member-quota-usage.md
index 8969c03b3..b33fc562a 100644
--- a/docs/ja/commands/dropbox-team-member-quota-usage.md
+++ b/docs/ja/commands/dropbox-team-member-quota-usage.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-replication.md b/docs/ja/commands/dropbox-team-member-replication.md
index f68fc8c0a..7f18f21aa 100644
--- a/docs/ja/commands/dropbox-team-member-replication.md
+++ b/docs/ja/commands/dropbox-team-member-replication.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-suspend.md b/docs/ja/commands/dropbox-team-member-suspend.md
index b051d6ae6..97558393c 100644
--- a/docs/ja/commands/dropbox-team-member-suspend.md
+++ b/docs/ja/commands/dropbox-team-member-suspend.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-unsuspend.md b/docs/ja/commands/dropbox-team-member-unsuspend.md
index a1870b74d..692786333 100644
--- a/docs/ja/commands/dropbox-team-member-unsuspend.md
+++ b/docs/ja/commands/dropbox-team-member-unsuspend.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-update-batch-email.md b/docs/ja/commands/dropbox-team-member-update-batch-email.md
index 690e4637a..e16eeef22 100644
--- a/docs/ja/commands/dropbox-team-member-update-batch-email.md
+++ b/docs/ja/commands/dropbox-team-member-update-batch-email.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-update-batch-externalid.md b/docs/ja/commands/dropbox-team-member-update-batch-externalid.md
index 511bc9915..00fdbe35c 100644
--- a/docs/ja/commands/dropbox-team-member-update-batch-externalid.md
+++ b/docs/ja/commands/dropbox-team-member-update-batch-externalid.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-update-batch-invisible.md b/docs/ja/commands/dropbox-team-member-update-batch-invisible.md
index fe36857e8..399429867 100644
--- a/docs/ja/commands/dropbox-team-member-update-batch-invisible.md
+++ b/docs/ja/commands/dropbox-team-member-update-batch-invisible.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-update-batch-profile.md b/docs/ja/commands/dropbox-team-member-update-batch-profile.md
index 900c7267d..02321791e 100644
--- a/docs/ja/commands/dropbox-team-member-update-batch-profile.md
+++ b/docs/ja/commands/dropbox-team-member-update-batch-profile.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-member-update-batch-visible.md b/docs/ja/commands/dropbox-team-member-update-batch-visible.md
index a59ccdcee..2fa230b73 100644
--- a/docs/ja/commands/dropbox-team-member-update-batch-visible.md
+++ b/docs/ja/commands/dropbox-team-member-update-batch-visible.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-namespace-file-list.md b/docs/ja/commands/dropbox-team-namespace-file-list.md
index 2a60bcea3..37f161ed6 100644
--- a/docs/ja/commands/dropbox-team-namespace-file-list.md
+++ b/docs/ja/commands/dropbox-team-namespace-file-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-namespace-file-size.md b/docs/ja/commands/dropbox-team-namespace-file-size.md
index 2aa6e5a7b..31271e052 100644
--- a/docs/ja/commands/dropbox-team-namespace-file-size.md
+++ b/docs/ja/commands/dropbox-team-namespace-file-size.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-namespace-list.md b/docs/ja/commands/dropbox-team-namespace-list.md
index a9c15f320..45770ed75 100644
--- a/docs/ja/commands/dropbox-team-namespace-list.md
+++ b/docs/ja/commands/dropbox-team-namespace-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-namespace-member-list.md b/docs/ja/commands/dropbox-team-namespace-member-list.md
index 0ac1196e1..8be0d0e11 100644
--- a/docs/ja/commands/dropbox-team-namespace-member-list.md
+++ b/docs/ja/commands/dropbox-team-namespace-member-list.md
@@ -46,6 +46,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-namespace-summary.md b/docs/ja/commands/dropbox-team-namespace-summary.md
index f49c7e467..eac381935 100644
--- a/docs/ja/commands/dropbox-team-namespace-summary.md
+++ b/docs/ja/commands/dropbox-team-namespace-summary.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-report-activity.md b/docs/ja/commands/dropbox-team-report-activity.md
index 87bd97bde..ace8cec90 100644
--- a/docs/ja/commands/dropbox-team-report-activity.md
+++ b/docs/ja/commands/dropbox-team-report-activity.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-report-devices.md b/docs/ja/commands/dropbox-team-report-devices.md
index cce36eeb3..57440fd39 100644
--- a/docs/ja/commands/dropbox-team-report-devices.md
+++ b/docs/ja/commands/dropbox-team-report-devices.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-report-membership.md b/docs/ja/commands/dropbox-team-report-membership.md
index 65ac2d399..d6105d4d7 100644
--- a/docs/ja/commands/dropbox-team-report-membership.md
+++ b/docs/ja/commands/dropbox-team-report-membership.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-report-storage.md b/docs/ja/commands/dropbox-team-report-storage.md
index add12c623..88ac93414 100644
--- a/docs/ja/commands/dropbox-team-report-storage.md
+++ b/docs/ja/commands/dropbox-team-report-storage.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-file-batch-copy.md b/docs/ja/commands/dropbox-team-runas-file-batch-copy.md
index d90c4efe8..d91152aaa 100644
--- a/docs/ja/commands/dropbox-team-runas-file-batch-copy.md
+++ b/docs/ja/commands/dropbox-team-runas-file-batch-copy.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-file-list.md b/docs/ja/commands/dropbox-team-runas-file-list.md
index 975c1e6ad..423fd3ecc 100644
--- a/docs/ja/commands/dropbox-team-runas-file-list.md
+++ b/docs/ja/commands/dropbox-team-runas-file-list.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-file-sync-batch-up.md b/docs/ja/commands/dropbox-team-runas-file-sync-batch-up.md
index 56ce3baa7..1b060cf58 100644
--- a/docs/ja/commands/dropbox-team-runas-file-sync-batch-up.md
+++ b/docs/ja/commands/dropbox-team-runas-file-sync-batch-up.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-sharedfolder-batch-leave.md b/docs/ja/commands/dropbox-team-runas-sharedfolder-batch-leave.md
index ac6b9949d..79f77ead4 100644
--- a/docs/ja/commands/dropbox-team-runas-sharedfolder-batch-leave.md
+++ b/docs/ja/commands/dropbox-team-runas-sharedfolder-batch-leave.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-sharedfolder-batch-share.md b/docs/ja/commands/dropbox-team-runas-sharedfolder-batch-share.md
index e1a11568e..9d684e552 100644
--- a/docs/ja/commands/dropbox-team-runas-sharedfolder-batch-share.md
+++ b/docs/ja/commands/dropbox-team-runas-sharedfolder-batch-share.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-sharedfolder-batch-unshare.md b/docs/ja/commands/dropbox-team-runas-sharedfolder-batch-unshare.md
index 4f6ddd2b7..27e181397 100644
--- a/docs/ja/commands/dropbox-team-runas-sharedfolder-batch-unshare.md
+++ b/docs/ja/commands/dropbox-team-runas-sharedfolder-batch-unshare.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-sharedfolder-isolate.md b/docs/ja/commands/dropbox-team-runas-sharedfolder-isolate.md
index 283836bef..fc4f9e053 100644
--- a/docs/ja/commands/dropbox-team-runas-sharedfolder-isolate.md
+++ b/docs/ja/commands/dropbox-team-runas-sharedfolder-isolate.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-sharedfolder-list.md b/docs/ja/commands/dropbox-team-runas-sharedfolder-list.md
index 93be0ec4e..b927e6351 100644
--- a/docs/ja/commands/dropbox-team-runas-sharedfolder-list.md
+++ b/docs/ja/commands/dropbox-team-runas-sharedfolder-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-sharedfolder-member-batch-add.md b/docs/ja/commands/dropbox-team-runas-sharedfolder-member-batch-add.md
index 5e29c3698..85825e350 100644
--- a/docs/ja/commands/dropbox-team-runas-sharedfolder-member-batch-add.md
+++ b/docs/ja/commands/dropbox-team-runas-sharedfolder-member-batch-add.md
@@ -50,6 +50,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-sharedfolder-member-batch-delete.md b/docs/ja/commands/dropbox-team-runas-sharedfolder-member-batch-delete.md
index 6808502bc..7e3aaf2b4 100644
--- a/docs/ja/commands/dropbox-team-runas-sharedfolder-member-batch-delete.md
+++ b/docs/ja/commands/dropbox-team-runas-sharedfolder-member-batch-delete.md
@@ -50,6 +50,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-add.md b/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-add.md
index 52b88e0b1..52175e2fc 100644
--- a/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-add.md
+++ b/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-add.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-delete.md b/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-delete.md
index ab4d9229f..6a4eba4d7 100644
--- a/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-delete.md
+++ b/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-delete.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-list.md b/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-list.md
index 8835e8756..adb0eabbe 100644
--- a/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-list.md
+++ b/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-mountable.md b/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-mountable.md
index ab9aa506f..cf2bff111 100644
--- a/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-mountable.md
+++ b/docs/ja/commands/dropbox-team-runas-sharedfolder-mount-mountable.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-sharedlink-cap-expiry.md b/docs/ja/commands/dropbox-team-sharedlink-cap-expiry.md
index fd13af827..62b4c5d67 100644
--- a/docs/ja/commands/dropbox-team-sharedlink-cap-expiry.md
+++ b/docs/ja/commands/dropbox-team-sharedlink-cap-expiry.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-sharedlink-cap-visibility.md b/docs/ja/commands/dropbox-team-sharedlink-cap-visibility.md
index 308291d7b..775aad29b 100644
--- a/docs/ja/commands/dropbox-team-sharedlink-cap-visibility.md
+++ b/docs/ja/commands/dropbox-team-sharedlink-cap-visibility.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-sharedlink-delete-links.md b/docs/ja/commands/dropbox-team-sharedlink-delete-links.md
index 12aab3487..99e4822e2 100644
--- a/docs/ja/commands/dropbox-team-sharedlink-delete-links.md
+++ b/docs/ja/commands/dropbox-team-sharedlink-delete-links.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-sharedlink-delete-member.md b/docs/ja/commands/dropbox-team-sharedlink-delete-member.md
index 7ecbedb63..a801c71b2 100644
--- a/docs/ja/commands/dropbox-team-sharedlink-delete-member.md
+++ b/docs/ja/commands/dropbox-team-sharedlink-delete-member.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-sharedlink-list.md b/docs/ja/commands/dropbox-team-sharedlink-list.md
index f3f137d9e..5dcfacdf9 100644
--- a/docs/ja/commands/dropbox-team-sharedlink-list.md
+++ b/docs/ja/commands/dropbox-team-sharedlink-list.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-sharedlink-update-expiry.md b/docs/ja/commands/dropbox-team-sharedlink-update-expiry.md
index ac8ee6d1b..4261101aa 100644
--- a/docs/ja/commands/dropbox-team-sharedlink-update-expiry.md
+++ b/docs/ja/commands/dropbox-team-sharedlink-update-expiry.md
@@ -54,6 +54,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-sharedlink-update-password.md b/docs/ja/commands/dropbox-team-sharedlink-update-password.md
index 21dff0674..f5d6b0c2e 100644
--- a/docs/ja/commands/dropbox-team-sharedlink-update-password.md
+++ b/docs/ja/commands/dropbox-team-sharedlink-update-password.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-sharedlink-update-visibility.md b/docs/ja/commands/dropbox-team-sharedlink-update-visibility.md
index bedb20875..d5f4f2756 100644
--- a/docs/ja/commands/dropbox-team-sharedlink-update-visibility.md
+++ b/docs/ja/commands/dropbox-team-sharedlink-update-visibility.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-add.md b/docs/ja/commands/dropbox-team-teamfolder-add.md
index 06f4f6b45..b27793fda 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-add.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-add.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-archive.md b/docs/ja/commands/dropbox-team-teamfolder-archive.md
index efeba7e38..4f3b3585b 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-archive.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-archive.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-batch-archive.md b/docs/ja/commands/dropbox-team-teamfolder-batch-archive.md
index 0b9e10fe0..b06c7b4b0 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-batch-archive.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-batch-archive.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-batch-permdelete.md b/docs/ja/commands/dropbox-team-teamfolder-batch-permdelete.md
index f368047eb..94fab949a 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-batch-permdelete.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-batch-permdelete.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-batch-replication.md b/docs/ja/commands/dropbox-team-teamfolder-batch-replication.md
index f15b22eb5..658e106e7 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-batch-replication.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-batch-replication.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-file-list.md b/docs/ja/commands/dropbox-team-teamfolder-file-list.md
index 7ed1c16dd..2cbe94d04 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-file-list.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-file-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-file-lock-all-release.md b/docs/ja/commands/dropbox-team-teamfolder-file-lock-all-release.md
index a0a77291a..8fd85c8f5 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-file-lock-all-release.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-file-lock-all-release.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-file-lock-list.md b/docs/ja/commands/dropbox-team-teamfolder-file-lock-list.md
index c38b514bc..c14c4944a 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-file-lock-list.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-file-lock-list.md
@@ -47,6 +47,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-file-lock-release.md b/docs/ja/commands/dropbox-team-teamfolder-file-lock-release.md
index 0fd86693c..99188000c 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-file-lock-release.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-file-lock-release.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-file-size.md b/docs/ja/commands/dropbox-team-teamfolder-file-size.md
index f206ab492..415ef9b10 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-file-size.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-file-size.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-list.md b/docs/ja/commands/dropbox-team-teamfolder-list.md
index 2be9f78f8..09077be8f 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-list.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-list.md
@@ -45,6 +45,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-member-add.md b/docs/ja/commands/dropbox-team-teamfolder-member-add.md
index 4999e66c7..5a6d6bdda 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-member-add.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-member-add.md
@@ -82,6 +82,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-member-delete.md b/docs/ja/commands/dropbox-team-teamfolder-member-delete.md
index 480344380..dbd3be215 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-member-delete.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-member-delete.md
@@ -52,6 +52,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-member-list.md b/docs/ja/commands/dropbox-team-teamfolder-member-list.md
index 3ba6ab9b7..8de84b9b0 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-member-list.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-member-list.md
@@ -50,6 +50,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-partial-replication.md b/docs/ja/commands/dropbox-team-teamfolder-partial-replication.md
index 4e522f37c..416b146c5 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-partial-replication.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-partial-replication.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-permdelete.md b/docs/ja/commands/dropbox-team-teamfolder-permdelete.md
index cc05bfcce..1591cea9c 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-permdelete.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-permdelete.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-policy-list.md b/docs/ja/commands/dropbox-team-teamfolder-policy-list.md
index b42464ec2..a85a6810a 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-policy-list.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-policy-list.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-replication.md b/docs/ja/commands/dropbox-team-teamfolder-replication.md
index 0dbe1389f..aba1887d3 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-replication.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-replication.md
@@ -43,6 +43,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-sync-setting-list.md b/docs/ja/commands/dropbox-team-teamfolder-sync-setting-list.md
index 61b372763..c936a2311 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-sync-setting-list.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-sync-setting-list.md
@@ -48,6 +48,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/dropbox-team-teamfolder-sync-setting-update.md b/docs/ja/commands/dropbox-team-teamfolder-sync-setting-update.md
index 304000616..516f41987 100644
--- a/docs/ja/commands/dropbox-team-teamfolder-sync-setting-update.md
+++ b/docs/ja/commands/dropbox-team-teamfolder-sync-setting-update.md
@@ -49,6 +49,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/commands/figma-account-info.md b/docs/ja/commands/figma-account-info.md
index 7708d22af..c2fa111b7 100644
--- a/docs/ja/commands/figma-account-info.md
+++ b/docs/ja/commands/figma-account-info.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/ja/commands/figma-file-export-all-page.md b/docs/ja/commands/figma-file-export-all-page.md
index 8f936adc4..04b43cd0a 100644
--- a/docs/ja/commands/figma-file-export-all-page.md
+++ b/docs/ja/commands/figma-file-export-all-page.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/ja/commands/figma-file-export-frame.md b/docs/ja/commands/figma-file-export-frame.md
index 803772af2..3b4f31e92 100644
--- a/docs/ja/commands/figma-file-export-frame.md
+++ b/docs/ja/commands/figma-file-export-frame.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/ja/commands/figma-file-export-node.md b/docs/ja/commands/figma-file-export-node.md
index 9ed03f1b1..69f5c0793 100644
--- a/docs/ja/commands/figma-file-export-node.md
+++ b/docs/ja/commands/figma-file-export-node.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/ja/commands/figma-file-export-page.md b/docs/ja/commands/figma-file-export-page.md
index 293ab0514..407e45512 100644
--- a/docs/ja/commands/figma-file-export-page.md
+++ b/docs/ja/commands/figma-file-export-page.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/ja/commands/figma-file-info.md b/docs/ja/commands/figma-file-info.md
index b80e2386f..75bbfe0f1 100644
--- a/docs/ja/commands/figma-file-info.md
+++ b/docs/ja/commands/figma-file-info.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/ja/commands/figma-file-list.md b/docs/ja/commands/figma-file-list.md
index a5772da16..d4f3cba2f 100644
--- a/docs/ja/commands/figma-file-list.md
+++ b/docs/ja/commands/figma-file-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/ja/commands/figma-project-list.md b/docs/ja/commands/figma-project-list.md
index 5caa29c1c..0d835f192 100644
--- a/docs/ja/commands/figma-project-list.md
+++ b/docs/ja/commands/figma-project-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://www.figma.com/oauth?client_id=xxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=file_read&state=xxxxxxxx
diff --git a/docs/ja/commands/github-content-get.md b/docs/ja/commands/github-content-get.md
index f91c3419a..861f78236 100644
--- a/docs/ja/commands/github-content-get.md
+++ b/docs/ja/commands/github-content-get.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/github-content-put.md b/docs/ja/commands/github-content-put.md
index b13a1ff4e..5ba985a56 100644
--- a/docs/ja/commands/github-content-put.md
+++ b/docs/ja/commands/github-content-put.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/github-issue-list.md b/docs/ja/commands/github-issue-list.md
index 7c27d4a0c..80c5eff35 100644
--- a/docs/ja/commands/github-issue-list.md
+++ b/docs/ja/commands/github-issue-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/github-profile.md b/docs/ja/commands/github-profile.md
index 5b8013c03..d194d2c7b 100644
--- a/docs/ja/commands/github-profile.md
+++ b/docs/ja/commands/github-profile.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/github-release-asset-download.md b/docs/ja/commands/github-release-asset-download.md
index d4e9531ff..79a0199b4 100644
--- a/docs/ja/commands/github-release-asset-download.md
+++ b/docs/ja/commands/github-release-asset-download.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/github-release-asset-list.md b/docs/ja/commands/github-release-asset-list.md
index f422b2d92..477276731 100644
--- a/docs/ja/commands/github-release-asset-list.md
+++ b/docs/ja/commands/github-release-asset-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/github-release-asset-upload.md b/docs/ja/commands/github-release-asset-upload.md
index 727236794..dddf35ea1 100644
--- a/docs/ja/commands/github-release-asset-upload.md
+++ b/docs/ja/commands/github-release-asset-upload.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/github-release-draft.md b/docs/ja/commands/github-release-draft.md
index f2f321bc7..9f7a850cf 100644
--- a/docs/ja/commands/github-release-draft.md
+++ b/docs/ja/commands/github-release-draft.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/github-release-list.md b/docs/ja/commands/github-release-list.md
index e1b4ade02..3dbd386ae 100644
--- a/docs/ja/commands/github-release-list.md
+++ b/docs/ja/commands/github-release-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/github-tag-create.md b/docs/ja/commands/github-tag-create.md
index 228eb7b16..912b60830 100644
--- a/docs/ja/commands/github-tag-create.md
+++ b/docs/ja/commands/github-tag-create.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/slack-conversation-history.md b/docs/ja/commands/slack-conversation-history.md
index 66223863b..47afca677 100644
--- a/docs/ja/commands/slack-conversation-history.md
+++ b/docs/ja/commands/slack-conversation-history.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://slack.com/oauth/v2/authorize?client_id=&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=channels%3Aread&state=xxxxxxxx
diff --git a/docs/ja/commands/slack-conversation-list.md b/docs/ja/commands/slack-conversation-list.md
index 6e8d5004f..7bb6823ee 100644
--- a/docs/ja/commands/slack-conversation-list.md
+++ b/docs/ja/commands/slack-conversation-list.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://slack.com/oauth/v2/authorize?client_id=&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=channels%3Aread&state=xxxxxxxx
diff --git a/docs/ja/commands/toc.md b/docs/ja/commands/toc.md
index dfb6e03e4..b1cd6cf0d 100644
--- a/docs/ja/commands/toc.md
+++ b/docs/ja/commands/toc.md
@@ -297,11 +297,6 @@ lang: ja
| [util text case up]({{ site.baseurl }}/ja/commands/util-text-case-up.html) | 大文字のテキストを表示する |
| [util text encoding from]({{ site.baseurl }}/ja/commands/util-text-encoding-from.html) | 指定されたエンコーディングからUTF-8テキストファイルに変換します. |
| [util text encoding to]({{ site.baseurl }}/ja/commands/util-text-encoding-to.html) | UTF-8テキストファイルから指定されたエンコーディングに変換する. |
-| [util text nlp english entity]({{ site.baseurl }}/ja/commands/util-text-nlp-english-entity.html) | 英文をエンティティに分割する |
-| [util text nlp english sentence]({{ site.baseurl }}/ja/commands/util-text-nlp-english-sentence.html) | 英文を文章に分割する |
-| [util text nlp english token]({{ site.baseurl }}/ja/commands/util-text-nlp-english-token.html) | 英文をトークンに分割する |
-| [util text nlp japanese token]({{ site.baseurl }}/ja/commands/util-text-nlp-japanese-token.html) | 日本語テキストのトークン化 |
-| [util text nlp japanese wakati]({{ site.baseurl }}/ja/commands/util-text-nlp-japanese-wakati.html) | 分かち書き(日本語テキストのトークン化) |
| [util tidy move dispatch]({{ site.baseurl }}/ja/commands/util-tidy-move-dispatch.html) | ファイルを整理 |
| [util tidy move simple]({{ site.baseurl }}/ja/commands/util-tidy-move-simple.html) | ローカルファイルをアーカイブします |
| [util time now]({{ site.baseurl }}/ja/commands/util-time-now.html) | 現在の時刻を表示 |
diff --git a/docs/ja/commands/util-release-install.md b/docs/ja/commands/util-release-install.md
index 26f1a61a5..23efcbadf 100644
--- a/docs/ja/commands/util-release-install.md
+++ b/docs/ja/commands/util-release-install.md
@@ -42,6 +42,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
認可URLを開きます:
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=repo&state=xxxxxxxx
diff --git a/docs/ja/commands/util-text-nlp-english-entity.md b/docs/ja/commands/util-text-nlp-english-entity.md
deleted file mode 100644
index af454cf70..000000000
--- a/docs/ja/commands/util-text-nlp-english-entity.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-layout: command
-title: コマンド `util text nlp english entity` は廃止されます
-lang: ja
----
-
-# コマンド `util text nlp english entity` は廃止されます
-
-コマンド `util text nlp english entity` は廃止されます。
-このコマンドは、2025-07-30T15:00:00Zの前にリリースされたビルドまでの移行期間中に使用できます。このバージョンのプログラムを使用している場合、このコマンドはこの日付以降も使用可能です。
-
-詳しくは[お知らせ](https://github.com/watermint/toolbox/discussions/905)をご覧ください。
-
-
diff --git a/docs/ja/commands/util-text-nlp-english-sentence.md b/docs/ja/commands/util-text-nlp-english-sentence.md
deleted file mode 100644
index 31b1cb8f7..000000000
--- a/docs/ja/commands/util-text-nlp-english-sentence.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-layout: command
-title: コマンド `util text nlp english sentence` は廃止されます
-lang: ja
----
-
-# コマンド `util text nlp english sentence` は廃止されます
-
-コマンド `util text nlp english sentence` は廃止されます。
-このコマンドは、2025-07-30T15:00:00Zの前にリリースされたビルドまでの移行期間中に使用できます。このバージョンのプログラムを使用している場合、このコマンドはこの日付以降も使用可能です。
-
-詳しくは[お知らせ](https://github.com/watermint/toolbox/discussions/905)をご覧ください。
-
-
diff --git a/docs/ja/commands/util-text-nlp-english-token.md b/docs/ja/commands/util-text-nlp-english-token.md
deleted file mode 100644
index bdc526fac..000000000
--- a/docs/ja/commands/util-text-nlp-english-token.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-layout: command
-title: コマンド `util text nlp english token` は廃止されます
-lang: ja
----
-
-# コマンド `util text nlp english token` は廃止されます
-
-コマンド `util text nlp english token` は廃止されます。
-このコマンドは、2025-07-30T15:00:00Zの前にリリースされたビルドまでの移行期間中に使用できます。このバージョンのプログラムを使用している場合、このコマンドはこの日付以降も使用可能です。
-
-詳しくは[お知らせ](https://github.com/watermint/toolbox/discussions/905)をご覧ください。
-
-
diff --git a/docs/ja/commands/util-text-nlp-japanese-token.md b/docs/ja/commands/util-text-nlp-japanese-token.md
deleted file mode 100644
index 517b494d5..000000000
--- a/docs/ja/commands/util-text-nlp-japanese-token.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-layout: command
-title: コマンド `util text nlp japanese token` は廃止されます
-lang: ja
----
-
-# コマンド `util text nlp japanese token` は廃止されます
-
-コマンド `util text nlp japanese token` は廃止されます。
-このコマンドは、2025-07-30T15:00:00Zの前にリリースされたビルドまでの移行期間中に使用できます。このバージョンのプログラムを使用している場合、このコマンドはこの日付以降も使用可能です。
-
-詳しくは[お知らせ](https://github.com/watermint/toolbox/discussions/905)をご覧ください。
-
-
diff --git a/docs/ja/commands/util-text-nlp-japanese-wakati.md b/docs/ja/commands/util-text-nlp-japanese-wakati.md
deleted file mode 100644
index 26e1198f9..000000000
--- a/docs/ja/commands/util-text-nlp-japanese-wakati.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-layout: command
-title: コマンド `util text nlp japanese wakati` は廃止されます
-lang: ja
----
-
-# コマンド `util text nlp japanese wakati` は廃止されます
-
-コマンド `util text nlp japanese wakati` は廃止されます。
-このコマンドは、2025-07-30T15:00:00Zの前にリリースされたビルドまでの移行期間中に使用できます。このバージョンのプログラムを使用している場合、このコマンドはこの日付以降も使用可能です。
-
-詳しくは[お知らせ](https://github.com/watermint/toolbox/discussions/905)をご覧ください。
-
-
diff --git a/docs/ja/commands/util-tidy-pack-remote.md b/docs/ja/commands/util-tidy-pack-remote.md
index b9b40913b..dcfb835a9 100644
--- a/docs/ja/commands/util-tidy-pack-remote.md
+++ b/docs/ja/commands/util-tidy-pack-remote.md
@@ -44,6 +44,8 @@ watermint toolbox xx.x.xxx
© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.
+このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。
+
1. 次のURLを開き認証ダイアログを開いてください:
https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx
diff --git a/docs/ja/guides/spec-change.md b/docs/ja/guides/spec-change.md
index 0dd51aeb4..a22d5a6d3 100644
--- a/docs/ja/guides/spec-change.md
+++ b/docs/ja/guides/spec-change.md
@@ -17,12 +17,7 @@ lang: ja
以下のコマンドは将来のリリースで削除される予定です。現在のバージョンを使い続けても影響はありませんが、変更は将来のバージョンに適用されます。日付が指定されている場合、その日付以降にリリースされたバージョンに変更が適用される。
-| パス | コマンドの説明 | 日付 |
-|----------------------------------------------------------------------------------------|-----------------------------------------|----------------------|
-| [util text nlp english entity](https://github.com/watermint/toolbox/discussions/905) | 英文をエンティティに分割する | 2025-07-30T15:00:00Z |
-| [util text nlp english sentence](https://github.com/watermint/toolbox/discussions/905) | 英文を文章に分割する | 2025-07-30T15:00:00Z |
-| [util text nlp english token](https://github.com/watermint/toolbox/discussions/905) | 英文をトークンに分割する | 2025-07-30T15:00:00Z |
-| [util text nlp japanese token](https://github.com/watermint/toolbox/discussions/905) | 日本語テキストのトークン化 | 2025-07-30T15:00:00Z |
-| [util text nlp japanese wakati](https://github.com/watermint/toolbox/discussions/905) | 分かち書き(日本語テキストのトークン化) | 2025-07-30T15:00:00Z |
+| パス | コマンドの説明 | 日付 |
+|------|----------------|------|
diff --git a/docs/ja/home.md b/docs/ja/home.md
index f2db9fb8d..6eff2e516 100644
--- a/docs/ja/home.md
+++ b/docs/ja/home.md
@@ -6,7 +6,7 @@ Dropbox、Figma、Google、GitHubなどのウェブサービス用の多目的
# watermint toolboxでもっとできること
-watermint toolboxには、日々の作業を解決するための277コマンドが用意されています. 例えば、あなたがDropbox for teamsの管理者で、グループを管理する必要がある場合。グループコマンドを使って、グループを一括作成したり、グループにメンバーを一括追加することができます.
+watermint toolboxには、日々の作業を解決するための272コマンドが用意されています. 例えば、あなたがDropbox for teamsの管理者で、グループを管理する必要がある場合。グループコマンドを使って、グループを一括作成したり、グループにメンバーを一括追加することができます.

@@ -41,8 +41,8 @@ watermint toolboxはApache License, Version 2.0でライセンスされていま
# お知らせ
+* [#911 watermint toolbox will no longer be actively maintained](https://github.com/watermint/toolbox/discussions/911)
* [#906 AI Powered Q&A Bot on ChatGPT](https://github.com/watermint/toolbox/discussions/906)
-* [#905 Deprecation: Some of utilities command will be removed after release of 2025-08-01](https://github.com/watermint/toolbox/discussions/905)
# セキュリティとプライバシー
diff --git a/docs/ja/index.html b/docs/ja/index.html
index b59b77a0c..0c1219582 100644
--- a/docs/ja/index.html
+++ b/docs/ja/index.html
@@ -15,6 +15,20 @@
{% capture home_content %}{{ home_content | markdownify }}{% endcapture %}
{% include anchor_headings.html html=home_content beforeHeading=true anchorBody='' %}
+
+
+ {% include anchor_headings.html html='
Q&A チャットボット
' beforeHeading=true anchorBody='
' %}
+
watermint toolboxのコマンドやオプションについてお困りですか?すべてのコマンドとオプションの知識に基づいて質問に答えることができるAI搭載のQ&Aチャットボットをお試しください。
+
watermint toolbox Q&Aチャットボットに質問する
+
+
+
+ {% include anchor_headings.html html='
プロジェクトステータス
' beforeHeading=true anchorBody='
' %}
+
+
重要なお知らせ: watermint toolboxは2025年8月をもって積極的なメンテナンスを終了いたします。プログラムはこれまでと同様に機能しますが、新機能、API更新、バグ修正は実装されません。必要に応じて最小限のセキュリティ更新のみ提供される場合があります。今後のご利用については代替オプションをご検討ください。詳細なお知らせを読む。
+
+
+
{% include anchor_headings.html html='
Recent releases
' beforeHeading=true anchorBody='
' %}
diff --git a/docs/ja/knowledge/knowledge.md b/docs/ja/knowledge/knowledge.md
index c0e4fe793..2e432aa37 100644
--- a/docs/ja/knowledge/knowledge.md
+++ b/docs/ja/knowledge/knowledge.md
@@ -1492,171 +1492,6 @@ tbx util text encoding to -in /LOCAL/PATH/TO/INPUT_FILE -out /LOCAL/PATH/TO/OUTP
Text to change encoding
----
-Title: util text nlp english entity
-URL: https://toolbox.watermint.org/commands/util/text/nlp/english/entity.md
----
-
-# util text nlp english entity
-
-Split English text into entities
-
-# Usage
-
-This document uses the Desktop folder for command example.
-```
-tbx util text nlp english entity -in /LOCAL/PATH/TO/INPUT.txt
-```
-
-## Options:
-
-**-ignore-line-break**
-: Consider line break as regular white space while tokenizing. Default: false
-
-**-in**
-: Input file path
-
-# Text inputs
-
-## Text input: In
-
-English text file to split
-
----
-Title: util text nlp english sentence
-URL: https://toolbox.watermint.org/commands/util/text/nlp/english/sentence.md
----
-
-# util text nlp english sentence
-
-Split English text into sentences
-
-# Usage
-
-This document uses the Desktop folder for command example.
-```
-tbx util text nlp english sentence -in /LOCAL/PATH/TO/INPUT.txt
-```
-
-## Options:
-
-**-ignore-line-break**
-: Consider line break as regular white space while tokenizing. Default: false
-
-**-in**
-: Input file path
-
-# Text inputs
-
-## Text input: In
-
-English text file to split
-
----
-Title: util text nlp english token
-URL: https://toolbox.watermint.org/commands/util/text/nlp/english/token.md
----
-
-# util text nlp english token
-
-Split English text into tokens
-
-# Usage
-
-This document uses the Desktop folder for command example.
-```
-tbx util text nlp english token -in /LOCAL/PATH/TO/INPUT.txt
-```
-
-## Options:
-
-**-ignore-line-break**
-: Consider line break as regular white space while tokenizing. Default: false
-
-**-in**
-: Input file path
-
-# Text inputs
-
-## Text input: In
-
-English text file to split
-
----
-Title: util text nlp japanese token
-URL: https://toolbox.watermint.org/commands/util/text/nlp/japanese/token.md
----
-
-# util text nlp japanese token
-
-Tokenize Japanese text
-
-# Usage
-
-This document uses the Desktop folder for command example.
-```
-tbx util text nlp japanese token -in /LOCAL/PATH/TO/INPUT.txt
-```
-
-## Options:
-
-**-dictionary**
-: Dictionary name of the token. Options: ipa (dictionary: ipa), uni (dictionary: uni). Default: ipa
-
-**-ignore-line-break**
-: Ignore line break. Default: false
-
-**-in**
-: Input file path
-
-**-mode**
-: Tokenize mode (normal/search/extended). Options:. • normal (mode: normal). • search (mode: search). • extend (mode: extend). Default: normal
-
-**-omit-bos-eos**
-: Omit BOS/EOS tokens. Default: false
-
-# Text inputs
-
-## Text input: In
-
-Input file path
-
----
-Title: util text nlp japanese wakati
-URL: https://toolbox.watermint.org/commands/util/text/nlp/japanese/wakati.md
----
-
-# util text nlp japanese wakati
-
-Wakachigaki (tokenize Japanese text)
-
-# Usage
-
-This document uses the Desktop folder for command example.
-```
-tbx util text nlp japanese wakati -in /LOCAL/PATH/TO/INPUT.txt
-```
-
-## Options:
-
-**-dictionary**
-: Dictionary name (ipa/uni). Options: ipa (dictionary: ipa), uni (dictionary: uni). Default: ipa
-
-**-ignore-line-break**
-: Ignore line break. Default: false
-
-**-in**
-: Input file path
-
-**-separator**
-: Text separator. Default:
-
-# Text inputs
-
-## Text input: In
-
-Input text file path
-
---
Title: util tidy move dispatch
URL: https://toolbox.watermint.org/commands/util/tidy/move/dispatch.md
@@ -14274,13 +14109,8 @@ Details about path changes in the spec
Details about prune changes in the spec
-| CLI path for prune | Description of prune | Prune after build date |
-|----------------------------------------------------------------------------------------|--------------------------------------|------------------------|
-| [util text nlp english entity](https://github.com/watermint/toolbox/discussions/905) | Split English text into entities | 2025-07-30T15:00:00Z |
-| [util text nlp english sentence](https://github.com/watermint/toolbox/discussions/905) | Split English text into sentences | 2025-07-30T15:00:00Z |
-| [util text nlp english token](https://github.com/watermint/toolbox/discussions/905) | Split English text into tokens | 2025-07-30T15:00:00Z |
-| [util text nlp japanese token](https://github.com/watermint/toolbox/discussions/905) | Tokenize Japanese text | 2025-07-30T15:00:00Z |
-| [util text nlp japanese wakati](https://github.com/watermint/toolbox/discussions/905) | Wakachigaki (tokenize Japanese text) | 2025-07-30T15:00:00Z |
+| CLI path for prune | Description of prune | Prune after build date |
+|--------------------|----------------------|------------------------|
- [Reporting options](https://toolbox.watermint.org/guides/reporting-options.md)
---
diff --git a/docs/knowledge/knowledge.md b/docs/knowledge/knowledge.md
index c0e4fe793..2e432aa37 100644
--- a/docs/knowledge/knowledge.md
+++ b/docs/knowledge/knowledge.md
@@ -1492,171 +1492,6 @@ tbx util text encoding to -in /LOCAL/PATH/TO/INPUT_FILE -out /LOCAL/PATH/TO/OUTP
Text to change encoding
----
-Title: util text nlp english entity
-URL: https://toolbox.watermint.org/commands/util/text/nlp/english/entity.md
----
-
-# util text nlp english entity
-
-Split English text into entities
-
-# Usage
-
-This document uses the Desktop folder for command example.
-```
-tbx util text nlp english entity -in /LOCAL/PATH/TO/INPUT.txt
-```
-
-## Options:
-
-**-ignore-line-break**
-: Consider line break as regular white space while tokenizing. Default: false
-
-**-in**
-: Input file path
-
-# Text inputs
-
-## Text input: In
-
-English text file to split
-
----
-Title: util text nlp english sentence
-URL: https://toolbox.watermint.org/commands/util/text/nlp/english/sentence.md
----
-
-# util text nlp english sentence
-
-Split English text into sentences
-
-# Usage
-
-This document uses the Desktop folder for command example.
-```
-tbx util text nlp english sentence -in /LOCAL/PATH/TO/INPUT.txt
-```
-
-## Options:
-
-**-ignore-line-break**
-: Consider line break as regular white space while tokenizing. Default: false
-
-**-in**
-: Input file path
-
-# Text inputs
-
-## Text input: In
-
-English text file to split
-
----
-Title: util text nlp english token
-URL: https://toolbox.watermint.org/commands/util/text/nlp/english/token.md
----
-
-# util text nlp english token
-
-Split English text into tokens
-
-# Usage
-
-This document uses the Desktop folder for command example.
-```
-tbx util text nlp english token -in /LOCAL/PATH/TO/INPUT.txt
-```
-
-## Options:
-
-**-ignore-line-break**
-: Consider line break as regular white space while tokenizing. Default: false
-
-**-in**
-: Input file path
-
-# Text inputs
-
-## Text input: In
-
-English text file to split
-
----
-Title: util text nlp japanese token
-URL: https://toolbox.watermint.org/commands/util/text/nlp/japanese/token.md
----
-
-# util text nlp japanese token
-
-Tokenize Japanese text
-
-# Usage
-
-This document uses the Desktop folder for command example.
-```
-tbx util text nlp japanese token -in /LOCAL/PATH/TO/INPUT.txt
-```
-
-## Options:
-
-**-dictionary**
-: Dictionary name of the token. Options: ipa (dictionary: ipa), uni (dictionary: uni). Default: ipa
-
-**-ignore-line-break**
-: Ignore line break. Default: false
-
-**-in**
-: Input file path
-
-**-mode**
-: Tokenize mode (normal/search/extended). Options:. • normal (mode: normal). • search (mode: search). • extend (mode: extend). Default: normal
-
-**-omit-bos-eos**
-: Omit BOS/EOS tokens. Default: false
-
-# Text inputs
-
-## Text input: In
-
-Input file path
-
----
-Title: util text nlp japanese wakati
-URL: https://toolbox.watermint.org/commands/util/text/nlp/japanese/wakati.md
----
-
-# util text nlp japanese wakati
-
-Wakachigaki (tokenize Japanese text)
-
-# Usage
-
-This document uses the Desktop folder for command example.
-```
-tbx util text nlp japanese wakati -in /LOCAL/PATH/TO/INPUT.txt
-```
-
-## Options:
-
-**-dictionary**
-: Dictionary name (ipa/uni). Options: ipa (dictionary: ipa), uni (dictionary: uni). Default: ipa
-
-**-ignore-line-break**
-: Ignore line break. Default: false
-
-**-in**
-: Input file path
-
-**-separator**
-: Text separator. Default:
-
-# Text inputs
-
-## Text input: In
-
-Input text file path
-
---
Title: util tidy move dispatch
URL: https://toolbox.watermint.org/commands/util/tidy/move/dispatch.md
@@ -14274,13 +14109,8 @@ Details about path changes in the spec
Details about prune changes in the spec
-| CLI path for prune | Description of prune | Prune after build date |
-|----------------------------------------------------------------------------------------|--------------------------------------|------------------------|
-| [util text nlp english entity](https://github.com/watermint/toolbox/discussions/905) | Split English text into entities | 2025-07-30T15:00:00Z |
-| [util text nlp english sentence](https://github.com/watermint/toolbox/discussions/905) | Split English text into sentences | 2025-07-30T15:00:00Z |
-| [util text nlp english token](https://github.com/watermint/toolbox/discussions/905) | Split English text into tokens | 2025-07-30T15:00:00Z |
-| [util text nlp japanese token](https://github.com/watermint/toolbox/discussions/905) | Tokenize Japanese text | 2025-07-30T15:00:00Z |
-| [util text nlp japanese wakati](https://github.com/watermint/toolbox/discussions/905) | Wakachigaki (tokenize Japanese text) | 2025-07-30T15:00:00Z |
+| CLI path for prune | Description of prune | Prune after build date |
+|--------------------|----------------------|------------------------|
- [Reporting options](https://toolbox.watermint.org/guides/reporting-options.md)
---
diff --git a/domain/core/dc_log/capture_comprehensive_test.go b/domain/core/dc_log/capture_comprehensive_test.go
index 646754d81..be128c482 100644
--- a/domain/core/dc_log/capture_comprehensive_test.go
+++ b/domain/core/dc_log/capture_comprehensive_test.go
@@ -258,7 +258,7 @@ func TestOptTimeInterval(t *testing.T) {
func TestOptShorten(t *testing.T) {
opts := CaptureAggregatorOpts{}
-
+
// Test enabling
optFunc := OptShorten(true)
result := optFunc(opts)
@@ -519,13 +519,13 @@ func TestCaImpl_EmptyDatabase(t *testing.T) {
func TestResponseCodeCategorization(t *testing.T) {
testCases := []struct {
- code int
- is2xx bool
- is3xx bool
- is4xx bool
- is429 bool
- is5xx bool
- isOther bool
+ code int
+ is2xx bool
+ is3xx bool
+ is4xx bool
+ is429 bool
+ is5xx bool
+ isOther bool
}{
{200, true, false, false, false, false, false},
{201, true, false, false, false, false, false},
@@ -569,4 +569,4 @@ func TestResponseCodeCategorization(t *testing.T) {
t.Errorf("Code %d: expected isOther=%v, got %v", tc.code, tc.isOther, isOther)
}
}
-}
\ No newline at end of file
+}
diff --git a/domain/core/dc_log/capture_test.go b/domain/core/dc_log/capture_test.go
index 18ca21298..434f2590c 100644
--- a/domain/core/dc_log/capture_test.go
+++ b/domain/core/dc_log/capture_test.go
@@ -9,11 +9,11 @@ func TestErrorJobNotFound(t *testing.T) {
if ErrorJobNotFound == nil {
t.Error("ErrorJobNotFound should not be nil")
}
-
+
if ErrorJobNotFound.Error() == "" {
t.Error("ErrorJobNotFound should have a message")
}
-
+
expectedMessage := "job not found"
if ErrorJobNotFound.Error() != expectedMessage {
t.Errorf("Expected error message '%s', got '%s'", expectedMessage, ErrorJobNotFound.Error())
@@ -33,9 +33,9 @@ func TestConstants(t *testing.T) {
if DefaultTimeIntervalSeconds <= 0 {
t.Error("DefaultTimeIntervalSeconds should be positive")
}
-
+
// 3600 seconds = 1 hour, which is a reasonable default
if DefaultTimeIntervalSeconds != 3600 {
t.Errorf("Expected DefaultTimeIntervalSeconds to be 3600, got %d", DefaultTimeIntervalSeconds)
}
-}
\ No newline at end of file
+}
diff --git a/domain/dropbox/api/dbx_client_impl/client.go b/domain/dropbox/api/dbx_client_impl/client.go
index b5cab75ac..8f2514c65 100644
--- a/domain/dropbox/api/dbx_client_impl/client.go
+++ b/domain/dropbox/api/dbx_client_impl/client.go
@@ -1,6 +1,8 @@
package dbx_client_impl
import (
+ "net/http"
+
"github.com/watermint/toolbox/domain/dropbox/api/dbx_async"
"github.com/watermint/toolbox/domain/dropbox/api/dbx_async_impl"
"github.com/watermint/toolbox/domain/dropbox/api/dbx_client"
@@ -25,7 +27,6 @@ import (
"github.com/watermint/toolbox/infra/control/app_definitions"
"github.com/watermint/toolbox/infra/control/app_feature"
"github.com/watermint/toolbox/infra/ui/app_ui"
- "net/http"
)
func NewMock(name string, ctl app_control.Control) dbx_client.Client {
@@ -101,7 +102,7 @@ func newClientWithToken(ctl app_control.Control, l esl.Logger, app api_auth.OAut
opts = append(opts, nw_rest_factory.Auth(func(client nw_client.Rest) nw_client.Rest {
return nw_auth.NewOAuthRestClient(entity, ctl.AuthRepository(), client)
}))
- opts = append(opts)
+
return nw_rest_factory.New(opts...)
}
diff --git a/domain/dropbox/filesystem/dbx_fs/error_test.go b/domain/dropbox/filesystem/dbx_fs/error_test.go
index 3900e0998..2e6eb7699 100644
--- a/domain/dropbox/filesystem/dbx_fs/error_test.go
+++ b/domain/dropbox/filesystem/dbx_fs/error_test.go
@@ -237,4 +237,4 @@ func TestErrorConstants(t *testing.T) {
func TestFileSystemErrorInterface(t *testing.T) {
var _ es_filesystem.FileSystemError = &dbxError{}
var _ es_filesystem.FileSystemError = &cacheError{}
-}
\ No newline at end of file
+}
diff --git a/domain/dropbox/filesystem/dbx_fs/filesystem_cached_test.go b/domain/dropbox/filesystem/dbx_fs/filesystem_cached_test.go
index 65113d01e..3453e617f 100644
--- a/domain/dropbox/filesystem/dbx_fs/filesystem_cached_test.go
+++ b/domain/dropbox/filesystem/dbx_fs/filesystem_cached_test.go
@@ -11,7 +11,7 @@ func TestMsgFileSystemCached(t *testing.T) {
if MFileSystemCached == nil {
t.Fatal("MFileSystemCached should not be nil")
}
-
+
// MFileSystemCached is already of type *MsgFileSystemCached
// Just verify it has the expected type by checking if we can access its fields
if MFileSystemCached.ProgressPreScan == nil {
@@ -22,23 +22,23 @@ func TestMsgFileSystemCached(t *testing.T) {
func TestMsgFileSystemCached_Messages(t *testing.T) {
msg := &MsgFileSystemCached{}
-
+
// Apply should work without panic
applied := app_msg.Apply(msg)
if applied == nil {
t.Fatal("Applied message should not be nil")
}
-
+
// Verify the applied message is the correct type
appliedMsg, ok := applied.(*MsgFileSystemCached)
if !ok {
t.Fatal("Applied message should be of type *MsgFileSystemCached")
}
-
+
// The struct should have the ProgressPreScan field
if appliedMsg.ProgressPreScan == nil {
// Note: After Apply, the field might be populated by the message system
// This is expected behavior
t.Log("ProgressPreScan is nil after Apply")
}
-}
\ No newline at end of file
+}
diff --git a/domain/dropbox/filesystem/dbx_fs/filesystem_test.go b/domain/dropbox/filesystem/dbx_fs/filesystem_test.go
index a3436f33a..514c8b1b3 100644
--- a/domain/dropbox/filesystem/dbx_fs/filesystem_test.go
+++ b/domain/dropbox/filesystem/dbx_fs/filesystem_test.go
@@ -13,16 +13,16 @@ func TestNewFileSystem(t *testing.T) {
qtr_endtoend.TestWithControl(t, func(ctl app_control.Control) {
ctx := dbx_client_impl.NewMock("mock", ctl)
fs := NewFileSystem(ctx)
-
+
if fs == nil {
t.Fatal("Expected non-nil filesystem")
}
-
+
dbxFs, ok := fs.(*dbxFs)
if !ok {
t.Fatal("Expected dbxFs type")
}
-
+
if dbxFs.ctx == nil {
t.Error("Context not set")
}
@@ -31,7 +31,7 @@ func TestNewFileSystem(t *testing.T) {
func TestDbxFs_OperationalComplexity(t *testing.T) {
fs := &dbxFs{}
-
+
testCases := []struct {
name string
numEntries int
@@ -68,7 +68,7 @@ func TestDbxFs_OperationalComplexity(t *testing.T) {
expected: int64(ApiComplexityThreshold * 2),
},
}
-
+
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
entries := make([]es_filesystem.Entry, tc.numEntries)
@@ -98,8 +98,8 @@ func TestDbxFs_EntryInterface(t *testing.T) {
qtr_endtoend.TestWithControl(t, func(ctl app_control.Control) {
ctx := dbx_client_impl.NewMock("mock", ctl)
fs := NewFileSystem(ctx)
-
+
// Type assertion to ensure interface is implemented
var _ es_filesystem.FileSystem = fs
})
-}
\ No newline at end of file
+}
diff --git a/domain/dropbox/filesystem/dbx_fs_copier_batch/coiper_test.go b/domain/dropbox/filesystem/dbx_fs_copier_batch/coiper_test.go
index 4b1c3b032..79c3e3ecd 100644
--- a/domain/dropbox/filesystem/dbx_fs_copier_batch/coiper_test.go
+++ b/domain/dropbox/filesystem/dbx_fs_copier_batch/coiper_test.go
@@ -14,17 +14,17 @@ func TestNewLocalToDropboxBatch(t *testing.T) {
if connector == nil {
t.Error("Expected non-nil connector")
}
-
+
// Verify it returns the correct type
batch, ok := connector.(*copierLocalToDropboxBatch)
if !ok {
t.Error("Expected copierLocalToDropboxBatch type")
}
-
+
if batch.batchSize != 10 {
t.Errorf("Expected batch size 10, got %d", batch.batchSize)
}
-
+
return nil
})
if err != nil {
@@ -40,21 +40,21 @@ func TestNewLocalToDropboxBatch_BatchSizeLimits(t *testing.T) {
if batch.batchSize != 1 {
t.Errorf("Expected batch size to be adjusted to 1, got %d", batch.batchSize)
}
-
+
// Test batch size greater than 1000
connector2 := NewLocalToDropboxBatch(ctl, nil, 1500)
batch2 := connector2.(*copierLocalToDropboxBatch)
if batch2.batchSize != 1000 {
t.Errorf("Expected batch size to be adjusted to 1000, got %d", batch2.batchSize)
}
-
+
// Test negative batch size
connector3 := NewLocalToDropboxBatch(ctl, nil, -5)
batch3 := connector3.(*copierLocalToDropboxBatch)
if batch3.batchSize != 1 {
t.Errorf("Expected negative batch size to be adjusted to 1, got %d", batch3.batchSize)
}
-
+
return nil
})
if err != nil {
@@ -66,29 +66,29 @@ func TestNewLocalToDropboxBatch_InitializedFields(t *testing.T) {
err := qt_control.WithControl(func(ctl app_control.Control) error {
connector := NewLocalToDropboxBatch(ctl, nil, 50)
batch := connector.(*copierLocalToDropboxBatch)
-
+
// Verify initial state
if batch.ctl == nil {
t.Error("Expected control to be set")
}
-
+
if batch.fs == nil {
t.Error("Expected filesystem reader to be initialized")
}
-
+
// These should be nil initially (set during Startup)
if batch.queue != nil {
t.Error("Expected queue to be nil initially")
}
-
+
if batch.sessions != nil {
t.Error("Expected sessions to be nil initially")
}
-
+
if batch.block != nil {
t.Error("Expected block to be nil initially")
}
-
+
return nil
})
if err != nil {
@@ -103,15 +103,15 @@ func TestCopyBatchUploadBlock_Struct(t *testing.T) {
Path: "/test/path/file.txt",
Offset: 1024,
}
-
+
if block.SessionId != "test-session-123" {
t.Errorf("Expected SessionId 'test-session-123', got '%s'", block.SessionId)
}
-
+
if block.Path != "/test/path/file.txt" {
t.Errorf("Expected Path '/test/path/file.txt', got '%s'", block.Path)
}
-
+
if block.Offset != 1024 {
t.Errorf("Expected Offset 1024, got %d", block.Offset)
}
@@ -123,21 +123,21 @@ func TestCopierLocalToDropboxBatch_Shutdown_NoSessions(t *testing.T) {
ctl: ctl,
sessions: nil, // No sessions to shutdown
}
-
+
// This will panic with nil sessions - that's the expected behavior
// We can't really test Shutdown without proper setup
// Instead, let's just verify the struct was created properly
if batch.ctl == nil {
t.Error("Expected control to be set")
}
-
+
if batch.sessions != nil {
t.Error("Expected sessions to be nil")
}
-
+
return nil
})
if err != nil {
t.Fatal(err)
}
-}
\ No newline at end of file
+}
diff --git a/domain/dropbox/filesystem/dbx_fs_copier_batch/data_type_test.go b/domain/dropbox/filesystem/dbx_fs_copier_batch/data_type_test.go
index 9f1a6d998..428357a5d 100644
--- a/domain/dropbox/filesystem/dbx_fs_copier_batch/data_type_test.go
+++ b/domain/dropbox/filesystem/dbx_fs_copier_batch/data_type_test.go
@@ -13,26 +13,26 @@ func TestConstants(t *testing.T) {
queueIdBlockBatch,
queueIdBlockCheck,
}
-
+
for i, constant := range constants {
if constant == "" {
t.Errorf("Constant %d should not be empty", i)
}
}
-
+
// Test specific values
if queueIdBlockCommit != "upload_commit" {
t.Errorf("Expected queueIdBlockCommit to be 'upload_commit', got %s", queueIdBlockCommit)
}
-
+
if queueIdBlockUpload != "upload_block" {
t.Errorf("Expected queueIdBlockUpload to be 'upload_block', got %s", queueIdBlockUpload)
}
-
+
if queueIdBlockBatch != "upload_batch" {
t.Errorf("Expected queueIdBlockBatch to be 'upload_batch', got %s", queueIdBlockBatch)
}
-
+
if queueIdBlockCheck != "upload_check" {
t.Errorf("Expected queueIdBlockCheck to be 'upload_check', got %s", queueIdBlockCheck)
}
@@ -47,20 +47,20 @@ func TestCommitInfo(t *testing.T) {
Mute: false,
StrictConflict: true,
}
-
+
// Test JSON marshaling
data, err := json.Marshal(info)
if err != nil {
t.Errorf("Failed to marshal CommitInfo: %v", err)
}
-
+
// Test JSON unmarshaling
var unmarshaled CommitInfo
err = json.Unmarshal(data, &unmarshaled)
if err != nil {
t.Errorf("Failed to unmarshal CommitInfo: %v", err)
}
-
+
// Verify fields
if unmarshaled.Path != info.Path {
t.Errorf("Expected Path %s, got %s", info.Path, unmarshaled.Path)
@@ -78,20 +78,20 @@ func TestUploadCursor(t *testing.T) {
SessionId: "test-session",
Offset: 1024,
}
-
+
// Test JSON marshaling
data, err := json.Marshal(cursor)
if err != nil {
t.Errorf("Failed to marshal UploadCursor: %v", err)
}
-
+
// Test JSON unmarshaling
var unmarshaled UploadCursor
err = json.Unmarshal(data, &unmarshaled)
if err != nil {
t.Errorf("Failed to unmarshal UploadCursor: %v", err)
}
-
+
if unmarshaled.SessionId != cursor.SessionId {
t.Errorf("Expected SessionId %s, got %s", cursor.SessionId, unmarshaled.SessionId)
}
@@ -104,20 +104,20 @@ func TestSessionId(t *testing.T) {
sessionId := SessionId{
SessionId: "test-session-123",
}
-
+
// Test JSON marshaling
data, err := json.Marshal(sessionId)
if err != nil {
t.Errorf("Failed to marshal SessionId: %v", err)
}
-
+
// Test JSON unmarshaling
var unmarshaled SessionId
err = json.Unmarshal(data, &unmarshaled)
if err != nil {
t.Errorf("Failed to unmarshal SessionId: %v", err)
}
-
+
if unmarshaled.SessionId != sessionId.SessionId {
t.Errorf("Expected SessionId %s, got %s", sessionId.SessionId, unmarshaled.SessionId)
}
@@ -131,20 +131,20 @@ func TestUploadAppend(t *testing.T) {
},
Close: true,
}
-
+
// Test JSON marshaling
data, err := json.Marshal(upload)
if err != nil {
t.Errorf("Failed to marshal UploadAppend: %v", err)
}
-
+
// Test JSON unmarshaling
var unmarshaled UploadAppend
err = json.Unmarshal(data, &unmarshaled)
if err != nil {
t.Errorf("Failed to unmarshal UploadAppend: %v", err)
}
-
+
if unmarshaled.Close != upload.Close {
t.Errorf("Expected Close %t, got %t", upload.Close, unmarshaled.Close)
}
@@ -164,20 +164,20 @@ func TestUploadFinish(t *testing.T) {
Mode: "add",
},
}
-
+
// Test JSON marshaling
data, err := json.Marshal(finish)
if err != nil {
t.Errorf("Failed to marshal UploadFinish: %v", err)
}
-
+
// Test JSON unmarshaling
var unmarshaled UploadFinish
err = json.Unmarshal(data, &unmarshaled)
if err != nil {
t.Errorf("Failed to unmarshal UploadFinish: %v", err)
}
-
+
if unmarshaled.Commit.Path != finish.Commit.Path {
t.Errorf("Expected Commit.Path %s, got %s", finish.Commit.Path, unmarshaled.Commit.Path)
}
@@ -196,20 +196,20 @@ func TestUploadFinishBatch(t *testing.T) {
},
},
}
-
+
// Test JSON marshaling
data, err := json.Marshal(batch)
if err != nil {
t.Errorf("Failed to marshal UploadFinishBatch: %v", err)
}
-
+
// Test JSON unmarshaling
var unmarshaled UploadFinishBatch
err = json.Unmarshal(data, &unmarshaled)
if err != nil {
t.Errorf("Failed to unmarshal UploadFinishBatch: %v", err)
}
-
+
if len(unmarshaled.Entries) != len(batch.Entries) {
t.Errorf("Expected %d entries, got %d", len(batch.Entries), len(unmarshaled.Entries))
}
@@ -219,24 +219,24 @@ func TestFinishBatch(t *testing.T) {
batch := FinishBatch{
Batch: []string{"session1", "session2", "session3"},
}
-
+
// Test JSON marshaling
data, err := json.Marshal(batch)
if err != nil {
t.Errorf("Failed to marshal FinishBatch: %v", err)
}
-
+
// Test JSON unmarshaling
var unmarshaled FinishBatch
err = json.Unmarshal(data, &unmarshaled)
if err != nil {
t.Errorf("Failed to unmarshal FinishBatch: %v", err)
}
-
+
if len(unmarshaled.Batch) != len(batch.Batch) {
t.Errorf("Expected %d batch items, got %d", len(batch.Batch), len(unmarshaled.Batch))
}
-
+
for i, item := range batch.Batch {
if unmarshaled.Batch[i] != item {
t.Errorf("Expected batch[%d] to be %s, got %s", i, item, unmarshaled.Batch[i])
@@ -249,24 +249,24 @@ func TestSessionCheck(t *testing.T) {
SessionId: "test-session-check",
Path: "/check/path",
}
-
+
// Test JSON marshaling
data, err := json.Marshal(check)
if err != nil {
t.Errorf("Failed to marshal SessionCheck: %v", err)
}
-
+
// Test JSON unmarshaling
var unmarshaled SessionCheck
err = json.Unmarshal(data, &unmarshaled)
if err != nil {
t.Errorf("Failed to unmarshal SessionCheck: %v", err)
}
-
+
if unmarshaled.SessionId != check.SessionId {
t.Errorf("Expected SessionId %s, got %s", check.SessionId, unmarshaled.SessionId)
}
if unmarshaled.Path != check.Path {
t.Errorf("Expected Path %s, got %s", check.Path, unmarshaled.Path)
}
-}
\ No newline at end of file
+}
diff --git a/domain/dropbox/model/mo_device/device_test.go b/domain/dropbox/model/mo_device/device_test.go
index eac283838..5578b0a20 100644
--- a/domain/dropbox/model/mo_device/device_test.go
+++ b/domain/dropbox/model/mo_device/device_test.go
@@ -68,7 +68,7 @@ func TestMetadata_Web(t *testing.T) {
"ip_address": "192.168.1.1",
"country": "US"
}`)
-
+
metadata := &Metadata{
Raw: webRaw,
Tag: DeviceTypeWeb,
@@ -107,7 +107,7 @@ func TestMetadata_Desktop(t *testing.T) {
"platform": "Windows",
"is_delete_on_unlink_supported": true
}`)
-
+
metadata := &Metadata{
Raw: desktopRaw,
Tag: DeviceTypeDesktop,
@@ -146,7 +146,7 @@ func TestMetadata_Mobile(t *testing.T) {
"client_version": "8.2.0",
"os_version": "iOS 14.0"
}`)
-
+
metadata := &Metadata{
Raw: mobileRaw,
Tag: "desktop", // Bug in implementation requires "desktop" tag
@@ -334,7 +334,7 @@ func TestMobile(t *testing.T) {
func TestNewMemberSession(t *testing.T) {
// Since we can't import mo_member due to potential circular dependencies,
// we'll test what we can by creating the necessary structures
-
+
// This test verifies the function exists and has the right signature
// Real testing would require mo_member.Member type
}
@@ -353,26 +353,26 @@ func TestMemberSession_Session(t *testing.T) {
"updated": "2023-01-01T01:00:00Z"
}
}`)
-
+
ms := &MemberSession{
Raw: raw,
TeamMemberId: "dbmid:test123",
DeviceTag: DeviceTypeWeb,
}
-
+
session := ms.Session()
if session == nil {
t.Error("Expected session to be returned")
}
-
+
if session.EntryTeamMemberId() != "dbmid:test123" {
t.Error("Expected team member ID to match")
}
-
+
if session.EntryTag() != DeviceTypeWeb {
t.Error("Expected tag to match")
}
-
+
// Test with invalid session data
invalidRaw := json.RawMessage(`{
"profile": {
@@ -381,13 +381,13 @@ func TestMemberSession_Session(t *testing.T) {
"device_tag": "web_session",
"session": "invalid"
}`)
-
+
ms2 := &MemberSession{
Raw: invalidRaw,
TeamMemberId: "dbmid:test123",
DeviceTag: DeviceTypeWeb,
}
-
+
// Should still return a session, even if empty
session2 := ms2.Session()
if session2 == nil {
@@ -428,7 +428,7 @@ func TestMemberSessionStruct(t *testing.T) {
OsVersion: "iOS 14.0",
LastCarrier: "Verizon",
}
-
+
// Just verify all fields are accessible
if ms.TeamMemberId != "dbmid:test123" {
t.Error("Expected TeamMemberId to be set")
@@ -439,4 +439,4 @@ func TestMemberSessionStruct(t *testing.T) {
if ms.DeviceTag != DeviceTypeWeb {
t.Error("Expected DeviceTag to be set")
}
-}
\ No newline at end of file
+}
diff --git a/domain/dropbox/usecase/uc_file_merge/msg_test.go b/domain/dropbox/usecase/uc_file_merge/msg_test.go
index 35d5604a4..0cd891434 100644
--- a/domain/dropbox/usecase/uc_file_merge/msg_test.go
+++ b/domain/dropbox/usecase/uc_file_merge/msg_test.go
@@ -10,10 +10,10 @@ func TestMsgMerge(t *testing.T) {
if MMerge == nil {
t.Error("Expected MMerge to be initialized")
}
-
+
// Test that messages are accessible
_ = MMerge.RemoveEmptyFolder
_ = MMerge.RemoveDuplicatedFile
_ = MMerge.RemoveOldContent
_ = MMerge.MoveFile
-}
\ No newline at end of file
+}
diff --git a/domain/dropbox/usecase/uc_file_merge/options_test.go b/domain/dropbox/usecase/uc_file_merge/options_test.go
index cf71e6b3b..fd4668ef0 100644
--- a/domain/dropbox/usecase/uc_file_merge/options_test.go
+++ b/domain/dropbox/usecase/uc_file_merge/options_test.go
@@ -7,24 +7,24 @@ import (
// Test the option functions
func TestMergeOptions(t *testing.T) {
opts := &MergeOpts{}
-
+
// Test DryRun
opts = DryRun()(opts)
if !opts.DryRun {
t.Error("Expected DryRun to be true")
}
-
+
// Test WithinSameNamespace
opts = &MergeOpts{}
opts = WithinSameNamespace()(opts)
if !opts.WithinSameNamespace {
t.Error("Expected WithinSameNamespace to be true")
}
-
+
// Test ClearEmptyFolder
opts = &MergeOpts{}
opts = ClearEmptyFolder()(opts)
if !opts.CleanEmptyFolder {
t.Error("Expected CleanEmptyFolder to be true")
}
-}
\ No newline at end of file
+}
diff --git a/domain/dropbox/usecase/uc_insight/data_errors_test.go b/domain/dropbox/usecase/uc_insight/data_errors_test.go
index 2f34af24d..1d200267c 100644
--- a/domain/dropbox/usecase/uc_insight/data_errors_test.go
+++ b/domain/dropbox/usecase/uc_insight/data_errors_test.go
@@ -230,4 +230,4 @@ func TestMockApiErrorRecord_ToParam(t *testing.T) {
} else {
t.Error("Expected ToParam to return map[string]string")
}
-}
\ No newline at end of file
+}
diff --git a/domain/dropbox/usecase/uc_insight/data_member.go b/domain/dropbox/usecase/uc_insight/data_member.go
index 2349b887f..3fece9f26 100644
--- a/domain/dropbox/usecase/uc_insight/data_member.go
+++ b/domain/dropbox/usecase/uc_insight/data_member.go
@@ -6,7 +6,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/model/mo_profile"
"github.com/watermint/toolbox/domain/dropbox/service/sv_member"
"github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"gorm.io/gorm"
diff --git a/domain/dropbox/usecase/uc_insight/data_namespace.go b/domain/dropbox/usecase/uc_insight/data_namespace.go
index 10c7f9f54..643d0fef9 100644
--- a/domain/dropbox/usecase/uc_insight/data_namespace.go
+++ b/domain/dropbox/usecase/uc_insight/data_namespace.go
@@ -9,7 +9,7 @@ import (
"github.com/watermint/toolbox/domain/dropbox/service/sv_namespace"
"github.com/watermint/toolbox/domain/dropbox/service/sv_sharedfolder"
"github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/queue/eq_sequence"
"gorm.io/gorm"
diff --git a/domain/dropbox/usecase/uc_insight/scanner_test.go b/domain/dropbox/usecase/uc_insight/scanner_test.go
index 33d8049c8..146d567f5 100644
--- a/domain/dropbox/usecase/uc_insight/scanner_test.go
+++ b/domain/dropbox/usecase/uc_insight/scanner_test.go
@@ -252,7 +252,7 @@ func TestHasEntryOf_InvalidTable(t *testing.T) {
// Define a struct that doesn't exist as a table
type NonExistentTable struct {
- ID uint `gorm:"primaryKey"`
+ ID uint `gorm:"primaryKey"`
Name string
}
@@ -376,13 +376,13 @@ func TestQueueConstants(t *testing.T) {
teamScanQueueNamespaceMember: "scan_namespace_member",
teamScanQueueReceivedFile: "scan_received_file",
teamScanQueueSharedLink: "scan_shared_link",
- teamScanQueueTeamFolder: "scan_team_folder",
- teamSummarizeEntry: "resolve_entry",
+ teamScanQueueTeamFolder: "scan_team_folder",
+ teamSummarizeEntry: "resolve_entry",
teamSummarizeFolderImmediate: "resolve_folder_immediate",
- teamSummarizeFolderPath: "resolve_folder_path",
+ teamSummarizeFolderPath: "resolve_folder_path",
teamSummarizeFolderRecursive: "resolve_folder_recursive",
- teamSummarizeNamespace: "resolve_namespace",
- teamSummarizeTeamFolder: "resolve_team_folder",
+ teamSummarizeNamespace: "resolve_namespace",
+ teamSummarizeTeamFolder: "resolve_team_folder",
teamSummarizeTeamFolderEntry: "resolve_team_folder_entry",
}
@@ -477,4 +477,4 @@ func TestNewDatabase_InvalidPath(t *testing.T) {
t.Error("Expected nil database for invalid path")
}
})
-}
\ No newline at end of file
+}
diff --git a/domain/dropbox/usecase/uc_insight/summary_test.go b/domain/dropbox/usecase/uc_insight/summary_test.go
index b16f0988c..a6a5dc2f5 100644
--- a/domain/dropbox/usecase/uc_insight/summary_test.go
+++ b/domain/dropbox/usecase/uc_insight/summary_test.go
@@ -374,4 +374,4 @@ func TestSummaryImpl_DatabaseClosure(t *testing.T) {
// We can't easily verify this without accessing private fields
// but the test ensures the method completes successfully
})
-}
\ No newline at end of file
+}
diff --git a/domain/dropbox/usecase/uc_teamfolder/teamfolder_test.go b/domain/dropbox/usecase/uc_teamfolder/teamfolder_test.go
index b8c318681..ab8e7f6b0 100644
--- a/domain/dropbox/usecase/uc_teamfolder/teamfolder_test.go
+++ b/domain/dropbox/usecase/uc_teamfolder/teamfolder_test.go
@@ -1,9 +1,9 @@
package uc_teamfolder
import (
- "testing"
"github.com/watermint/toolbox/domain/dropbox/model/mo_path"
"github.com/watermint/toolbox/domain/dropbox/model/mo_sharedfolder"
+ "testing"
)
func TestAccessTypes(t *testing.T) {
@@ -103,7 +103,7 @@ func TestTeamContentImplFields(t *testing.T) {
adminGroupName: "test-admin-group",
admin: nil, // Would need mock profile
}
-
+
if impl.adminGroupName != "test-admin-group" {
t.Error("Expected adminGroupName to be set correctly")
}
@@ -117,11 +117,11 @@ func TestIsValidAccessType(t *testing.T) {
AccessTypeViewer,
AccessTypeViewerNoComment,
}
-
+
for _, at := range validTypes {
// Just verify they are non-empty strings
if string(at) == "" {
t.Errorf("AccessType %v should not be empty", at)
}
}
-}
\ No newline at end of file
+}
diff --git a/domain/dropbox/usecase/uc_teamfolder_scanner/scanner_simple_test.go b/domain/dropbox/usecase/uc_teamfolder_scanner/scanner_simple_test.go
index d25d32371..2c5af466c 100644
--- a/domain/dropbox/usecase/uc_teamfolder_scanner/scanner_simple_test.go
+++ b/domain/dropbox/usecase/uc_teamfolder_scanner/scanner_simple_test.go
@@ -42,7 +42,7 @@ func TestScanImpl_StorageOperations(t *testing.T) {
qtr_endtoend.TestWithControl(t, func(ctl app_control.Control) {
// Create empty KVS for testing
kvs := kv_kvs_impl.NewEmpty()
-
+
// Test basic KVS operations
err := kvs.PutString("test_key", "test_value")
if err != nil {
@@ -168,10 +168,10 @@ func TestScanImpl_FilterValidation(t *testing.T) {
// Test with valid filters
validFilters := []string{
- "", // empty filter
- "project", // simple filter
- "Project*", // wildcard
- "test|demo", // OR filter
+ "", // empty filter
+ "project", // simple filter
+ "Project*", // wildcard
+ "test|demo", // OR filter
}
for _, filterStr := range validFilters {
@@ -208,7 +208,7 @@ func TestScanImpl_ErrorScenarios(t *testing.T) {
scanner := New(ctl, ctx, ScanTimeoutShort, dbx_filesystem.BaseNamespaceRoot)
// Test error scenarios
-
+
// Test with nil filter should error
_, err := scanner.Scan(nil)
if err == nil {
@@ -224,4 +224,4 @@ func TestScanImpl_ErrorScenarios(t *testing.T) {
}
})
})
-}
\ No newline at end of file
+}
diff --git a/domain/figma/model/mo_user/user.go b/domain/figma/model/mo_user/user.go
index 67421064e..70b307083 100644
--- a/domain/figma/model/mo_user/user.go
+++ b/domain/figma/model/mo_user/user.go
@@ -4,7 +4,7 @@ import "encoding/json"
type User struct {
Raw json.RawMessage
- Id string `json:"id" path:"id""`
+ Id string `json:"id" path:"id"`
Handle string `json:"handle" path:"handle"`
ImgUrl string `json:"img_url" path:"img_url"`
Email string `json:"email" path:"email"`
diff --git a/essentials/ambient/doc.go b/essentials/ambient/doc.go
new file mode 100644
index 000000000..70f07cdbf
--- /dev/null
+++ b/essentials/ambient/doc.go
@@ -0,0 +1,2 @@
+// Package ambient provides ambient functionalities like indicators and notifications.
+package ambient
diff --git a/essentials/ambient/ea_indicator/doc.go b/essentials/ambient/ea_indicator/doc.go
new file mode 100644
index 000000000..80be6c9a8
--- /dev/null
+++ b/essentials/ambient/ea_indicator/doc.go
@@ -0,0 +1,2 @@
+// Package ea_indicator provides interfaces and implementations for progress indicators and status bars.
+package ea_indicator
diff --git a/essentials/ambient/ea_notification/doc.go b/essentials/ambient/ea_notification/doc.go
new file mode 100644
index 000000000..b44cccd01
--- /dev/null
+++ b/essentials/ambient/ea_notification/doc.go
@@ -0,0 +1,2 @@
+// Package ea_notification provides a mechanism for suppressing and resuming progress notifications.
+package ea_notification
diff --git a/essentials/api/api_auth/basic_entity_test.go b/essentials/api/api_auth/basic_entity_test.go
index d97613ab7..da4a2442d 100644
--- a/essentials/api/api_auth/basic_entity_test.go
+++ b/essentials/api/api_auth/basic_entity_test.go
@@ -10,7 +10,7 @@ func TestBasicCredential_Serialize(t *testing.T) {
Username: "testuser",
Password: "testpass",
}
-
+
expected := "testuser:testpass"
if cred.Serialize() != expected {
t.Errorf("Expected %s, got %s", expected, cred.Serialize())
@@ -22,15 +22,15 @@ func TestBasicCredential_HeaderValue(t *testing.T) {
Username: "user",
Password: "pass",
}
-
+
serialized := cred.Serialize()
encoded := base64.StdEncoding.EncodeToString([]byte(serialized))
expected := "Basic " + encoded
-
+
if cred.HeaderValue() != expected {
t.Errorf("Expected %s, got %s", expected, cred.HeaderValue())
}
-
+
// Verify the header value is correctly formatted
if cred.HeaderValue()[:6] != "Basic " {
t.Error("Header value should start with 'Basic '")
@@ -39,7 +39,7 @@ func TestBasicCredential_HeaderValue(t *testing.T) {
func TestNewNoAuthBasicEntity(t *testing.T) {
entity := NewNoAuthBasicEntity()
-
+
if entity.KeyName != "" {
t.Error("KeyName should be empty")
}
@@ -62,9 +62,9 @@ func TestBasicEntity_Entity(t *testing.T) {
Description: "test description",
Timestamp: "2024-01-01T00:00:00Z",
}
-
+
entity := basicEntity.Entity()
-
+
if entity.KeyName != basicEntity.KeyName {
t.Errorf("KeyName mismatch: expected %s, got %s", basicEntity.KeyName, entity.KeyName)
}
@@ -94,19 +94,19 @@ func TestBasicEntity_HashSeed(t *testing.T) {
Password: "pass1",
},
}
-
+
hashSeed := basicEntity.HashSeed()
-
+
expected := []string{
"a", "key1",
"p", "peer1",
"c", "user1:pass1",
}
-
+
if len(hashSeed) != len(expected) {
t.Fatalf("HashSeed length mismatch: expected %d, got %d", len(expected), len(hashSeed))
}
-
+
for i, v := range expected {
if hashSeed[i] != v {
t.Errorf("HashSeed[%d] mismatch: expected %s, got %s", i, v, hashSeed[i])
@@ -116,11 +116,11 @@ func TestBasicEntity_HashSeed(t *testing.T) {
func TestDeserializeBasicCredential(t *testing.T) {
tests := []struct {
- name string
- credential string
- wantUser string
- wantPass string
- wantErr bool
+ name string
+ credential string
+ wantUser string
+ wantPass string
+ wantErr bool
}{
{
name: "valid credential",
@@ -159,23 +159,23 @@ func TestDeserializeBasicCredential(t *testing.T) {
wantErr: true,
},
}
-
+
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
cred, err := DeserializeBasicCredential(tt.credential)
-
+
if tt.wantErr {
if err == nil {
t.Error("Expected error but got none")
}
return
}
-
+
if err != nil {
t.Errorf("Unexpected error: %v", err)
return
}
-
+
if cred.Username != tt.wantUser {
t.Errorf("Username mismatch: expected %s, got %s", tt.wantUser, cred.Username)
}
@@ -195,12 +195,12 @@ func TestDeserializeBasicEntity(t *testing.T) {
Description: "test",
Timestamp: "2024-01-01T00:00:00Z",
}
-
+
basicEntity, err := DeserializeBasicEntity(entity)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
-
+
if basicEntity.KeyName != entity.KeyName {
t.Errorf("KeyName mismatch: expected %s, got %s", entity.KeyName, basicEntity.KeyName)
}
@@ -219,14 +219,14 @@ func TestDeserializeBasicEntity(t *testing.T) {
if basicEntity.Timestamp != entity.Timestamp {
t.Errorf("Timestamp mismatch: expected %s, got %s", entity.Timestamp, basicEntity.Timestamp)
}
-
+
// Test invalid credential format
invalidEntity := Entity{
KeyName: "test-key",
PeerName: "test-peer",
Credential: "invalid-no-colon",
}
-
+
_, err = DeserializeBasicEntity(invalidEntity)
if err == nil {
t.Error("Expected error for invalid credential format")
@@ -245,16 +245,16 @@ func TestBasicEntity_RoundTrip(t *testing.T) {
Description: "round trip test",
Timestamp: "2024-01-01T12:00:00Z",
}
-
+
// Convert to Entity
entity := original.Entity()
-
+
// Convert back to BasicEntity
restored, err := DeserializeBasicEntity(entity)
if err != nil {
t.Fatalf("Failed to deserialize: %v", err)
}
-
+
// Verify all fields match
if restored.KeyName != original.KeyName {
t.Errorf("KeyName mismatch after round trip")
@@ -274,4 +274,4 @@ func TestBasicEntity_RoundTrip(t *testing.T) {
if restored.Timestamp != original.Timestamp {
t.Errorf("Timestamp mismatch after round trip")
}
-}
\ No newline at end of file
+}
diff --git a/essentials/api/api_auth/doc.go b/essentials/api/api_auth/doc.go
new file mode 100644
index 000000000..a3c86eb28
--- /dev/null
+++ b/essentials/api/api_auth/doc.go
@@ -0,0 +1,2 @@
+// Package api_auth provides interfaces and implementations for various API authentication methods.
+package api_auth
diff --git a/essentials/api/api_auth/entity_test.go b/essentials/api/api_auth/entity_test.go
index e38204be1..075a42408 100644
--- a/essentials/api/api_auth/entity_test.go
+++ b/essentials/api/api_auth/entity_test.go
@@ -7,7 +7,7 @@ import (
func TestEntity_NoCredential(t *testing.T) {
timestamp := time.Now().Format(time.RFC3339)
-
+
entity := Entity{
KeyName: "test-key",
Scope: "read write",
@@ -93,4 +93,4 @@ func TestEntityNoCredential_Fields(t *testing.T) {
if entity.Timestamp != "2024-01-02T00:00:00Z" {
t.Errorf("Timestamp not set correctly")
}
-}
\ No newline at end of file
+}
diff --git a/essentials/api/api_auth/repository_test.go b/essentials/api/api_auth/repository_test.go
index 48185c523..85c2ecfe6 100644
--- a/essentials/api/api_auth/repository_test.go
+++ b/essentials/api/api_auth/repository_test.go
@@ -25,11 +25,11 @@ func (m *mockRepository) makeKey(keyName, scope, peerName string) string {
func (m *mockRepository) Put(entity Entity) {
m.mu.Lock()
defer m.mu.Unlock()
-
+
if m.closed {
panic("repository is closed")
}
-
+
key := m.makeKey(entity.KeyName, entity.Scope, entity.PeerName)
m.entities[key] = entity
}
@@ -37,11 +37,11 @@ func (m *mockRepository) Put(entity Entity) {
func (m *mockRepository) Get(keyName, scope, peerName string) (entity Entity, found bool) {
m.mu.Lock()
defer m.mu.Unlock()
-
+
if m.closed {
panic("repository is closed")
}
-
+
key := m.makeKey(keyName, scope, peerName)
entity, found = m.entities[key]
return
@@ -50,11 +50,11 @@ func (m *mockRepository) Get(keyName, scope, peerName string) (entity Entity, fo
func (m *mockRepository) Delete(keyName, scope, peerName string) {
m.mu.Lock()
defer m.mu.Unlock()
-
+
if m.closed {
panic("repository is closed")
}
-
+
key := m.makeKey(keyName, scope, peerName)
delete(m.entities, key)
}
@@ -62,20 +62,20 @@ func (m *mockRepository) Delete(keyName, scope, peerName string) {
func (m *mockRepository) List(keyName, scope string) []Entity {
m.mu.Lock()
defer m.mu.Unlock()
-
+
if m.closed {
panic("repository is closed")
}
-
+
var result []Entity
prefix := keyName + "|" + scope + "|"
-
+
for key, entity := range m.entities {
if len(key) >= len(prefix) && key[:len(prefix)] == prefix {
result = append(result, entity)
}
}
-
+
return result
}
@@ -88,7 +88,7 @@ func (m *mockRepository) Close() {
func (m *mockRepository) All() []Entity {
m.mu.Lock()
defer m.mu.Unlock()
-
+
var result []Entity
for _, entity := range m.entities {
result = append(result, entity)
@@ -99,7 +99,7 @@ func (m *mockRepository) All() []Entity {
func TestRepository_PutAndGet(t *testing.T) {
repo := newMockRepository()
defer repo.Close()
-
+
entity := Entity{
KeyName: "test-key",
Scope: "test-scope",
@@ -108,23 +108,23 @@ func TestRepository_PutAndGet(t *testing.T) {
Description: "test description",
Timestamp: "2024-01-01T00:00:00Z",
}
-
+
// Put entity
repo.Put(entity)
-
+
// Get entity
retrieved, found := repo.Get("test-key", "test-scope", "test-peer")
if !found {
t.Error("Entity not found after Put")
}
-
+
if retrieved.KeyName != entity.KeyName {
t.Errorf("KeyName mismatch: expected %s, got %s", entity.KeyName, retrieved.KeyName)
}
if retrieved.Credential != entity.Credential {
t.Errorf("Credential mismatch: expected %s, got %s", entity.Credential, retrieved.Credential)
}
-
+
// Get non-existent entity
_, found = repo.Get("non-existent", "test-scope", "test-peer")
if found {
@@ -135,25 +135,25 @@ func TestRepository_PutAndGet(t *testing.T) {
func TestRepository_Delete(t *testing.T) {
repo := newMockRepository()
defer repo.Close()
-
+
entity := Entity{
KeyName: "delete-key",
Scope: "delete-scope",
PeerName: "delete-peer",
}
-
+
// Put entity
repo.Put(entity)
-
+
// Verify it exists
_, found := repo.Get("delete-key", "delete-scope", "delete-peer")
if !found {
t.Error("Entity should exist before delete")
}
-
+
// Delete entity
repo.Delete("delete-key", "delete-scope", "delete-peer")
-
+
// Verify it's gone
_, found = repo.Get("delete-key", "delete-scope", "delete-peer")
if found {
@@ -164,7 +164,7 @@ func TestRepository_Delete(t *testing.T) {
func TestRepository_List(t *testing.T) {
repo := newMockRepository()
defer repo.Close()
-
+
// Put multiple entities with same key and scope
entities := []Entity{
{KeyName: "list-key", Scope: "list-scope", PeerName: "peer1"},
@@ -173,35 +173,35 @@ func TestRepository_List(t *testing.T) {
{KeyName: "other-key", Scope: "list-scope", PeerName: "peer4"},
{KeyName: "list-key", Scope: "other-scope", PeerName: "peer5"},
}
-
+
for _, e := range entities {
repo.Put(e)
}
-
+
// List entities for list-key/list-scope
results := repo.List("list-key", "list-scope")
if len(results) != 3 {
t.Errorf("Expected 3 entities, got %d", len(results))
}
-
+
// Verify all results match the criteria
for _, r := range results {
if r.KeyName != "list-key" || r.Scope != "list-scope" {
t.Errorf("Unexpected entity in results: %+v", r)
}
}
-
+
// List entities for other combinations
results = repo.List("other-key", "list-scope")
if len(results) != 1 {
t.Errorf("Expected 1 entity for other-key, got %d", len(results))
}
-
+
results = repo.List("list-key", "other-scope")
if len(results) != 1 {
t.Errorf("Expected 1 entity for other-scope, got %d", len(results))
}
-
+
// List non-existent combination
results = repo.List("non-existent", "non-existent")
if len(results) != 0 {
@@ -212,21 +212,21 @@ func TestRepository_List(t *testing.T) {
func TestRepositoryTraversable_All(t *testing.T) {
repo := newMockRepository()
defer repo.Close()
-
+
// Put some entities
entities := []Entity{
{KeyName: "key1", Scope: "scope1", PeerName: "peer1"},
{KeyName: "key2", Scope: "scope2", PeerName: "peer2"},
{KeyName: "key3", Scope: "scope3", PeerName: "peer3"},
}
-
+
for _, e := range entities {
repo.Put(e)
}
-
+
// Get all entities
all := repo.All()
if len(all) != 3 {
t.Errorf("Expected 3 entities, got %d", len(all))
}
-}
\ No newline at end of file
+}
diff --git a/essentials/api/api_auth_basic/doc.go b/essentials/api/api_auth_basic/doc.go
new file mode 100644
index 000000000..bc7729b7a
--- /dev/null
+++ b/essentials/api/api_auth_basic/doc.go
@@ -0,0 +1,2 @@
+// Package api_auth_basic provides basic authentication session management.
+package api_auth_basic
diff --git a/essentials/api/api_auth_basic_test/console_test.go b/essentials/api/api_auth_basic_test/console_test.go
index 690eb9c26..e14be1940 100644
--- a/essentials/api/api_auth_basic_test/console_test.go
+++ b/essentials/api/api_auth_basic_test/console_test.go
@@ -1,12 +1,13 @@
-package api_auth_basic_test
+package api_auth_basic
import (
+ "testing"
+
"github.com/watermint/toolbox/essentials/api/api_auth"
"github.com/watermint/toolbox/essentials/api/api_auth_basic"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/control/app_definitions"
"github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
- "testing"
)
func TestConsole(t *testing.T) {
diff --git a/essentials/api/api_auth_basic_test/doc.go b/essentials/api/api_auth_basic_test/doc.go
new file mode 100644
index 000000000..35d2fbf14
--- /dev/null
+++ b/essentials/api/api_auth_basic_test/doc.go
@@ -0,0 +1,2 @@
+// Package api_auth_basic provides tests for the api_auth_basic package.
+package api_auth_basic
diff --git a/essentials/api/api_auth_key/doc.go b/essentials/api/api_auth_key/doc.go
new file mode 100644
index 000000000..30b351725
--- /dev/null
+++ b/essentials/api/api_auth_key/doc.go
@@ -0,0 +1,2 @@
+// Package api_auth_key provides API key authentication session management.
+package api_auth_key
diff --git a/essentials/api/api_auth_oauth/doc.go b/essentials/api/api_auth_oauth/doc.go
new file mode 100644
index 000000000..bdcc13ee3
--- /dev/null
+++ b/essentials/api/api_auth_oauth/doc.go
@@ -0,0 +1,2 @@
+// Package api_auth_oauth provides OAuth 2.0 authentication session management.
+package api_auth_oauth
diff --git a/essentials/api/api_auth_oauth_test/code_test.go b/essentials/api/api_auth_oauth_test/code_test.go
index cfbc19400..cea7edfdf 100644
--- a/essentials/api/api_auth_oauth_test/code_test.go
+++ b/essentials/api/api_auth_oauth_test/code_test.go
@@ -1,12 +1,13 @@
-package api_auth_oauth_test
+package api_auth_oauth
import (
+ "testing"
+
"github.com/watermint/toolbox/essentials/api/api_auth"
"github.com/watermint/toolbox/essentials/api/api_auth_oauth"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/control/app_definitions"
"github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
- "testing"
)
func TestCode(t *testing.T) {
diff --git a/essentials/api/api_auth_oauth_test/doc.go b/essentials/api/api_auth_oauth_test/doc.go
new file mode 100644
index 000000000..871f23dad
--- /dev/null
+++ b/essentials/api/api_auth_oauth_test/doc.go
@@ -0,0 +1,2 @@
+// Package api_auth_oauth provides tests for the api_auth_oauth package.
+package api_auth_oauth
diff --git a/essentials/api/api_auth_repo/doc.go b/essentials/api/api_auth_repo/doc.go
new file mode 100644
index 000000000..31b9a110d
--- /dev/null
+++ b/essentials/api/api_auth_repo/doc.go
@@ -0,0 +1,2 @@
+// Package api_auth_repo provides repository implementations for storing and retrieving authentication entities.
+package api_auth_repo
diff --git a/essentials/api/api_callback/callback_additional_test.go b/essentials/api/api_callback/callback_additional_test.go
index 6906d0dfa..ca223d005 100644
--- a/essentials/api/api_callback/callback_additional_test.go
+++ b/essentials/api/api_callback/callback_additional_test.go
@@ -11,7 +11,7 @@ import (
func TestCallbackImpl_pingMethod(t *testing.T) {
err := qt_control.WithControl(func(ctl app_control.Control) error {
service := &mockService{}
-
+
// Test ping with server error
cb := &callbackImpl{
ctl: ctl,
@@ -20,15 +20,15 @@ func TestCallbackImpl_pingMethod(t *testing.T) {
secure: false,
serverError: ErrorAnotherServerOnline,
}
-
+
err := cb.ping()
if err != ErrorAnotherServerOnline {
t.Errorf("Expected ErrorAnotherServerOnline, got %v", err)
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -37,23 +37,23 @@ func TestCallbackImpl_pingMethod(t *testing.T) {
func TestCallbackImpl_Shutdown(t *testing.T) {
err := qt_control.WithControl(func(ctl app_control.Control) error {
service := &mockService{}
-
+
cb := &callbackImpl{
- ctl: ctl,
- service: service,
- port: 8080,
- secure: false,
- flowStatus: make(chan struct{}, 1),
+ ctl: ctl,
+ service: service,
+ port: 8080,
+ secure: false,
+ flowStatus: make(chan struct{}, 1),
}
-
+
// Test shutdown without server
cb.Shutdown()
-
+
// flowStatus might be nil, just test that it doesn't panic
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -62,7 +62,7 @@ func TestCallbackImpl_Shutdown(t *testing.T) {
func TestCallbackImpl_Fields(t *testing.T) {
err := qt_control.WithControl(func(ctl app_control.Control) error {
service := &mockService{}
-
+
cb := &callbackImpl{
instance: "test-instance",
service: service,
@@ -72,26 +72,26 @@ func TestCallbackImpl_Fields(t *testing.T) {
serverToken: "test-token",
serverReady: true,
}
-
+
if cb.instance != "test-instance" {
t.Error("Expected instance to be 'test-instance'")
}
-
+
if cb.serverToken != "test-token" {
t.Error("Expected serverToken to be 'test-token'")
}
-
+
if !cb.serverReady {
t.Error("Expected serverReady to be true")
}
-
+
if !cb.secure {
t.Error("Expected secure to be true")
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -102,7 +102,7 @@ func TestMsgCallback(t *testing.T) {
if MCallback == nil {
t.Error("Expected MCallback to be initialized")
}
-
+
// Test that messages are accessible
_ = MCallback.MsgOpenUrlOnYourBrowser
_ = MCallback.MsgErrorOpenUrlOnYourBrowser
@@ -119,7 +119,7 @@ func TestErrorConstants(t *testing.T) {
if ErrorAnotherServerOnline.Error() != "another server is online" {
t.Error("Expected ErrorAnotherServerOnline to have correct message")
}
-
+
if shutdownTimeout != 5*1000*time.Millisecond {
t.Error("Expected shutdownTimeout to be 5 seconds")
}
@@ -128,28 +128,28 @@ func TestErrorConstants(t *testing.T) {
func TestInstanceId(t *testing.T) {
// Test that instanceId counter increments
initialValue := instanceId.Load()
-
+
err := qt_control.WithControl(func(ctl app_control.Control) error {
service := &mockService{}
-
+
cb1 := New(ctl, service, 8080, false)
impl1 := cb1.(*callbackImpl)
-
+
cb2 := New(ctl, service, 8081, false)
impl2 := cb2.(*callbackImpl)
-
+
// Instance IDs should be different
if impl1.instance == impl2.instance {
t.Error("Expected different instance IDs")
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
-
+
// Verify counter incremented
if instanceId.Load() <= initialValue {
t.Error("Expected instanceId to increment")
@@ -159,24 +159,24 @@ func TestInstanceId(t *testing.T) {
func TestCallbackImpl_urlForPathSecure(t *testing.T) {
err := qt_control.WithControl(func(ctl app_control.Control) error {
service := &mockService{}
-
+
cb := &callbackImpl{
ctl: ctl,
service: service,
port: 8443,
secure: true,
}
-
+
url := cb.urlForPath("/test")
expected := "https://localhost:8443/test"
-
+
if url != expected {
t.Errorf("urlForPath() = %v, want %v", url, expected)
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -184,22 +184,22 @@ func TestCallbackImpl_urlForPathSecure(t *testing.T) {
func TestService_Interface(t *testing.T) {
service := &mockService{verifyResult: true}
-
+
// Test Url method
url := service.Url("http://example.com/callback")
expected := "http://example.com/callback?state=test-state"
if url != expected {
t.Errorf("Url() = %v, want %v", url, expected)
}
-
+
// Test Verify method with true result
if !service.Verify("test", "code") {
t.Error("Expected Verify to return true")
}
-
+
// Test Verify method with false result
service.verifyResult = false
if service.Verify("test", "code") {
t.Error("Expected Verify to return false")
}
-}
\ No newline at end of file
+}
diff --git a/essentials/api/api_callback/callback_simple_test.go b/essentials/api/api_callback/callback_simple_test.go
index 7eaa57c84..9fda21894 100644
--- a/essentials/api/api_callback/callback_simple_test.go
+++ b/essentials/api/api_callback/callback_simple_test.go
@@ -1,16 +1,16 @@
package api_callback
import (
- "testing"
"github.com/watermint/toolbox/essentials/runtime/es_open"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/quality/infra/qt_control"
+ "testing"
)
func TestCallbackImpl_urlForPath_variations(t *testing.T) {
err := qt_control.WithControl(func(ctl app_control.Control) error {
service := &mockService{}
-
+
// Test different port numbers
tests := []struct {
name string
@@ -25,7 +25,7 @@ func TestCallbackImpl_urlForPath_variations(t *testing.T) {
{"https_443", 443, true, "/", "https://localhost:443/"},
{"http_root", 80, false, "", "http://localhost:80"},
}
-
+
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
cb := &callbackImpl{
@@ -34,17 +34,17 @@ func TestCallbackImpl_urlForPath_variations(t *testing.T) {
port: tt.port,
secure: tt.secure,
}
-
+
got := cb.urlForPath(tt.path)
if got != tt.want {
t.Errorf("urlForPath() = %v, want %v", got, tt.want)
}
})
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -53,7 +53,7 @@ func TestCallbackImpl_urlForPath_variations(t *testing.T) {
func TestCallbackImpl_openUrl(t *testing.T) {
err := qt_control.WithControl(func(ctl app_control.Control) error {
service := &mockService{}
-
+
cb := &callbackImpl{
ctl: ctl,
service: service,
@@ -61,14 +61,14 @@ func TestCallbackImpl_openUrl(t *testing.T) {
secure: false,
opener: es_open.NewTestDummy(),
}
-
+
// Just test that it doesn't panic
cb.openUrl("http://example.com/auth")
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
-}
\ No newline at end of file
+}
diff --git a/essentials/api/api_callback/callback_test.go b/essentials/api/api_callback/callback_test.go
index aa5400578..deb5ae5da 100644
--- a/essentials/api/api_callback/callback_test.go
+++ b/essentials/api/api_callback/callback_test.go
@@ -29,33 +29,33 @@ func (m *mockService) Verify(state, code string) bool {
func TestNew(t *testing.T) {
err := qt_control.WithControl(func(ctl app_control.Control) error {
service := &mockService{}
-
+
cb := New(ctl, service, 8080, false)
-
+
if cb == nil {
t.Fatal("Expected callback instance, got nil")
}
-
+
impl, ok := cb.(*callbackImpl)
if !ok {
t.Fatal("Expected callbackImpl type")
}
-
+
if impl.port != 8080 {
t.Errorf("Expected port 8080, got %d", impl.port)
}
-
+
if impl.secure != false {
t.Error("Expected secure to be false")
}
-
+
if impl.service != service {
t.Error("Service not set correctly")
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -65,25 +65,25 @@ func TestNewWithOpener(t *testing.T) {
err := qt_control.WithControl(func(ctl app_control.Control) error {
service := &mockService{}
opener := es_open.NewTestDummy()
-
+
cb := NewWithOpener(ctl, service, 8080, false, opener)
-
+
if cb == nil {
t.Fatal("Expected callback instance, got nil")
}
-
+
impl, ok := cb.(*callbackImpl)
if !ok {
t.Fatal("Expected callbackImpl type")
}
-
+
if impl.opener != opener {
t.Error("Opener not set correctly")
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -92,7 +92,7 @@ func TestNewWithOpener(t *testing.T) {
func TestCallbackImpl_urlForPath(t *testing.T) {
err := qt_control.WithControl(func(ctl app_control.Control) error {
service := &mockService{}
-
+
tests := []struct {
name string
secure bool
@@ -115,7 +115,7 @@ func TestCallbackImpl_urlForPath(t *testing.T) {
want: "https://localhost:8443/test",
},
}
-
+
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
cb := &callbackImpl{
@@ -124,17 +124,17 @@ func TestCallbackImpl_urlForPath(t *testing.T) {
port: tt.port,
secure: tt.secure,
}
-
+
got := cb.urlForPath(tt.path)
if got != tt.want {
t.Errorf("urlForPath() = %v, want %v", got, tt.want)
}
})
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -143,24 +143,24 @@ func TestCallbackImpl_urlForPath(t *testing.T) {
func TestCallbackImpl_Url(t *testing.T) {
err := qt_control.WithControl(func(ctl app_control.Control) error {
service := &mockService{}
-
+
cb := &callbackImpl{
ctl: ctl,
service: service,
port: 8080,
secure: false,
}
-
+
url := cb.Url()
expected := "http://localhost:8080/connect/auth"
-
+
if url != expected {
t.Errorf("Url() = %v, want %v", url, expected)
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -168,10 +168,10 @@ func TestCallbackImpl_Url(t *testing.T) {
func TestCallbackImpl_Ping(t *testing.T) {
gin.SetMode(gin.TestMode)
-
+
err := qt_control.WithControl(func(ctl app_control.Control) error {
service := &mockService{}
-
+
cb := &callbackImpl{
ctl: ctl,
service: service,
@@ -179,25 +179,25 @@ func TestCallbackImpl_Ping(t *testing.T) {
secure: false,
serverToken: "test-token",
}
-
+
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
-
+
cb.Ping(c)
-
+
if w.Code != http.StatusOK {
t.Errorf("Expected status %d, got %d", http.StatusOK, w.Code)
}
-
+
// Check response contains expected fields
body := w.Body.String()
if !strings.Contains(body, "test-token") {
t.Error("Response should contain server token")
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -205,7 +205,7 @@ func TestCallbackImpl_Ping(t *testing.T) {
func TestCallbackImpl_Connect(t *testing.T) {
gin.SetMode(gin.TestMode)
-
+
err := qt_control.WithControl(func(ctl app_control.Control) error {
tests := []struct {
name string
@@ -223,7 +223,7 @@ func TestCallbackImpl_Connect(t *testing.T) {
expectedPath: PathFailure,
},
}
-
+
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
service := &mockService{verifyResult: tt.verifyResult}
@@ -233,27 +233,27 @@ func TestCallbackImpl_Connect(t *testing.T) {
port: 8080,
secure: false,
}
-
+
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
c.Request = httptest.NewRequest("GET", "/connect/auth?state=test&code=test", nil)
-
+
cb.Connect(c)
-
+
if w.Code != http.StatusTemporaryRedirect {
t.Errorf("Expected status %d, got %d", http.StatusTemporaryRedirect, w.Code)
}
-
+
location := w.Header().Get("Location")
if location != tt.expectedPath {
t.Errorf("Expected redirect to %s, got %s", tt.expectedPath, location)
}
})
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -262,7 +262,7 @@ func TestCallbackImpl_Connect(t *testing.T) {
func TestCallbackImpl_WaitServerReady(t *testing.T) {
err := qt_control.WithControl(func(ctl app_control.Control) error {
service := &mockService{}
-
+
cb := &callbackImpl{
ctl: ctl,
service: service,
@@ -270,17 +270,17 @@ func TestCallbackImpl_WaitServerReady(t *testing.T) {
secure: false,
serverReady: false,
}
-
+
// Test when server becomes ready
go func() {
time.Sleep(50 * time.Millisecond)
cb.serverReady = true
}()
-
+
if !cb.WaitServerReady() {
t.Error("Expected server to be ready")
}
-
+
// Test when server has error
cb2 := &callbackImpl{
ctl: ctl,
@@ -290,14 +290,14 @@ func TestCallbackImpl_WaitServerReady(t *testing.T) {
serverReady: false,
serverError: ErrorAnotherServerOnline,
}
-
+
if cb2.WaitServerReady() {
t.Error("Expected server to not be ready due to error")
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -309,7 +309,7 @@ func TestServerStatus(t *testing.T) {
Version: "1.0.0",
Token: "test-token",
}
-
+
if status.Name != "test-server" {
t.Errorf("Expected name test-server, got %s", status.Name)
}
@@ -341,4 +341,4 @@ func TestConstants(t *testing.T) {
if DataUriImagePng != "data:image/png;base64," {
t.Errorf("DataUriImagePng = %s, want data:image/png;base64,", DataUriImagePng)
}
-}
\ No newline at end of file
+}
diff --git a/essentials/api/api_callback/doc.go b/essentials/api/api_callback/doc.go
new file mode 100644
index 000000000..1f7bd0f93
--- /dev/null
+++ b/essentials/api/api_callback/doc.go
@@ -0,0 +1,2 @@
+// Package api_callback provides a web server for handling OAuth2 callbacks.
+package api_callback
diff --git a/essentials/api/api_callback_test/callback_test.go b/essentials/api/api_callback_test/callback_test.go
index 625004ef5..86a58d2af 100644
--- a/essentials/api/api_callback_test/callback_test.go
+++ b/essentials/api/api_callback_test/callback_test.go
@@ -1,17 +1,18 @@
-package api_callback_test
+package api_callback
import (
"errors"
+ "net/http"
+ "net/url"
+ "sync"
+ "testing"
+
"github.com/watermint/toolbox/essentials/api/api_callback"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/runtime/es_open"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/security/sc_random"
"github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
- "net/http"
- "net/url"
- "sync"
- "testing"
)
var (
diff --git a/essentials/api/api_callback_test/doc.go b/essentials/api/api_callback_test/doc.go
new file mode 100644
index 000000000..6ec20a443
--- /dev/null
+++ b/essentials/api/api_callback_test/doc.go
@@ -0,0 +1,2 @@
+// Package api_callback provides tests for the api_callback package.
+package api_callback
diff --git a/essentials/api/api_client/doc.go b/essentials/api/api_client/doc.go
new file mode 100644
index 000000000..0c4325cc5
--- /dev/null
+++ b/essentials/api/api_client/doc.go
@@ -0,0 +1,2 @@
+// Package api_client provides interfaces for various API client operations.
+package api_client
diff --git a/essentials/api/api_conn/doc.go b/essentials/api/api_conn/doc.go
new file mode 100644
index 000000000..9adf48aba
--- /dev/null
+++ b/essentials/api/api_conn/doc.go
@@ -0,0 +1,2 @@
+// Package api_conn provides interfaces for API connections.
+package api_conn
diff --git a/essentials/api/api_conn_impl/doc.go b/essentials/api/api_conn_impl/doc.go
new file mode 100644
index 000000000..a39d0ecab
--- /dev/null
+++ b/essentials/api/api_conn_impl/doc.go
@@ -0,0 +1,2 @@
+// Package api_conn_impl provides implementations for API connection methods.
+package api_conn_impl
diff --git a/essentials/api/api_doc/doc.go b/essentials/api/api_doc/doc.go
new file mode 100644
index 000000000..bf2669164
--- /dev/null
+++ b/essentials/api/api_doc/doc.go
@@ -0,0 +1,2 @@
+// Package api_doc provides documentation-related messages and functions for API authentication.
+package api_doc
diff --git a/essentials/api/api_parser/doc.go b/essentials/api/api_parser/doc.go
new file mode 100644
index 000000000..934edefd2
--- /dev/null
+++ b/essentials/api/api_parser/doc.go
@@ -0,0 +1,2 @@
+// Package api_parser provides functions for parsing API responses into Go models.
+package api_parser
diff --git a/essentials/api/api_request/doc.go b/essentials/api/api_request/doc.go
new file mode 100644
index 000000000..c5c3d4488
--- /dev/null
+++ b/essentials/api/api_request/doc.go
@@ -0,0 +1,2 @@
+// Package api_request provides structures and functions for building API requests.
+package api_request
diff --git a/essentials/api/api_response/doc.go b/essentials/api/api_response/doc.go
new file mode 100644
index 000000000..2f9bd9d7c
--- /dev/null
+++ b/essentials/api/api_response/doc.go
@@ -0,0 +1,2 @@
+// Package api_response provides functions for asserting API responses.
+package api_response
diff --git a/essentials/api/doc.go b/essentials/api/doc.go
new file mode 100644
index 000000000..e528254d6
--- /dev/null
+++ b/essentials/api/doc.go
@@ -0,0 +1,2 @@
+// Package api provides essential functionalities for API interactions.
+package api
diff --git a/essentials/cache/doc.go b/essentials/cache/doc.go
new file mode 100644
index 000000000..561902fef
--- /dev/null
+++ b/essentials/cache/doc.go
@@ -0,0 +1,2 @@
+// Package cache provides caching functionalities.
+package cache
diff --git a/essentials/cache/ec_file/doc.go b/essentials/cache/ec_file/doc.go
new file mode 100644
index 000000000..42cf55372
--- /dev/null
+++ b/essentials/cache/ec_file/doc.go
@@ -0,0 +1,2 @@
+// Package ec_file provides a file caching mechanism for remote files.
+package ec_file
diff --git a/essentials/concurrency/doc.go b/essentials/concurrency/doc.go
new file mode 100644
index 000000000..100d62aa5
--- /dev/null
+++ b/essentials/concurrency/doc.go
@@ -0,0 +1,2 @@
+// Package concurrency provides essential concurrency utilities.
+package concurrency
diff --git a/essentials/concurrency/es_mutex/doc.go b/essentials/concurrency/es_mutex/doc.go
new file mode 100644
index 000000000..d12cad491
--- /dev/null
+++ b/essentials/concurrency/es_mutex/doc.go
@@ -0,0 +1,2 @@
+// Package es_mutex provides a mutex implementation with timeout and retry capabilities.
+package es_mutex
diff --git a/essentials/concurrency/es_name/doc.go b/essentials/concurrency/es_name/doc.go
new file mode 100644
index 000000000..0c36c270d
--- /dev/null
+++ b/essentials/concurrency/es_name/doc.go
@@ -0,0 +1,2 @@
+// Package es_name provides a function to get the current goroutine name.
+package es_name
diff --git a/essentials/concurrency/es_timeout/doc.go b/essentials/concurrency/es_timeout/doc.go
new file mode 100644
index 000000000..50c5a14e8
--- /dev/null
+++ b/essentials/concurrency/es_timeout/doc.go
@@ -0,0 +1,2 @@
+// Package es_timeout provides a function to execute a task with a timeout.
+package es_timeout
diff --git a/essentials/database/doc.go b/essentials/database/doc.go
new file mode 100644
index 000000000..fc8c32d1e
--- /dev/null
+++ b/essentials/database/doc.go
@@ -0,0 +1,2 @@
+// Package database provides essential database functionalities.
+package database
diff --git a/essentials/database/es_orm/doc.go b/essentials/database/es_orm/doc.go
new file mode 100644
index 000000000..69c3b3326
--- /dev/null
+++ b/essentials/database/es_orm/doc.go
@@ -0,0 +1,2 @@
+// Package es_orm provides functions for creating GORM database connections.
+package es_orm
diff --git a/essentials/database/es_orm_logger/doc.go b/essentials/database/es_orm_logger/doc.go
new file mode 100644
index 000000000..c3e20981e
--- /dev/null
+++ b/essentials/database/es_orm_logger/doc.go
@@ -0,0 +1,2 @@
+// Package es_orm_logger provides a GORM logger wrapper.
+package es_orm_logger
diff --git a/essentials/desktop/doc.go b/essentials/desktop/doc.go
new file mode 100644
index 000000000..aeec3c9e5
--- /dev/null
+++ b/essentials/desktop/doc.go
@@ -0,0 +1,2 @@
+// Package desktop provides functionalities for interacting with the desktop environment.
+package desktop
diff --git a/essentials/desktop/es_open/doc.go b/essentials/desktop/es_open/doc.go
new file mode 100644
index 000000000..b85307c0b
--- /dev/null
+++ b/essentials/desktop/es_open/doc.go
@@ -0,0 +1,2 @@
+// Package es_open provides an interface for opening files or URLs with their associated desktop applications.
+package es_open
diff --git a/essentials/encoding/doc.go b/essentials/encoding/doc.go
new file mode 100644
index 000000000..0412c8502
--- /dev/null
+++ b/essentials/encoding/doc.go
@@ -0,0 +1,2 @@
+// Package encoding provides essential encoding and decoding functionalities.
+package encoding
diff --git a/essentials/encoding/es_csv/doc.go b/essentials/encoding/es_csv/doc.go
new file mode 100644
index 000000000..1baa8db39
--- /dev/null
+++ b/essentials/encoding/es_csv/doc.go
@@ -0,0 +1,2 @@
+// Package es_csv provides a utility function for creating CSV strings.
+package es_csv
diff --git a/essentials/encoding/es_json/doc.go b/essentials/encoding/es_json/doc.go
new file mode 100644
index 000000000..90b108543
--- /dev/null
+++ b/essentials/encoding/es_json/doc.go
@@ -0,0 +1,2 @@
+// Package es_json provides utilities for JSON parsing, querying, and validation.
+package es_json
diff --git a/essentials/encoding/es_jsonl/doc.go b/essentials/encoding/es_jsonl/doc.go
new file mode 100644
index 000000000..a52bb4f16
--- /dev/null
+++ b/essentials/encoding/es_jsonl/doc.go
@@ -0,0 +1,2 @@
+// Package es_jsonl provides a function for reading and processing JSONL formatted data.
+package es_jsonl
diff --git a/essentials/encoding/es_unicode/doc.go b/essentials/encoding/es_unicode/doc.go
new file mode 100644
index 000000000..6137738d0
--- /dev/null
+++ b/essentials/encoding/es_unicode/doc.go
@@ -0,0 +1,2 @@
+// Package es_unicode provides functions for handling Byte Order Mark (BOM) in Unicode encoded files.
+package es_unicode
diff --git a/essentials/es_go/doc.go b/essentials/es_go/doc.go
new file mode 100644
index 000000000..879fab0e2
--- /dev/null
+++ b/essentials/es_go/doc.go
@@ -0,0 +1,2 @@
+// Package es_go provides essential functionalities for Go language specific operations.
+package es_go
diff --git a/essentials/es_go/es_errors/doc.go b/essentials/es_go/es_errors/doc.go
new file mode 100644
index 000000000..54c4225e7
--- /dev/null
+++ b/essentials/es_go/es_errors/doc.go
@@ -0,0 +1,2 @@
+// Package es_errors defines common error types and utility functions.
+package es_errors
diff --git a/essentials/go/es_errors/errors.go b/essentials/es_go/es_errors/errors.go
similarity index 100%
rename from essentials/go/es_errors/errors.go
rename to essentials/es_go/es_errors/errors.go
diff --git a/essentials/es_go/es_generate/doc.go b/essentials/es_go/es_generate/doc.go
new file mode 100644
index 000000000..43c5a9abc
--- /dev/null
+++ b/essentials/es_go/es_generate/doc.go
@@ -0,0 +1,2 @@
+// Package es_generate provides tools for generating Go code.
+package es_generate
diff --git a/essentials/go/es_generate/generate.go b/essentials/es_go/es_generate/generate.go
similarity index 100%
rename from essentials/go/es_generate/generate.go
rename to essentials/es_go/es_generate/generate.go
diff --git a/essentials/go/es_generate/generate_test.go b/essentials/es_go/es_generate/generate_test.go
similarity index 94%
rename from essentials/go/es_generate/generate_test.go
rename to essentials/es_go/es_generate/generate_test.go
index b465d77b8..d6b36c3d0 100644
--- a/essentials/go/es_generate/generate_test.go
+++ b/essentials/es_go/es_generate/generate_test.go
@@ -1,7 +1,7 @@
package es_generate
import (
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/io/es_stdout"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/quality/infra/qt_endtoend"
diff --git a/essentials/go/es_generate/importer.go b/essentials/es_go/es_generate/importer.go
similarity index 100%
rename from essentials/go/es_generate/importer.go
rename to essentials/es_go/es_generate/importer.go
diff --git a/essentials/go/es_generate/scanner.go b/essentials/es_go/es_generate/scanner.go
similarity index 100%
rename from essentials/go/es_generate/scanner.go
rename to essentials/es_go/es_generate/scanner.go
diff --git a/essentials/go/es_generate/scanner_test.go b/essentials/es_go/es_generate/scanner_test.go
similarity index 94%
rename from essentials/go/es_generate/scanner_test.go
rename to essentials/es_go/es_generate/scanner_test.go
index c8bb7af5f..f71f48f41 100644
--- a/essentials/go/es_generate/scanner_test.go
+++ b/essentials/es_go/es_generate/scanner_test.go
@@ -1,7 +1,7 @@
package es_generate
import (
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/recipe/rc_recipe"
"github.com/watermint/toolbox/quality/infra/qt_endtoend"
diff --git a/essentials/go/es_generate/struct_type.go b/essentials/es_go/es_generate/struct_type.go
similarity index 100%
rename from essentials/go/es_generate/struct_type.go
rename to essentials/es_go/es_generate/struct_type.go
diff --git a/essentials/go/es_generate/struct_type_test.go b/essentials/es_go/es_generate/struct_type_test.go
similarity index 100%
rename from essentials/go/es_generate/struct_type_test.go
rename to essentials/es_go/es_generate/struct_type_test.go
diff --git a/essentials/es_go/es_goroutine/doc.go b/essentials/es_go/es_goroutine/doc.go
new file mode 100644
index 000000000..0bda92847
--- /dev/null
+++ b/essentials/es_go/es_goroutine/doc.go
@@ -0,0 +1,2 @@
+// Package es_goroutine provides a function to get the current goroutine ID.
+package es_goroutine
diff --git a/essentials/go/es_goroutine/goroutineid.go b/essentials/es_go/es_goroutine/goroutineid.go
similarity index 100%
rename from essentials/go/es_goroutine/goroutineid.go
rename to essentials/es_go/es_goroutine/goroutineid.go
diff --git a/essentials/go/es_lang/detect.go b/essentials/es_go/es_lang/detect.go
similarity index 100%
rename from essentials/go/es_lang/detect.go
rename to essentials/es_go/es_lang/detect.go
diff --git a/essentials/go/es_lang/detect_test.go b/essentials/es_go/es_lang/detect_test.go
similarity index 100%
rename from essentials/go/es_lang/detect_test.go
rename to essentials/es_go/es_lang/detect_test.go
diff --git a/essentials/es_go/es_lang/doc.go b/essentials/es_go/es_lang/doc.go
new file mode 100644
index 000000000..9ffb8e23e
--- /dev/null
+++ b/essentials/es_go/es_lang/doc.go
@@ -0,0 +1,2 @@
+// Package es_lang provides utilities for language detection, selection, and management.
+package es_lang
diff --git a/essentials/go/es_lang/error.go b/essentials/es_go/es_lang/error.go
similarity index 100%
rename from essentials/go/es_lang/error.go
rename to essentials/es_go/es_lang/error.go
diff --git a/essentials/go/es_lang/error_test.go b/essentials/es_go/es_lang/error_test.go
similarity index 100%
rename from essentials/go/es_lang/error_test.go
rename to essentials/es_go/es_lang/error_test.go
diff --git a/essentials/go/es_lang/lang.go b/essentials/es_go/es_lang/lang.go
similarity index 100%
rename from essentials/go/es_lang/lang.go
rename to essentials/es_go/es_lang/lang.go
diff --git a/essentials/go/es_lang/lang_test.go b/essentials/es_go/es_lang/lang_test.go
similarity index 100%
rename from essentials/go/es_lang/lang_test.go
rename to essentials/es_go/es_lang/lang_test.go
diff --git a/essentials/go/es_lang/opts.go b/essentials/es_go/es_lang/opts.go
similarity index 100%
rename from essentials/go/es_lang/opts.go
rename to essentials/es_go/es_lang/opts.go
diff --git a/essentials/go/es_lang/priority.go b/essentials/es_go/es_lang/priority.go
similarity index 100%
rename from essentials/go/es_lang/priority.go
rename to essentials/es_go/es_lang/priority.go
diff --git a/essentials/go/es_lang/priority_test.go b/essentials/es_go/es_lang/priority_test.go
similarity index 100%
rename from essentials/go/es_lang/priority_test.go
rename to essentials/es_go/es_lang/priority_test.go
diff --git a/essentials/go/es_lang/select.go b/essentials/es_go/es_lang/select.go
similarity index 100%
rename from essentials/go/es_lang/select.go
rename to essentials/es_go/es_lang/select.go
diff --git a/essentials/go/es_lang/select_test.go b/essentials/es_go/es_lang/select_test.go
similarity index 100%
rename from essentials/go/es_lang/select_test.go
rename to essentials/es_go/es_lang/select_test.go
diff --git a/essentials/go/es_module/build.go b/essentials/es_go/es_module/build.go
similarity index 100%
rename from essentials/go/es_module/build.go
rename to essentials/es_go/es_module/build.go
diff --git a/essentials/go/es_module/build_test.go b/essentials/es_go/es_module/build_test.go
similarity index 100%
rename from essentials/go/es_module/build_test.go
rename to essentials/es_go/es_module/build_test.go
diff --git a/essentials/es_go/es_module/doc.go b/essentials/es_go/es_module/doc.go
new file mode 100644
index 000000000..b0452ef42
--- /dev/null
+++ b/essentials/es_go/es_module/doc.go
@@ -0,0 +1,2 @@
+// Package es_module provides functionalities for scanning Go module build information and managing licenses.
+package es_module
diff --git a/essentials/go/es_module/license.go b/essentials/es_go/es_module/license.go
similarity index 100%
rename from essentials/go/es_module/license.go
rename to essentials/es_go/es_module/license.go
diff --git a/essentials/go/es_module/license_agpl.dat b/essentials/es_go/es_module/license_agpl.dat
similarity index 100%
rename from essentials/go/es_module/license_agpl.dat
rename to essentials/es_go/es_module/license_agpl.dat
diff --git a/essentials/go/es_module/license_apache.dat b/essentials/es_go/es_module/license_apache.dat
similarity index 100%
rename from essentials/go/es_module/license_apache.dat
rename to essentials/es_go/es_module/license_apache.dat
diff --git a/essentials/go/es_module/license_bsd2.dat b/essentials/es_go/es_module/license_bsd2.dat
similarity index 100%
rename from essentials/go/es_module/license_bsd2.dat
rename to essentials/es_go/es_module/license_bsd2.dat
diff --git a/essentials/go/es_module/license_bsd3.dat b/essentials/es_go/es_module/license_bsd3.dat
similarity index 100%
rename from essentials/go/es_module/license_bsd3.dat
rename to essentials/es_go/es_module/license_bsd3.dat
diff --git a/essentials/go/es_module/license_cddl.dat b/essentials/es_go/es_module/license_cddl.dat
similarity index 100%
rename from essentials/go/es_module/license_cddl.dat
rename to essentials/es_go/es_module/license_cddl.dat
diff --git a/essentials/go/es_module/license_eclipse.dat b/essentials/es_go/es_module/license_eclipse.dat
similarity index 100%
rename from essentials/go/es_module/license_eclipse.dat
rename to essentials/es_go/es_module/license_eclipse.dat
diff --git a/essentials/go/es_module/license_gpl2.dat b/essentials/es_go/es_module/license_gpl2.dat
similarity index 100%
rename from essentials/go/es_module/license_gpl2.dat
rename to essentials/es_go/es_module/license_gpl2.dat
diff --git a/essentials/go/es_module/license_gpl3.dat b/essentials/es_go/es_module/license_gpl3.dat
similarity index 100%
rename from essentials/go/es_module/license_gpl3.dat
rename to essentials/es_go/es_module/license_gpl3.dat
diff --git a/essentials/go/es_module/license_lgpl.dat b/essentials/es_go/es_module/license_lgpl.dat
similarity index 100%
rename from essentials/go/es_module/license_lgpl.dat
rename to essentials/es_go/es_module/license_lgpl.dat
diff --git a/essentials/go/es_module/license_mit.dat b/essentials/es_go/es_module/license_mit.dat
similarity index 100%
rename from essentials/go/es_module/license_mit.dat
rename to essentials/es_go/es_module/license_mit.dat
diff --git a/essentials/go/es_module/license_mpl.dat b/essentials/es_go/es_module/license_mpl.dat
similarity index 100%
rename from essentials/go/es_module/license_mpl.dat
rename to essentials/es_go/es_module/license_mpl.dat
diff --git a/essentials/go/es_module/license_test.go b/essentials/es_go/es_module/license_test.go
similarity index 100%
rename from essentials/go/es_module/license_test.go
rename to essentials/es_go/es_module/license_test.go
diff --git a/essentials/go/es_module/license_unlicense.dat b/essentials/es_go/es_module/license_unlicense.dat
similarity index 100%
rename from essentials/go/es_module/license_unlicense.dat
rename to essentials/es_go/es_module/license_unlicense.dat
diff --git a/essentials/go/es_module/module.go b/essentials/es_go/es_module/module.go
similarity index 100%
rename from essentials/go/es_module/module.go
rename to essentials/es_go/es_module/module.go
diff --git a/essentials/go/es_module/select.go b/essentials/es_go/es_module/select.go
similarity index 100%
rename from essentials/go/es_module/select.go
rename to essentials/es_go/es_module/select.go
diff --git a/essentials/es_go/es_project/doc.go b/essentials/es_go/es_project/doc.go
new file mode 100644
index 000000000..f7abc6c2b
--- /dev/null
+++ b/essentials/es_go/es_project/doc.go
@@ -0,0 +1,2 @@
+// Package es_project provides a function to detect the root directory of a Go project.
+package es_project
diff --git a/essentials/go/es_project/source_root.go b/essentials/es_go/es_project/source_root.go
similarity index 100%
rename from essentials/go/es_project/source_root.go
rename to essentials/es_go/es_project/source_root.go
diff --git a/essentials/go/es_project/source_root_test.go b/essentials/es_go/es_project/source_root_test.go
similarity index 100%
rename from essentials/go/es_project/source_root_test.go
rename to essentials/es_go/es_project/source_root_test.go
diff --git a/essentials/es_go/es_reflect/doc.go b/essentials/es_go/es_reflect/doc.go
new file mode 100644
index 000000000..06216c455
--- /dev/null
+++ b/essentials/es_go/es_reflect/doc.go
@@ -0,0 +1,2 @@
+// Package es_reflect provides utility functions for Go reflection.
+package es_reflect
diff --git a/essentials/go/es_reflect/reflect.go b/essentials/es_go/es_reflect/reflect.go
similarity index 100%
rename from essentials/go/es_reflect/reflect.go
rename to essentials/es_go/es_reflect/reflect.go
diff --git a/essentials/go/es_reflect/reflect_test.go b/essentials/es_go/es_reflect/reflect_test.go
similarity index 100%
rename from essentials/go/es_reflect/reflect_test.go
rename to essentials/es_go/es_reflect/reflect_test.go
diff --git a/essentials/go/es_resource/bundle.go b/essentials/es_go/es_resource/bundle.go
similarity index 100%
rename from essentials/go/es_resource/bundle.go
rename to essentials/es_go/es_resource/bundle.go
diff --git a/essentials/es_go/es_resource/doc.go b/essentials/es_go/es_resource/doc.go
new file mode 100644
index 000000000..49f00e8a2
--- /dev/null
+++ b/essentials/es_go/es_resource/doc.go
@@ -0,0 +1,2 @@
+// Package es_resource provides a flexible resource management system for Go applications.
+package es_resource
diff --git a/essentials/go/es_resource/message.go b/essentials/es_go/es_resource/message.go
similarity index 100%
rename from essentials/go/es_resource/message.go
rename to essentials/es_go/es_resource/message.go
diff --git a/essentials/go/es_resource/resource.go b/essentials/es_go/es_resource/resource.go
similarity index 100%
rename from essentials/go/es_resource/resource.go
rename to essentials/es_go/es_resource/resource.go
diff --git a/essentials/go/es_resource/resource_additional_test.go b/essentials/es_go/es_resource/resource_additional_test.go
similarity index 97%
rename from essentials/go/es_resource/resource_additional_test.go
rename to essentials/es_go/es_resource/resource_additional_test.go
index 86fdc8581..9f3b65ae7 100644
--- a/essentials/go/es_resource/resource_additional_test.go
+++ b/essentials/es_go/es_resource/resource_additional_test.go
@@ -11,7 +11,7 @@ var testFS embed.FS
func TestNonTraversableResource(t *testing.T) {
// Create a non-traversable resource
res := NewNonTraversableResource("testdata", testFS)
-
+
// Test reading an existing file
data, err := res.Bytes("test.txt")
if err != nil {
@@ -20,19 +20,19 @@ func TestNonTraversableResource(t *testing.T) {
if len(data) == 0 {
t.Error("Expected non-empty data from test.txt")
}
-
+
// Test reading a non-existing file
_, err = res.Bytes("nonexistent.txt")
if err == nil {
t.Error("Expected error when reading non-existent file")
}
-
+
// Test HttpFileSystem returns empty
fs := res.HttpFileSystem()
if fs == nil {
t.Error("Expected non-nil http.FileSystem")
}
-
+
// Try to open a file through HttpFileSystem (should fail as it's empty)
f, err := fs.Open("test.txt")
if err == nil {
@@ -53,10 +53,10 @@ func TestBundleImpl_AllMethods(t *testing.T) {
dat := EmptyResource()
bld := EmptyResource()
rel := EmptyResource()
-
+
// Create bundle
bundle := New(tpl, msg, web, key, img, dat, bld, rel)
-
+
// Test all getter methods
if bundle.Templates() != tpl {
t.Error("Templates() should return the same resource")
@@ -88,12 +88,12 @@ func TestNewChainBundle(t *testing.T) {
// Create test bundles
bundle1 := EmptyBundle()
bundle2 := EmptyBundle()
-
+
langCodes := []string{"en", "ja"}
-
+
// Create chain bundle
chainBundle := NewChainBundle(langCodes, bundle1, bundle2)
-
+
// Verify it returns non-nil resources
if chainBundle.Templates() == nil {
t.Error("Templates() should not be nil")
@@ -119,13 +119,13 @@ func TestNewChainBundle(t *testing.T) {
if chainBundle.Release() == nil {
t.Error("Release() should not be nil")
}
-
+
// Test with single bundle
singleChain := NewChainBundle([]string{"en"}, bundle1)
if singleChain == nil {
t.Error("Chain bundle should not be nil")
}
-
+
// Test with no language codes
noLangChain := NewChainBundle([]string{}, bundle1, bundle2)
if noLangChain == nil {
@@ -135,12 +135,12 @@ func TestNewChainBundle(t *testing.T) {
func TestNonTraversableResource_PathHandling(t *testing.T) {
res := NewNonTraversableResource("testdata", testFS)
-
+
// Test with different path separators
tests := []struct {
- name string
- path string
- wantErr bool
+ name string
+ path string
+ wantErr bool
}{
{
name: "simple file",
@@ -150,7 +150,7 @@ func TestNonTraversableResource_PathHandling(t *testing.T) {
{
name: "with backslash",
path: "test\\txt", // Will be converted to forward slash
- wantErr: true, // No such file
+ wantErr: true, // No such file
},
{
name: "empty path",
@@ -158,7 +158,7 @@ func TestNonTraversableResource_PathHandling(t *testing.T) {
wantErr: true,
},
}
-
+
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
_, err := res.Bytes(tt.path)
@@ -167,4 +167,4 @@ func TestNonTraversableResource_PathHandling(t *testing.T) {
}
})
}
-}
\ No newline at end of file
+}
diff --git a/essentials/go/es_resource/resource_embed.go b/essentials/es_go/es_resource/resource_embed.go
similarity index 100%
rename from essentials/go/es_resource/resource_embed.go
rename to essentials/es_go/es_resource/resource_embed.go
diff --git a/essentials/go/es_resource/resource_empty.go b/essentials/es_go/es_resource/resource_empty.go
similarity index 100%
rename from essentials/go/es_resource/resource_empty.go
rename to essentials/es_go/es_resource/resource_empty.go
diff --git a/essentials/go/es_resource/resource_impl.go b/essentials/es_go/es_resource/resource_impl.go
similarity index 100%
rename from essentials/go/es_resource/resource_impl.go
rename to essentials/es_go/es_resource/resource_impl.go
diff --git a/essentials/go/es_resource/resource_merged.go b/essentials/es_go/es_resource/resource_merged.go
similarity index 100%
rename from essentials/go/es_resource/resource_merged.go
rename to essentials/es_go/es_resource/resource_merged.go
diff --git a/essentials/go/es_resource/resource_nontraversable.go b/essentials/es_go/es_resource/resource_nontraversable.go
similarity index 100%
rename from essentials/go/es_resource/resource_nontraversable.go
rename to essentials/es_go/es_resource/resource_nontraversable.go
diff --git a/essentials/go/es_resource/resource_test.go b/essentials/es_go/es_resource/resource_test.go
similarity index 100%
rename from essentials/go/es_resource/resource_test.go
rename to essentials/es_go/es_resource/resource_test.go
diff --git a/essentials/go/es_resource/testdata/test.txt b/essentials/es_go/es_resource/testdata/test.txt
similarity index 100%
rename from essentials/go/es_resource/testdata/test.txt
rename to essentials/es_go/es_resource/testdata/test.txt
diff --git a/essentials/file/doc.go b/essentials/file/doc.go
new file mode 100644
index 000000000..e2f57663d
--- /dev/null
+++ b/essentials/file/doc.go
@@ -0,0 +1,2 @@
+// Package file provides essential functionalities for file system operations.
+package file
diff --git a/essentials/file/efs_base/doc.go b/essentials/file/efs_base/doc.go
new file mode 100644
index 000000000..9a1ce8b5c
--- /dev/null
+++ b/essentials/file/efs_base/doc.go
@@ -0,0 +1,2 @@
+// Package efs_base defines fundamental interfaces and base implementations for a file system abstraction layer.
+package efs_base
diff --git a/essentials/file/efs_cloud/doc.go b/essentials/file/efs_cloud/doc.go
new file mode 100644
index 000000000..8979a043e
--- /dev/null
+++ b/essentials/file/efs_cloud/doc.go
@@ -0,0 +1,2 @@
+// Package efs_cloud provides interfaces for cloud file system folder operations.
+package efs_cloud
diff --git a/essentials/file/efs_local/doc.go b/essentials/file/efs_local/doc.go
new file mode 100644
index 000000000..e1f4e35bb
--- /dev/null
+++ b/essentials/file/efs_local/doc.go
@@ -0,0 +1,2 @@
+// Package efs_local provides a facade for platform-specific local file system operations (POSIX or Windows).
+package efs_local
diff --git a/essentials/file/efs_memory/doc.go b/essentials/file/efs_memory/doc.go
new file mode 100644
index 000000000..1a5b03ee8
--- /dev/null
+++ b/essentials/file/efs_memory/doc.go
@@ -0,0 +1,2 @@
+// Package efs_memory provides an in-memory file system implementation.
+package efs_memory
diff --git a/essentials/file/efs_posix/doc.go b/essentials/file/efs_posix/doc.go
new file mode 100644
index 000000000..bb379f637
--- /dev/null
+++ b/essentials/file/efs_posix/doc.go
@@ -0,0 +1,2 @@
+// Package efs_posix defines interfaces and implementations for POSIX-compliant file system operations.
+package efs_posix
diff --git a/essentials/file/efs_util/doc.go b/essentials/file/efs_util/doc.go
new file mode 100644
index 000000000..3f0c6d5c4
--- /dev/null
+++ b/essentials/file/efs_util/doc.go
@@ -0,0 +1,2 @@
+// Package efs_util provides utility functions for file system operations.
+package efs_util
diff --git a/essentials/file/efs_win/doc.go b/essentials/file/efs_win/doc.go
new file mode 100644
index 000000000..aebcf31ff
--- /dev/null
+++ b/essentials/file/efs_win/doc.go
@@ -0,0 +1,2 @@
+// Package efs_win provides interfaces and implementations for Windows-specific file system operations.
+package efs_win
diff --git a/essentials/file/es_filecompare/doc.go b/essentials/file/es_filecompare/doc.go
new file mode 100644
index 000000000..badb7f12e
--- /dev/null
+++ b/essentials/file/es_filecompare/doc.go
@@ -0,0 +1,2 @@
+// Package es_filecompare provides functionalities for comparing files and folders.
+package es_filecompare
diff --git a/essentials/file/es_fileentry/doc.go b/essentials/file/es_fileentry/doc.go
new file mode 100644
index 000000000..03bd58ecd
--- /dev/null
+++ b/essentials/file/es_fileentry/doc.go
@@ -0,0 +1,2 @@
+// Package es_fileentry provides a serializable structure for local file system entries.
+package es_fileentry
diff --git a/essentials/file/es_filehash/doc.go b/essentials/file/es_filehash/doc.go
new file mode 100644
index 000000000..6b357f4e2
--- /dev/null
+++ b/essentials/file/es_filehash/doc.go
@@ -0,0 +1,2 @@
+// Package es_filehash provides functions for calculating MD5, SHA1, and SHA256 hashes of files.
+package es_filehash
diff --git a/essentials/file/es_filemove/doc.go b/essentials/file/es_filemove/doc.go
new file mode 100644
index 000000000..2b495b2dd
--- /dev/null
+++ b/essentials/file/es_filemove/doc.go
@@ -0,0 +1,2 @@
+// Package es_filemove provides functions for moving files.
+package es_filemove
diff --git a/essentials/file/es_filepath/doc.go b/essentials/file/es_filepath/doc.go
new file mode 100644
index 000000000..6266bb75e
--- /dev/null
+++ b/essentials/file/es_filepath/doc.go
@@ -0,0 +1,2 @@
+// Package es_filepath provides utility functions for manipulating file paths.
+package es_filepath
diff --git a/essentials/file/es_filesystem/doc.go b/essentials/file/es_filesystem/doc.go
new file mode 100644
index 000000000..a34765dce
--- /dev/null
+++ b/essentials/file/es_filesystem/doc.go
@@ -0,0 +1,2 @@
+// Package es_filesystem defines a generic file system abstraction layer.
+package es_filesystem
diff --git a/essentials/file/es_filesystem_copier/doc.go b/essentials/file/es_filesystem_copier/doc.go
new file mode 100644
index 000000000..96215107a
--- /dev/null
+++ b/essentials/file/es_filesystem_copier/doc.go
@@ -0,0 +1,2 @@
+// Package es_filesystem_copier provides implementations for copying files between different file systems.
+package es_filesystem_copier
diff --git a/essentials/file/es_filesystem_local/doc.go b/essentials/file/es_filesystem_local/doc.go
new file mode 100644
index 000000000..b70561a74
--- /dev/null
+++ b/essentials/file/es_filesystem_local/doc.go
@@ -0,0 +1,2 @@
+// Package es_filesystem_local provides an implementation of the es_filesystem interfaces for the local file system.
+package es_filesystem_local
diff --git a/essentials/file/es_filesystem_model/doc.go b/essentials/file/es_filesystem_model/doc.go
new file mode 100644
index 000000000..7b6b88aeb
--- /dev/null
+++ b/essentials/file/es_filesystem_model/doc.go
@@ -0,0 +1,2 @@
+// Package es_filesystem_model provides an in-memory, model-based implementation of the es_filesystem interfaces.
+package es_filesystem_model
diff --git a/essentials/file/es_gzip/doc.go b/essentials/file/es_gzip/doc.go
new file mode 100644
index 000000000..364767bd1
--- /dev/null
+++ b/essentials/file/es_gzip/doc.go
@@ -0,0 +1,2 @@
+// Package es_gzip provides a function for compressing files using gzip.
+package es_gzip
diff --git a/essentials/file/es_size/doc.go b/essentials/file/es_size/doc.go
new file mode 100644
index 000000000..cb8a6d15f
--- /dev/null
+++ b/essentials/file/es_size/doc.go
@@ -0,0 +1,2 @@
+// Package es_size provides functionalities for calculating folder sizes.
+package es_size
diff --git a/essentials/file/es_size/size.go b/essentials/file/es_size/size.go
index e2f298cf7..eb8fea97d 100644
--- a/essentials/file/es_size/size.go
+++ b/essentials/file/es_size/size.go
@@ -3,8 +3,8 @@ package es_size
import (
"encoding/json"
"errors"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/file/es_filesystem"
- "github.com/watermint/toolbox/essentials/go/es_lang"
"github.com/watermint/toolbox/essentials/kvs/kv_kvs"
"github.com/watermint/toolbox/essentials/kvs/kv_storage"
"github.com/watermint/toolbox/essentials/log/esl"
diff --git a/essentials/file/es_sync/doc.go b/essentials/file/es_sync/doc.go
new file mode 100644
index 000000000..d1787a5cb
--- /dev/null
+++ b/essentials/file/es_sync/doc.go
@@ -0,0 +1,2 @@
+// Package es_sync provides a file synchronization mechanism between two file systems.
+package es_sync
diff --git a/essentials/file/es_sync/sync_impl_unit_test.go b/essentials/file/es_sync/sync_impl_unit_test.go
index 39915058f..c44bebac6 100644
--- a/essentials/file/es_sync/sync_impl_unit_test.go
+++ b/essentials/file/es_sync/sync_impl_unit_test.go
@@ -185,7 +185,7 @@ func TestTaskCopyFile(t *testing.T) {
// Create a dummy file entry for testing
tree := em_file.DemoTree()
fs := es_filesystem_model.NewFileSystem(tree)
-
+
// Get an actual file entry
sourcePath := es_filesystem_model.NewPath("/a/x")
sourceEntry, err := fs.Info(sourcePath)
@@ -214,7 +214,7 @@ func TestTaskReplaceFolderByFile(t *testing.T) {
}
func TestTaskReplaceFileByFolder(t *testing.T) {
- // Test that the task struct exists and can be created
+ // Test that the task struct exists and can be created
task := &TaskReplaceFileByFolder{}
if task == nil {
t.Error("Expected task to be created")
@@ -421,7 +421,7 @@ func TestSyncImpl_Copy(t *testing.T) {
sourcePath := es_filesystem_model.NewPath("/source.txt")
targetPath := es_filesystem_model.NewPath("/target.txt")
sourceEntry, _ := fs1.Info(sourcePath)
-
+
// The copy method is asynchronous via the connector
// Just verify it doesn't error
err := syncImpl.copy(sourceEntry, targetPath)
@@ -513,10 +513,10 @@ func TestSyncImpl_TaskReplaceFolderByFile(t *testing.T) {
em_file.NewFile("source", 100, time.Now(), 1),
})
fs := es_filesystem_model.NewFileSystem(tree)
-
+
sourcePath := es_filesystem_model.NewPath("/source")
sourceEntry, _ := fs.Info(sourcePath)
-
+
task := &TaskReplaceFolderByFile{
Source: sourceEntry.AsData(),
Target: es_filesystem_model.NewPath("/target").AsData(),
@@ -533,10 +533,10 @@ func TestSyncImpl_TaskReplaceFileByFolder(t *testing.T) {
em_file.NewFolder("source", []em_file.Node{}),
})
fs := es_filesystem_model.NewFileSystem(tree)
-
+
sourcePath := es_filesystem_model.NewPath("/source")
sourceEntry, _ := fs.Info(sourcePath)
-
+
task := &TaskReplaceFileByFolder{
Source: sourceEntry.AsData(),
Target: es_filesystem_model.NewPath("/target").AsData(),
@@ -615,7 +615,6 @@ func TestSyncImpl_TaskSyncFolder_WithDelete(t *testing.T) {
}
}
-
func TestNewWithAllOptions(t *testing.T) {
ea_indicator.SuppressIndicatorForce()
@@ -666,7 +665,7 @@ func TestNewWithAllOptions(t *testing.T) {
}
syncImpl := syncer.(*syncImpl)
-
+
// Verify all options were applied
if !syncImpl.opts.syncDelete {
t.Error("Expected syncDelete to be true")
@@ -725,7 +724,7 @@ func TestSyncImpl_CreateFolder_AlreadyExists(t *testing.T) {
// Try to create a folder that already exists
target := es_filesystem_model.NewPath("/existing")
err := syncImpl.createFolder(target)
-
+
// Should not error when folder already exists
if err != nil {
t.Error("Expected no error when creating folder that already exists")
@@ -759,7 +758,7 @@ func TestSyncImpl_Delete_NotFound(t *testing.T) {
// Try to delete a non-existent path
target := es_filesystem_model.NewPath("/non_existent")
err := syncImpl.delete(target)
-
+
// Should return error when deleting non-existent path
if err == nil {
t.Error("Expected error when deleting non-existent path")
@@ -799,7 +798,7 @@ func TestSyncImpl_Copy_WithOverwrite(t *testing.T) {
sourcePath := es_filesystem_model.NewPath("/source.txt")
targetPath := es_filesystem_model.NewPath("/target.txt")
sourceEntry, _ := fs1.Info(sourcePath)
-
+
err := syncImpl.copy(sourceEntry, targetPath)
if err != nil {
t.Error("Expected no error when copying with overwrite")
@@ -810,7 +809,7 @@ func TestSyncImpl_Copy_WithOverwrite(t *testing.T) {
if err != nil {
t.Error("Expected target file to exist")
}
-
+
// Note: In a real filesystem, we'd check the content changed
// For model filesystem, we just verify the operation succeeded
-}
\ No newline at end of file
+}
diff --git a/essentials/file/es_sync/sync_opt_test.go b/essentials/file/es_sync/sync_opt_test.go
index d5f0bf4b2..ac53814ec 100644
--- a/essentials/file/es_sync/sync_opt_test.go
+++ b/essentials/file/es_sync/sync_opt_test.go
@@ -25,7 +25,7 @@ func TestSkipReasonConstants(t *testing.T) {
func TestOpts_DefaultValues(t *testing.T) {
opts := Opts{}
-
+
if opts.SyncDelete() {
t.Error("Expected SyncDelete to be false by default")
}
@@ -48,13 +48,13 @@ func TestOpts_DefaultValues(t *testing.T) {
func TestSyncDelete(t *testing.T) {
opts := Opts{}
-
+
// Test enabling
newOpts := SyncDelete(true)(opts)
if !newOpts.SyncDelete() {
t.Error("Expected SyncDelete to be true after enabling")
}
-
+
// Test disabling
newOpts = SyncDelete(false)(newOpts)
if newOpts.SyncDelete() {
@@ -64,12 +64,12 @@ func TestSyncDelete(t *testing.T) {
func TestSyncOverwrite(t *testing.T) {
opts := Opts{}
-
+
newOpts := SyncOverwrite(true)(opts)
if !newOpts.SyncOverwrite() {
t.Error("Expected SyncOverwrite to be true after enabling")
}
-
+
newOpts = SyncOverwrite(false)(newOpts)
if newOpts.SyncOverwrite() {
t.Error("Expected SyncOverwrite to be false after disabling")
@@ -78,7 +78,7 @@ func TestSyncOverwrite(t *testing.T) {
func TestSyncDontCompareTime(t *testing.T) {
opts := Opts{}
-
+
newOpts := SyncDontCompareTime(true)(opts)
if !newOpts.SyncDontCompareTime() {
t.Error("Expected SyncDontCompareTime to be true after enabling")
@@ -87,7 +87,7 @@ func TestSyncDontCompareTime(t *testing.T) {
func TestSyncDontCompareContent(t *testing.T) {
opts := Opts{}
-
+
newOpts := SyncDontCompareContent(true)(opts)
if !newOpts.SyncDontCompareContent() {
t.Error("Expected SyncDontCompareContent to be true after enabling")
@@ -96,7 +96,7 @@ func TestSyncDontCompareContent(t *testing.T) {
func TestOptimizePreventCreateFolder(t *testing.T) {
opts := Opts{}
-
+
newOpts := OptimizePreventCreateFolder(true)(opts)
if !newOpts.OptimizeReduceCreateFolder() {
t.Error("Expected OptimizeReduceCreateFolder to be true after enabling")
@@ -105,10 +105,10 @@ func TestOptimizePreventCreateFolder(t *testing.T) {
func TestWithNameFilter(t *testing.T) {
opts := Opts{}
-
+
// Use nil filter for simplicity in testing
_ = WithNameFilter(nil)(opts)
-
+
// The option function should work without error
// We can't directly test the filter since it's private
}
@@ -116,16 +116,16 @@ func TestWithNameFilter(t *testing.T) {
func TestOnCopySuccess(t *testing.T) {
opts := Opts{}
called := false
-
+
listener := func(source es_filesystem.Entry, target es_filesystem.Entry) {
called = true
}
-
+
newOpts := OnCopySuccess(listener)(opts)
-
+
// Call with nil entries to test the listener mechanism
newOpts.OnCopySuccess(nil, nil)
-
+
if !called {
t.Error("Expected OnCopySuccess listener to be called")
}
@@ -134,18 +134,18 @@ func TestOnCopySuccess(t *testing.T) {
func TestOnCopyFailure(t *testing.T) {
opts := Opts{}
called := false
-
+
listener := func(source es_filesystem.Path, err es_filesystem.FileSystemError) {
called = true
}
-
+
newOpts := OnCopyFailure(listener)(opts)
-
+
sourcePath := es_filesystem_model.NewPath("/source.txt")
mockError := es_filesystem_model.NewError(errors.New("test error"), es_filesystem_model.ErrorTypeOther)
-
+
newOpts.OnCopyFailure(sourcePath, mockError)
-
+
if !called {
t.Error("Expected OnCopyFailure listener to be called")
}
@@ -154,16 +154,16 @@ func TestOnCopyFailure(t *testing.T) {
func TestOnDeleteSuccess(t *testing.T) {
opts := Opts{}
called := false
-
+
listener := func(target es_filesystem.Path) {
called = true
}
-
+
newOpts := OnDeleteSuccess(listener)(opts)
-
+
targetPath := es_filesystem_model.NewPath("/target.txt")
newOpts.OnDeleteSuccess(targetPath)
-
+
if !called {
t.Error("Expected OnDeleteSuccess listener to be called")
}
@@ -172,18 +172,18 @@ func TestOnDeleteSuccess(t *testing.T) {
func TestOnDeleteFailure(t *testing.T) {
opts := Opts{}
called := false
-
+
listener := func(target es_filesystem.Path, err es_filesystem.FileSystemError) {
called = true
}
-
+
newOpts := OnDeleteFailure(listener)(opts)
-
+
targetPath := es_filesystem_model.NewPath("/target.txt")
mockError := es_filesystem_model.NewError(errors.New("test error"), es_filesystem_model.ErrorTypeOther)
-
+
newOpts.OnDeleteFailure(targetPath, mockError)
-
+
if !called {
t.Error("Expected OnDeleteFailure listener to be called")
}
@@ -192,16 +192,16 @@ func TestOnDeleteFailure(t *testing.T) {
func TestOnCreateFolderSuccess(t *testing.T) {
opts := Opts{}
called := false
-
+
listener := func(target es_filesystem.Path) {
called = true
}
-
+
newOpts := OnCreateFolderSuccess(listener)(opts)
-
+
targetPath := es_filesystem_model.NewPath("/newfolder")
newOpts.OnCreateFolderSuccess(targetPath)
-
+
if !called {
t.Error("Expected OnCreateFolderSuccess listener to be called")
}
@@ -210,18 +210,18 @@ func TestOnCreateFolderSuccess(t *testing.T) {
func TestOnCreateFolderFailure(t *testing.T) {
opts := Opts{}
called := false
-
+
listener := func(target es_filesystem.Path, err es_filesystem.FileSystemError) {
called = true
}
-
+
newOpts := OnCreateFolderFailure(listener)(opts)
-
+
targetPath := es_filesystem_model.NewPath("/newfolder")
mockError := es_filesystem_model.NewError(errors.New("test error"), es_filesystem_model.ErrorTypeOther)
-
+
newOpts.OnCreateFolderFailure(targetPath, mockError)
-
+
if !called {
t.Error("Expected OnCreateFolderFailure listener to be called")
}
@@ -231,18 +231,18 @@ func TestOnSkip(t *testing.T) {
opts := Opts{}
called := false
var receivedReason SkipReason
-
+
listener := func(reason SkipReason, source es_filesystem.Entry, target es_filesystem.Path) {
called = true
receivedReason = reason
}
-
+
newOpts := OnSkip(listener)(opts)
-
+
targetPath := es_filesystem_model.NewPath("/target.txt")
-
+
newOpts.OnSkip(SkipSame, nil, targetPath)
-
+
if !called {
t.Error("Expected OnSkip listener to be called")
}
@@ -253,12 +253,12 @@ func TestOnSkip(t *testing.T) {
func TestOpts_ListenersWithNil(t *testing.T) {
opts := Opts{}
-
+
// Test that calling listeners when they're nil doesn't panic
sourcePath := es_filesystem_model.NewPath("/source.txt")
targetPath := es_filesystem_model.NewPath("/target.txt")
mockError := es_filesystem_model.NewError(errors.New("test error"), es_filesystem_model.ErrorTypeOther)
-
+
// These should not panic
opts.OnCopySuccess(nil, nil)
opts.OnCopyFailure(sourcePath, mockError)
@@ -271,9 +271,9 @@ func TestOpts_ListenersWithNil(t *testing.T) {
func TestOpts_Apply_NoOptions(t *testing.T) {
opts := Opts{}
-
+
result := opts.Apply([]Opt{})
-
+
// Should return the same opts
if result.SyncDelete() != opts.SyncDelete() {
t.Error("Apply with no options should return same opts")
@@ -282,9 +282,9 @@ func TestOpts_Apply_NoOptions(t *testing.T) {
func TestOpts_Apply_SingleOption(t *testing.T) {
opts := Opts{}
-
+
result := opts.Apply([]Opt{SyncDelete(true)})
-
+
if !result.SyncDelete() {
t.Error("Expected SyncDelete to be true after applying single option")
}
@@ -292,13 +292,13 @@ func TestOpts_Apply_SingleOption(t *testing.T) {
func TestOpts_Apply_MultipleOptions(t *testing.T) {
opts := Opts{}
-
+
result := opts.Apply([]Opt{
SyncDelete(true),
SyncOverwrite(true),
SyncDontCompareTime(true),
})
-
+
if !result.SyncDelete() {
t.Error("Expected SyncDelete to be true")
}
@@ -312,13 +312,13 @@ func TestOpts_Apply_MultipleOptions(t *testing.T) {
func TestOpts_Apply_OptionsOverride(t *testing.T) {
opts := Opts{}
-
+
// Apply conflicting options - last one should win
result := opts.Apply([]Opt{
SyncDelete(true),
SyncDelete(false),
})
-
+
if result.SyncDelete() {
t.Error("Expected later option to override earlier one")
}
@@ -326,14 +326,14 @@ func TestOpts_Apply_OptionsOverride(t *testing.T) {
func TestWithProgress(t *testing.T) {
opts := Opts{}
-
+
// Create a mock progress container (nil is valid)
newOpts := WithProgress(nil)(opts)
-
+
if newOpts.Progress() != nil {
t.Error("Expected progress to be nil")
}
-
+
// We can't easily test with a real container without more dependencies,
// but we can verify the option function works
-}
\ No newline at end of file
+}
diff --git a/essentials/file/es_template/doc.go b/essentials/file/es_template/doc.go
new file mode 100644
index 000000000..b9af8fc6a
--- /dev/null
+++ b/essentials/file/es_template/doc.go
@@ -0,0 +1,2 @@
+// Package es_template provides functionalities for applying and capturing file system templates.
+package es_template
diff --git a/essentials/file/es_zip/doc.go b/essentials/file/es_zip/doc.go
new file mode 100644
index 000000000..b5b5a0a38
--- /dev/null
+++ b/essentials/file/es_zip/doc.go
@@ -0,0 +1,2 @@
+// Package es_zip provides a function for compressing a directory into a zip archive.
+package es_zip
diff --git a/essentials/go/doc.go b/essentials/go/doc.go
new file mode 100644
index 000000000..879fab0e2
--- /dev/null
+++ b/essentials/go/doc.go
@@ -0,0 +1,2 @@
+// Package es_go provides essential functionalities for Go language specific operations.
+package es_go
diff --git a/essentials/graphic/doc.go b/essentials/graphic/doc.go
new file mode 100644
index 000000000..087cf9f94
--- /dev/null
+++ b/essentials/graphic/doc.go
@@ -0,0 +1,2 @@
+// Package graphic provides essential functionalities for graphic manipulation and rendering.
+package graphic
diff --git a/essentials/graphic/eg_color/doc.go b/essentials/graphic/eg_color/doc.go
new file mode 100644
index 000000000..83e93421b
--- /dev/null
+++ b/essentials/graphic/eg_color/doc.go
@@ -0,0 +1,2 @@
+// Package eg_color provides functionalities for color representation, parsing, and comparison.
+package eg_color
diff --git a/essentials/graphic/eg_color/parse.go b/essentials/graphic/eg_color/parse.go
index d27517742..3e11b739b 100644
--- a/essentials/graphic/eg_color/parse.go
+++ b/essentials/graphic/eg_color/parse.go
@@ -5,7 +5,7 @@ import (
"strconv"
"strings"
- "github.com/watermint/toolbox/essentials/go/es_errors"
+ "github.com/watermint/toolbox/essentials/es_go/es_errors"
"github.com/watermint/toolbox/essentials/strings/es_hex"
)
diff --git a/essentials/graphic/eg_color/parse_test.go b/essentials/graphic/eg_color/parse_test.go
index 72e90123c..03041b8ee 100644
--- a/essentials/graphic/eg_color/parse_test.go
+++ b/essentials/graphic/eg_color/parse_test.go
@@ -3,7 +3,7 @@ package eg_color
import (
"testing"
- "github.com/watermint/toolbox/essentials/go/es_errors"
+ "github.com/watermint/toolbox/essentials/es_go/es_errors"
)
func TestParseColor(t *testing.T) {
diff --git a/essentials/graphic/eg_draw/doc.go b/essentials/graphic/eg_draw/doc.go
new file mode 100644
index 000000000..b80b530e0
--- /dev/null
+++ b/essentials/graphic/eg_draw/doc.go
@@ -0,0 +1,2 @@
+// Package eg_draw provides drawing functionalities for images.
+package eg_draw
diff --git a/essentials/graphic/eg_geom/doc.go b/essentials/graphic/eg_geom/doc.go
new file mode 100644
index 000000000..038b0abe6
--- /dev/null
+++ b/essentials/graphic/eg_geom/doc.go
@@ -0,0 +1,2 @@
+// Package eg_geom provides fundamental geometric primitives and operations.
+package eg_geom
diff --git a/essentials/graphic/eg_geom/position.go b/essentials/graphic/eg_geom/position.go
index 5701cc025..f49ec9c9d 100644
--- a/essentials/graphic/eg_geom/position.go
+++ b/essentials/graphic/eg_geom/position.go
@@ -3,7 +3,7 @@ package eg_geom
import (
"strings"
- "github.com/watermint/toolbox/essentials/go/es_errors"
+ "github.com/watermint/toolbox/essentials/es_go/es_errors"
)
type Position int
diff --git a/essentials/graphic/eg_image/doc.go b/essentials/graphic/eg_image/doc.go
new file mode 100644
index 000000000..3b6e21ee6
--- /dev/null
+++ b/essentials/graphic/eg_image/doc.go
@@ -0,0 +1,2 @@
+// Package eg_image provides an interface for mutable image manipulation.
+package eg_image
diff --git a/essentials/graphic/eg_placeholder/doc.go b/essentials/graphic/eg_placeholder/doc.go
new file mode 100644
index 000000000..c6547d146
--- /dev/null
+++ b/essentials/graphic/eg_placeholder/doc.go
@@ -0,0 +1,2 @@
+// Package eg_placeholder provides functionalities for creating placeholder images.
+package eg_placeholder
diff --git a/essentials/graphic/eg_text/doc.go b/essentials/graphic/eg_text/doc.go
new file mode 100644
index 000000000..2beb67062
--- /dev/null
+++ b/essentials/graphic/eg_text/doc.go
@@ -0,0 +1,2 @@
+// Package eg_text provides functionalities for text rendering and styling.
+package eg_text
diff --git a/essentials/graphic/eg_text/font.go b/essentials/graphic/eg_text/font.go
index a84cac100..2e4d8a3df 100644
--- a/essentials/graphic/eg_text/font.go
+++ b/essentials/graphic/eg_text/font.go
@@ -2,7 +2,7 @@ package eg_text
import (
"github.com/golang/freetype/truetype"
- "github.com/watermint/toolbox/essentials/go/es_errors"
+ "github.com/watermint/toolbox/essentials/es_go/es_errors"
"github.com/watermint/toolbox/essentials/graphic/eg_geom"
"golang.org/x/image/font"
)
diff --git a/essentials/http/doc.go b/essentials/http/doc.go
new file mode 100644
index 000000000..0e9af059c
--- /dev/null
+++ b/essentials/http/doc.go
@@ -0,0 +1,2 @@
+// Package http provides essential functionalities for HTTP interactions.
+package http
diff --git a/essentials/http/es_client/doc.go b/essentials/http/es_client/doc.go
new file mode 100644
index 000000000..3b2646a64
--- /dev/null
+++ b/essentials/http/es_client/doc.go
@@ -0,0 +1,2 @@
+// Package es_client defines interfaces for HTTP clients and provides a mock implementation.
+package es_client
diff --git a/essentials/http/es_download/doc.go b/essentials/http/es_download/doc.go
new file mode 100644
index 000000000..0fed8b959
--- /dev/null
+++ b/essentials/http/es_download/doc.go
@@ -0,0 +1,2 @@
+// Package es_download provides functions for downloading files and text content from URLs.
+package es_download
diff --git a/essentials/http/es_filesystem/doc.go b/essentials/http/es_filesystem/doc.go
new file mode 100644
index 000000000..22ee88d53
--- /dev/null
+++ b/essentials/http/es_filesystem/doc.go
@@ -0,0 +1,2 @@
+// Package es_filesystem provides an empty HTTP file system implementation.
+package es_filesystem
diff --git a/essentials/http/es_response/doc.go b/essentials/http/es_response/doc.go
new file mode 100644
index 000000000..ca3bc70fb
--- /dev/null
+++ b/essentials/http/es_response/doc.go
@@ -0,0 +1,2 @@
+// Package es_response defines interfaces for HTTP responses.
+package es_response
diff --git a/essentials/http/es_response_impl/doc.go b/essentials/http/es_response_impl/doc.go
new file mode 100644
index 000000000..9b1971543
--- /dev/null
+++ b/essentials/http/es_response_impl/doc.go
@@ -0,0 +1,2 @@
+// Package es_response_impl provides concrete implementations for HTTP response bodies and responses.
+package es_response_impl
diff --git a/essentials/i18n/doc.go b/essentials/i18n/doc.go
new file mode 100644
index 000000000..897b72e89
--- /dev/null
+++ b/essentials/i18n/doc.go
@@ -0,0 +1,2 @@
+// Package i18n provides essential functionalities for internationalization.
+package i18n
diff --git a/essentials/i18n/es_locale/doc.go b/essentials/i18n/es_locale/doc.go
new file mode 100644
index 000000000..2b6345041
--- /dev/null
+++ b/essentials/i18n/es_locale/doc.go
@@ -0,0 +1,2 @@
+// Package es_locale provides functionalities for detecting, parsing, and managing locale information.
+package es_locale
diff --git a/essentials/i18n/es_locale/locale.go b/essentials/i18n/es_locale/locale.go
index 13f6265f9..66aa62f4e 100644
--- a/essentials/i18n/es_locale/locale.go
+++ b/essentials/i18n/es_locale/locale.go
@@ -4,7 +4,7 @@ import (
"fmt"
"strings"
- "github.com/watermint/toolbox/essentials/go/es_errors"
+ "github.com/watermint/toolbox/essentials/es_go/es_errors"
"github.com/watermint/toolbox/essentials/strings/es_case"
)
diff --git a/essentials/image/doc.go b/essentials/image/doc.go
new file mode 100644
index 000000000..543c788db
--- /dev/null
+++ b/essentials/image/doc.go
@@ -0,0 +1,2 @@
+// Package image provides essential functionalities for image processing.
+package image
diff --git a/essentials/image/ei_exif/doc.go b/essentials/image/ei_exif/doc.go
new file mode 100644
index 000000000..38cf1dbec
--- /dev/null
+++ b/essentials/image/ei_exif/doc.go
@@ -0,0 +1,2 @@
+// Package ei_exif provides functionalities for parsing EXIF data from image files.
+package ei_exif
diff --git a/essentials/image/ei_exif/native_test.go b/essentials/image/ei_exif/native_test.go
index 68fed96f1..17a887d8b 100644
--- a/essentials/image/ei_exif/native_test.go
+++ b/essentials/image/ei_exif/native_test.go
@@ -1,7 +1,7 @@
package ei_exif
import (
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/log/esl"
"path/filepath"
"testing"
diff --git a/essentials/io/doc.go b/essentials/io/doc.go
new file mode 100644
index 000000000..a4aa00a86
--- /dev/null
+++ b/essentials/io/doc.go
@@ -0,0 +1,2 @@
+// Package io provides essential functionalities for I/O operations.
+package io
diff --git a/essentials/io/es_block/doc.go b/essentials/io/es_block/doc.go
new file mode 100644
index 000000000..5c175a4c5
--- /dev/null
+++ b/essentials/io/es_block/doc.go
@@ -0,0 +1,2 @@
+// Package es_block provides functionalities for reading and writing data in fixed-size blocks.
+package es_block
diff --git a/essentials/io/es_close/doc.go b/essentials/io/es_close/doc.go
new file mode 100644
index 000000000..364330de8
--- /dev/null
+++ b/essentials/io/es_close/doc.go
@@ -0,0 +1,2 @@
+// Package es_close provides utility functions for io.WriteCloser interfaces.
+package es_close
diff --git a/essentials/io/es_file_copy/doc.go b/essentials/io/es_file_copy/doc.go
new file mode 100644
index 000000000..c7476ca99
--- /dev/null
+++ b/essentials/io/es_file_copy/doc.go
@@ -0,0 +1,2 @@
+// Package es_file_copy provides a function to copy a file.
+package es_file_copy
diff --git a/essentials/io/es_file_random/doc.go b/essentials/io/es_file_random/doc.go
new file mode 100644
index 000000000..6b75b9b2b
--- /dev/null
+++ b/essentials/io/es_file_random/doc.go
@@ -0,0 +1,2 @@
+// Package es_file_random provides a reader that generates pseudo-random bytes.
+package es_file_random
diff --git a/essentials/io/es_file_read/doc.go b/essentials/io/es_file_read/doc.go
new file mode 100644
index 000000000..3c38717d3
--- /dev/null
+++ b/essentials/io/es_file_read/doc.go
@@ -0,0 +1,2 @@
+// Package es_file_read provides utility functions for reading files.
+package es_file_read
diff --git a/essentials/io/es_line/doc.go b/essentials/io/es_line/doc.go
new file mode 100644
index 000000000..1457ea405
--- /dev/null
+++ b/essentials/io/es_line/doc.go
@@ -0,0 +1,2 @@
+// Package es_line provides a writer that removes redundant newlines.
+package es_line
diff --git a/essentials/io/es_rewinder/doc.go b/essentials/io/es_rewinder/doc.go
new file mode 100644
index 000000000..abbd87e6a
--- /dev/null
+++ b/essentials/io/es_rewinder/doc.go
@@ -0,0 +1,2 @@
+// Package es_rewinder provides a ReadRewinder interface and implementations for reading rewound data.
+package es_rewinder
diff --git a/essentials/io/es_stdout/doc.go b/essentials/io/es_stdout/doc.go
new file mode 100644
index 000000000..5e9088f22
--- /dev/null
+++ b/essentials/io/es_stdout/doc.go
@@ -0,0 +1,2 @@
+// Package es_stdout provides functions for creating io.WriteCloser instances for standard output and standard error.
+package es_stdout
diff --git a/essentials/io/es_timeout/doc.go b/essentials/io/es_timeout/doc.go
new file mode 100644
index 000000000..35c00668d
--- /dev/null
+++ b/essentials/io/es_timeout/doc.go
@@ -0,0 +1,2 @@
+// Package es_timeout provides a TimeoutWriter that applies a timeout to write operations.
+package es_timeout
diff --git a/essentials/io/es_zip/doc.go b/essentials/io/es_zip/doc.go
new file mode 100644
index 000000000..ba9c36241
--- /dev/null
+++ b/essentials/io/es_zip/doc.go
@@ -0,0 +1,2 @@
+// Package es_zip provides functionalities for creating and extracting zip archives.
+package es_zip
diff --git a/essentials/kvs/doc.go b/essentials/kvs/doc.go
new file mode 100644
index 000000000..c9c2192a1
--- /dev/null
+++ b/essentials/kvs/doc.go
@@ -0,0 +1,2 @@
+// Package kvs provides essential functionalities for Key-Value Store (KVS) operations.
+package kvs
diff --git a/essentials/kvs/kv_kvs/doc.go b/essentials/kvs/kv_kvs/doc.go
new file mode 100644
index 000000000..dba4b421c
--- /dev/null
+++ b/essentials/kvs/kv_kvs/doc.go
@@ -0,0 +1,2 @@
+// Package kv_kvs defines the interface for a Key-Value Store (KVS).
+package kv_kvs
diff --git a/essentials/kvs/kv_kvs_impl/doc.go b/essentials/kvs/kv_kvs_impl/doc.go
new file mode 100644
index 000000000..095fedac5
--- /dev/null
+++ b/essentials/kvs/kv_kvs_impl/doc.go
@@ -0,0 +1,2 @@
+// Package kv_kvs_impl provides various implementations of the Key-Value Store (KVS) interface.
+package kv_kvs_impl
diff --git a/essentials/kvs/kv_kvs_impl/empty_test.go b/essentials/kvs/kv_kvs_impl/empty_test.go
index 07d92ac16..0fdc33e45 100644
--- a/essentials/kvs/kv_kvs_impl/empty_test.go
+++ b/essentials/kvs/kv_kvs_impl/empty_test.go
@@ -2,8 +2,8 @@ package kv_kvs_impl
import (
"encoding/json"
- "testing"
"github.com/watermint/toolbox/essentials/kvs/kv_kvs"
+ "testing"
)
func TestNewEmpty(t *testing.T) {
@@ -15,16 +15,16 @@ func TestNewEmpty(t *testing.T) {
func TestEmptyImpl_PutOperations(t *testing.T) {
kvs := NewEmpty()
-
+
// All put operations should succeed without error
if err := kvs.PutString("key", "value"); err != nil {
t.Errorf("PutString should not return error, got: %v", err)
}
-
+
if err := kvs.PutJson("key", json.RawMessage(`{"test": "value"}`)); err != nil {
t.Errorf("PutJson should not return error, got: %v", err)
}
-
+
testModel := map[string]string{"test": "value"}
if err := kvs.PutJsonModel("key", testModel); err != nil {
t.Errorf("PutJsonModel should not return error, got: %v", err)
@@ -33,7 +33,7 @@ func TestEmptyImpl_PutOperations(t *testing.T) {
func TestEmptyImpl_GetOperations(t *testing.T) {
kvs := NewEmpty()
-
+
// All get operations should return not found error
value, err := kvs.GetString("key")
if err != kv_kvs.ErrorNotFound {
@@ -42,7 +42,7 @@ func TestEmptyImpl_GetOperations(t *testing.T) {
if value != "" {
t.Errorf("GetString should return empty string, got: %s", value)
}
-
+
jsonMsg, err := kvs.GetJson("key")
if err != kv_kvs.ErrorNotFound {
t.Errorf("GetJson should return ErrorNotFound, got: %v", err)
@@ -50,7 +50,7 @@ func TestEmptyImpl_GetOperations(t *testing.T) {
if jsonMsg != nil {
t.Errorf("GetJson should return nil, got: %v", jsonMsg)
}
-
+
var testModel map[string]string
err = kvs.GetJsonModel("key", &testModel)
if err != kv_kvs.ErrorNotFound {
@@ -60,7 +60,7 @@ func TestEmptyImpl_GetOperations(t *testing.T) {
func TestEmptyImpl_Delete(t *testing.T) {
kvs := NewEmpty()
-
+
// Delete should succeed without error
if err := kvs.Delete("key"); err != nil {
t.Errorf("Delete should not return error, got: %v", err)
@@ -69,7 +69,7 @@ func TestEmptyImpl_Delete(t *testing.T) {
func TestEmptyImpl_ForEachOperations(t *testing.T) {
kvs := NewEmpty()
-
+
// ForEach should not call the function (no entries)
called := false
err := kvs.ForEach(func(key string, value []byte) error {
@@ -82,7 +82,7 @@ func TestEmptyImpl_ForEachOperations(t *testing.T) {
if called {
t.Error("ForEach should not call function on empty KVS")
}
-
+
// ForEachRaw should not call the function (no entries)
called = false
err = kvs.ForEachRaw(func(key []byte, value []byte) error {
@@ -95,7 +95,7 @@ func TestEmptyImpl_ForEachOperations(t *testing.T) {
if called {
t.Error("ForEachRaw should not call function on empty KVS")
}
-
+
// ForEachModel should not call the function (no entries)
called = false
var testModel map[string]string
@@ -110,4 +110,3 @@ func TestEmptyImpl_ForEachOperations(t *testing.T) {
t.Error("ForEachModel should not call function on empty KVS")
}
}
-
diff --git a/essentials/kvs/kv_kvs_impl/turnstile_test.go b/essentials/kvs/kv_kvs_impl/turnstile_test.go
index 8abfa5f0e..826116487 100644
--- a/essentials/kvs/kv_kvs_impl/turnstile_test.go
+++ b/essentials/kvs/kv_kvs_impl/turnstile_test.go
@@ -13,7 +13,7 @@ import (
func TestNewTurnstile(t *testing.T) {
mockKvs := NewEmpty()
turnstile := NewTurnstile(mockKvs)
-
+
if turnstile == nil {
t.Error("Expected non-nil turnstile")
}
@@ -22,12 +22,12 @@ func TestNewTurnstile(t *testing.T) {
func TestTurnstileImpl_PutString(t *testing.T) {
mockKvs := &mockKvs{data: make(map[string]string)}
turnstile := NewTurnstile(mockKvs)
-
+
err := turnstile.PutString("key1", "value1")
if err != nil {
t.Errorf("PutString should not return error, got: %v", err)
}
-
+
// Verify the value was stored in the underlying KVS
if mockKvs.data["key1"] != "value1" {
t.Errorf("Expected value1, got %s", mockKvs.data["key1"])
@@ -37,13 +37,13 @@ func TestTurnstileImpl_PutString(t *testing.T) {
func TestTurnstileImpl_PutJson(t *testing.T) {
mockKvs := &mockKvs{data: make(map[string]string)}
turnstile := NewTurnstile(mockKvs)
-
+
jsonData := json.RawMessage(`{"test": "value"}`)
err := turnstile.PutJson("key1", jsonData)
if err != nil {
t.Errorf("PutJson should not return error, got: %v", err)
}
-
+
// Verify the JSON was stored
if mockKvs.data["key1"] != string(jsonData) {
t.Errorf("Expected %s, got %s", jsonData, mockKvs.data["key1"])
@@ -53,13 +53,13 @@ func TestTurnstileImpl_PutJson(t *testing.T) {
func TestTurnstileImpl_PutJsonModel(t *testing.T) {
mockKvs := &mockKvs{data: make(map[string]string)}
turnstile := NewTurnstile(mockKvs)
-
+
testModel := map[string]string{"test": "value"}
err := turnstile.PutJsonModel("key1", testModel)
if err != nil {
t.Errorf("PutJsonModel should not return error, got: %v", err)
}
-
+
// Verify that PutJsonModel delegates to the underlying KVS
}
@@ -67,7 +67,7 @@ func TestTurnstileImpl_GetString(t *testing.T) {
mockKvs := &mockKvs{data: make(map[string]string)}
mockKvs.data["key1"] = "value1"
turnstile := NewTurnstile(mockKvs)
-
+
value, err := turnstile.GetString("key1")
if err != nil {
t.Errorf("GetString should not return error, got: %v", err)
@@ -75,7 +75,7 @@ func TestTurnstileImpl_GetString(t *testing.T) {
if value != "value1" {
t.Errorf("Expected value1, got %s", value)
}
-
+
// Verify that GetString delegates to the underlying KVS
}
@@ -84,7 +84,7 @@ func TestTurnstileImpl_GetJson(t *testing.T) {
jsonData := `{"test": "value"}`
mockKvs.data["key1"] = jsonData
turnstile := NewTurnstile(mockKvs)
-
+
result, err := turnstile.GetJson("key1")
if err != nil {
t.Errorf("GetJson should not return error, got: %v", err)
@@ -92,7 +92,7 @@ func TestTurnstileImpl_GetJson(t *testing.T) {
if string(result) != jsonData {
t.Errorf("Expected %s, got %s", jsonData, result)
}
-
+
// Verify that GetJson delegates to the underlying KVS
}
@@ -100,13 +100,13 @@ func TestTurnstileImpl_GetJsonModel(t *testing.T) {
mockKvs := &mockKvs{data: make(map[string]string)}
mockKvs.data["key1"] = `{"test": "value"}`
turnstile := NewTurnstile(mockKvs)
-
+
var result map[string]string
err := turnstile.GetJsonModel("key1", &result)
if err != nil {
t.Errorf("GetJsonModel should not return error, got: %v", err)
}
-
+
// Verify that GetJsonModel delegates to the underlying KVS
}
@@ -114,12 +114,12 @@ func TestTurnstileImpl_Delete(t *testing.T) {
mockKvs := &mockKvs{data: make(map[string]string)}
mockKvs.data["key1"] = "value1"
turnstile := NewTurnstile(mockKvs)
-
+
err := turnstile.Delete("key1")
if err != nil {
t.Errorf("Delete should not return error, got: %v", err)
}
-
+
// Verify that Delete delegates to the underlying KVS
}
@@ -128,7 +128,7 @@ func TestTurnstileImpl_ForEach(t *testing.T) {
mockKvs.data["key1"] = "value1"
mockKvs.data["key2"] = "value2"
turnstile := NewTurnstile(mockKvs)
-
+
count := 0
err := turnstile.ForEach(func(key string, value []byte) error {
count++
@@ -137,7 +137,7 @@ func TestTurnstileImpl_ForEach(t *testing.T) {
if err != nil {
t.Errorf("ForEach should not return error, got: %v", err)
}
-
+
// Verify that ForEach delegates to the underlying KVS
}
@@ -147,40 +147,40 @@ func TestTurnstileImpl_ConcurrentAccess(t *testing.T) {
mutex: &sync.Mutex{},
}
turnstile := NewTurnstile(mockKvs)
-
+
// Test concurrent access
numGoroutines := 10
numOpsPerGoroutine := 100
-
+
var wg sync.WaitGroup
wg.Add(numGoroutines)
-
+
for i := 0; i < numGoroutines; i++ {
go func(id int) {
defer wg.Done()
for j := 0; j < numOpsPerGoroutine; j++ {
key := fmt.Sprintf("key_%d_%d", id, j)
value := fmt.Sprintf("value_%d_%d", id, j)
-
+
err := turnstile.PutString(key, value)
if err != nil {
t.Errorf("PutString failed: %v", err)
}
-
+
// Small delay to increase chance of race conditions
time.Sleep(time.Microsecond)
}
}(i)
}
-
+
wg.Wait()
-
+
// Verify all values were stored
expectedCount := numGoroutines * numOpsPerGoroutine
mockKvs.mutex.Lock()
actualCount := len(mockKvs.data)
mockKvs.mutex.Unlock()
-
+
if actualCount != expectedCount {
t.Errorf("Expected %d entries, got %d", expectedCount, actualCount)
}
@@ -309,4 +309,4 @@ func (m *mockKvs) ForEachModel(model interface{}, f func(key string, m interface
}
}
return nil
-}
\ No newline at end of file
+}
diff --git a/essentials/kvs/kv_storage/doc.go b/essentials/kvs/kv_storage/doc.go
new file mode 100644
index 000000000..e44111363
--- /dev/null
+++ b/essentials/kvs/kv_storage/doc.go
@@ -0,0 +1,2 @@
+// Package kv_storage defines interfaces for Key-Value Store (KVS) storage.
+package kv_storage
diff --git a/essentials/kvs/kv_storage_impl/doc.go b/essentials/kvs/kv_storage_impl/doc.go
new file mode 100644
index 000000000..2564deaaa
--- /dev/null
+++ b/essentials/kvs/kv_storage_impl/doc.go
@@ -0,0 +1,2 @@
+// Package kv_storage_impl provides concrete implementations for kv_storage.Lifecycle using various KVS engines.
+package kv_storage_impl
diff --git a/essentials/log/doc.go b/essentials/log/doc.go
new file mode 100644
index 000000000..88f2cd469
--- /dev/null
+++ b/essentials/log/doc.go
@@ -0,0 +1,2 @@
+// Package log provides essential logging functionalities.
+package log
diff --git a/essentials/log/esl/doc.go b/essentials/log/esl/doc.go
new file mode 100644
index 000000000..24766bac1
--- /dev/null
+++ b/essentials/log/esl/doc.go
@@ -0,0 +1,2 @@
+// Package esl provides an essential logging framework.
+package esl
diff --git a/essentials/log/esl_container/doc.go b/essentials/log/esl_container/doc.go
new file mode 100644
index 000000000..ddfb8a061
--- /dev/null
+++ b/essentials/log/esl_container/doc.go
@@ -0,0 +1,2 @@
+// Package esl_container provides logger container and management.
+package esl_container
diff --git a/essentials/log/esl_encode/doc.go b/essentials/log/esl_encode/doc.go
new file mode 100644
index 000000000..fa338d056
--- /dev/null
+++ b/essentials/log/esl_encode/doc.go
@@ -0,0 +1,2 @@
+// Package esl_encode provides encoding functions for logging.
+package esl_encode
diff --git a/essentials/log/esl_process/doc.go b/essentials/log/esl_process/doc.go
new file mode 100644
index 000000000..e0359985a
--- /dev/null
+++ b/essentials/log/esl_process/doc.go
@@ -0,0 +1,2 @@
+// Package esl_process provides logging for external processes.
+package esl_process
diff --git a/essentials/log/esl_rotate/doc.go b/essentials/log/esl_rotate/doc.go
new file mode 100644
index 000000000..d4f5c2acc
--- /dev/null
+++ b/essentials/log/esl_rotate/doc.go
@@ -0,0 +1,2 @@
+// Package esl_rotate provides log file rotation functionality.
+package esl_rotate
diff --git a/essentials/log/stats/doc.go b/essentials/log/stats/doc.go
new file mode 100644
index 000000000..2bbc9cbfa
--- /dev/null
+++ b/essentials/log/stats/doc.go
@@ -0,0 +1,2 @@
+// Package stats provides logging for system statistics.
+package stats
diff --git a/essentials/log/stats/es_memory/doc.go b/essentials/log/stats/es_memory/doc.go
new file mode 100644
index 000000000..d473ccee4
--- /dev/null
+++ b/essentials/log/stats/es_memory/doc.go
@@ -0,0 +1,2 @@
+// Package es_memory provides functions for reporting memory statistics.
+package es_memory
diff --git a/essentials/log/wrapper/doc.go b/essentials/log/wrapper/doc.go
new file mode 100644
index 000000000..5ec46a1de
--- /dev/null
+++ b/essentials/log/wrapper/doc.go
@@ -0,0 +1,2 @@
+// Package wrapper provides wrappers for various logging frameworks.
+package wrapper
diff --git a/essentials/log/wrapper/lgw_badger/doc.go b/essentials/log/wrapper/lgw_badger/doc.go
new file mode 100644
index 000000000..bc6a19551
--- /dev/null
+++ b/essentials/log/wrapper/lgw_badger/doc.go
@@ -0,0 +1,2 @@
+// Package lgw_badger provides a wrapper for the BadgerDB logger.
+package lgw_badger
diff --git a/essentials/log/wrapper/lgw_gin/doc.go b/essentials/log/wrapper/lgw_gin/doc.go
new file mode 100644
index 000000000..d5d206841
--- /dev/null
+++ b/essentials/log/wrapper/lgw_gin/doc.go
@@ -0,0 +1,2 @@
+// Package lgw_gin provides Gin framework middleware for logging and panic recovery.
+package lgw_gin
diff --git a/essentials/log/wrapper/lgw_golog/doc.go b/essentials/log/wrapper/lgw_golog/doc.go
new file mode 100644
index 000000000..87f1744c2
--- /dev/null
+++ b/essentials/log/wrapper/lgw_golog/doc.go
@@ -0,0 +1,2 @@
+// Package lgw_golog provides a wrapper for the standard Go log package.
+package lgw_golog
diff --git a/essentials/log/wrapper/lgw_print/doc.go b/essentials/log/wrapper/lgw_print/doc.go
new file mode 100644
index 000000000..d578c6a13
--- /dev/null
+++ b/essentials/log/wrapper/lgw_print/doc.go
@@ -0,0 +1,2 @@
+// Package lgw_print provides a wrapper for standard print functions.
+package lgw_print
diff --git a/essentials/model/doc.go b/essentials/model/doc.go
new file mode 100644
index 000000000..ba086d30e
--- /dev/null
+++ b/essentials/model/doc.go
@@ -0,0 +1,2 @@
+// Package model provides essential data models.
+package model
diff --git a/essentials/model/em_file/doc.go b/essentials/model/em_file/doc.go
new file mode 100644
index 000000000..72d043c05
--- /dev/null
+++ b/essentials/model/em_file/doc.go
@@ -0,0 +1,2 @@
+// Package em_file provides an in-memory model for representing file system structures.
+package em_file
diff --git a/essentials/model/em_file/node_test.go b/essentials/model/em_file/node_test.go
index a871f96f9..c319a1a8c 100644
--- a/essentials/model/em_file/node_test.go
+++ b/essentials/model/em_file/node_test.go
@@ -104,19 +104,19 @@ func TestFolderNode_Delete(t *testing.T) {
func TestNewFile(t *testing.T) {
now := time.Now()
file := NewFile("test.txt", 1024, now, 42)
-
+
if file.Name() != "test.txt" {
t.Errorf("Expected name 'test.txt', got '%s'", file.Name())
}
-
+
if file.Size() != 1024 {
t.Errorf("Expected size 1024, got %d", file.Size())
}
-
+
if !file.ModTime().Equal(now) {
t.Errorf("Expected time %v, got %v", now, file.ModTime())
}
-
+
if file.Type() != FileNode {
t.Errorf("Expected type FileNode, got %v", file.Type())
}
@@ -126,17 +126,17 @@ func TestNewFolder(t *testing.T) {
file1 := NewFile("file1.txt", 100, time.Now(), 1)
file2 := NewFile("file2.txt", 200, time.Now(), 2)
children := []Node{file1, file2}
-
+
folder := NewFolder("testfolder", children)
-
+
if folder.Name() != "testfolder" {
t.Errorf("Expected name 'testfolder', got '%s'", folder.Name())
}
-
+
if folder.Type() != FolderNode {
t.Errorf("Expected type FolderNode, got %v", folder.Type())
}
-
+
descendants := folder.Descendants()
if len(descendants) != 2 {
t.Errorf("Expected 2 descendants, got %d", len(descendants))
@@ -146,11 +146,11 @@ func TestNewFolder(t *testing.T) {
func TestFileNode_Clone(t *testing.T) {
original := NewFile("original.txt", 512, time.Now(), 123)
cloned := original.Clone()
-
+
if !cloned.Equals(original) {
t.Error("Cloned file should equal original")
}
-
+
// Verify they are separate instances
original.Rename("renamed.txt")
if cloned.Name() == "renamed.txt" {
@@ -161,7 +161,7 @@ func TestFileNode_Clone(t *testing.T) {
func TestFileNode_Rename(t *testing.T) {
file := NewFile("old.txt", 100, time.Now(), 1)
file.Rename("new.txt")
-
+
if file.Name() != "new.txt" {
t.Errorf("Expected name 'new.txt', got '%s'", file.Name())
}
@@ -170,9 +170,9 @@ func TestFileNode_Rename(t *testing.T) {
func TestFileNode_UpdateTime(t *testing.T) {
file := NewFile("test.txt", 100, time.Unix(1000, 0), 1)
newTime := time.Unix(2000, 0)
-
+
file.UpdateTime(newTime)
-
+
if !file.ModTime().Equal(newTime) {
t.Errorf("Expected time %v, got %v", newTime, file.ModTime())
}
@@ -181,26 +181,26 @@ func TestFileNode_UpdateTime(t *testing.T) {
func TestFileNode_UpdateContent(t *testing.T) {
file := NewFile("test.txt", 100, time.Unix(1000, 0), 1)
originalTime := file.ModTime()
-
+
// Wait a bit to ensure time difference
time.Sleep(time.Millisecond)
-
+
file.UpdateContent(42, 200)
-
+
if file.Size() != 200 {
t.Errorf("Expected size 200, got %d", file.Size())
}
-
+
// Time should be updated
if !file.ModTime().After(originalTime) {
t.Error("ModTime should be updated after content update")
}
-
+
// Content should be different due to new seed
expectedContent := make([]byte, 200)
r := rand.New(rand.NewSource(42))
r.Read(expectedContent)
-
+
actualContent := file.Content()
if len(actualContent) != 200 {
t.Errorf("Expected content length 200, got %d", len(actualContent))
@@ -209,9 +209,9 @@ func TestFileNode_UpdateContent(t *testing.T) {
func TestFileNode_ExtraData(t *testing.T) {
file := NewFile("test.txt", 100, time.Now(), 42)
-
+
extraData := file.ExtraData()
-
+
if seed, ok := extraData[ExtraDataContentSeed]; !ok || seed != int64(42) {
t.Errorf("Expected content seed 42 in extra data, got %v", seed)
}
@@ -219,23 +219,23 @@ func TestFileNode_ExtraData(t *testing.T) {
func TestFileNode_Content(t *testing.T) {
file := NewFile("test.txt", 100, time.Now(), 42)
-
+
content1 := file.Content()
content2 := file.Content()
-
+
// Should be reproducible with same seed
if len(content1) != 100 {
t.Errorf("Expected content length 100, got %d", len(content1))
}
-
+
if !reflect.DeepEqual(content1, content2) {
t.Error("Content should be reproducible with same seed")
}
-
+
// Different seed should produce different content
file2 := NewFile("test2.txt", 100, time.Now(), 43)
content3 := file2.Content()
-
+
if reflect.DeepEqual(content1, content3) {
t.Error("Different seeds should produce different content")
}
@@ -249,32 +249,32 @@ func TestFileNode_Equals_DetailedTests(t *testing.T) {
file4 := NewFile("test.txt", 200, now, 42)
file5 := NewFile("test.txt", 100, now.Add(time.Hour), 42)
file6 := NewFile("test.txt", 100, now, 43)
-
+
// Same files should be equal
if !file1.Equals(file2) {
t.Error("Identical files should be equal")
}
-
+
// Different name
if file1.Equals(file3) {
t.Error("Files with different names should not be equal")
}
-
+
// Different size
if file1.Equals(file4) {
t.Error("Files with different sizes should not be equal")
}
-
+
// Different time
if file1.Equals(file5) {
t.Error("Files with different times should not be equal")
}
-
+
// Different content seed
if file1.Equals(file6) {
t.Error("Files with different content should not be equal")
}
-
+
// File vs folder
folder := NewFolder("test", []Node{})
if file1.Equals(folder) {
@@ -285,7 +285,7 @@ func TestFileNode_Equals_DetailedTests(t *testing.T) {
func TestFolderNode_Rename(t *testing.T) {
folder := NewFolder("old", []Node{})
folder.Rename("new")
-
+
if folder.Name() != "new" {
t.Errorf("Expected name 'new', got '%s'", folder.Name())
}
@@ -295,13 +295,13 @@ func TestFolderNode_NumFiles(t *testing.T) {
file1 := NewFile("file1.txt", 100, time.Now(), 1)
file2 := NewFile("file2.txt", 200, time.Now(), 2)
subfolder := NewFolder("sub", []Node{})
-
+
folder := NewFolder("parent", []Node{file1, file2, subfolder})
-
+
if folder.NumFiles() != 2 {
t.Errorf("Expected 2 files, got %d", folder.NumFiles())
}
-
+
if folder.NumFolders() != 1 {
t.Errorf("Expected 1 folder, got %d", folder.NumFolders())
}
@@ -309,9 +309,9 @@ func TestFolderNode_NumFiles(t *testing.T) {
func TestFolderNode_ExtraData(t *testing.T) {
folder := NewFolder("test", []Node{})
-
+
extraData := folder.ExtraData()
-
+
if len(extraData) != 0 {
t.Errorf("Expected empty extra data for folder, got %v", extraData)
}
@@ -321,36 +321,36 @@ func TestFolderNode_DeepEquals(t *testing.T) {
// Create identical folder structures
file1a := NewFile("file1.txt", 100, time.Unix(1000, 0), 1)
file1b := NewFile("file1.txt", 100, time.Unix(1000, 0), 1)
-
+
folder1a := NewFolder("folder1", []Node{file1a})
folder1b := NewFolder("folder1", []Node{file1b})
-
+
if !folder1a.DeepEquals(folder1b) {
t.Error("Identical folder structures should be deep equal")
}
-
+
// Different file content
file2 := NewFile("file1.txt", 100, time.Unix(1000, 0), 2) // different seed
folder2 := NewFolder("folder1", []Node{file2})
-
+
if folder1a.DeepEquals(folder2) {
t.Error("Folders with different file content should not be deep equal")
}
-
+
// Different number of children
file3 := NewFile("file2.txt", 100, time.Unix(1000, 0), 1)
folder3 := NewFolder("folder1", []Node{file1a, file3})
-
+
if folder1a.DeepEquals(folder3) {
t.Error("Folders with different number of children should not be deep equal")
}
-
+
// Different folder name
folder4 := NewFolder("folder2", []Node{file1a})
if folder1a.DeepEquals(folder4) {
t.Error("Folders with different names should not be deep equal")
}
-
+
// Folder vs file
if folder1a.DeepEquals(file1a) {
t.Error("Folder should not deep equal file")
@@ -359,21 +359,21 @@ func TestFolderNode_DeepEquals(t *testing.T) {
func TestFolderNode_Add_CaseInsensitive(t *testing.T) {
folder := NewFolder("test", []Node{})
-
+
file1 := NewFile("Test.txt", 100, time.Now(), 1)
file2 := NewFile("test.txt", 200, time.Now(), 2)
-
+
folder.Add(file1)
if len(folder.Descendants()) != 1 {
t.Errorf("Expected 1 child after first add, got %d", len(folder.Descendants()))
}
-
+
// Adding with different case should replace
folder.Add(file2)
if len(folder.Descendants()) != 1 {
t.Errorf("Expected 1 child after case-insensitive replace, got %d", len(folder.Descendants()))
}
-
+
// Should have the second file
child := folder.Descendants()[0]
if !child.Equals(file2) {
@@ -383,41 +383,41 @@ func TestFolderNode_Add_CaseInsensitive(t *testing.T) {
func TestDemoTree(t *testing.T) {
root := DemoTree()
-
+
if root.Name() != "" {
t.Errorf("Expected root name to be empty, got '%s'", root.Name())
}
-
+
if root.Type() != FolderNode {
t.Errorf("Expected root type to be FolderNode, got %v", root.Type())
}
-
+
// Check structure
aNode := ResolvePath(root, "/a")
if aNode == nil {
t.Error("Expected /a to exist")
}
-
+
xNode := ResolvePath(root, "/a/x")
if xNode == nil || xNode.Type() != FileNode {
t.Error("Expected /a/x to be a file")
}
-
+
yNode := ResolvePath(root, "/a/y")
if yNode == nil || yNode.Type() != FileNode {
t.Error("Expected /a/y to be a file")
}
-
+
bNode := ResolvePath(root, "/a/b")
if bNode == nil || bNode.Type() != FolderNode {
t.Error("Expected /a/b to be a folder")
}
-
+
cNode := ResolvePath(root, "/a/c")
if cNode == nil || cNode.Type() != FolderNode {
t.Error("Expected /a/c to be a folder")
}
-
+
zNode := ResolvePath(root, "/a/c/z")
if zNode == nil || zNode.Type() != FileNode {
t.Error("Expected /a/c/z to be a file")
diff --git a/essentials/model/em_file_random/doc.go b/essentials/model/em_file_random/doc.go
new file mode 100644
index 000000000..06f1e321f
--- /dev/null
+++ b/essentials/model/em_file_random/doc.go
@@ -0,0 +1,2 @@
+// Package em_file_random provides a generator for creating random file system structures.
+package em_file_random
diff --git a/essentials/model/em_file_random/generator_opts_test.go b/essentials/model/em_file_random/generator_opts_test.go
index 66f221a7d..935b759a0 100644
--- a/essentials/model/em_file_random/generator_opts_test.go
+++ b/essentials/model/em_file_random/generator_opts_test.go
@@ -7,7 +7,7 @@ import (
func TestDefault(t *testing.T) {
opts := Default()
-
+
// Check default values
if opts.fileSizeRangeMax != 2048 {
t.Errorf("Expected fileSizeRangeMax to be 2048, got %d", opts.fileSizeRangeMax)
@@ -27,7 +27,7 @@ func TestDefault(t *testing.T) {
if opts.depthRangeMax != 8 {
t.Errorf("Expected depthRangeMax to be 8, got %d", opts.depthRangeMax)
}
-
+
// Check date ranges are reasonable
now := time.Now()
if opts.fileDateRangeMax.After(now.Add(time.Minute)) {
@@ -37,7 +37,7 @@ func TestDefault(t *testing.T) {
if opts.fileDateRangeMin.Before(expectedMin.Add(-time.Hour)) || opts.fileDateRangeMin.After(expectedMin.Add(time.Hour)) {
t.Error("Expected fileDateRangeMin to be around 2 years ago")
}
-
+
// Seed should be non-zero
if opts.seed == 0 {
t.Error("Expected seed to be non-zero")
@@ -51,14 +51,14 @@ func TestOpts_Apply(t *testing.T) {
if result.numFiles != opts.numFiles {
t.Error("Apply with no options should return unchanged opts")
}
-
+
// Test with single option
opt1 := NumFiles(500)
result = opts.Apply([]Opt{opt1})
if result.numFiles != 500 {
t.Errorf("Expected numFiles to be 500, got %d", result.numFiles)
}
-
+
// Test with multiple options
opt2 := Depth(10)
opt3 := Seed(12345)
@@ -77,14 +77,14 @@ func TestOpts_Apply(t *testing.T) {
func TestFileSize(t *testing.T) {
opts := Default()
modified := FileSize(100, 5000)(opts)
-
+
if modified.fileSizeRangeMin != 100 {
t.Errorf("Expected fileSizeRangeMin to be 100, got %d", modified.fileSizeRangeMin)
}
if modified.fileSizeRangeMax != 5000 {
t.Errorf("Expected fileSizeRangeMax to be 5000, got %d", modified.fileSizeRangeMax)
}
-
+
// Other fields should remain unchanged
if modified.numFiles != opts.numFiles {
t.Error("FileSize option should not modify numFiles")
@@ -95,9 +95,9 @@ func TestFileDate(t *testing.T) {
opts := Default()
minDate := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)
maxDate := time.Date(2023, 12, 31, 23, 59, 59, 0, time.UTC)
-
+
modified := FileDate(minDate, maxDate)(opts)
-
+
if !modified.fileDateRangeMin.Equal(minDate) {
t.Errorf("Expected fileDateRangeMin to be %v, got %v", minDate, modified.fileDateRangeMin)
}
@@ -109,11 +109,11 @@ func TestFileDate(t *testing.T) {
func TestDepth(t *testing.T) {
opts := Default()
modified := Depth(15)(opts)
-
+
if modified.depthRangeMax != 15 {
t.Errorf("Expected depthRangeMax to be 15, got %d", modified.depthRangeMax)
}
-
+
// Test with zero depth
modified = Depth(0)(opts)
if modified.depthRangeMax != 0 {
@@ -124,7 +124,7 @@ func TestDepth(t *testing.T) {
func TestNumDescendant(t *testing.T) {
opts := Default()
modified := NumDescendant(100, 20)(opts)
-
+
if modified.maxFilesInFolder != 100 {
t.Errorf("Expected maxFilesInFolder to be 100, got %d", modified.maxFilesInFolder)
}
@@ -136,7 +136,7 @@ func TestNumDescendant(t *testing.T) {
func TestNumFiles(t *testing.T) {
opts := Default()
modified := NumFiles(2500)(opts)
-
+
if modified.numFiles != 2500 {
t.Errorf("Expected numFiles to be 2500, got %d", modified.numFiles)
}
@@ -145,7 +145,7 @@ func TestNumFiles(t *testing.T) {
func TestSeed(t *testing.T) {
opts := Default()
modified := Seed(9876543210)(opts)
-
+
if modified.seed != 9876543210 {
t.Errorf("Expected seed to be 9876543210, got %d", modified.seed)
}
@@ -160,7 +160,7 @@ func TestChainedOptions(t *testing.T) {
Seed(11111),
NumDescendant(50, 10),
})
-
+
if opts.numFiles != 3000 {
t.Errorf("Expected numFiles to be 3000, got %d", opts.numFiles)
}
@@ -182,4 +182,4 @@ func TestChainedOptions(t *testing.T) {
if opts.maxFoldersInFolder != 10 {
t.Errorf("Expected maxFoldersInFolder to be 10, got %d", opts.maxFoldersInFolder)
}
-}
\ No newline at end of file
+}
diff --git a/essentials/model/em_random/doc.go b/essentials/model/em_random/doc.go
new file mode 100644
index 000000000..14f0b0e5a
--- /dev/null
+++ b/essentials/model/em_random/doc.go
@@ -0,0 +1,2 @@
+// Package em_random provides functions for generating random numbers following a Poisson distribution.
+package em_random
diff --git a/essentials/model/mo_filter/doc.go b/essentials/model/mo_filter/doc.go
new file mode 100644
index 000000000..89ef737e4
--- /dev/null
+++ b/essentials/model/mo_filter/doc.go
@@ -0,0 +1,2 @@
+// Package mo_filter provides a flexible filtering mechanism for various data types.
+package mo_filter
diff --git a/essentials/model/mo_filter/filter_email_test.go b/essentials/model/mo_filter/filter_email_test.go
index 32e604905..29e1a04bc 100644
--- a/essentials/model/mo_filter/filter_email_test.go
+++ b/essentials/model/mo_filter/filter_email_test.go
@@ -66,10 +66,10 @@ func TestEmailFilter(t *testing.T) {
func TestEmailFilter_Accept(t *testing.T) {
tests := []struct {
- name string
- filterEmail string
- input interface{}
- wantAccept bool
+ name string
+ filterEmail string
+ input interface{}
+ wantAccept bool
}{
// Direct email matches
{
@@ -163,4 +163,4 @@ func TestEmailFilter_Accept(t *testing.T) {
}
})
}
-}
\ No newline at end of file
+}
diff --git a/essentials/model/mo_image/doc.go b/essentials/model/mo_image/doc.go
new file mode 100644
index 000000000..bcdf1f058
--- /dev/null
+++ b/essentials/model/mo_image/doc.go
@@ -0,0 +1,2 @@
+// Package mo_image defines a model for EXIF data extracted from images.
+package mo_image
diff --git a/essentials/model/mo_int/doc.go b/essentials/model/mo_int/doc.go
new file mode 100644
index 000000000..e06a1ba31
--- /dev/null
+++ b/essentials/model/mo_int/doc.go
@@ -0,0 +1,2 @@
+// Package mo_int defines a model for an integer value within a specified range.
+package mo_int
diff --git a/essentials/model/mo_int/range_additional_test.go b/essentials/model/mo_int/range_additional_test.go
index 4c627d709..e5ad34615 100644
--- a/essentials/model/mo_int/range_additional_test.go
+++ b/essentials/model/mo_int/range_additional_test.go
@@ -6,7 +6,7 @@ import (
func TestRangeInt_Value64(t *testing.T) {
ri := NewRange()
-
+
// Test with various values
tests := []int64{
0,
@@ -17,13 +17,13 @@ func TestRangeInt_Value64(t *testing.T) {
1234567890,
-1234567890,
}
-
+
for _, val := range tests {
ri.SetValue(val)
if ri.Value64() != val {
t.Errorf("Value64() = %d, want %d", ri.Value64(), val)
}
-
+
// Also verify Value() returns truncated int
if ri.Value() != int(val) {
t.Errorf("Value() = %d, want %d", ri.Value(), int(val))
@@ -33,15 +33,15 @@ func TestRangeInt_Value64(t *testing.T) {
func TestRangeInt_SetRangeWithReversedValues(t *testing.T) {
ri := NewRange()
-
+
// Test that SetRange handles reversed min/max correctly
ri.SetRange(10, 5, 7)
-
+
min, max := ri.Range()
if min != 5 || max != 10 {
t.Errorf("Range() = (%d, %d), want (5, 10)", min, max)
}
-
+
if ri.Value64() != 7 {
t.Errorf("Value64() = %d, want 7", ri.Value64())
}
@@ -49,25 +49,25 @@ func TestRangeInt_SetRangeWithReversedValues(t *testing.T) {
func TestRangeInt_BoundaryValues(t *testing.T) {
ri := NewRange()
-
+
// Test with minimum value at boundary
ri.SetRange(0, 100, 0)
if !ri.IsValid() {
t.Error("Expected valid at minimum boundary")
}
-
+
// Test with maximum value at boundary
ri.SetRange(0, 100, 100)
if !ri.IsValid() {
t.Error("Expected valid at maximum boundary")
}
-
+
// Test with value below range
ri.SetValue(-1)
if ri.IsValid() {
t.Error("Expected invalid below range")
}
-
+
// Test with value above range
ri.SetValue(101)
if ri.IsValid() {
@@ -77,29 +77,29 @@ func TestRangeInt_BoundaryValues(t *testing.T) {
func TestRangeInt_NegativeRange(t *testing.T) {
ri := NewRange()
-
+
// Test with negative range
ri.SetRange(-100, -10, -50)
-
+
min, max := ri.Range()
if min != -100 || max != -10 {
t.Errorf("Range() = (%d, %d), want (-100, -10)", min, max)
}
-
+
if ri.Value64() != -50 {
t.Errorf("Value64() = %d, want -50", ri.Value64())
}
-
+
if !ri.IsValid() {
t.Error("Expected valid in negative range")
}
-
+
// Test invalid values
ri.SetValue(-101)
if ri.IsValid() {
t.Error("Expected invalid below negative range")
}
-
+
ri.SetValue(-9)
if ri.IsValid() {
t.Error("Expected invalid above negative range")
@@ -108,27 +108,27 @@ func TestRangeInt_NegativeRange(t *testing.T) {
func TestRangeInt_ZeroRange(t *testing.T) {
ri := NewRange()
-
+
// Test with same min and max
ri.SetRange(42, 42, 42)
-
+
min, max := ri.Range()
if min != 42 || max != 42 {
t.Errorf("Range() = (%d, %d), want (42, 42)", min, max)
}
-
+
if !ri.IsValid() {
t.Error("Expected valid when value equals min/max")
}
-
+
// Any other value should be invalid
ri.SetValue(41)
if ri.IsValid() {
t.Error("Expected invalid when value differs from single allowed value")
}
-
+
ri.SetValue(43)
if ri.IsValid() {
t.Error("Expected invalid when value differs from single allowed value")
}
-}
\ No newline at end of file
+}
diff --git a/essentials/model/mo_multi/doc.go b/essentials/model/mo_multi/doc.go
new file mode 100644
index 000000000..663277f62
--- /dev/null
+++ b/essentials/model/mo_multi/doc.go
@@ -0,0 +1,2 @@
+// Package mo_multi defines an interface for multi-valued parameters.
+package mo_multi
diff --git a/essentials/model/mo_path/doc.go b/essentials/model/mo_path/doc.go
new file mode 100644
index 000000000..e153b0254
--- /dev/null
+++ b/essentials/model/mo_path/doc.go
@@ -0,0 +1,2 @@
+// Package mo_path defines interfaces and implementations for file system paths.
+package mo_path
diff --git a/essentials/model/mo_path/filesystem_test.go b/essentials/model/mo_path/filesystem_test.go
index ffab43e32..c6f8823c7 100644
--- a/essentials/model/mo_path/filesystem_test.go
+++ b/essentials/model/mo_path/filesystem_test.go
@@ -40,7 +40,7 @@ func TestNewFileSystemPath(t *testing.T) {
if fsp == nil {
t.Fatal("Expected non-nil FileSystemPath")
}
-
+
// Check Path() method
if got := fsp.Path(); got != tt.wantPath {
// The path might be processed by FormatPathWithPredefinedVariables
@@ -49,7 +49,7 @@ func TestNewFileSystemPath(t *testing.T) {
t.Errorf("Path() = %v, want %v", got, tt.wantPath)
}
}
-
+
// The implementation returns the same type for both functions,
// so we can't distinguish them by interface. Just verify it implements FileSystemPath
if _, ok := fsp.(FileSystemPath); !ok {
@@ -83,7 +83,7 @@ func TestNewExistingFileSystemPath(t *testing.T) {
if efsp == nil {
t.Fatal("Expected non-nil ExistingFileSystemPath")
}
-
+
// Check Path() method
got := efsp.Path()
if got != tt.wantPath {
@@ -93,7 +93,7 @@ func TestNewExistingFileSystemPath(t *testing.T) {
t.Errorf("Path() = %v, want %v", got, tt.wantPath)
}
}
-
+
// Check ShouldExist() method
if !efsp.ShouldExist() {
t.Error("ShouldExist() should return true for ExistingFileSystemPath")
@@ -200,7 +200,7 @@ func TestPathWithPredefinedVariables(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
fsp := NewFileSystemPath(tt.input)
path := fsp.Path()
-
+
// If the input contains variables and they couldn't be processed,
// the path should remain unchanged or be processed
if strings.Contains(tt.input, "{{") {
@@ -211,4 +211,4 @@ func TestPathWithPredefinedVariables(t *testing.T) {
}
})
}
-}
\ No newline at end of file
+}
diff --git a/essentials/model/mo_string/doc.go b/essentials/model/mo_string/doc.go
new file mode 100644
index 000000000..c6dcf7c63
--- /dev/null
+++ b/essentials/model/mo_string/doc.go
@@ -0,0 +1,2 @@
+// Package mo_string provides models for string manipulation.
+package mo_string
diff --git a/essentials/native/doc.go b/essentials/native/doc.go
new file mode 100644
index 000000000..c5f4ba88d
--- /dev/null
+++ b/essentials/native/doc.go
@@ -0,0 +1,2 @@
+// Package native provides essential functionalities for native system interactions.
+package native
diff --git a/essentials/native/es_native_windows/doc.go b/essentials/native/es_native_windows/doc.go
new file mode 100644
index 000000000..4db170a08
--- /dev/null
+++ b/essentials/native/es_native_windows/doc.go
@@ -0,0 +1,2 @@
+// Package es_native_windows provides low-level access to Windows API functions.
+package es_native_windows
diff --git a/essentials/network/doc.go b/essentials/network/doc.go
new file mode 100644
index 000000000..a6157ae1e
--- /dev/null
+++ b/essentials/network/doc.go
@@ -0,0 +1,2 @@
+// Package network provides essential functionalities for network interactions.
+package network
diff --git a/essentials/network/nw_assert/doc.go b/essentials/network/nw_assert/doc.go
new file mode 100644
index 000000000..5e2fbfb17
--- /dev/null
+++ b/essentials/network/nw_assert/doc.go
@@ -0,0 +1,2 @@
+// Package nw_assert provides a mechanism for asserting HTTP responses.
+package nw_assert
diff --git a/essentials/network/nw_auth/doc.go b/essentials/network/nw_auth/doc.go
new file mode 100644
index 000000000..ab694e934
--- /dev/null
+++ b/essentials/network/nw_auth/doc.go
@@ -0,0 +1,2 @@
+// Package nw_auth provides network client wrappers for various authentication methods.
+package nw_auth
diff --git a/essentials/network/nw_auth_test/doc.go b/essentials/network/nw_auth_test/doc.go
new file mode 100644
index 000000000..142f055e5
--- /dev/null
+++ b/essentials/network/nw_auth_test/doc.go
@@ -0,0 +1,2 @@
+// Package nw_auth_test contains tests for the nw_auth package.
+package nw_auth_test
diff --git a/essentials/network/nw_bandwidth/bandwidth_test.go b/essentials/network/nw_bandwidth/bandwidth_test.go
index a47e3fce7..3fbbc7e5b 100644
--- a/essentials/network/nw_bandwidth/bandwidth_test.go
+++ b/essentials/network/nw_bandwidth/bandwidth_test.go
@@ -13,7 +13,7 @@ func TestSetBandwidth(t *testing.T) {
if currentLimit != 100 {
t.Errorf("Expected currentLimit to be 100, got %d", currentLimit)
}
-
+
// Test setting to zero (unlimited)
SetBandwidth(0)
if currentLimit != 0 {
@@ -26,26 +26,26 @@ func TestWrapReader(t *testing.T) {
SetBandwidth(0)
originalReader := bytes.NewReader([]byte("test data"))
wrappedReader := WrapReader(originalReader)
-
+
// Should return the original reader when no limit
if wrappedReader != originalReader {
t.Error("Expected WrapReader to return original reader when bandwidth is 0")
}
-
+
// Test with bandwidth limit
SetBandwidth(100) // 100 KB/s - higher limit for testing
// Create a new reader since the previous one was consumed
newReader := bytes.NewReader([]byte("test data"))
wrappedReader = WrapReader(newReader)
-
+
// Should return a different wrapped reader
if wrappedReader == newReader {
t.Error("Expected WrapReader to return wrapped reader when bandwidth is limited")
}
-
+
// The bwlimit library has some issues with small reads
// Just verify that we get a wrapped reader object
-
+
// Reset to no limit
SetBandwidth(0)
}
@@ -56,26 +56,26 @@ func TestWrapWriter(t *testing.T) {
var buf bytes.Buffer
originalWriter := &buf
wrappedWriter := WrapWriter(originalWriter)
-
+
// Should return the original writer when no limit
if wrappedWriter != originalWriter {
t.Error("Expected WrapWriter to return original writer when bandwidth is 0")
}
-
+
// Test with bandwidth limit
SetBandwidth(100) // 100 KB/s - higher limit for testing
// Create a new buffer for the bandwidth-limited test
var buf2 bytes.Buffer
wrappedWriter = WrapWriter(&buf2)
-
+
// Should return a different wrapped writer
if wrappedWriter == &buf2 {
t.Error("Expected WrapWriter to return wrapped writer when bandwidth is limited")
}
-
+
// Skip the actual write test as the bwlimit library seems to have issues
// Just verify that we get a wrapped writer
-
+
// Reset to no limit
SetBandwidth(0)
}
@@ -84,7 +84,7 @@ func TestBandwidthLimiting(t *testing.T) {
// Test that bandwidth limiting actually works
// Set a very low limit
SetBandwidth(1) // 1 KB/s = 1024 bytes/s
-
+
// Create a reader with 2KB of data
data := make([]byte, 2048)
for i := range data {
@@ -92,7 +92,7 @@ func TestBandwidthLimiting(t *testing.T) {
}
reader := bytes.NewReader(data)
wrappedReader := WrapReader(reader)
-
+
// Read all data and measure time
start := time.Now()
result := make([]byte, 2048)
@@ -108,18 +108,18 @@ func TestBandwidthLimiting(t *testing.T) {
}
}
elapsed := time.Since(start)
-
+
// With 1 KB/s limit, reading 2KB should take around 2 seconds
// Allow some tolerance for test execution overhead
if elapsed < 1*time.Second {
t.Logf("Warning: Reading 2KB with 1KB/s limit took only %v (might be test environment issue)", elapsed)
}
-
+
// Verify data integrity
if !bytes.Equal(data, result[:totalRead]) {
t.Error("Data corruption during bandwidth-limited read")
}
-
+
// Reset to no limit
SetBandwidth(0)
}
@@ -127,10 +127,10 @@ func TestBandwidthLimiting(t *testing.T) {
func TestConcurrentAccess(t *testing.T) {
// Test concurrent access to bandwidth-limited readers/writers
SetBandwidth(10) // 10 KB/s
-
+
// Create multiple readers and writers concurrently
done := make(chan bool, 4)
-
+
// Reader 1
go func() {
reader := WrapReader(bytes.NewReader([]byte("reader1 data")))
@@ -138,7 +138,7 @@ func TestConcurrentAccess(t *testing.T) {
_, _ = reader.Read(data)
done <- true
}()
-
+
// Reader 2
go func() {
reader := WrapReader(bytes.NewReader([]byte("reader2 data")))
@@ -146,7 +146,7 @@ func TestConcurrentAccess(t *testing.T) {
_, _ = reader.Read(data)
done <- true
}()
-
+
// Writer 1
go func() {
var buf bytes.Buffer
@@ -154,7 +154,7 @@ func TestConcurrentAccess(t *testing.T) {
_, _ = writer.Write([]byte("writer1 data"))
done <- true
}()
-
+
// Writer 2
go func() {
var buf bytes.Buffer
@@ -162,7 +162,7 @@ func TestConcurrentAccess(t *testing.T) {
_, _ = writer.Write([]byte("writer2 data"))
done <- true
}()
-
+
// Wait for all operations to complete
for i := 0; i < 4; i++ {
select {
@@ -172,7 +172,7 @@ func TestConcurrentAccess(t *testing.T) {
t.Fatal("Timeout waiting for concurrent operations")
}
}
-
+
// Reset to no limit
SetBandwidth(0)
-}
\ No newline at end of file
+}
diff --git a/essentials/network/nw_bandwidth/doc.go b/essentials/network/nw_bandwidth/doc.go
new file mode 100644
index 000000000..8e94ce0b3
--- /dev/null
+++ b/essentials/network/nw_bandwidth/doc.go
@@ -0,0 +1,2 @@
+// Package nw_bandwidth provides functionalities for controlling network bandwidth.
+package nw_bandwidth
diff --git a/essentials/network/nw_capture/doc.go b/essentials/network/nw_capture/doc.go
new file mode 100644
index 000000000..0332e359f
--- /dev/null
+++ b/essentials/network/nw_capture/doc.go
@@ -0,0 +1,2 @@
+// Package nw_capture provides a mechanism for capturing and logging network request and response details.
+package nw_capture
diff --git a/essentials/network/nw_client/doc.go b/essentials/network/nw_client/doc.go
new file mode 100644
index 000000000..c5bdc083a
--- /dev/null
+++ b/essentials/network/nw_client/doc.go
@@ -0,0 +1,2 @@
+// Package nw_client defines interfaces for REST and HTTP clients.
+package nw_client
diff --git a/essentials/network/nw_congestion/congestion.go b/essentials/network/nw_congestion/congestion.go
index 4d29bb1e3..cc1c68938 100644
--- a/essentials/network/nw_congestion/congestion.go
+++ b/essentials/network/nw_congestion/congestion.go
@@ -2,7 +2,7 @@ package nw_congestion
import (
"container/list"
- "github.com/watermint/toolbox/essentials/go/es_goroutine"
+ "github.com/watermint/toolbox/essentials/es_go/es_goroutine"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/infra/control/app_definitions"
"runtime"
diff --git a/essentials/network/nw_congestion/doc.go b/essentials/network/nw_congestion/doc.go
new file mode 100644
index 000000000..0ba6b629b
--- /dev/null
+++ b/essentials/network/nw_congestion/doc.go
@@ -0,0 +1,2 @@
+// Package nw_congestion provides a congestion control mechanism for network operations.
+package nw_congestion
diff --git a/essentials/network/nw_congestion/simple_test.go b/essentials/network/nw_congestion/simple_test.go
index e005f7d8f..ad4fb622b 100644
--- a/essentials/network/nw_congestion/simple_test.go
+++ b/essentials/network/nw_congestion/simple_test.go
@@ -18,30 +18,30 @@ func TestWindowSettings(t *testing.T) {
// Save original values
origMax := maxCongestionWindow
origInit := initCongestionWindow
-
+
// Test SetMaxCongestionWindow with hard limit
SetMaxCongestionWindow(20, false)
if CurrentMaxCongestionWindow() != hardLimitCongestionWindow {
t.Errorf("Expected max window to be limited to %d, got %d", hardLimitCongestionWindow, CurrentMaxCongestionWindow())
}
-
+
// Test SetMaxCongestionWindow ignoring hard limit
SetMaxCongestionWindow(20, true)
if CurrentMaxCongestionWindow() != 20 {
t.Errorf("Expected max window to be 20, got %d", CurrentMaxCongestionWindow())
}
-
+
// Test SetInitCongestionWindow
SetInitCongestionWindow(2)
if CurrentInitCongestionWindow() != 2 {
t.Errorf("Expected init window to be 2, got %d", CurrentInitCongestionWindow())
}
-
+
// Test CurrentMinCongestionWindow
if CurrentMinCongestionWindow() != minCongestionWindow {
t.Errorf("Expected min window to be %d, got %d", minCongestionWindow, CurrentMinCongestionWindow())
}
-
+
// Restore original values
maxCongestionWindow = origMax
initCongestionWindow = origInit
@@ -58,26 +58,26 @@ func TestCcImpl_Key(t *testing.T) {
func TestBasicFlow(t *testing.T) {
// Save original value
origMax := maxCongestionWindow
-
+
// Set a reasonable window for testing
SetMaxCongestionWindow(4, true)
-
+
cc := NewControl()
hash := "test-hash"
endpoint := "test-endpoint"
-
+
// Test basic flow: Start -> EndSuccess
cc.Start(hash, endpoint)
cc.EndSuccess(hash, endpoint)
-
+
// Test basic flow: Start -> EndTransportError
cc.Start(hash, endpoint)
cc.EndTransportError(hash, endpoint)
-
+
// Test basic flow: Start -> EndRateLimit
cc.Start(hash, endpoint)
cc.EndRateLimit(hash, endpoint, time.Now().Add(5*time.Second))
-
+
// Restore original value
maxCongestionWindow = origMax
}
@@ -85,12 +85,12 @@ func TestBasicFlow(t *testing.T) {
func TestConcurrentOperations(t *testing.T) {
// Save original value
origMax := maxCongestionWindow
-
+
// Set a small window to test concurrency control
SetMaxCongestionWindow(2, true)
-
+
cc := NewControl()
-
+
// Run concurrent operations
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
@@ -99,10 +99,10 @@ func TestConcurrentOperations(t *testing.T) {
defer wg.Done()
hash := "hash"
endpoint := "endpoint"
-
+
cc.Start(hash, endpoint)
time.Sleep(50 * time.Millisecond)
-
+
// Mix different end conditions
switch i % 3 {
case 0:
@@ -115,7 +115,7 @@ func TestConcurrentOperations(t *testing.T) {
}(i)
}
wg.Wait()
-
+
// Restore original value
maxCongestionWindow = origMax
}
@@ -123,27 +123,27 @@ func TestConcurrentOperations(t *testing.T) {
func TestPackageLevelFunctions(t *testing.T) {
hash := "test-hash"
endpoint := "test-endpoint"
-
+
// These should not panic
Start(hash, endpoint)
EndSuccess(hash, endpoint)
-
+
Start(hash, endpoint)
EndTransportError(hash, endpoint)
-
+
Start(hash, endpoint)
EndRateLimit(hash, endpoint, time.Now().Add(1*time.Minute))
}
func TestSignificantWait(t *testing.T) {
cc := NewControl().(*ccImpl)
-
+
// Test wait time less than threshold
notSignificant := time.Now().Add(30 * time.Second)
if cc.isSignificantWait(notSignificant) {
t.Error("Expected wait to not be significant")
}
-
+
// Test wait time more than threshold
significant := time.Now().Add(2 * time.Minute)
if !cc.isSignificantWait(significant) {
@@ -154,22 +154,22 @@ func TestSignificantWait(t *testing.T) {
func TestRateLimitWithSignificantWait(t *testing.T) {
// Save original values
origMax := maxCongestionWindow
-
+
// Set window for testing
SetMaxCongestionWindow(4, true)
-
+
cc := NewControl()
hash := "test-hash"
endpoint := "test-endpoint"
-
+
// Test with significant wait (should set window to minimum)
cc.Start(hash, endpoint)
cc.EndRateLimit(hash, endpoint, time.Now().Add(2*time.Minute))
-
+
// Test with non-significant wait (should decrease window)
cc.Start(hash, endpoint)
cc.EndRateLimit(hash, endpoint, time.Now().Add(30*time.Second))
-
+
// Restore original value
maxCongestionWindow = origMax
}
@@ -177,15 +177,15 @@ func TestRateLimitWithSignificantWait(t *testing.T) {
func TestMonitorGoroutine(t *testing.T) {
// Create a new control that will start monitor
cc := NewControl()
-
+
// Trigger monitor start by calling Start
cc.Start("test", "test")
-
+
// Give monitor time to start
time.Sleep(100 * time.Millisecond)
-
+
// Clean up by ending the operation
cc.EndSuccess("test", "test")
-
+
// The monitor goroutine will continue running, but that's expected
-}
\ No newline at end of file
+}
diff --git a/essentials/network/nw_diag/doc.go b/essentials/network/nw_diag/doc.go
new file mode 100644
index 000000000..5f2a8fdd7
--- /dev/null
+++ b/essentials/network/nw_diag/doc.go
@@ -0,0 +1,2 @@
+// Package nw_diag provides diagnostic functionalities for network and runtime environments.
+package nw_diag
diff --git a/essentials/network/nw_http/doc.go b/essentials/network/nw_http/doc.go
new file mode 100644
index 000000000..75072a070
--- /dev/null
+++ b/essentials/network/nw_http/doc.go
@@ -0,0 +1,2 @@
+// Package nw_http provides an HTTP client implementation with network throttling and a mock client.
+package nw_http
diff --git a/essentials/network/nw_http/http.go b/essentials/network/nw_http/http.go
index 34695f7f0..3d8b96d1e 100644
--- a/essentials/network/nw_http/http.go
+++ b/essentials/network/nw_http/http.go
@@ -1,7 +1,7 @@
package nw_http
import (
- "github.com/watermint/toolbox/essentials/go/es_goroutine"
+ "github.com/watermint/toolbox/essentials/es_go/es_goroutine"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/network/nw_client"
"github.com/watermint/toolbox/essentials/network/nw_throttle"
diff --git a/essentials/network/nw_proxy/doc.go b/essentials/network/nw_proxy/doc.go
new file mode 100644
index 000000000..a157b9d0e
--- /dev/null
+++ b/essentials/network/nw_proxy/doc.go
@@ -0,0 +1,2 @@
+// Package nw_proxy provides functionalities for configuring and testing HTTP proxy settings.
+package nw_proxy
diff --git a/essentials/network/nw_ratelimit/doc.go b/essentials/network/nw_ratelimit/doc.go
new file mode 100644
index 000000000..f7e2858a8
--- /dev/null
+++ b/essentials/network/nw_ratelimit/doc.go
@@ -0,0 +1,2 @@
+// Package nw_ratelimit provides a rate limiting mechanism for network requests.
+package nw_ratelimit
diff --git a/essentials/network/nw_ratelimit/ratelimit.go b/essentials/network/nw_ratelimit/ratelimit.go
index 5736ab7c2..e5fb48a9a 100644
--- a/essentials/network/nw_ratelimit/ratelimit.go
+++ b/essentials/network/nw_ratelimit/ratelimit.go
@@ -1,7 +1,7 @@
package nw_ratelimit
import (
- "github.com/watermint/toolbox/essentials/go/es_goroutine"
+ "github.com/watermint/toolbox/essentials/es_go/es_goroutine"
"github.com/watermint/toolbox/essentials/log/esl"
"sync"
"time"
diff --git a/essentials/network/nw_replay/doc.go b/essentials/network/nw_replay/doc.go
new file mode 100644
index 000000000..6fcb32754
--- /dev/null
+++ b/essentials/network/nw_replay/doc.go
@@ -0,0 +1,2 @@
+// Package nw_replay provides functionalities for replaying network responses.
+package nw_replay
diff --git a/essentials/network/nw_request/doc.go b/essentials/network/nw_request/doc.go
new file mode 100644
index 000000000..d6a4dcdf6
--- /dev/null
+++ b/essentials/network/nw_request/doc.go
@@ -0,0 +1,2 @@
+// Package nw_request defines a structure for representing network requests.
+package nw_request
diff --git a/essentials/network/nw_rest_factory/doc.go b/essentials/network/nw_rest_factory/doc.go
new file mode 100644
index 000000000..4c9637f0c
--- /dev/null
+++ b/essentials/network/nw_rest_factory/doc.go
@@ -0,0 +1,2 @@
+// Package nw_rest_factory provides a factory for creating REST clients with various configurable layers.
+package nw_rest_factory
diff --git a/essentials/network/nw_retry/doc.go b/essentials/network/nw_retry/doc.go
new file mode 100644
index 000000000..4969afd11
--- /dev/null
+++ b/essentials/network/nw_retry/doc.go
@@ -0,0 +1,2 @@
+// Package nw_retry provides a retry mechanism for network requests.
+package nw_retry
diff --git a/essentials/network/nw_retry/retry.go b/essentials/network/nw_retry/retry.go
index e1d93ff30..5cdecebc8 100644
--- a/essentials/network/nw_retry/retry.go
+++ b/essentials/network/nw_retry/retry.go
@@ -2,7 +2,7 @@ package nw_retry
import (
"github.com/watermint/toolbox/essentials/api/api_client"
- "github.com/watermint/toolbox/essentials/go/es_goroutine"
+ "github.com/watermint/toolbox/essentials/es_go/es_goroutine"
"github.com/watermint/toolbox/essentials/http/es_response"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/network/nw_client"
diff --git a/essentials/network/nw_simulator/doc.go b/essentials/network/nw_simulator/doc.go
new file mode 100644
index 000000000..ea4883f69
--- /dev/null
+++ b/essentials/network/nw_simulator/doc.go
@@ -0,0 +1,2 @@
+// Package nw_simulator provides functionalities for simulating network conditions.
+package nw_simulator
diff --git a/essentials/network/nw_throttle/doc.go b/essentials/network/nw_throttle/doc.go
new file mode 100644
index 000000000..21b4cea61
--- /dev/null
+++ b/essentials/network/nw_throttle/doc.go
@@ -0,0 +1,2 @@
+// Package nw_throttle provides a simple throttling mechanism.
+package nw_throttle
diff --git a/essentials/nlp/doc.go b/essentials/nlp/doc.go
new file mode 100644
index 000000000..5b593d665
--- /dev/null
+++ b/essentials/nlp/doc.go
@@ -0,0 +1,2 @@
+// Package nlp provides essential functionalities for natural language processing.
+package nlp
diff --git a/essentials/nlp/el_en/doc.go b/essentials/nlp/el_en/doc.go
new file mode 100644
index 000000000..43457e5a5
--- /dev/null
+++ b/essentials/nlp/el_en/doc.go
@@ -0,0 +1,2 @@
+// Package el_en provides a container for English natural language processing (NLP) using the `prose` library.
+package el_en
diff --git a/essentials/nlp/el_ja/doc.go b/essentials/nlp/el_ja/doc.go
new file mode 100644
index 000000000..1aedded5c
--- /dev/null
+++ b/essentials/nlp/el_ja/doc.go
@@ -0,0 +1,2 @@
+// Package el_ja provides a container for Japanese natural language processing (NLP) using the Kagome tokenizer.
+package el_ja
diff --git a/essentials/nlp/el_text/doc.go b/essentials/nlp/el_text/doc.go
new file mode 100644
index 000000000..b46383c6a
--- /dev/null
+++ b/essentials/nlp/el_text/doc.go
@@ -0,0 +1,2 @@
+// Package el_text provides a function for preprocessing text by ignoring line breaks.
+package el_text
diff --git a/essentials/queue/doc.go b/essentials/queue/doc.go
new file mode 100644
index 000000000..d9ad84c7a
--- /dev/null
+++ b/essentials/queue/doc.go
@@ -0,0 +1,2 @@
+// Package queue provides essential functionalities for queueing and task processing.
+package queue
diff --git a/essentials/queue/eq_bundle/doc.go b/essentials/queue/eq_bundle/doc.go
new file mode 100644
index 000000000..44365dc26
--- /dev/null
+++ b/essentials/queue/eq_bundle/doc.go
@@ -0,0 +1,2 @@
+// Package eq_bundle provides implementations for managing task bundles in a queueing system.
+package eq_bundle
diff --git a/essentials/queue/eq_mould/doc.go b/essentials/queue/eq_mould/doc.go
new file mode 100644
index 000000000..cd92d4e01
--- /dev/null
+++ b/essentials/queue/eq_mould/doc.go
@@ -0,0 +1,2 @@
+// Package eq_mould defines a "mould" for processing data in a queueing system.
+package eq_mould
diff --git a/essentials/queue/eq_pipe/doc.go b/essentials/queue/eq_pipe/doc.go
new file mode 100644
index 000000000..4dff8189d
--- /dev/null
+++ b/essentials/queue/eq_pipe/doc.go
@@ -0,0 +1,2 @@
+// Package eq_pipe defines interfaces for a queueing pipe and its factory, along with a simple in-memory implementation.
+package eq_pipe
diff --git a/essentials/queue/eq_pipe_preserve/doc.go b/essentials/queue/eq_pipe_preserve/doc.go
new file mode 100644
index 000000000..b8609c9e6
--- /dev/null
+++ b/essentials/queue/eq_pipe_preserve/doc.go
@@ -0,0 +1,2 @@
+// Package eq_pipe_preserve provides interfaces and implementations for preserving and restoring pipe data.
+package eq_pipe_preserve
diff --git a/essentials/queue/eq_progress/doc.go b/essentials/queue/eq_progress/doc.go
new file mode 100644
index 000000000..1429fe3f4
--- /dev/null
+++ b/essentials/queue/eq_progress/doc.go
@@ -0,0 +1,2 @@
+// Package eq_progress provides a progress reporting mechanism for queue processing.
+package eq_progress
diff --git a/essentials/queue/eq_pump/doc.go b/essentials/queue/eq_pump/doc.go
new file mode 100644
index 000000000..11b7c9c73
--- /dev/null
+++ b/essentials/queue/eq_pump/doc.go
@@ -0,0 +1,2 @@
+// Package eq_pump provides a "pump" mechanism for a queueing system.
+package eq_pump
diff --git a/essentials/queue/eq_pump/pump.go b/essentials/queue/eq_pump/pump.go
index 699d7a45e..bf34632f4 100644
--- a/essentials/queue/eq_pump/pump.go
+++ b/essentials/queue/eq_pump/pump.go
@@ -1,7 +1,7 @@
package eq_pump
import (
- "github.com/watermint/toolbox/essentials/go/es_goroutine"
+ "github.com/watermint/toolbox/essentials/es_go/es_goroutine"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/queue/eq_bundle"
"sync"
diff --git a/essentials/queue/eq_queue/doc.go b/essentials/queue/eq_queue/doc.go
new file mode 100644
index 000000000..32ac3636d
--- /dev/null
+++ b/essentials/queue/eq_queue/doc.go
@@ -0,0 +1,2 @@
+// Package eq_queue provides a flexible and extensible queueing system.
+package eq_queue
diff --git a/essentials/queue/eq_registry/doc.go b/essentials/queue/eq_registry/doc.go
new file mode 100644
index 000000000..bc432d3c8
--- /dev/null
+++ b/essentials/queue/eq_registry/doc.go
@@ -0,0 +1,2 @@
+// Package eq_registry provides a registry for "moulds" (task processors) in a queueing system.
+package eq_registry
diff --git a/essentials/queue/eq_sequence/doc.go b/essentials/queue/eq_sequence/doc.go
new file mode 100644
index 000000000..55b31f770
--- /dev/null
+++ b/essentials/queue/eq_sequence/doc.go
@@ -0,0 +1,2 @@
+// Package eq_sequence provides a mechanism for defining and executing sequences of queue processing stages.
+package eq_sequence
diff --git a/essentials/queue/eq_stat/doc.go b/essentials/queue/eq_stat/doc.go
new file mode 100644
index 000000000..4d3a9235f
--- /dev/null
+++ b/essentials/queue/eq_stat/doc.go
@@ -0,0 +1,2 @@
+// Package eq_stat provides a simple statistics tracking mechanism for queue processing.
+package eq_stat
diff --git a/essentials/queue/eq_worker/doc.go b/essentials/queue/eq_worker/doc.go
new file mode 100644
index 000000000..0c708417e
--- /dev/null
+++ b/essentials/queue/eq_worker/doc.go
@@ -0,0 +1,2 @@
+// Package eq_worker provides a worker pool implementation for processing tasks from a queue.
+package eq_worker
diff --git a/essentials/queue/eq_worker/worker.go b/essentials/queue/eq_worker/worker.go
index bae9494db..5bd1566b0 100644
--- a/essentials/queue/eq_worker/worker.go
+++ b/essentials/queue/eq_worker/worker.go
@@ -1,7 +1,7 @@
package eq_worker
import (
- "github.com/watermint/toolbox/essentials/go/es_goroutine"
+ "github.com/watermint/toolbox/essentials/es_go/es_goroutine"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/queue/eq_bundle"
"github.com/watermint/toolbox/essentials/queue/eq_registry"
diff --git a/essentials/runtime/doc.go b/essentials/runtime/doc.go
new file mode 100644
index 000000000..dc9f2e975
--- /dev/null
+++ b/essentials/runtime/doc.go
@@ -0,0 +1,2 @@
+// Package runtime provides essential functionalities for runtime environment interactions.
+package runtime
diff --git a/essentials/runtime/es_env/doc.go b/essentials/runtime/es_env/doc.go
new file mode 100644
index 000000000..87a1da415
--- /dev/null
+++ b/essentials/runtime/es_env/doc.go
@@ -0,0 +1,2 @@
+// Package es_env provides a utility function to check if a feature is enabled based on an environment variable.
+package es_env
diff --git a/essentials/runtime/es_open/doc.go b/essentials/runtime/es_open/doc.go
new file mode 100644
index 000000000..bc472889d
--- /dev/null
+++ b/essentials/runtime/es_open/doc.go
@@ -0,0 +1,2 @@
+// Package es_open provides an interface for opening files, folders, or URIs using the operating system's default application.
+package es_open
diff --git a/essentials/security/doc.go b/essentials/security/doc.go
new file mode 100644
index 000000000..d23aafec6
--- /dev/null
+++ b/essentials/security/doc.go
@@ -0,0 +1,2 @@
+// Package security provides essential functionalities for security-related operations.
+package security
diff --git a/essentials/security/es_cert/doc.go b/essentials/security/es_cert/doc.go
new file mode 100644
index 000000000..acc0a04a0
--- /dev/null
+++ b/essentials/security/es_cert/doc.go
@@ -0,0 +1,2 @@
+// Package es_cert provides a function to create self-signed SSL/TLS certificates and private keys.
+package es_cert
diff --git a/essentials/strings/doc.go b/essentials/strings/doc.go
new file mode 100644
index 000000000..b91b15099
--- /dev/null
+++ b/essentials/strings/doc.go
@@ -0,0 +1,2 @@
+// Package strings provides essential functionalities for string manipulation.
+package strings
diff --git a/essentials/strings/es_case/doc.go b/essentials/strings/es_case/doc.go
new file mode 100644
index 000000000..81897ec2a
--- /dev/null
+++ b/essentials/strings/es_case/doc.go
@@ -0,0 +1,2 @@
+// Package es_case provides utility functions for converting strings between various casing conventions.
+package es_case
diff --git a/essentials/strings/es_hex/doc.go b/essentials/strings/es_hex/doc.go
new file mode 100644
index 000000000..7ae7f649e
--- /dev/null
+++ b/essentials/strings/es_hex/doc.go
@@ -0,0 +1,2 @@
+// Package es_hex provides utility functions for converting byte slices to hexadecimal strings and parsing hexadecimal strings.
+package es_hex
diff --git a/essentials/strings/es_hex/parse_hex.go b/essentials/strings/es_hex/parse_hex.go
index 3c463529c..160871438 100644
--- a/essentials/strings/es_hex/parse_hex.go
+++ b/essentials/strings/es_hex/parse_hex.go
@@ -1,7 +1,7 @@
package es_hex
import (
- "github.com/watermint/toolbox/essentials/go/es_errors"
+ "github.com/watermint/toolbox/essentials/es_go/es_errors"
)
func Parse(hex string) ([]byte, error) {
diff --git a/essentials/strings/es_hex/parse_hex_test.go b/essentials/strings/es_hex/parse_hex_test.go
index 20f127da2..90aab2bc5 100644
--- a/essentials/strings/es_hex/parse_hex_test.go
+++ b/essentials/strings/es_hex/parse_hex_test.go
@@ -4,7 +4,7 @@ import (
"reflect"
"testing"
- "github.com/watermint/toolbox/essentials/go/es_errors"
+ "github.com/watermint/toolbox/essentials/es_go/es_errors"
)
func TestParse(t *testing.T) {
diff --git a/essentials/strings/es_mailaddr/doc.go b/essentials/strings/es_mailaddr/doc.go
new file mode 100644
index 000000000..ad0a2b8ae
--- /dev/null
+++ b/essentials/strings/es_mailaddr/doc.go
@@ -0,0 +1,2 @@
+// Package es_mailaddr provides utility functions for email addresses.
+package es_mailaddr
diff --git a/essentials/strings/es_regexp/doc.go b/essentials/strings/es_regexp/doc.go
new file mode 100644
index 000000000..3788e5197
--- /dev/null
+++ b/essentials/strings/es_regexp/doc.go
@@ -0,0 +1,2 @@
+// Package es_regexp provides a wrapper around Go's `regexp` package.
+package es_regexp
diff --git a/essentials/strings/es_tokenizer/doc.go b/essentials/strings/es_tokenizer/doc.go
new file mode 100644
index 000000000..6880dddab
--- /dev/null
+++ b/essentials/strings/es_tokenizer/doc.go
@@ -0,0 +1,2 @@
+// Package es_tokenizer provides a tokenizer that splits strings into alphanumeric tokens.
+package es_tokenizer
diff --git a/essentials/strings/es_uuid/doc.go b/essentials/strings/es_uuid/doc.go
new file mode 100644
index 000000000..4b20eb26c
--- /dev/null
+++ b/essentials/strings/es_uuid/doc.go
@@ -0,0 +1,2 @@
+// Package es_uuid provides functionalities for generating and parsing UUIDs.
+package es_uuid
diff --git a/essentials/strings/es_uuid/uuid.go b/essentials/strings/es_uuid/uuid.go
index 0a84a58fb..5a081a1ae 100644
--- a/essentials/strings/es_uuid/uuid.go
+++ b/essentials/strings/es_uuid/uuid.go
@@ -4,7 +4,7 @@ import (
"fmt"
"regexp"
- "github.com/watermint/toolbox/essentials/go/es_errors"
+ "github.com/watermint/toolbox/essentials/es_go/es_errors"
"github.com/watermint/toolbox/essentials/strings/es_hex"
)
diff --git a/essentials/strings/es_uuid/uuid_impl.go b/essentials/strings/es_uuid/uuid_impl.go
index 176304464..e4409a44f 100644
--- a/essentials/strings/es_uuid/uuid_impl.go
+++ b/essentials/strings/es_uuid/uuid_impl.go
@@ -1,7 +1,7 @@
package es_uuid
import (
- "github.com/watermint/toolbox/essentials/go/es_errors"
+ "github.com/watermint/toolbox/essentials/es_go/es_errors"
"github.com/watermint/toolbox/essentials/strings/es_hex"
)
diff --git a/essentials/strings/es_uuid/uuid_test.go b/essentials/strings/es_uuid/uuid_test.go
index 99c6b7dfa..00fdd0b4c 100644
--- a/essentials/strings/es_uuid/uuid_test.go
+++ b/essentials/strings/es_uuid/uuid_test.go
@@ -4,7 +4,7 @@ import (
"testing"
"time"
- "github.com/watermint/toolbox/essentials/go/es_errors"
+ "github.com/watermint/toolbox/essentials/es_go/es_errors"
)
func TestNewV4(t *testing.T) {
diff --git a/essentials/strings/es_version/doc.go b/essentials/strings/es_version/doc.go
new file mode 100644
index 000000000..db36c2c13
--- /dev/null
+++ b/essentials/strings/es_version/doc.go
@@ -0,0 +1,2 @@
+// Package es_version provides a Version struct and functions for parsing, comparing, and manipulating semantic version numbers.
+package es_version
diff --git a/essentials/strings/es_width/doc.go b/essentials/strings/es_width/doc.go
new file mode 100644
index 000000000..3b1363786
--- /dev/null
+++ b/essentials/strings/es_width/doc.go
@@ -0,0 +1,2 @@
+// Package es_width provides a function to calculate the display width of a string.
+package es_width
diff --git a/essentials/terminal/doc.go b/essentials/terminal/doc.go
new file mode 100644
index 000000000..d9683f656
--- /dev/null
+++ b/essentials/terminal/doc.go
@@ -0,0 +1,2 @@
+// Package terminal provides essential functionalities for terminal interactions.
+package terminal
diff --git a/essentials/terminal/es_color/doc.go b/essentials/terminal/es_color/doc.go
new file mode 100644
index 000000000..fe27e1e08
--- /dev/null
+++ b/essentials/terminal/es_color/doc.go
@@ -0,0 +1,2 @@
+// Package es_color provides functions for printing colored and bold text to a terminal.
+package es_color
diff --git a/essentials/terminal/es_demo/doc.go b/essentials/terminal/es_demo/doc.go
new file mode 100644
index 000000000..1a522bcbd
--- /dev/null
+++ b/essentials/terminal/es_demo/doc.go
@@ -0,0 +1,2 @@
+// Package es_demo provides a terminal emulator that can render text as an image.
+package es_demo
diff --git a/essentials/terminal/es_dialogue/doc.go b/essentials/terminal/es_dialogue/doc.go
new file mode 100644
index 000000000..69d111145
--- /dev/null
+++ b/essentials/terminal/es_dialogue/doc.go
@@ -0,0 +1,2 @@
+// Package es_dialogue provides an interface for interactive terminal dialogues.
+package es_dialogue
diff --git a/essentials/terminal/es_terminfo/doc.go b/essentials/terminal/es_terminfo/doc.go
new file mode 100644
index 000000000..16faface8
--- /dev/null
+++ b/essentials/terminal/es_terminfo/doc.go
@@ -0,0 +1,2 @@
+// Package es_terminfo provides utility functions for querying terminal capabilities.
+package es_terminfo
diff --git a/essentials/terminal/es_window/doc.go b/essentials/terminal/es_window/doc.go
new file mode 100644
index 000000000..fad9209c5
--- /dev/null
+++ b/essentials/terminal/es_window/doc.go
@@ -0,0 +1,2 @@
+// Package es_window provides a function to hide the console window on Windows.
+package es_window
diff --git a/essentials/text/doc.go b/essentials/text/doc.go
new file mode 100644
index 000000000..4b0f13c65
--- /dev/null
+++ b/essentials/text/doc.go
@@ -0,0 +1,2 @@
+// Package text provides essential functionalities for text processing.
+package text
diff --git a/essentials/text/es_encoding/doc.go b/essentials/text/es_encoding/doc.go
new file mode 100644
index 000000000..c09b079eb
--- /dev/null
+++ b/essentials/text/es_encoding/doc.go
@@ -0,0 +1,2 @@
+// Package es_encoding provides a function to select a text encoding instance from a given encoding name.
+package es_encoding
diff --git a/essentials/text/es_escape/doc.go b/essentials/text/es_escape/doc.go
new file mode 100644
index 000000000..c0928f73c
--- /dev/null
+++ b/essentials/text/es_escape/doc.go
@@ -0,0 +1,2 @@
+// Package es_escape provides a function to replace non-alphanumeric characters in a string.
+package es_escape
diff --git a/essentials/text/es_sort/doc.go b/essentials/text/es_sort/doc.go
new file mode 100644
index 000000000..207707ae2
--- /dev/null
+++ b/essentials/text/es_sort/doc.go
@@ -0,0 +1,2 @@
+// Package es_sort provides a sorter for large text data.
+package es_sort
diff --git a/essentials/time/doc.go b/essentials/time/doc.go
new file mode 100644
index 000000000..4dde6c4ff
--- /dev/null
+++ b/essentials/time/doc.go
@@ -0,0 +1,2 @@
+// Package time provides essential functionalities for time manipulation and formatting.
+package time
diff --git a/essentials/time/ut_compare/compare_additional_test.go b/essentials/time/ut_compare/compare_additional_test.go
index aac6b79d8..ea9f4f6fe 100644
--- a/essentials/time/ut_compare/compare_additional_test.go
+++ b/essentials/time/ut_compare/compare_additional_test.go
@@ -1,16 +1,16 @@
package ut_compare
import (
+ "github.com/watermint/toolbox/domain/dropbox/model/mo_time"
"testing"
"time"
- "github.com/watermint/toolbox/domain/dropbox/model/mo_time"
)
func TestClone(t *testing.T) {
// Test with various time values
now := time.Now()
loc, _ := time.LoadLocation("America/New_York")
-
+
tests := []struct {
name string
time time.Time
@@ -22,21 +22,21 @@ func TestClone(t *testing.T) {
{"unix epoch", time.Unix(0, 0)},
{"with nanoseconds", time.Date(2023, 1, 1, 0, 0, 0, 999999999, time.UTC)},
}
-
+
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
cloned := Clone(tt.time)
-
+
// Verify all fields are equal
if !cloned.Equal(tt.time) {
t.Errorf("Clone() time not equal: got %v, want %v", cloned, tt.time)
}
-
+
// Verify it's a different instance (pointer comparison)
if &cloned == &tt.time {
t.Error("Clone() returned same instance")
}
-
+
// Verify all components match
if cloned.Year() != tt.time.Year() ||
cloned.Month() != tt.time.Month() ||
@@ -59,24 +59,24 @@ func TestClonePtr(t *testing.T) {
if cloned != nil {
t.Error("ClonePtr(nil) should return nil")
}
-
+
// Test with non-nil time
now := time.Now()
cloned = ClonePtr(&now)
-
+
if cloned == nil {
t.Fatal("ClonePtr() returned nil for non-nil input")
}
-
+
if !cloned.Equal(now) {
t.Errorf("ClonePtr() time not equal: got %v, want %v", *cloned, now)
}
-
+
// Verify it's a different pointer
if cloned == &now {
t.Error("ClonePtr() returned same pointer")
}
-
+
// Test with zero time
zeroTime := time.Time{}
clonedZero := ClonePtr(&zeroTime)
@@ -95,7 +95,7 @@ func TestEarliest_EdgeCases(t *testing.T) {
if !result.Equal(single) {
t.Error("Earliest() with single element should return that element")
}
-
+
// Test all elements are the same
same := time.Now()
result = Earliest(same, same, same)
@@ -111,7 +111,7 @@ func TestLatest_EdgeCases(t *testing.T) {
if !result.Equal(single) {
t.Error("Latest() with single element should return that element")
}
-
+
// Test all elements are the same
same := time.Now()
result = Latest(same, same, same)
@@ -124,21 +124,21 @@ func TestIsBetweenOptional_AllZero(t *testing.T) {
// Test the case where both a and b are zero
now := time.Now()
zeroOpt := mo_time.NewOptional(time.Time{})
-
+
// When both are zero, should always return true
if !IsBetweenOptional(now, zeroOpt, zeroOpt) {
t.Error("IsBetweenOptional() should return true when both bounds are zero")
}
-
+
// Test with different time values when both bounds are zero
future := now.Add(100 * time.Hour)
past := now.Add(-100 * time.Hour)
-
+
if !IsBetweenOptional(future, zeroOpt, zeroOpt) {
t.Error("IsBetweenOptional() should return true for any time when both bounds are zero")
}
-
+
if !IsBetweenOptional(past, zeroOpt, zeroOpt) {
t.Error("IsBetweenOptional() should return true for any time when both bounds are zero")
}
-}
\ No newline at end of file
+}
diff --git a/essentials/time/ut_compare/doc.go b/essentials/time/ut_compare/doc.go
new file mode 100644
index 000000000..b91ba8a91
--- /dev/null
+++ b/essentials/time/ut_compare/doc.go
@@ -0,0 +1,2 @@
+// Package ut_compare provides utility functions for comparing and manipulating `time.Time` values.
+package ut_compare
diff --git a/essentials/time/ut_format/doc.go b/essentials/time/ut_format/doc.go
new file mode 100644
index 000000000..aac1bb43f
--- /dev/null
+++ b/essentials/time/ut_format/doc.go
@@ -0,0 +1,2 @@
+// Package ut_format provides utility functions for parsing various timestamp formats from strings and generating daily time ranges.
+package ut_format
diff --git a/go.mod b/go.mod
index 40b824b0a..2662b7294 100644
--- a/go.mod
+++ b/go.mod
@@ -1,25 +1,25 @@
module github.com/watermint/toolbox
-go 1.24
+go 1.24.0
-toolchain go1.24.1
+toolchain go1.24.6
require (
git.mills.io/prologic/bitcask v1.0.2
- github.com/boombuler/barcode v1.0.2
- github.com/dgraph-io/badger/v4 v4.7.0
+ github.com/boombuler/barcode v1.1.0
+ github.com/dgraph-io/badger/v4 v4.8.0
github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203
github.com/gin-gonic/gin v1.10.1
github.com/go-git/go-git/v5 v5.16.2
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
- github.com/gomarkdown/markdown v0.0.0-20250311123330-531bef5e742b
+ github.com/gomarkdown/markdown v0.0.0-20250810172220-2e2c11897d1a
github.com/google/go-cmp v0.7.0
github.com/google/go-querystring v1.1.0
github.com/ikawaha/kagome-dict v1.1.6
github.com/ikawaha/kagome/v2 v2.10.2
github.com/itchyny/gojq v0.12.17
github.com/mattn/go-colorable v0.1.14
- github.com/mattn/go-sqlite3 v1.14.28
+ github.com/mattn/go-sqlite3 v1.14.32
github.com/mmcdole/gofeed v1.3.0
github.com/montanaflynn/stats v0.7.1
github.com/oklog/ulid/v2 v2.1.1
@@ -36,15 +36,15 @@ require (
github.com/watermint/prose/v3 v3.0.1
go.uber.org/atomic v1.11.0
go.uber.org/zap v1.27.0
- golang.org/x/crypto v0.39.0
- golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476
- golang.org/x/image v0.28.0
+ golang.org/x/crypto v0.41.0
+ golang.org/x/exp v0.0.0-20250813145105-42675adae3e6
+ golang.org/x/image v0.30.0
golang.org/x/oauth2 v0.30.0
- golang.org/x/sync v0.15.0
- golang.org/x/text v0.26.0
- golang.org/x/tools v0.34.0
+ golang.org/x/sync v0.16.0
+ golang.org/x/text v0.28.0
+ golang.org/x/tools v0.36.0
gorm.io/driver/sqlite v1.6.0
- gorm.io/gorm v1.30.0
+ gorm.io/gorm v1.30.1
)
require (
@@ -56,11 +56,11 @@ require (
github.com/abcum/lcp v0.0.0-20201209214815-7a3f3840be81 // indirect
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
github.com/andybalholm/cascadia v1.3.3 // indirect
- github.com/bytedance/sonic v1.13.3 // indirect
- github.com/bytedance/sonic/loader v0.2.4 // indirect
+ github.com/bytedance/sonic v1.14.0 // indirect
+ github.com/bytedance/sonic/loader v0.3.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cloudflare/circl v1.6.1 // indirect
- github.com/cloudwego/base64x v0.1.5 // indirect
+ github.com/cloudwego/base64x v0.1.6 // indirect
github.com/cyphar/filepath-securejoin v0.4.1 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgraph-io/ristretto/v2 v2.2.0 // indirect
@@ -75,12 +75,12 @@ require (
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
- github.com/go-playground/validator/v10 v10.26.0 // indirect
+ github.com/go-playground/validator/v10 v10.27.0 // indirect
github.com/goccy/go-json v0.10.5 // indirect
github.com/gofrs/flock v0.12.1 // indirect
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
github.com/google/flatbuffers v25.2.10+incompatible // indirect
- github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
+ github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5 // indirect
github.com/itchyny/timefmt-go v0.1.6 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
@@ -88,7 +88,7 @@ require (
github.com/json-iterator/go v1.1.12 // indirect
github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/klauspost/compress v1.18.0 // indirect
- github.com/klauspost/cpuid/v2 v2.2.10 // indirect
+ github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
@@ -96,7 +96,7 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
- github.com/pjbgf/sha1cd v0.3.2 // indirect
+ github.com/pjbgf/sha1cd v0.4.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/plar/go-adaptive-radix-tree v1.0.7 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
@@ -108,20 +108,20 @@ require (
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
- github.com/ugorji/go/codec v1.2.14 // indirect
+ github.com/ugorji/go/codec v1.3.0 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
- go.opentelemetry.io/otel v1.36.0 // indirect
- go.opentelemetry.io/otel/metric v1.36.0 // indirect
- go.opentelemetry.io/otel/trace v1.36.0 // indirect
+ go.opentelemetry.io/otel v1.37.0 // indirect
+ go.opentelemetry.io/otel/metric v1.37.0 // indirect
+ go.opentelemetry.io/otel/trace v1.37.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
- golang.org/x/arch v0.18.0 // indirect
- golang.org/x/mod v0.25.0 // indirect
- golang.org/x/net v0.41.0 // indirect
- golang.org/x/sys v0.33.0 // indirect
- golang.org/x/term v0.32.0 // indirect
+ golang.org/x/arch v0.20.0 // indirect
+ golang.org/x/mod v0.27.0 // indirect
+ golang.org/x/net v0.43.0 // indirect
+ golang.org/x/sys v0.35.0 // indirect
+ golang.org/x/term v0.34.0 // indirect
gonum.org/v1/gonum v0.16.0 // indirect
- google.golang.org/protobuf v1.36.6 // indirect
+ google.golang.org/protobuf v1.36.7 // indirect
gopkg.in/neurosnap/sentences.v1 v1.0.7 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
diff --git a/go.sum b/go.sum
index 63be28816..f5dc9e2ee 100644
--- a/go.sum
+++ b/go.sum
@@ -75,13 +75,12 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
-github.com/boombuler/barcode v1.0.2 h1:79yrbttoZrLGkL/oOI8hBrUKucwOL0oOjUgEguGMcJ4=
-github.com/boombuler/barcode v1.0.2/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
-github.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=
-github.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=
-github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
-github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=
-github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
+github.com/boombuler/barcode v1.1.0 h1:ChaYjBR63fr4LFyGn8E8nt7dBSt3MiU3zMOZqFvVkHo=
+github.com/boombuler/barcode v1.1.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
+github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
+github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
+github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
+github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
@@ -98,9 +97,8 @@ github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
-github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
-github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
-github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
+github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
+github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
@@ -117,8 +115,8 @@ github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGL
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/dgraph-io/badger/v4 v4.7.0 h1:Q+J8HApYAY7UMpL8d9owqiB+odzEc0zn/aqOD9jhc6Y=
-github.com/dgraph-io/badger/v4 v4.7.0/go.mod h1:He7TzG3YBy3j4f5baj5B7Zl2XyfNe5bl4Udl0aPemVA=
+github.com/dgraph-io/badger/v4 v4.8.0 h1:JYph1ChBijCw8SLeybvPINizbDKWZ5n/GYbz2yhN/bs=
+github.com/dgraph-io/badger/v4 v4.8.0/go.mod h1:U6on6e8k/RTbUWxqKR0MvugJuVmkxSNc79ap4917h4w=
github.com/dgraph-io/ristretto/v2 v2.2.0 h1:bkY3XzJcXoMuELV8F+vS8kzNgicwQFAaGINAEJdWGOM=
github.com/dgraph-io/ristretto/v2 v2.2.0/go.mod h1:RZrm63UmcBAaYWC1DotLYBmTvgkrs0+XhBd7Npn7/zI=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
@@ -180,8 +178,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
-github.com/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k=
-github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
+github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4=
+github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
@@ -229,8 +227,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/gomarkdown/markdown v0.0.0-20250311123330-531bef5e742b h1:EY/KpStFl60qA17CptGXhwfZ+k1sFNJIUNR8DdbcuUk=
-github.com/gomarkdown/markdown v0.0.0-20250311123330-531bef5e742b/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
+github.com/gomarkdown/markdown v0.0.0-20250810172220-2e2c11897d1a h1:l7A0loSszR5zHd/qK53ZIHMO8b3bBSmENnQ6eKnUT0A=
+github.com/gomarkdown/markdown v0.0.0-20250810172220-2e2c11897d1a/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q=
@@ -268,8 +266,8 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
-github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18=
-github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
+github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5 h1:xhMrHhTJ6zxu3gA4enFM9MLn9AY7613teCdFnlUVbSQ=
+github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
@@ -340,10 +338,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
-github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
-github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
-github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
+github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
+github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
@@ -369,8 +365,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
-github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A=
-github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
+github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs=
+github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
@@ -410,8 +406,8 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
-github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4=
-github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A=
+github.com/pjbgf/sha1cd v0.4.0 h1:NXzbL1RvjTUi6kgYZCX3fPwwl27Q1LJndxtUDVfJGRY=
+github.com/pjbgf/sha1cd v0.4.0/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -519,8 +515,8 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
-github.com/ugorji/go/codec v1.2.14 h1:yOQvXCBc3Ij46LRkRoh4Yd5qK6LVOgi0bYOXfb7ifjw=
-github.com/ugorji/go/codec v1.2.14/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
+github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
github.com/vbauerster/mpb/v5 v5.4.0 h1:n8JPunifvQvh6P1D1HAl2Ur9YcmKT1tpoUuiea5mlmg=
github.com/vbauerster/mpb/v5 v5.4.0/go.mod h1:fi4wVo7BVQ22QcvFObm+VwliQXlV1eBT8JDaKXR4JGI=
github.com/watermint/bwlimit v0.0.0-20170711090810-815207958550 h1:QVvrW8HPfP/Zl3vHnp2GHX7FHdKMh+gJX+ygV+rl8TQ=
@@ -550,12 +546,12 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
-go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
-go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
-go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
-go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
-go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
@@ -570,8 +566,8 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
-golang.org/x/arch v0.18.0 h1:WN9poc33zL4AzGxqf8VtpKUnGvMi8O9lhNyBMF/85qc=
-golang.org/x/arch v0.18.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
+golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c=
+golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -586,8 +582,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
-golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
-golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
+golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
+golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -599,12 +595,12 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20200228211341-fcea875c7e85/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
+golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 h1:SbTAbRFnd5kjQXbczszQ0hdk3ctwYf3qBNH9jIsGclE=
+golang.org/x/exp v0.0.0-20250813145105-42675adae3e6/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.28.0 h1:gdem5JW1OLS4FbkWgLO+7ZeFzYtL3xClb97GaUzYMFE=
-golang.org/x/image v0.28.0/go.mod h1:GUJYXtnGKEUgggyzh+Vxt+AviiCcyiwpsl8iQ8MvwGY=
+golang.org/x/image v0.30.0 h1:jD5RhkmVAnjqaCUXfbGBrn3lpxbknfN9w2UhHHU+5B4=
+golang.org/x/image v0.30.0/go.mod h1:SAEUTxCCMWSrJcCy/4HwavEsfZZJlYxeHLc6tTiAe/c=
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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -633,8 +629,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
-golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
+golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
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-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -682,8 +678,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
-golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
-golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
+golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
+golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -715,8 +711,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
-golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
+golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -778,8 +774,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
-golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
+golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -789,8 +785,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
-golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
-golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
+golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
+golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -806,8 +802,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
-golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
-golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
+golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
+golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -867,8 +863,8 @@ 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.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
-golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
-golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
+golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
+golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -978,8 +974,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
-google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
+google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A=
+google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1005,8 +1001,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ=
gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8=
-gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs=
-gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
+gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4=
+gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -1014,7 +1010,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
diff --git a/infra/control/app_apikey/appkey.go b/infra/control/app_apikey/appkey.go
index c0726e724..c3f9710ed 100644
--- a/infra/control/app_apikey/appkey.go
+++ b/infra/control/app_apikey/appkey.go
@@ -1,67 +1,67 @@
package app_apikey
import (
- "encoding/json"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "github.com/watermint/toolbox/infra/control/app_resource"
- "github.com/watermint/toolbox/infra/security/sc_zap"
- "os"
+ "encoding/json"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/infra/control/app_resource"
+ "github.com/watermint/toolbox/infra/security/sc_zap"
+ "os"
)
const (
- suffixKey = ".key"
- suffixSecret = ".secret"
+ suffixKey = ".key"
+ suffixSecret = ".secret"
)
func Resolve(ctl app_control.Control, appKey string) (clientId, clientSecret string) {
- l := ctl.Log().With(esl.String("appKey", appKey))
+ l := ctl.Log().With(esl.String("appKey", appKey))
- // Retrieve from extra
- extra := ctl.Feature().Extra()
- var e bool
- if clientId, e = extra.AppKey(appKey + suffixKey); e {
- if clientSecret, e = extra.AppKey(appKey + suffixSecret); e {
- return clientId, clientSecret
- }
- }
+ // Retrieve from extra
+ extra := ctl.Feature().Extra()
+ var e bool
+ if clientId, e = extra.AppKey(appKey + suffixKey); e {
+ if clientSecret, e = extra.AppKey(appKey + suffixSecret); e {
+ return clientId, clientSecret
+ }
+ }
- appKeyData, found := os.LookupEnv(app_definitions.EnvNameToolboxAppKeys)
- if found {
- keys := make(map[string]string)
- if err := json.Unmarshal([]byte(appKeyData), &keys); err != nil {
- l.Error("Unable to unmarshal app key data from the environment", esl.Error(err), esl.String("environmentValueName", app_definitions.EnvNameToolboxAppKeys))
- return "", ""
- }
- if clientId, e = keys[appKey+suffixKey]; e {
- if clientSecret, e = keys[appKey+suffixSecret]; e {
- return clientId, clientSecret
- }
- }
- }
+ appKeyData, found := os.LookupEnv(app_definitions.EnvNameToolboxAppKeys)
+ if found {
+ keys := make(map[string]string)
+ if err := json.Unmarshal([]byte(appKeyData), &keys); err != nil {
+ l.Error("Unable to unmarshal app key data from the environment", esl.Error(err), esl.String("environmentValueName", app_definitions.EnvNameToolboxAppKeys))
+ return "", ""
+ }
+ if clientId, e = keys[appKey+suffixKey]; e {
+ if clientSecret, e = keys[appKey+suffixSecret]; e {
+ return clientId, clientSecret
+ }
+ }
+ }
- // Retrieve from obfuscated resource
- keys := make(map[string]string)
+ // Retrieve from obfuscated resource
+ keys := make(map[string]string)
- kb, err := sc_zap.Unzap(ctl)
- if err != nil {
- kb, err = app_resource.Bundle().Keys().Bytes("toolbox.appkeys")
- if err != nil {
- l.Debug("Skip loading app keys")
- return "", ""
- }
- }
- if err = json.Unmarshal(kb, &keys); err != nil {
- l.Debug("Unable to unmarshal", esl.Error(err))
- return "", ""
- }
+ kb, err := sc_zap.Unzap(ctl)
+ if err != nil {
+ kb, err = app_resource.Bundle().Keys().Bytes("toolbox.appkeys")
+ if err != nil {
+ l.Debug("Skip loading app keys")
+ return "", ""
+ }
+ }
+ if err = json.Unmarshal(kb, &keys); err != nil {
+ l.Debug("Unable to unmarshal", esl.Error(err))
+ return "", ""
+ }
- if clientId, e = keys[appKey+suffixKey]; e {
- if clientSecret, e = keys[appKey+suffixSecret]; e {
- return clientId, clientSecret
- }
- }
- l.Debug("Client ID/Secret not found")
- return "", ""
+ if clientId, e = keys[appKey+suffixKey]; e {
+ if clientSecret, e = keys[appKey+suffixSecret]; e {
+ return clientId, clientSecret
+ }
+ }
+ l.Debug("Client ID/Secret not found")
+ return "", ""
}
diff --git a/infra/control/app_apikey/doc.go b/infra/control/app_apikey/doc.go
new file mode 100644
index 000000000..16cdbf61d
--- /dev/null
+++ b/infra/control/app_apikey/doc.go
@@ -0,0 +1,2 @@
+// Package app_apikey provides a function to resolve API client ID and secret.
+package app_apikey
diff --git a/infra/control/app_bootstrap/bootstrap.go b/infra/control/app_bootstrap/bootstrap.go
index 4d38c7291..3e030d654 100644
--- a/infra/control/app_bootstrap/bootstrap.go
+++ b/infra/control/app_bootstrap/bootstrap.go
@@ -15,7 +15,7 @@ import (
"github.com/itchyny/gojq"
"github.com/pkg/profile"
"github.com/watermint/toolbox/essentials/ambient/ea_indicator"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/io/es_stdout"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/network/nw_bandwidth"
@@ -273,29 +273,18 @@ func (z *bsImpl) Run(rcp rc_recipe.Spec, comSpec *rc_spec.CommonValues) {
for _, key := range app_license_key.AvailableKeys(wb.Workspace()) {
_, err := app_license.LoadAndCacheLicense(key, app_definitions.SupplementRepositoryLicenseUrl, wb.Workspace().Secrets())
if errors.Is(err, app_license.ErrorLicenseNetwork) {
- ui.Failure(MRun.ErrorLicenseNetwork)
- app_exit.Abort(app_exit.FailureLicenseExpired)
+ ctl.Log().Debug("License network error", esl.Error(err))
}
if licenseErr == nil && err != nil {
licenseErr = err
}
}
- if app_definitions.IsProduction() {
- ui.Failure(MRun.ErrorLicenseExpired)
- app_exit.Abort(app_exit.FailureLicenseExpired)
- } else {
- ui.Error(MRun.WarnLicenseExpiredOnNonProductionMode)
- }
+ ctl.Log().Debug("License expired", esl.Error(licenseErr))
}
// Check lifecycle
if active, warn := license.IsLifecycleWithinLimit(); !active {
- if app_definitions.IsProduction() {
- ui.Failure(MRun.ErrorLifecycleEnded)
- app_exit.Abort(app_exit.FailureBinaryExpired)
- } else {
- ui.Error(MRun.WarnLifecycleErrorOnNonProductionMode)
- }
+ ctl.Log().Debug("Application lifecycle ended")
} else if warn {
ui.Info(MRun.WarnLifecycleNearEnd.With(
"Expiration",
@@ -304,8 +293,7 @@ func (z *bsImpl) Run(rcp rc_recipe.Spec, comSpec *rc_spec.CommonValues) {
// Check license of the recipe
if rcp.IsLicenseRequired() && !license.IsRecipeEnabled(rcp.CliPath()) {
- ui.Failure(MRun.ErrorLicenseRequired.With("CliPath", rcp.CliPath()))
- app_exit.Abort(app_exit.FailureLicenseRequired)
+ ctl.Log().Debug("License required for recipe", esl.String("recipe", rcp.CliPath()))
}
// Bootstrap recipe
diff --git a/infra/control/app_bootstrap/bootstrap_comprehensive_test.go b/infra/control/app_bootstrap/bootstrap_comprehensive_test.go
index 3702e5ed9..25b2f6fda 100644
--- a/infra/control/app_bootstrap/bootstrap_comprehensive_test.go
+++ b/infra/control/app_bootstrap/bootstrap_comprehensive_test.go
@@ -10,7 +10,7 @@ func TestBootstrap_PublicAPI(t *testing.T) {
if bs == nil {
t.Fatal("NewBootstrap should not return nil")
}
-
+
// Verify it returns the correct implementation
if _, ok := bs.(*bsImpl); !ok {
t.Fatal("NewBootstrap should return *bsImpl")
@@ -22,7 +22,7 @@ func TestMRun_GlobalVariable(t *testing.T) {
if MRun == nil {
t.Fatal("MRun should be initialized")
}
-
+
// Test some key fields exist
if MRun.ErrorInvalidArgument == nil {
t.Error("ErrorInvalidArgument should be initialized")
@@ -41,16 +41,13 @@ func TestMRun_GlobalVariable(t *testing.T) {
}
}
-
-
-
func TestBootstrapInterface(t *testing.T) {
// Verify Bootstrap interface is properly implemented
var _ Bootstrap = &bsImpl{}
-
+
// Test that NewBootstrap returns correct type
bs := NewBootstrap()
if _, ok := bs.(*bsImpl); !ok {
t.Error("NewBootstrap should return *bsImpl")
}
-}
\ No newline at end of file
+}
diff --git a/infra/control/app_bootstrap/bootstrap_helpers_test.go b/infra/control/app_bootstrap/bootstrap_helpers_test.go
index e11cf3d51..303ec1ccf 100644
--- a/infra/control/app_bootstrap/bootstrap_helpers_test.go
+++ b/infra/control/app_bootstrap/bootstrap_helpers_test.go
@@ -7,7 +7,7 @@ import (
"testing"
"time"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
)
func TestParseArgs(t *testing.T) {
@@ -33,7 +33,7 @@ func TestParseArgs(t *testing.T) {
expected: 3,
},
}
-
+
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
if len(tc.args) != tc.expected {
@@ -65,7 +65,7 @@ func TestLanguageParsing(t *testing.T) {
expected: es_lang.Japanese,
},
}
-
+
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
// Test language parsing logic
@@ -80,7 +80,7 @@ func TestLanguageParsing(t *testing.T) {
default:
lang = es_lang.Default
}
-
+
// For auto, we can't predict exact result, so just ensure it's valid
if tc.input != "auto" && lang != tc.expected {
t.Errorf("Expected language %v, got %v", tc.expected, lang)
@@ -89,21 +89,20 @@ func TestLanguageParsing(t *testing.T) {
}
}
-
func TestFlagSetCreation(t *testing.T) {
// Test that we can create flag sets without panics
fs := flag.NewFlagSet("test", flag.ContinueOnError)
-
+
// Add some test flags
quiet := fs.Bool("quiet", false, "Suppress output")
verbose := fs.Bool("verbose", false, "Verbose output")
-
+
// Parse empty args
err := fs.Parse([]string{})
if err != nil {
t.Errorf("Failed to parse empty args: %v", err)
}
-
+
// Check defaults
if *quiet {
t.Error("quiet flag should default to false")
@@ -111,7 +110,7 @@ func TestFlagSetCreation(t *testing.T) {
if *verbose {
t.Error("verbose flag should default to false")
}
-
+
// Parse with flags
err = fs.Parse([]string{"-quiet", "-verbose"})
if err != nil {
@@ -129,13 +128,13 @@ func TestEnvironmentVariables(t *testing.T) {
{"TEST_LANG", "en"},
{"TEST_DEBUG", "1"},
}
-
+
// Set test environment variables
for _, env := range testEnvVars {
os.Setenv(env.name, env.value)
defer os.Unsetenv(env.name)
}
-
+
// Verify they're set
for _, env := range testEnvVars {
if val := os.Getenv(env.name); val != env.value {
@@ -176,7 +175,7 @@ func TestOutputFilterValidation(t *testing.T) {
isValid: true,
},
}
-
+
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
// Basic validation - non-empty filters should contain at least one character
@@ -191,7 +190,7 @@ func TestOutputFilterValidation(t *testing.T) {
func TestConcurrencyDefaults(t *testing.T) {
// Test concurrency default values
defaultConcurrency := 0 // 0 means use number of CPUs
-
+
if defaultConcurrency < 0 {
t.Error("Default concurrency should not be negative")
}
@@ -207,7 +206,7 @@ func TestTimeouts(t *testing.T) {
{"medium", 30 * time.Second},
{"long", 5 * time.Minute},
}
-
+
for _, tt := range testTimeouts {
t.Run(tt.name, func(t *testing.T) {
if tt.timeout <= 0 {
@@ -244,7 +243,7 @@ func TestPathValidation(t *testing.T) {
isValid: false,
},
}
-
+
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
isValid := tc.path != ""
@@ -263,20 +262,20 @@ func TestExperimentFlags(t *testing.T) {
"feature_with_underscore",
"feature-with-dash",
}
-
+
for _, exp := range experiments {
if !isValidExperimentName(exp) {
t.Errorf("Experiment name '%s' should be valid", exp)
}
}
-
+
// Test invalid experiment names
invalidExperiments := []string{
"",
" ",
"feature with space",
}
-
+
for _, exp := range invalidExperiments {
if isValidExperimentName(exp) {
t.Errorf("Experiment name '%s' should be invalid", exp)
@@ -287,4 +286,4 @@ func TestExperimentFlags(t *testing.T) {
// Helper function for experiment validation
func isValidExperimentName(name string) bool {
return name != "" && !strings.Contains(name, " ")
-}
\ No newline at end of file
+}
diff --git a/infra/control/app_bootstrap/bootstrap_test.go b/infra/control/app_bootstrap/bootstrap_test.go
index 386113cee..6d1b0741e 100644
--- a/infra/control/app_bootstrap/bootstrap_test.go
+++ b/infra/control/app_bootstrap/bootstrap_test.go
@@ -41,11 +41,11 @@ func TestBsImpl_SelectUI(t *testing.T) {
// This test is simplified because SelectUI has complex dependencies
// that may cause panics in the test environment
bootstrap := &bsImpl{}
-
+
if bootstrap == nil {
t.Error("Expected bootstrap to be created")
}
-
+
// Test that the method exists by verifying we can create the struct
// Actual UI testing would require complex mocking of dependencies
}
@@ -53,7 +53,7 @@ func TestBsImpl_SelectUI(t *testing.T) {
func TestBsImpl_SelectUI_UnsupportedOutput(t *testing.T) {
// Simplified test due to complex dependencies
bootstrap := &bsImpl{}
-
+
if bootstrap == nil {
t.Error("Expected bootstrap to be created")
}
@@ -63,7 +63,7 @@ func TestBsImpl_ParseCommon(t *testing.T) {
// This test is skipped due to complex dependencies that cause panics
// The ParseCommon method requires message resources to be loaded
bootstrap := &bsImpl{}
-
+
if bootstrap == nil {
t.Error("Expected bootstrap to be created")
}
@@ -72,7 +72,7 @@ func TestBsImpl_ParseCommon(t *testing.T) {
func TestBsImpl_Parse(t *testing.T) {
// This test is skipped due to complex dependencies that cause panics
bootstrap := &bsImpl{}
-
+
if bootstrap == nil {
t.Error("Expected bootstrap to be created")
}
@@ -109,7 +109,7 @@ func TestMsgRun(t *testing.T) {
func TestBsImpl_BootUI(t *testing.T) {
// This test is skipped due to complex dependencies that cause panics
bootstrap := &bsImpl{}
-
+
if bootstrap == nil {
t.Error("Expected bootstrap to be created")
}
@@ -155,7 +155,7 @@ func TestTrapSignal(t *testing.T) {
// Create signal channel
sig := make(chan os.Signal, 1)
-
+
// We can't easily create a real control for testing, so we test with nil
// The function should handle this gracefully or panic (both are valid)
go func() {
@@ -182,4 +182,4 @@ func TestTrapPanic(t *testing.T) {
}()
trapPanic(nil)
}()
-}
\ No newline at end of file
+}
diff --git a/infra/control/app_bootstrap/doc.go b/infra/control/app_bootstrap/doc.go
new file mode 100644
index 000000000..9206ab44f
--- /dev/null
+++ b/infra/control/app_bootstrap/doc.go
@@ -0,0 +1,2 @@
+// Package app_bootstrap provides the core bootstrap logic for the application.
+package app_bootstrap
diff --git a/infra/control/app_budget/doc.go b/infra/control/app_budget/doc.go
new file mode 100644
index 000000000..eda2160a6
--- /dev/null
+++ b/infra/control/app_budget/doc.go
@@ -0,0 +1,2 @@
+// Package app_budget defines storage budget types and provides a function to retrieve corresponding log rotation settings.
+package app_budget
diff --git a/infra/control/app_budget/storage.go b/infra/control/app_budget/storage.go
index 91668dd56..2222cfbee 100644
--- a/infra/control/app_budget/storage.go
+++ b/infra/control/app_budget/storage.go
@@ -1,44 +1,44 @@
package app_budget
import (
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/log/esl_rotate"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/log/esl_rotate"
)
const (
- logChunkSize = 100 * 1048576 // 100MiB
- unlimitedQuota = esl_rotate.UnlimitedQuota
- unlimitedNumBackup = esl_rotate.UnlimitedBackups
- standardQuota = 5 * 1073741824 // 5GiB * 2 = 10GiB
- standardNumBackup = standardQuota * 2 / logChunkSize
- lowQuota = 500 * 1048576 // 500MiB * 2 = 1GiB
- lowNumBackup = lowQuota * 2 / logChunkSize
+ logChunkSize = 100 * 1048576 // 100MiB
+ unlimitedQuota = esl_rotate.UnlimitedQuota
+ unlimitedNumBackup = esl_rotate.UnlimitedBackups
+ standardQuota = 5 * 1073741824 // 5GiB * 2 = 10GiB
+ standardNumBackup = standardQuota * 2 / logChunkSize
+ lowQuota = 500 * 1048576 // 500MiB * 2 = 1GiB
+ lowNumBackup = lowQuota * 2 / logChunkSize
- BudgetLow Budget = "low"
- BudgetNormal Budget = "normal"
- BudgetUnlimited Budget = "unlimited"
+ BudgetLow Budget = "low"
+ BudgetNormal Budget = "normal"
+ BudgetUnlimited Budget = "unlimited"
)
type Budget string
var (
- StorageBudgets = []string{
- string(BudgetLow), string(BudgetNormal), string(BudgetUnlimited),
- }
- DefaultBudget = BudgetNormal
+ StorageBudgets = []string{
+ string(BudgetLow), string(BudgetNormal), string(BudgetUnlimited),
+ }
+ DefaultBudget = BudgetNormal
)
func StorageBudget(budget Budget) (chunkSize, quota int64, numBackup int) {
- switch budget {
- case BudgetLow:
- return logChunkSize, lowQuota, lowNumBackup
- case BudgetNormal:
- return logChunkSize, standardQuota, standardNumBackup
- case BudgetUnlimited:
- return logChunkSize, unlimitedQuota, unlimitedNumBackup
- default:
- l := esl.Default()
- l.Error("Unsupported budget type, fallback to BudgetNormal", esl.String("budget", string(budget)))
- return StorageBudget(BudgetNormal)
- }
+ switch budget {
+ case BudgetLow:
+ return logChunkSize, lowQuota, lowNumBackup
+ case BudgetNormal:
+ return logChunkSize, standardQuota, standardNumBackup
+ case BudgetUnlimited:
+ return logChunkSize, unlimitedQuota, unlimitedNumBackup
+ default:
+ l := esl.Default()
+ l.Error("Unsupported budget type, fallback to BudgetNormal", esl.String("budget", string(budget)))
+ return StorageBudget(BudgetNormal)
+ }
}
diff --git a/infra/control/app_build/doc.go b/infra/control/app_build/doc.go
new file mode 100644
index 000000000..3bf426247
--- /dev/null
+++ b/infra/control/app_build/doc.go
@@ -0,0 +1,2 @@
+// Package app_build provides functions for determining the application's version based on build environment variables.
+package app_build
diff --git a/infra/control/app_build/version.go b/infra/control/app_build/version.go
index 547a3c306..74c34f8a4 100644
--- a/infra/control/app_build/version.go
+++ b/infra/control/app_build/version.go
@@ -1,190 +1,190 @@
package app_build
import (
- "github.com/watermint/toolbox/essentials/strings/es_version"
- "github.com/watermint/toolbox/resources"
- "os"
- "strconv"
- "strings"
- "time"
+ "github.com/watermint/toolbox/essentials/strings/es_version"
+ "github.com/watermint/toolbox/resources"
+ "os"
+ "strconv"
+ "strings"
+ "time"
)
const (
- // Minor version definition
+ // Minor version definition
- // BuildMinorOther Build with other than CI or unmanaged CI
- BuildMinorOther = 0
+ // BuildMinorOther Build with other than CI or unmanaged CI
+ BuildMinorOther = 0
- // BuildMinorGitLab Build with GitLab
- BuildMinorGitLab = 1
+ // BuildMinorGitLab Build with GitLab
+ BuildMinorGitLab = 1
- // BuildMinorCircleCiCurrent Build with CircleCI on other than main/master branch
- BuildMinorCircleCiCurrent = 2
+ // BuildMinorCircleCiCurrent Build with CircleCI on other than main/master branch
+ BuildMinorCircleCiCurrent = 2
- // BuildMinorGitHubActionsCurrent Build with GitHub Actions
- BuildMinorGitHubActionsCurrent = 3
+ // BuildMinorGitHubActionsCurrent Build with GitHub Actions
+ BuildMinorGitHubActionsCurrent = 3
- // BuildMinorCircleCiMaster Build with CircleCI on master branch
- BuildMinorCircleCiMaster = 4
+ // BuildMinorCircleCiMaster Build with CircleCI on master branch
+ BuildMinorCircleCiMaster = 4
- // BuildMinorCircleCiMain Build with CircleCI on main branch
- BuildMinorCircleCiMain = 4
+ // BuildMinorCircleCiMain Build with CircleCI on main branch
+ BuildMinorCircleCiMain = 4
- // BuildMinorGitHubActionsMain Build with GitHub Actions
- BuildMinorGitHubActionsMain = 8
+ // BuildMinorGitHubActionsMain Build with GitHub Actions
+ BuildMinorGitHubActionsMain = 8
)
var (
- CurrentRelease = resources.Release()
+ CurrentRelease = resources.Release()
)
// Release number
func Release() uint64 {
- if r, err := strconv.ParseUint(CurrentRelease, 10, 64); err != nil {
- panic(err)
- } else {
- return r
- }
+ if r, err := strconv.ParseUint(CurrentRelease, 10, 64); err != nil {
+ panic(err)
+ } else {
+ return r
+ }
}
// SelectVersion Select or define the version
func SelectVersion(v string) es_version.Version {
- if ver, err := es_version.Parse(v); err != nil {
- return Version()
- } else {
- if ver.Major > 0 {
- return ver
- }
- }
- return Version()
+ if ver, err := es_version.Parse(v); err != nil {
+ return Version()
+ } else {
+ if ver.Major > 0 {
+ return ver
+ }
+ }
+ return Version()
}
func versionCCI() (es_version.Version, bool) {
- var err error
- if branch, ok := os.LookupEnv("CIRCLE_BRANCH"); ok {
- var patchVer uint64
-
- buildNum, ok := os.LookupEnv("TOOLBOX_PATCH_VERSION")
- if ok {
- patchVer, err = strconv.ParseUint(strings.TrimSpace(buildNum), 10, 64)
- if err != nil {
- panic(err)
- }
- } else {
- buildNum, ok := os.LookupEnv("CIRCLE_BUILD_NUM")
- if ok {
- patchVer, err = strconv.ParseUint(buildNum, 10, 64)
- if err != nil {
- panic(err)
- }
- }
- }
-
- switch branch {
- case "main":
- return es_version.Version{
- Major: Release(),
- Minor: BuildMinorCircleCiMain,
- Patch: patchVer,
- PreRelease: "",
- Build: "",
- }, true
- case "master":
- return es_version.Version{
- Major: Release(),
- Minor: BuildMinorCircleCiMaster,
- Patch: patchVer,
- PreRelease: "",
- Build: "",
- }, true
- default:
- return es_version.Version{
- Major: Release(),
- Minor: BuildMinorCircleCiCurrent,
- Patch: patchVer,
- PreRelease: "",
- Build: "",
- }, true
- }
- }
- return es_version.Version{}, false
+ var err error
+ if branch, ok := os.LookupEnv("CIRCLE_BRANCH"); ok {
+ var patchVer uint64
+
+ buildNum, ok := os.LookupEnv("TOOLBOX_PATCH_VERSION")
+ if ok {
+ patchVer, err = strconv.ParseUint(strings.TrimSpace(buildNum), 10, 64)
+ if err != nil {
+ panic(err)
+ }
+ } else {
+ buildNum, ok := os.LookupEnv("CIRCLE_BUILD_NUM")
+ if ok {
+ patchVer, err = strconv.ParseUint(buildNum, 10, 64)
+ if err != nil {
+ panic(err)
+ }
+ }
+ }
+
+ switch branch {
+ case "main":
+ return es_version.Version{
+ Major: Release(),
+ Minor: BuildMinorCircleCiMain,
+ Patch: patchVer,
+ PreRelease: "",
+ Build: "",
+ }, true
+ case "master":
+ return es_version.Version{
+ Major: Release(),
+ Minor: BuildMinorCircleCiMaster,
+ Patch: patchVer,
+ PreRelease: "",
+ Build: "",
+ }, true
+ default:
+ return es_version.Version{
+ Major: Release(),
+ Minor: BuildMinorCircleCiCurrent,
+ Patch: patchVer,
+ PreRelease: "",
+ Build: "",
+ }, true
+ }
+ }
+ return es_version.Version{}, false
}
func versionGitLab() (es_version.Version, bool) {
- if pipelineId, ok := os.LookupEnv("CI_PIPELINE_IID"); ok {
- id, err := strconv.ParseUint(pipelineId, 10, 64)
- if err != nil {
- panic(err)
- }
- return es_version.Version{
- Major: Release(),
- Minor: BuildMinorGitLab,
- Patch: id,
- PreRelease: "",
- Build: "",
- }, true
- }
- return es_version.Version{}, false
+ if pipelineId, ok := os.LookupEnv("CI_PIPELINE_IID"); ok {
+ id, err := strconv.ParseUint(pipelineId, 10, 64)
+ if err != nil {
+ panic(err)
+ }
+ return es_version.Version{
+ Major: Release(),
+ Minor: BuildMinorGitLab,
+ Patch: id,
+ PreRelease: "",
+ Build: "",
+ }, true
+ }
+ return es_version.Version{}, false
}
func versionGitHub() (es_version.Version, bool) {
- if runId, ok := os.LookupEnv("GITHUB_RUN_NUMBER"); ok {
- id, err := strconv.ParseUint(runId, 10, 64)
- if err != nil {
- panic(err)
- }
-
- branch, ok := os.LookupEnv("GITHUB_REF")
- if !ok {
- branch = "unknown"
- }
- switch branch {
- case "refs/heads/main":
- return es_version.Version{
- Major: Release(),
- Minor: BuildMinorGitHubActionsMain,
- Patch: id,
- PreRelease: "",
- Build: "",
- }, true
-
- case "refs/heads/current":
- return es_version.Version{
- Major: Release(),
- Minor: BuildMinorGitHubActionsCurrent,
- Patch: id,
- PreRelease: "",
- Build: "",
- }, true
-
- default:
- return es_version.Version{
- Major: Release(),
- Minor: BuildMinorOther,
- Patch: id,
- PreRelease: "",
- Build: "",
- }, true
- }
- }
- return es_version.Version{}, false
+ if runId, ok := os.LookupEnv("GITHUB_RUN_NUMBER"); ok {
+ id, err := strconv.ParseUint(runId, 10, 64)
+ if err != nil {
+ panic(err)
+ }
+
+ branch, ok := os.LookupEnv("GITHUB_REF")
+ if !ok {
+ branch = "unknown"
+ }
+ switch branch {
+ case "refs/heads/main":
+ return es_version.Version{
+ Major: Release(),
+ Minor: BuildMinorGitHubActionsMain,
+ Patch: id,
+ PreRelease: "",
+ Build: "",
+ }, true
+
+ case "refs/heads/current":
+ return es_version.Version{
+ Major: Release(),
+ Minor: BuildMinorGitHubActionsCurrent,
+ Patch: id,
+ PreRelease: "",
+ Build: "",
+ }, true
+
+ default:
+ return es_version.Version{
+ Major: Release(),
+ Minor: BuildMinorOther,
+ Patch: id,
+ PreRelease: "",
+ Build: "",
+ }, true
+ }
+ }
+ return es_version.Version{}, false
}
func Version() es_version.Version {
- if ver, ok := versionGitHub(); ok {
- return ver
- }
- if ver, ok := versionCCI(); ok {
- return ver
- }
- if ver, ok := versionGitLab(); ok {
- return ver
- }
- return es_version.Version{
- Major: Release(),
- Minor: BuildMinorOther,
- Patch: 0,
- PreRelease: "dev",
- Build: time.Now().UTC().Format("20060102T150405Z"),
- }
+ if ver, ok := versionGitHub(); ok {
+ return ver
+ }
+ if ver, ok := versionCCI(); ok {
+ return ver
+ }
+ if ver, ok := versionGitLab(); ok {
+ return ver
+ }
+ return es_version.Version{
+ Major: Release(),
+ Minor: BuildMinorOther,
+ Patch: 0,
+ PreRelease: "dev",
+ Build: time.Now().UTC().Format("20060102T150405Z"),
+ }
}
diff --git a/infra/control/app_catalogue/doc.go b/infra/control/app_catalogue/doc.go
new file mode 100644
index 000000000..87323a3a5
--- /dev/null
+++ b/infra/control/app_catalogue/doc.go
@@ -0,0 +1,2 @@
+// Package app_catalogue provides a global singleton for managing the application's recipe catalogue.
+package app_catalogue
diff --git a/infra/control/app_control/control.go b/infra/control/app_control/control.go
index a81bda123..2d52e508e 100644
--- a/infra/control/app_control/control.go
+++ b/infra/control/app_control/control.go
@@ -1,80 +1,80 @@
package app_control
import (
- "database/sql"
- "github.com/watermint/toolbox/essentials/api/api_auth"
- "github.com/watermint/toolbox/essentials/kvs/kv_storage"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/queue/eq_queue"
- "github.com/watermint/toolbox/essentials/queue/eq_sequence"
- "github.com/watermint/toolbox/infra/control/app_feature"
- "github.com/watermint/toolbox/infra/control/app_workspace"
- "github.com/watermint/toolbox/infra/ui/app_msg_container"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "gorm.io/gorm"
+ "database/sql"
+ "github.com/watermint/toolbox/essentials/api/api_auth"
+ "github.com/watermint/toolbox/essentials/kvs/kv_storage"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/queue/eq_queue"
+ "github.com/watermint/toolbox/essentials/queue/eq_sequence"
+ "github.com/watermint/toolbox/infra/control/app_feature"
+ "github.com/watermint/toolbox/infra/control/app_workspace"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
+ "gorm.io/gorm"
)
type Control interface {
- // UI returns UI instance
- UI() app_ui.UI
+ // UI returns UI instance
+ UI() app_ui.UI
- // Log returns logger instance
- Log() esl.Logger
+ // Log returns logger instance
+ Log() esl.Logger
- // Capture HTTP Capture logger
- Capture() esl.Logger
+ // Capture HTTP Capture logger
+ Capture() esl.Logger
- // Workspace returns workspace instance
- Workspace() app_workspace.Workspace
+ // Workspace returns workspace instance
+ Workspace() app_workspace.Workspace
- // Messages Message container
- Messages() app_msg_container.Container
+ // Messages Message container
+ Messages() app_msg_container.Container
- // Feature returns feature flags
- Feature() app_feature.Feature
+ // Feature returns feature flags
+ Feature() app_feature.Feature
- // NewQueue Create new queue definition
- NewQueue() eq_queue.Definition
+ // NewQueue Create new queue definition
+ NewQueue() eq_queue.Definition
- // Sequence Async queue sequence
- Sequence() eq_sequence.Sequence
+ // Sequence Async queue sequence
+ Sequence() eq_sequence.Sequence
- // AuthRepository returns auth repository
- AuthRepository() api_auth.Repository
+ // AuthRepository returns auth repository
+ AuthRepository() api_auth.Repository
- // NewKvs Create new KVS. The caller must close the storage before exit.
- NewKvs(name string) (kvs kv_storage.Storage, err error)
+ // NewKvs Create new KVS. The caller must close the storage before exit.
+ NewKvs(name string) (kvs kv_storage.Storage, err error)
- // NewKvsFactory Create new KVS factory. The caller must close the factory before exit.
- NewKvsFactory() (factory kv_storage.Factory)
+ // NewKvsFactory Create new KVS factory. The caller must close the factory before exit.
+ NewKvsFactory() (factory kv_storage.Factory)
- // NewDatabase Create new database. The caller must close the database before exit.
- NewDatabase(name string) (db *sql.DB, path string, err error)
+ // NewDatabase Create new database. The caller must close the database before exit.
+ NewDatabase(name string) (db *sql.DB, path string, err error)
- // NewOrm Create new ORM instance. The caller must close the ORM before exit.
- NewOrm(path string) (db *gorm.DB, err error)
+ // NewOrm Create new ORM instance. The caller must close the ORM before exit.
+ NewOrm(path string) (db *gorm.DB, err error)
- // NewOrmOnMemory Create new ORM instance on memory. The caller must close the ORM before exit.
- NewOrmOnMemory() (db *gorm.DB, err error)
+ // NewOrmOnMemory Create new ORM instance on memory. The caller must close the ORM before exit.
+ NewOrmOnMemory() (db *gorm.DB, err error)
- // WorkBundle Workspace bundle
- WorkBundle() app_workspace.Bundle
+ // WorkBundle Workspace bundle
+ WorkBundle() app_workspace.Bundle
- // WithFeature Fork control instance with feature
- WithFeature(feature app_feature.Feature) Control
+ // WithFeature Fork control instance with feature
+ WithFeature(feature app_feature.Feature) Control
- // WithUI Fork control instance with UI
- WithUI(ui app_ui.UI) Control
+ // WithUI Fork control instance with UI
+ WithUI(ui app_ui.UI) Control
- // WithLang Fork control with lang
- WithLang(targetLang string) Control
+ // WithLang Fork control with lang
+ WithLang(targetLang string) Control
- // WithBundle Fork control with bundle
- WithBundle(wb app_workspace.Bundle) Control
+ // WithBundle Fork control with bundle
+ WithBundle(wb app_workspace.Bundle) Control
}
type ControlCloser interface {
- Control
+ Control
- Close()
+ Close()
}
diff --git a/infra/control/app_control/doc.go b/infra/control/app_control/doc.go
new file mode 100644
index 000000000..205499703
--- /dev/null
+++ b/infra/control/app_control/doc.go
@@ -0,0 +1,2 @@
+// Package app_control defines the core `Control` interface for the application.
+package app_control
diff --git a/infra/control/app_control_impl/control.go b/infra/control/app_control_impl/control.go
index 635e167f9..d566f8694 100644
--- a/infra/control/app_control_impl/control.go
+++ b/infra/control/app_control_impl/control.go
@@ -5,8 +5,8 @@ import (
"errors"
"github.com/watermint/toolbox/essentials/api/api_auth"
"github.com/watermint/toolbox/essentials/database/es_orm"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/file/es_filepath"
- "github.com/watermint/toolbox/essentials/go/es_lang"
"github.com/watermint/toolbox/essentials/kvs/kv_storage"
"github.com/watermint/toolbox/essentials/kvs/kv_storage_impl"
"github.com/watermint/toolbox/essentials/log/esl"
diff --git a/infra/control/app_control_impl/doc.go b/infra/control/app_control_impl/doc.go
new file mode 100644
index 000000000..d9456f731
--- /dev/null
+++ b/infra/control/app_control_impl/doc.go
@@ -0,0 +1,2 @@
+// Package app_control_impl provides a concrete implementation of the `app_control.Control` interface.
+package app_control_impl
diff --git a/infra/control/app_definitions/doc.go b/infra/control/app_definitions/doc.go
new file mode 100644
index 000000000..279f1af7e
--- /dev/null
+++ b/infra/control/app_definitions/doc.go
@@ -0,0 +1,2 @@
+// Package app_definitions defines various application-wide constants.
+package app_definitions
diff --git a/infra/control/app_error/doc.go b/infra/control/app_error/doc.go
new file mode 100644
index 000000000..e3db30a3a
--- /dev/null
+++ b/infra/control/app_error/doc.go
@@ -0,0 +1,2 @@
+// Package app_error provides a mechanism for reporting errors that occur during application operations.
+package app_error
diff --git a/infra/control/app_error/mock.go b/infra/control/app_error/mock.go
index 2ff1c09f9..6eab43699 100644
--- a/infra/control/app_error/mock.go
+++ b/infra/control/app_error/mock.go
@@ -1,18 +1,18 @@
package app_error
import (
- "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/control/app_control"
)
func NewMock() ErrorReport {
- return mockImpl{}
+ return mockImpl{}
}
type mockImpl struct {
}
func (z mockImpl) Up(ctl app_control.Control) error {
- return nil
+ return nil
}
func (z mockImpl) Down() {
diff --git a/infra/control/app_error/report.go b/infra/control/app_error/report.go
index 9481bf635..d3ebd251b 100644
--- a/infra/control/app_error/report.go
+++ b/infra/control/app_error/report.go
@@ -1,23 +1,23 @@
package app_error
import (
- "encoding/json"
- "github.com/watermint/toolbox/infra/control/app_control"
+ "encoding/json"
+ "github.com/watermint/toolbox/infra/control/app_control"
)
const (
- ErrorReportName = "operation_errors"
+ ErrorReportName = "operation_errors"
)
type ErrorReportRow struct {
- OperationName string `json:"operation_name"`
- BatchId string `json:"batch_id"`
- Data json.RawMessage `json:"data"`
- Error string `json:"error"`
+ OperationName string `json:"operation_name"`
+ BatchId string `json:"batch_id"`
+ Data json.RawMessage `json:"data"`
+ Error string `json:"error"`
}
type ErrorReport interface {
- Up(ctl app_control.Control) error
- Down()
- ErrorListener(err error, mouldId, batchId string, p interface{})
+ Up(ctl app_control.Control) error
+ Down()
+ ErrorListener(err error, mouldId, batchId string, p interface{})
}
diff --git a/infra/control/app_error/report_impl.go b/infra/control/app_error/report_impl.go
index a68184b7f..4aa5f6e64 100644
--- a/infra/control/app_error/report_impl.go
+++ b/infra/control/app_error/report_impl.go
@@ -1,79 +1,79 @@
package app_error
import (
- "encoding/json"
- "github.com/watermint/toolbox/essentials/file/es_filesystem"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/control/app_workspace"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/report/rp_model_impl"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "github.com/watermint/toolbox/quality/infra/qt_errors"
+ "encoding/json"
+ "github.com/watermint/toolbox/essentials/file/es_filesystem"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/control/app_workspace"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/report/rp_model_impl"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
+ "github.com/watermint/toolbox/quality/infra/qt_errors"
)
type MsgErrorReport struct {
- ErrorOneOrMoreOperationErrors app_msg.Message
+ ErrorOneOrMoreOperationErrors app_msg.Message
}
var (
- MErrorReport = app_msg.Apply(&MsgErrorReport{}).(*MsgErrorReport)
+ MErrorReport = app_msg.Apply(&MsgErrorReport{}).(*MsgErrorReport)
)
func NewErrorReport(lg esl.Logger, wb app_workspace.Bundle, ui app_ui.UI) ErrorReport {
- return &errorReportImpl{
- lg: lg,
- ui: ui,
- wb: wb,
- rr: rp_model_impl.NewRowReport(ErrorReportName),
- }
+ return &errorReportImpl{
+ lg: lg,
+ ui: ui,
+ wb: wb,
+ rr: rp_model_impl.NewRowReport(ErrorReportName),
+ }
}
type errorReportImpl struct {
- lg esl.Logger
- ui app_ui.UI
- wb app_workspace.Bundle
- rr *rp_model_impl.RowReport
+ lg esl.Logger
+ ui app_ui.UI
+ wb app_workspace.Bundle
+ rr *rp_model_impl.RowReport
}
func (z *errorReportImpl) Up(ctl app_control.Control) error {
- z.rr.SetCtl(ctl)
- z.rr.SetModel(&ErrorReportRow{})
- return z.rr.Open(rp_model.NoConsoleOutput())
+ z.rr.SetCtl(ctl)
+ z.rr.SetModel(&ErrorReportRow{})
+ return z.rr.Open(rp_model.NoConsoleOutput())
}
func (z *errorReportImpl) Down() {
- if x := z.rr.Rows(); x > 0 {
- z.ui.Error(MErrorReport.ErrorOneOrMoreOperationErrors.With("Errors", x).With("ReportPath", z.wb.Workspace().Report()))
- }
- z.rr.Close()
+ if x := z.rr.Rows(); x > 0 {
+ z.ui.Error(MErrorReport.ErrorOneOrMoreOperationErrors.With("Errors", x).With("ReportPath", z.wb.Workspace().Report()))
+ }
+ z.rr.Close()
}
func (z *errorReportImpl) ErrorListener(err error, mouldId, batchId string, p interface{}) {
- if err == qt_errors.ErrorMock {
- return
- }
- if fsErr, ok := err.(es_filesystem.FileSystemError); ok {
- if fsErr.IsMockError() {
- return
- }
- }
- d, em := json.Marshal(p)
- if em != nil {
- z.lg.Debug("Unable to marshal", esl.Error(err))
- z.rr.Row(&ErrorReportRow{
- OperationName: mouldId,
- BatchId: batchId,
- Data: nil,
- Error: err.Error(),
- })
- } else {
- z.rr.Row(&ErrorReportRow{
- OperationName: mouldId,
- BatchId: batchId,
- Data: d,
- Error: err.Error(),
- })
- }
+ if err == qt_errors.ErrorMock {
+ return
+ }
+ if fsErr, ok := err.(es_filesystem.FileSystemError); ok {
+ if fsErr.IsMockError() {
+ return
+ }
+ }
+ d, em := json.Marshal(p)
+ if em != nil {
+ z.lg.Debug("Unable to marshal", esl.Error(err))
+ z.rr.Row(&ErrorReportRow{
+ OperationName: mouldId,
+ BatchId: batchId,
+ Data: nil,
+ Error: err.Error(),
+ })
+ } else {
+ z.rr.Row(&ErrorReportRow{
+ OperationName: mouldId,
+ BatchId: batchId,
+ Data: d,
+ Error: err.Error(),
+ })
+ }
}
diff --git a/infra/control/app_exit/abort.go b/infra/control/app_exit/abort.go
index e0e6051a4..6e4047832 100644
--- a/infra/control/app_exit/abort.go
+++ b/infra/control/app_exit/abort.go
@@ -1,55 +1,55 @@
package app_exit
import (
- "github.com/watermint/toolbox/infra/control/app_shutdown"
- "os"
+ "github.com/watermint/toolbox/infra/control/app_shutdown"
+ "os"
)
const (
- Success AbortCode = iota
- FatalGeneral
- FatalStartup
- FatalPanic
- FatalInterrupted
- FatalRuntime
- FatalNetwork
- FatalResourceUnavailable
-
- FailureGeneral
- FailureInvalidCommand
- FailureInvalidCommandFlags
- FailureBinaryExpired
- FailureLicenseExpired
- FailureLicenseRequired
- FailureAuthenticationFailedOrCancelled
+ Success AbortCode = iota
+ FatalGeneral
+ FatalStartup
+ FatalPanic
+ FatalInterrupted
+ FatalRuntime
+ FatalNetwork
+ FatalResourceUnavailable
+
+ FailureGeneral
+ FailureInvalidCommand
+ FailureInvalidCommandFlags
+ FailureBinaryExpired
+ FailureLicenseExpired
+ FailureLicenseRequired
+ FailureAuthenticationFailedOrCancelled
)
type AbortCode int
var (
- testMode = false
+ testMode = false
)
func Abort(code AbortCode) {
- app_shutdown.FlushShutdownHook()
- if testMode {
- panic(code)
- } else {
- os.Exit(int(code))
- }
+ app_shutdown.FlushShutdownHook()
+ if testMode {
+ panic(code)
+ } else {
+ os.Exit(int(code))
+ }
}
func ExitSuccess() {
- app_shutdown.FlushSuccessShutdownHook()
- app_shutdown.FlushShutdownHook()
- if testMode {
- panic(Success)
- } else {
- os.Exit(int(Success))
- }
+ app_shutdown.FlushSuccessShutdownHook()
+ app_shutdown.FlushShutdownHook()
+ if testMode {
+ panic(Success)
+ } else {
+ os.Exit(int(Success))
+ }
}
// Panic instead of os.Exit if it set.
func SetTestMode(enabled bool) {
- testMode = enabled
+ testMode = enabled
}
diff --git a/infra/control/app_exit/abort_test.go b/infra/control/app_exit/abort_test.go
index 7fb78b961..bb511b29e 100644
--- a/infra/control/app_exit/abort_test.go
+++ b/infra/control/app_exit/abort_test.go
@@ -3,28 +3,28 @@ package app_exit
import "testing"
func TestAbort(t *testing.T) {
- SetTestMode(true)
- expectedCode := FatalGeneral
- defer func() {
- err := recover()
- if err != expectedCode {
- t.Error(err)
- }
- }()
+ SetTestMode(true)
+ expectedCode := FatalGeneral
+ defer func() {
+ err := recover()
+ if err != expectedCode {
+ t.Error(err)
+ }
+ }()
- Abort(expectedCode)
+ Abort(expectedCode)
}
func TestExitSuccess(t *testing.T) {
- SetTestMode(true)
+ SetTestMode(true)
- expectedCode := Success
- defer func() {
- err := recover()
- if err != expectedCode {
- t.Error(err)
- }
- }()
+ expectedCode := Success
+ defer func() {
+ err := recover()
+ if err != expectedCode {
+ t.Error(err)
+ }
+ }()
- ExitSuccess()
+ ExitSuccess()
}
diff --git a/infra/control/app_exit/doc.go b/infra/control/app_exit/doc.go
new file mode 100644
index 000000000..024c1e240
--- /dev/null
+++ b/infra/control/app_exit/doc.go
@@ -0,0 +1,2 @@
+// Package app_exit provides functions for gracefully exiting the application with specific exit codes.
+package app_exit
diff --git a/infra/control/app_feature/doc.go b/infra/control/app_feature/doc.go
new file mode 100644
index 000000000..e852d784c
--- /dev/null
+++ b/infra/control/app_feature/doc.go
@@ -0,0 +1,2 @@
+// Package app_feature defines the `Feature` interface for managing application features.
+package app_feature
diff --git a/infra/control/app_feature/feature.go b/infra/control/app_feature/feature.go
index a4643fe7b..f98859d85 100644
--- a/infra/control/app_feature/feature.go
+++ b/infra/control/app_feature/feature.go
@@ -1,162 +1,162 @@
package app_feature
import (
- "encoding/json"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/kvs/kv_storage"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/network/nw_replay"
- "github.com/watermint/toolbox/infra/control/app_budget"
- "github.com/watermint/toolbox/infra/control/app_opt"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "os/user"
- "time"
+ "encoding/json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/kvs/kv_storage"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/network/nw_replay"
+ "github.com/watermint/toolbox/infra/control/app_budget"
+ "github.com/watermint/toolbox/infra/control/app_opt"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "os/user"
+ "time"
)
type Feature interface {
- IsProduction() bool
- IsDebug() bool
- IsVerbose() bool
- IsTest() bool
- IsTestWithMock() bool
- IsTestWithSeqReplay() (replay []nw_replay.Response, enabled bool)
- IsTestWithReplay() (replay kv_storage.Storage, enabled bool)
- IsQuiet() bool
- IsSecure() bool
- IsAutoOpen() bool
- IsTransient() bool
- IsSkipLogging() bool
+ IsProduction() bool
+ IsDebug() bool
+ IsVerbose() bool
+ IsTest() bool
+ IsTestWithMock() bool
+ IsTestWithSeqReplay() (replay []nw_replay.Response, enabled bool)
+ IsTestWithReplay() (replay kv_storage.Storage, enabled bool)
+ IsQuiet() bool
+ IsSecure() bool
+ IsAutoOpen() bool
+ IsTransient() bool
+ IsSkipLogging() bool
- // Experiment Is the experiment enabled or not.
- Experiment(name string) bool
+ // Experiment Is the experiment enabled or not.
+ Experiment(name string) bool
- // UIFormat UI format
- UIFormat() string
+ // UIFormat UI format
+ UIFormat() string
- // UIReportFilter is the filter for the report
- // Returns empty string when the filter is not specified.
- // Returns false when the filter is not enabled.
- UIReportFilter() (filter string, enabled bool)
+ // UIReportFilter is the filter for the report
+ // Returns empty string when the filter is not specified.
+ // Returns false when the filter is not enabled.
+ UIReportFilter() (filter string, enabled bool)
- // Concurrency configuration.
- Concurrency() int
+ // Concurrency configuration.
+ Concurrency() int
- // Home Toolbox home path. Returns empty if a user doesn't specify the path.
- Home() string
+ // Home Toolbox home path. Returns empty if a user doesn't specify the path.
+ Home() string
- // BudgetMemory Budget for memory usage
- BudgetMemory() app_budget.Budget
+ // BudgetMemory Budget for memory usage
+ BudgetMemory() app_budget.Budget
- // BudgetStorage Budget for storage usage
- BudgetStorage() app_budget.Budget
+ // BudgetStorage Budget for storage usage
+ BudgetStorage() app_budget.Budget
- // KvsEngine Key-value storage engine type
- KvsEngine() kv_storage.KvsEngine
+ // KvsEngine Key-value storage engine type
+ KvsEngine() kv_storage.KvsEngine
- // OptInGet Retrieve feature
- OptInGet(oi OptIn) (f OptIn, found bool)
+ // OptInGet Retrieve feature
+ OptInGet(oi OptIn) (f OptIn, found bool)
- // OptInUpdate Update opt-in feature
- OptInUpdate(oi OptIn) error
+ // OptInUpdate Update opt-in feature
+ OptInUpdate(oi OptIn) error
- // AsTest With test mode
- AsTest(useMock bool) Feature
+ // AsTest With test mode
+ AsTest(useMock bool) Feature
- // AsSeqReplayTest With sequential replay test
- AsSeqReplayTest(replay []nw_replay.Response) Feature
+ // AsSeqReplayTest With sequential replay test
+ AsSeqReplayTest(replay []nw_replay.Response) Feature
- // AsReplayTest With replay test
- AsReplayTest(replays kv_storage.Storage) Feature
+ // AsReplayTest With replay test
+ AsReplayTest(replays kv_storage.Storage) Feature
- // AsQuiet With quiet mode, but this will not guarantee UI/log are converted into quiet mode.
- AsQuiet() Feature
+ // AsQuiet With quiet mode, but this will not guarantee UI/log are converted into quiet mode.
+ AsQuiet() Feature
- // ConsoleLogLevel Console log level
- ConsoleLogLevel() esl.Level
+ // ConsoleLogLevel Console log level
+ ConsoleLogLevel() esl.Level
- // Extra options
- Extra() app_opt.ExtraOpts
+ // Extra options
+ Extra() app_opt.ExtraOpts
- // PathAuthRepository path to auth repository
- PathAuthRepository() string
+ // PathAuthRepository path to auth repository
+ PathAuthRepository() string
- // IsDefaultPathAuthRepository returns true when the repository
- IsDefaultPathAuthRepository() bool
+ // IsDefaultPathAuthRepository returns true when the repository
+ IsDefaultPathAuthRepository() bool
}
type OptIn interface {
- // The timestamp of opt-in, in ISO8601 format.
- // Empty when the user is not yet agreed.
- OptInTimestamp() string
+ // The timestamp of opt-in, in ISO8601 format.
+ // Empty when the user is not yet agreed.
+ OptInTimestamp() string
- // Name of the user who opt'ed in.
- OptInUser() string
+ // Name of the user who opt'ed in.
+ OptInUser() string
- // True when this feature enabled.
- OptInIsEnabled() bool
+ // True when this feature enabled.
+ OptInIsEnabled() bool
- // Opt-in
- OptInCommit(enable bool)
+ // Opt-in
+ OptInCommit(enable bool)
}
func OptInFrom(v map[string]interface{}, oi OptIn) error {
- b, err := json.Marshal(v)
- if err != nil {
- return err
- }
- return json.Unmarshal(b, oi)
+ b, err := json.Marshal(v)
+ if err != nil {
+ return err
+ }
+ return json.Unmarshal(b, oi)
}
type OptInStatus struct {
- // The timestamp of opt-in, in ISO8601 format.
- Timestamp string `json:"timestamp"`
+ // The timestamp of opt-in, in ISO8601 format.
+ Timestamp string `json:"timestamp"`
- // Name of the user who opt'ed in
- User string `json:"user"`
+ // Name of the user who opt'ed in
+ User string `json:"user"`
- // Opt-in status.
- Status bool `json:"status"`
+ // Opt-in status.
+ Status bool `json:"status"`
}
func (z *OptInStatus) OptInCommit(enable bool) {
- usr, _ := user.Current()
-
- switch {
- case usr.Name != "":
- z.User = usr.Name
- case usr.Username != "":
- z.User = usr.Username
- default:
- z.User = "unknown"
- }
- z.Status = enable
- z.Timestamp = time.Now().Format(time.RFC3339)
+ usr, _ := user.Current()
+
+ switch {
+ case usr.Name != "":
+ z.User = usr.Name
+ case usr.Username != "":
+ z.User = usr.Username
+ default:
+ z.User = "unknown"
+ }
+ z.Status = enable
+ z.Timestamp = time.Now().Format(time.RFC3339)
}
func (z *OptInStatus) OptInTimestamp() string {
- return z.Timestamp
+ return z.Timestamp
}
func (z *OptInStatus) OptInUser() string {
- return z.User
+ return z.User
}
func (z *OptInStatus) OptInIsEnabled() bool {
- return z.Status
+ return z.Status
}
func OptInName(v OptIn) string {
- return es_reflect.Key(v)
+ return es_reflect.Key(v)
}
func OptInAgreement(v OptIn) app_msg.Message {
- return app_msg.ObjMessage(v, "agreement")
+ return app_msg.ObjMessage(v, "agreement")
}
func OptInDisclaimer(v OptIn) app_msg.Message {
- return app_msg.ObjMessage(v, "disclaimer")
+ return app_msg.ObjMessage(v, "disclaimer")
}
func OptInDescription(v OptIn) app_msg.Message {
- return app_msg.ObjMessage(v, "desc")
+ return app_msg.ObjMessage(v, "desc")
}
diff --git a/infra/control/app_feature/feature_test.go b/infra/control/app_feature/feature_test.go
index 9305463ae..b8ac134b6 100644
--- a/infra/control/app_feature/feature_test.go
+++ b/infra/control/app_feature/feature_test.go
@@ -1,81 +1,81 @@
package app_feature
import (
- "testing"
+ "testing"
)
type SampleOptIn struct {
- OptInStatus
+ OptInStatus
}
func TestOptInFrom(t *testing.T) {
- v := map[string]interface{}{
- "timestamp": "2020-04-08T17:20:23+09:00",
- "user": "john",
- "status": true,
- }
- soi := &SampleOptIn{}
- if err := OptInFrom(v, soi); err != nil {
- t.Error(err)
- }
- if soi.User != "john" {
- t.Error(soi.User)
- }
- if !soi.Status {
- t.Error(soi.Status)
- }
- if soi.Timestamp != "2020-04-08T17:20:23+09:00" {
- t.Error(soi.Timestamp)
- }
+ v := map[string]interface{}{
+ "timestamp": "2020-04-08T17:20:23+09:00",
+ "user": "john",
+ "status": true,
+ }
+ soi := &SampleOptIn{}
+ if err := OptInFrom(v, soi); err != nil {
+ t.Error(err)
+ }
+ if soi.User != "john" {
+ t.Error(soi.User)
+ }
+ if !soi.Status {
+ t.Error(soi.Status)
+ }
+ if soi.Timestamp != "2020-04-08T17:20:23+09:00" {
+ t.Error(soi.Timestamp)
+ }
}
func TestOptInStatus_OptInCommit(t *testing.T) {
- soi := &SampleOptIn{}
- soi.OptInCommit(true)
- if soi.OptInUser() == "" {
- t.Error(soi.User)
- }
- if !soi.OptInIsEnabled() {
- t.Error(soi.Status)
- }
- if soi.OptInTimestamp() == "" {
- t.Error(soi.Timestamp)
- }
+ soi := &SampleOptIn{}
+ soi.OptInCommit(true)
+ if soi.OptInUser() == "" {
+ t.Error(soi.User)
+ }
+ if !soi.OptInIsEnabled() {
+ t.Error(soi.Status)
+ }
+ if soi.OptInTimestamp() == "" {
+ t.Error(soi.Timestamp)
+ }
}
func TestOptInStatus_OptInName(t *testing.T) {
- soi := &SampleOptIn{}
- name := OptInName(soi)
- if name != "infra.control.app_feature.sample_opt_in" {
- t.Error(name)
- }
+ soi := &SampleOptIn{}
+ name := OptInName(soi)
+ if name != "infra.control.app_feature.sample_opt_in" {
+ t.Error(name)
+ }
}
func TestOptInStatus_OptInMessages(t *testing.T) {
- soi := &SampleOptIn{}
- ma := OptInAgreement(soi)
- if ma.Key() != "infra.control.app_feature.sample_opt_in.agreement" {
- t.Error(ma.Key())
- }
- md := OptInDisclaimer(soi)
- if md.Key() != "infra.control.app_feature.sample_opt_in.disclaimer" {
- t.Error(md.Key())
- }
- mc := OptInDescription(soi)
- if mc.Key() != "infra.control.app_feature.sample_opt_in.desc" {
- t.Error(mc.Key())
- }
+ soi := &SampleOptIn{}
+ ma := OptInAgreement(soi)
+ if ma.Key() != "infra.control.app_feature.sample_opt_in.agreement" {
+ t.Error(ma.Key())
+ }
+ md := OptInDisclaimer(soi)
+ if md.Key() != "infra.control.app_feature.sample_opt_in.disclaimer" {
+ t.Error(md.Key())
+ }
+ mc := OptInDescription(soi)
+ if mc.Key() != "infra.control.app_feature.sample_opt_in.desc" {
+ t.Error(mc.Key())
+ }
}
func TestOptInStatus_OptInIsEnabled(t *testing.T) {
- soi := &SampleOptIn{}
- if soi.OptInIsEnabled() {
- t.Error(soi.OptInIsEnabled())
- }
- if soi.OptInTimestamp() != "" {
- t.Error(soi.OptInTimestamp())
- }
- if soi.OptInUser() != "" {
- t.Error(soi.OptInUser())
- }
+ soi := &SampleOptIn{}
+ if soi.OptInIsEnabled() {
+ t.Error(soi.OptInIsEnabled())
+ }
+ if soi.OptInTimestamp() != "" {
+ t.Error(soi.OptInTimestamp())
+ }
+ if soi.OptInUser() != "" {
+ t.Error(soi.OptInUser())
+ }
}
diff --git a/infra/control/app_feature/loglevel.go b/infra/control/app_feature/loglevel.go
index 4d077a292..8eb964462 100644
--- a/infra/control/app_feature/loglevel.go
+++ b/infra/control/app_feature/loglevel.go
@@ -1,26 +1,26 @@
package app_feature
import (
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/runtime/es_env"
- app_definitions2 "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/runtime/es_env"
+ app_definitions2 "github.com/watermint/toolbox/infra/control/app_definitions"
)
func ConsoleLogLevel(test, debug bool) esl.Level {
- switch {
- case es_env.IsEnabled(app_definitions2.EnvNameDebugVerbose):
- return esl.LevelDebug
+ switch {
+ case es_env.IsEnabled(app_definitions2.EnvNameDebugVerbose):
+ return esl.LevelDebug
- case es_env.IsEnabled(app_definitions2.EnvNameTestQuiet), app_definitions2.IsProduction() && test:
- return esl.LevelQuiet
+ case es_env.IsEnabled(app_definitions2.EnvNameTestQuiet), app_definitions2.IsProduction() && test:
+ return esl.LevelQuiet
- case test:
- return esl.LevelInfo
+ case test:
+ return esl.LevelInfo
- case debug:
- return esl.LevelDebug
+ case debug:
+ return esl.LevelDebug
- default:
- return esl.LevelInfo
- }
+ default:
+ return esl.LevelInfo
+ }
}
diff --git a/infra/control/app_feature_impl/doc.go b/infra/control/app_feature_impl/doc.go
new file mode 100644
index 000000000..78eb2fcbd
--- /dev/null
+++ b/infra/control/app_feature_impl/doc.go
@@ -0,0 +1,2 @@
+// Package app_feature_impl provides a concrete implementation of the `app_feature.Feature` interface.
+package app_feature_impl
diff --git a/infra/control/app_job/doc.go b/infra/control/app_job/doc.go
new file mode 100644
index 000000000..2c6526771
--- /dev/null
+++ b/infra/control/app_job/doc.go
@@ -0,0 +1,2 @@
+// Package app_job defines interfaces and structures for managing application jobs.
+package app_job
diff --git a/infra/control/app_job/historian.go b/infra/control/app_job/historian.go
index 6209dff4f..2833196c8 100644
--- a/infra/control/app_job/historian.go
+++ b/infra/control/app_job/historian.go
@@ -1,6 +1,6 @@
package app_job
type Historian interface {
- // Histories, that guarantee sorted by job id.
- Histories() (histories []History, err error)
+ // Histories, that guarantee sorted by job id.
+ Histories() (histories []History, err error)
}
diff --git a/infra/control/app_job/history.go b/infra/control/app_job/history.go
index 83b20c85a..1337ab0fd 100644
--- a/infra/control/app_job/history.go
+++ b/infra/control/app_job/history.go
@@ -1,9 +1,10 @@
package app_job
import (
- "github.com/watermint/toolbox/infra/control/app_workspace"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "time"
+ "time"
+
+ "github.com/watermint/toolbox/infra/control/app_workspace"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
type History interface {
diff --git a/infra/control/app_job/joblog.go b/infra/control/app_job/joblog.go
index e713afb80..d1d4f9fb2 100644
--- a/infra/control/app_job/joblog.go
+++ b/infra/control/app_job/joblog.go
@@ -1,14 +1,15 @@
package app_job
import (
- "encoding/json"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "github.com/watermint/toolbox/infra/control/app_opt"
- "github.com/watermint/toolbox/infra/control/app_workspace"
- "os"
- "path/filepath"
- "time"
+ "encoding/json"
+ "os"
+ "path/filepath"
+ "time"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/infra/control/app_opt"
+ "github.com/watermint/toolbox/infra/control/app_workspace"
)
type TimingLog interface {
diff --git a/infra/control/app_job/joblog_test.go b/infra/control/app_job/joblog_test.go
index 2ed300025..555cea48e 100644
--- a/infra/control/app_job/joblog_test.go
+++ b/infra/control/app_job/joblog_test.go
@@ -1,42 +1,42 @@
package app_job
import (
- "github.com/watermint/toolbox/infra/control/app_workspace"
- "testing"
- "time"
+ "github.com/watermint/toolbox/infra/control/app_workspace"
+ "testing"
+ "time"
)
func TestTimeFromLog(t *testing.T) {
- {
- ts := StartLog{}
- ts.TimeStart = "2020-07-02T14:52:45Z"
-
- if tm, ok := TimeFromLog(ts, ""); !ok || !tm.Equal(time.Unix(1593701565, 0)) {
- t.Error(tm, ok)
- }
- }
-
- {
- tf := ResultLog{}
- tf.TimeFinish = "2020-07-02T14:52:45Z"
-
- if tm, ok := TimeFromLog(tf, ""); !ok || !tm.Equal(time.Unix(1593701565, 0)) {
- t.Error(tm, ok)
- }
- }
-
- {
- now := time.Now().UTC().Truncate(time.Second)
- jobId := now.Format(app_workspace.JobIdFormat)
-
- if tm, ok := TimeFromLog(nil, jobId); !ok || !tm.Equal(now) {
- t.Error(tm, ok)
- }
- }
-
- {
- if tm, ok := TimeFromLog(nil, ""); ok {
- t.Error(tm, ok)
- }
- }
+ {
+ ts := StartLog{}
+ ts.TimeStart = "2020-07-02T14:52:45Z"
+
+ if tm, ok := TimeFromLog(ts, ""); !ok || !tm.Equal(time.Unix(1593701565, 0)) {
+ t.Error(tm, ok)
+ }
+ }
+
+ {
+ tf := ResultLog{}
+ tf.TimeFinish = "2020-07-02T14:52:45Z"
+
+ if tm, ok := TimeFromLog(tf, ""); !ok || !tm.Equal(time.Unix(1593701565, 0)) {
+ t.Error(tm, ok)
+ }
+ }
+
+ {
+ now := time.Now().UTC().Truncate(time.Second)
+ jobId := now.Format(app_workspace.JobIdFormat)
+
+ if tm, ok := TimeFromLog(nil, jobId); !ok || !tm.Equal(now) {
+ t.Error(tm, ok)
+ }
+ }
+
+ {
+ if tm, ok := TimeFromLog(nil, ""); ok {
+ t.Error(tm, ok)
+ }
+ }
}
diff --git a/infra/control/app_job_impl/doc.go b/infra/control/app_job_impl/doc.go
new file mode 100644
index 000000000..97c971dc6
--- /dev/null
+++ b/infra/control/app_job_impl/doc.go
@@ -0,0 +1,2 @@
+// Package app_job_impl provides concrete implementations for managing application jobs.
+package app_job_impl
diff --git a/infra/control/app_job_impl/historian.go b/infra/control/app_job_impl/historian.go
index be3185549..bd3a427cc 100644
--- a/infra/control/app_job_impl/historian.go
+++ b/infra/control/app_job_impl/historian.go
@@ -1,169 +1,169 @@
package app_job_impl
import (
- "os"
- "path/filepath"
- "sort"
- "strings"
-
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/model/mo_string"
- "github.com/watermint/toolbox/infra/control/app_job"
- "github.com/watermint/toolbox/infra/control/app_workspace"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/model/mo_string"
+ "github.com/watermint/toolbox/infra/control/app_job"
+ "github.com/watermint/toolbox/infra/control/app_workspace"
)
func NewHistorian(ws app_workspace.Workspace) app_job.Historian {
- return &Historian{ws: ws}
+ return &Historian{ws: ws}
}
type Historian struct {
- ws app_workspace.Workspace
+ ws app_workspace.Workspace
}
// Determine whether the path contains job history data or not.
func (z Historian) isHistory(jobIds []string) (app_job.History, bool) {
- h, found := newHistory(z.ws, jobIds)
- if !found {
- return nil, false
- }
- if logs, err := h.Logs(); err != nil {
- return nil, false
- } else {
- return h, len(logs) > 0
- }
+ h, found := newHistory(z.ws, jobIds)
+ if !found {
+ return nil, false
+ }
+ if logs, err := h.Logs(); err != nil {
+ return nil, false
+ } else {
+ return h, len(logs) > 0
+ }
}
func (z Historian) scanWorkspace(path string, parentJobId []string) (histories []app_job.History, err error) {
- l := esl.Default()
- sp := path
- histories = make([]app_job.History, 0)
- if len(parentJobId) > 0 {
- sp = filepath.Join(path, strings.Join(parentJobId, "/"))
- }
- l.Debug("Reading entries", esl.String("path", sp))
- entries, err := os.ReadDir(sp)
- if err != nil {
- l.Debug("Unable to read dir", esl.Error(err))
- return nil, err
- }
-
- for _, e := range entries {
- if !e.IsDir() {
- continue
- }
- switch e.Name() {
- case app_workspace.NameLogs,
- app_workspace.NameJobs,
- app_workspace.NameKvs,
- app_workspace.NameReport,
- app_workspace.NameTest:
- continue
- }
-
- jp := append(parentJobId, e.Name())
- if h, found := z.isHistory(jp); found {
- histories = append(histories, h)
- }
- children, err := z.scanWorkspace(path, jp)
- if err != nil {
- l.Debug("No job history found in child due to an error. Ignore", esl.Error(err))
- continue
- }
- histories = append(histories, children...)
- }
- return
+ l := esl.Default()
+ sp := path
+ histories = make([]app_job.History, 0)
+ if len(parentJobId) > 0 {
+ sp = filepath.Join(path, strings.Join(parentJobId, "/"))
+ }
+ l.Debug("Reading entries", esl.String("path", sp))
+ entries, err := os.ReadDir(sp)
+ if err != nil {
+ l.Debug("Unable to read dir", esl.Error(err))
+ return nil, err
+ }
+
+ for _, e := range entries {
+ if !e.IsDir() {
+ continue
+ }
+ switch e.Name() {
+ case app_workspace.NameLogs,
+ app_workspace.NameJobs,
+ app_workspace.NameKvs,
+ app_workspace.NameReport,
+ app_workspace.NameTest:
+ continue
+ }
+
+ jp := append(parentJobId, e.Name())
+ if h, found := z.isHistory(jp); found {
+ histories = append(histories, h)
+ }
+ children, err := z.scanWorkspace(path, jp)
+ if err != nil {
+ l.Debug("No job history found in child due to an error. Ignore", esl.Error(err))
+ continue
+ }
+ histories = append(histories, children...)
+ }
+ return
}
func (z Historian) scanOrphaned(path string) (histories []app_job.History, err error) {
- l := esl.Default().With(esl.String("path", path))
-
- histories = make([]app_job.History, 0)
- pls, err := os.Lstat(path)
- if err != nil || !pls.IsDir() {
- l.Debug("The path is not exist or a folder")
- return histories, err
- }
-
- his, ok := NewOrphanHistory(path)
- if ok {
- histories = append(histories, his)
- return histories, nil
- }
-
- entries, err := os.ReadDir(path)
- if err != nil {
- l.Debug("Unable to read a folder", esl.Error(err))
- return histories, err
- }
-
- for _, entry := range entries {
- if entry.IsDir() {
- p := filepath.Join(path, entry.Name())
- h2, err := z.scanOrphaned(p)
- if err == nil {
- l.Debug("Histories found under the path", esl.String("path2", p))
- histories = append(histories, h2...)
- }
- }
- }
- return histories, nil
+ l := esl.Default().With(esl.String("path", path))
+
+ histories = make([]app_job.History, 0)
+ pls, err := os.Lstat(path)
+ if err != nil || !pls.IsDir() {
+ l.Debug("The path is not exist or a folder")
+ return histories, err
+ }
+
+ his, ok := NewOrphanHistory(path)
+ if ok {
+ histories = append(histories, his)
+ return histories, nil
+ }
+
+ entries, err := os.ReadDir(path)
+ if err != nil {
+ l.Debug("Unable to read a folder", esl.Error(err))
+ return histories, err
+ }
+
+ for _, entry := range entries {
+ if entry.IsDir() {
+ p := filepath.Join(path, entry.Name())
+ h2, err := z.scanOrphaned(p)
+ if err == nil {
+ l.Debug("Histories found under the path", esl.String("path2", p))
+ histories = append(histories, h2...)
+ }
+ }
+ }
+ return histories, nil
}
func (z Historian) Histories() (histories []app_job.History, err error) {
- l := esl.Default()
-
- histories = make([]app_job.History, 0)
- path := filepath.Join(z.ws.Home(), app_workspace.NameJobs)
-
- l = l.With(esl.String("path", path))
-
- // scan 1: workspace history
- h, err1 := z.scanWorkspace(path, []string{})
- if err1 != nil || len(h) < 1 {
- l.Debug("unable to scan path", esl.Error(err1))
- // scan 2: orphaned history
- h2, err2 := z.scanOrphaned(z.ws.Home())
- if err2 != nil {
- l.Debug("Unable to scan log path", esl.Error(err2))
- return nil, err1
- } else {
- histories = append(histories, h2...)
- }
- } else {
- histories = append(histories, h...)
- }
-
- sort.Slice(histories, func(i, j int) bool {
- return strings.Compare(histories[i].JobId(), histories[j].JobId()) < 0
- })
-
- return histories, nil
+ l := esl.Default()
+
+ histories = make([]app_job.History, 0)
+ path := filepath.Join(z.ws.Home(), app_workspace.NameJobs)
+
+ l = l.With(esl.String("path", path))
+
+ // scan 1: workspace history
+ h, err1 := z.scanWorkspace(path, []string{})
+ if err1 != nil || len(h) < 1 {
+ l.Debug("unable to scan path", esl.Error(err1))
+ // scan 2: orphaned history
+ h2, err2 := z.scanOrphaned(z.ws.Home())
+ if err2 != nil {
+ l.Debug("Unable to scan log path", esl.Error(err2))
+ return nil, err1
+ } else {
+ histories = append(histories, h2...)
+ }
+ } else {
+ histories = append(histories, h...)
+ }
+
+ sort.Slice(histories, func(i, j int) bool {
+ return strings.Compare(histories[i].JobId(), histories[j].JobId()) < 0
+ })
+
+ return histories, nil
}
func GetHistories(path mo_string.OptionalString) (histories []app_job.History, err error) {
- l := esl.Default()
-
- home := ""
- if path.IsExists() {
- home = path.Value()
- }
-
- // default non transient workspace
- ws, err := app_workspace.NewWorkspace(home, false)
- if err != nil {
- return nil, err
- }
-
- historian := NewHistorian(ws)
- histories, err = historian.Histories()
- if err != nil {
- l.Debug("Unable to retrieve histories", esl.Error(err))
- return nil, err
- }
- if len(histories) < 1 {
- l.Debug("No log found", esl.Any("histories", histories))
- }
- l.Debug("Clean workspace", esl.String("historianJobPath", ws.Job()))
- _ = os.RemoveAll(ws.Job())
- return
+ l := esl.Default()
+
+ home := ""
+ if path.IsExists() {
+ home = path.Value()
+ }
+
+ // default non transient workspace
+ ws, err := app_workspace.NewWorkspace(home, false)
+ if err != nil {
+ return nil, err
+ }
+
+ historian := NewHistorian(ws)
+ histories, err = historian.Histories()
+ if err != nil {
+ l.Debug("Unable to retrieve histories", esl.Error(err))
+ return nil, err
+ }
+ if len(histories) < 1 {
+ l.Debug("No log found", esl.Any("histories", histories))
+ }
+ l.Debug("Clean workspace", esl.String("historianJobPath", ws.Job()))
+ _ = os.RemoveAll(ws.Job())
+ return
}
diff --git a/infra/control/app_job_impl/history.go b/infra/control/app_job_impl/history.go
index 08a5fca01..b44e78f80 100644
--- a/infra/control/app_job_impl/history.go
+++ b/infra/control/app_job_impl/history.go
@@ -1,216 +1,216 @@
package app_job_impl
import (
- "encoding/json"
- "os"
- "path/filepath"
- "sort"
- "strings"
- "time"
-
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/file/es_zip"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_catalogue"
- app2 "github.com/watermint/toolbox/infra/control/app_definitions"
- "github.com/watermint/toolbox/infra/control/app_job"
- "github.com/watermint/toolbox/infra/control/app_workspace"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "encoding/json"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+ "time"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/file/es_zip"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_catalogue"
+ app2 "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/infra/control/app_job"
+ "github.com/watermint/toolbox/infra/control/app_workspace"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
type HistoryMetadata struct {
- JobId string `json:"job_id"`
+ JobId string `json:"job_id"`
}
func parse(path string, model interface{}) error {
- content, err := os.ReadFile(path)
- if err != nil {
- return err
- }
- if err = json.Unmarshal(content, model); err != nil {
- return err
- }
- return nil
+ content, err := os.ReadFile(path)
+ if err != nil {
+ return err
+ }
+ if err = json.Unmarshal(content, model); err != nil {
+ return err
+ }
+ return nil
}
func parseByModel(path string, model interface{}) error {
- content, err := os.ReadFile(path)
- if err != nil {
- return err
- }
- if j, err := es_json.Parse(content); err != nil {
- return err
- } else {
- return j.Model(model)
- }
+ content, err := os.ReadFile(path)
+ if err != nil {
+ return err
+ }
+ if j, err := es_json.Parse(content); err != nil {
+ return err
+ } else {
+ return j.Model(model)
+ }
}
func newHistory(app app_workspace.Application, jobId []string) (h app_job.History, found bool) {
- l := esl.Default()
- start := &app_job.StartLog{}
- finish := &app_job.ResultLog{}
-
- fqj := filepath.Join(jobId...)
- ws, err := app_workspace.NewWorkspaceByJobPath(app, fqj)
- if err != nil {
- l.Debug("Unable to determine the path as job", esl.Error(err))
- return nil, false
- }
-
- startLogPath := filepath.Join(ws.Log(), app2.LogNameStart)
- finishLogPath := filepath.Join(ws.Log(), app2.LogNameFinish)
- if err := parseByModel(startLogPath, start); err != nil {
- l.Debug("Unable to load start log", esl.Error(err))
- //return nil, false
- }
- if err := parse(finishLogPath, finish); err != nil {
- l.Debug("Unable to load finish log", esl.Error(err))
- }
-
- return &History{
- ws: ws,
- jobId: fqj,
- nested: len(jobId) > 1,
- start: start,
- finish: finish,
- }, true
+ l := esl.Default()
+ start := &app_job.StartLog{}
+ finish := &app_job.ResultLog{}
+
+ fqj := filepath.Join(jobId...)
+ ws, err := app_workspace.NewWorkspaceByJobPath(app, fqj)
+ if err != nil {
+ l.Debug("Unable to determine the path as job", esl.Error(err))
+ return nil, false
+ }
+
+ startLogPath := filepath.Join(ws.Log(), app2.LogNameStart)
+ finishLogPath := filepath.Join(ws.Log(), app2.LogNameFinish)
+ if err := parseByModel(startLogPath, start); err != nil {
+ l.Debug("Unable to load start log", esl.Error(err))
+ //return nil, false
+ }
+ if err := parse(finishLogPath, finish); err != nil {
+ l.Debug("Unable to load finish log", esl.Error(err))
+ }
+
+ return &History{
+ ws: ws,
+ jobId: fqj,
+ nested: len(jobId) > 1,
+ start: start,
+ finish: finish,
+ }, true
}
func getRecipe(name string) (r rc_recipe.Spec, found bool) {
- cat := app_catalogue.Current()
- _, r, _, err := cat.RootGroup().Select(strings.Split(name, " "))
- if err != nil {
- return nil, false
- }
- return r, true
+ cat := app_catalogue.Current()
+ _, r, _, err := cat.RootGroup().Select(strings.Split(name, " "))
+ if err != nil {
+ return nil, false
+ }
+ return r, true
}
func getLogs(path string) (logs []app_job.LogFile, err error) {
- l := esl.Default()
- logs = make([]app_job.LogFile, 0)
- entries, err := os.ReadDir(path)
- if err != nil {
- l.Debug("")
- return nil, err
- }
-
- for _, entry := range entries {
- if entry.IsDir() {
- continue
- }
- p := filepath.Join(path, entry.Name())
- lf, err := newLogFile(p)
- if err != nil {
- l.Debug("the file is not a log", esl.Error(err), esl.String("name", entry.Name()))
- continue
- }
-
- logs = append(logs, lf)
- }
- sort.Slice(logs, func(i, j int) bool {
- return strings.Compare(logs[i].Name(), logs[j].Name()) < 0
- })
- l.Debug("logs found", esl.Int("entries", len(logs)))
- return
+ l := esl.Default()
+ logs = make([]app_job.LogFile, 0)
+ entries, err := os.ReadDir(path)
+ if err != nil {
+ l.Debug("")
+ return nil, err
+ }
+
+ for _, entry := range entries {
+ if entry.IsDir() {
+ continue
+ }
+ p := filepath.Join(path, entry.Name())
+ lf, err := newLogFile(p)
+ if err != nil {
+ l.Debug("the file is not a log", esl.Error(err), esl.String("name", entry.Name()))
+ continue
+ }
+
+ logs = append(logs, lf)
+ }
+ sort.Slice(logs, func(i, j int) bool {
+ return strings.Compare(logs[i].Name(), logs[j].Name()) < 0
+ })
+ l.Debug("logs found", esl.Int("entries", len(logs)))
+ return
}
type History struct {
- ws app_workspace.Workspace
- jobId string
- nested bool
- start *app_job.StartLog
- finish *app_job.ResultLog
+ ws app_workspace.Workspace
+ jobId string
+ nested bool
+ start *app_job.StartLog
+ finish *app_job.ResultLog
}
func (z History) Job() app_workspace.Job {
- return z.ws
+ return z.ws
}
func (z History) ResultLog() app_job.ResultLog {
- return *z.finish
+ return *z.finish
}
func (z History) StartLog() app_job.StartLog {
- return *z.start
+ return *z.start
}
func (z History) IsOrphaned() bool {
- return false
+ return false
}
func (z History) IsNested() bool {
- return z.nested
+ return z.nested
}
func (z History) JobPath() string {
- return z.ws.Job()
+ return z.ws.Job()
}
func (z History) JobId() string {
- return z.jobId
+ return z.jobId
}
func (z History) RecipeName() string {
- return z.start.Name
+ return z.start.Name
}
func (z History) Recipe() (r rc_recipe.Spec, found bool) {
- return getRecipe(z.start.Name)
+ return getRecipe(z.start.Name)
}
func (z History) AppName() string {
- return z.start.AppName
+ return z.start.AppName
}
func (z History) AppVersion() string {
- return z.start.AppVersion
+ return z.start.AppVersion
}
func (z History) TimeStart() (t time.Time, found bool) {
- return app_job.TimeFromLog(z.start, z.jobId)
+ return app_job.TimeFromLog(z.start, z.jobId)
}
func (z History) TimeFinish() (t time.Time, found bool) {
- return app_job.TimeFromLog(z.finish, "")
+ return app_job.TimeFromLog(z.finish, "")
}
func (z History) Delete() error {
- l := esl.Default()
- logPath := filepath.Join(z.ws.Home(), "jobs", z.jobId)
- l.Debug("Trying remove history", esl.String("path", logPath))
- if err := os.RemoveAll(logPath); err != nil {
- l.Debug("Unable to remove", esl.Error(err))
- return err
- }
- return nil
+ l := esl.Default()
+ logPath := filepath.Join(z.ws.Home(), "jobs", z.jobId)
+ l.Debug("Trying remove history", esl.String("path", logPath))
+ if err := os.RemoveAll(logPath); err != nil {
+ l.Debug("Unable to remove", esl.Error(err))
+ return err
+ }
+ return nil
}
func (z History) Archive() (path string, err error) {
- l := esl.Default()
- logPath := filepath.Join(z.ws.Home(), "jobs", z.jobId)
- arcPath := filepath.Join(z.ws.Home(), "jobs", z.jobId+".zip")
-
- meta := &HistoryMetadata{JobId: z.jobId}
- metaMarshal, err := json.Marshal(meta)
- if err != nil {
- metaMarshal = []byte("{}")
- }
-
- if err := es_zip.CompressPath(arcPath, logPath, string(metaMarshal)); err != nil {
- l.Debug("Unable to create archive", esl.Error(err), esl.String("arcPath", arcPath))
- return "", err
- }
-
- l.Debug("Try removing processed path", esl.String("logPath", logPath))
- err = os.RemoveAll(logPath)
- l.Debug("Remove result", esl.Error(err))
- if err != nil {
- l.Debug("Unable to remove", esl.Error(err))
- return "", err
- }
- return arcPath, nil
+ l := esl.Default()
+ logPath := filepath.Join(z.ws.Home(), "jobs", z.jobId)
+ arcPath := filepath.Join(z.ws.Home(), "jobs", z.jobId+".zip")
+
+ meta := &HistoryMetadata{JobId: z.jobId}
+ metaMarshal, err := json.Marshal(meta)
+ if err != nil {
+ metaMarshal = []byte("{}")
+ }
+
+ if err := es_zip.CompressPath(arcPath, logPath, string(metaMarshal)); err != nil {
+ l.Debug("Unable to create archive", esl.Error(err), esl.String("arcPath", arcPath))
+ return "", err
+ }
+
+ l.Debug("Try removing processed path", esl.String("logPath", logPath))
+ err = os.RemoveAll(logPath)
+ l.Debug("Remove result", esl.Error(err))
+ if err != nil {
+ l.Debug("Unable to remove", esl.Error(err))
+ return "", err
+ }
+ return arcPath, nil
}
func (z History) Logs() (logs []app_job.LogFile, err error) {
- return getLogs(z.ws.Log())
+ return getLogs(z.ws.Log())
}
diff --git a/infra/control/app_job_impl/history_test.go b/infra/control/app_job_impl/history_test.go
index 70487dcc4..6388285a8 100644
--- a/infra/control/app_job_impl/history_test.go
+++ b/infra/control/app_job_impl/history_test.go
@@ -1,170 +1,170 @@
package app_job_impl
import (
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_budget"
- "github.com/watermint/toolbox/infra/control/app_job"
- "github.com/watermint/toolbox/infra/control/app_opt"
- "github.com/watermint/toolbox/infra/control/app_workspace"
- "github.com/watermint/toolbox/infra/recipe/rc_spec"
- "github.com/watermint/toolbox/infra/ui/app_msg_container_impl"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "github.com/watermint/toolbox/quality/infra/qt_file"
- "os"
- "testing"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_budget"
+ "github.com/watermint/toolbox/infra/control/app_job"
+ "github.com/watermint/toolbox/infra/control/app_opt"
+ "github.com/watermint/toolbox/infra/control/app_workspace"
+ "github.com/watermint/toolbox/infra/recipe/rc_spec"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container_impl"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
+ "github.com/watermint/toolbox/quality/infra/qt_file"
+ "os"
+ "testing"
)
func TestHistory(t *testing.T) {
- qt_file.TestWithTestFolder(t, "launch", false, func(path string) {
- wb, err := app_workspace.NewBundle(path, app_budget.BudgetUnlimited, esl.LevelInfo, false, false)
- if err != nil {
- t.Error(err)
- return
- }
- mc := app_msg_container_impl.NewSingleWithMessagesForTest(map[string]string{})
- ui := app_ui.NewDiscard(mc, wb.Logger().Logger())
- spec := rc_spec.New(&AppJobTestRecipe{})
- launcher := NewLauncher(ui, wb, app_opt.Default(), spec)
- ctl, err := launcher.Up()
- if err != nil {
- t.Error(err)
- }
- ctl.Log().Debug("Hello")
- launcher.Down(nil, ctl)
-
- his := NewHistorian(wb.Workspace())
- jobs, err := his.Histories()
- if err != nil {
- t.Error(err)
- }
- if len(jobs) != 1 {
- t.Error(jobs)
- }
-
- job := jobs[0]
- if job.JobId() == "" {
- t.Error(job.JobId())
- }
-
- // should not found, because the recipe is not in the catalogue
- if r, found := job.Recipe(); found {
- t.Error(r, found)
- }
-
- if job.IsOrphaned() {
- t.Error(job.IsOrphaned())
- }
- if job.AppName() == "" {
- t.Error(job.AppName())
- }
- if job.AppVersion() == "" {
- t.Error(job.AppVersion())
- }
- if job.JobPath() == "" {
- t.Error(job.JobPath())
- }
- if job.RecipeName() != "github.com watermint toolbox infra control app_job_impl app_job_test_recipe" {
- t.Error(job.RecipeName())
- }
- if v, found := job.TimeStart(); !found {
- t.Error(v, found)
- }
- if v, found := job.TimeFinish(); !found {
- t.Error(v, found)
- }
- })
+ qt_file.TestWithTestFolder(t, "launch", false, func(path string) {
+ wb, err := app_workspace.NewBundle(path, app_budget.BudgetUnlimited, esl.LevelInfo, false, false)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ mc := app_msg_container_impl.NewSingleWithMessagesForTest(map[string]string{})
+ ui := app_ui.NewDiscard(mc, wb.Logger().Logger())
+ spec := rc_spec.New(&AppJobTestRecipe{})
+ launcher := NewLauncher(ui, wb, app_opt.Default(), spec)
+ ctl, err := launcher.Up()
+ if err != nil {
+ t.Error(err)
+ }
+ ctl.Log().Debug("Hello")
+ launcher.Down(nil, ctl)
+
+ his := NewHistorian(wb.Workspace())
+ jobs, err := his.Histories()
+ if err != nil {
+ t.Error(err)
+ }
+ if len(jobs) != 1 {
+ t.Error(jobs)
+ }
+
+ job := jobs[0]
+ if job.JobId() == "" {
+ t.Error(job.JobId())
+ }
+
+ // should not found, because the recipe is not in the catalogue
+ if r, found := job.Recipe(); found {
+ t.Error(r, found)
+ }
+
+ if job.IsOrphaned() {
+ t.Error(job.IsOrphaned())
+ }
+ if job.AppName() == "" {
+ t.Error(job.AppName())
+ }
+ if job.AppVersion() == "" {
+ t.Error(job.AppVersion())
+ }
+ if job.JobPath() == "" {
+ t.Error(job.JobPath())
+ }
+ if job.RecipeName() != "github.com watermint toolbox infra control app_job_impl app_job_test_recipe" {
+ t.Error(job.RecipeName())
+ }
+ if v, found := job.TimeStart(); !found {
+ t.Error(v, found)
+ }
+ if v, found := job.TimeFinish(); !found {
+ t.Error(v, found)
+ }
+ })
}
func TestHistory_Archive(t *testing.T) {
- qt_file.TestWithTestFolder(t, "launch", false, func(path string) {
- wb, err := app_workspace.NewBundle(path, app_budget.BudgetUnlimited, esl.LevelInfo, false, false)
- if err != nil {
- t.Error(err)
- return
- }
- mc := app_msg_container_impl.NewSingleWithMessagesForTest(map[string]string{})
- ui := app_ui.NewDiscard(mc, wb.Logger().Logger())
- spec := rc_spec.New(&AppJobTestRecipe{})
- launcher := NewLauncher(ui, wb, app_opt.Default(), spec)
- ctl, err := launcher.Up()
- if err != nil {
- t.Error(err)
- }
- launcher.Down(nil, ctl)
-
- his := NewHistorian(wb.Workspace())
- jobs, err := his.Histories()
- if err != nil {
- t.Error(err)
- }
- if len(jobs) != 1 {
- t.Error(jobs)
- }
-
- job := jobs[0]
-
- // the path should exist
- if f, err := os.Lstat(job.JobPath()); err != nil && f.IsDir() {
- t.Error(err)
- }
-
- jo := job.(app_job.HistoryOperation)
-
- if arcPath, err := jo.Archive(); err != nil {
- t.Error(path, err)
- } else if f, err := os.Lstat(arcPath); err != nil && !f.IsDir() {
- t.Error(f, err)
- }
-
- // the path should not exist
- if _, err := os.Lstat(job.JobPath()); err == nil {
- t.Error(err)
- }
- })
+ qt_file.TestWithTestFolder(t, "launch", false, func(path string) {
+ wb, err := app_workspace.NewBundle(path, app_budget.BudgetUnlimited, esl.LevelInfo, false, false)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ mc := app_msg_container_impl.NewSingleWithMessagesForTest(map[string]string{})
+ ui := app_ui.NewDiscard(mc, wb.Logger().Logger())
+ spec := rc_spec.New(&AppJobTestRecipe{})
+ launcher := NewLauncher(ui, wb, app_opt.Default(), spec)
+ ctl, err := launcher.Up()
+ if err != nil {
+ t.Error(err)
+ }
+ launcher.Down(nil, ctl)
+
+ his := NewHistorian(wb.Workspace())
+ jobs, err := his.Histories()
+ if err != nil {
+ t.Error(err)
+ }
+ if len(jobs) != 1 {
+ t.Error(jobs)
+ }
+
+ job := jobs[0]
+
+ // the path should exist
+ if f, err := os.Lstat(job.JobPath()); err != nil && f.IsDir() {
+ t.Error(err)
+ }
+
+ jo := job.(app_job.HistoryOperation)
+
+ if arcPath, err := jo.Archive(); err != nil {
+ t.Error(path, err)
+ } else if f, err := os.Lstat(arcPath); err != nil && !f.IsDir() {
+ t.Error(f, err)
+ }
+
+ // the path should not exist
+ if _, err := os.Lstat(job.JobPath()); err == nil {
+ t.Error(err)
+ }
+ })
}
func TestHistory_Delete(t *testing.T) {
- qt_file.TestWithTestFolder(t, "launch", false, func(path string) {
- wb, err := app_workspace.NewBundle(path, app_budget.BudgetUnlimited, esl.LevelInfo, false, false)
- if err != nil {
- t.Error(err)
- return
- }
- mc := app_msg_container_impl.NewSingleWithMessagesForTest(map[string]string{})
- ui := app_ui.NewDiscard(mc, wb.Logger().Logger())
- spec := rc_spec.New(&AppJobTestRecipe{})
- launcher := NewLauncher(ui, wb, app_opt.Default(), spec)
- ctl, err := launcher.Up()
- if err != nil {
- t.Error(err)
- }
- launcher.Down(nil, ctl)
-
- his := NewHistorian(wb.Workspace())
- jobs, err := his.Histories()
- if err != nil {
- t.Error(err)
- }
- if len(jobs) != 1 {
- t.Error(jobs)
- }
-
- job := jobs[0]
-
- // the path should exist
- if f, err := os.Lstat(job.JobPath()); err != nil && f.IsDir() {
- t.Error(err)
- }
-
- jo := job.(app_job.HistoryOperation)
-
- if err := jo.Delete(); err != nil {
- t.Error(path, err)
- }
-
- // the path should not exist
- if _, err := os.Lstat(job.JobPath()); err == nil {
- t.Error(err)
- }
- })
+ qt_file.TestWithTestFolder(t, "launch", false, func(path string) {
+ wb, err := app_workspace.NewBundle(path, app_budget.BudgetUnlimited, esl.LevelInfo, false, false)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ mc := app_msg_container_impl.NewSingleWithMessagesForTest(map[string]string{})
+ ui := app_ui.NewDiscard(mc, wb.Logger().Logger())
+ spec := rc_spec.New(&AppJobTestRecipe{})
+ launcher := NewLauncher(ui, wb, app_opt.Default(), spec)
+ ctl, err := launcher.Up()
+ if err != nil {
+ t.Error(err)
+ }
+ launcher.Down(nil, ctl)
+
+ his := NewHistorian(wb.Workspace())
+ jobs, err := his.Histories()
+ if err != nil {
+ t.Error(err)
+ }
+ if len(jobs) != 1 {
+ t.Error(jobs)
+ }
+
+ job := jobs[0]
+
+ // the path should exist
+ if f, err := os.Lstat(job.JobPath()); err != nil && f.IsDir() {
+ t.Error(err)
+ }
+
+ jo := job.(app_job.HistoryOperation)
+
+ if err := jo.Delete(); err != nil {
+ t.Error(path, err)
+ }
+
+ // the path should not exist
+ if _, err := os.Lstat(job.JobPath()); err == nil {
+ t.Error(err)
+ }
+ })
}
diff --git a/infra/control/app_job_impl/launcher.go b/infra/control/app_job_impl/launcher.go
index fee4af93c..d1c89bc3a 100644
--- a/infra/control/app_job_impl/launcher.go
+++ b/infra/control/app_job_impl/launcher.go
@@ -1,185 +1,185 @@
package app_job_impl
import (
- "github.com/watermint/toolbox/essentials/api/api_auth"
- "github.com/watermint/toolbox/essentials/api/api_auth_repo"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/log/stats/es_memory"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/control/app_control_impl"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "github.com/watermint/toolbox/infra/control/app_feature"
- "github.com/watermint/toolbox/infra/control/app_feature_impl"
- "github.com/watermint/toolbox/infra/control/app_job"
- "github.com/watermint/toolbox/infra/control/app_opt"
- "github.com/watermint/toolbox/infra/control/app_queue"
- "github.com/watermint/toolbox/infra/control/app_workspace"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/report/rp_artifact"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "os"
- "time"
+ "github.com/watermint/toolbox/essentials/api/api_auth"
+ "github.com/watermint/toolbox/essentials/api/api_auth_repo"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/log/stats/es_memory"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/control/app_control_impl"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/infra/control/app_feature"
+ "github.com/watermint/toolbox/infra/control/app_feature_impl"
+ "github.com/watermint/toolbox/infra/control/app_job"
+ "github.com/watermint/toolbox/infra/control/app_opt"
+ "github.com/watermint/toolbox/infra/control/app_queue"
+ "github.com/watermint/toolbox/infra/control/app_workspace"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/report/rp_artifact"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
+ "os"
+ "time"
)
type MsgLauncher struct {
- ElapsedTimeOnEnd app_msg.Message
+ ElapsedTimeOnEnd app_msg.Message
}
var (
- MLauncher = app_msg.Apply(&MsgLauncher{}).(*MsgLauncher)
+ MLauncher = app_msg.Apply(&MsgLauncher{}).(*MsgLauncher)
)
func NewLauncher(ui app_ui.UI, wb app_workspace.Bundle, com app_opt.CommonOpts, rcp rc_recipe.Spec) app_job.Launcher {
- return &launchImpl{
- ui: ui,
- wb: wb,
- com: com,
- rcp: rcp,
- }
+ return &launchImpl{
+ ui: ui,
+ wb: wb,
+ com: com,
+ rcp: rcp,
+ }
}
type launchImpl struct {
- ui app_ui.UI
- wb app_workspace.Bundle
- com app_opt.CommonOpts
- rcp rc_recipe.Spec
+ ui app_ui.UI
+ wb app_workspace.Bundle
+ com app_opt.CommonOpts
+ rcp rc_recipe.Spec
}
func (z launchImpl) recordStartLog(ctl app_control.Control) error {
- l := ctl.Log()
- l.Debug("Capture recipe values")
- rv, err := z.rcp.Capture(ctl)
- if err != nil {
- l.Debug("Unable to capture recipe values", esl.Error(err))
- return err
- }
-
- sl := app_job.StartLog{
- Name: z.rcp.CliPath(),
- ValueObject: z.rcp.Debug(),
- CommonOpts: z.com,
- TimeStart: time.Now().Format(time.RFC3339),
- JobId: ctl.Workspace().JobId(),
- AppName: app_definitions.Name,
- AppHash: app_definitions.BuildInfo.Hash,
- AppVersion: app_definitions.BuildId,
- RecipeValues: rv,
- }
- return sl.Write(z.wb.Workspace())
+ l := ctl.Log()
+ l.Debug("Capture recipe values")
+ rv, err := z.rcp.Capture(ctl)
+ if err != nil {
+ l.Debug("Unable to capture recipe values", esl.Error(err))
+ return err
+ }
+
+ sl := app_job.StartLog{
+ Name: z.rcp.CliPath(),
+ ValueObject: z.rcp.Debug(),
+ CommonOpts: z.com,
+ TimeStart: time.Now().Format(time.RFC3339),
+ JobId: ctl.Workspace().JobId(),
+ AppName: app_definitions.Name,
+ AppHash: app_definitions.BuildInfo.Hash,
+ AppVersion: app_definitions.BuildId,
+ RecipeValues: rv,
+ }
+ return sl.Write(z.wb.Workspace())
}
func (z launchImpl) recordResultLog(err error) error {
- errText := ""
- if err != nil {
- errText = err.Error()
- }
- rl := app_job.ResultLog{
- Success: err == nil,
- TimeFinish: time.Now().Format(time.RFC3339),
- Error: errText,
- }
- return rl.Write(z.wb.Workspace())
+ errText := ""
+ if err != nil {
+ errText = err.Error()
+ }
+ rl := app_job.ResultLog{
+ Success: err == nil,
+ TimeFinish: time.Now().Format(time.RFC3339),
+ Error: errText,
+ }
+ return rl.Write(z.wb.Workspace())
}
func (z launchImpl) prepAuthDatabase(fe app_feature.Feature) (repo api_auth.Repository, err error) {
- // returns in memory database
- if fe.IsSecure() {
- return api_auth_repo.NewInMemory()
- }
- if fe.IsTransient() && fe.IsDefaultPathAuthRepository() {
- return api_auth_repo.NewInMemory()
- }
-
- return api_auth_repo.NewPersistent(fe.PathAuthRepository())
+ // returns in memory database
+ if fe.IsSecure() {
+ return api_auth_repo.NewInMemory()
+ }
+ if fe.IsTransient() && fe.IsDefaultPathAuthRepository() {
+ return api_auth_repo.NewInMemory()
+ }
+
+ return api_auth_repo.NewPersistent(fe.PathAuthRepository())
}
func (z launchImpl) Up() (ctl app_control.Control, err error) {
- lg := z.wb.Logger().Logger()
- sm := z.wb.Summary().Logger()
- st := z.wb.Stats().Logger()
- fe := app_feature_impl.NewFeature(z.com, z.wb.Workspace(), z.rcp.IsTransient())
-
- esl.SetStats(st)
-
- seq, er := app_queue.NewSequence(lg, fe, z.ui, z.wb)
- ar, err := z.prepAuthDatabase(fe)
- if err != nil {
- return nil, err
- }
- ctl = app_control_impl.New(z.wb, z.ui, fe, seq, ar, er)
-
- if err := er.Up(ctl); err != nil {
- return nil, err
- }
-
- if ctl.Feature().IsTransient() || ctl.Feature().IsSkipLogging() {
- _, err = z.rcp.Capture(ctl)
- return ctl, err
- }
-
- if err := z.recordStartLog(ctl); err != nil {
- return nil, err
- }
-
- // Launch monitor
- es_memory.LaunchReporting(st)
-
- sm.Debug("Up completed",
- esl.String("name", app_definitions.Name),
- esl.String("ver", app_definitions.BuildId),
- esl.String("hash", app_definitions.BuildInfo.Hash),
- esl.String("recipe", z.rcp.CliPath()),
- )
-
- return ctl, nil
+ lg := z.wb.Logger().Logger()
+ sm := z.wb.Summary().Logger()
+ st := z.wb.Stats().Logger()
+ fe := app_feature_impl.NewFeature(z.com, z.wb.Workspace(), z.rcp.IsTransient())
+
+ esl.SetStats(st)
+
+ seq, er := app_queue.NewSequence(lg, fe, z.ui, z.wb)
+ ar, err := z.prepAuthDatabase(fe)
+ if err != nil {
+ return nil, err
+ }
+ ctl = app_control_impl.New(z.wb, z.ui, fe, seq, ar, er)
+
+ if err := er.Up(ctl); err != nil {
+ return nil, err
+ }
+
+ if ctl.Feature().IsTransient() || ctl.Feature().IsSkipLogging() {
+ _, err = z.rcp.Capture(ctl)
+ return ctl, err
+ }
+
+ if err := z.recordStartLog(ctl); err != nil {
+ return nil, err
+ }
+
+ // Launch monitor
+ es_memory.LaunchReporting(st)
+
+ sm.Debug("Up completed",
+ esl.String("name", app_definitions.Name),
+ esl.String("ver", app_definitions.BuildId),
+ esl.String("hash", app_definitions.BuildInfo.Hash),
+ esl.String("recipe", z.rcp.CliPath()),
+ )
+
+ return ctl, nil
}
func (z launchImpl) Down(err error, ctl app_control.Control) {
- if ctl.Feature().IsTransient() {
- return
- }
+ if ctl.Feature().IsTransient() {
+ return
+ }
- sm := ctl.WorkBundle().Summary().Logger()
- ui := ctl.UI()
- rmJobData := z.com.ShouldDeleteJobData(err)
+ sm := ctl.WorkBundle().Summary().Logger()
+ ui := ctl.UI()
+ rmJobData := z.com.ShouldDeleteJobData(err)
- if cc, ok := ctl.(app_control.ControlCloser); ok {
- cc.Close()
- }
+ if cc, ok := ctl.(app_control.ControlCloser); ok {
+ cc.Close()
+ }
- if !rmJobData {
- artifacts := rp_artifact.Artifacts(ctl.Workspace())
- for _, artifact := range artifacts {
- ui.Link(artifact)
- }
- }
+ if !rmJobData {
+ artifacts := rp_artifact.Artifacts(ctl.Workspace())
+ for _, artifact := range artifacts {
+ ui.Link(artifact)
+ }
+ }
- // Dump stats
- es_memory.DumpMemStats(sm)
+ // Dump stats
+ es_memory.DumpMemStats(sm)
- if !ctl.Feature().IsSkipLogging() {
- _ = z.recordResultLog(err)
- }
+ if !ctl.Feature().IsSkipLogging() {
+ _ = z.recordResultLog(err)
+ }
- timeEnd := time.Now()
- elapsedTime := timeEnd.Sub(z.wb.Workspace().JobStartTime()).Truncate(time.Millisecond)
+ timeEnd := time.Now()
+ elapsedTime := timeEnd.Sub(z.wb.Workspace().JobStartTime()).Truncate(time.Millisecond)
- ui.Progress(MLauncher.ElapsedTimeOnEnd.With("Duration", elapsedTime.String()))
+ ui.Progress(MLauncher.ElapsedTimeOnEnd.With("Duration", elapsedTime.String()))
- sm.Debug("Down completed", esl.Error(err), esl.Bool("rmJobData", rmJobData))
+ sm.Debug("Down completed", esl.Error(err), esl.Bool("rmJobData", rmJobData))
- // Close work bundle
- _ = z.wb.Close()
+ // Close work bundle
+ _ = z.wb.Close()
- if rmJobData {
- z.deleteJobData()
- }
+ if rmJobData {
+ z.deleteJobData()
+ }
}
func (z launchImpl) deleteJobData() {
- path := z.wb.Workspace().Job()
- l := esl.ConsoleOnly()
- l.Debug("Remove job data", esl.String("jobPath", path))
- _ = os.RemoveAll(path)
+ path := z.wb.Workspace().Job()
+ l := esl.ConsoleOnly()
+ l.Debug("Remove job data", esl.String("jobPath", path))
+ _ = os.RemoveAll(path)
}
diff --git a/infra/control/app_job_impl/launcher_test.go b/infra/control/app_job_impl/launcher_test.go
index 90403cfd3..009a803fb 100644
--- a/infra/control/app_job_impl/launcher_test.go
+++ b/infra/control/app_job_impl/launcher_test.go
@@ -1,16 +1,16 @@
package app_job_impl
import (
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_budget"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/control/app_opt"
- "github.com/watermint/toolbox/infra/control/app_workspace"
- "github.com/watermint/toolbox/infra/recipe/rc_spec"
- "github.com/watermint/toolbox/infra/ui/app_msg_container_impl"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "github.com/watermint/toolbox/quality/infra/qt_file"
- "testing"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_budget"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/control/app_opt"
+ "github.com/watermint/toolbox/infra/control/app_workspace"
+ "github.com/watermint/toolbox/infra/recipe/rc_spec"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container_impl"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
+ "github.com/watermint/toolbox/quality/infra/qt_file"
+ "testing"
)
type AppJobTestRecipe struct {
@@ -20,28 +20,28 @@ func (z AppJobTestRecipe) Preset() {
}
func (z AppJobTestRecipe) Exec(c app_control.Control) error {
- return nil
+ return nil
}
func (z AppJobTestRecipe) Test(c app_control.Control) error {
- return nil
+ return nil
}
func TestLaunchImpl_UpDown(t *testing.T) {
- qt_file.TestWithTestFolder(t, "launch", false, func(path string) {
- wb, err := app_workspace.NewBundle(path, app_budget.BudgetUnlimited, esl.LevelInfo, false, false)
- if err != nil {
- t.Error(err)
- return
- }
- mc := app_msg_container_impl.NewSingleWithMessagesForTest(map[string]string{})
- ui := app_ui.NewDiscard(mc, wb.Logger().Logger())
- spec := rc_spec.New(&AppJobTestRecipe{})
- launcher := NewLauncher(ui, wb, app_opt.Default(), spec)
- ctl, err := launcher.Up()
- if err != nil {
- t.Error(err)
- }
- launcher.Down(nil, ctl)
- })
+ qt_file.TestWithTestFolder(t, "launch", false, func(path string) {
+ wb, err := app_workspace.NewBundle(path, app_budget.BudgetUnlimited, esl.LevelInfo, false, false)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ mc := app_msg_container_impl.NewSingleWithMessagesForTest(map[string]string{})
+ ui := app_ui.NewDiscard(mc, wb.Logger().Logger())
+ spec := rc_spec.New(&AppJobTestRecipe{})
+ launcher := NewLauncher(ui, wb, app_opt.Default(), spec)
+ ctl, err := launcher.Up()
+ if err != nil {
+ t.Error(err)
+ }
+ launcher.Down(nil, ctl)
+ })
}
diff --git a/infra/control/app_job_impl/logfile.go b/infra/control/app_job_impl/logfile.go
index 0b9c4fd30..2db0ad070 100644
--- a/infra/control/app_job_impl/logfile.go
+++ b/infra/control/app_job_impl/logfile.go
@@ -1,137 +1,137 @@
package app_job_impl
import (
- "compress/gzip"
- "errors"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_job"
- "io"
- "os"
- "path/filepath"
- "strings"
+ "compress/gzip"
+ "errors"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_job"
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
)
var (
- ErrorFileIsNotALog = errors.New("the file is not a log")
+ ErrorFileIsNotALog = errors.New("the file is not a log")
)
func newLogFile(path string) (app_job.LogFile, error) {
- basename := filepath.Base(path)
- lft, found := logFileTypeFromBasename(basename)
- if !found {
- return nil, ErrorFileIsNotALog
- }
-
- lbn := strings.ToLower(basename)
- switch {
- case strings.HasSuffix(lbn, ".log"):
- return &logFileImpl{
- path: path,
- fileType: lft,
- basename: basename,
- compressed: false,
- }, nil
- case strings.HasSuffix(lbn, ".log.gz"):
- return &logFileImpl{
- path: path,
- fileType: lft,
- basename: basename,
- compressed: true,
- }, nil
- }
-
- return nil, ErrorFileIsNotALog
+ basename := filepath.Base(path)
+ lft, found := logFileTypeFromBasename(basename)
+ if !found {
+ return nil, ErrorFileIsNotALog
+ }
+
+ lbn := strings.ToLower(basename)
+ switch {
+ case strings.HasSuffix(lbn, ".log"):
+ return &logFileImpl{
+ path: path,
+ fileType: lft,
+ basename: basename,
+ compressed: false,
+ }, nil
+ case strings.HasSuffix(lbn, ".log.gz"):
+ return &logFileImpl{
+ path: path,
+ fileType: lft,
+ basename: basename,
+ compressed: true,
+ }, nil
+ }
+
+ return nil, ErrorFileIsNotALog
}
func logFileTypeFromBasename(basename string) (lft app_job.LogFileType, found bool) {
- name := strings.ToLower(basename)
- switch {
- case strings.HasPrefix(name, string(app_job.LogFileTypeToolbox)):
- return app_job.LogFileTypeToolbox, true
- case strings.HasPrefix(name, string(app_job.LogFileTypeCapture)):
- return app_job.LogFileTypeCapture, true
- case strings.HasPrefix(name, string(app_job.LogFileTypeSummary)):
- return app_job.LogFileTypeSummary, true
- }
- return "", false
+ name := strings.ToLower(basename)
+ switch {
+ case strings.HasPrefix(name, string(app_job.LogFileTypeToolbox)):
+ return app_job.LogFileTypeToolbox, true
+ case strings.HasPrefix(name, string(app_job.LogFileTypeCapture)):
+ return app_job.LogFileTypeCapture, true
+ case strings.HasPrefix(name, string(app_job.LogFileTypeSummary)):
+ return app_job.LogFileTypeSummary, true
+ }
+ return "", false
}
type logFileImpl struct {
- path string
- fileType app_job.LogFileType
- basename string
- compressed bool
+ path string
+ fileType app_job.LogFileType
+ basename string
+ compressed bool
}
func (z logFileImpl) Type() app_job.LogFileType {
- return z.fileType
+ return z.fileType
}
func (z logFileImpl) Name() string {
- return z.basename
+ return z.basename
}
func (z logFileImpl) Path() string {
- return z.path
+ return z.path
}
func (z logFileImpl) IsCompressed() bool {
- return z.compressed
+ return z.compressed
}
func (z logFileImpl) copyToCompressed(writer io.Writer) error {
- l := esl.Default().With(esl.String("path", z.path))
- f, err := os.Open(z.path)
- if err != nil {
- l.Debug("unable to open the log file", esl.Error(err))
- return err
- }
- defer func() {
- _ = f.Close()
- }()
-
- g, err := gzip.NewReader(f)
- if err != nil {
- l.Debug("unable to create gzip reader", esl.Error(err))
- return err
- }
- defer func() {
- _ = g.Close()
- }()
-
- if written, err := io.Copy(writer, g); err != nil {
- l.Debug("unable to copy", esl.Error(err))
- return err
- } else {
- l.Debug("entire log file copied", esl.Int64("written", written))
- return nil
- }
+ l := esl.Default().With(esl.String("path", z.path))
+ f, err := os.Open(z.path)
+ if err != nil {
+ l.Debug("unable to open the log file", esl.Error(err))
+ return err
+ }
+ defer func() {
+ _ = f.Close()
+ }()
+
+ g, err := gzip.NewReader(f)
+ if err != nil {
+ l.Debug("unable to create gzip reader", esl.Error(err))
+ return err
+ }
+ defer func() {
+ _ = g.Close()
+ }()
+
+ if written, err := io.Copy(writer, g); err != nil {
+ l.Debug("unable to copy", esl.Error(err))
+ return err
+ } else {
+ l.Debug("entire log file copied", esl.Int64("written", written))
+ return nil
+ }
}
func (z logFileImpl) copyToUncompressed(writer io.Writer) error {
- l := esl.Default().With(esl.String("path", z.path))
- f, err := os.Open(z.path)
- if err != nil {
- l.Debug("unable to open the log file", esl.Error(err))
- return err
- }
- defer func() {
- _ = f.Close()
- }()
-
- if written, err := io.Copy(writer, f); err != nil {
- l.Debug("unable to copy", esl.Error(err))
- return err
- } else {
- l.Debug("entire log file copied", esl.Int64("written", written))
- return nil
- }
+ l := esl.Default().With(esl.String("path", z.path))
+ f, err := os.Open(z.path)
+ if err != nil {
+ l.Debug("unable to open the log file", esl.Error(err))
+ return err
+ }
+ defer func() {
+ _ = f.Close()
+ }()
+
+ if written, err := io.Copy(writer, f); err != nil {
+ l.Debug("unable to copy", esl.Error(err))
+ return err
+ } else {
+ l.Debug("entire log file copied", esl.Int64("written", written))
+ return nil
+ }
}
func (z logFileImpl) CopyTo(writer io.Writer) error {
- if z.IsCompressed() {
- return z.copyToCompressed(writer)
- } else {
- return z.copyToUncompressed(writer)
- }
+ if z.IsCompressed() {
+ return z.copyToCompressed(writer)
+ } else {
+ return z.copyToUncompressed(writer)
+ }
}
diff --git a/infra/control/app_job_impl/logfile_test.go b/infra/control/app_job_impl/logfile_test.go
index ed3cda7a1..50e7d2937 100644
--- a/infra/control/app_job_impl/logfile_test.go
+++ b/infra/control/app_job_impl/logfile_test.go
@@ -1,66 +1,66 @@
package app_job_impl
import (
- "io"
- "testing"
+ "io"
+ "testing"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_budget"
- "github.com/watermint/toolbox/infra/control/app_opt"
- "github.com/watermint/toolbox/infra/control/app_workspace"
- "github.com/watermint/toolbox/infra/recipe/rc_spec"
- "github.com/watermint/toolbox/infra/ui/app_msg_container_impl"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "github.com/watermint/toolbox/quality/infra/qt_file"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_budget"
+ "github.com/watermint/toolbox/infra/control/app_opt"
+ "github.com/watermint/toolbox/infra/control/app_workspace"
+ "github.com/watermint/toolbox/infra/recipe/rc_spec"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container_impl"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
+ "github.com/watermint/toolbox/quality/infra/qt_file"
)
func TestLogFileImpl(t *testing.T) {
- qt_file.TestWithTestFolder(t, "launch", false, func(path string) {
- wb, err := app_workspace.NewBundle(path, app_budget.BudgetUnlimited, esl.LevelInfo, false, false)
- if err != nil {
- t.Error(err)
- return
- }
- mc := app_msg_container_impl.NewSingleWithMessagesForTest(map[string]string{})
- ui := app_ui.NewDiscard(mc, wb.Logger().Logger())
- spec := rc_spec.New(&AppJobTestRecipe{})
- launcher := NewLauncher(ui, wb, app_opt.Default(), spec)
- ctl, err := launcher.Up()
- if err != nil {
- t.Error(err)
- }
- ctl.Log().Debug("Hello")
- launcher.Down(nil, ctl)
+ qt_file.TestWithTestFolder(t, "launch", false, func(path string) {
+ wb, err := app_workspace.NewBundle(path, app_budget.BudgetUnlimited, esl.LevelInfo, false, false)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ mc := app_msg_container_impl.NewSingleWithMessagesForTest(map[string]string{})
+ ui := app_ui.NewDiscard(mc, wb.Logger().Logger())
+ spec := rc_spec.New(&AppJobTestRecipe{})
+ launcher := NewLauncher(ui, wb, app_opt.Default(), spec)
+ ctl, err := launcher.Up()
+ if err != nil {
+ t.Error(err)
+ }
+ ctl.Log().Debug("Hello")
+ launcher.Down(nil, ctl)
- his := NewHistorian(wb.Workspace())
- jobs, err := his.Histories()
- if err != nil {
- t.Error(err)
- }
- if len(jobs) != 1 {
- t.Error(jobs)
- }
+ his := NewHistorian(wb.Workspace())
+ jobs, err := his.Histories()
+ if err != nil {
+ t.Error(err)
+ }
+ if len(jobs) != 1 {
+ t.Error(jobs)
+ }
- job := jobs[0]
+ job := jobs[0]
- logs, err := job.Logs()
- if err != nil {
- t.Error(err)
- }
- for _, lf := range logs {
- if lf.Name() == "" {
- t.Error(lf.Name())
- }
- if lf.Type() == "" {
- t.Error(lf.Type())
- }
- if lf.Path() == "" {
- t.Error(lf.Path())
- }
- lf.IsCompressed()
- if err := lf.CopyTo(io.Discard); err != nil {
- t.Error(err)
- }
- }
- })
+ logs, err := job.Logs()
+ if err != nil {
+ t.Error(err)
+ }
+ for _, lf := range logs {
+ if lf.Name() == "" {
+ t.Error(lf.Name())
+ }
+ if lf.Type() == "" {
+ t.Error(lf.Type())
+ }
+ if lf.Path() == "" {
+ t.Error(lf.Path())
+ }
+ lf.IsCompressed()
+ if err := lf.CopyTo(io.Discard); err != nil {
+ t.Error(err)
+ }
+ }
+ })
}
diff --git a/infra/control/app_license/bundle.go b/infra/control/app_license/bundle.go
index fdeecc044..49ff52e4a 100644
--- a/infra/control/app_license/bundle.go
+++ b/infra/control/app_license/bundle.go
@@ -1,102 +1,102 @@
package app_license
import (
- "errors"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "time"
+ "errors"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "time"
)
var (
- ErrorBundleCannotBeSealed = errors.New("bundle cannot be sealed")
+ ErrorBundleCannotBeSealed = errors.New("bundle cannot be sealed")
)
func NewLicenseBundleFromKeys(keys []string, path string) LicenseBundle {
- licenses := make([]*LicenseData, 0)
- for _, k := range keys {
- l, err := LoadAndCacheLicense(k, app_definitions.SupplementRepositoryLicenseUrl, path)
- if err != nil {
- continue
- }
- if l.IsValid() {
- licenses = append(licenses, l)
- }
- }
- return LicenseBundle{
- licenses: licenses,
- }
+ licenses := make([]*LicenseData, 0)
+ for _, k := range keys {
+ l, err := LoadAndCacheLicense(k, app_definitions.SupplementRepositoryLicenseUrl, path)
+ if err != nil {
+ continue
+ }
+ if l.IsValid() {
+ licenses = append(licenses, l)
+ }
+ }
+ return LicenseBundle{
+ licenses: licenses,
+ }
}
type LicenseBundle struct {
- // licenses that are valid licenses
- licenses []*LicenseData
+ // licenses that are valid licenses
+ licenses []*LicenseData
}
func (z LicenseBundle) LifecycleLimit() time.Time {
- var bestLicense *LicenseData
- var bestExpiration int64 = 0
+ var bestLicense *LicenseData
+ var bestExpiration int64 = 0
- for _, l := range z.licenses {
- if !l.IsValid() {
- continue
- }
- if bestLicense == nil || l.Lifecycle != nil && l.Lifecycle.AvailableAfter > bestExpiration {
- bestLicense = l
- bestExpiration = l.Lifecycle.AvailableAfter
- }
- }
+ for _, l := range z.licenses {
+ if !l.IsValid() {
+ continue
+ }
+ if bestLicense == nil || l.Lifecycle != nil && l.Lifecycle.AvailableAfter > bestExpiration {
+ bestLicense = l
+ bestExpiration = l.Lifecycle.AvailableAfter
+ }
+ }
- if bestLicense == nil {
- return time.Time{}
- }
+ if bestLicense == nil {
+ return time.Time{}
+ }
- return bestLicense.LifecycleLimit()
+ return bestLicense.LifecycleLimit()
}
func (z LicenseBundle) IsValid() bool {
- for _, l := range z.licenses {
- if l.IsValid() {
- return true
- }
- }
- return false
+ for _, l := range z.licenses {
+ if l.IsValid() {
+ return true
+ }
+ }
+ return false
}
func (z LicenseBundle) IsLifecycleWithinLimit() (active bool, warning bool) {
- for _, l := range z.licenses {
- if a, w := l.IsLifecycleWithinLimit(); a && !w {
- return a, w
- }
- }
- for _, l := range z.licenses {
- if a, w := l.IsLifecycleWithinLimit(); a {
- return a, w
- }
- }
- return false, false
+ for _, l := range z.licenses {
+ if a, w := l.IsLifecycleWithinLimit(); a && !w {
+ return a, w
+ }
+ }
+ for _, l := range z.licenses {
+ if a, w := l.IsLifecycleWithinLimit(); a {
+ return a, w
+ }
+ }
+ return false, false
}
func (z LicenseBundle) IsScopeEnabled(scope string) bool {
- for _, l := range z.licenses {
- if l.IsScopeEnabled(scope) {
- return true
- }
- }
- return false
+ for _, l := range z.licenses {
+ if l.IsScopeEnabled(scope) {
+ return true
+ }
+ }
+ return false
}
func (z LicenseBundle) IsRecipeEnabled(recipePath string) bool {
- for _, l := range z.licenses {
- if l.IsRecipeEnabled(recipePath) {
- return true
- }
- }
- return false
+ for _, l := range z.licenses {
+ if l.IsRecipeEnabled(recipePath) {
+ return true
+ }
+ }
+ return false
}
func (z LicenseBundle) SealWithKey(key string) (data []byte, err error) {
- return nil, ErrorBundleCannotBeSealed
+ return nil, ErrorBundleCannotBeSealed
}
func (z LicenseBundle) Seal() (data []byte, key string, err error) {
- return nil, "", ErrorBundleCannotBeSealed
+ return nil, "", ErrorBundleCannotBeSealed
}
diff --git a/infra/control/app_license/doc.go b/infra/control/app_license/doc.go
new file mode 100644
index 000000000..db3f29269
--- /dev/null
+++ b/infra/control/app_license/doc.go
@@ -0,0 +1,2 @@
+// Package app_license provides functionalities for managing application licenses.
+package app_license
diff --git a/infra/control/app_license/license.go b/infra/control/app_license/license.go
index 92d0106c4..70c7db4db 100644
--- a/infra/control/app_license/license.go
+++ b/infra/control/app_license/license.go
@@ -1,574 +1,574 @@
package app_license
import (
- "encoding/base32"
- "encoding/base64"
- "encoding/json"
- "errors"
- "os"
- "path/filepath"
- "strings"
- "time"
-
- "github.com/watermint/toolbox/essentials/http/es_download"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "github.com/watermint/toolbox/infra/security/sc_obfuscate"
- "github.com/watermint/toolbox/infra/security/sc_random"
- "golang.org/x/crypto/sha3"
+ "encoding/base32"
+ "encoding/base64"
+ "encoding/json"
+ "errors"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+
+ "github.com/watermint/toolbox/essentials/http/es_download"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/infra/security/sc_obfuscate"
+ "github.com/watermint/toolbox/infra/security/sc_random"
+ "golang.org/x/crypto/sha3"
)
type License interface {
- // IsValid returns true if the license is valid.
- IsValid() bool
+ // IsValid returns true if the license is valid.
+ IsValid() bool
- // IsInvalid returns true if the license is invalid.
- IsInvalid() bool
+ // IsInvalid returns true if the license is invalid.
+ IsInvalid() bool
- // IsCacheTimeout returns true if the license is cached and the cache is timed out.
- IsCacheTimeout() bool
+ // IsCacheTimeout returns true if the license is cached and the cache is timed out.
+ IsCacheTimeout() bool
- // IsLifecycleWithinLimit returns true if the license is active in terms of the expiration date.
- // The second return value is true if the license is warned before the expiration.
- IsLifecycleWithinLimit() (active bool, warning bool)
+ // IsLifecycleWithinLimit returns true if the license is active in terms of the expiration date.
+ // The second return value is true if the license is warned before the expiration.
+ IsLifecycleWithinLimit() (active bool, warning bool)
- // IsEOL returns true if the license has reached end-of-life.
- IsEOL() (eol bool, reason string)
+ // IsEOL returns true if the license has reached end-of-life.
+ IsEOL() (eol bool, reason string)
- // LifecycleLimit returns the lifecycle limit of the license.
- LifecycleLimit() time.Time
+ // LifecycleLimit returns the lifecycle limit of the license.
+ LifecycleLimit() time.Time
- // IsScopeEnabled returns true if the specified scope is enabled.
- IsScopeEnabled(scope string) bool
+ // IsScopeEnabled returns true if the specified scope is enabled.
+ IsScopeEnabled(scope string) bool
- // IsRecipeEnabled returns true if the specified recipe is enabled.
- IsRecipeEnabled(recipePath string) bool
+ // IsRecipeEnabled returns true if the specified recipe is enabled.
+ IsRecipeEnabled(recipePath string) bool
- // SealWithKey seals the license data with the key.
- SealWithKey(key string) (data []byte, err error)
+ // SealWithKey seals the license data with the key.
+ SealWithKey(key string) (data []byte, err error)
- // Seal seals the license data, and returns the sealed data and the license key.
- Seal() (data []byte, key string, err error)
+ // Seal seals the license data, and returns the sealed data and the license key.
+ Seal() (data []byte, key string, err error)
}
const (
- LicenseVersionV1 = "74b495ab-051e-4bea-93d4-669fb0a671b1"
- LicenseVersionCurrent = LicenseVersionV1
- LicenseScopeBase = "690797b2-ff61-46a0-a28d-3b0f7a5b49ed"
+ LicenseVersionV1 = "74b495ab-051e-4bea-93d4-669fb0a671b1"
+ LicenseVersionCurrent = LicenseVersionV1
+ LicenseScopeBase = "690797b2-ff61-46a0-a28d-3b0f7a5b49ed"
- // LicenseBlockSize is the block size of the license.
- LicenseBlockSize = 16 * 1024 // 16KiB
+ // LicenseBlockSize is the block size of the license.
+ LicenseBlockSize = 16 * 1024 // 16KiB
- // LicenseKeySize is the size of the license key.
- // must be divisible by 5 (need to eliminate padding characters in base32 encoding)
- LicenseKeySize = 35
+ // LicenseKeySize is the size of the license key.
+ // must be divisible by 5 (need to eliminate padding characters in base32 encoding)
+ LicenseKeySize = 35
- // MaxLicenseYears is the maximum years of the license.
- MaxLicenseYears = 3
- MinLicenseHours = 1
+ // MaxLicenseYears is the maximum years of the license.
+ MaxLicenseYears = 3
+ MinLicenseHours = 1
- // MaxLicenseeNameLength is the maximum length of the licensee name.
- MaxLicenseeNameLength = 128
+ // MaxLicenseeNameLength is the maximum length of the licensee name.
+ MaxLicenseeNameLength = 128
- DefaultLifecyclePeriod = MaxLicenseYears * 365 * 24 * time.Hour
+ DefaultLifecyclePeriod = MaxLicenseYears * 365 * 24 * time.Hour
- DefaultWarningPeriodFraction = 0.8
- DefaultWarningMinimumPeriod = 7 * 24 * time.Hour
- DefaultWarningMaximumPeriod = 365 * 24 * time.Hour
+ DefaultWarningPeriodFraction = 0.8
+ DefaultWarningMinimumPeriod = 7 * 24 * time.Hour
+ DefaultWarningMaximumPeriod = 365 * 24 * time.Hour
- CacheTimeout = 30 * 24 * time.Hour
+ CacheTimeout = 30 * 24 * time.Hour
)
var (
- KnownLicenseVersions = []string{
- LicenseVersionV1,
- }
- KnownLicenseScopes = []string{
- LicenseScopeBase,
- }
+ KnownLicenseVersions = []string{
+ LicenseVersionV1,
+ }
+ KnownLicenseScopes = []string{
+ LicenseScopeBase,
+ }
)
var (
- ErrorExpired = errors.New("license expired")
- ErrorLicenseNotFound = errors.New("license not found")
- ErrorUnknownLicenseType = errors.New("unknown license type")
- ErrorCacheNotFound = errors.New("cache not found")
- ErrorCacheExpired = errors.New("cache expired")
- ErrorLicenseNetwork = errors.New("network error: unable to connect to the license server. Please check your network, firewall, or proxy settings.")
+ ErrorExpired = errors.New("license expired")
+ ErrorLicenseNotFound = errors.New("license not found")
+ ErrorUnknownLicenseType = errors.New("unknown license type")
+ ErrorCacheNotFound = errors.New("cache not found")
+ ErrorCacheExpired = errors.New("cache expired")
+ ErrorLicenseNetwork = errors.New("network error: unable to connect to the license server. Please check your network, firewall, or proxy settings.")
)
const (
- CopyTypeOriginal = iota
- CopyTypeCachedValidLicense
- CopyTypeCachedNotFound
+ CopyTypeOriginal = iota
+ CopyTypeCachedValidLicense
+ CopyTypeCachedNotFound
)
type LicenseRecipe struct {
- // Allow is the list of allowed recipes in recipe path.
- Allow []string `json:"allow"`
+ // Allow is the list of allowed recipes in recipe path.
+ Allow []string `json:"allow"`
- // AllowPrefix is the prefix of the recipe path.
- AllowPrefix string `json:"allow_prefix"`
+ // AllowPrefix is the prefix of the recipe path.
+ AllowPrefix string `json:"allow_prefix"`
}
type LicenseLifecycle struct {
- // AvailableAfter is the time when the license is available after the expiration in seconds.
- AvailableAfter int64 `json:"available_after"`
+ // AvailableAfter is the time when the license is available after the expiration in seconds.
+ AvailableAfter int64 `json:"available_after"`
- // WarningAfter is the time when the license is warned before the expiration in seconds.
- WarningAfter int64 `json:"warning_after"`
+ // WarningAfter is the time when the license is warned before the expiration in seconds.
+ WarningAfter int64 `json:"warning_after"`
- // IsEOL is the flag to indicate the license has reached end-of-life.
- IsEOL bool `json:"is_eol"`
+ // IsEOL is the flag to indicate the license has reached end-of-life.
+ IsEOL bool `json:"is_eol"`
- // ReasonEOL is the reason for the end-of-life.
- ReasonEOL string `json:"reason_eol"`
+ // ReasonEOL is the reason for the end-of-life.
+ ReasonEOL string `json:"reason_eol"`
}
// LicenseReleaseBinding is the binding of the release number.
type LicenseReleaseBinding struct {
- // ReleaseMinimum is the minimum release number (inclusive).
- ReleaseMinimum uint64 `json:"release_minimum"`
+ // ReleaseMinimum is the minimum release number (inclusive).
+ ReleaseMinimum uint64 `json:"release_minimum"`
- // ReleaseMaximum is the maximum release number (inclusive).
- ReleaseMaximum uint64 `json:"release_maximum"`
+ // ReleaseMaximum is the maximum release number (inclusive).
+ ReleaseMaximum uint64 `json:"release_maximum"`
}
type LicenseData struct {
- // Version is the version identifier of the license.
- Version string `json:"version,omitempty"`
+ // Version is the version identifier of the license.
+ Version string `json:"version,omitempty"`
- // AppName is the name of the application which the license is for.
- AppName string `json:"app_name,omitempty"`
+ // AppName is the name of the application which the license is for.
+ AppName string `json:"app_name,omitempty"`
- // Scope is the scope of the license.
- Scope string `json:"scope,omitempty"`
+ // Scope is the scope of the license.
+ Scope string `json:"scope,omitempty"`
- // Binding is the binding of the license.
- Binding *LicenseReleaseBinding `json:"binding,omitempty"`
+ // Binding is the binding of the license.
+ Binding *LicenseReleaseBinding `json:"binding,omitempty"`
- // CopyType is the copy type of the license.
- CopyType int `json:"copy_status,omitempty"`
+ // CopyType is the copy type of the license.
+ CopyType int `json:"copy_status,omitempty"`
- // LicenseeName is the name of the licensee.
- LicenseeName string `json:"licensee_name,omitempty"`
+ // LicenseeName is the name of the licensee.
+ LicenseeName string `json:"licensee_name,omitempty"`
- // LicenseeEmail is the email address of the licensee.
- LicenseeEmail string `json:"licensee_email,omitempty"`
+ // LicenseeEmail is the email address of the licensee.
+ LicenseeEmail string `json:"licensee_email,omitempty"`
- // CachedAt is the date when the license was cached, in RFC3339 format.
- CachedAt string `json:"cached_at,omitempty"`
+ // CachedAt is the date when the license was cached, in RFC3339 format.
+ CachedAt string `json:"cached_at,omitempty"`
- // Lifecycle is the lifecycle information attached to the license.
- Lifecycle *LicenseLifecycle `json:"lifecycle,omitempty"`
+ // Lifecycle is the lifecycle information attached to the license.
+ Lifecycle *LicenseLifecycle `json:"lifecycle,omitempty"`
- // Recipe is the recipe information attached to the license.
- Recipe *LicenseRecipe `json:"recipe,omitempty"`
+ // Recipe is the recipe information attached to the license.
+ Recipe *LicenseRecipe `json:"recipe,omitempty"`
- // Padding is the padding string for the license.
- Padding string `json:"padding,omitempty"`
+ // Padding is the padding string for the license.
+ Padding string `json:"padding,omitempty"`
}
func (z LicenseData) buildTimestamp() time.Time {
- if app_definitions.BuildInfo.Timestamp == "" {
- return time.Now()
- }
- buildTime, err := time.Parse(time.RFC3339, app_definitions.BuildInfo.Timestamp)
- if err != nil {
- return time.Now()
- }
- return buildTime
+ if app_definitions.BuildInfo.Timestamp == "" {
+ return time.Now()
+ }
+ buildTime, err := time.Parse(time.RFC3339, app_definitions.BuildInfo.Timestamp)
+ if err != nil {
+ return time.Now()
+ }
+ return buildTime
}
func (z LicenseData) LifecycleLimit() time.Time {
- return z.buildTimestamp().Add(time.Duration(z.Lifecycle.AvailableAfter) * time.Second)
+ return z.buildTimestamp().Add(time.Duration(z.Lifecycle.AvailableAfter) * time.Second)
}
func (z LicenseData) IsLifecycleWithinLimit() (active bool, warning bool) {
- if z.CopyType == CopyTypeCachedNotFound {
- return false, false
- }
-
- if z.Binding != nil {
- if app_definitions.Version.Major < z.Binding.ReleaseMinimum || z.Binding.ReleaseMaximum < app_definitions.Version.Major {
- return false, false
- }
- }
-
- if z.Lifecycle == nil {
- return true, false
- }
- if z.Lifecycle.IsEOL {
- return false, false
- }
-
- buildTimestamp := app_definitions.BuildInfo.Timestamp
- if buildTimestamp == "" {
- buildTimestamp = time.Now().Format(time.RFC3339)
- }
- warningAfter := z.buildTimestamp().Add(time.Duration(z.Lifecycle.WarningAfter) * time.Second)
- lifecycleLimit := z.LifecycleLimit()
- active = time.Now().Before(lifecycleLimit)
- warning = time.Now().After(warningAfter)
- return
+ if z.CopyType == CopyTypeCachedNotFound {
+ return false, false
+ }
+
+ if z.Binding != nil {
+ if app_definitions.Version.Major < z.Binding.ReleaseMinimum || z.Binding.ReleaseMaximum < app_definitions.Version.Major {
+ return false, false
+ }
+ }
+
+ if z.Lifecycle == nil {
+ return true, false
+ }
+ if z.Lifecycle.IsEOL {
+ return false, false
+ }
+
+ buildTimestamp := app_definitions.BuildInfo.Timestamp
+ if buildTimestamp == "" {
+ buildTimestamp = time.Now().Format(time.RFC3339)
+ }
+ warningAfter := z.buildTimestamp().Add(time.Duration(z.Lifecycle.WarningAfter) * time.Second)
+ lifecycleLimit := z.LifecycleLimit()
+ active = time.Now().Before(lifecycleLimit)
+ warning = time.Now().After(warningAfter)
+ return
}
func (z LicenseData) IsCacheTimeout() bool {
- if z.CachedAt != "" {
- cachedAt, err := time.Parse(time.RFC3339, z.CachedAt)
- if err != nil {
- return true
- }
- if time.Since(cachedAt) > CacheTimeout {
- return true
- }
- }
- return false
+ if z.CachedAt != "" {
+ cachedAt, err := time.Parse(time.RFC3339, z.CachedAt)
+ if err != nil {
+ return true
+ }
+ if time.Since(cachedAt) > CacheTimeout {
+ return true
+ }
+ }
+ return false
}
func (z LicenseData) IsValid() bool {
- if z.CopyType == CopyTypeCachedNotFound {
- return false
- }
+ if z.CopyType == CopyTypeCachedNotFound {
+ return false
+ }
- if z.Binding != nil {
- if app_definitions.Version.Major < z.Binding.ReleaseMinimum || z.Binding.ReleaseMaximum < app_definitions.Version.Major {
- return false
- }
- }
+ if z.Binding != nil {
+ if app_definitions.Version.Major < z.Binding.ReleaseMinimum || z.Binding.ReleaseMaximum < app_definitions.Version.Major {
+ return false
+ }
+ }
- if lc, _ := z.IsLifecycleWithinLimit(); !lc {
- return false
- }
+ if lc, _ := z.IsLifecycleWithinLimit(); !lc {
+ return false
+ }
- return true
+ return true
}
func (z LicenseData) IsInvalid() bool {
- return !z.IsValid()
+ return !z.IsValid()
}
func (z LicenseData) IsScopeEnabled(scope string) bool {
- if z.IsInvalid() {
- return false
- }
- return z.Scope == scope
+ if z.IsInvalid() {
+ return false
+ }
+ return z.Scope == scope
}
func (z LicenseData) IsRecipeEnabled(recipePath string) bool {
- if z.IsInvalid() {
- return false
- }
- if z.Recipe == nil {
- return false
- }
- if z.Recipe.AllowPrefix != "" && strings.HasPrefix(recipePath, z.Recipe.AllowPrefix+" ") {
- return true
- }
- for _, allow := range z.Recipe.Allow {
- if allow == recipePath {
- return true
- }
- }
- return false
+ if z.IsInvalid() {
+ return false
+ }
+ if z.Recipe == nil {
+ return false
+ }
+ if z.Recipe.AllowPrefix != "" && strings.HasPrefix(recipePath, z.Recipe.AllowPrefix+" ") {
+ return true
+ }
+ for _, allow := range z.Recipe.Allow {
+ if allow == recipePath {
+ return true
+ }
+ }
+ return false
}
func (z LicenseData) WithBinding(minimum, maximum uint64) LicenseData {
- z.Binding = &LicenseReleaseBinding{
- ReleaseMinimum: minimum,
- ReleaseMaximum: maximum,
- }
- return z
+ z.Binding = &LicenseReleaseBinding{
+ ReleaseMinimum: minimum,
+ ReleaseMaximum: maximum,
+ }
+ return z
}
func (z LicenseData) WithLicensee(name, email string) LicenseData {
- // Limit the length of the licensee name and email
- if len(name) > MaxLicenseeNameLength {
- name = name[:MaxLicenseeNameLength]
- }
- if len(email) > MaxLicenseeNameLength {
- email = email[:MaxLicenseeNameLength]
- }
-
- z.LicenseeName = name
- z.LicenseeEmail = email
- return z
+ // Limit the length of the licensee name and email
+ if len(name) > MaxLicenseeNameLength {
+ name = name[:MaxLicenseeNameLength]
+ }
+ if len(email) > MaxLicenseeNameLength {
+ email = email[:MaxLicenseeNameLength]
+ }
+
+ z.LicenseeName = name
+ z.LicenseeEmail = email
+ return z
}
func (z LicenseData) WithLifecycle(lc *LicenseLifecycle) LicenseData {
- z.Lifecycle = lc
- return z
+ z.Lifecycle = lc
+ return z
}
func (z LicenseData) WithRecipe(rc *LicenseRecipe) LicenseData {
- z.Recipe = rc
- return z
+ z.Recipe = rc
+ return z
}
func (z LicenseData) Cache() LicenseData {
- z.CachedAt = time.Now().Format(time.RFC3339)
- z.CopyType = CopyTypeCachedValidLicense
- return z
+ z.CachedAt = time.Now().Format(time.RFC3339)
+ z.CopyType = CopyTypeCachedValidLicense
+ return z
}
func (z LicenseData) SealWithKey(key string) (data []byte, err error) {
- l := esl.Default()
- keySalt := app_definitions.BuildInfo.LicenseSalt + key
-
- p0, err := json.Marshal(z)
- if err != nil {
- l.Debug("Unable to marshal the data", esl.Error(err))
- return nil, err
- }
- paddingSize := LicenseBlockSize - len(p0)%LicenseBlockSize
- z.Padding = sc_random.MustGetSecureRandomString(paddingSize)
-
- p1, err := json.Marshal(z)
- if err != nil {
- l.Debug("Unable to marshal the data", esl.Error(err))
- return nil, err
- }
-
- data, err = sc_obfuscate.Obfuscate(l, []byte(keySalt), p1)
- if err != nil {
- l.Debug("Unable to obfuscate the data", esl.Error(err))
- return nil, err
- }
- return
+ l := esl.Default()
+ keySalt := app_definitions.BuildInfo.LicenseSalt + key
+
+ p0, err := json.Marshal(z)
+ if err != nil {
+ l.Debug("Unable to marshal the data", esl.Error(err))
+ return nil, err
+ }
+ paddingSize := LicenseBlockSize - len(p0)%LicenseBlockSize
+ z.Padding = sc_random.MustGetSecureRandomString(paddingSize)
+
+ p1, err := json.Marshal(z)
+ if err != nil {
+ l.Debug("Unable to marshal the data", esl.Error(err))
+ return nil, err
+ }
+
+ data, err = sc_obfuscate.Obfuscate(l, []byte(keySalt), p1)
+ if err != nil {
+ l.Debug("Unable to obfuscate the data", esl.Error(err))
+ return nil, err
+ }
+ return
}
// Seal seals the license data.
func (z LicenseData) Seal() (data []byte, key string, err error) {
- l := esl.Default()
- if z.Lifecycle == nil {
- l.Debug("Expiration date is not set, set to the maximum expiration date")
- z.Lifecycle.AvailableAfter = int64(DefaultLifecyclePeriod.Seconds())
- z.Lifecycle.WarningAfter = int64(DefaultWarningPeriod(DefaultLifecyclePeriod).Seconds())
- } else {
- z.Lifecycle.AvailableAfter = min(int64(DefaultLifecyclePeriod.Seconds()),
- max(z.Lifecycle.AvailableAfter, int64(MinLicenseHours)*3600))
- z.Lifecycle.WarningAfter = min(
- max(
- z.Lifecycle.WarningAfter,
- 0,
- ),
- z.Lifecycle.AvailableAfter,
- )
- }
-
- key = sc_random.MustGetSecureRandomString(LicenseKeySize)
- data, err = z.SealWithKey(key)
- if err != nil {
- l.Debug("Unable to seal the data", esl.Error(err))
- return nil, "", err
- }
- return
+ l := esl.Default()
+ if z.Lifecycle == nil {
+ l.Debug("Expiration date is not set, set to the maximum expiration date")
+ z.Lifecycle.AvailableAfter = int64(DefaultLifecyclePeriod.Seconds())
+ z.Lifecycle.WarningAfter = int64(DefaultWarningPeriod(DefaultLifecyclePeriod).Seconds())
+ } else {
+ z.Lifecycle.AvailableAfter = min(int64(DefaultLifecyclePeriod.Seconds()),
+ max(z.Lifecycle.AvailableAfter, int64(MinLicenseHours)*3600))
+ z.Lifecycle.WarningAfter = min(
+ max(
+ z.Lifecycle.WarningAfter,
+ 0,
+ ),
+ z.Lifecycle.AvailableAfter,
+ )
+ }
+
+ key = sc_random.MustGetSecureRandomString(LicenseKeySize)
+ data, err = z.SealWithKey(key)
+ if err != nil {
+ l.Debug("Unable to seal the data", esl.Error(err))
+ return nil, "", err
+ }
+ return
}
// NewLicense creates a new license data with the scope in the current license version.
func NewLicense(scope string) LicenseData {
- return LicenseData{
- Version: LicenseVersionV1,
- AppName: app_definitions.Name,
- Scope: scope,
- Lifecycle: &LicenseLifecycle{
- AvailableAfter: int64(DefaultLifecyclePeriod.Seconds()),
- WarningAfter: int64(DefaultWarningPeriod(DefaultLifecyclePeriod).Seconds()),
- },
- }
+ return LicenseData{
+ Version: LicenseVersionV1,
+ AppName: app_definitions.Name,
+ Scope: scope,
+ Lifecycle: &LicenseLifecycle{
+ AvailableAfter: int64(DefaultLifecyclePeriod.Seconds()),
+ WarningAfter: int64(DefaultWarningPeriod(DefaultLifecyclePeriod).Seconds()),
+ },
+ }
}
func LicenseName(key string) string {
- digest := sha3.Sum512([]byte(app_definitions.BuildInfo.LicenseSalt + key))
- return base32.HexEncoding.EncodeToString(digest[:])[:LicenseKeySize]
+ digest := sha3.Sum512([]byte(app_definitions.BuildInfo.LicenseSalt + key))
+ return base32.HexEncoding.EncodeToString(digest[:])[:LicenseKeySize]
}
func cacheName(key string) string {
- digest := sha3.Sum512([]byte("CACHE:" + app_definitions.BuildInfo.LicenseSalt + key))
- return "license_cache_" + base32.HexEncoding.EncodeToString(digest[:])[:LicenseKeySize]
+ digest := sha3.Sum512([]byte("CACHE:" + app_definitions.BuildInfo.LicenseSalt + key))
+ return "license_cache_" + base32.HexEncoding.EncodeToString(digest[:])[:LicenseKeySize]
}
func LoadAndCacheLicense(key, url, path string) (ld *LicenseData, err error) {
- l := esl.Default().With(esl.String("url", url), esl.String("path", path), esl.String("key", key))
- cache, err := loadLicenseFile(key, path)
- switch {
- case err == nil:
- if cache.IsCacheTimeout() {
- ld, err = loadLicenseUrl(key, url)
- if err != nil {
- l.Debug("Unable to load the license", esl.Error(err))
- return nil, err
- }
- cached := ld.Cache()
- cached.Padding = ""
- if err = cacheLicenseFile(key, path, &cached); err != nil {
- l.Debug("Unable to cache the license", esl.Error(err))
- return nil, err
- }
- return ld, nil
- }
- return cache, nil
-
- case errors.Is(err, ErrorCacheNotFound), errors.Is(err, ErrorCacheExpired):
- ld, err = loadLicenseUrl(key, url)
-
- if errors.Is(err, ErrorLicenseNotFound) {
- // Cache even if the license is not found, to avoid the repeated download
- _ = cacheLicenseFile(key, path, &LicenseData{
- CopyType: CopyTypeCachedNotFound,
- })
- return nil, err
- }
- if err != nil {
- l.Debug("Unable to load the license", esl.Error(err))
- return nil, err
- }
-
- cached := ld.Cache()
- cached.Padding = ""
- if err = cacheLicenseFile(key, path, &cached); err != nil {
- l.Debug("Unable to cache the license", esl.Error(err))
- return nil, err
- }
- return ld, nil
-
- default:
- l.Debug("Unable to load the license, mark this key as NOT_FOUND.", esl.Error(err))
-
- // Cache even if the license is not found, to avoid the repeated download
- _ = cacheLicenseFile(key, path, &LicenseData{
- CopyType: CopyTypeCachedNotFound,
- })
- return nil, err
- }
+ l := esl.Default().With(esl.String("url", url), esl.String("path", path), esl.String("key", key))
+ cache, err := loadLicenseFile(key, path)
+ switch {
+ case err == nil:
+ if cache.IsCacheTimeout() {
+ ld, err = loadLicenseUrl(key, url)
+ if err != nil {
+ l.Debug("Unable to load the license", esl.Error(err))
+ return nil, err
+ }
+ cached := ld.Cache()
+ cached.Padding = ""
+ if err = cacheLicenseFile(key, path, &cached); err != nil {
+ l.Debug("Unable to cache the license", esl.Error(err))
+ return nil, err
+ }
+ return ld, nil
+ }
+ return cache, nil
+
+ case errors.Is(err, ErrorCacheNotFound), errors.Is(err, ErrorCacheExpired):
+ ld, err = loadLicenseUrl(key, url)
+
+ if errors.Is(err, ErrorLicenseNotFound) {
+ // Cache even if the license is not found, to avoid the repeated download
+ _ = cacheLicenseFile(key, path, &LicenseData{
+ CopyType: CopyTypeCachedNotFound,
+ })
+ return nil, err
+ }
+ if err != nil {
+ l.Debug("Unable to load the license", esl.Error(err))
+ return nil, err
+ }
+
+ cached := ld.Cache()
+ cached.Padding = ""
+ if err = cacheLicenseFile(key, path, &cached); err != nil {
+ l.Debug("Unable to cache the license", esl.Error(err))
+ return nil, err
+ }
+ return ld, nil
+
+ default:
+ l.Debug("Unable to load the license, mark this key as NOT_FOUND.", esl.Error(err))
+
+ // Cache even if the license is not found, to avoid the repeated download
+ _ = cacheLicenseFile(key, path, &LicenseData{
+ CopyType: CopyTypeCachedNotFound,
+ })
+ return nil, err
+ }
}
func loadLicenseUrl(key, url string) (ld *LicenseData, err error) {
- fileUrl := url + LicenseName(key)
- l := esl.Default().With(esl.String("url", fileUrl))
- dataBase64, err := es_download.DownloadText(l, fileUrl)
- if errors.Is(err, es_download.ErrorNotFound) {
- l.Debug("License not found", esl.String("url", fileUrl))
- return nil, ErrorLicenseNotFound
- }
- var netErr *es_download.ErrorNetworkDetail
- if errors.As(err, &netErr) {
- l.Debug("Network error while downloading license", esl.Error(err))
- return nil, ErrorLicenseNetwork
- }
- if err != nil {
- l.Debug("Unable to download the data", esl.Error(err))
- return nil, err
- }
- dataBin, err := base64.StdEncoding.DecodeString(dataBase64)
- if err != nil {
- l.Debug("Unable to decode the data", esl.Error(err))
- return nil, err
- }
- ld, err = ParseLicense(dataBin, key)
- if err != nil {
- l.Debug("Unable to parse the data", esl.Error(err))
- return nil, err
- }
- if ld.IsInvalid() {
- l.Debug("License is invalid", esl.String("url", fileUrl))
- return nil, ErrorExpired
- }
- return
+ fileUrl := url + LicenseName(key)
+ l := esl.Default().With(esl.String("url", fileUrl))
+ dataBase64, err := es_download.DownloadText(l, fileUrl)
+ if errors.Is(err, es_download.ErrorNotFound) {
+ l.Debug("License not found", esl.String("url", fileUrl))
+ return nil, ErrorLicenseNotFound
+ }
+ var netErr *es_download.ErrorNetworkDetail
+ if errors.As(err, &netErr) {
+ l.Debug("Network error while downloading license", esl.Error(err))
+ return nil, ErrorLicenseNetwork
+ }
+ if err != nil {
+ l.Debug("Unable to download the data", esl.Error(err))
+ return nil, err
+ }
+ dataBin, err := base64.StdEncoding.DecodeString(dataBase64)
+ if err != nil {
+ l.Debug("Unable to decode the data", esl.Error(err))
+ return nil, err
+ }
+ ld, err = ParseLicense(dataBin, key)
+ if err != nil {
+ l.Debug("Unable to parse the data", esl.Error(err))
+ return nil, err
+ }
+ if ld.IsInvalid() {
+ l.Debug("License is invalid", esl.String("url", fileUrl))
+ return nil, ErrorExpired
+ }
+ return
}
func cacheLicenseFile(key, path string, ld *LicenseData) (err error) {
- filePath := filepath.Join(path, cacheName(key))
- l := esl.Default().With(esl.String("path", filePath))
- if err = os.MkdirAll(path, 0755); err != nil {
- l.Debug("Unable to create the directory", esl.Error(err))
- return err
- }
- data, err := ld.SealWithKey(key)
- if err != nil {
- l.Debug("Unable to seal the data", esl.Error(err))
- return err
- }
- err = os.WriteFile(filePath, data, 0644)
- if err != nil {
- l.Debug("Unable to write the data", esl.Error(err))
- return err
- }
- return nil
+ filePath := filepath.Join(path, cacheName(key))
+ l := esl.Default().With(esl.String("path", filePath))
+ if err = os.MkdirAll(path, 0755); err != nil {
+ l.Debug("Unable to create the directory", esl.Error(err))
+ return err
+ }
+ data, err := ld.SealWithKey(key)
+ if err != nil {
+ l.Debug("Unable to seal the data", esl.Error(err))
+ return err
+ }
+ err = os.WriteFile(filePath, data, 0644)
+ if err != nil {
+ l.Debug("Unable to write the data", esl.Error(err))
+ return err
+ }
+ return nil
}
func loadLicenseFile(key, path string) (ld *LicenseData, err error) {
- filePath := filepath.Join(path, cacheName(key))
- l := esl.Default().With(esl.String("path", filePath))
- data, err := os.ReadFile(filePath)
- if err != nil {
- if os.IsNotExist(err) {
- l.Debug("License file not found", esl.String("path", path))
- return nil, ErrorCacheNotFound
- }
- l.Debug("Unable to load the data", esl.Error(err))
- return nil, err
- }
- ld, err = ParseLicense(data, key)
- if err != nil {
- l.Debug("Unable to parse the data", esl.Error(err))
- return nil, err
- }
- if ld.IsCacheTimeout() {
- l.Debug("Cache timeout", esl.String("path", path))
- return nil, ErrorCacheExpired
- }
- return
+ filePath := filepath.Join(path, cacheName(key))
+ l := esl.Default().With(esl.String("path", filePath))
+ data, err := os.ReadFile(filePath)
+ if err != nil {
+ if os.IsNotExist(err) {
+ l.Debug("License file not found", esl.String("path", path))
+ return nil, ErrorCacheNotFound
+ }
+ l.Debug("Unable to load the data", esl.Error(err))
+ return nil, err
+ }
+ ld, err = ParseLicense(data, key)
+ if err != nil {
+ l.Debug("Unable to parse the data", esl.Error(err))
+ return nil, err
+ }
+ if ld.IsCacheTimeout() {
+ l.Debug("Cache timeout", esl.String("path", path))
+ return nil, ErrorCacheExpired
+ }
+ return
}
func ParseLicense(data []byte, license string) (ld *LicenseData, err error) {
- l := esl.Default()
- if license == "" || len(data) == 0 {
- l.Debug("License is empty")
- return nil, ErrorUnknownLicenseType
- }
- keySalt := app_definitions.BuildInfo.LicenseSalt + license
- p1, err := sc_obfuscate.Deobfuscate(l, []byte(keySalt), data)
- if err != nil {
- l.Debug("Unable to de-obfuscate the data", esl.Error(err))
- return nil, err
- }
- ld = &LicenseData{}
- err = json.Unmarshal(p1, &ld)
- if err != nil {
- l.Debug("Unable to unmarshal the data", esl.Error(err))
- return nil, err
- }
-
- knownLicense := false
- knownScope := false
- for _, v := range KnownLicenseVersions {
- if ld.Version == v {
- knownLicense = true
- break
- }
- }
- for _, s := range KnownLicenseScopes {
- if ld.Scope == s {
- knownScope = true
- break
- }
- }
- if !knownLicense || !knownScope {
- l.Debug("Unknown license or scope", esl.Any("license", ld.Version), esl.Any("scope", ld.Scope))
- return nil, ErrorUnknownLicenseType
- }
- return
+ l := esl.Default()
+ if license == "" || len(data) == 0 {
+ l.Debug("License is empty")
+ return nil, ErrorUnknownLicenseType
+ }
+ keySalt := app_definitions.BuildInfo.LicenseSalt + license
+ p1, err := sc_obfuscate.Deobfuscate(l, []byte(keySalt), data)
+ if err != nil {
+ l.Debug("Unable to de-obfuscate the data", esl.Error(err))
+ return nil, err
+ }
+ ld = &LicenseData{}
+ err = json.Unmarshal(p1, &ld)
+ if err != nil {
+ l.Debug("Unable to unmarshal the data", esl.Error(err))
+ return nil, err
+ }
+
+ knownLicense := false
+ knownScope := false
+ for _, v := range KnownLicenseVersions {
+ if ld.Version == v {
+ knownLicense = true
+ break
+ }
+ }
+ for _, s := range KnownLicenseScopes {
+ if ld.Scope == s {
+ knownScope = true
+ break
+ }
+ }
+ if !knownLicense || !knownScope {
+ l.Debug("Unknown license or scope", esl.Any("license", ld.Version), esl.Any("scope", ld.Scope))
+ return nil, ErrorUnknownLicenseType
+ }
+ return
}
// DefaultWarningPeriod returns the default warning period for expiration in seconds.
func DefaultWarningPeriod(expiration time.Duration) time.Duration {
- warningPeriod := time.Duration(expiration.Seconds()*DefaultWarningPeriodFraction) * time.Second
- if warningPeriod < DefaultWarningMinimumPeriod {
- return DefaultWarningMinimumPeriod
- }
- if warningPeriod > DefaultWarningMaximumPeriod {
- return DefaultWarningMaximumPeriod
- }
- return warningPeriod
+ warningPeriod := time.Duration(expiration.Seconds()*DefaultWarningPeriodFraction) * time.Second
+ if warningPeriod < DefaultWarningMinimumPeriod {
+ return DefaultWarningMinimumPeriod
+ }
+ if warningPeriod > DefaultWarningMaximumPeriod {
+ return DefaultWarningMaximumPeriod
+ }
+ return warningPeriod
}
diff --git a/infra/control/app_license/license_additional_test.go b/infra/control/app_license/license_additional_test.go
index 27447c879..3cb442f78 100644
--- a/infra/control/app_license/license_additional_test.go
+++ b/infra/control/app_license/license_additional_test.go
@@ -1,200 +1,199 @@
package app_license
import (
- "strings"
- "testing"
- "time"
+ "strings"
+ "testing"
+ "time"
)
func TestLicenseData_IsInvalid(t *testing.T) {
- // Test with CopyTypeCachedNotFound
- ld := &LicenseData{
- Version: LicenseVersionV1,
- CopyType: CopyTypeCachedNotFound,
- }
- if !ld.IsInvalid() {
- t.Error("Expected license with CopyTypeCachedNotFound to be invalid")
- }
-
- // Test with expired lifecycle
- ld = &LicenseData{
- Version: LicenseVersionV1,
- Lifecycle: &LicenseLifecycle{
- AvailableAfter: -86400, // 1 day in the past from build time
- WarningAfter: 0,
- },
- }
- if !ld.IsInvalid() {
- t.Error("Expected expired license to be invalid")
- }
-
- // Test with valid license
- ld = &LicenseData{
- Version: LicenseVersionV1,
- Lifecycle: &LicenseLifecycle{
- AvailableAfter: 86400 * 365, // 1 year in future from build time
- WarningAfter: 86400 * 300,
- },
- }
- if ld.IsInvalid() {
- t.Error("Expected valid license to not be invalid")
- }
+ // Test with CopyTypeCachedNotFound
+ ld := &LicenseData{
+ Version: LicenseVersionV1,
+ CopyType: CopyTypeCachedNotFound,
+ }
+ if !ld.IsInvalid() {
+ t.Error("Expected license with CopyTypeCachedNotFound to be invalid")
+ }
+
+ // Test with expired lifecycle
+ ld = &LicenseData{
+ Version: LicenseVersionV1,
+ Lifecycle: &LicenseLifecycle{
+ AvailableAfter: -86400, // 1 day in the past from build time
+ WarningAfter: 0,
+ },
+ }
+ if !ld.IsInvalid() {
+ t.Error("Expected expired license to be invalid")
+ }
+
+ // Test with valid license
+ ld = &LicenseData{
+ Version: LicenseVersionV1,
+ Lifecycle: &LicenseLifecycle{
+ AvailableAfter: 86400 * 365, // 1 year in future from build time
+ WarningAfter: 86400 * 300,
+ },
+ }
+ if ld.IsInvalid() {
+ t.Error("Expected valid license to not be invalid")
+ }
}
func TestLicenseData_IsCacheTimeout(t *testing.T) {
- // Test with recent cache
- ld := &LicenseData{
- CachedAt: time.Now().Format(time.RFC3339),
- }
- if ld.IsCacheTimeout() {
- t.Error("Expected recent cache to not be timed out")
- }
-
- // Test with old cache
- ld = &LicenseData{
- CachedAt: time.Now().Add(-31 * 24 * time.Hour).Format(time.RFC3339), // Older than CacheTimeout
- }
- if !ld.IsCacheTimeout() {
- t.Error("Expected old cache to be timed out")
- }
-
- // Test with invalid date format
- ld = &LicenseData{
- CachedAt: "invalid-date",
- }
- if !ld.IsCacheTimeout() {
- t.Error("Expected invalid date to be treated as timed out")
- }
+ // Test with recent cache
+ ld := &LicenseData{
+ CachedAt: time.Now().Format(time.RFC3339),
+ }
+ if ld.IsCacheTimeout() {
+ t.Error("Expected recent cache to not be timed out")
+ }
+
+ // Test with old cache
+ ld = &LicenseData{
+ CachedAt: time.Now().Add(-31 * 24 * time.Hour).Format(time.RFC3339), // Older than CacheTimeout
+ }
+ if !ld.IsCacheTimeout() {
+ t.Error("Expected old cache to be timed out")
+ }
+
+ // Test with invalid date format
+ ld = &LicenseData{
+ CachedAt: "invalid-date",
+ }
+ if !ld.IsCacheTimeout() {
+ t.Error("Expected invalid date to be treated as timed out")
+ }
}
func TestLicenseData_WithMethods(t *testing.T) {
- // Test WithBinding
- ld := NewLicense(LicenseScopeBase)
- ld = ld.WithBinding(100, 200)
- if ld.Binding == nil {
- t.Error("Expected binding to be set")
- }
- if ld.Binding.ReleaseMinimum != 100 || ld.Binding.ReleaseMaximum != 200 {
- t.Error("Expected binding values to match")
- }
-
- // Test WithLicensee
- ld = ld.WithLicensee("Test User", "test@example.com")
- if ld.LicenseeName != "Test User" {
- t.Error("Expected licensee name to match")
- }
- if ld.LicenseeEmail != "test@example.com" {
- t.Error("Expected licensee email to match")
- }
-
- // Test WithLicensee with long name
- longName := strings.Repeat("a", 150)
- longEmail := strings.Repeat("b", 150) + "@example.com"
- ld = ld.WithLicensee(longName, longEmail)
- if len(ld.LicenseeName) > MaxLicenseeNameLength {
- t.Error("Expected licensee name to be truncated")
- }
- if len(ld.LicenseeEmail) > MaxLicenseeNameLength {
- t.Error("Expected licensee email to be truncated")
- }
-
- // Test Cache
- ld = ld.Cache()
- if ld.CachedAt == "" {
- t.Error("Expected cached time to be set")
- }
- if ld.CopyType != CopyTypeCachedValidLicense {
- t.Error("Expected copy type to be cached valid license")
- }
+ // Test WithBinding
+ ld := NewLicense(LicenseScopeBase)
+ ld = ld.WithBinding(100, 200)
+ if ld.Binding == nil {
+ t.Error("Expected binding to be set")
+ }
+ if ld.Binding.ReleaseMinimum != 100 || ld.Binding.ReleaseMaximum != 200 {
+ t.Error("Expected binding values to match")
+ }
+
+ // Test WithLicensee
+ ld = ld.WithLicensee("Test User", "test@example.com")
+ if ld.LicenseeName != "Test User" {
+ t.Error("Expected licensee name to match")
+ }
+ if ld.LicenseeEmail != "test@example.com" {
+ t.Error("Expected licensee email to match")
+ }
+
+ // Test WithLicensee with long name
+ longName := strings.Repeat("a", 150)
+ longEmail := strings.Repeat("b", 150) + "@example.com"
+ ld = ld.WithLicensee(longName, longEmail)
+ if len(ld.LicenseeName) > MaxLicenseeNameLength {
+ t.Error("Expected licensee name to be truncated")
+ }
+ if len(ld.LicenseeEmail) > MaxLicenseeNameLength {
+ t.Error("Expected licensee email to be truncated")
+ }
+
+ // Test Cache
+ ld = ld.Cache()
+ if ld.CachedAt == "" {
+ t.Error("Expected cached time to be set")
+ }
+ if ld.CopyType != CopyTypeCachedValidLicense {
+ t.Error("Expected copy type to be cached valid license")
+ }
}
func TestLicenseData_IsScopeEnabled(t *testing.T) {
- // Test with no scope
- ld := &LicenseData{
- Version: LicenseVersionV1,
- Scope: "",
- }
- if ld.IsScopeEnabled(LicenseScopeBase) {
- t.Error("Expected license with no scope to have no enabled scopes")
- }
-
- // Test with scope
- ld = &LicenseData{
- Version: LicenseVersionV1,
- Scope: LicenseScopeBase,
- }
- if !ld.IsScopeEnabled(LicenseScopeBase) {
- t.Error("Expected base scope to be enabled")
- }
- if ld.IsScopeEnabled("unknown-scope") {
- t.Error("Expected unknown scope to be disabled")
- }
+ // Test with no scope
+ ld := &LicenseData{
+ Version: LicenseVersionV1,
+ Scope: "",
+ }
+ if ld.IsScopeEnabled(LicenseScopeBase) {
+ t.Error("Expected license with no scope to have no enabled scopes")
+ }
+
+ // Test with scope
+ ld = &LicenseData{
+ Version: LicenseVersionV1,
+ Scope: LicenseScopeBase,
+ }
+ if !ld.IsScopeEnabled(LicenseScopeBase) {
+ t.Error("Expected base scope to be enabled")
+ }
+ if ld.IsScopeEnabled("unknown-scope") {
+ t.Error("Expected unknown scope to be disabled")
+ }
}
func TestLicenseData_IsRecipeEnabled(t *testing.T) {
- // Test with no recipes
- ld := &LicenseData{
- Version: LicenseVersionV1,
- Recipe: nil,
- }
- if ld.IsRecipeEnabled("any-recipe") {
- t.Error("Expected license with no recipes to have no enabled recipes")
- }
-
- // Test with recipes
- ld = &LicenseData{
- Version: LicenseVersionV1,
- Recipe: &LicenseRecipe{
- Allow: []string{"dropbox file list", "dropbox team info"},
- },
- }
- if !ld.IsRecipeEnabled("dropbox file list") {
- t.Error("Expected 'dropbox file list' to be enabled")
- }
- if !ld.IsRecipeEnabled("dropbox team info") {
- t.Error("Expected 'dropbox team info' to be enabled")
- }
- if ld.IsRecipeEnabled("unknown recipe") {
- t.Error("Expected unknown recipe to be disabled")
- }
+ // Test with no recipes
+ ld := &LicenseData{
+ Version: LicenseVersionV1,
+ Recipe: nil,
+ }
+ if ld.IsRecipeEnabled("any-recipe") {
+ t.Error("Expected license with no recipes to have no enabled recipes")
+ }
+
+ // Test with recipes
+ ld = &LicenseData{
+ Version: LicenseVersionV1,
+ Recipe: &LicenseRecipe{
+ Allow: []string{"dropbox file list", "dropbox team info"},
+ },
+ }
+ if !ld.IsRecipeEnabled("dropbox file list") {
+ t.Error("Expected 'dropbox file list' to be enabled")
+ }
+ if !ld.IsRecipeEnabled("dropbox team info") {
+ t.Error("Expected 'dropbox team info' to be enabled")
+ }
+ if ld.IsRecipeEnabled("unknown recipe") {
+ t.Error("Expected unknown recipe to be disabled")
+ }
}
func TestDefaultWarningPeriodAdditional(t *testing.T) {
- // Test short lifecycle (less than minimum)
- shortLifecycle := 3 * 24 * time.Hour
- warningPeriod := DefaultWarningPeriod(shortLifecycle)
- if warningPeriod != DefaultWarningMinimumPeriod {
- t.Errorf("Expected warning period to be minimum for short lifecycle, got %v", warningPeriod)
- }
-
- // Test medium lifecycle
- mediumLifecycle := 30 * 24 * time.Hour
- warningPeriod = DefaultWarningPeriod(mediumLifecycle)
- expectedPeriod := time.Duration(float64(mediumLifecycle) * DefaultWarningPeriodFraction)
- if warningPeriod != expectedPeriod {
- t.Errorf("Expected warning period to be %v for medium lifecycle, got %v", expectedPeriod, warningPeriod)
- }
-
- // Test long lifecycle (more than maximum)
- longLifecycle := 1000 * 24 * time.Hour
- warningPeriod = DefaultWarningPeriod(longLifecycle)
- if warningPeriod != DefaultWarningMaximumPeriod {
- t.Errorf("Expected warning period to be maximum for long lifecycle, got %v", warningPeriod)
- }
+ // Test short lifecycle (less than minimum)
+ shortLifecycle := 3 * 24 * time.Hour
+ warningPeriod := DefaultWarningPeriod(shortLifecycle)
+ if warningPeriod != DefaultWarningMinimumPeriod {
+ t.Errorf("Expected warning period to be minimum for short lifecycle, got %v", warningPeriod)
+ }
+
+ // Test medium lifecycle
+ mediumLifecycle := 30 * 24 * time.Hour
+ warningPeriod = DefaultWarningPeriod(mediumLifecycle)
+ expectedPeriod := time.Duration(float64(mediumLifecycle) * DefaultWarningPeriodFraction)
+ if warningPeriod != expectedPeriod {
+ t.Errorf("Expected warning period to be %v for medium lifecycle, got %v", expectedPeriod, warningPeriod)
+ }
+
+ // Test long lifecycle (more than maximum)
+ longLifecycle := 1000 * 24 * time.Hour
+ warningPeriod = DefaultWarningPeriod(longLifecycle)
+ if warningPeriod != DefaultWarningMaximumPeriod {
+ t.Errorf("Expected warning period to be maximum for long lifecycle, got %v", warningPeriod)
+ }
}
-
func TestNewLicenseBundleFromKeys(t *testing.T) {
- // Test with empty keys
- bundle := NewLicenseBundleFromKeys([]string{}, "/tmp")
- if bundle.IsValid() {
- t.Error("Expected bundle from empty keys to be invalid")
- }
-
- // Test with invalid keys - should skip invalid licenses
- bundle = NewLicenseBundleFromKeys([]string{"invalid-key-1", "invalid-key-2"}, "/tmp")
- // The function will try to load and cache, but with invalid keys it should result in empty valid licenses
- if bundle.IsValid() {
- t.Error("Expected bundle from invalid keys to be invalid")
- }
-}
\ No newline at end of file
+ // Test with empty keys
+ bundle := NewLicenseBundleFromKeys([]string{}, "/tmp")
+ if bundle.IsValid() {
+ t.Error("Expected bundle from empty keys to be invalid")
+ }
+
+ // Test with invalid keys - should skip invalid licenses
+ bundle = NewLicenseBundleFromKeys([]string{"invalid-key-1", "invalid-key-2"}, "/tmp")
+ // The function will try to load and cache, but with invalid keys it should result in empty valid licenses
+ if bundle.IsValid() {
+ t.Error("Expected bundle from invalid keys to be invalid")
+ }
+}
diff --git a/infra/control/app_license/license_test.go b/infra/control/app_license/license_test.go
index d39af109c..13e98bd24 100644
--- a/infra/control/app_license/license_test.go
+++ b/infra/control/app_license/license_test.go
@@ -1,153 +1,153 @@
package app_license
import (
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "testing"
- "time"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "testing"
+ "time"
)
func TestNewLicense(t *testing.T) {
- lic := NewLicense(LicenseScopeBase)
- if lic.Version != LicenseVersionCurrent {
- t.Error("Invalid version")
- }
- if lic.AppName != app_definitions.Name {
- t.Error("Invalid app name")
- }
- if lic.Scope != LicenseScopeBase {
- t.Error("Invalid scope")
- }
+ lic := NewLicense(LicenseScopeBase)
+ if lic.Version != LicenseVersionCurrent {
+ t.Error("Invalid version")
+ }
+ if lic.AppName != app_definitions.Name {
+ t.Error("Invalid app name")
+ }
+ if lic.Scope != LicenseScopeBase {
+ t.Error("Invalid scope")
+ }
- {
- availableAfter := int64(3600)
- warningAfter := int64(7200)
+ {
+ availableAfter := int64(3600)
+ warningAfter := int64(7200)
- lic1 := lic.WithLifecycle(&LicenseLifecycle{
- AvailableAfter: availableAfter,
- WarningAfter: warningAfter,
- })
- if lic1.Lifecycle.AvailableAfter != availableAfter || lic1.Lifecycle.WarningAfter != warningAfter {
- t.Error("Invalid lifecycle")
- }
- }
+ lic1 := lic.WithLifecycle(&LicenseLifecycle{
+ AvailableAfter: availableAfter,
+ WarningAfter: warningAfter,
+ })
+ if lic1.Lifecycle.AvailableAfter != availableAfter || lic1.Lifecycle.WarningAfter != warningAfter {
+ t.Error("Invalid lifecycle")
+ }
+ }
- {
- lic2 := lic.WithLicensee("Scott", "scott@example.com")
- if lic2.LicenseeName != "Scott" || lic2.LicenseeEmail != "scott@example.com" {
- t.Error("Invalid licensee")
- }
- }
+ {
+ lic2 := lic.WithLicensee("Scott", "scott@example.com")
+ if lic2.LicenseeName != "Scott" || lic2.LicenseeEmail != "scott@example.com" {
+ t.Error("Invalid licensee")
+ }
+ }
- {
- licRecipe := &LicenseRecipe{
- Allow: []string{
- "allow1",
- "allow2",
- },
- }
- lic1 := lic.WithRecipe(licRecipe)
- if lic1.Recipe.Allow[0] != "allow1" || lic1.Recipe.Allow[1] != "allow2" {
- t.Error("Invalid recipe")
- }
+ {
+ licRecipe := &LicenseRecipe{
+ Allow: []string{
+ "allow1",
+ "allow2",
+ },
+ }
+ lic1 := lic.WithRecipe(licRecipe)
+ if lic1.Recipe.Allow[0] != "allow1" || lic1.Recipe.Allow[1] != "allow2" {
+ t.Error("Invalid recipe")
+ }
- if !lic1.IsRecipeEnabled("allow1") {
- t.Error("recipe not enabled")
- }
- if lic1.IsRecipeEnabled("deny999") {
- t.Error("recipe enabled")
- }
- if lic1.IsRecipeEnabled("allow1deny8") {
- t.Error("recipe not enabled")
- }
- }
+ if !lic1.IsRecipeEnabled("allow1") {
+ t.Error("recipe not enabled")
+ }
+ if lic1.IsRecipeEnabled("deny999") {
+ t.Error("recipe enabled")
+ }
+ if lic1.IsRecipeEnabled("allow1deny8") {
+ t.Error("recipe not enabled")
+ }
+ }
- {
- licRecipe := &LicenseRecipe{
- AllowPrefix: "allow",
- }
- lic1 := lic.WithRecipe(licRecipe)
- if lic1.Recipe.AllowPrefix != "allow" {
- t.Error("Invalid recipe")
- }
+ {
+ licRecipe := &LicenseRecipe{
+ AllowPrefix: "allow",
+ }
+ lic1 := lic.WithRecipe(licRecipe)
+ if lic1.Recipe.AllowPrefix != "allow" {
+ t.Error("Invalid recipe")
+ }
- if !lic1.IsRecipeEnabled("allow ok") {
- t.Error("recipe not enabled")
- }
- if !lic1.IsRecipeEnabled("allow penguin") {
- t.Error("recipe not enabled")
- }
- if lic1.IsRecipeEnabled("deny999") {
- t.Error("recipe enabled")
- }
- if lic1.IsRecipeEnabled("allow1deny8") {
- t.Error("recipe enabled")
- }
- }
+ if !lic1.IsRecipeEnabled("allow ok") {
+ t.Error("recipe not enabled")
+ }
+ if !lic1.IsRecipeEnabled("allow penguin") {
+ t.Error("recipe not enabled")
+ }
+ if lic1.IsRecipeEnabled("deny999") {
+ t.Error("recipe enabled")
+ }
+ if lic1.IsRecipeEnabled("allow1deny8") {
+ t.Error("recipe enabled")
+ }
+ }
}
func TestIssueParse(t *testing.T) {
- lic := NewLicense(LicenseScopeBase)
- availableAfter := int64(3600)
- warningAfter := int64(7200)
- lic = lic.WithLifecycle(&LicenseLifecycle{
- AvailableAfter: availableAfter,
- WarningAfter: warningAfter,
- })
- lic = lic.WithRecipe(&LicenseRecipe{
- Allow: []string{
- "allow1",
- },
- })
- licData, key, err := lic.Seal()
- if err != nil {
- t.Error(err)
- }
- if len(key) < LicenseKeySize {
- t.Error("Invalid key")
- }
- li2, err := ParseLicense(licData, key)
- if err != nil {
- t.Error(err)
- }
- if lic.Scope != li2.Scope {
- t.Error("Invalid scope")
- }
- if lic.Lifecycle.AvailableAfter != li2.Lifecycle.AvailableAfter {
- t.Error("Invalid lifecycle")
- }
- if lic.Lifecycle.WarningAfter != li2.Lifecycle.WarningAfter {
- t.Error("Invalid lifecycle")
- }
- if lic.Recipe.Allow[0] != li2.Recipe.Allow[0] {
- t.Error("Invalid recipe")
- }
+ lic := NewLicense(LicenseScopeBase)
+ availableAfter := int64(3600)
+ warningAfter := int64(7200)
+ lic = lic.WithLifecycle(&LicenseLifecycle{
+ AvailableAfter: availableAfter,
+ WarningAfter: warningAfter,
+ })
+ lic = lic.WithRecipe(&LicenseRecipe{
+ Allow: []string{
+ "allow1",
+ },
+ })
+ licData, key, err := lic.Seal()
+ if err != nil {
+ t.Error(err)
+ }
+ if len(key) < LicenseKeySize {
+ t.Error("Invalid key")
+ }
+ li2, err := ParseLicense(licData, key)
+ if err != nil {
+ t.Error(err)
+ }
+ if lic.Scope != li2.Scope {
+ t.Error("Invalid scope")
+ }
+ if lic.Lifecycle.AvailableAfter != li2.Lifecycle.AvailableAfter {
+ t.Error("Invalid lifecycle")
+ }
+ if lic.Lifecycle.WarningAfter != li2.Lifecycle.WarningAfter {
+ t.Error("Invalid lifecycle")
+ }
+ if lic.Recipe.Allow[0] != li2.Recipe.Allow[0] {
+ t.Error("Invalid recipe")
+ }
}
func TestLicenseName(t *testing.T) {
- lic := NewLicense(LicenseScopeBase)
- _, key, err := lic.Seal()
- if err != nil {
- t.Error(err)
- }
- name := LicenseName(key)
- if len(name) < 1 {
- t.Error("Invalid name")
- }
+ lic := NewLicense(LicenseScopeBase)
+ _, key, err := lic.Seal()
+ if err != nil {
+ t.Error(err)
+ }
+ name := LicenseName(key)
+ if len(name) < 1 {
+ t.Error("Invalid name")
+ }
}
func TestDefaultWarningPeriod(t *testing.T) {
- if x := DefaultWarningPeriod(0); x != DefaultWarningMinimumPeriod {
- t.Error(x)
- }
+ if x := DefaultWarningPeriod(0); x != DefaultWarningMinimumPeriod {
+ t.Error(x)
+ }
- x0 := 365 * 24 * time.Hour
- y0 := time.Duration(x0.Seconds()*DefaultWarningPeriodFraction) * time.Second
- if x := DefaultWarningPeriod(x0); x != y0 {
- t.Error(x, y0)
- }
+ x0 := 365 * 24 * time.Hour
+ y0 := time.Duration(x0.Seconds()*DefaultWarningPeriodFraction) * time.Second
+ if x := DefaultWarningPeriod(x0); x != y0 {
+ t.Error(x, y0)
+ }
- x1 := 10 * 365 * 24 * time.Hour
- if x := DefaultWarningPeriod(x1); x != DefaultWarningMaximumPeriod {
- t.Error(x)
- }
+ x1 := 10 * 365 * 24 * time.Hour
+ if x := DefaultWarningPeriod(x1); x != DefaultWarningMaximumPeriod {
+ t.Error(x)
+ }
}
diff --git a/infra/control/app_license/simple_bundle_test.go b/infra/control/app_license/simple_bundle_test.go
index 6f7b63d5c..0328ba9c1 100644
--- a/infra/control/app_license/simple_bundle_test.go
+++ b/infra/control/app_license/simple_bundle_test.go
@@ -1,26 +1,26 @@
package app_license
import (
- "testing"
+ "testing"
)
func TestLicenseBundle_BasicMethods(t *testing.T) {
- // Test seal methods return errors
- bundle := LicenseBundle{}
-
- data, err := bundle.SealWithKey("test-key")
- if err != ErrorBundleCannotBeSealed {
- t.Error("Expected ErrorBundleCannotBeSealed from SealWithKey")
- }
- if data != nil {
- t.Error("Expected nil data from SealWithKey")
- }
-
- data, key, err := bundle.Seal()
- if err != ErrorBundleCannotBeSealed {
- t.Error("Expected ErrorBundleCannotBeSealed from Seal")
- }
- if data != nil || key != "" {
- t.Error("Expected nil data and empty key from Seal")
- }
-}
\ No newline at end of file
+ // Test seal methods return errors
+ bundle := LicenseBundle{}
+
+ data, err := bundle.SealWithKey("test-key")
+ if err != ErrorBundleCannotBeSealed {
+ t.Error("Expected ErrorBundleCannotBeSealed from SealWithKey")
+ }
+ if data != nil {
+ t.Error("Expected nil data from SealWithKey")
+ }
+
+ data, key, err := bundle.Seal()
+ if err != ErrorBundleCannotBeSealed {
+ t.Error("Expected ErrorBundleCannotBeSealed from Seal")
+ }
+ if data != nil || key != "" {
+ t.Error("Expected nil data and empty key from Seal")
+ }
+}
diff --git a/infra/control/app_license_key/doc.go b/infra/control/app_license_key/doc.go
new file mode 100644
index 000000000..21ea15bf1
--- /dev/null
+++ b/infra/control/app_license_key/doc.go
@@ -0,0 +1,2 @@
+// Package app_license_key provides functionalities for managing application license keys.
+package app_license_key
diff --git a/infra/control/app_license_registry/doc.go b/infra/control/app_license_registry/doc.go
new file mode 100644
index 000000000..7b0c3375b
--- /dev/null
+++ b/infra/control/app_license_registry/doc.go
@@ -0,0 +1,2 @@
+// Package app_license_registry provides a mechanism for issuing and revoking application licenses.
+package app_license_registry
diff --git a/infra/control/app_opt/common.go b/infra/control/app_opt/common.go
index 95f3b77f6..44b35286b 100644
--- a/infra/control/app_opt/common.go
+++ b/infra/control/app_opt/common.go
@@ -1,188 +1,188 @@
package app_opt
import (
- "encoding/json"
- "os"
- "runtime"
+ "encoding/json"
+ "os"
+ "runtime"
- "github.com/watermint/toolbox/essentials/model/mo_string"
- "github.com/watermint/toolbox/infra/control/app_budget"
+ "github.com/watermint/toolbox/essentials/model/mo_string"
+ "github.com/watermint/toolbox/infra/control/app_budget"
)
const (
- OutputNone = "none"
- OutputText = "text"
- OutputMarkdown = "markdown"
- OutputJson = "json"
- BudgetLow = "low"
- BudgetNormal = "normal"
- BudgetUnlimited = "unlimited"
- LangAuto = "auto"
- LangEnglish = "en"
- LangJapanese = "ja"
- RetainJobDataDefault = "default"
- RetainJobDataOnError = "on_error"
- RetainJobDataNone = "none"
+ OutputNone = "none"
+ OutputText = "text"
+ OutputMarkdown = "markdown"
+ OutputJson = "json"
+ BudgetLow = "low"
+ BudgetNormal = "normal"
+ BudgetUnlimited = "unlimited"
+ LangAuto = "auto"
+ LangEnglish = "en"
+ LangJapanese = "ja"
+ RetainJobDataDefault = "default"
+ RetainJobDataOnError = "on_error"
+ RetainJobDataNone = "none"
)
type ExtraOpts struct {
- AppKeys map[string]string `json:"app_keys,omitempty"`
- Experiments []string `json:"experiments,omitempty"`
+ AppKeys map[string]string `json:"app_keys,omitempty"`
+ Experiments []string `json:"experiments,omitempty"`
}
func (z ExtraOpts) AppKey(key string) (value string, found bool) {
- if z.AppKeys == nil {
- return "", false
- }
- value, found = z.AppKeys[key]
- return
+ if z.AppKeys == nil {
+ return "", false
+ }
+ value, found = z.AppKeys[key]
+ return
}
func (z ExtraOpts) HasExperiment(key string) bool {
- for _, experiment := range z.Experiments {
- if experiment == key {
- return true
- }
- }
- return false
+ for _, experiment := range z.Experiments {
+ if experiment == key {
+ return true
+ }
+ }
+ return false
}
type CommonOpts struct {
- // Automatically open the artifact folder, after successful execution
- AutoOpen bool `json:"auto_open,omitempty"`
+ // Automatically open the artifact folder, after successful execution
+ AutoOpen bool `json:"auto_open,omitempty"`
- // Limit bandwidth to downloading/uploading contents
- BandwidthKb int `json:"bandwidth_kb,omitempty"`
+ // Limit bandwidth to downloading/uploading contents
+ BandwidthKb int `json:"bandwidth_kb,omitempty"`
- // Set concurrency of worker execution
- Concurrency int `json:"concurrency,omitempty"`
+ // Set concurrency of worker execution
+ Concurrency int `json:"concurrency,omitempty"`
- // Enable debug mode
- Debug bool `json:"debug,omitempty"`
+ // Enable debug mode
+ Debug bool `json:"debug,omitempty"`
- // Enable verbose mode
- Verbose bool `json:"verbose,omitempty"`
+ // Enable verbose mode
+ Verbose bool `json:"verbose,omitempty"`
- // Enable experiments
- Experiment string `json:"experiment,omitempty"`
+ // Enable experiments
+ Experiment string `json:"experiment,omitempty"`
- // Language
- Lang mo_string.SelectString `json:"lang,omitempty"`
+ // Language
+ Lang mo_string.SelectString `json:"lang,omitempty"`
- // Memory budget
- BudgetMemory mo_string.SelectString `json:"budget_memory,omitempty"`
+ // Memory budget
+ BudgetMemory mo_string.SelectString `json:"budget_memory,omitempty"`
- // Storage budget
- BudgetStorage mo_string.SelectString `json:"budget_storage,omitempty"`
+ // Storage budget
+ BudgetStorage mo_string.SelectString `json:"budget_storage,omitempty"`
- // Job data
- RetainJobData mo_string.SelectString `json:"retain_job_data,omitempty"`
+ // Job data
+ RetainJobData mo_string.SelectString `json:"retain_job_data,omitempty"`
- // Set output format
- Output mo_string.SelectString `json:"output,omitempty"`
+ // Set output format
+ Output mo_string.SelectString `json:"output,omitempty"`
- // Set output format filter
- OutputFilter mo_string.OptionalString `json:"output_filter,omitempty"`
+ // Set output format filter
+ OutputFilter mo_string.OptionalString `json:"output_filter,omitempty"`
- // Explicitly set proxy the hostname and the port number
- Proxy mo_string.OptionalString `json:"proxy,omitempty"`
+ // Explicitly set proxy the hostname and the port number
+ Proxy mo_string.OptionalString `json:"proxy,omitempty"`
- // Path to auth database
- AuthDatabase mo_string.OptionalString `json:"auth_database,omitempty"`
+ // Path to auth database
+ AuthDatabase mo_string.OptionalString `json:"auth_database,omitempty"`
- // Quiet mode
- Quiet bool `json:"quiet,omitempty"`
+ // Quiet mode
+ Quiet bool `json:"quiet,omitempty"`
- // Do not store token in the file
- Secure bool `json:"secure,omitempty"`
+ // Do not store token in the file
+ Secure bool `json:"secure,omitempty"`
- // Skip logging
- SkipLogging bool `json:"skip_logging,omitempty"`
+ // Skip logging
+ SkipLogging bool `json:"skip_logging,omitempty"`
- // Extra parameters
- Extra mo_string.OptionalString `json:"extra,omitempty"`
+ // Extra parameters
+ Extra mo_string.OptionalString `json:"extra,omitempty"`
- // loaded extra options value
- extraCache *ExtraOpts `json:"extra_cache,omitempty"`
+ // loaded extra options value
+ extraCache *ExtraOpts `json:"-"`
- // Specify workspace path
- Workspace mo_string.OptionalString `json:"workspace,omitempty"`
+ // Specify workspace path
+ Workspace mo_string.OptionalString `json:"workspace,omitempty"`
}
// ExtraLoad Load extra opts
func (z *CommonOpts) ExtraLoad() error {
- if z.Extra == nil || !z.Extra.IsExists() {
- return nil
- }
-
- data, err := os.ReadFile(z.Extra.Value())
- if err != nil {
- return err
- }
-
- e := &ExtraOpts{}
- if err := json.Unmarshal(data, e); err != nil {
- return err
- }
-
- z.extraCache = e
- return nil
+ if z.Extra == nil || !z.Extra.IsExists() {
+ return nil
+ }
+
+ data, err := os.ReadFile(z.Extra.Value())
+ if err != nil {
+ return err
+ }
+
+ e := &ExtraOpts{}
+ if err := json.Unmarshal(data, e); err != nil {
+ return err
+ }
+
+ z.extraCache = e
+ return nil
}
func (z *CommonOpts) ShouldDeleteJobData(err error) bool {
- switch z.RetainJobData.Value() {
- case RetainJobDataNone:
- // remove job data on exit
- return true
-
- case RetainJobDataOnError:
- if err != nil {
- return true
- }
- }
-
- return false
+ switch z.RetainJobData.Value() {
+ case RetainJobDataNone:
+ // remove job data on exit
+ return true
+
+ case RetainJobDataOnError:
+ if err != nil {
+ return true
+ }
+ }
+
+ return false
}
func (z *CommonOpts) ExtraOpts() ExtraOpts {
- if z.extraCache == nil {
- return ExtraOpts{}
- }
- return *z.extraCache
+ if z.extraCache == nil {
+ return ExtraOpts{}
+ }
+ return *z.extraCache
}
func (z *CommonOpts) Preset() {
- z.AutoOpen = false
- z.BandwidthKb = 0
- z.Concurrency = runtime.NumCPU()
- z.Debug = false
- z.Verbose = false
- z.SkipLogging = false
- z.Experiment = ""
- z.BudgetMemory.SetOptions(BudgetNormal, BudgetLow, BudgetNormal)
- z.BudgetStorage.SetOptions(string(app_budget.DefaultBudget), app_budget.StorageBudgets...)
- z.RetainJobData.SetOptions(RetainJobDataDefault, RetainJobDataDefault, RetainJobDataOnError, RetainJobDataNone)
- z.Lang.SetOptions(LangAuto, LangAuto, LangEnglish, LangJapanese)
- z.Output.SetOptions(OutputText, OutputText, OutputMarkdown, OutputJson, OutputNone)
- z.Proxy = mo_string.NewOptional("")
- z.AuthDatabase = mo_string.NewOptional("")
- z.Quiet = false
- z.Secure = false
- z.Workspace = mo_string.NewOptional("")
- z.Extra = mo_string.NewOptional("")
+ z.AutoOpen = false
+ z.BandwidthKb = 0
+ z.Concurrency = runtime.NumCPU()
+ z.Debug = false
+ z.Verbose = false
+ z.SkipLogging = false
+ z.Experiment = ""
+ z.BudgetMemory.SetOptions(BudgetNormal, BudgetLow, BudgetNormal)
+ z.BudgetStorage.SetOptions(string(app_budget.DefaultBudget), app_budget.StorageBudgets...)
+ z.RetainJobData.SetOptions(RetainJobDataDefault, RetainJobDataDefault, RetainJobDataOnError, RetainJobDataNone)
+ z.Lang.SetOptions(LangAuto, LangAuto, LangEnglish, LangJapanese)
+ z.Output.SetOptions(OutputText, OutputText, OutputMarkdown, OutputJson, OutputNone)
+ z.Proxy = mo_string.NewOptional("")
+ z.AuthDatabase = mo_string.NewOptional("")
+ z.Quiet = false
+ z.Secure = false
+ z.Workspace = mo_string.NewOptional("")
+ z.Extra = mo_string.NewOptional("")
}
func Default() CommonOpts {
- com := CommonOpts{}
- com.Workspace = mo_string.NewOptional("")
- com.Proxy = mo_string.NewOptional("")
- com.BudgetMemory = mo_string.NewSelect()
- com.BudgetStorage = mo_string.NewSelect()
- com.RetainJobData = mo_string.NewSelect()
- com.Lang = mo_string.NewSelect()
- com.Output = mo_string.NewSelect()
- com.OutputFilter = mo_string.NewOptional("")
- com.Extra = mo_string.NewOptional("")
- com.Preset()
- return com
+ com := CommonOpts{}
+ com.Workspace = mo_string.NewOptional("")
+ com.Proxy = mo_string.NewOptional("")
+ com.BudgetMemory = mo_string.NewSelect()
+ com.BudgetStorage = mo_string.NewSelect()
+ com.RetainJobData = mo_string.NewSelect()
+ com.Lang = mo_string.NewSelect()
+ com.Output = mo_string.NewSelect()
+ com.OutputFilter = mo_string.NewOptional("")
+ com.Extra = mo_string.NewOptional("")
+ com.Preset()
+ return com
}
diff --git a/infra/control/app_opt/common_test.go b/infra/control/app_opt/common_test.go
index da0aabe8e..d06eb6097 100644
--- a/infra/control/app_opt/common_test.go
+++ b/infra/control/app_opt/common_test.go
@@ -3,8 +3,8 @@ package app_opt
import "testing"
func TestDefault(t *testing.T) {
- com := Default()
- if com.Concurrency < 1 {
- t.Error(com.Concurrency)
- }
+ com := Default()
+ if com.Concurrency < 1 {
+ t.Error(com.Concurrency)
+ }
}
diff --git a/infra/control/app_opt/doc.go b/infra/control/app_opt/doc.go
new file mode 100644
index 000000000..135eb3562
--- /dev/null
+++ b/infra/control/app_opt/doc.go
@@ -0,0 +1,2 @@
+// Package app_opt defines `CommonOpts` for application-wide options.
+package app_opt
diff --git a/infra/control/app_queue/doc.go b/infra/control/app_queue/doc.go
new file mode 100644
index 000000000..e6dd5a750
--- /dev/null
+++ b/infra/control/app_queue/doc.go
@@ -0,0 +1,2 @@
+// Package app_queue provides functions for creating and configuring queue sequences and definitions.
+package app_queue
diff --git a/infra/control/app_queue/queue.go b/infra/control/app_queue/queue.go
index c2dcfa1d8..12f9545c3 100644
--- a/infra/control/app_queue/queue.go
+++ b/infra/control/app_queue/queue.go
@@ -1,91 +1,91 @@
package app_queue
import (
- "github.com/watermint/toolbox/essentials/ambient/ea_indicator"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/queue/eq_bundle"
- "github.com/watermint/toolbox/essentials/queue/eq_pipe"
- "github.com/watermint/toolbox/essentials/queue/eq_pipe_preserve"
- "github.com/watermint/toolbox/essentials/queue/eq_progress"
- "github.com/watermint/toolbox/essentials/queue/eq_queue"
- "github.com/watermint/toolbox/essentials/queue/eq_sequence"
- "github.com/watermint/toolbox/essentials/strings/es_uuid"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "github.com/watermint/toolbox/infra/control/app_error"
- "github.com/watermint/toolbox/infra/control/app_feature"
- "github.com/watermint/toolbox/infra/control/app_workspace"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "os"
- "path/filepath"
+ "github.com/watermint/toolbox/essentials/ambient/ea_indicator"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/queue/eq_bundle"
+ "github.com/watermint/toolbox/essentials/queue/eq_pipe"
+ "github.com/watermint/toolbox/essentials/queue/eq_pipe_preserve"
+ "github.com/watermint/toolbox/essentials/queue/eq_progress"
+ "github.com/watermint/toolbox/essentials/queue/eq_queue"
+ "github.com/watermint/toolbox/essentials/queue/eq_sequence"
+ "github.com/watermint/toolbox/essentials/strings/es_uuid"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/infra/control/app_error"
+ "github.com/watermint/toolbox/infra/control/app_feature"
+ "github.com/watermint/toolbox/infra/control/app_workspace"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
+ "os"
+ "path/filepath"
)
func selectBatchFetchPolicy(fe app_feature.Feature) eq_bundle.FetchPolicy {
- if fe.Experiment(app_definitions.ExperimentBatchRandom) {
- return eq_bundle.FetchRandom
- }
- if fe.Experiment(app_definitions.ExperimentBatchSequential) {
- return eq_bundle.FetchSequential
- }
- if fe.Experiment(app_definitions.ExperimentBatchBalance) {
- return eq_bundle.FetchBalance
- }
- return eq_bundle.FetchBalance
+ if fe.Experiment(app_definitions.ExperimentBatchRandom) {
+ return eq_bundle.FetchRandom
+ }
+ if fe.Experiment(app_definitions.ExperimentBatchSequential) {
+ return eq_bundle.FetchSequential
+ }
+ if fe.Experiment(app_definitions.ExperimentBatchBalance) {
+ return eq_bundle.FetchBalance
+ }
+ return eq_bundle.FetchBalance
}
func selectDurableSetting(fe app_feature.Feature) (durable bool, cacheSize int) {
- if fe.Experiment(app_definitions.ExperimentBatchNonDurable) {
- return false, 100 * fe.Concurrency()
- } else {
- return true, 100
- }
+ if fe.Experiment(app_definitions.ExperimentBatchNonDurable) {
+ return false, 100 * fe.Concurrency()
+ } else {
+ return true, 100
+ }
}
func NewSequence(lg esl.Logger, fe app_feature.Feature, ui app_ui.UI, wb app_workspace.Bundle) (seq eq_sequence.Sequence, er app_error.ErrorReport) {
- seqPathSeed := es_uuid.NewV4().String()
- preservePath := filepath.Join(wb.Workspace().KVS(), "seq", seqPathSeed)
- if err := os.MkdirAll(preservePath, 0755); err != nil {
- lg.Warn("Unable to create preserve path", esl.Error(err))
- }
- preserve := eq_pipe_preserve.NewFactory(lg, preservePath)
- factory := eq_pipe.NewSimple(lg, preserve)
- progress := eq_progress.NewProgress(ea_indicator.Global())
- durable, cacheSize := selectDurableSetting(fe)
+ seqPathSeed := es_uuid.NewV4().String()
+ preservePath := filepath.Join(wb.Workspace().KVS(), "seq", seqPathSeed)
+ if err := os.MkdirAll(preservePath, 0755); err != nil {
+ lg.Warn("Unable to create preserve path", esl.Error(err))
+ }
+ preserve := eq_pipe_preserve.NewFactory(lg, preservePath)
+ factory := eq_pipe.NewSimple(lg, preserve)
+ progress := eq_progress.NewProgress(ea_indicator.Global())
+ durable, cacheSize := selectDurableSetting(fe)
- er = app_error.NewErrorReport(lg, wb, ui)
+ er = app_error.NewErrorReport(lg, wb, ui)
- seq = eq_sequence.New(
- eq_queue.AddErrorListener(er.ErrorListener),
- eq_queue.Factory(factory),
- eq_queue.FetchPolicy(selectBatchFetchPolicy(fe)),
- eq_queue.Logger(lg),
- eq_queue.NumWorker(fe.Concurrency()),
- eq_queue.Progress(progress),
- eq_queue.Verbose(fe.IsVerbose()),
- eq_queue.CacheSize(cacheSize),
- eq_queue.Durable(durable),
- )
- return
+ seq = eq_sequence.New(
+ eq_queue.AddErrorListener(er.ErrorListener),
+ eq_queue.Factory(factory),
+ eq_queue.FetchPolicy(selectBatchFetchPolicy(fe)),
+ eq_queue.Logger(lg),
+ eq_queue.NumWorker(fe.Concurrency()),
+ eq_queue.Progress(progress),
+ eq_queue.Verbose(fe.IsVerbose()),
+ eq_queue.CacheSize(cacheSize),
+ eq_queue.Durable(durable),
+ )
+ return
}
func NewQueue(lg esl.Logger, fe app_feature.Feature, wb app_workspace.Bundle) (q eq_queue.Definition) {
- seqPathSeed := es_uuid.NewV4().String()
- preservePath := filepath.Join(wb.Workspace().KVS(), "queue", seqPathSeed)
- if err := os.MkdirAll(preservePath, 0755); err != nil {
- lg.Warn("Unable to create preserve path", esl.Error(err))
- }
- preserve := eq_pipe_preserve.NewFactory(lg, preservePath)
- factory := eq_pipe.NewSimple(lg, preserve)
- progress := eq_progress.NewProgress(ea_indicator.Global())
- durable, cacheSize := selectDurableSetting(fe)
+ seqPathSeed := es_uuid.NewV4().String()
+ preservePath := filepath.Join(wb.Workspace().KVS(), "queue", seqPathSeed)
+ if err := os.MkdirAll(preservePath, 0755); err != nil {
+ lg.Warn("Unable to create preserve path", esl.Error(err))
+ }
+ preserve := eq_pipe_preserve.NewFactory(lg, preservePath)
+ factory := eq_pipe.NewSimple(lg, preserve)
+ progress := eq_progress.NewProgress(ea_indicator.Global())
+ durable, cacheSize := selectDurableSetting(fe)
- return eq_queue.New(
- eq_queue.Factory(factory),
- eq_queue.FetchPolicy(selectBatchFetchPolicy(fe)),
- eq_queue.Logger(lg),
- eq_queue.NumWorker(fe.Concurrency()),
- eq_queue.Progress(progress),
- eq_queue.Verbose(fe.IsVerbose()),
- eq_queue.CacheSize(cacheSize),
- eq_queue.Durable(durable),
- )
+ return eq_queue.New(
+ eq_queue.Factory(factory),
+ eq_queue.FetchPolicy(selectBatchFetchPolicy(fe)),
+ eq_queue.Logger(lg),
+ eq_queue.NumWorker(fe.Concurrency()),
+ eq_queue.Progress(progress),
+ eq_queue.Verbose(fe.IsVerbose()),
+ eq_queue.CacheSize(cacheSize),
+ eq_queue.Durable(durable),
+ )
}
diff --git a/infra/control/app_resource/bundle.go b/infra/control/app_resource/bundle.go
index cee8f24db..34bac0aa4 100644
--- a/infra/control/app_resource/bundle.go
+++ b/infra/control/app_resource/bundle.go
@@ -1,6 +1,6 @@
package app_resource
-import "github.com/watermint/toolbox/essentials/go/es_resource"
+import "github.com/watermint/toolbox/essentials/es_go/es_resource"
var (
bundle = es_resource.EmptyBundle()
diff --git a/infra/control/app_resource/doc.go b/infra/control/app_resource/doc.go
new file mode 100644
index 000000000..a8964c381
--- /dev/null
+++ b/infra/control/app_resource/doc.go
@@ -0,0 +1,2 @@
+// Package app_resource provides a global singleton for managing application resources.
+package app_resource
diff --git a/infra/control/app_shutdown/doc.go b/infra/control/app_shutdown/doc.go
new file mode 100644
index 000000000..6355629b8
--- /dev/null
+++ b/infra/control/app_shutdown/doc.go
@@ -0,0 +1,2 @@
+// Package app_shutdown provides a mechanism for registering and flushing shutdown hooks.
+package app_shutdown
diff --git a/infra/control/app_workspace/doc.go b/infra/control/app_workspace/doc.go
new file mode 100644
index 000000000..e14c6b8ff
--- /dev/null
+++ b/infra/control/app_workspace/doc.go
@@ -0,0 +1,2 @@
+// Package app_workspace defines interfaces and provides implementations for managing application workspaces.
+package app_workspace
diff --git a/infra/control/doc.go b/infra/control/doc.go
new file mode 100644
index 000000000..08c955f4e
--- /dev/null
+++ b/infra/control/doc.go
@@ -0,0 +1,2 @@
+// Package control provides essential functionalities for application control and management.
+package control
diff --git a/infra/data/da_griddata/doc.go b/infra/data/da_griddata/doc.go
new file mode 100644
index 000000000..10d6e074a
--- /dev/null
+++ b/infra/data/da_griddata/doc.go
@@ -0,0 +1,2 @@
+// Package da_griddata provides interfaces and implementations for handling grid-like data.
+package da_griddata
diff --git a/infra/data/da_griddata/input.go b/infra/data/da_griddata/input.go
index 82bac714c..21b7ddf07 100644
--- a/infra/data/da_griddata/input.go
+++ b/infra/data/da_griddata/input.go
@@ -1,14 +1,15 @@
package da_griddata
import (
- "errors"
- "github.com/watermint/toolbox/essentials/encoding/es_unicode"
- "github.com/watermint/toolbox/essentials/io/es_file_read"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "io"
- "os"
+ "errors"
+ "io"
+ "os"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_unicode"
+ "github.com/watermint/toolbox/essentials/io/es_file_read"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
)
type GridDataInput interface {
diff --git a/infra/data/da_griddata/output_console.go b/infra/data/da_griddata/output_console.go
index d23508567..b1129bcd4 100644
--- a/infra/data/da_griddata/output_console.go
+++ b/infra/data/da_griddata/output_console.go
@@ -1,9 +1,10 @@
package da_griddata
import (
- "github.com/watermint/toolbox/essentials/io/es_stdout"
- "github.com/watermint/toolbox/infra/control/app_control"
- "sync"
+ "sync"
+
+ "github.com/watermint/toolbox/essentials/io/es_stdout"
+ "github.com/watermint/toolbox/infra/control/app_control"
)
func NewConsoleWriter(formatter GridDataFormatter, pw PlainGridDataWriter) GridDataWriter {
diff --git a/infra/data/da_griddata/output_console_test.go b/infra/data/da_griddata/output_console_test.go
index 568c7f3de..8fda0e3f3 100644
--- a/infra/data/da_griddata/output_console_test.go
+++ b/infra/data/da_griddata/output_console_test.go
@@ -1,24 +1,25 @@
package da_griddata
import (
- "bytes"
- "fmt"
- "io"
- "testing"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
+ "bytes"
+ "fmt"
+ "io"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
func TestNewConsoleWriter(t *testing.T) {
formatter := &PlainGridDataFormatter{}
pw := NewCsvWriter()
-
+
w := NewConsoleWriter(formatter, pw)
if w == nil {
t.Error("Expected non-nil console writer")
}
-
+
cw, ok := w.(*consoleWriter)
if !ok {
t.Error("Expected consoleWriter type")
@@ -38,7 +39,7 @@ func TestConsoleWriter_Name(t *testing.T) {
w := &consoleWriter{
name: "test-console",
}
-
+
name := w.Name()
if name != "test-console" {
t.Errorf("Expected name 'test-console', got '%s'", name)
@@ -48,19 +49,19 @@ func TestConsoleWriter_Name(t *testing.T) {
func TestConsoleWriter_Open(t *testing.T) {
err := qt_control.WithControl(func(ctl app_control.Control) error {
w := &consoleWriter{}
-
+
err := w.Open(ctl)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
-
+
if w.ctl == nil {
t.Error("Expected control to be set after Open")
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -68,7 +69,7 @@ func TestConsoleWriter_Open(t *testing.T) {
func TestConsoleWriter_Close(t *testing.T) {
w := &consoleWriter{}
-
+
// Should not panic
w.Close()
}
@@ -80,7 +81,7 @@ func TestConsoleWriter_Row(t *testing.T) {
suffix: ".test",
writes: make([]string, 0),
}
-
+
formatter := &PlainGridDataFormatter{}
w := &consoleWriter{
ctl: ctl,
@@ -89,31 +90,31 @@ func TestConsoleWriter_Row(t *testing.T) {
pw: mpw,
row: 0,
}
-
+
// Test writing rows
testData := [][]interface{}{
{"row1", "col2", "col3"},
{1, 2, 3},
{"mixed", 123, true},
}
-
+
for i, row := range testData {
w.Row(row)
-
+
// Verify row index incremented
if w.row != i+1 {
t.Errorf("Expected row index %d, got %d", i+1, w.row)
}
}
-
+
// Verify we wrote the correct number of rows
if len(mpw.writes) != len(testData) {
t.Errorf("Expected %d writes, got %d", len(testData), len(mpw.writes))
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -125,7 +126,7 @@ func TestConsoleWriter_ConcurrentRow(t *testing.T) {
suffix: ".test",
writes: make([]string, 0),
}
-
+
formatter := &PlainGridDataFormatter{}
w := &consoleWriter{
ctl: ctl,
@@ -134,7 +135,7 @@ func TestConsoleWriter_ConcurrentRow(t *testing.T) {
pw: mpw,
row: 0,
}
-
+
// Test concurrent writes
done := make(chan bool)
for i := 0; i < 10; i++ {
@@ -143,20 +144,20 @@ func TestConsoleWriter_ConcurrentRow(t *testing.T) {
done <- true
}(i)
}
-
+
// Wait for all goroutines
for i := 0; i < 10; i++ {
<-done
}
-
+
// Should have 10 rows written
if w.row != 10 {
t.Errorf("Expected row count 10, got %d", w.row)
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -183,4 +184,4 @@ func (m *mockPlainWriter) WriteRow(l esl.Logger, w io.Writer, formatter GridData
m.writes = append(m.writes, buf.String())
_, err := w.Write(buf.Bytes())
return err
-}
\ No newline at end of file
+}
diff --git a/infra/data/da_griddata/output_csv_test.go b/infra/data/da_griddata/output_csv_test.go
index 6c4efe72a..fadae87e4 100644
--- a/infra/data/da_griddata/output_csv_test.go
+++ b/infra/data/da_griddata/output_csv_test.go
@@ -1,10 +1,11 @@
package da_griddata
import (
- "bytes"
- "strings"
- "testing"
- "github.com/watermint/toolbox/essentials/log/esl"
+ "bytes"
+ "strings"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
)
func TestNewCsvWriter(t *testing.T) {
@@ -12,7 +13,7 @@ func TestNewCsvWriter(t *testing.T) {
if w == nil {
t.Error("Expected non-nil CSV writer")
}
-
+
cw, ok := w.(*csvWriter)
if !ok {
t.Error("Expected csvWriter type")
@@ -24,7 +25,7 @@ func TestNewCsvWriter(t *testing.T) {
func TestCsvWriter_FileSuffix(t *testing.T) {
w := &csvWriter{}
-
+
suffix := w.FileSuffix()
if suffix != ".csv" {
t.Errorf("Expected file suffix '.csv', got '%s'", suffix)
@@ -35,7 +36,7 @@ func TestCsvWriter_WriteRow(t *testing.T) {
w := &csvWriter{}
l := esl.Default()
formatter := &PlainGridDataFormatter{}
-
+
tests := []struct {
name string
row int
@@ -103,7 +104,7 @@ func TestCsvWriter_WriteRow(t *testing.T) {
expected: "1.500000,2.500000",
},
}
-
+
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
buf := &bytes.Buffer{}
@@ -111,7 +112,7 @@ func TestCsvWriter_WriteRow(t *testing.T) {
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
-
+
result := strings.TrimSpace(buf.String())
if result != tt.expected {
t.Errorf("Expected '%s', got '%s'", tt.expected, result)
@@ -124,7 +125,7 @@ func TestCsvWriter_WriteRow_Error(t *testing.T) {
w := &csvWriter{}
l := esl.Default()
formatter := &PlainGridDataFormatter{}
-
+
// Test with writer that always fails
errWriter := &errorWriter{}
err := w.WriteRow(l, errWriter, formatter, 0, []interface{}{"test"})
@@ -138,4 +139,4 @@ type errorWriter struct{}
func (e *errorWriter) Write(p []byte) (n int, err error) {
return 0, bytes.ErrTooLarge
-}
\ No newline at end of file
+}
diff --git a/infra/data/da_griddata/output_json.go b/infra/data/da_griddata/output_json.go
index 335265d8c..bdd04ada5 100644
--- a/infra/data/da_griddata/output_json.go
+++ b/infra/data/da_griddata/output_json.go
@@ -1,9 +1,10 @@
package da_griddata
import (
- "encoding/json"
- "github.com/watermint/toolbox/essentials/log/esl"
- "io"
+ "encoding/json"
+ "io"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
)
func NewJsonWriter() PlainGridDataWriter {
diff --git a/infra/data/da_griddata/output_json_test.go b/infra/data/da_griddata/output_json_test.go
index 47e381511..c9aefda5b 100644
--- a/infra/data/da_griddata/output_json_test.go
+++ b/infra/data/da_griddata/output_json_test.go
@@ -1,11 +1,12 @@
package da_griddata
import (
- "bytes"
- "encoding/json"
- "strings"
- "testing"
- "github.com/watermint/toolbox/essentials/log/esl"
+ "bytes"
+ "encoding/json"
+ "strings"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
)
func TestNewJsonWriter(t *testing.T) {
@@ -13,7 +14,7 @@ func TestNewJsonWriter(t *testing.T) {
if w == nil {
t.Error("Expected non-nil JSON writer")
}
-
+
jw, ok := w.(*jsonWriter)
if !ok {
t.Error("Expected jsonWriter type")
@@ -25,7 +26,7 @@ func TestNewJsonWriter(t *testing.T) {
func TestJsonWriter_FileSuffix(t *testing.T) {
w := &jsonWriter{}
-
+
suffix := w.FileSuffix()
if suffix != ".json" {
t.Errorf("Expected file suffix '.json', got '%s'", suffix)
@@ -36,7 +37,7 @@ func TestJsonWriter_WriteRow(t *testing.T) {
w := &jsonWriter{}
l := esl.Default()
formatter := &PlainGridDataFormatter{}
-
+
tests := []struct {
name string
row int
@@ -78,7 +79,7 @@ func TestJsonWriter_WriteRow(t *testing.T) {
column: []interface{}{map[string]interface{}{"key": "value"}, []int{1, 2, 3}},
},
}
-
+
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
buf := &bytes.Buffer{}
@@ -86,16 +87,16 @@ func TestJsonWriter_WriteRow(t *testing.T) {
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
-
+
result := strings.TrimSpace(buf.String())
-
+
// Verify it's valid JSON
var parsed []interface{}
err = json.Unmarshal([]byte(result), &parsed)
if err != nil {
t.Errorf("Invalid JSON output: %v", err)
}
-
+
// Verify the number of elements
if len(parsed) != len(tt.column) {
t.Errorf("Expected %d elements, got %d", len(tt.column), len(parsed))
@@ -108,7 +109,7 @@ func TestJsonWriter_WriteRow_Error(t *testing.T) {
w := &jsonWriter{}
l := esl.Default()
formatter := &PlainGridDataFormatter{}
-
+
// Test with writer that always fails
errWriter := &errorJsonWriter{}
err := w.WriteRow(l, errWriter, formatter, 0, []interface{}{"test"})
@@ -129,7 +130,7 @@ func TestJsonWriter_WriteRow_MarshalError(t *testing.T) {
w := &jsonWriter{}
l := esl.Default()
formatter := &badFormatter{}
-
+
buf := &bytes.Buffer{}
err := w.WriteRow(l, buf, formatter, 0, []interface{}{"test"})
if err == nil {
@@ -142,4 +143,4 @@ type errorJsonWriter struct{}
func (e *errorJsonWriter) Write(p []byte) (n int, err error) {
return 0, bytes.ErrTooLarge
-}
\ No newline at end of file
+}
diff --git a/infra/data/da_griddata/output_plain.go b/infra/data/da_griddata/output_plain.go
index da43b340a..de5383c90 100644
--- a/infra/data/da_griddata/output_plain.go
+++ b/infra/data/da_griddata/output_plain.go
@@ -1,11 +1,12 @@
package da_griddata
import (
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "os"
- "path/filepath"
- "sync"
+ "os"
+ "path/filepath"
+ "sync"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
)
func NewPlainWriter(name, path string, formatter GridDataFormatter, writer PlainGridDataWriter) GridDataWriter {
diff --git a/infra/data/da_griddata/spec.go b/infra/data/da_griddata/spec.go
index 6aad8a971..f3d8cc260 100644
--- a/infra/data/da_griddata/spec.go
+++ b/infra/data/da_griddata/spec.go
@@ -1,7 +1,7 @@
package da_griddata
import (
- "github.com/watermint/toolbox/essentials/go/es_reflect"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
"github.com/watermint/toolbox/essentials/strings/es_case"
"github.com/watermint/toolbox/infra/doc/dc_recipe"
"github.com/watermint/toolbox/infra/ui/app_msg"
diff --git a/infra/data/da_json/doc.go b/infra/data/da_json/doc.go
new file mode 100644
index 000000000..d06ec915f
--- /dev/null
+++ b/infra/data/da_json/doc.go
@@ -0,0 +1,2 @@
+// Package da_json provides functionalities for reading and parsing JSON data from files.
+package da_json
diff --git a/infra/data/da_json/input.go b/infra/data/da_json/input.go
index 353881f59..ba73b205f 100644
--- a/infra/data/da_json/input.go
+++ b/infra/data/da_json/input.go
@@ -10,7 +10,7 @@ import (
"strings"
"github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
"github.com/watermint/toolbox/essentials/io/es_file_read"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/infra/data/da_json/spec.go b/infra/data/da_json/spec.go
index dfcd94dad..a9e97be18 100644
--- a/infra/data/da_json/spec.go
+++ b/infra/data/da_json/spec.go
@@ -1,7 +1,7 @@
package da_json
import (
- "github.com/watermint/toolbox/essentials/go/es_reflect"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
"github.com/watermint/toolbox/essentials/strings/es_case"
"github.com/watermint/toolbox/infra/doc/dc_recipe"
"github.com/watermint/toolbox/infra/ui/app_msg"
diff --git a/infra/data/da_json_test/doc.go b/infra/data/da_json_test/doc.go
new file mode 100644
index 000000000..4898aa440
--- /dev/null
+++ b/infra/data/da_json_test/doc.go
@@ -0,0 +1,2 @@
+// Package da_json_test contains tests for the `da_json` package.
+package da_json_test
diff --git a/infra/data/da_text/doc.go b/infra/data/da_text/doc.go
new file mode 100644
index 000000000..7f813b2cc
--- /dev/null
+++ b/infra/data/da_text/doc.go
@@ -0,0 +1,2 @@
+// Package da_text provides functionalities for reading text data from files.
+package da_text
diff --git a/infra/data/da_text/spec.go b/infra/data/da_text/spec.go
index 3db45628e..62a7d447a 100644
--- a/infra/data/da_text/spec.go
+++ b/infra/data/da_text/spec.go
@@ -1,7 +1,7 @@
package da_text
import (
- "github.com/watermint/toolbox/essentials/go/es_reflect"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
"github.com/watermint/toolbox/essentials/strings/es_case"
"github.com/watermint/toolbox/infra/doc/dc_recipe"
"github.com/watermint/toolbox/infra/ui/app_msg"
diff --git a/infra/data/doc.go b/infra/data/doc.go
new file mode 100644
index 000000000..1a9c61e9d
--- /dev/null
+++ b/infra/data/doc.go
@@ -0,0 +1,2 @@
+// Package data provides essential functionalities for data handling.
+package data
diff --git a/infra/doc/dc_announcement/announcements.go b/infra/doc/dc_announcement/announcements.go
index 78260904b..b6cdbe965 100644
--- a/infra/doc/dc_announcement/announcements.go
+++ b/infra/doc/dc_announcement/announcements.go
@@ -1,13 +1,14 @@
package dc_announcement
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_project"
- "github.com/watermint/toolbox/infra/doc/dc_section"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "os"
- "path/filepath"
+ "os"
+ "path/filepath"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
+ "github.com/watermint/toolbox/infra/doc/dc_section"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
type AnnouncementNode struct {
diff --git a/infra/doc/dc_announcement/doc.go b/infra/doc/dc_announcement/doc.go
new file mode 100644
index 000000000..f01d6268b
--- /dev/null
+++ b/infra/doc/dc_announcement/doc.go
@@ -0,0 +1,2 @@
+// Package dc_announcement provides a mechanism for displaying announcements.
+package dc_announcement
diff --git a/infra/doc/dc_command/auth.go b/infra/doc/dc_command/auth.go
index aa421b4cc..c7ad88aec 100644
--- a/infra/doc/dc_command/auth.go
+++ b/infra/doc/dc_command/auth.go
@@ -2,7 +2,7 @@ package dc_command
import (
"github.com/watermint/toolbox/essentials/api/api_doc"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
"github.com/watermint/toolbox/infra/doc/dc_section"
"github.com/watermint/toolbox/infra/recipe/rc_group"
"github.com/watermint/toolbox/infra/recipe/rc_recipe"
diff --git a/infra/doc/dc_command/compatibility_newpath.go b/infra/doc/dc_command/compatibility_newpath.go
index 8deedb0a2..0cc69ecbd 100644
--- a/infra/doc/dc_command/compatibility_newpath.go
+++ b/infra/doc/dc_command/compatibility_newpath.go
@@ -1,13 +1,14 @@
package dc_command
import (
- "github.com/watermint/toolbox/infra/doc/dc_index"
- "github.com/watermint/toolbox/infra/doc/dc_section"
- "github.com/watermint/toolbox/infra/recipe/rc_compatibility"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "strings"
+ "strings"
+
+ "github.com/watermint/toolbox/infra/doc/dc_index"
+ "github.com/watermint/toolbox/infra/doc/dc_section"
+ "github.com/watermint/toolbox/infra/recipe/rc_compatibility"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
func NewCompatibilityNewPath(media dc_index.MediaType, spec rc_recipe.Spec, pathPair rc_compatibility.PathPair, newPathSpec rc_compatibility.PathChangeDefinition) dc_section.Document {
diff --git a/infra/doc/dc_command/doc.go b/infra/doc/dc_command/doc.go
new file mode 100644
index 000000000..7aaebede5
--- /dev/null
+++ b/infra/doc/dc_command/doc.go
@@ -0,0 +1,2 @@
+// Package dc_command provides functionalities for generating documentation sections related to commands.
+package dc_command
diff --git a/infra/doc/dc_command/install_test.go b/infra/doc/dc_command/install_test.go
index a08e15095..661d99066 100644
--- a/infra/doc/dc_command/install_test.go
+++ b/infra/doc/dc_command/install_test.go
@@ -9,12 +9,12 @@ func TestNewInstall(t *testing.T) {
if section == nil {
t.Error("Expected non-nil section")
}
-
+
install, ok := section.(*Install)
if !ok {
t.Error("Expected Install type")
}
-
+
// Test that it implements the interface methods
_ = install.Title() // Should not panic
}
@@ -22,7 +22,7 @@ func TestNewInstall(t *testing.T) {
func TestInstall_Title(t *testing.T) {
install := &Install{}
title := install.Title()
-
+
// Should return the Header field
if title != install.Header {
t.Error("Title should return the Header field")
@@ -31,7 +31,7 @@ func TestInstall_Title(t *testing.T) {
func TestInstall_Body(t *testing.T) {
install := &Install{}
-
+
// Test that the Body method exists by checking if it can be called
// We expect it to panic with nil UI, but at least it shows the method exists
defer func() {
@@ -39,7 +39,7 @@ func TestInstall_Body(t *testing.T) {
// Expected to panic with nil UI - this is normal behavior
}
}()
-
+
// Call with nil UI - expected to panic but tests method existence
install.Body(nil)
-}
\ No newline at end of file
+}
diff --git a/infra/doc/dc_command/options.go b/infra/doc/dc_command/options.go
index 6f98929e6..2f12a40a9 100644
--- a/infra/doc/dc_command/options.go
+++ b/infra/doc/dc_command/options.go
@@ -32,7 +32,7 @@ func BodyOptionsTable(ui app_ui.UI, subHeader app_msg.Message, sv rc_recipe.Spec
// Build description with default value
description := sv.ValueDesc(k)
descParts := []string{ui.Text(description)}
-
+
// Add available options for SelectString types with descriptions
if val := sv.Value(k); val != nil {
if _, typeAttr := val.Spec(); typeAttr != nil {
@@ -74,13 +74,13 @@ func BodyOptionsTable(ui app_ui.UI, subHeader app_msg.Message, sv rc_recipe.Spec
optionDescs = append(optionDescs, option)
}
}
-
+
// Format the options differently based on whether we have descriptions
if hasDescriptions && len(optionsList) > 2 {
// Use bullet list format for better readability when we have descriptions
descParts = append(descParts, "Options:")
for _, desc := range optionDescs {
- descParts = append(descParts, " • " + desc)
+ descParts = append(descParts, " • "+desc)
}
} else {
// Use inline format for simple options
@@ -91,18 +91,18 @@ func BodyOptionsTable(ui app_ui.UI, subHeader app_msg.Message, sv rc_recipe.Spec
}
}
}
-
+
// Add default value
if vd != "" {
descParts = append(descParts, fmt.Sprintf("Default: %s", vd))
}
-
+
definitions = append(definitions, app_ui.Definition{
Term: app_msg.Raw(opt),
Description: app_msg.Raw(strings.Join(descParts, ". ")),
})
}
-
+
ui.DefinitionList(definitions)
ui.Break()
}
diff --git a/infra/doc/dc_command/report.go b/infra/doc/dc_command/report.go
index 78a36abc2..f5696cfa6 100644
--- a/infra/doc/dc_command/report.go
+++ b/infra/doc/dc_command/report.go
@@ -1,14 +1,15 @@
package dc_command
import (
- "github.com/watermint/toolbox/infra/doc/dc_index"
- "github.com/watermint/toolbox/infra/doc/dc_section"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "sort"
- "strings"
+ "sort"
+ "strings"
+
+ "github.com/watermint/toolbox/infra/doc/dc_index"
+ "github.com/watermint/toolbox/infra/doc/dc_section"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
func NewReport(media dc_index.MediaType, spec rc_recipe.Spec) dc_section.Section {
diff --git a/infra/doc/dc_command/section_type_test.go b/infra/doc/dc_command/section_type_test.go
index 9eb6ad0cb..d620b3a06 100644
--- a/infra/doc/dc_command/section_type_test.go
+++ b/infra/doc/dc_command/section_type_test.go
@@ -29,4 +29,4 @@ func TestSectionType_Priority(t *testing.T) {
}
})
}
-}
\ No newline at end of file
+}
diff --git a/infra/doc/dc_command/security.go b/infra/doc/dc_command/security.go
index 02f260a67..d036abeb0 100644
--- a/infra/doc/dc_command/security.go
+++ b/infra/doc/dc_command/security.go
@@ -1,12 +1,13 @@
package dc_command
import (
- "github.com/watermint/toolbox/essentials/api/api_conn"
- "github.com/watermint/toolbox/infra/doc/dc_section"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "sort"
+ "sort"
+
+ "github.com/watermint/toolbox/essentials/api/api_conn"
+ "github.com/watermint/toolbox/infra/doc/dc_section"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
func NewSecurity(spec rc_recipe.Spec) dc_section.Section {
diff --git a/infra/doc/dc_contributor/doc.go b/infra/doc/dc_contributor/doc.go
new file mode 100644
index 000000000..c71785ce6
--- /dev/null
+++ b/infra/doc/dc_contributor/doc.go
@@ -0,0 +1,2 @@
+// Package dc_contributor provides documentation for developers, specifically detailing recipe value types and their implementations.
+package dc_contributor
diff --git a/infra/doc/dc_contributor/recipe_values.go b/infra/doc/dc_contributor/recipe_values.go
index 430e542d3..6514fd884 100644
--- a/infra/doc/dc_contributor/recipe_values.go
+++ b/infra/doc/dc_contributor/recipe_values.go
@@ -1,15 +1,16 @@
package dc_contributor
import (
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/doc/dc_index"
- "github.com/watermint/toolbox/infra/doc/dc_section"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/recipe/rc_value"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "reflect"
- "strconv"
+ "reflect"
+ "strconv"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/doc/dc_index"
+ "github.com/watermint/toolbox/infra/doc/dc_section"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/recipe/rc_value"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
type RecipeValues struct {
diff --git a/infra/doc/dc_index/doc.go b/infra/doc/dc_index/doc.go
new file mode 100644
index 000000000..608c1d44d
--- /dev/null
+++ b/infra/doc/dc_index/doc.go
@@ -0,0 +1,2 @@
+// Package dc_index defines document IDs, media types, and web categories for organizing and generating documentation.
+package dc_index
diff --git a/infra/doc/dc_index/doc_id.go b/infra/doc/dc_index/doc_id.go
index b431b1178..24eae89ab 100644
--- a/infra/doc/dc_index/doc_id.go
+++ b/infra/doc/dc_index/doc_id.go
@@ -1,9 +1,10 @@
package dc_index
import (
- "fmt"
- "github.com/watermint/toolbox/essentials/go/es_lang"
- "github.com/watermint/toolbox/essentials/log/esl"
+ "fmt"
+
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
+ "github.com/watermint/toolbox/essentials/log/esl"
)
const (
diff --git a/infra/doc/dc_index/doc_id_test.go b/infra/doc/dc_index/doc_id_test.go
index e7d4e3096..2052c0e07 100644
--- a/infra/doc/dc_index/doc_id_test.go
+++ b/infra/doc/dc_index/doc_id_test.go
@@ -1,28 +1,29 @@
package dc_index
import (
- "strings"
- "testing"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "strings"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
)
func TestGeneratedPath(t *testing.T) {
// Test with default language
lang := es_lang.Default
result := GeneratedPath(lang, "test-doc")
-
+
if !strings.Contains(result, "test-doc") {
t.Errorf("Expected result to contain 'test-doc', got %s", result)
}
-
+
// Test with Japanese language
jaLang := es_lang.Japanese
result = GeneratedPath(jaLang, "test-doc")
-
+
if !strings.Contains(result, "test-doc") {
t.Errorf("Expected result to contain 'test-doc', got %s", result)
}
-
+
if !strings.Contains(result, jaLang.Suffix()) {
t.Errorf("Expected result to contain language suffix, got %s", result)
}
@@ -32,26 +33,26 @@ func TestNameOpts_Apply(t *testing.T) {
// Test with no options
opts := NameOpts{}
result := opts.Apply([]NameOpt{})
-
+
if result.CommandName != "" {
t.Errorf("Expected empty CommandName, got %s", result.CommandName)
}
-
+
// Test with single option
opts = NameOpts{}
result = opts.Apply([]NameOpt{CommandName("test-command")})
-
+
if result.CommandName != "test-command" {
t.Errorf("Expected CommandName 'test-command', got %s", result.CommandName)
}
-
+
// Test with multiple options
opts = NameOpts{}
result = opts.Apply([]NameOpt{
CommandName("test-command"),
RefPath(true),
})
-
+
if result.CommandName != "test-command" {
t.Errorf("Expected CommandName 'test-command', got %s", result.CommandName)
}
@@ -64,7 +65,7 @@ func TestCommandName(t *testing.T) {
opt := CommandName("my-command")
opts := NameOpts{}
result := opt(opts)
-
+
if result.CommandName != "my-command" {
t.Errorf("Expected CommandName 'my-command', got %s", result.CommandName)
}
@@ -75,16 +76,16 @@ func TestRefPath(t *testing.T) {
opt := RefPath(true)
opts := NameOpts{}
result := opt(opts)
-
+
if !result.RefPath {
t.Error("Expected RefPath to be true")
}
-
+
// Test disabling RefPath
opt = RefPath(false)
opts = NameOpts{}
result = opt(opts)
-
+
if result.RefPath {
t.Error("Expected RefPath to be false")
}
@@ -92,14 +93,14 @@ func TestRefPath(t *testing.T) {
func TestWebDocPath(t *testing.T) {
lang := es_lang.Default
-
+
// Test WebCategoryHome without refPath
result := WebDocPath(false, WebCategoryHome, "index", lang)
expected := WebDocPathRoot + "index.md"
if result != expected {
t.Errorf("Expected %s, got %s", expected, result)
}
-
+
// Test WebCategoryCommand without refPath
result = WebDocPath(false, WebCategoryCommand, "test-cmd", lang)
if !strings.Contains(result, "commands/") {
@@ -108,25 +109,25 @@ func TestWebDocPath(t *testing.T) {
if !strings.Contains(result, "test-cmd") {
t.Errorf("Expected result to contain 'test-cmd', got %s", result)
}
-
+
// Test WebCategoryGuide without refPath
result = WebDocPath(false, WebCategoryGuide, "test-guide", lang)
if !strings.Contains(result, "guides/") {
t.Errorf("Expected result to contain 'guides/', got %s", result)
}
-
+
// Test WebCategoryKnowledge without refPath
result = WebDocPath(false, WebCategoryKnowledge, "test-knowledge", lang)
if !strings.Contains(result, "knowledge/") {
t.Errorf("Expected result to contain 'knowledge/', got %s", result)
}
-
+
// Test WebCategoryContributor without refPath
result = WebDocPath(false, WebCategoryContributor, "test-contrib", lang)
if !strings.Contains(result, "contributor/") {
t.Errorf("Expected result to contain 'contributor/', got %s", result)
}
-
+
// Test with refPath enabled
result = WebDocPath(true, WebCategoryHome, "index", lang)
if !strings.Contains(result, "{{ site.baseurl }}/") {
@@ -135,13 +136,13 @@ func TestWebDocPath(t *testing.T) {
if !strings.HasSuffix(result, ".html") {
t.Errorf("Expected result to end with .html, got %s", result)
}
-
+
// Test with empty name
result = WebDocPath(false, WebCategoryHome, "", lang)
if strings.HasSuffix(result, ".md") {
t.Errorf("Expected no .md suffix for empty name, got %s", result)
}
-
+
// Test with Japanese language
jaLang := es_lang.Japanese
result = WebDocPath(false, WebCategoryHome, "test", jaLang)
@@ -152,20 +153,20 @@ func TestWebDocPath(t *testing.T) {
func TestWebDocPath_InvalidCategory(t *testing.T) {
lang := es_lang.Default
-
+
// Test with invalid category - should panic
defer func() {
if r := recover(); r == nil {
t.Error("Expected panic for invalid category")
}
}()
-
+
WebDocPath(false, WebCategory(999), "test", lang)
}
func TestDocName_Repository(t *testing.T) {
lang := es_lang.Default
-
+
// Test DocRootReadme
result := DocName(MediaRepository, DocRootReadme, lang)
if !strings.Contains(result, "README") {
@@ -174,25 +175,25 @@ func TestDocName_Repository(t *testing.T) {
if !strings.HasSuffix(result, ".md") {
t.Errorf("Expected result to end with .md, got %s", result)
}
-
+
// Test DocRootLicense
result = DocName(MediaRepository, DocRootLicense, lang)
if !strings.Contains(result, "LICENSE") {
t.Errorf("Expected result to contain 'LICENSE', got %s", result)
}
-
+
// Test DocRootBuild
result = DocName(MediaRepository, DocRootBuild, lang)
if !strings.Contains(result, "BUILD") {
t.Errorf("Expected result to contain 'BUILD', got %s", result)
}
-
+
// Test DocRootContributing
result = DocName(MediaRepository, DocRootContributing, lang)
if !strings.Contains(result, "CONTRIBUTING") {
t.Errorf("Expected result to contain 'CONTRIBUTING', got %s", result)
}
-
+
// Test DocRootCodeOfConduct
result = DocName(MediaRepository, DocRootCodeOfConduct, lang)
if !strings.Contains(result, "CODE_OF_CONDUCT") {
@@ -202,7 +203,7 @@ func TestDocName_Repository(t *testing.T) {
func TestDocName_WithLanguageSuffix(t *testing.T) {
jaLang := es_lang.Japanese
-
+
result := DocName(MediaRepository, DocRootReadme, jaLang)
if !strings.Contains(result, jaLang.Suffix()) {
t.Errorf("Expected result to contain language suffix, got %s", result)
@@ -211,14 +212,14 @@ func TestDocName_WithLanguageSuffix(t *testing.T) {
func TestDocName_WithOptions(t *testing.T) {
lang := es_lang.Default
-
+
// Test with CommandName option
result := DocName(MediaRepository, DocRootReadme, lang, CommandName("test-command"))
// The function should handle the option without error
if result == "" {
t.Error("Expected non-empty result")
}
-
+
// Test with RefPath option
result = DocName(MediaRepository, DocRootReadme, lang, RefPath(true))
if result == "" {
@@ -231,16 +232,16 @@ func TestConstants(t *testing.T) {
if WebDocPathRoot == "" {
t.Error("WebDocPathRoot should not be empty")
}
-
+
if WebDocPathRoot != "docs/" {
t.Errorf("Expected WebDocPathRoot to be 'docs/', got %s", WebDocPathRoot)
}
-
+
// Test that AllMedia contains expected values
if len(AllMedia) == 0 {
t.Error("AllMedia should not be empty")
}
-
+
// Check that expected media types are present
foundRepo := false
foundWeb := false
@@ -252,11 +253,11 @@ func TestConstants(t *testing.T) {
foundWeb = true
}
}
-
+
if !foundRepo {
t.Error("AllMedia should contain MediaRepository")
}
if !foundWeb {
t.Error("AllMedia should contain MediaWeb")
}
-}
\ No newline at end of file
+}
diff --git a/infra/doc/dc_knowledge/doc.go b/infra/doc/dc_knowledge/doc.go
new file mode 100644
index 000000000..5065b4624
--- /dev/null
+++ b/infra/doc/dc_knowledge/doc.go
@@ -0,0 +1,2 @@
+// Package dc_knowledge provides a generator for creating knowledge base documentation.
+package dc_knowledge
diff --git a/infra/doc/dc_knowledge/knowledge.go b/infra/doc/dc_knowledge/knowledge.go
index f7965e165..e4322eddc 100644
--- a/infra/doc/dc_knowledge/knowledge.go
+++ b/infra/doc/dc_knowledge/knowledge.go
@@ -6,7 +6,7 @@ import (
"regexp"
"strings"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/terminal/es_dialogue"
"github.com/watermint/toolbox/infra/control/app_definitions"
@@ -76,13 +76,13 @@ func (z *KnowledgeDoc) cleanupEmptyLines(text string) string {
// Replace 3 or more consecutive newlines with exactly 2 newlines
re := regexp.MustCompile(`\n{3,}`)
cleaned := re.ReplaceAllString(text, "\n\n")
-
+
// Remove trailing empty lines at the end
cleaned = strings.TrimRight(cleaned, "\n")
-
+
// Ensure the document ends with exactly one newline
cleaned += "\n"
-
+
return cleaned
}
@@ -234,10 +234,10 @@ func (z *KnowledgeDoc) GenerateKnowledge(specs []rc_recipe.Spec, additionalDocs
l.Debug("Completed generating additional documentation")
l.Debug("Completed generating knowledge base documentation")
-
+
// Clean up redundant empty lines before returning
result := z.cleanupEmptyLines(knowledgeText.String())
l.Debug("Cleaned up redundant empty lines in knowledge base")
-
+
return result
}
diff --git a/infra/doc/dc_license/detect.go b/infra/doc/dc_license/detect.go
index ba29586a8..da8c8253b 100644
--- a/infra/doc/dc_license/detect.go
+++ b/infra/doc/dc_license/detect.go
@@ -1,7 +1,7 @@
package dc_license
import (
- "github.com/watermint/toolbox/essentials/go/es_module"
+ "github.com/watermint/toolbox/essentials/es_go/es_module"
"github.com/watermint/toolbox/essentials/log/esl"
)
diff --git a/infra/doc/dc_license/detect_test.go b/infra/doc/dc_license/detect_test.go
index 767c097c8..1f210d59e 100644
--- a/infra/doc/dc_license/detect_test.go
+++ b/infra/doc/dc_license/detect_test.go
@@ -1,8 +1,9 @@
package dc_license
import (
- "github.com/watermint/toolbox/essentials/log/esl"
- "testing"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
)
func TestDetect(t *testing.T) {
diff --git a/infra/doc/dc_license/doc.go b/infra/doc/dc_license/doc.go
new file mode 100644
index 000000000..32fdfe804
--- /dev/null
+++ b/infra/doc/dc_license/doc.go
@@ -0,0 +1,2 @@
+// Package dc_license provides functionalities for detecting and generating license information for the application and its third-party dependencies.
+package dc_license
diff --git a/infra/doc/dc_license/document.go b/infra/doc/dc_license/document.go
index 284d4115c..25ebb51f8 100644
--- a/infra/doc/dc_license/document.go
+++ b/infra/doc/dc_license/document.go
@@ -1,14 +1,15 @@
package dc_license
import (
- "encoding/json"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/control/app_resource"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "sort"
- "strings"
+ "encoding/json"
+ "sort"
+ "strings"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/control/app_resource"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
type MsgLicense struct {
diff --git a/infra/doc/dc_options/command.go b/infra/doc/dc_options/command.go
index 70a927f5b..9909f9b4a 100644
--- a/infra/doc/dc_options/command.go
+++ b/infra/doc/dc_options/command.go
@@ -3,7 +3,7 @@ package dc_options
import (
"fmt"
"strings"
-
+
"github.com/watermint/toolbox/essentials/strings/es_case"
"github.com/watermint/toolbox/infra/recipe/rc_recipe"
"github.com/watermint/toolbox/infra/ui/app_msg"
@@ -82,13 +82,13 @@ func PrintOptionsTable(ui app_ui.UI, spec rc_recipe.SpecValue) {
optionDescs = append(optionDescs, option)
}
}
-
+
// Format the options differently based on whether we have descriptions
if hasDescriptions && len(optionsList) > 2 {
// Use bullet list format for better readability when we have descriptions
descParts = append(descParts, "Options:")
for _, desc := range optionDescs {
- descParts = append(descParts, " • " + desc)
+ descParts = append(descParts, " • "+desc)
}
} else {
// Use inline format for simple options
diff --git a/infra/doc/dc_options/doc.go b/infra/doc/dc_options/doc.go
new file mode 100644
index 000000000..f7414a40b
--- /dev/null
+++ b/infra/doc/dc_options/doc.go
@@ -0,0 +1,2 @@
+// Package dc_options provides a function to print a formatted table of command-line options.
+package dc_options
diff --git a/infra/doc/dc_readme/command.go b/infra/doc/dc_readme/command.go
index 1eb2e5566..91a500811 100644
--- a/infra/doc/dc_readme/command.go
+++ b/infra/doc/dc_readme/command.go
@@ -1,17 +1,18 @@
package dc_readme
import (
- "github.com/watermint/toolbox/infra/control/app_catalogue"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "github.com/watermint/toolbox/infra/doc/dc_index"
- "github.com/watermint/toolbox/infra/doc/dc_section"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/recipe/rc_spec"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_msg_container"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "sort"
- "strings"
+ "sort"
+ "strings"
+
+ "github.com/watermint/toolbox/infra/control/app_catalogue"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/infra/doc/dc_index"
+ "github.com/watermint/toolbox/infra/doc/dc_section"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/recipe/rc_spec"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
func NewCommand(forPublish bool, media dc_index.MediaType, container app_msg_container.Container) dc_section.Section {
diff --git a/infra/doc/dc_readme/doc.go b/infra/doc/dc_readme/doc.go
new file mode 100644
index 000000000..7051f7bb0
--- /dev/null
+++ b/infra/doc/dc_readme/doc.go
@@ -0,0 +1,2 @@
+// Package dc_readme provides functionalities for generating various sections of a README file.
+package dc_readme
diff --git a/infra/doc/dc_readme/header_test.go b/infra/doc/dc_readme/header_test.go
index 6702526fa..82b5f6c09 100644
--- a/infra/doc/dc_readme/header_test.go
+++ b/infra/doc/dc_readme/header_test.go
@@ -1,11 +1,12 @@
package dc_readme
import (
- "testing"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "github.com/watermint/toolbox/infra/ui/app_msg_container"
- "github.com/watermint/toolbox/infra/report/rp_artifact"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/report/rp_artifact"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
func TestNewHeader(t *testing.T) {
@@ -21,7 +22,7 @@ func TestNewHeader(t *testing.T) {
if !header1.publish {
t.Error("Expected publish to be true")
}
-
+
// Test creating header not for publish
h2 := NewHeader(false)
if h2 == nil {
@@ -40,7 +41,7 @@ func TestHeader_Title(t *testing.T) {
h := &Header{
HeaderTitle: app_msg.Raw("Test Title"),
}
-
+
title := h.Title()
if title == nil {
t.Error("Expected non-nil title")
@@ -53,11 +54,11 @@ func TestHeader_Body(t *testing.T) {
publish: true,
HeaderBody: app_msg.Raw("Test body"),
}
-
+
// Create a mock UI to test Body method
mockUI := &mockUI{}
h1.Body(mockUI)
-
+
// Test with publish = false
h2 := &Header{
publish: false,
@@ -85,39 +86,39 @@ func (m *mockUI) Quote(msg app_msg.Message) {
}
// Add other required methods to satisfy app_ui.UI interface
-func (m *mockUI) Ask(msg app_msg.Message, defaultValue string) string { return "" }
-func (m *mockUI) AskCont(msg app_msg.Message) bool { return true }
-func (m *mockUI) AskProceed(msg app_msg.Message) {}
-func (m *mockUI) AskSecure(msg app_msg.Message) (string, bool) { return "", false }
-func (m *mockUI) AskText(msg app_msg.Message) (string, bool) { return "", false }
-func (m *mockUI) Code(code string) {}
-func (m *mockUI) Error(msg app_msg.Message) {}
-func (m *mockUI) Exists(msg app_msg.Message) bool { return false }
-func (m *mockUI) Header(msg app_msg.Message) {}
-func (m *mockUI) IsConsoleUI() bool { return true }
-func (m *mockUI) ItemOf(msg app_msg.Message, id string) {}
-func (m *mockUI) KeyValue(key, value string) {}
-func (m *mockUI) ProgressStart(count int) {}
-func (m *mockUI) ProgressUpdate(done int) {}
-func (m *mockUI) ProgressEnd() {}
-func (m *mockUI) SubInfo(msg app_msg.Message) {}
-func (m *mockUI) Success(msg app_msg.Message) {}
-func (m *mockUI) Text(msg app_msg.Message) string { return "" }
-func (m *mockUI) TextOrEmpty(msg app_msg.Message) string { return "" }
-func (m *mockUI) Translate(text app_msg.Message) string { return "" }
+func (m *mockUI) Ask(msg app_msg.Message, defaultValue string) string { return "" }
+func (m *mockUI) AskCont(msg app_msg.Message) bool { return true }
+func (m *mockUI) AskProceed(msg app_msg.Message) {}
+func (m *mockUI) AskSecure(msg app_msg.Message) (string, bool) { return "", false }
+func (m *mockUI) AskText(msg app_msg.Message) (string, bool) { return "", false }
+func (m *mockUI) Code(code string) {}
+func (m *mockUI) Error(msg app_msg.Message) {}
+func (m *mockUI) Exists(msg app_msg.Message) bool { return false }
+func (m *mockUI) Header(msg app_msg.Message) {}
+func (m *mockUI) IsConsoleUI() bool { return true }
+func (m *mockUI) ItemOf(msg app_msg.Message, id string) {}
+func (m *mockUI) KeyValue(key, value string) {}
+func (m *mockUI) ProgressStart(count int) {}
+func (m *mockUI) ProgressUpdate(done int) {}
+func (m *mockUI) ProgressEnd() {}
+func (m *mockUI) SubInfo(msg app_msg.Message) {}
+func (m *mockUI) Success(msg app_msg.Message) {}
+func (m *mockUI) Text(msg app_msg.Message) string { return "" }
+func (m *mockUI) TextOrEmpty(msg app_msg.Message) string { return "" }
+func (m *mockUI) Translate(text app_msg.Message) string { return "" }
func (m *mockUI) TreePut(path []string, name string, value app_msg.MessageOptional) {}
-func (m *mockUI) TreeShow() {}
-func (m *mockUI) Warn(msg app_msg.Message) {}
-func (m *mockUI) SubHeader(msg app_msg.Message) {}
-func (m *mockUI) InfoTable(name string) app_ui.Table { return nil }
-func (m *mockUI) Failure(msg app_msg.Message) {}
-func (m *mockUI) Progress(msg app_msg.Message) {}
-func (m *mockUI) DefinitionList(definitions []app_ui.Definition) {}
-func (m *mockUI) Link(artifact rp_artifact.Artifact) {}
-func (m *mockUI) IsConsole() bool { return true }
-func (m *mockUI) IsWeb() bool { return false }
-func (m *mockUI) WithContainerSyntax(mc app_msg_container.Container) app_ui.Syntax { return m }
-func (m *mockUI) Messages() app_msg_container.Container { return nil }
-func (m *mockUI) WithTable(name string, f func(t app_ui.Table)) {}
-func (m *mockUI) Id() string { return "mock" }
-func (m *mockUI) WithContainer(mc app_msg_container.Container) app_ui.UI { return m }
\ No newline at end of file
+func (m *mockUI) TreeShow() {}
+func (m *mockUI) Warn(msg app_msg.Message) {}
+func (m *mockUI) SubHeader(msg app_msg.Message) {}
+func (m *mockUI) InfoTable(name string) app_ui.Table { return nil }
+func (m *mockUI) Failure(msg app_msg.Message) {}
+func (m *mockUI) Progress(msg app_msg.Message) {}
+func (m *mockUI) DefinitionList(definitions []app_ui.Definition) {}
+func (m *mockUI) Link(artifact rp_artifact.Artifact) {}
+func (m *mockUI) IsConsole() bool { return true }
+func (m *mockUI) IsWeb() bool { return false }
+func (m *mockUI) WithContainerSyntax(mc app_msg_container.Container) app_ui.Syntax { return m }
+func (m *mockUI) Messages() app_msg_container.Container { return nil }
+func (m *mockUI) WithTable(name string, f func(t app_ui.Table)) {}
+func (m *mockUI) Id() string { return "mock" }
+func (m *mockUI) WithContainer(mc app_msg_container.Container) app_ui.UI { return m }
diff --git a/infra/doc/dc_readme/ktlo.go b/infra/doc/dc_readme/ktlo.go
new file mode 100644
index 000000000..236538610
--- /dev/null
+++ b/infra/doc/dc_readme/ktlo.go
@@ -0,0 +1,24 @@
+package dc_readme
+
+import (
+ "github.com/watermint/toolbox/infra/doc/dc_section"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
+)
+
+func NewKtloAnnouncement() dc_section.Section {
+ return &KtloAnnouncement{}
+}
+
+type KtloAnnouncement struct {
+ AnnouncementTitle app_msg.Message
+ AnnouncementBody app_msg.Message
+}
+
+func (z KtloAnnouncement) Title() app_msg.Message {
+ return z.AnnouncementTitle
+}
+
+func (z KtloAnnouncement) Body(ui app_ui.UI) {
+ ui.Info(z.AnnouncementBody)
+}
diff --git a/infra/doc/dc_readme/license_test.go b/infra/doc/dc_readme/license_test.go
index 2c739ee25..a28083e4a 100644
--- a/infra/doc/dc_readme/license_test.go
+++ b/infra/doc/dc_readme/license_test.go
@@ -1,11 +1,12 @@
package dc_readme
import (
- "testing"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "github.com/watermint/toolbox/infra/ui/app_msg_container"
- "github.com/watermint/toolbox/infra/report/rp_artifact"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/report/rp_artifact"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
func TestNewLicense(t *testing.T) {
@@ -13,7 +14,7 @@ func TestNewLicense(t *testing.T) {
if l == nil {
t.Error("Expected non-nil license")
}
-
+
license, ok := l.(*License)
if !ok {
t.Error("Expected License type")
@@ -27,7 +28,7 @@ func TestLicense_Title(t *testing.T) {
l := &License{
HeaderTitle: app_msg.Raw("License Title"),
}
-
+
title := l.Title()
if title == nil {
t.Error("Expected non-nil title")
@@ -40,16 +41,16 @@ func TestLicense_Body(t *testing.T) {
BodyLicenseRemarks: app_msg.Raw("License remarks"),
BodyLicenseQuote: app_msg.Raw("License quote"),
}
-
+
// Create a mock UI to test Body method
mockUI := &mockLicenseUI{
infoCount: 0,
breakCount: 0,
quoteCount: 0,
}
-
+
l.Body(mockUI)
-
+
// Verify the expected calls were made
if mockUI.infoCount != 2 {
t.Errorf("Expected 2 Info calls, got %d", mockUI.infoCount)
@@ -82,39 +83,39 @@ func (m *mockLicenseUI) Quote(msg app_msg.Message) {
}
// Add other required methods to satisfy app_ui.UI interface
-func (m *mockLicenseUI) Ask(msg app_msg.Message, defaultValue string) string { return "" }
-func (m *mockLicenseUI) AskCont(msg app_msg.Message) bool { return true }
-func (m *mockLicenseUI) AskProceed(msg app_msg.Message) {}
-func (m *mockLicenseUI) AskSecure(msg app_msg.Message) (string, bool) { return "", false }
-func (m *mockLicenseUI) AskText(msg app_msg.Message) (string, bool) { return "", false }
-func (m *mockLicenseUI) Code(code string) {}
-func (m *mockLicenseUI) Error(msg app_msg.Message) {}
-func (m *mockLicenseUI) Exists(msg app_msg.Message) bool { return false }
-func (m *mockLicenseUI) Header(msg app_msg.Message) {}
-func (m *mockLicenseUI) IsConsoleUI() bool { return true }
-func (m *mockLicenseUI) ItemOf(msg app_msg.Message, id string) {}
-func (m *mockLicenseUI) KeyValue(key, value string) {}
-func (m *mockLicenseUI) ProgressStart(count int) {}
-func (m *mockLicenseUI) ProgressUpdate(done int) {}
-func (m *mockLicenseUI) ProgressEnd() {}
-func (m *mockLicenseUI) SubInfo(msg app_msg.Message) {}
-func (m *mockLicenseUI) Success(msg app_msg.Message) {}
-func (m *mockLicenseUI) Text(msg app_msg.Message) string { return "" }
-func (m *mockLicenseUI) TextOrEmpty(msg app_msg.Message) string { return "" }
-func (m *mockLicenseUI) Translate(text app_msg.Message) string { return "" }
+func (m *mockLicenseUI) Ask(msg app_msg.Message, defaultValue string) string { return "" }
+func (m *mockLicenseUI) AskCont(msg app_msg.Message) bool { return true }
+func (m *mockLicenseUI) AskProceed(msg app_msg.Message) {}
+func (m *mockLicenseUI) AskSecure(msg app_msg.Message) (string, bool) { return "", false }
+func (m *mockLicenseUI) AskText(msg app_msg.Message) (string, bool) { return "", false }
+func (m *mockLicenseUI) Code(code string) {}
+func (m *mockLicenseUI) Error(msg app_msg.Message) {}
+func (m *mockLicenseUI) Exists(msg app_msg.Message) bool { return false }
+func (m *mockLicenseUI) Header(msg app_msg.Message) {}
+func (m *mockLicenseUI) IsConsoleUI() bool { return true }
+func (m *mockLicenseUI) ItemOf(msg app_msg.Message, id string) {}
+func (m *mockLicenseUI) KeyValue(key, value string) {}
+func (m *mockLicenseUI) ProgressStart(count int) {}
+func (m *mockLicenseUI) ProgressUpdate(done int) {}
+func (m *mockLicenseUI) ProgressEnd() {}
+func (m *mockLicenseUI) SubInfo(msg app_msg.Message) {}
+func (m *mockLicenseUI) Success(msg app_msg.Message) {}
+func (m *mockLicenseUI) Text(msg app_msg.Message) string { return "" }
+func (m *mockLicenseUI) TextOrEmpty(msg app_msg.Message) string { return "" }
+func (m *mockLicenseUI) Translate(text app_msg.Message) string { return "" }
func (m *mockLicenseUI) TreePut(path []string, name string, value app_msg.MessageOptional) {}
-func (m *mockLicenseUI) TreeShow() {}
-func (m *mockLicenseUI) Warn(msg app_msg.Message) {}
-func (m *mockLicenseUI) SubHeader(msg app_msg.Message) {}
-func (m *mockLicenseUI) InfoTable(name string) app_ui.Table { return nil }
-func (m *mockLicenseUI) Failure(msg app_msg.Message) {}
-func (m *mockLicenseUI) Progress(msg app_msg.Message) {}
-func (m *mockLicenseUI) DefinitionList(definitions []app_ui.Definition) {}
-func (m *mockLicenseUI) Link(artifact rp_artifact.Artifact) {}
-func (m *mockLicenseUI) IsConsole() bool { return true }
-func (m *mockLicenseUI) IsWeb() bool { return false }
-func (m *mockLicenseUI) WithContainerSyntax(mc app_msg_container.Container) app_ui.Syntax { return m }
-func (m *mockLicenseUI) Messages() app_msg_container.Container { return nil }
-func (m *mockLicenseUI) WithTable(name string, f func(t app_ui.Table)) {}
-func (m *mockLicenseUI) Id() string { return "mock" }
-func (m *mockLicenseUI) WithContainer(mc app_msg_container.Container) app_ui.UI { return m }
\ No newline at end of file
+func (m *mockLicenseUI) TreeShow() {}
+func (m *mockLicenseUI) Warn(msg app_msg.Message) {}
+func (m *mockLicenseUI) SubHeader(msg app_msg.Message) {}
+func (m *mockLicenseUI) InfoTable(name string) app_ui.Table { return nil }
+func (m *mockLicenseUI) Failure(msg app_msg.Message) {}
+func (m *mockLicenseUI) Progress(msg app_msg.Message) {}
+func (m *mockLicenseUI) DefinitionList(definitions []app_ui.Definition) {}
+func (m *mockLicenseUI) Link(artifact rp_artifact.Artifact) {}
+func (m *mockLicenseUI) IsConsole() bool { return true }
+func (m *mockLicenseUI) IsWeb() bool { return false }
+func (m *mockLicenseUI) WithContainerSyntax(mc app_msg_container.Container) app_ui.Syntax { return m }
+func (m *mockLicenseUI) Messages() app_msg_container.Container { return nil }
+func (m *mockLicenseUI) WithTable(name string, f func(t app_ui.Table)) {}
+func (m *mockLicenseUI) Id() string { return "mock" }
+func (m *mockLicenseUI) WithContainer(mc app_msg_container.Container) app_ui.UI { return m }
diff --git a/infra/doc/dc_readme/readme.go b/infra/doc/dc_readme/readme.go
index c23bf176b..82b7fdf6a 100644
--- a/infra/doc/dc_readme/readme.go
+++ b/infra/doc/dc_readme/readme.go
@@ -34,6 +34,7 @@ func (z Readme) DocDesc() app_msg.Message {
func (z Readme) Sections() []dc_section.Section {
sections := make([]dc_section.Section, 0)
sections = append(sections, NewHeader(z.forPublish))
+ sections = append(sections, NewKtloAnnouncement())
sections = append(sections, NewLicense())
if z.forPublish {
sections = append(sections, NewRelease())
diff --git a/infra/doc/dc_readme/security_test.go b/infra/doc/dc_readme/security_test.go
index f63dcdda1..993a358af 100644
--- a/infra/doc/dc_readme/security_test.go
+++ b/infra/doc/dc_readme/security_test.go
@@ -1,12 +1,13 @@
package dc_readme
import (
- "testing"
- "github.com/watermint/toolbox/infra/doc/dc_index"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "github.com/watermint/toolbox/infra/ui/app_msg_container"
- "github.com/watermint/toolbox/infra/report/rp_artifact"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/doc/dc_index"
+ "github.com/watermint/toolbox/infra/report/rp_artifact"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
func TestNewSecurity(t *testing.T) {
@@ -14,7 +15,7 @@ func TestNewSecurity(t *testing.T) {
if s == nil {
t.Error("Expected non-nil security document")
}
-
+
sec, ok := s.(*docSecurity)
if !ok {
t.Error("Expected docSecurity type")
@@ -26,7 +27,7 @@ func TestNewSecurity(t *testing.T) {
func TestDocSecurity_DocId(t *testing.T) {
s := &docSecurity{}
-
+
id := s.DocId()
if id != dc_index.DocRootSecurityAndPrivacy {
t.Errorf("Expected DocId to be DocRootSecurityAndPrivacy, got %v", id)
@@ -37,7 +38,7 @@ func TestDocSecurity_DocDesc(t *testing.T) {
s := &docSecurity{
Desc: app_msg.Raw("Security description"),
}
-
+
desc := s.DocDesc()
if desc == nil {
t.Error("Expected non-nil description")
@@ -46,7 +47,7 @@ func TestDocSecurity_DocDesc(t *testing.T) {
func TestDocSecurity_Sections(t *testing.T) {
s := &docSecurity{}
-
+
sections := s.Sections()
if len(sections) != 1 {
t.Errorf("Expected 1 section, got %d", len(sections))
@@ -58,7 +59,7 @@ func TestNewSecuritySection(t *testing.T) {
if s == nil {
t.Error("Expected non-nil security section")
}
-
+
sec, ok := s.(*SecurityDesc)
if !ok {
t.Error("Expected SecurityDesc type")
@@ -72,7 +73,7 @@ func TestSecurityDesc_Title(t *testing.T) {
s := &SecurityDesc{
HeaderTitle: app_msg.Raw("Security Title"),
}
-
+
title := s.Title()
if title == nil {
t.Error("Expected non-nil title")
@@ -89,15 +90,15 @@ func TestSecurityDesc_Body(t *testing.T) {
HeaderSharing: app_msg.Raw("Sharing"),
BodySharing: app_msg.Raw("Sharing body"),
}
-
+
// Create a mock UI to test Body method
mockUI := &mockSecurityUI{
infoCount: 0,
subHeaderCount: 0,
}
-
+
s.Body(mockUI)
-
+
// Verify the expected calls were made
if mockUI.infoCount != 4 { // 1 overview + 3 body sections
t.Errorf("Expected 4 Info calls, got %d", mockUI.infoCount)
@@ -122,40 +123,40 @@ func (m *mockSecurityUI) SubHeader(msg app_msg.Message) {
}
// Add other required methods to satisfy app_ui.UI interface
-func (m *mockSecurityUI) Ask(msg app_msg.Message, defaultValue string) string { return "" }
-func (m *mockSecurityUI) AskCont(msg app_msg.Message) bool { return true }
-func (m *mockSecurityUI) AskProceed(msg app_msg.Message) {}
-func (m *mockSecurityUI) AskSecure(msg app_msg.Message) (string, bool) { return "", false }
-func (m *mockSecurityUI) AskText(msg app_msg.Message) (string, bool) { return "", false }
-func (m *mockSecurityUI) Code(code string) {}
-func (m *mockSecurityUI) Break() {}
-func (m *mockSecurityUI) Error(msg app_msg.Message) {}
-func (m *mockSecurityUI) Exists(msg app_msg.Message) bool { return false }
-func (m *mockSecurityUI) Header(msg app_msg.Message) {}
-func (m *mockSecurityUI) IsConsoleUI() bool { return true }
-func (m *mockSecurityUI) ItemOf(msg app_msg.Message, id string) {}
-func (m *mockSecurityUI) KeyValue(key, value string) {}
-func (m *mockSecurityUI) ProgressStart(count int) {}
-func (m *mockSecurityUI) ProgressUpdate(done int) {}
-func (m *mockSecurityUI) ProgressEnd() {}
-func (m *mockSecurityUI) Quote(msg app_msg.Message) {}
-func (m *mockSecurityUI) SubInfo(msg app_msg.Message) {}
-func (m *mockSecurityUI) Success(msg app_msg.Message) {}
-func (m *mockSecurityUI) Text(msg app_msg.Message) string { return "" }
-func (m *mockSecurityUI) TextOrEmpty(msg app_msg.Message) string { return "" }
-func (m *mockSecurityUI) Translate(text app_msg.Message) string { return "" }
+func (m *mockSecurityUI) Ask(msg app_msg.Message, defaultValue string) string { return "" }
+func (m *mockSecurityUI) AskCont(msg app_msg.Message) bool { return true }
+func (m *mockSecurityUI) AskProceed(msg app_msg.Message) {}
+func (m *mockSecurityUI) AskSecure(msg app_msg.Message) (string, bool) { return "", false }
+func (m *mockSecurityUI) AskText(msg app_msg.Message) (string, bool) { return "", false }
+func (m *mockSecurityUI) Code(code string) {}
+func (m *mockSecurityUI) Break() {}
+func (m *mockSecurityUI) Error(msg app_msg.Message) {}
+func (m *mockSecurityUI) Exists(msg app_msg.Message) bool { return false }
+func (m *mockSecurityUI) Header(msg app_msg.Message) {}
+func (m *mockSecurityUI) IsConsoleUI() bool { return true }
+func (m *mockSecurityUI) ItemOf(msg app_msg.Message, id string) {}
+func (m *mockSecurityUI) KeyValue(key, value string) {}
+func (m *mockSecurityUI) ProgressStart(count int) {}
+func (m *mockSecurityUI) ProgressUpdate(done int) {}
+func (m *mockSecurityUI) ProgressEnd() {}
+func (m *mockSecurityUI) Quote(msg app_msg.Message) {}
+func (m *mockSecurityUI) SubInfo(msg app_msg.Message) {}
+func (m *mockSecurityUI) Success(msg app_msg.Message) {}
+func (m *mockSecurityUI) Text(msg app_msg.Message) string { return "" }
+func (m *mockSecurityUI) TextOrEmpty(msg app_msg.Message) string { return "" }
+func (m *mockSecurityUI) Translate(text app_msg.Message) string { return "" }
func (m *mockSecurityUI) TreePut(path []string, name string, value app_msg.MessageOptional) {}
-func (m *mockSecurityUI) TreeShow() {}
-func (m *mockSecurityUI) Warn(msg app_msg.Message) {}
-func (m *mockSecurityUI) InfoTable(name string) app_ui.Table { return nil }
-func (m *mockSecurityUI) Failure(msg app_msg.Message) {}
-func (m *mockSecurityUI) Progress(msg app_msg.Message) {}
-func (m *mockSecurityUI) DefinitionList(definitions []app_ui.Definition) {}
-func (m *mockSecurityUI) Link(artifact rp_artifact.Artifact) {}
-func (m *mockSecurityUI) IsConsole() bool { return true }
-func (m *mockSecurityUI) IsWeb() bool { return false }
-func (m *mockSecurityUI) WithContainerSyntax(mc app_msg_container.Container) app_ui.Syntax { return m }
-func (m *mockSecurityUI) Messages() app_msg_container.Container { return nil }
-func (m *mockSecurityUI) WithTable(name string, f func(t app_ui.Table)) {}
-func (m *mockSecurityUI) Id() string { return "mock" }
-func (m *mockSecurityUI) WithContainer(mc app_msg_container.Container) app_ui.UI { return m }
\ No newline at end of file
+func (m *mockSecurityUI) TreeShow() {}
+func (m *mockSecurityUI) Warn(msg app_msg.Message) {}
+func (m *mockSecurityUI) InfoTable(name string) app_ui.Table { return nil }
+func (m *mockSecurityUI) Failure(msg app_msg.Message) {}
+func (m *mockSecurityUI) Progress(msg app_msg.Message) {}
+func (m *mockSecurityUI) DefinitionList(definitions []app_ui.Definition) {}
+func (m *mockSecurityUI) Link(artifact rp_artifact.Artifact) {}
+func (m *mockSecurityUI) IsConsole() bool { return true }
+func (m *mockSecurityUI) IsWeb() bool { return false }
+func (m *mockSecurityUI) WithContainerSyntax(mc app_msg_container.Container) app_ui.Syntax { return m }
+func (m *mockSecurityUI) Messages() app_msg_container.Container { return nil }
+func (m *mockSecurityUI) WithTable(name string, f func(t app_ui.Table)) {}
+func (m *mockSecurityUI) Id() string { return "mock" }
+func (m *mockSecurityUI) WithContainer(mc app_msg_container.Container) app_ui.UI { return m }
diff --git a/infra/doc/dc_recipe/doc.go b/infra/doc/dc_recipe/doc.go
new file mode 100644
index 000000000..ba52bd524
--- /dev/null
+++ b/infra/doc/dc_recipe/doc.go
@@ -0,0 +1,2 @@
+// Package dc_recipe defines data structures for documenting recipes.
+package dc_recipe
diff --git a/infra/doc/dc_section/doc.go b/infra/doc/dc_section/doc.go
new file mode 100644
index 000000000..b74638592
--- /dev/null
+++ b/infra/doc/dc_section/doc.go
@@ -0,0 +1,2 @@
+// Package dc_section defines interfaces for documentation sections and documents, and provides a function to generate documentation content.
+package dc_section
diff --git a/infra/doc/dc_section/section.go b/infra/doc/dc_section/section.go
index 95d5435b6..dded7c378 100644
--- a/infra/doc/dc_section/section.go
+++ b/infra/doc/dc_section/section.go
@@ -1,13 +1,14 @@
package dc_section
import (
- "bytes"
- "github.com/watermint/toolbox/infra/doc/dc_index"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_msg_container"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "strings"
- "text/template"
+ "bytes"
+ "strings"
+ "text/template"
+
+ "github.com/watermint/toolbox/infra/doc/dc_index"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
type Section interface {
diff --git a/infra/doc/dc_supplemental/authentication_guide.go b/infra/doc/dc_supplemental/authentication_guide.go
index c1f7d58dd..d8c3a5ae4 100644
--- a/infra/doc/dc_supplemental/authentication_guide.go
+++ b/infra/doc/dc_supplemental/authentication_guide.go
@@ -10,21 +10,21 @@ import (
const (
AuthenticationGuideDescKey = "auth.guide.desc"
AuthenticationGuideTitle = "auth.guide.title"
- AuthGuideOverview = "auth.guide.overview"
- AuthGuideDropboxAuth = "auth.guide.dropbox"
- AuthGuideTokenManagement = "auth.guide.token"
- AuthGuideTroubleshooting = "auth.guide.troubleshooting"
- AuthGuideSecurityTips = "auth.guide.security"
+ AuthGuideOverview = "auth.guide.overview"
+ AuthGuideDropboxAuth = "auth.guide.dropbox"
+ AuthGuideTokenManagement = "auth.guide.token"
+ AuthGuideTroubleshooting = "auth.guide.troubleshooting"
+ AuthGuideSecurityTips = "auth.guide.security"
)
type MsgAuthenticationGuide struct {
- DocDesc app_msg.Message
- Title app_msg.Message
- Overview app_msg.Message
- DropboxAuth app_msg.Message
- TokenManagement app_msg.Message
- Troubleshooting app_msg.Message
- SecurityTips app_msg.Message
+ DocDesc app_msg.Message
+ Title app_msg.Message
+ Overview app_msg.Message
+ DropboxAuth app_msg.Message
+ TokenManagement app_msg.Message
+ Troubleshooting app_msg.Message
+ SecurityTips app_msg.Message
}
var (
@@ -238,4 +238,4 @@ Follow these security practices when using authentication:
- Have a recovery plan if authentication is compromised
- Know how to revoke and re-establish authentication
`))
-}
\ No newline at end of file
+}
diff --git a/infra/doc/dc_supplemental/best_practices_guide.go b/infra/doc/dc_supplemental/best_practices_guide.go
index e8098c833..d3b87d47d 100644
--- a/infra/doc/dc_supplemental/best_practices_guide.go
+++ b/infra/doc/dc_supplemental/best_practices_guide.go
@@ -8,15 +8,15 @@ import (
)
type MsgBestPracticesGuide struct {
- DocDesc app_msg.Message
- Title app_msg.Message
- GeneralPractices app_msg.Message
+ DocDesc app_msg.Message
+ Title app_msg.Message
+ GeneralPractices app_msg.Message
PerformanceOptimization app_msg.Message
- SecurityPractices app_msg.Message
- AutomationTips app_msg.Message
- DataManagement app_msg.Message
- TeamCollaboration app_msg.Message
- MaintenanceAndUpdates app_msg.Message
+ SecurityPractices app_msg.Message
+ AutomationTips app_msg.Message
+ DataManagement app_msg.Message
+ TeamCollaboration app_msg.Message
+ MaintenanceAndUpdates app_msg.Message
}
var (
@@ -443,4 +443,4 @@ Keep your toolbox installation and workflows updated:
- Share knowledge and best practices
- Encourage continuous learning
`))
-}
\ No newline at end of file
+}
diff --git a/infra/doc/dc_supplemental/doc.go b/infra/doc/dc_supplemental/doc.go
new file mode 100644
index 000000000..fea9637e4
--- /dev/null
+++ b/infra/doc/dc_supplemental/doc.go
@@ -0,0 +1,2 @@
+// Package dc_supplemental provides various supplemental documentation sections.
+package dc_supplemental
diff --git a/infra/doc/dc_supplemental/dropbox_business.go b/infra/doc/dc_supplemental/dropbox_business.go
index 050db9cb5..146ef0491 100644
--- a/infra/doc/dc_supplemental/dropbox_business.go
+++ b/infra/doc/dc_supplemental/dropbox_business.go
@@ -1,15 +1,16 @@
package dc_supplemental
import (
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_catalogue"
- "github.com/watermint/toolbox/infra/doc/dc_index"
- "github.com/watermint/toolbox/infra/doc/dc_section"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/recipe/rc_spec"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "sort"
+ "sort"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_catalogue"
+ "github.com/watermint/toolbox/infra/doc/dc_index"
+ "github.com/watermint/toolbox/infra/doc/dc_section"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/recipe/rc_spec"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
var (
diff --git a/infra/doc/dc_supplemental/dropbox_business_test.go b/infra/doc/dc_supplemental/dropbox_business_test.go
index 719a8b8aa..e13a08097 100644
--- a/infra/doc/dc_supplemental/dropbox_business_test.go
+++ b/infra/doc/dc_supplemental/dropbox_business_test.go
@@ -1,10 +1,11 @@
package dc_supplemental
import (
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/doc/dc_index"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/doc/dc_index"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
func TestNewDbxCatalogue(t *testing.T) {
@@ -37,7 +38,7 @@ func TestDbxCat_Recipe(t *testing.T) {
t.Error("Expected Recipe method to panic for non-existent path")
}
}()
-
+
spec := dbxCat.Recipe("non-existent-path")
// Should not reach here
t.Error("Recipe method should have panicked, but got:", spec)
@@ -68,7 +69,7 @@ func TestDbxCat_RecipeTable(t *testing.T) {
t.Logf("RecipeTable panicked as expected with invalid paths: %v", r)
}
}()
-
+
// This will likely panic, but that's the expected behavior
paths := []string{"dropbox", "file", "list"}
dbxCat.RecipeTable("test-table", ctl.UI(), paths)
@@ -96,7 +97,7 @@ func TestNewDropboxBusiness(t *testing.T) {
// Test that it implements the Document interface methods
docImpl := doc.(*DropboxBusiness)
-
+
// Test DocDesc
desc := docImpl.DocDesc()
if desc == nil {
@@ -509,7 +510,7 @@ func TestMsgDropboxBusiness(t *testing.T) {
func TestSkipDropboxBusinessCommandDoc(t *testing.T) {
// Test the global flag
originalValue := SkipDropboxBusinessCommandDoc
-
+
// Test setting to true
SkipDropboxBusinessCommandDoc = true
if !SkipDropboxBusinessCommandDoc {
@@ -524,4 +525,4 @@ func TestSkipDropboxBusinessCommandDoc(t *testing.T) {
// Restore original value
SkipDropboxBusinessCommandDoc = originalValue
-}
\ No newline at end of file
+}
diff --git a/infra/doc/dc_supplemental/error_handling_guide.go b/infra/doc/dc_supplemental/error_handling_guide.go
index 1ce369290..75e681d7f 100644
--- a/infra/doc/dc_supplemental/error_handling_guide.go
+++ b/infra/doc/dc_supplemental/error_handling_guide.go
@@ -8,15 +8,15 @@ import (
)
type MsgErrorHandlingGuide struct {
- DocDesc app_msg.Message
- Title app_msg.Message
- CommonErrors app_msg.Message
- NetworkErrors app_msg.Message
- AuthenticationErrors app_msg.Message
- FileSystemErrors app_msg.Message
- RateLimitErrors app_msg.Message
- APIErrors app_msg.Message
- DebugTechniques app_msg.Message
+ DocDesc app_msg.Message
+ Title app_msg.Message
+ CommonErrors app_msg.Message
+ NetworkErrors app_msg.Message
+ AuthenticationErrors app_msg.Message
+ FileSystemErrors app_msg.Message
+ RateLimitErrors app_msg.Message
+ APIErrors app_msg.Message
+ DebugTechniques app_msg.Message
}
var (
@@ -376,4 +376,4 @@ Advanced debugging techniques for troubleshooting:
- Check community forums and discussions
- Report bugs with detailed reproduction steps
`))
-}
\ No newline at end of file
+}
diff --git a/infra/doc/dc_supplemental/minimal_test.go b/infra/doc/dc_supplemental/minimal_test.go
index 6385f1b1c..bf3c96d8a 100644
--- a/infra/doc/dc_supplemental/minimal_test.go
+++ b/infra/doc/dc_supplemental/minimal_test.go
@@ -13,43 +13,43 @@ func TestDocuments(t *testing.T) {
pv.DocId()
pv.DocDesc()
pv.Sections()
-
+
// Test ExperimentalFeature
ef := &ExperimentalFeature{}
ef.DocId()
ef.DocDesc()
ef.Sections()
-
+
// Test Troubleshooting
ts := &Troubleshooting{}
ts.DocId()
ts.DocDesc()
ts.Sections()
-
+
// Test ReportingOptions
ro := &ReportingOptions{}
ro.DocId()
ro.DocDesc()
ro.Sections()
-
+
// Test AuthenticationGuide
ag := &AuthenticationGuide{}
ag.DocId()
ag.DocDesc()
ag.Sections()
-
+
// Test ErrorHandlingGuide
eg := &ErrorHandlingGuide{}
eg.DocId()
eg.DocDesc()
eg.Sections()
-
+
// Test BestPracticesGuide
bg := &BestPracticesGuide{}
bg.DocId()
bg.DocDesc()
bg.Sections()
-
+
// Test ReportingGuide
rg := &ReportingGuide{}
rg.DocId()
@@ -61,7 +61,7 @@ func TestDocuments(t *testing.T) {
func TestFactories(t *testing.T) {
// Test NewDocSpecChange
NewDocSpecChange()
-
+
// Test NewDropboxBusiness
NewDropboxBusiness(dc_index.MediaRepository)
NewDropboxBusiness(dc_index.MediaWeb)
@@ -80,46 +80,46 @@ func TestSections(t *testing.T) {
// Test PathVariableDefinitions
pvd := &PathVariableDefinitions{}
pvd.Title()
-
+
// Test ExperimentalFeatureDefinitions
efd := &ExperimentalFeatureDefinitions{}
efd.Title()
-
+
// Test some auth sections
aos := &AuthOverviewSection{}
aos.Title()
-
+
das := &DropboxAuthSection{}
das.Title()
-
+
tms := &TokenManagementSection{}
tms.Title()
-
+
ats := &AuthTroubleshootingSection{}
ats.Title()
-
+
sts := &SecurityTipsSection{}
sts.Title()
-
+
// Test some error sections
ces := &CommonErrorsSection{}
ces.Title()
-
+
nes := &NetworkErrorsSection{}
nes.Title()
-
+
aes := &AuthenticationErrorsSection{}
aes.Title()
-
+
fes := &FileSystemErrorsSection{}
fes.Title()
-
+
rle := &RateLimitErrorsSection{}
rle.Title()
-
+
apis := &APIErrorsSection{}
apis.Title()
-
+
dts := &DebugTechniquesSection{}
dts.Title()
-}
\ No newline at end of file
+}
diff --git a/infra/doc/dc_supplemental/reporting_guide.go b/infra/doc/dc_supplemental/reporting_guide.go
index 0ab2516d9..175bd99c1 100644
--- a/infra/doc/dc_supplemental/reporting_guide.go
+++ b/infra/doc/dc_supplemental/reporting_guide.go
@@ -216,4 +216,4 @@ go run . [command] -output json | go run . util json query -query ".[] | keys"
These advanced reporting features provide powerful ways to extract, filter, and transform data from watermint toolbox commands, enabling sophisticated reporting and automation workflows.
`))
-}
\ No newline at end of file
+}
diff --git a/infra/doc/dc_supplemental/supplemental_test.go b/infra/doc/dc_supplemental/supplemental_test.go
index 742c24256..c0b3b4442 100644
--- a/infra/doc/dc_supplemental/supplemental_test.go
+++ b/infra/doc/dc_supplemental/supplemental_test.go
@@ -1,8 +1,9 @@
package dc_supplemental
import (
- "testing"
- "github.com/watermint/toolbox/infra/doc/dc_index"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/doc/dc_index"
)
func TestDocs(t *testing.T) {
@@ -11,24 +12,24 @@ func TestDocs(t *testing.T) {
if docs == nil {
t.Error("Expected non-nil docs")
}
-
+
// Should return multiple documents
if len(docs) == 0 {
t.Error("Expected at least one document")
}
-
+
// Test with web media type
webDocs := Docs(dc_index.MediaWeb)
if webDocs == nil {
t.Error("Expected non-nil docs for web")
}
-
+
if len(webDocs) == 0 {
t.Error("Expected at least one document for web")
}
-
+
// Should return the same number of docs regardless of media type
if len(docs) != len(webDocs) {
t.Errorf("Expected same number of docs, got %d for repository and %d for web", len(docs), len(webDocs))
}
-}
\ No newline at end of file
+}
diff --git a/infra/doc/dc_web/doc.go b/infra/doc/dc_web/doc.go
new file mode 100644
index 000000000..ebb97316d
--- /dev/null
+++ b/infra/doc/dc_web/doc.go
@@ -0,0 +1,2 @@
+// Package dc_web provides functionalities for generating web-specific documentation.
+package dc_web
diff --git a/infra/doc/doc.go b/infra/doc/doc.go
new file mode 100644
index 000000000..3f227fb5b
--- /dev/null
+++ b/infra/doc/doc.go
@@ -0,0 +1,2 @@
+// Package doc provides essential functionalities for documentation generation.
+package doc
diff --git a/infra/feed/doc.go b/infra/feed/doc.go
new file mode 100644
index 000000000..17af73ee2
--- /dev/null
+++ b/infra/feed/doc.go
@@ -0,0 +1,2 @@
+// Package feed provides essential functionalities for data feeds.
+package feed
diff --git a/infra/feed/fd_file/doc.go b/infra/feed/fd_file/doc.go
new file mode 100644
index 000000000..06c7303ad
--- /dev/null
+++ b/infra/feed/fd_file/doc.go
@@ -0,0 +1,2 @@
+// Package fd_file defines interfaces for row-based data feeds.
+package fd_file
diff --git a/infra/feed/fd_file_impl/doc.go b/infra/feed/fd_file_impl/doc.go
new file mode 100644
index 000000000..6dfa755ea
--- /dev/null
+++ b/infra/feed/fd_file_impl/doc.go
@@ -0,0 +1,2 @@
+// Package fd_file_impl provides a concrete implementation of the `fd_file.RowFeed` interface.
+package fd_file_impl
diff --git a/infra/feed/fd_file_impl/rows.go b/infra/feed/fd_file_impl/rows.go
index 7e4bd5d6e..ae87caef4 100644
--- a/infra/feed/fd_file_impl/rows.go
+++ b/infra/feed/fd_file_impl/rows.go
@@ -1,20 +1,21 @@
package fd_file_impl
import (
- "compress/gzip"
- "encoding/csv"
- "errors"
- "github.com/watermint/toolbox/essentials/encoding/es_unicode"
- "github.com/watermint/toolbox/essentials/log/esl"
- es_case2 "github.com/watermint/toolbox/essentials/strings/es_case"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/feed/fd_file"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "io"
- "os"
- "reflect"
- "strconv"
- "strings"
+ "compress/gzip"
+ "encoding/csv"
+ "errors"
+ "io"
+ "os"
+ "reflect"
+ "strconv"
+ "strings"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_unicode"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ es_case2 "github.com/watermint/toolbox/essentials/strings/es_case"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/feed/fd_file"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
)
type MsgRowFeed struct {
diff --git a/infra/feed/fd_file_impl/rows_test.go b/infra/feed/fd_file_impl/rows_test.go
index b56805124..4ae769884 100644
--- a/infra/feed/fd_file_impl/rows_test.go
+++ b/infra/feed/fd_file_impl/rows_test.go
@@ -1,16 +1,17 @@
package fd_file_impl
import (
- "compress/gzip"
- "errors"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "os"
- "path/filepath"
- "reflect"
- "strconv"
- "testing"
+ "compress/gzip"
+ "errors"
+ "os"
+ "path/filepath"
+ "reflect"
+ "strconv"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type TestModel struct {
@@ -49,11 +50,11 @@ func TestRowFeed_SetModel(t *testing.T) {
rf := NewRowFeed("test")
model := &TestModel{}
rf.SetModel(model)
-
+
if rf.Model() != model {
t.Error("Expected model to be set")
}
-
+
rowFeed := rf.(*RowFeed)
if !rowFeed.modelReady {
t.Error("Expected model to be ready")
@@ -69,7 +70,7 @@ func TestRowFeed_Fork(t *testing.T) {
rowFeed.SetFilePath("/test/path.csv")
model := &TestModel{}
rowFeed.SetModel(model)
-
+
forked := rowFeed.Fork()
if forked.FilePath() != "/test/path.csv" {
t.Error("Expected file path to be copied")
@@ -77,7 +78,7 @@ func TestRowFeed_Fork(t *testing.T) {
if forked.Model() != model {
t.Error("Expected model to be copied")
}
-
+
// Verify it's a deep copy
forked.SetFilePath("/new/path.csv")
if rowFeed.FilePath() == "/new/path.csv" {
@@ -91,7 +92,7 @@ func TestRowFeed_ForkForTest(t *testing.T) {
rowFeed.SetFilePath("/test/path.csv")
model := &TestModel{}
rowFeed.SetModel(model)
-
+
forked := rowFeed.ForkForTest("/forked/path.csv")
if forked.FilePath() != "/forked/path.csv" {
t.Error("Expected forked path to be set")
@@ -120,21 +121,21 @@ func createTestCSV(t *testing.T, content string) string {
func createTestGzipCSV(t *testing.T, content string) string {
tmpDir := t.TempDir()
gzPath := filepath.Join(tmpDir, "test.csv.gz")
-
+
file, err := os.Create(gzPath)
if err != nil {
t.Fatal(err)
}
defer file.Close()
-
+
gzWriter := gzip.NewWriter(file)
defer gzWriter.Close()
-
+
_, err = gzWriter.Write([]byte(content))
if err != nil {
t.Fatal(err)
}
-
+
return gzPath
}
@@ -144,47 +145,47 @@ func TestRowFeed_Open(t *testing.T) {
John,30,true,USA
Jane,25,false,UK`
csvPath := createTestCSV(t, csvContent)
-
+
rf := NewRowFeed("test")
rf.SetFilePath(csvPath)
rf.SetModel(&TestModel{})
-
+
err := qt_control.WithControl(func(c app_control.Control) error {
return rf.Open(c)
})
if err != nil {
t.Error("Expected no error on open")
}
-
+
// Test with gzip CSV
gzPath := createTestGzipCSV(t, csvContent)
rf2 := NewRowFeed("test")
rf2.SetFilePath(gzPath)
rf2.SetModel(&TestModel{})
-
+
err = qt_control.WithControl(func(c app_control.Control) error {
return rf2.Open(c)
})
if err != nil {
t.Error("Expected no error on gzip open")
}
-
+
// Test with no model
rf3 := NewRowFeed("test")
rf3.SetFilePath(csvPath)
-
+
err = qt_control.WithControl(func(c app_control.Control) error {
return rf3.Open(c)
})
if err == nil {
t.Error("Expected error when no model set")
}
-
+
// Test with non-existent file
rf4 := NewRowFeed("test")
rf4.SetFilePath("/non/existent/file.csv")
rf4.SetModel(&TestModel{})
-
+
err = qt_control.WithControl(func(c app_control.Control) error {
return rf4.Open(c)
})
@@ -200,37 +201,37 @@ John,30,true,USA
Jane,25,false,UK
Bob,35,true,Canada`
csvPath := createTestCSV(t, csvContent)
-
+
rf := NewRowFeed("test")
rf.SetFilePath(csvPath)
rf.SetModel(&TestModel{})
-
+
var rows []TestModel
err := qt_control.WithControl(func(c app_control.Control) error {
err := rf.Open(c)
if err != nil {
return err
}
-
+
return rf.EachRow(func(m interface{}, rowIndex int) error {
model := m.(*TestModel)
rows = append(rows, *model)
return nil
})
})
-
+
if err != nil {
t.Error("Expected no error")
}
-
+
if len(rows) != 3 {
t.Errorf("Expected 3 rows, got %d", len(rows))
}
-
+
if rows[0].Name != "John" || rows[0].Age != 30 || rows[0].Active != true || rows[0].Country != "USA" {
t.Error("First row data mismatch")
}
-
+
if rows[1].Name != "Jane" || rows[1].Age != 25 || rows[1].Active != false || rows[1].Country != "UK" {
t.Error("Second row data mismatch")
}
@@ -244,55 +245,55 @@ func TestRowFeed_EachRow_OrderMode(t *testing.T) {
John,30,true,USA
Jane,25,false,UK`
csvPath := createTestCSV(t, csvContent)
-
+
rf := NewRowFeed("test")
rf.SetFilePath(csvPath)
rf.SetModel(&TestModel{})
-
+
var rows []TestModel
err := qt_control.WithControl(func(c app_control.Control) error {
err := rf.Open(c)
if err != nil {
return err
}
-
+
return rf.EachRow(func(m interface{}, rowIndex int) error {
model := m.(*TestModel)
rows = append(rows, *model)
return nil
})
})
-
+
// In order mode, the header row is NOT consumed, but it tries to parse
// "unknown2" as an integer which fails
if err == nil {
t.Error("Expected error when parsing non-numeric header as age")
}
-
+
// Try again with valid data from the start
csvContent2 := `0,1,2,3
John,30,true,USA
Jane,25,false,UK`
csvPath2 := createTestCSV(t, csvContent2)
-
+
rf2 := NewRowFeed("test")
rf2.SetFilePath(csvPath2)
rf2.SetModel(&TestModel{})
-
+
var rows2 []TestModel
err2 := qt_control.WithControl(func(c app_control.Control) error {
err := rf2.Open(c)
if err != nil {
return err
}
-
+
return rf2.EachRow(func(m interface{}, rowIndex int) error {
model := m.(*TestModel)
rows2 = append(rows2, *model)
return nil
})
})
-
+
// This should still fail because "1" is not a valid age
if err2 == nil {
t.Error("Expected error when parsing header row '1' as age field")
@@ -304,56 +305,56 @@ func TestRowFeed_EachRow_Errors(t *testing.T) {
csvContent := `name,age,active,country
John,invalid_age,true,USA`
csvPath := createTestCSV(t, csvContent)
-
+
rf := NewRowFeed("test")
rf.SetFilePath(csvPath)
rf.SetModel(&TestModel{})
-
+
err := qt_control.WithControl(func(c app_control.Control) error {
err := rf.Open(c)
if err != nil {
return err
}
-
+
return rf.EachRow(func(m interface{}, rowIndex int) error {
return nil
})
})
-
+
if err == nil {
t.Error("Expected error for invalid age")
}
-
+
// Test with handler error
csvContent2 := `name,age,active,country
John,30,true,USA`
csvPath2 := createTestCSV(t, csvContent2)
-
+
rf2 := NewRowFeed("test")
rf2.SetFilePath(csvPath2)
rf2.SetModel(&TestModel{})
-
+
handlerError := errors.New("handler error")
err = qt_control.WithControl(func(c app_control.Control) error {
err := rf2.Open(c)
if err != nil {
return err
}
-
+
return rf2.EachRow(func(m interface{}, rowIndex int) error {
return handlerError
})
})
-
+
if err != handlerError {
t.Error("Expected handler error to be returned")
}
-
+
// Test without opening first - EachRow will reopen the file
rf3 := NewRowFeed("test")
rf3.SetFilePath(csvPath2) // Use valid CSV
rf3.SetModel(&TestModel{})
-
+
err = qt_control.WithControl(func(c app_control.Control) error {
rowFeed := rf3.(*RowFeed)
rowFeed.ctl = c
@@ -362,7 +363,7 @@ John,30,true,USA`
return nil
})
})
-
+
if err != nil {
t.Error("Expected EachRow to handle reopening file:", err)
}
@@ -374,17 +375,17 @@ John,30,true,USA
Invalid,-5,true,UK
Jane,25,false,Canada`
csvPath := createTestCSV(t, csvContent)
-
+
rf := NewRowFeed("test")
rf.SetFilePath(csvPath)
rf.SetModel(&TestModel{})
-
+
err := qt_control.WithControl(func(c app_control.Control) error {
err := rf.Open(c)
if err != nil {
return err
}
-
+
// Define a validator that rejects negative ages
validator := func(m interface{}, rowIndex int) (app_msg.Message, error) {
model := m.(*TestModel)
@@ -393,37 +394,37 @@ Jane,25,false,Canada`
}
return nil, nil
}
-
+
return rf.Validate(validator)
})
-
+
if err == nil {
t.Error("Expected validation error for negative age")
}
-
+
// Test with all valid rows
csvContent2 := `name,age,active,country
John,30,true,USA
Jane,25,false,UK`
csvPath2 := createTestCSV(t, csvContent2)
-
+
rf2 := NewRowFeed("test")
rf2.SetFilePath(csvPath2)
rf2.SetModel(&TestModel{})
-
+
err = qt_control.WithControl(func(c app_control.Control) error {
err := rf2.Open(c)
if err != nil {
return err
}
-
+
validator := func(m interface{}, rowIndex int) (app_msg.Message, error) {
return nil, nil
}
-
+
return rf2.Validate(validator)
})
-
+
if err != nil {
t.Error("Expected no validation error")
}
@@ -432,32 +433,32 @@ Jane,25,false,UK`
func TestRowFeed_applyModel(t *testing.T) {
rf := NewRowFeed("test")
rowFeed := rf.(*RowFeed)
-
+
// Test with nil model
rowFeed.applyModel()
if rowFeed.modelReady {
t.Error("Expected model not to be ready with nil model")
}
-
+
// Test with valid model
rowFeed.md = &TestModel{}
rowFeed.applyModel()
-
+
if !rowFeed.modelReady {
t.Error("Expected model to be ready")
}
-
+
if len(rowFeed.fields) != 4 {
t.Errorf("Expected 4 fields, got %d", len(rowFeed.fields))
}
-
+
expectedFields := []string{"name", "age", "active", "country"}
for i, field := range expectedFields {
if rowFeed.fields[i] != field {
t.Errorf("Expected field %s at index %d, got %s", field, i, rowFeed.fields[i])
}
}
-
+
// Test field name mappings
if rowFeed.fieldNameToOrder["Name"] != 0 {
t.Error("Expected Name to map to order 0")
@@ -468,12 +469,12 @@ func TestRowFeed_applyModel(t *testing.T) {
if rowFeed.orderToFieldName[2] != "Active" {
t.Error("Expected order 2 to map to Active")
}
-
+
// Test with model containing unsupported types
rowFeed2 := rf.(*RowFeed)
rowFeed2.md = &TestModelInvalid{}
rowFeed2.applyModel()
-
+
if len(rowFeed2.fields) != 0 {
t.Error("Expected no fields for model with unsupported types")
}
@@ -486,7 +487,7 @@ func TestRowFeed_header(t *testing.T) {
rowFeed := rf.(*RowFeed)
rowFeed.ctl = c
rowFeed.applyModel()
-
+
// Test field name mode
cols := []string{"name", "age", "active", "country"}
consume, err := rowFeed.header(cols)
@@ -499,14 +500,14 @@ func TestRowFeed_header(t *testing.T) {
if rowFeed.mode != "fieldName" {
t.Error("Expected field name mode")
}
-
+
// Test order mode
rf2 := NewRowFeed("test")
rf2.SetModel(&TestModel{})
rowFeed2 := rf2.(*RowFeed)
rowFeed2.ctl = c
rowFeed2.applyModel()
-
+
cols2 := []string{"0", "1", "2", "3"}
consume2, err2 := rowFeed2.header(cols2)
if err2 != nil {
@@ -518,14 +519,14 @@ func TestRowFeed_header(t *testing.T) {
if rowFeed2.mode != "order" {
t.Error("Expected order mode")
}
-
+
// Test mixed mode (should default to order)
rf3 := NewRowFeed("test")
rf3.SetModel(&TestModel{})
rowFeed3 := rf3.(*RowFeed)
rowFeed3.ctl = c
rowFeed3.applyModel()
-
+
cols3 := []string{"name", "unknown", "active", "country"}
consume3, err3 := rowFeed3.header(cols3)
if err3 != nil {
@@ -537,10 +538,10 @@ func TestRowFeed_header(t *testing.T) {
if rowFeed3.mode != "order" {
t.Error("Expected order mode for mixed columns")
}
-
+
return nil
})
-
+
if err != nil {
t.Error(err)
}
@@ -553,30 +554,30 @@ func TestRowFeed_row(t *testing.T) {
rowFeed := rf.(*RowFeed)
rowFeed.ctl = c
rowFeed.applyModel()
-
+
// Set up field name mode
cols := []string{"name", "age", "active", "country"}
rowFeed.header(cols)
-
+
// Test valid row
rowData := []string{"John", "30", "true", "USA"}
m, err := rowFeed.row(rowData)
if err != nil {
t.Error("Expected no error")
}
-
+
model := m.(*TestModel)
if model.Name != "John" || model.Age != 30 || model.Active != true || model.Country != "USA" {
t.Error("Row data mismatch")
}
-
+
// Test invalid data type
rowData2 := []string{"Jane", "invalid", "true", "UK"}
_, err2 := rowFeed.row(rowData2)
if err2 == nil {
t.Error("Expected error for invalid age")
}
-
+
// Test with extra columns
rowData3 := []string{"Bob", "35", "false", "Canada", "extra"}
m3, err3 := rowFeed.row(rowData3)
@@ -587,10 +588,10 @@ func TestRowFeed_row(t *testing.T) {
if model3.Name != "Bob" {
t.Error("Expected row to be parsed despite extra columns")
}
-
+
return nil
})
-
+
if err != nil {
t.Error(err)
}
@@ -603,10 +604,10 @@ func TestRowFeed_colIndexToField_errors(t *testing.T) {
rowFeed := rf.(*RowFeed)
rowFeed.ctl = c
rowFeed.applyModel()
-
+
// Skip this test - in field name mode with an invalid field,
// the implementation actually switches to order mode
-
+
// Test order mode with out of range index
rf2 := NewRowFeed("test")
rf2.SetModel(&TestModel{})
@@ -616,16 +617,16 @@ func TestRowFeed_colIndexToField_errors(t *testing.T) {
rowFeed2.mode = "order"
cols2 := []string{"0", "1", "2", "3"}
rowFeed2.header(cols2)
-
+
rm2 := reflect.New(rowFeed2.mt)
err2 := rowFeed2.colIndexToField(10, rm2, "value")
if err2 == nil {
t.Error("Expected error for out of range index")
}
-
+
return nil
})
-
+
if err != nil {
t.Error(err)
}
@@ -635,11 +636,11 @@ func TestRowFeed_EmptyModel(t *testing.T) {
rf := NewRowFeed("test")
rf.SetModel(&TestModelEmpty{})
rowFeed := rf.(*RowFeed)
-
+
if len(rowFeed.fields) != 0 {
t.Error("Expected no fields for empty model")
}
-
+
if !rowFeed.modelReady {
t.Error("Expected model to be ready even if empty")
}
@@ -655,38 +656,38 @@ false
True
False`
csvPath := createTestCSV(t, csvContent)
-
+
type BoolModel struct {
Active bool
}
-
+
rf := NewRowFeed("test")
rf.SetFilePath(csvPath)
rf.SetModel(&BoolModel{})
-
+
var values []bool
err := qt_control.WithControl(func(c app_control.Control) error {
err := rf.Open(c)
if err != nil {
return err
}
-
+
return rf.EachRow(func(m interface{}, rowIndex int) error {
model := m.(*BoolModel)
values = append(values, model.Active)
return nil
})
})
-
+
if err != nil {
t.Error("Expected no error")
}
-
+
expected := []bool{true, false, true, false, true, false}
if len(values) != len(expected) {
t.Errorf("Expected %d values, got %d", len(expected), len(values))
}
-
+
for i, v := range values {
if v != expected[i] {
t.Errorf("Value mismatch at index %d: expected %v, got %v", i, expected[i], v)
@@ -699,7 +700,7 @@ func TestMsgRowFeed(t *testing.T) {
if MRowFeed == nil {
t.Error("Expected MRowFeed to be initialized")
}
-
+
// Just verify the struct has the expected fields
msgType := reflect.TypeOf(*MRowFeed)
if msgType.NumField() != 2 {
@@ -712,38 +713,38 @@ func TestRowFeed_ConcurrentAccess(t *testing.T) {
csvContent := `name,age,active,country
John,30,true,USA`
csvPath := createTestCSV(t, csvContent)
-
+
rf := NewRowFeed("test")
rf.SetFilePath(csvPath)
rf.SetModel(&TestModel{})
-
+
// First iteration
err := qt_control.WithControl(func(c app_control.Control) error {
err := rf.Open(c)
if err != nil {
return err
}
-
+
return rf.EachRow(func(m interface{}, rowIndex int) error {
return nil
})
})
-
+
if err != nil {
t.Error("Expected no error on first iteration")
}
-
+
// Second iteration - should reopen the file
err = qt_control.WithControl(func(c app_control.Control) error {
// Note: Open is already called, so EachRow should handle reopening
rowFeed := rf.(*RowFeed)
rowFeed.ctl = c
-
+
return rf.EachRow(func(m interface{}, rowIndex int) error {
return nil
})
})
-
+
if err != nil {
t.Error("Expected no error on second iteration")
}
@@ -755,33 +756,33 @@ func TestRowFeed_FieldNameVariations(t *testing.T) {
csvContent := `name,age,active,country
John,30,true,USA`
csvPath := createTestCSV(t, csvContent)
-
+
rf := NewRowFeed("test")
rf.SetFilePath(csvPath)
rf.SetModel(&TestModel{})
-
+
var rows []TestModel
err := qt_control.WithControl(func(c app_control.Control) error {
err := rf.Open(c)
if err != nil {
return err
}
-
+
return rf.EachRow(func(m interface{}, rowIndex int) error {
model := m.(*TestModel)
rows = append(rows, *model)
return nil
})
})
-
+
if err != nil {
t.Error("Expected no error with lowercase headers:", err)
}
-
+
if len(rows) != 1 {
t.Errorf("Expected 1 row, got %d", len(rows))
}
-
+
if len(rows) > 0 && rows[0].Name != "John" {
t.Error("Expected field mapping to work")
}
@@ -795,29 +796,29 @@ func TestRowFeed_LargeFile(t *testing.T) {
csvContent += "User" + strconv.Itoa(i) + "," + strconv.Itoa(20+i%50) + ",true,Country" + strconv.Itoa(i) + "\n"
}
csvPath := createTestCSV(t, csvContent)
-
+
rf := NewRowFeed("test")
rf.SetFilePath(csvPath)
rf.SetModel(&TestModel{})
-
+
rowCount := 0
err := qt_control.WithControl(func(c app_control.Control) error {
err := rf.Open(c)
if err != nil {
return err
}
-
+
return rf.EachRow(func(m interface{}, rowIndex int) error {
rowCount++
return nil
})
})
-
+
if err != nil {
t.Error("Expected no error with large file")
}
-
+
if rowCount != 100 {
t.Errorf("Expected 100 rows, got %d", rowCount)
}
-}
\ No newline at end of file
+}
diff --git a/infra/feed/fd_file_impl/spec.go b/infra/feed/fd_file_impl/spec.go
index 7cae1bc0d..410328454 100644
--- a/infra/feed/fd_file_impl/spec.go
+++ b/infra/feed/fd_file_impl/spec.go
@@ -1,7 +1,7 @@
package fd_file_impl
import (
- "github.com/watermint/toolbox/essentials/go/es_reflect"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
"github.com/watermint/toolbox/infra/doc/dc_recipe"
"github.com/watermint/toolbox/infra/feed/fd_file"
"github.com/watermint/toolbox/infra/ui/app_msg"
diff --git a/infra/feed/fd_file_impl/spec_test.go b/infra/feed/fd_file_impl/spec_test.go
index 571bd1063..638230bc3 100644
--- a/infra/feed/fd_file_impl/spec_test.go
+++ b/infra/feed/fd_file_impl/spec_test.go
@@ -1,9 +1,10 @@
package fd_file_impl
import (
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
func TestNewSpec(t *testing.T) {
@@ -12,12 +13,12 @@ func TestNewSpec(t *testing.T) {
rf.SetModel(&TestModel{})
rowFeed := rf.(*RowFeed)
rowFeed.applyModel()
-
+
spec := newSpec(rowFeed)
if spec == nil {
t.Error("Expected non-nil spec")
}
-
+
specImpl := spec.(*Spec)
if specImpl.rf != rowFeed {
t.Error("Expected rf to be set")
@@ -31,17 +32,17 @@ func TestNewSpec(t *testing.T) {
if len(specImpl.colExample) != 4 {
t.Errorf("Expected 4 column examples, got %d", len(specImpl.colExample))
}
-
+
// Test panic with nil model
rf2 := NewRowFeed("test")
rowFeed2 := rf2.(*RowFeed)
-
+
defer func() {
if r := recover(); r == nil {
t.Error("Expected panic with nil model")
}
}()
-
+
newSpec(rowFeed2)
}
@@ -49,7 +50,7 @@ func TestSpec_Name(t *testing.T) {
rf := NewRowFeed("test_feed")
rf.SetModel(&TestModel{})
spec := rf.Spec()
-
+
if spec.Name() != "test_feed" {
t.Errorf("Expected name 'test_feed', got '%s'", spec.Name())
}
@@ -59,7 +60,7 @@ func TestSpec_Desc(t *testing.T) {
rf := NewRowFeed("test")
rf.SetModel(&TestModel{})
spec := rf.Spec()
-
+
desc := spec.Desc()
if desc == nil {
t.Error("Expected non-nil description message")
@@ -70,12 +71,12 @@ func TestSpec_Columns(t *testing.T) {
rf := NewRowFeed("test")
rf.SetModel(&TestModel{})
spec := rf.Spec()
-
+
cols := spec.Columns()
if len(cols) != 4 {
t.Errorf("Expected 4 columns, got %d", len(cols))
}
-
+
expectedCols := []string{"name", "age", "active", "country"}
for i, col := range expectedCols {
if cols[i] != col {
@@ -88,13 +89,13 @@ func TestSpec_ColumnDesc(t *testing.T) {
rf := NewRowFeed("test")
rf.SetModel(&TestModel{})
spec := rf.Spec()
-
+
// Test existing column
nameDesc := spec.ColumnDesc("name")
if nameDesc == nil {
t.Error("Expected non-nil description for 'name' column")
}
-
+
// Test non-existing column
invalidDesc := spec.ColumnDesc("invalid")
if invalidDesc != nil {
@@ -106,13 +107,13 @@ func TestSpec_ColumnExample(t *testing.T) {
rf := NewRowFeed("test")
rf.SetModel(&TestModel{})
spec := rf.Spec()
-
+
// Test existing column
nameExample := spec.ColumnExample("name")
if nameExample == nil {
t.Error("Expected non-nil example for 'name' column")
}
-
+
// Test non-existing column
invalidExample := spec.ColumnExample("invalid")
if invalidExample != nil {
@@ -124,10 +125,10 @@ func TestSpec_Doc(t *testing.T) {
rf := NewRowFeed("test")
rf.SetModel(&TestModel{})
spec := rf.Spec()
-
+
err := qt_control.WithControl(func(c app_control.Control) error {
doc := spec.Doc(c.UI())
-
+
if doc == nil {
t.Error("Expected non-nil doc")
}
@@ -138,15 +139,15 @@ func TestSpec_Doc(t *testing.T) {
if len(doc.Columns) != 4 {
t.Errorf("Expected 4 columns in doc, got %d", len(doc.Columns))
}
-
+
// Check first column
if doc.Columns[0].Name != "name" {
t.Errorf("Expected first column name 'name', got '%s'", doc.Columns[0].Name)
}
-
+
return nil
})
-
+
if err != nil {
t.Error(err)
}
@@ -156,22 +157,22 @@ func TestSpec_EmptyModel(t *testing.T) {
rf := NewRowFeed("test")
rf.SetModel(&TestModelEmpty{})
spec := rf.Spec()
-
+
cols := spec.Columns()
if len(cols) != 0 {
t.Error("Expected no columns for empty model")
}
-
+
err := qt_control.WithControl(func(c app_control.Control) error {
doc := spec.Doc(c.UI())
-
+
if len(doc.Columns) != 0 {
t.Error("Expected no columns in doc for empty model")
}
-
+
return nil
})
-
+
if err != nil {
t.Error(err)
}
@@ -183,16 +184,16 @@ func TestSpec_AllFieldTypes(t *testing.T) {
IntField int
BoolField bool
}
-
+
rf := NewRowFeed("test")
rf.SetModel(&AllTypesModel{})
spec := rf.Spec()
-
+
cols := spec.Columns()
if len(cols) != 3 {
t.Errorf("Expected 3 columns, got %d", len(cols))
}
-
+
// Verify all columns have descriptions and examples
for _, col := range cols {
if spec.ColumnDesc(col) == nil {
@@ -202,4 +203,4 @@ func TestSpec_AllFieldTypes(t *testing.T) {
t.Errorf("Expected example for column %s", col)
}
}
-}
\ No newline at end of file
+}
diff --git a/infra/recipe/doc.go b/infra/recipe/doc.go
new file mode 100644
index 000000000..f76e1bb09
--- /dev/null
+++ b/infra/recipe/doc.go
@@ -0,0 +1,2 @@
+// Package recipe provides essential functionalities for recipe definition and execution.
+package recipe
diff --git a/infra/recipe/rc_catalogue/doc.go b/infra/recipe/rc_catalogue/doc.go
new file mode 100644
index 000000000..c2a80264a
--- /dev/null
+++ b/infra/recipe/rc_catalogue/doc.go
@@ -0,0 +1,2 @@
+// Package rc_catalogue defines the `Catalogue` interface for managing recipes.
+package rc_catalogue
diff --git a/infra/recipe/rc_catalogue_impl/doc.go b/infra/recipe/rc_catalogue_impl/doc.go
new file mode 100644
index 000000000..22e3568a4
--- /dev/null
+++ b/infra/recipe/rc_catalogue_impl/doc.go
@@ -0,0 +1,2 @@
+// Package rc_catalogue_impl provides a concrete implementation of the `rc_catalogue.Catalogue` interface.
+package rc_catalogue_impl
diff --git a/infra/recipe/rc_compatibility/compatibility.go b/infra/recipe/rc_compatibility/compatibility.go
index ce8ee326d..8d1a4fd20 100644
--- a/infra/recipe/rc_compatibility/compatibility.go
+++ b/infra/recipe/rc_compatibility/compatibility.go
@@ -1,13 +1,14 @@
package rc_compatibility
import (
- "encoding/json"
- "github.com/watermint/toolbox/essentials/log/esl"
- "golang.org/x/exp/slices"
- "os"
- "reflect"
- "strings"
- "time"
+ "encoding/json"
+ "os"
+ "reflect"
+ "strings"
+ "time"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "golang.org/x/exp/slices"
)
var (
diff --git a/infra/recipe/rc_compatibility/doc.go b/infra/recipe/rc_compatibility/doc.go
new file mode 100644
index 000000000..88bf2e6a9
--- /dev/null
+++ b/infra/recipe/rc_compatibility/doc.go
@@ -0,0 +1,2 @@
+// Package rc_compatibility provides functionalities for managing recipe compatibility.
+package rc_compatibility
diff --git a/infra/recipe/rc_error_handler/doc.go b/infra/recipe/rc_error_handler/doc.go
new file mode 100644
index 000000000..d5037eb29
--- /dev/null
+++ b/infra/recipe/rc_error_handler/doc.go
@@ -0,0 +1,2 @@
+// Package rc_error_handler defines an interface for error handlers.
+package rc_error_handler
diff --git a/infra/recipe/rc_exec/doc.go b/infra/recipe/rc_exec/doc.go
new file mode 100644
index 000000000..d784fec7d
--- /dev/null
+++ b/infra/recipe/rc_exec/doc.go
@@ -0,0 +1,2 @@
+// Package rc_exec provides functions for executing recipes.
+package rc_exec
diff --git a/infra/recipe/rc_exec/exec.go b/infra/recipe/rc_exec/exec.go
index 38a02619d..7c289cdaa 100644
--- a/infra/recipe/rc_exec/exec.go
+++ b/infra/recipe/rc_exec/exec.go
@@ -1,19 +1,20 @@
package rc_exec
import (
- "encoding/json"
- "errors"
- "github.com/watermint/toolbox/essentials/ambient/ea_indicator"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/network/nw_auth"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/recipe/rc_spec"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/quality/infra/qt_errors"
- "github.com/watermint/toolbox/quality/infra/qt_replay"
- "runtime"
+ "encoding/json"
+ "errors"
+ "runtime"
+
+ "github.com/watermint/toolbox/essentials/ambient/ea_indicator"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/network/nw_auth"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/recipe/rc_spec"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/quality/infra/qt_errors"
+ "github.com/watermint/toolbox/quality/infra/qt_replay"
)
var (
diff --git a/infra/recipe/rc_group/doc.go b/infra/recipe/rc_group/doc.go
new file mode 100644
index 000000000..e8a2e8b02
--- /dev/null
+++ b/infra/recipe/rc_group/doc.go
@@ -0,0 +1,2 @@
+// Package rc_group defines the `Group` interface for organizing recipes into hierarchical command groups.
+package rc_group
diff --git a/infra/recipe/rc_group/group.go b/infra/recipe/rc_group/group.go
index 88522557f..4c7def952 100644
--- a/infra/recipe/rc_group/group.go
+++ b/infra/recipe/rc_group/group.go
@@ -8,8 +8,9 @@ import (
)
type MsgHeader struct {
- Header app_msg.Message
- License app_msg.Message
+ Header app_msg.Message
+ KtloAnnouncement app_msg.Message
+ License app_msg.Message
}
var (
@@ -21,6 +22,8 @@ func AppHeader(ui app_ui.UI, version string) {
ui.Info(app_msg.Raw(app_definitions.Copyright))
ui.Info(MHeader.License)
ui.Break()
+ ui.Info(MHeader.KtloAnnouncement)
+ ui.Break()
}
func UsageHeader(ui app_ui.UI, desc app_msg.Message, version string) {
diff --git a/infra/recipe/rc_group_impl/doc.go b/infra/recipe/rc_group_impl/doc.go
new file mode 100644
index 000000000..02b21024a
--- /dev/null
+++ b/infra/recipe/rc_group_impl/doc.go
@@ -0,0 +1,2 @@
+// Package rc_group_impl provides a concrete implementation of the `rc_group.Group` interface.
+package rc_group_impl
diff --git a/infra/recipe/rc_group_impl/group.go b/infra/recipe/rc_group_impl/group.go
index 646c00fdd..b1367fb75 100644
--- a/infra/recipe/rc_group_impl/group.go
+++ b/infra/recipe/rc_group_impl/group.go
@@ -1,13 +1,14 @@
package rc_group_impl
import (
- "errors"
- "github.com/watermint/toolbox/infra/recipe/rc_group"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "sort"
- "strings"
+ "errors"
+ "sort"
+ "strings"
+
+ "github.com/watermint/toolbox/infra/recipe/rc_group"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
type MsgGroup struct {
diff --git a/infra/recipe/rc_group_impl/group_test.go b/infra/recipe/rc_group_impl/group_test.go
index 1635267fc..9415e51bb 100644
--- a/infra/recipe/rc_group_impl/group_test.go
+++ b/infra/recipe/rc_group_impl/group_test.go
@@ -1,11 +1,12 @@
package rc_group_impl
import (
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "github.com/watermint/toolbox/infra/ui/app_msg_container_impl"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "strings"
- "testing"
+ "strings"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container_impl"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
func TestGroupImpl_AddNoRecipeGroup(t *testing.T) {
diff --git a/infra/recipe/rc_group_impl/group_test_mock.go b/infra/recipe/rc_group_impl/group_test_mock.go
index 45b83dea7..ed92c4857 100644
--- a/infra/recipe/rc_group_impl/group_test_mock.go
+++ b/infra/recipe/rc_group_impl/group_test_mock.go
@@ -1,22 +1,23 @@
package rc_group_impl
import (
- "flag"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_lang"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_griddata"
- "github.com/watermint/toolbox/infra/data/da_json"
- "github.com/watermint/toolbox/infra/data/da_text"
- "github.com/watermint/toolbox/infra/doc/dc_index"
- "github.com/watermint/toolbox/infra/doc/dc_recipe"
- "github.com/watermint/toolbox/infra/feed/fd_file"
- "github.com/watermint/toolbox/infra/recipe/rc_compatibility"
- "github.com/watermint/toolbox/infra/recipe/rc_error_handler"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
+ "flag"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/data/da_griddata"
+ "github.com/watermint/toolbox/infra/data/da_json"
+ "github.com/watermint/toolbox/infra/data/da_text"
+ "github.com/watermint/toolbox/infra/doc/dc_index"
+ "github.com/watermint/toolbox/infra/doc/dc_recipe"
+ "github.com/watermint/toolbox/infra/feed/fd_file"
+ "github.com/watermint/toolbox/infra/recipe/rc_compatibility"
+ "github.com/watermint/toolbox/infra/recipe/rc_error_handler"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
type MockSpec struct {
diff --git a/infra/recipe/rc_recipe/doc.go b/infra/recipe/rc_recipe/doc.go
new file mode 100644
index 000000000..0b6ee49fb
--- /dev/null
+++ b/infra/recipe/rc_recipe/doc.go
@@ -0,0 +1,2 @@
+// Package rc_recipe defines core interfaces and structures for recipes.
+package rc_recipe
diff --git a/infra/recipe/rc_recipe/msg.go b/infra/recipe/rc_recipe/msg.go
index cce685ab6..2625e44f5 100644
--- a/infra/recipe/rc_recipe/msg.go
+++ b/infra/recipe/rc_recipe/msg.go
@@ -1,7 +1,7 @@
package rc_recipe
import (
- "github.com/watermint/toolbox/essentials/go/es_reflect"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
)
func Key(r Recipe) string {
diff --git a/infra/recipe/rc_recipe/repository.go b/infra/recipe/rc_recipe/repository.go
index 09457eb0c..f65f2ae49 100644
--- a/infra/recipe/rc_recipe/repository.go
+++ b/infra/recipe/rc_recipe/repository.go
@@ -1,17 +1,18 @@
package rc_recipe
import (
- "flag"
- "github.com/watermint/toolbox/essentials/api/api_conn"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_griddata"
- "github.com/watermint/toolbox/infra/data/da_json"
- "github.com/watermint/toolbox/infra/data/da_text"
- "github.com/watermint/toolbox/infra/feed/fd_file"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
+ "flag"
+
+ "github.com/watermint/toolbox/essentials/api/api_conn"
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/data/da_griddata"
+ "github.com/watermint/toolbox/infra/data/da_json"
+ "github.com/watermint/toolbox/infra/data/da_text"
+ "github.com/watermint/toolbox/infra/feed/fd_file"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
type Repository interface {
diff --git a/infra/recipe/rc_recipe/spec.go b/infra/recipe/rc_recipe/spec.go
index ba3968c39..9168c10b9 100644
--- a/infra/recipe/rc_recipe/spec.go
+++ b/infra/recipe/rc_recipe/spec.go
@@ -2,7 +2,7 @@ package rc_recipe
import (
"github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/data/da_griddata"
"github.com/watermint/toolbox/infra/data/da_json"
diff --git a/infra/recipe/rc_recipe/spec_value.go b/infra/recipe/rc_recipe/spec_value.go
index 3a3aec8b7..1b6a7b989 100644
--- a/infra/recipe/rc_recipe/spec_value.go
+++ b/infra/recipe/rc_recipe/spec_value.go
@@ -1,27 +1,28 @@
package rc_recipe
import (
- "flag"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
+ "flag"
+
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
type SpecValue interface {
- // Array of value names
- ValueNames() []string
+ // Array of value names
+ ValueNames() []string
- // Value description for the name
- ValueDesc(name string) app_msg.Message
+ // Value description for the name
+ ValueDesc(name string) app_msg.Message
- // Value default for the name
- ValueDefault(name string) interface{}
+ // Value default for the name
+ ValueDefault(name string) interface{}
- // Value for the name
- Value(name string) Value
+ // Value for the name
+ Value(name string) Value
- // Customized value default for the name
- ValueCustomDefault(name string) app_msg.MessageOptional
+ // Customized value default for the name
+ ValueCustomDefault(name string) app_msg.MessageOptional
- // Configure CLI flags
- SetFlags(f *flag.FlagSet, ui app_ui.UI)
+ // Configure CLI flags
+ SetFlags(f *flag.FlagSet, ui app_ui.UI)
}
diff --git a/infra/recipe/rc_recipe/value.go b/infra/recipe/rc_recipe/value.go
index d982d9148..31d931591 100644
--- a/infra/recipe/rc_recipe/value.go
+++ b/infra/recipe/rc_recipe/value.go
@@ -1,18 +1,19 @@
package rc_recipe
import (
- "errors"
- "github.com/watermint/toolbox/essentials/api/api_conn"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_griddata"
- "github.com/watermint/toolbox/infra/data/da_json"
- "github.com/watermint/toolbox/infra/data/da_text"
- "github.com/watermint/toolbox/infra/feed/fd_file"
- "github.com/watermint/toolbox/infra/recipe/rc_error_handler"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "reflect"
+ "errors"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/api/api_conn"
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/data/da_griddata"
+ "github.com/watermint/toolbox/infra/data/da_json"
+ "github.com/watermint/toolbox/infra/data/da_text"
+ "github.com/watermint/toolbox/infra/feed/fd_file"
+ "github.com/watermint/toolbox/infra/recipe/rc_error_handler"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
)
type Value interface {
diff --git a/infra/recipe/rc_replay/doc.go b/infra/recipe/rc_replay/doc.go
new file mode 100644
index 000000000..a732c1082
--- /dev/null
+++ b/infra/recipe/rc_replay/doc.go
@@ -0,0 +1,2 @@
+// Package rc_replay provides functionalities for replaying and comparing recipe executions.
+package rc_replay
diff --git a/infra/recipe/rc_replay/replay.go b/infra/recipe/rc_replay/replay.go
index d5bffe4f7..1ca50727d 100644
--- a/infra/recipe/rc_replay/replay.go
+++ b/infra/recipe/rc_replay/replay.go
@@ -1,31 +1,32 @@
package rc_replay
import (
- "bytes"
- "crypto/sha256"
- "encoding/base64"
- "encoding/json"
- "errors"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/io/es_file_copy"
- "github.com/watermint/toolbox/essentials/io/es_file_read"
- "github.com/watermint/toolbox/essentials/io/es_zip"
- "github.com/watermint/toolbox/essentials/kvs/kv_kvs"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/network/nw_capture"
- "github.com/watermint/toolbox/essentials/network/nw_request"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "github.com/watermint/toolbox/infra/control/app_job"
- "github.com/watermint/toolbox/infra/control/app_job_impl"
- "github.com/watermint/toolbox/infra/control/app_workspace"
- "github.com/watermint/toolbox/infra/recipe/rc_value"
- "github.com/watermint/toolbox/infra/security/sc_random"
- "os"
- "path/filepath"
- "reflect"
- "sort"
- "strings"
+ "bytes"
+ "crypto/sha256"
+ "encoding/base64"
+ "encoding/json"
+ "errors"
+ "os"
+ "path/filepath"
+ "reflect"
+ "sort"
+ "strings"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/io/es_file_copy"
+ "github.com/watermint/toolbox/essentials/io/es_file_read"
+ "github.com/watermint/toolbox/essentials/io/es_zip"
+ "github.com/watermint/toolbox/essentials/kvs/kv_kvs"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/network/nw_capture"
+ "github.com/watermint/toolbox/essentials/network/nw_request"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/infra/control/app_job"
+ "github.com/watermint/toolbox/infra/control/app_job_impl"
+ "github.com/watermint/toolbox/infra/control/app_workspace"
+ "github.com/watermint/toolbox/infra/recipe/rc_value"
+ "github.com/watermint/toolbox/infra/security/sc_random"
)
type Replay interface {
diff --git a/infra/recipe/rc_replay/replay_comprehensive_test.go b/infra/recipe/rc_replay/replay_comprehensive_test.go
index 657d303e2..95fafb586 100644
--- a/infra/recipe/rc_replay/replay_comprehensive_test.go
+++ b/infra/recipe/rc_replay/replay_comprehensive_test.go
@@ -12,18 +12,18 @@ import (
func TestPreserveLogFilePrefixes_Values(t *testing.T) {
// Test expected prefixes
// Note: These are examples, actual prefixes are defined in the package
-
+
// Verify some common prefixes are included
prefixMap := make(map[string]bool)
for _, prefix := range PreserveLogFilePrefixes {
prefixMap[prefix] = true
}
-
+
// Check that capture is included (most important for replay)
if !prefixMap["capture"] {
t.Error("Expected 'capture' to be in PreserveLogFilePrefixes")
}
-
+
// The actual prefixes are defined by constants in other packages
// Just verify we have some prefixes
if len(PreserveLogFilePrefixes) < 2 {
@@ -34,16 +34,16 @@ func TestPreserveLogFilePrefixes_Values(t *testing.T) {
func TestReplayImpl_Structure(t *testing.T) {
// Test rpImpl structure
logger := esl.Default()
-
+
impl := &rpImpl{
logger: logger,
opt: Opts{reportDiffs: true},
}
-
+
if impl.logger == nil {
t.Error("Expected logger to be set")
}
-
+
if !impl.opt.reportDiffs {
t.Error("Expected reportDiffs to be true")
}
@@ -61,19 +61,19 @@ func TestCapture_JSON(t *testing.T) {
// Additional fields would go here
},
}
-
+
// Marshal to JSON
data, err := json.Marshal(capture)
if err != nil {
t.Fatalf("Failed to marshal capture: %v", err)
}
-
+
// Unmarshal back
var decoded Capture
if err := json.Unmarshal(data, &decoded); err != nil {
t.Fatalf("Failed to unmarshal capture: %v", err)
}
-
+
// Verify fields
if decoded.Req.RequestHash != capture.Req.RequestHash {
t.Errorf("Expected request hash %s, got %s", capture.Req.RequestHash, decoded.Req.RequestHash)
@@ -85,23 +85,23 @@ func TestCapture_JSON(t *testing.T) {
func TestNew_WithMultipleOptions(t *testing.T) {
logger := esl.Default()
-
+
// Test with multiple options
- replay := New(logger,
+ replay := New(logger,
ReportDiffs(true),
ReportDiffs(false), // Second call should override
)
-
+
if replay == nil {
t.Fatal("Expected non-nil replay")
}
-
+
// Verify it's the correct type
impl, ok := replay.(*rpImpl)
if !ok {
t.Fatal("Expected replay to be *rpImpl")
}
-
+
// Last option should win
if impl.opt.reportDiffs {
t.Error("Expected reportDiffs to be false (last option should win)")
@@ -114,12 +114,11 @@ func TestOpt_Function(t *testing.T) {
o.reportDiffs = true
return o
}
-
+
opts := Opts{}
result := customOpt(opts)
-
+
if !result.reportDiffs {
t.Error("Expected custom option to set reportDiffs to true")
}
}
-
diff --git a/infra/recipe/rc_replay/replay_test.go b/infra/recipe/rc_replay/replay_test.go
index 48d5b3056..fcd9423c9 100644
--- a/infra/recipe/rc_replay/replay_test.go
+++ b/infra/recipe/rc_replay/replay_test.go
@@ -1,24 +1,25 @@
package rc_replay
import (
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/network/nw_capture"
- "github.com/watermint/toolbox/essentials/network/nw_request"
- "testing"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/network/nw_capture"
+ "github.com/watermint/toolbox/essentials/network/nw_request"
)
func TestNew(t *testing.T) {
logger := esl.Default()
-
+
// Test with no options
replay := New(logger)
if replay == nil {
t.Error("Expected non-nil replay instance")
}
-
+
// Test the replay implements the interface
var _ Replay = replay
-
+
// Test with options
replayWithOpts := New(logger, ReportDiffs(true))
if replayWithOpts == nil {
@@ -32,13 +33,13 @@ func TestReportDiffs(t *testing.T) {
if opt == nil {
t.Error("Expected non-nil option function")
}
-
+
opts := Opts{}
result := opt(opts)
if !result.reportDiffs {
t.Error("Expected reportDiffs to be true")
}
-
+
// Test with false
optFalse := ReportDiffs(false)
resultFalse := optFalse(opts)
@@ -49,19 +50,19 @@ func TestReportDiffs(t *testing.T) {
func TestOpts_Apply(t *testing.T) {
opts := Opts{}
-
+
// Test with no options
result := opts.Apply([]Opt{})
if result.reportDiffs {
t.Error("Expected default reportDiffs to be false")
}
-
+
// Test with single option
result = opts.Apply([]Opt{ReportDiffs(true)})
if !result.reportDiffs {
t.Error("Expected reportDiffs to be true")
}
-
+
// Test with multiple options
result = opts.Apply([]Opt{ReportDiffs(true), ReportDiffs(false)})
if result.reportDiffs {
@@ -73,16 +74,16 @@ func TestCapture(t *testing.T) {
// Test Capture struct creation
req := nw_request.Req{RequestHash: "test-hash"}
res := nw_capture.Res{ResponseCode: 200}
-
+
capture := Capture{
Req: req,
Res: res,
}
-
+
if capture.Req.RequestHash != "test-hash" {
t.Error("Expected request hash to be 'test-hash'")
}
-
+
if capture.Res.ResponseCode != 200 {
t.Error("Expected response code to be 200")
}
@@ -93,11 +94,11 @@ func TestPreserveLogFilePrefixes(t *testing.T) {
if PreserveLogFilePrefixes == nil {
t.Error("Expected PreserveLogFilePrefixes to be defined")
}
-
+
if len(PreserveLogFilePrefixes) == 0 {
t.Error("Expected PreserveLogFilePrefixes to have at least one entry")
}
-
+
// Test that all entries are non-empty strings
for i, prefix := range PreserveLogFilePrefixes {
if prefix == "" {
@@ -111,7 +112,7 @@ func TestErrorReportDiffFound(t *testing.T) {
if ErrorReportDiffFound == nil {
t.Error("Expected ErrorReportDiffFound to be defined")
}
-
+
if ErrorReportDiffFound.Error() == "" {
t.Error("Expected ErrorReportDiffFound to have a message")
}
@@ -121,7 +122,7 @@ func TestReplayInterface(t *testing.T) {
// Test that rpImpl implements Replay interface
logger := esl.Default()
replay := New(logger)
-
+
// This will fail at compile time if rpImpl doesn't implement Replay
var _ Replay = replay
}
@@ -132,4 +133,4 @@ func TestOpts_Defaults(t *testing.T) {
if opts.reportDiffs {
t.Error("Expected default reportDiffs to be false")
}
-}
\ No newline at end of file
+}
diff --git a/infra/recipe/rc_replay/util.go b/infra/recipe/rc_replay/util.go
index 58e9ba486..91c78729e 100644
--- a/infra/recipe/rc_replay/util.go
+++ b/infra/recipe/rc_replay/util.go
@@ -1,11 +1,12 @@
package rc_replay
import (
- "errors"
- "github.com/watermint/toolbox/essentials/file/es_filepath"
- "github.com/watermint/toolbox/essentials/model/mo_string"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "os"
+ "errors"
+ "os"
+
+ "github.com/watermint/toolbox/essentials/file/es_filepath"
+ "github.com/watermint/toolbox/essentials/model/mo_string"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
)
var (
diff --git a/infra/recipe/rc_replay/util_comprehensive_test.go b/infra/recipe/rc_replay/util_comprehensive_test.go
index 171272772..996162333 100644
--- a/infra/recipe/rc_replay/util_comprehensive_test.go
+++ b/infra/recipe/rc_replay/util_comprehensive_test.go
@@ -17,7 +17,7 @@ func TestReplayPath_ErrorCases(t *testing.T) {
os.Setenv(app_definitions.EnvNameReplayPath, originalEnv)
}
}()
-
+
// Test with empty optional string
emptyOpt := mo_string.NewOptional("")
_, err := ReplayPath(emptyOpt)
@@ -49,12 +49,12 @@ func TestReplayPath_PathFormatting(t *testing.T) {
hasError: false,
},
}
-
+
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
opt := mo_string.NewOptional(tc.input)
path, err := ReplayPath(opt)
-
+
if tc.hasError && err == nil {
t.Error("Expected error but got nil")
}
@@ -78,12 +78,12 @@ func TestReplayPath_ComplexScenarios(t *testing.T) {
os.Unsetenv(app_definitions.EnvNameReplayPath)
}
}()
-
+
// Test with both path and env var set - path should take precedence
os.Setenv(app_definitions.EnvNameReplayPath, "/env/replay")
opt := mo_string.NewOptional("/direct/replay")
path, err := ReplayPath(opt)
-
+
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
@@ -98,4 +98,4 @@ func TestErrorPathNotFound_Properties(t *testing.T) {
if ErrorPathNotFound.Error() != expectedMsg {
t.Errorf("Expected error message '%s', got '%s'", expectedMsg, ErrorPathNotFound.Error())
}
-}
\ No newline at end of file
+}
diff --git a/infra/recipe/rc_replay/util_test.go b/infra/recipe/rc_replay/util_test.go
index e5c416093..d98080b6a 100644
--- a/infra/recipe/rc_replay/util_test.go
+++ b/infra/recipe/rc_replay/util_test.go
@@ -1,21 +1,22 @@
package rc_replay
import (
- "os"
- "testing"
- "github.com/watermint/toolbox/essentials/model/mo_string"
- "github.com/watermint/toolbox/infra/control/app_definitions"
+ "os"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/model/mo_string"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
)
func TestReplayPath_WithProvidedPath(t *testing.T) {
// Test with provided path
path := mo_string.NewOptional("/test/path")
result, err := ReplayPath(path)
-
+
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
-
+
if result == "" {
t.Error("Expected non-empty result")
}
@@ -24,18 +25,18 @@ func TestReplayPath_WithProvidedPath(t *testing.T) {
func TestReplayPath_WithEmptyPath(t *testing.T) {
// Test with empty path and no environment variable
path := mo_string.NewOptional("")
-
+
// Clear environment variable first
originalEnv := os.Getenv(app_definitions.EnvNameReplayPath)
defer os.Setenv(app_definitions.EnvNameReplayPath, originalEnv)
os.Unsetenv(app_definitions.EnvNameReplayPath)
-
+
result, err := ReplayPath(path)
-
+
if err != ErrorPathNotFound {
t.Errorf("Expected ErrorPathNotFound, got %v", err)
}
-
+
if result != "" {
t.Errorf("Expected empty result, got %s", result)
}
@@ -44,18 +45,18 @@ func TestReplayPath_WithEmptyPath(t *testing.T) {
func TestReplayPath_WithEnvironmentVariable(t *testing.T) {
// Test with environment variable
path := mo_string.NewOptional("")
-
+
// Set environment variable
originalEnv := os.Getenv(app_definitions.EnvNameReplayPath)
defer os.Setenv(app_definitions.EnvNameReplayPath, originalEnv)
os.Setenv(app_definitions.EnvNameReplayPath, "/env/test/path")
-
+
result, err := ReplayPath(path)
-
+
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
-
+
if result == "" {
t.Error("Expected non-empty result")
}
@@ -64,18 +65,18 @@ func TestReplayPath_WithEnvironmentVariable(t *testing.T) {
func TestReplayPath_EnvironmentOverridesPath(t *testing.T) {
// Test that provided path takes precedence over environment variable
path := mo_string.NewOptional("/provided/path")
-
+
// Set environment variable
originalEnv := os.Getenv(app_definitions.EnvNameReplayPath)
defer os.Setenv(app_definitions.EnvNameReplayPath, originalEnv)
os.Setenv(app_definitions.EnvNameReplayPath, "/env/path")
-
+
result, err := ReplayPath(path)
-
+
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
-
+
// Should contain the provided path, not the environment path
if result == "" {
t.Error("Expected non-empty result")
@@ -87,8 +88,8 @@ func TestErrorPathNotFound(t *testing.T) {
if ErrorPathNotFound == nil {
t.Error("ErrorPathNotFound should not be nil")
}
-
+
if ErrorPathNotFound.Error() == "" {
t.Error("ErrorPathNotFound should have a message")
}
-}
\ No newline at end of file
+}
diff --git a/infra/recipe/rc_spec/common.go b/infra/recipe/rc_spec/common.go
index e41764cef..e26c100cd 100644
--- a/infra/recipe/rc_spec/common.go
+++ b/infra/recipe/rc_spec/common.go
@@ -1,12 +1,13 @@
package rc_spec
import (
- "flag"
- "github.com/watermint/toolbox/infra/control/app_opt"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/recipe/rc_value"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
+ "flag"
+
+ "github.com/watermint/toolbox/infra/control/app_opt"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/recipe/rc_value"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
func NewCommonValue() *CommonValues {
diff --git a/infra/recipe/rc_spec/doc.go b/infra/recipe/rc_spec/doc.go
new file mode 100644
index 000000000..082f03547
--- /dev/null
+++ b/infra/recipe/rc_spec/doc.go
@@ -0,0 +1,2 @@
+// Package rc_spec defines the `Spec` interface and provides a concrete implementation for managing recipe specifications.
+package rc_spec
diff --git a/infra/recipe/rc_spec/spec_impl.go b/infra/recipe/rc_spec/spec_impl.go
index c0f02b29f..26779995b 100644
--- a/infra/recipe/rc_spec/spec_impl.go
+++ b/infra/recipe/rc_spec/spec_impl.go
@@ -10,8 +10,8 @@ import (
"strings"
"github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_lang"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/control/app_definitions"
diff --git a/infra/recipe/rc_spec/spec_test.go b/infra/recipe/rc_spec/spec_test.go
index 03fddb100..238dfcf7c 100644
--- a/infra/recipe/rc_spec/spec_test.go
+++ b/infra/recipe/rc_spec/spec_test.go
@@ -6,7 +6,7 @@ import (
"testing"
"github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/doc/dc_index"
"github.com/watermint/toolbox/infra/recipe/rc_recipe"
@@ -562,14 +562,14 @@ type mockPartialAnnotatedRecipe struct {
irreversible bool
}
-func (m *mockPartialAnnotatedRecipe) Seed() rc_recipe.Recipe { return &m.mockRecipe }
-func (m *mockPartialAnnotatedRecipe) IsExperimental() bool { return m.experimental }
-func (m *mockPartialAnnotatedRecipe) IsIrreversible() bool { return m.irreversible }
-func (m *mockPartialAnnotatedRecipe) IsTransient() bool { return false }
-func (m *mockPartialAnnotatedRecipe) IsSecret() bool { return false }
-func (m *mockPartialAnnotatedRecipe) IsConsole() bool { return false }
-func (m *mockPartialAnnotatedRecipe) IsLicenseRequired() bool { return false }
-func (m *mockPartialAnnotatedRecipe) IsDeprecated() bool { return false }
+func (m *mockPartialAnnotatedRecipe) Seed() rc_recipe.Recipe { return &m.mockRecipe }
+func (m *mockPartialAnnotatedRecipe) IsExperimental() bool { return m.experimental }
+func (m *mockPartialAnnotatedRecipe) IsIrreversible() bool { return m.irreversible }
+func (m *mockPartialAnnotatedRecipe) IsTransient() bool { return false }
+func (m *mockPartialAnnotatedRecipe) IsSecret() bool { return false }
+func (m *mockPartialAnnotatedRecipe) IsConsole() bool { return false }
+func (m *mockPartialAnnotatedRecipe) IsLicenseRequired() bool { return false }
+func (m *mockPartialAnnotatedRecipe) IsDeprecated() bool { return false }
func TestSpecValueSelfContained_Doc(t *testing.T) {
recipe := &mockRecipe{}
@@ -645,7 +645,7 @@ func TestSpecValueSelfContained_Restore(t *testing.T) {
err := qt_control.WithControl(func(c app_control.Control) error {
// Create a simple JSON for restoration
jsonData := es_json.MustParseString(`{"Value": "restored_value"}`)
-
+
restoredRecipe, err := spec.Restore(jsonData, c)
if err != nil {
t.Error("Restore should not error", err)
@@ -681,4 +681,4 @@ func init() {
// Make sure we import necessary packages
_ = dc_index.MediaRepository
_ = es_lang.English
-}
\ No newline at end of file
+}
diff --git a/infra/recipe/rc_value/capture.go b/infra/recipe/rc_value/capture.go
index f74526976..4cc7e940a 100644
--- a/infra/recipe/rc_value/capture.go
+++ b/infra/recipe/rc_value/capture.go
@@ -1,15 +1,16 @@
package rc_value
import (
- "compress/gzip"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/file/es_filepath"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/security/sc_random"
- "io"
- "os"
- "path/filepath"
+ "compress/gzip"
+ "io"
+ "os"
+ "path/filepath"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/file/es_filepath"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/security/sc_random"
)
type CapturedData struct {
diff --git a/infra/recipe/rc_value/conn.go b/infra/recipe/rc_value/conn.go
index 0605e93d4..eb960449f 100644
--- a/infra/recipe/rc_value/conn.go
+++ b/infra/recipe/rc_value/conn.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/api/api_conn"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "reflect"
- "strings"
+ "reflect"
+ "strings"
+
+ "github.com/watermint/toolbox/essentials/api/api_conn"
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func NewValueConn(acceptType interface{}, factory func(peerName string) api_conn.Connection) rc_recipe.Value {
diff --git a/infra/recipe/rc_value/conn_test.go b/infra/recipe/rc_value/conn_test.go
index 62a5c773a..46bf5588e 100644
--- a/infra/recipe/rc_value/conn_test.go
+++ b/infra/recipe/rc_value/conn_test.go
@@ -1,15 +1,16 @@
package rc_value
import (
- "encoding/json"
- "flag"
- "github.com/watermint/toolbox/domain/dropbox/api/dbx_conn"
- "github.com/watermint/toolbox/domain/dropbox/api/dbx_conn_impl"
- "github.com/watermint/toolbox/essentials/api/api_conn"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "encoding/json"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/domain/dropbox/api/dbx_conn"
+ "github.com/watermint/toolbox/domain/dropbox/api/dbx_conn_impl"
+ "github.com/watermint/toolbox/essentials/api/api_conn"
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueConnBaseRecipe struct {
diff --git a/infra/recipe/rc_value/doc.go b/infra/recipe/rc_value/doc.go
new file mode 100644
index 000000000..2da85167d
--- /dev/null
+++ b/infra/recipe/rc_value/doc.go
@@ -0,0 +1,2 @@
+// Package rc_value provides a comprehensive set of value types for recipe parameters.
+package rc_value
diff --git a/infra/recipe/rc_value/repo_impl.go b/infra/recipe/rc_value/repo_impl.go
index af991d909..8de9d040d 100644
--- a/infra/recipe/rc_value/repo_impl.go
+++ b/infra/recipe/rc_value/repo_impl.go
@@ -1,41 +1,42 @@
package rc_value
import (
- "errors"
- "flag"
- "fmt"
- "github.com/watermint/toolbox/domain/asana/api/as_conn"
- "github.com/watermint/toolbox/domain/asana/api/as_conn_impl"
- "github.com/watermint/toolbox/domain/deepl/api/deepl_conn"
- "github.com/watermint/toolbox/domain/deepl/api/deepl_conn_impl"
- "github.com/watermint/toolbox/domain/dropbox/api/dbx_conn"
- "github.com/watermint/toolbox/domain/dropbox/api/dbx_conn_impl"
- "github.com/watermint/toolbox/domain/dropboxsign/api/hs_conn"
- "github.com/watermint/toolbox/domain/dropboxsign/api/hs_conn_impl"
- "github.com/watermint/toolbox/domain/figma/api/fg_conn"
- "github.com/watermint/toolbox/domain/figma/api/fg_conn_impl"
- "github.com/watermint/toolbox/domain/github/api/gh_conn"
- "github.com/watermint/toolbox/domain/github/api/gh_conn_impl"
- "github.com/watermint/toolbox/domain/slack/api/work_conn"
- "github.com/watermint/toolbox/domain/slack/api/work_conn_impl"
- "github.com/watermint/toolbox/essentials/api/api_conn"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/model/mo_multi"
- es_case2 "github.com/watermint/toolbox/essentials/strings/es_case"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "github.com/watermint/toolbox/infra/data/da_griddata"
- "github.com/watermint/toolbox/infra/data/da_json"
- "github.com/watermint/toolbox/infra/data/da_text"
- "github.com/watermint/toolbox/infra/feed/fd_file"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "reflect"
- "sort"
- "strings"
+ "errors"
+ "flag"
+ "fmt"
+ "reflect"
+ "sort"
+ "strings"
+
+ "github.com/watermint/toolbox/domain/asana/api/as_conn"
+ "github.com/watermint/toolbox/domain/asana/api/as_conn_impl"
+ "github.com/watermint/toolbox/domain/deepl/api/deepl_conn"
+ "github.com/watermint/toolbox/domain/deepl/api/deepl_conn_impl"
+ "github.com/watermint/toolbox/domain/dropbox/api/dbx_conn"
+ "github.com/watermint/toolbox/domain/dropbox/api/dbx_conn_impl"
+ "github.com/watermint/toolbox/domain/dropboxsign/api/hs_conn"
+ "github.com/watermint/toolbox/domain/dropboxsign/api/hs_conn_impl"
+ "github.com/watermint/toolbox/domain/figma/api/fg_conn"
+ "github.com/watermint/toolbox/domain/figma/api/fg_conn_impl"
+ "github.com/watermint/toolbox/domain/github/api/gh_conn"
+ "github.com/watermint/toolbox/domain/github/api/gh_conn_impl"
+ "github.com/watermint/toolbox/domain/slack/api/work_conn"
+ "github.com/watermint/toolbox/domain/slack/api/work_conn_impl"
+ "github.com/watermint/toolbox/essentials/api/api_conn"
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/model/mo_multi"
+ es_case2 "github.com/watermint/toolbox/essentials/strings/es_case"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/infra/data/da_griddata"
+ "github.com/watermint/toolbox/infra/data/da_json"
+ "github.com/watermint/toolbox/infra/data/da_text"
+ "github.com/watermint/toolbox/infra/feed/fd_file"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
var (
diff --git a/infra/recipe/rc_value/repo_impl_test.go b/infra/recipe/rc_value/repo_impl_test.go
index 206ff17f6..d6d57f32e 100644
--- a/infra/recipe/rc_value/repo_impl_test.go
+++ b/infra/recipe/rc_value/repo_impl_test.go
@@ -1,12 +1,13 @@
package rc_value
import (
- "flag"
- "github.com/watermint/toolbox/essentials/model/mo_string"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "reflect"
- "testing"
+ "flag"
+ "reflect"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/model/mo_string"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type TestRecipe struct {
@@ -203,7 +204,7 @@ func TestRepositoryImpl_ApplyCustom(t *testing.T) {
func TestValueOfType(t *testing.T) {
recipe := &TestRecipe{}
stringType := reflect.TypeOf("")
-
+
// Test with valid type
value := valueOfType(recipe, stringType, recipe, "test")
if value == nil {
@@ -326,7 +327,7 @@ func TestRepositoryImpl_PresetCalled(t *testing.T) {
recipe := &PresetRecipe{}
repo := NewRepository(recipe)
repoImpl := repo.(*RepositoryImpl)
-
+
current := repoImpl.Current().(*PresetRecipe)
if current.Value != "preset_value" {
t.Errorf("Expected Preset() to be called, value should be 'preset_value', got %s", current.Value)
@@ -442,4 +443,4 @@ func TestRepositoryImpl_CaptureRestore(t *testing.T) {
if err != nil {
t.Error(err)
}
-}
\ No newline at end of file
+}
diff --git a/infra/recipe/rc_value/val_appmsg_message.go b/infra/recipe/rc_value/val_appmsg_message.go
index d8b84c6af..f71edd1a1 100644
--- a/infra/recipe/rc_value/val_appmsg_message.go
+++ b/infra/recipe/rc_value/val_appmsg_message.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/strings/es_case"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/strings/es_case"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
)
func newValueAppMsgMessage(name string, msg app_msg.Message) rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_appmsg_message_test.go b/infra/recipe/rc_value/val_appmsg_message_test.go
index 0cff22cbb..3122f3cbe 100644
--- a/infra/recipe/rc_value/val_appmsg_message_test.go
+++ b/infra/recipe/rc_value/val_appmsg_message_test.go
@@ -1,10 +1,11 @@
package rc_value
import (
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueAppMsgMessageRecipe struct {
diff --git a/infra/recipe/rc_value/val_bool.go b/infra/recipe/rc_value/val_bool.go
index acadd435f..cb5fcf411 100644
--- a/infra/recipe/rc_value/val_bool.go
+++ b/infra/recipe/rc_value/val_bool.go
@@ -1,68 +1,69 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func newValueBool() rc_recipe.Value {
- return &ValueBool{}
+ return &ValueBool{}
}
type ValueBool struct {
- v bool
+ v bool
}
func (z *ValueBool) Spec() (typeName string, typeAttr interface{}) {
- return "bool", nil
+ return "bool", nil
}
func (z *ValueBool) Accept(recipe interface{}, t reflect.Type, v0 interface{}, name string) rc_recipe.Value {
- if t.Kind() == reflect.Bool {
- return newValueBool()
- }
- return nil
+ if t.Kind() == reflect.Bool {
+ return newValueBool()
+ }
+ return nil
}
func (z *ValueBool) Bind() interface{} {
- return &z.v
+ return &z.v
}
func (z *ValueBool) Init() (v interface{}) {
- return z.v
+ return z.v
}
func (z *ValueBool) ApplyPreset(v0 interface{}) {
- z.v = v0.(bool)
+ z.v = v0.(bool)
}
func (z *ValueBool) Apply() (v interface{}) {
- return z.v
+ return z.v
}
func (z *ValueBool) Capture(ctl app_control.Control) (v interface{}, err error) {
- return z.v, nil
+ return z.v, nil
}
func (z *ValueBool) Restore(v es_json.Json, ctl app_control.Control) error {
- if w, found := v.Bool(); found {
- z.v = w
- return nil
- } else {
- return rc_recipe.ErrorValueRestoreFailed
- }
+ if w, found := v.Bool(); found {
+ z.v = w
+ return nil
+ } else {
+ return rc_recipe.ErrorValueRestoreFailed
+ }
}
func (z *ValueBool) SpinUp(ctl app_control.Control) error {
- return nil
+ return nil
}
func (z *ValueBool) SpinDown(ctl app_control.Control) error {
- return nil
+ return nil
}
func (z *ValueBool) Debug() interface{} {
- return z.v
+ return z.v
}
diff --git a/infra/recipe/rc_value/val_bool_test.go b/infra/recipe/rc_value/val_bool_test.go
index 85968b176..b48ffdf34 100644
--- a/infra/recipe/rc_value/val_bool_test.go
+++ b/infra/recipe/rc_value/val_bool_test.go
@@ -1,12 +1,13 @@
package rc_value
import (
- "encoding/json"
- "flag"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "encoding/json"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueBoolRecipe struct {
diff --git a/infra/recipe/rc_value/val_dagriddata_input.go b/infra/recipe/rc_value/val_dagriddata_input.go
index c5644fe8b..8d8624103 100644
--- a/infra/recipe/rc_value/val_dagriddata_input.go
+++ b/infra/recipe/rc_value/val_dagriddata_input.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/file/es_filepath"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_griddata"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/file/es_filepath"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/data/da_griddata"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func newValueDaGridDataInput(recipe interface{}, name string) rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_dagriddata_input_test.go b/infra/recipe/rc_value/val_dagriddata_input_test.go
index c63b2e1d7..f58360e94 100644
--- a/infra/recipe/rc_value/val_dagriddata_input_test.go
+++ b/infra/recipe/rc_value/val_dagriddata_input_test.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "flag"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_griddata"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "github.com/watermint/toolbox/quality/infra/qt_file"
- "os"
- "testing"
+ "flag"
+ "os"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/data/da_griddata"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
+ "github.com/watermint/toolbox/quality/infra/qt_file"
)
type ValueDaGridDataInputRecipe struct {
diff --git a/infra/recipe/rc_value/val_dagriddata_output.go b/infra/recipe/rc_value/val_dagriddata_output.go
index f454a408b..4b2c09fb0 100644
--- a/infra/recipe/rc_value/val_dagriddata_output.go
+++ b/infra/recipe/rc_value/val_dagriddata_output.go
@@ -1,11 +1,12 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_griddata"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/data/da_griddata"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func newValueDaGridDataOutput(recipe interface{}, name string) rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_dagriddata_output_test.go b/infra/recipe/rc_value/val_dagriddata_output_test.go
index 3114c1944..e45761526 100644
--- a/infra/recipe/rc_value/val_dagriddata_output_test.go
+++ b/infra/recipe/rc_value/val_dagriddata_output_test.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "flag"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_griddata"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "github.com/watermint/toolbox/quality/infra/qt_file"
- "os"
- "testing"
+ "flag"
+ "os"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/data/da_griddata"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
+ "github.com/watermint/toolbox/quality/infra/qt_file"
)
type ValueDaGridDataOutputRecipe struct {
diff --git a/infra/recipe/rc_value/val_dajsoninput.go b/infra/recipe/rc_value/val_dajsoninput.go
index f8f327996..1b76db56f 100644
--- a/infra/recipe/rc_value/val_dajsoninput.go
+++ b/infra/recipe/rc_value/val_dajsoninput.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/file/es_filepath"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_json"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/file/es_filepath"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/data/da_json"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func newValueDaJsonInput(recipe interface{}, name string) rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_dajsoninput_test.go b/infra/recipe/rc_value/val_dajsoninput_test.go
index ff9e28700..4a204bbcd 100644
--- a/infra/recipe/rc_value/val_dajsoninput_test.go
+++ b/infra/recipe/rc_value/val_dajsoninput_test.go
@@ -1,12 +1,13 @@
package rc_value
import (
- "flag"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_json"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "github.com/watermint/toolbox/quality/infra/qt_file"
- "testing"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/data/da_json"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
+ "github.com/watermint/toolbox/quality/infra/qt_file"
)
type ValueDaJsonInputSample struct {
diff --git a/infra/recipe/rc_value/val_datextinput.go b/infra/recipe/rc_value/val_datextinput.go
index 57389f8a7..66189c0ff 100644
--- a/infra/recipe/rc_value/val_datextinput.go
+++ b/infra/recipe/rc_value/val_datextinput.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/file/es_filepath"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_text"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/file/es_filepath"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/data/da_text"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func newValueDaTextInput(recipe interface{}, name string) rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_datextinput_test.go b/infra/recipe/rc_value/val_datextinput_test.go
index 88001f73b..f31251218 100644
--- a/infra/recipe/rc_value/val_datextinput_test.go
+++ b/infra/recipe/rc_value/val_datextinput_test.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "flag"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_text"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "github.com/watermint/toolbox/quality/infra/qt_file"
- "os"
- "testing"
+ "flag"
+ "os"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/data/da_text"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
+ "github.com/watermint/toolbox/quality/infra/qt_file"
)
type ValueDaTextInputRecipe struct {
diff --git a/infra/recipe/rc_value/val_fdfile_rowfeed.go b/infra/recipe/rc_value/val_fdfile_rowfeed.go
index c2802357d..223086a63 100644
--- a/infra/recipe/rc_value/val_fdfile_rowfeed.go
+++ b/infra/recipe/rc_value/val_fdfile_rowfeed.go
@@ -1,24 +1,25 @@
package rc_value
import (
- "compress/gzip"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/file/es_filepath"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/strings/es_case"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/feed/fd_file"
- "github.com/watermint/toolbox/infra/feed/fd_file_impl"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/security/sc_random"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "io"
- "os"
- "path/filepath"
- "reflect"
- "strings"
+ "compress/gzip"
+ "io"
+ "os"
+ "path/filepath"
+ "reflect"
+ "strings"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/file/es_filepath"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/strings/es_case"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/feed/fd_file"
+ "github.com/watermint/toolbox/infra/feed/fd_file_impl"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/security/sc_random"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
const (
diff --git a/infra/recipe/rc_value/val_int_test.go b/infra/recipe/rc_value/val_int_test.go
index 6207cac33..647575fe7 100644
--- a/infra/recipe/rc_value/val_int_test.go
+++ b/infra/recipe/rc_value/val_int_test.go
@@ -1,12 +1,13 @@
package rc_value
import (
- "encoding/json"
- "flag"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "encoding/json"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueIntRecipe struct {
diff --git a/infra/recipe/rc_value/val_kvstorage_storage.go b/infra/recipe/rc_value/val_kvstorage_storage.go
index 2535a7d90..ceb64181d 100644
--- a/infra/recipe/rc_value/val_kvstorage_storage.go
+++ b/infra/recipe/rc_value/val_kvstorage_storage.go
@@ -1,17 +1,18 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/file/es_filepath"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/kvs/kv_storage"
- "github.com/watermint/toolbox/essentials/kvs/kv_storage_impl"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "os"
- "path/filepath"
- "reflect"
+ "os"
+ "path/filepath"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/file/es_filepath"
+ "github.com/watermint/toolbox/essentials/kvs/kv_storage"
+ "github.com/watermint/toolbox/essentials/kvs/kv_storage_impl"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func newValueKvStorageStorage(name string) rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_kvstorage_storage_test.go b/infra/recipe/rc_value/val_kvstorage_storage_test.go
index 823835e19..541ac0b7e 100644
--- a/infra/recipe/rc_value/val_kvstorage_storage_test.go
+++ b/infra/recipe/rc_value/val_kvstorage_storage_test.go
@@ -1,12 +1,13 @@
package rc_value
import (
- "flag"
- "github.com/watermint/toolbox/essentials/kvs/kv_kvs"
- "github.com/watermint/toolbox/essentials/kvs/kv_storage"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/kvs/kv_kvs"
+ "github.com/watermint/toolbox/essentials/kvs/kv_storage"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueKvStorageStorageRecipe struct {
diff --git a/infra/recipe/rc_value/val_mofilter_filter.go b/infra/recipe/rc_value/val_mofilter_filter.go
index 127027d69..2aa5b7283 100644
--- a/infra/recipe/rc_value/val_mofilter_filter.go
+++ b/infra/recipe/rc_value/val_mofilter_filter.go
@@ -1,12 +1,13 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/model/mo_filter"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/model/mo_filter"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func newValueMoFilter(name string) rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_mofilter_filter_test.go b/infra/recipe/rc_value/val_mofilter_filter_test.go
index bf3d1e763..7939c659d 100644
--- a/infra/recipe/rc_value/val_mofilter_filter_test.go
+++ b/infra/recipe/rc_value/val_mofilter_filter_test.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "encoding/json"
- "flag"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/model/mo_filter"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "encoding/json"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/model/mo_filter"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueMoFilterFilterRecipe struct {
diff --git a/infra/recipe/rc_value/val_moint_range.go b/infra/recipe/rc_value/val_moint_range.go
index ab39cc4d3..74716b764 100644
--- a/infra/recipe/rc_value/val_moint_range.go
+++ b/infra/recipe/rc_value/val_moint_range.go
@@ -5,7 +5,7 @@ import (
"strconv"
"github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
"github.com/watermint/toolbox/essentials/model/mo_int"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/recipe/rc_recipe"
diff --git a/infra/recipe/rc_value/val_moint_range_test.go b/infra/recipe/rc_value/val_moint_range_test.go
index 5a1c83fda..1fba1c6ad 100644
--- a/infra/recipe/rc_value/val_moint_range_test.go
+++ b/infra/recipe/rc_value/val_moint_range_test.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "encoding/json"
- "flag"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/model/mo_int"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "encoding/json"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/model/mo_int"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueMoIntRangeRecipe struct {
diff --git a/infra/recipe/rc_value/val_mopath_dropboxpath.go b/infra/recipe/rc_value/val_mopath_dropboxpath.go
index abbdd2868..af53dfd5b 100644
--- a/infra/recipe/rc_value/val_mopath_dropboxpath.go
+++ b/infra/recipe/rc_value/val_mopath_dropboxpath.go
@@ -1,14 +1,15 @@
package rc_value
import (
- "github.com/watermint/toolbox/domain/dropbox/model/mo_path"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/file/es_filepath"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/domain/dropbox/model/mo_path"
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/file/es_filepath"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func newValueMoPathDropboxPath(name string) rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_mopath_dropboxpath_test.go b/infra/recipe/rc_value/val_mopath_dropboxpath_test.go
index 9b270c6de..7eef99d3b 100644
--- a/infra/recipe/rc_value/val_mopath_dropboxpath_test.go
+++ b/infra/recipe/rc_value/val_mopath_dropboxpath_test.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "encoding/json"
- "flag"
- "github.com/watermint/toolbox/domain/dropbox/model/mo_path"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "encoding/json"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/domain/dropbox/model/mo_path"
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueMoPathDropboxPathRecipe struct {
diff --git a/infra/recipe/rc_value/val_mopath_fspath.go b/infra/recipe/rc_value/val_mopath_fspath.go
index e0a46e2e1..9313e6618 100644
--- a/infra/recipe/rc_value/val_mopath_fspath.go
+++ b/infra/recipe/rc_value/val_mopath_fspath.go
@@ -1,17 +1,18 @@
package rc_value
import (
- "errors"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/file/es_filepath"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/log/esl"
- mo_path2 "github.com/watermint/toolbox/essentials/model/mo_path"
- "github.com/watermint/toolbox/essentials/strings/es_case"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "os"
- "reflect"
+ "errors"
+ "os"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/file/es_filepath"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ mo_path2 "github.com/watermint/toolbox/essentials/model/mo_path"
+ "github.com/watermint/toolbox/essentials/strings/es_case"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
var (
diff --git a/infra/recipe/rc_value/val_mopath_fspath_test.go b/infra/recipe/rc_value/val_mopath_fspath_test.go
index 2ea3fd0de..1cd29f1d3 100644
--- a/infra/recipe/rc_value/val_mopath_fspath_test.go
+++ b/infra/recipe/rc_value/val_mopath_fspath_test.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "encoding/json"
- "flag"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/model/mo_path"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "encoding/json"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/model/mo_path"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueMoPathFsPathRecipe struct {
diff --git a/infra/recipe/rc_value/val_mostring_optional.go b/infra/recipe/rc_value/val_mostring_optional.go
index 9b09dd2c0..4efdef24e 100644
--- a/infra/recipe/rc_value/val_mostring_optional.go
+++ b/infra/recipe/rc_value/val_mostring_optional.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/model/mo_string"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "reflect"
- "strconv"
+ "reflect"
+ "strconv"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/model/mo_string"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func newValueOptionalString() rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_mostring_optional_test.go b/infra/recipe/rc_value/val_mostring_optional_test.go
index dab62dfb0..87178180d 100644
--- a/infra/recipe/rc_value/val_mostring_optional_test.go
+++ b/infra/recipe/rc_value/val_mostring_optional_test.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "encoding/json"
- "flag"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/model/mo_string"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "encoding/json"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/model/mo_string"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueMoStringOptionalRecipe struct {
diff --git a/infra/recipe/rc_value/val_mostring_select.go b/infra/recipe/rc_value/val_mostring_select.go
index 6c896eddc..7a64a64b9 100644
--- a/infra/recipe/rc_value/val_mostring_select.go
+++ b/infra/recipe/rc_value/val_mostring_select.go
@@ -1,14 +1,15 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/model/mo_string"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "reflect"
- "strconv"
- "strings"
+ "reflect"
+ "strconv"
+ "strings"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/model/mo_string"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func newValueSelectString() rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_mostring_select_test.go b/infra/recipe/rc_value/val_mostring_select_test.go
index fba45756d..f7267633b 100644
--- a/infra/recipe/rc_value/val_mostring_select_test.go
+++ b/infra/recipe/rc_value/val_mostring_select_test.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "encoding/json"
- "flag"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/model/mo_string"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "encoding/json"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/model/mo_string"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueMoStringSelectRecipe struct {
diff --git a/infra/recipe/rc_value/val_motime_time.go b/infra/recipe/rc_value/val_motime_time.go
index 3626b5781..7459ae46e 100644
--- a/infra/recipe/rc_value/val_motime_time.go
+++ b/infra/recipe/rc_value/val_motime_time.go
@@ -1,14 +1,15 @@
package rc_value
import (
- "github.com/watermint/toolbox/domain/dropbox/model/mo_essential"
- "github.com/watermint/toolbox/domain/dropbox/model/mo_time"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/domain/dropbox/model/mo_essential"
+ "github.com/watermint/toolbox/domain/dropbox/model/mo_time"
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func newValueMoTimeTime(name string) rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_motime_time_test.go b/infra/recipe/rc_value/val_motime_time_test.go
index dd625730c..874dd0359 100644
--- a/infra/recipe/rc_value/val_motime_time_test.go
+++ b/infra/recipe/rc_value/val_motime_time_test.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "encoding/json"
- "flag"
- "github.com/watermint/toolbox/domain/dropbox/model/mo_time"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "encoding/json"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/domain/dropbox/model/mo_time"
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueMoTimeTimeRecipe struct {
diff --git a/infra/recipe/rc_value/val_mourl_url.go b/infra/recipe/rc_value/val_mourl_url.go
index 427b2df0d..b054ea46e 100644
--- a/infra/recipe/rc_value/val_mourl_url.go
+++ b/infra/recipe/rc_value/val_mourl_url.go
@@ -1,101 +1,102 @@
package rc_value
import (
- "github.com/watermint/toolbox/domain/dropbox/model/mo_url"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/domain/dropbox/model/mo_url"
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func newValueMoUrlUrl(name string) rc_recipe.Value {
- v := &ValueMoUrlUrl{name: name}
- v.url = mo_url.NewEmptyUrl()
- return v
+ v := &ValueMoUrlUrl{name: name}
+ v.url = mo_url.NewEmptyUrl()
+ return v
}
type ValueMoUrlUrl struct {
- name string
- rawUrl string
- url mo_url.Url
+ name string
+ rawUrl string
+ url mo_url.Url
}
func (z *ValueMoUrlUrl) ValueText() string {
- return z.rawUrl
+ return z.rawUrl
}
func (z *ValueMoUrlUrl) Spec() (typeName string, typeAttr interface{}) {
- return es_reflect.Key(z.url), nil
+ return es_reflect.Key(z.url), nil
}
func (z *ValueMoUrlUrl) Accept(recipe interface{}, t reflect.Type, v0 interface{}, name string) rc_recipe.Value {
- if t.Implements(reflect.TypeOf((*mo_url.Url)(nil)).Elem()) {
- return newValueMoUrlUrl(name)
- }
- return nil
+ if t.Implements(reflect.TypeOf((*mo_url.Url)(nil)).Elem()) {
+ return newValueMoUrlUrl(name)
+ }
+ return nil
}
func (z *ValueMoUrlUrl) Bind() interface{} {
- return &z.rawUrl
+ return &z.rawUrl
}
func (z *ValueMoUrlUrl) Init() (v interface{}) {
- return z.url
+ return z.url
}
func (z *ValueMoUrlUrl) ApplyPreset(v0 interface{}) {
- z.url = v0.(mo_url.Url)
- z.rawUrl = z.url.Value()
+ z.url = v0.(mo_url.Url)
+ z.rawUrl = z.url.Value()
}
func (z *ValueMoUrlUrl) Apply() (v interface{}) {
- l := esl.Default()
- u, err := mo_url.NewUrl(z.rawUrl)
- if err != nil {
- l.Debug("Unable to parse", esl.String("url", z.rawUrl), esl.Error(err))
- } else {
- z.url = u
- }
- return z.url
+ l := esl.Default()
+ u, err := mo_url.NewUrl(z.rawUrl)
+ if err != nil {
+ l.Debug("Unable to parse", esl.String("url", z.rawUrl), esl.Error(err))
+ } else {
+ z.url = u
+ }
+ return z.url
}
func (z *ValueMoUrlUrl) Debug() interface{} {
- return map[string]string{
- "url": z.rawUrl,
- }
+ return map[string]string{
+ "url": z.rawUrl,
+ }
}
func (z *ValueMoUrlUrl) Capture(ctl app_control.Control) (v interface{}, err error) {
- return z.rawUrl, nil
+ return z.rawUrl, nil
}
func (z *ValueMoUrlUrl) Restore(v es_json.Json, ctl app_control.Control) error {
- if w, found := v.String(); found {
- z.rawUrl = w
- return nil
- } else {
- return rc_recipe.ErrorValueRestoreFailed
- }
+ if w, found := v.String(); found {
+ z.rawUrl = w
+ return nil
+ } else {
+ return rc_recipe.ErrorValueRestoreFailed
+ }
}
func (z *ValueMoUrlUrl) SpinUp(ctl app_control.Control) error {
- l := esl.Default()
- if z.rawUrl == "" {
- return ErrorMissingRequiredOption
- }
-
- u, err := mo_url.NewUrl(z.rawUrl)
- if err != nil {
- l.Debug("Unable to parse", esl.String("url", z.rawUrl), esl.Error(err))
- return ErrorInvalidValue
- } else {
- z.url = u
- return nil
- }
+ l := esl.Default()
+ if z.rawUrl == "" {
+ return ErrorMissingRequiredOption
+ }
+
+ u, err := mo_url.NewUrl(z.rawUrl)
+ if err != nil {
+ l.Debug("Unable to parse", esl.String("url", z.rawUrl), esl.Error(err))
+ return ErrorInvalidValue
+ } else {
+ z.url = u
+ return nil
+ }
}
func (z *ValueMoUrlUrl) SpinDown(ctl app_control.Control) error {
- return nil
+ return nil
}
diff --git a/infra/recipe/rc_value/val_mourl_url_test.go b/infra/recipe/rc_value/val_mourl_url_test.go
index c80cfb737..205fdeace 100644
--- a/infra/recipe/rc_value/val_mourl_url_test.go
+++ b/infra/recipe/rc_value/val_mourl_url_test.go
@@ -1,13 +1,14 @@
package rc_value
import (
- "encoding/json"
- "flag"
- "github.com/watermint/toolbox/domain/dropbox/model/mo_url"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "encoding/json"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/domain/dropbox/model/mo_url"
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueMoUrlUrlRecipe struct {
diff --git a/infra/recipe/rc_value/val_rcrecipe_recipe.go b/infra/recipe/rc_value/val_rcrecipe_recipe.go
index 31dbb89c6..db02102ce 100644
--- a/infra/recipe/rc_value/val_rcrecipe_recipe.go
+++ b/infra/recipe/rc_value/val_rcrecipe_recipe.go
@@ -1,14 +1,15 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/api/api_conn"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/api/api_conn"
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
)
func newValueRcRecipeRecipe(name string, t reflect.Type) rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_rcrecipe_recipe_test.go b/infra/recipe/rc_value/val_rcrecipe_recipe_test.go
index 281a2be76..94a9eecd1 100644
--- a/infra/recipe/rc_value/val_rcrecipe_recipe_test.go
+++ b/infra/recipe/rc_value/val_rcrecipe_recipe_test.go
@@ -1,10 +1,11 @@
package rc_value
import (
- "flag"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueRcRecipeRecipeRecipe struct {
diff --git a/infra/recipe/rc_value/val_rpmodel_rowreport.go b/infra/recipe/rc_value/val_rpmodel_rowreport.go
index a5f9423fe..7ba317bb7 100644
--- a/infra/recipe/rc_value/val_rpmodel_rowreport.go
+++ b/infra/recipe/rc_value/val_rpmodel_rowreport.go
@@ -1,14 +1,15 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/strings/es_case"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/report/rp_model_impl"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/strings/es_case"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/report/rp_model_impl"
)
func newValueRpModelRowReport(name string) rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_rpmodel_rowreport_test.go b/infra/recipe/rc_value/val_rpmodel_rowreport_test.go
index c53662461..6c5049744 100644
--- a/infra/recipe/rc_value/val_rpmodel_rowreport_test.go
+++ b/infra/recipe/rc_value/val_rpmodel_rowreport_test.go
@@ -1,11 +1,12 @@
package rc_value
import (
- "flag"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueRpModelRowReportRecipeData struct {
diff --git a/infra/recipe/rc_value/val_rpmodel_transactionreport.go b/infra/recipe/rc_value/val_rpmodel_transactionreport.go
index 368b62fd7..4938ac909 100644
--- a/infra/recipe/rc_value/val_rpmodel_transactionreport.go
+++ b/infra/recipe/rc_value/val_rpmodel_transactionreport.go
@@ -1,14 +1,15 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/strings/es_case"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/report/rp_model_impl"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/strings/es_case"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/report/rp_model_impl"
)
func newValueRpModelTransactionReport(name string) rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_rpmodel_transactionreport_test.go b/infra/recipe/rc_value/val_rpmodel_transactionreport_test.go
index 419ad29c1..f89c16db2 100644
--- a/infra/recipe/rc_value/val_rpmodel_transactionreport_test.go
+++ b/infra/recipe/rc_value/val_rpmodel_transactionreport_test.go
@@ -1,11 +1,12 @@
package rc_value
import (
- "flag"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueRpModelTransactionReportRecipeData struct {
diff --git a/infra/recipe/rc_value/val_string.go b/infra/recipe/rc_value/val_string.go
index 181c55926..be4b32b27 100644
--- a/infra/recipe/rc_value/val_string.go
+++ b/infra/recipe/rc_value/val_string.go
@@ -1,10 +1,11 @@
package rc_value
import (
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "reflect"
+ "reflect"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/recipe/rc_recipe"
)
func newValueString() rc_recipe.Value {
diff --git a/infra/recipe/rc_value/val_string_test.go b/infra/recipe/rc_value/val_string_test.go
index d670140f6..a7372d9c1 100644
--- a/infra/recipe/rc_value/val_string_test.go
+++ b/infra/recipe/rc_value/val_string_test.go
@@ -1,12 +1,13 @@
package rc_value
import (
- "encoding/json"
- "flag"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/quality/infra/qt_control"
- "testing"
+ "encoding/json"
+ "flag"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/quality/infra/qt_control"
)
type ValueStringRecipe struct {
diff --git a/infra/report/doc.go b/infra/report/doc.go
new file mode 100644
index 000000000..9206cc966
--- /dev/null
+++ b/infra/report/doc.go
@@ -0,0 +1,2 @@
+// Package report provides essential functionalities for report generation.
+package report
diff --git a/infra/report/rp_artifact/doc.go b/infra/report/rp_artifact/doc.go
new file mode 100644
index 000000000..3380f54ee
--- /dev/null
+++ b/infra/report/rp_artifact/doc.go
@@ -0,0 +1,2 @@
+// Package rp_artifact defines an `Artifact` interface and provides a function to retrieve report artifacts.
+package rp_artifact
diff --git a/infra/report/rp_artifact_feature/doc.go b/infra/report/rp_artifact_feature/doc.go
new file mode 100644
index 000000000..e1ab76225
--- /dev/null
+++ b/infra/report/rp_artifact_feature/doc.go
@@ -0,0 +1,2 @@
+// Package rp_artifact_feature defines an opt-in feature for automatically opening report artifacts.
+package rp_artifact_feature
diff --git a/infra/report/rp_column/doc.go b/infra/report/rp_column/doc.go
new file mode 100644
index 000000000..a5e40dd0b
--- /dev/null
+++ b/infra/report/rp_column/doc.go
@@ -0,0 +1,2 @@
+// Package rp_column defines an interface for a report column.
+package rp_column
diff --git a/infra/report/rp_column_impl/doc.go b/infra/report/rp_column_impl/doc.go
new file mode 100644
index 000000000..c29a2558e
--- /dev/null
+++ b/infra/report/rp_column_impl/doc.go
@@ -0,0 +1,2 @@
+// Package rp_column_impl provides concrete implementations for `rp_column.Column`.
+package rp_column_impl
diff --git a/infra/report/rp_column_impl/json.go b/infra/report/rp_column_impl/json.go
index 82e880315..723492777 100644
--- a/infra/report/rp_column_impl/json.go
+++ b/infra/report/rp_column_impl/json.go
@@ -1,11 +1,12 @@
package rp_column_impl
import (
- "encoding/json"
- "errors"
- "github.com/tidwall/gjson"
- "github.com/watermint/toolbox/essentials/log/esl"
- "reflect"
+ "encoding/json"
+ "errors"
+ "reflect"
+
+ "github.com/tidwall/gjson"
+ "github.com/watermint/toolbox/essentials/log/esl"
)
var (
diff --git a/infra/report/rp_column_impl/json_array.go b/infra/report/rp_column_impl/json_array.go
index 9c06eec7e..6097db6cb 100644
--- a/infra/report/rp_column_impl/json_array.go
+++ b/infra/report/rp_column_impl/json_array.go
@@ -1,10 +1,11 @@
package rp_column_impl
import (
- "encoding/json"
- "fmt"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/report/rp_column"
+ "encoding/json"
+ "fmt"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/report/rp_column"
)
func NewJson(header []string) rp_column.Column {
diff --git a/infra/report/rp_column_impl/json_test.go b/infra/report/rp_column_impl/json_test.go
index 0385e8f48..7fcb606da 100644
--- a/infra/report/rp_column_impl/json_test.go
+++ b/infra/report/rp_column_impl/json_test.go
@@ -1,9 +1,10 @@
package rp_column_impl
import (
- "encoding/json"
- "github.com/google/go-cmp/cmp"
- "testing"
+ "encoding/json"
+ "testing"
+
+ "github.com/google/go-cmp/cmp"
)
func TestHeaders(t *testing.T) {
diff --git a/infra/report/rp_column_impl/stream_test.go b/infra/report/rp_column_impl/stream_test.go
index 45777012d..e358cf697 100644
--- a/infra/report/rp_column_impl/stream_test.go
+++ b/infra/report/rp_column_impl/stream_test.go
@@ -1,9 +1,10 @@
package rp_column_impl
import (
- "encoding/json"
- "github.com/google/go-cmp/cmp"
- "testing"
+ "encoding/json"
+ "testing"
+
+ "github.com/google/go-cmp/cmp"
)
func TestColumnStream_Header(t *testing.T) {
diff --git a/infra/report/rp_model/doc.go b/infra/report/rp_model/doc.go
new file mode 100644
index 000000000..2c6890367
--- /dev/null
+++ b/infra/report/rp_model/doc.go
@@ -0,0 +1,2 @@
+// Package rp_model defines interfaces for various types of reports and their specifications.
+package rp_model
diff --git a/infra/report/rp_model/report.go b/infra/report/rp_model/report.go
index 72d58d763..f16d905ce 100644
--- a/infra/report/rp_model/report.go
+++ b/infra/report/rp_model/report.go
@@ -1,11 +1,12 @@
package rp_model
import (
- "errors"
- "github.com/watermint/toolbox/infra/doc/dc_recipe"
- "github.com/watermint/toolbox/infra/report/rp_column"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
+ "errors"
+
+ "github.com/watermint/toolbox/infra/doc/dc_recipe"
+ "github.com/watermint/toolbox/infra/report/rp_column"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
type ReportOpt func(o *ReportOpts) *ReportOpts
diff --git a/infra/report/rp_model_impl/doc.go b/infra/report/rp_model_impl/doc.go
new file mode 100644
index 000000000..55cd5fe93
--- /dev/null
+++ b/infra/report/rp_model_impl/doc.go
@@ -0,0 +1,2 @@
+// Package rp_model_impl provides concrete implementations for `rp_model.Report`, `rp_model.RowReport`, and `rp_model.TransactionReport`.
+package rp_model_impl
diff --git a/infra/report/rp_model_impl/msg_test.go b/infra/report/rp_model_impl/msg_test.go
index 2043fb0df..e9fbce0a0 100644
--- a/infra/report/rp_model_impl/msg_test.go
+++ b/infra/report/rp_model_impl/msg_test.go
@@ -9,7 +9,7 @@ func TestMsgTransactionReport(t *testing.T) {
if MTransactionReport == nil {
t.Error("Expected MTransactionReport to be initialized")
}
-
+
// Test that messages are accessible
_ = MTransactionReport.Success
_ = MTransactionReport.Failure
@@ -22,8 +22,8 @@ func TestMsgColumnSpec(t *testing.T) {
if MColumnSpec == nil {
t.Error("Expected MColumnSpec to be initialized")
}
-
+
// Test that messages are accessible
_ = MColumnSpec.TransactionRowStatus
_ = MColumnSpec.TransactionRowReason
-}
\ No newline at end of file
+}
diff --git a/infra/report/rp_model_impl/row.go b/infra/report/rp_model_impl/row.go
index 5974f80e1..50b004e30 100644
--- a/infra/report/rp_model_impl/row.go
+++ b/infra/report/rp_model_impl/row.go
@@ -1,14 +1,15 @@
package rp_model_impl
import (
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/report/rp_writer"
- "github.com/watermint/toolbox/infra/report/rp_writer_impl"
- "go.uber.org/atomic"
- "sync"
+ "sync"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/report/rp_writer"
+ "github.com/watermint/toolbox/infra/report/rp_writer_impl"
+ "go.uber.org/atomic"
)
func NewRowReport(name string) *RowReport {
diff --git a/infra/report/rp_model_impl/row_test.go b/infra/report/rp_model_impl/row_test.go
index 075678682..a00dfe0b0 100644
--- a/infra/report/rp_model_impl/row_test.go
+++ b/infra/report/rp_model_impl/row_test.go
@@ -40,9 +40,8 @@ func TestRowReport_Basic(t *testing.T) {
report.Close() // Should not panic
}
-
// Test model for testing
type TestModel struct {
Name string `json:"name"`
Value int `json:"value"`
-}
\ No newline at end of file
+}
diff --git a/infra/report/rp_model_impl/spec.go b/infra/report/rp_model_impl/spec.go
index 851601076..14afec0f3 100644
--- a/infra/report/rp_model_impl/spec.go
+++ b/infra/report/rp_model_impl/spec.go
@@ -1,7 +1,7 @@
package rp_model_impl
import (
- "github.com/watermint/toolbox/essentials/go/es_reflect"
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/infra/doc/dc_recipe"
"github.com/watermint/toolbox/infra/report/rp_column_impl"
diff --git a/infra/report/rp_model_impl/spec_test.go b/infra/report/rp_model_impl/spec_test.go
index 83be63c9a..99c9a4047 100644
--- a/infra/report/rp_model_impl/spec_test.go
+++ b/infra/report/rp_model_impl/spec_test.go
@@ -11,34 +11,34 @@ func TestNewSpec(t *testing.T) {
// Test with simple model
model := &TestModel{Name: "test", Value: 123}
spec := newSpec("test-spec", model, nil)
-
+
if spec.Name() != "test-spec" {
t.Error("Expected spec name to be 'test-spec'")
}
-
+
if spec.Model() != model {
t.Error("Expected spec model to match input model")
}
-
+
// Test columns
cols := spec.Columns()
if len(cols) == 0 {
t.Error("Expected spec to have columns")
}
-
+
// Test with TransactionRow model
txRow := &rp_model.TransactionRow{
Input: &TestModel{Name: "input", Value: 1},
Result: &TestModel{Name: "result", Value: 2},
}
txSpec := newSpec("tx-spec", txRow, nil)
-
+
txCols := txSpec.Columns()
// Should have status, reason, and columns from input/result
if len(txCols) < 2 {
t.Error("Expected transaction spec to have at least status and reason columns")
}
-
+
// Check that status and reason are in columns
hasStatus := false
hasReason := false
@@ -67,41 +67,41 @@ func TestColumnSpec_Methods(t *testing.T) {
"col2": app_msg.Raw("Column 2"),
},
}
-
+
// Test Name
if spec.Name() != "col-spec" {
t.Error("Expected name to be 'col-spec'")
}
-
+
// Test Model
if spec.Model() != model {
t.Error("Expected model to match")
}
-
+
// Test Columns
cols := spec.Columns()
if len(cols) != 2 {
t.Error("Expected 2 columns")
}
-
+
// Test ColumnDesc
desc1 := spec.ColumnDesc("col1")
if desc1 == nil {
t.Error("Expected column description for col1")
}
-
+
// Test ColumnDesc for unknown column
descUnknown := spec.ColumnDesc("unknown")
if descUnknown == nil {
t.Error("Expected raw message for unknown column")
}
-
+
// Test Options
opts := spec.Options()
if len(opts) != 0 {
t.Error("Expected empty options")
}
-
+
// Test Desc
desc := spec.Desc()
if desc == nil {
@@ -115,20 +115,20 @@ func TestColumnSpec_NilModel(t *testing.T) {
name: "nil-spec",
model: nil,
}
-
+
defer func() {
if r := recover(); r == nil {
t.Error("Expected panic for nil model")
}
}()
-
+
// This should panic
_ = spec.Desc()
}
func TestSpec_WithReportOpts(t *testing.T) {
model := &TestModel{Name: "test", Value: 789}
-
+
// Test with hidden columns
opts := []rp_model.ReportOpt{
func(o *rp_model.ReportOpts) *rp_model.ReportOpts {
@@ -139,12 +139,11 @@ func TestSpec_WithReportOpts(t *testing.T) {
return o
},
}
-
+
spec := newSpec("opts-spec", model, opts)
-
+
// Options should be preserved
if len(spec.Options()) != 1 {
t.Error("Expected options to be preserved")
}
}
-
diff --git a/infra/report/rp_model_impl/transaction.go b/infra/report/rp_model_impl/transaction.go
index 3290e3d21..2f64389d5 100644
--- a/infra/report/rp_model_impl/transaction.go
+++ b/infra/report/rp_model_impl/transaction.go
@@ -1,16 +1,17 @@
package rp_model_impl
import (
- "github.com/watermint/toolbox/domain/dropbox/api/dbx_error"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/report/rp_writer"
- "github.com/watermint/toolbox/infra/report/rp_writer_impl"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "go.uber.org/atomic"
- "sync"
+ "sync"
+
+ "github.com/watermint/toolbox/domain/dropbox/api/dbx_error"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/report/rp_writer"
+ "github.com/watermint/toolbox/infra/report/rp_writer_impl"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "go.uber.org/atomic"
)
func NewTransactionReport(name string) *TransactionReport {
diff --git a/infra/report/rp_model_impl/transaction_test.go b/infra/report/rp_model_impl/transaction_test.go
index 521063637..d522d1371 100644
--- a/infra/report/rp_model_impl/transaction_test.go
+++ b/infra/report/rp_model_impl/transaction_test.go
@@ -25,7 +25,7 @@ func TestTransactionReport_Basic(t *testing.T) {
input := &TestModel{Name: "input", Value: 1}
result := &TestModel{Name: "result", Value: 2}
report.SetModel(input, result)
-
+
// Test that model was set
if report.model == nil {
t.Error("Expected model to be set after SetModel")
@@ -35,10 +35,10 @@ func TestTransactionReport_Basic(t *testing.T) {
func TestTransactionReport_Spec(t *testing.T) {
// Test NewTransactionReport
report := NewTransactionReport("spec-test")
-
+
// Set model first
report.SetModel(&TestModel{}, &TestModel{})
-
+
// Test Spec
spec := report.Spec()
if spec.Name() != "spec-test" {
@@ -48,13 +48,12 @@ func TestTransactionReport_Spec(t *testing.T) {
func TestTransactionReport_SetCtl(t *testing.T) {
report := NewTransactionReport("setctl-test")
-
+
// Test that ctl is initially nil
if report.ctl != nil {
t.Error("Expected initial ctl to be nil")
}
-
+
// Test Close without opening
report.Close() // Should not panic
}
-
diff --git a/infra/report/rp_test/doc.go b/infra/report/rp_test/doc.go
new file mode 100644
index 000000000..6e5791780
--- /dev/null
+++ b/infra/report/rp_test/doc.go
@@ -0,0 +1,2 @@
+// Package rp_test contains test utilities for reports.
+package rp_test
diff --git a/infra/report/rp_test/mock_test.go b/infra/report/rp_test/mock_test.go
index 0bbb718ad..16a44c499 100644
--- a/infra/report/rp_test/mock_test.go
+++ b/infra/report/rp_test/mock_test.go
@@ -1,10 +1,11 @@
-package rp
+package rp_test
import (
+ "testing"
+
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/report/rp_writer_impl"
"github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
- "testing"
)
func TestMock(t *testing.T) {
diff --git a/infra/report/rp_test/small_cache_test.go b/infra/report/rp_test/small_cache_test.go
index 36b2be55c..864efc837 100644
--- a/infra/report/rp_test/small_cache_test.go
+++ b/infra/report/rp_test/small_cache_test.go
@@ -1,11 +1,12 @@
-package rp
+package rp_test
import (
+ "testing"
+
"github.com/google/go-cmp/cmp"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/report/rp_writer_impl"
"github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
- "testing"
)
func TestNewSmallCache(t *testing.T) {
diff --git a/infra/report/rp_test/xlsx_test.go b/infra/report/rp_test/xlsx_test.go
index 8cb1550e3..c8822781e 100644
--- a/infra/report/rp_test/xlsx_test.go
+++ b/infra/report/rp_test/xlsx_test.go
@@ -1,14 +1,15 @@
package rp_test
import (
- "fmt"
- "github.com/tealeg/xlsx"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/report/rp_writer_impl"
- "github.com/watermint/toolbox/quality/infra/qt_endtoend"
- "github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
- "path/filepath"
- "testing"
+ "fmt"
+ "path/filepath"
+ "testing"
+
+ "github.com/tealeg/xlsx"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/report/rp_writer_impl"
+ "github.com/watermint/toolbox/quality/infra/qt_endtoend"
+ "github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
)
func TestXlsx_Rotate(t *testing.T) {
diff --git a/infra/report/rp_writer/doc.go b/infra/report/rp_writer/doc.go
new file mode 100644
index 000000000..e3007dcad
--- /dev/null
+++ b/infra/report/rp_writer/doc.go
@@ -0,0 +1,2 @@
+// Package rp_writer defines an interface for a report writer.
+package rp_writer
diff --git a/infra/report/rp_writer_impl/csv.go b/infra/report/rp_writer_impl/csv.go
index ba5c88995..4d49abf56 100644
--- a/infra/report/rp_writer_impl/csv.go
+++ b/infra/report/rp_writer_impl/csv.go
@@ -1,16 +1,17 @@
package rp_writer_impl
import (
- "encoding/csv"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/report/rp_column"
- "github.com/watermint/toolbox/infra/report/rp_column_impl"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/report/rp_writer"
- "os"
- "path/filepath"
- "sync"
+ "encoding/csv"
+ "os"
+ "path/filepath"
+ "sync"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/report/rp_column"
+ "github.com/watermint/toolbox/infra/report/rp_column_impl"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/report/rp_writer"
)
func NewCsvWriter(name string, ctl app_control.Control) rp_writer.Writer {
diff --git a/infra/report/rp_writer_impl/csv_unit_test.go b/infra/report/rp_writer_impl/csv_unit_test.go
index 5aad0d7f5..5d722b7ec 100644
--- a/infra/report/rp_writer_impl/csv_unit_test.go
+++ b/infra/report/rp_writer_impl/csv_unit_test.go
@@ -8,7 +8,7 @@ func TestCsvWriter_Name_Unit(t *testing.T) {
w := &csvWriter{
name: "csv_report",
}
-
+
if w.Name() != "csv_report" {
t.Errorf("Expected name 'csv_report', got '%s'", w.Name())
}
@@ -20,8 +20,8 @@ func TestNewCsvWriter(t *testing.T) {
w := &csvWriter{
name: "test",
}
-
+
if w.Name() != "test" {
t.Error("Expected name to be set")
}
-}
\ No newline at end of file
+}
diff --git a/infra/report/rp_writer_impl/doc.go b/infra/report/rp_writer_impl/doc.go
new file mode 100644
index 000000000..012c56983
--- /dev/null
+++ b/infra/report/rp_writer_impl/doc.go
@@ -0,0 +1,2 @@
+// Package rp_writer_impl provides concrete implementations for `rp_writer.Writer`.
+package rp_writer_impl
diff --git a/infra/report/rp_writer_impl/factory_unit_test.go b/infra/report/rp_writer_impl/factory_unit_test.go
index bec7f6989..9d13b1777 100644
--- a/infra/report/rp_writer_impl/factory_unit_test.go
+++ b/infra/report/rp_writer_impl/factory_unit_test.go
@@ -7,7 +7,7 @@ import (
func TestNew_ReturnsWriter(t *testing.T) {
// We can't test this fully without a control, but we can test
// that the functions exist and are callable
-
+
// Test that NewCascade is callable (would panic if not)
defer func() {
if r := recover(); r != nil {
@@ -15,7 +15,7 @@ func TestNew_ReturnsWriter(t *testing.T) {
t.Log("NewCascade panicked as expected with nil control")
}
}()
-
+
// This will panic, but that's ok - we're just testing it exists
_ = NewCascade("test", nil)
}
@@ -23,13 +23,13 @@ func TestNew_ReturnsWriter(t *testing.T) {
func TestSmallCache_Exists(t *testing.T) {
// Just verify the NewSmallCache function exists
// We can't test it without a real writer
-
+
defer func() {
if r := recover(); r != nil {
// Expected
t.Log("NewSmallCache panicked as expected with nil writer")
}
}()
-
+
_ = NewSmallCache("test", nil)
-}
\ No newline at end of file
+}
diff --git a/infra/report/rp_writer_impl/json.go b/infra/report/rp_writer_impl/json.go
index bde5bf9f4..df523cc45 100644
--- a/infra/report/rp_writer_impl/json.go
+++ b/infra/report/rp_writer_impl/json.go
@@ -1,20 +1,21 @@
package rp_writer_impl
import (
- "bytes"
- "encoding/json"
- "github.com/itchyny/gojq"
- "github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/io/es_stdout"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/report/rp_writer"
- "io"
- "os"
- "path/filepath"
- "reflect"
- "sync"
+ "bytes"
+ "encoding/json"
+ "io"
+ "os"
+ "path/filepath"
+ "reflect"
+ "sync"
+
+ "github.com/itchyny/gojq"
+ "github.com/watermint/toolbox/essentials/encoding/es_json"
+ "github.com/watermint/toolbox/essentials/io/es_stdout"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/report/rp_writer"
)
var (
diff --git a/infra/report/rp_writer_impl/json_unit_test.go b/infra/report/rp_writer_impl/json_unit_test.go
index 4737cd0b0..313e37e3b 100644
--- a/infra/report/rp_writer_impl/json_unit_test.go
+++ b/infra/report/rp_writer_impl/json_unit_test.go
@@ -9,18 +9,18 @@ import (
func TestJsonWriter_findRaw_Unit(t *testing.T) {
// Test the findRaw method directly without needing a full control
w := &jsonWriter{}
-
+
// Test with struct containing Raw field
type WithRaw struct {
Name string
Raw json.RawMessage
}
-
+
testData := &WithRaw{
Name: "test",
Raw: json.RawMessage(`{"custom":"data"}`),
}
-
+
raw := w.findRaw(testData)
if raw == nil {
t.Error("Expected to find Raw field")
@@ -28,38 +28,38 @@ func TestJsonWriter_findRaw_Unit(t *testing.T) {
if string(raw) != `{"custom":"data"}` {
t.Errorf("Expected raw data to match, got: %s", string(raw))
}
-
+
// Test with struct without Raw field
type WithoutRaw struct {
Name string
Value int
}
-
+
testData2 := &WithoutRaw{Name: "test", Value: 42}
raw2 := w.findRaw(testData2)
if raw2 != nil {
t.Error("Expected nil for struct without Raw field")
}
-
+
// Test with wrong Raw type
type WrongRaw struct {
Name string
Raw string // Wrong type
}
-
+
testData3 := &WrongRaw{Name: "test", Raw: "not json.RawMessage"}
raw3 := w.findRaw(testData3)
if raw3 != nil {
t.Error("Expected nil for wrong Raw type")
}
-
+
// Test with reflect.Value input
rv := reflect.ValueOf(testData).Elem()
raw4 := w.findRaw(rv)
if raw4 == nil {
t.Error("Expected to find Raw field from reflect.Value")
}
-
+
// Test with nil Raw
testData5 := &WithRaw{
Name: "test",
@@ -75,7 +75,7 @@ func TestJsonWriter_Name_Unit(t *testing.T) {
w := &jsonWriter{
name: "test_report",
}
-
+
if w.Name() != "test_report" {
t.Errorf("Expected name 'test_report', got '%s'", w.Name())
}
@@ -89,12 +89,12 @@ func TestFilterQueryLogFlags(t *testing.T) {
if filterQueryLogErrorExposed {
t.Log("filterQueryLogErrorExposed is true")
}
-
+
// These are just for coverage - they start as false
filterQueryLogEnabledExposed = true
filterQueryLogErrorExposed = true
-
+
// Reset
filterQueryLogEnabledExposed = false
filterQueryLogErrorExposed = false
-}
\ No newline at end of file
+}
diff --git a/infra/report/rp_writer_impl/mock.go b/infra/report/rp_writer_impl/mock.go
index 8cf3171a6..db9adf1e7 100644
--- a/infra/report/rp_writer_impl/mock.go
+++ b/infra/report/rp_writer_impl/mock.go
@@ -1,11 +1,12 @@
package rp_writer_impl
import (
- "errors"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "sync"
+ "errors"
+ "sync"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/report/rp_model"
)
var (
diff --git a/infra/report/rp_writer_impl/mock_unit_test.go b/infra/report/rp_writer_impl/mock_unit_test.go
index adf1ec2de..920573664 100644
--- a/infra/report/rp_writer_impl/mock_unit_test.go
+++ b/infra/report/rp_writer_impl/mock_unit_test.go
@@ -9,15 +9,15 @@ func TestNewMock(t *testing.T) {
if m == nil {
t.Fatal("Expected non-nil mock")
}
-
+
if len(m.records) != 0 {
t.Error("Expected empty records")
}
-
+
if m.isClosed {
t.Error("Expected not closed initially")
}
-
+
if m.isOpened {
t.Error("Expected not opened initially")
}
@@ -35,7 +35,7 @@ func TestMock_IsOpened(t *testing.T) {
if m.IsOpened() {
t.Error("Expected not opened initially")
}
-
+
// Simulate opening
m.isOpened = true
if !m.IsOpened() {
@@ -48,7 +48,7 @@ func TestMock_IsClosed(t *testing.T) {
if m.IsClosed() {
t.Error("Expected not closed initially")
}
-
+
// Close it
m.Close()
if !m.IsClosed() {
@@ -62,7 +62,7 @@ func TestMock_Records(t *testing.T) {
if len(records) != 0 {
t.Error("Expected no records initially")
}
-
+
// Add some records directly
m.records = append(m.records, "test1", "test2")
records = m.Records()
@@ -73,7 +73,7 @@ func TestMock_Records(t *testing.T) {
func TestMock_Row(t *testing.T) {
m := NewMock()
-
+
// Test panic when not opened
defer func() {
if r := recover(); r == nil {
@@ -82,28 +82,28 @@ func TestMock_Row(t *testing.T) {
t.Error("Expected ErrorMockTheWriterIsNotReady")
}
}()
-
+
m.Row("test")
}
func TestMock_Row_AfterOpen(t *testing.T) {
m := NewMock()
-
+
// Open the mock
err := m.Open(nil, nil)
if err != nil {
t.Error("Expected no error on open")
}
-
+
// Write some rows
m.Row(&MockRecord{SKU: "ABC123", Quantity: 10})
m.Row(&MockRecord{SKU: "DEF456", Quantity: 20})
-
+
records := m.Records()
if len(records) != 2 {
t.Fatalf("Expected 2 records, got %d", len(records))
}
-
+
// Verify first record
if rec1, ok := records[0].(*MockRecord); ok {
if rec1.SKU != "ABC123" || rec1.Quantity != 10 {
@@ -112,27 +112,27 @@ func TestMock_Row_AfterOpen(t *testing.T) {
} else {
t.Error("Expected first record to be MockRecord")
}
-
+
// Close and try to write - should panic
m.Close()
-
+
defer func() {
if r := recover(); r == nil {
t.Error("Expected panic when writing to closed mock")
}
}()
-
+
m.Row(&MockRecord{SKU: "GHI789", Quantity: 30})
}
func TestMock_Open(t *testing.T) {
m := NewMock()
-
+
err := m.Open(nil, nil)
if err != nil {
t.Error("Expected no error on open")
}
-
+
if !m.isOpened {
t.Error("Expected isOpened to be true after Open")
}
@@ -140,7 +140,7 @@ func TestMock_Open(t *testing.T) {
func TestMock_Close(t *testing.T) {
m := NewMock()
-
+
m.Close()
if !m.isClosed {
t.Error("Expected isClosed to be true after Close")
@@ -150,7 +150,7 @@ func TestMock_Close(t *testing.T) {
func TestMock_ConcurrentWrites(t *testing.T) {
m := NewMock()
m.Open(nil, nil)
-
+
// Test concurrent writes
done := make(chan bool, 10)
for i := 0; i < 10; i++ {
@@ -162,14 +162,14 @@ func TestMock_ConcurrentWrites(t *testing.T) {
done <- true
}(i)
}
-
+
// Wait for all writes
for i := 0; i < 10; i++ {
<-done
}
-
+
records := m.Records()
if len(records) != 10 {
t.Errorf("Expected 10 records from concurrent writes, got %d", len(records))
}
-}
\ No newline at end of file
+}
diff --git a/infra/report/rp_writer_impl/small_cache.go b/infra/report/rp_writer_impl/small_cache.go
index 9a85d4bdb..b3c00f222 100644
--- a/infra/report/rp_writer_impl/small_cache.go
+++ b/infra/report/rp_writer_impl/small_cache.go
@@ -1,10 +1,11 @@
package rp_writer_impl
import (
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/report/rp_writer"
- "sync"
+ "sync"
+
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/report/rp_writer"
)
const (
diff --git a/infra/report/rp_writer_impl/sorted.go b/infra/report/rp_writer_impl/sorted.go
index 7a732ebe2..4893351cb 100644
--- a/infra/report/rp_writer_impl/sorted.go
+++ b/infra/report/rp_writer_impl/sorted.go
@@ -1,20 +1,21 @@
package rp_writer_impl
import (
- "bufio"
- "encoding/json"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/text/es_sort"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/report/rp_column"
- "github.com/watermint/toolbox/infra/report/rp_column_impl"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/report/rp_writer"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "os"
- "path/filepath"
- "sync"
+ "bufio"
+ "encoding/json"
+ "os"
+ "path/filepath"
+ "sync"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/text/es_sort"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/report/rp_column"
+ "github.com/watermint/toolbox/infra/report/rp_column_impl"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/report/rp_writer"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
type MsgSortedWriter struct {
diff --git a/infra/report/rp_writer_impl/ui.go b/infra/report/rp_writer_impl/ui.go
index 1146b2bc4..7d5c2aa30 100644
--- a/infra/report/rp_writer_impl/ui.go
+++ b/infra/report/rp_writer_impl/ui.go
@@ -1,14 +1,15 @@
package rp_writer_impl
import (
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/report/rp_column"
- "github.com/watermint/toolbox/infra/report/rp_column_impl"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/report/rp_writer"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_ui"
- "sync"
+ "sync"
+
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/report/rp_column"
+ "github.com/watermint/toolbox/infra/report/rp_column_impl"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/report/rp_writer"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_ui"
)
type MsgUIWriter struct {
diff --git a/infra/report/rp_writer_impl/xlsx.go b/infra/report/rp_writer_impl/xlsx.go
index 0d3148dd2..04818e57f 100644
--- a/infra/report/rp_writer_impl/xlsx.go
+++ b/infra/report/rp_writer_impl/xlsx.go
@@ -1,18 +1,19 @@
package rp_writer_impl
import (
- "fmt"
- "github.com/tealeg/xlsx"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/report/rp_column"
- "github.com/watermint/toolbox/infra/report/rp_column_impl"
- "github.com/watermint/toolbox/infra/report/rp_model"
- "github.com/watermint/toolbox/infra/report/rp_writer"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "path/filepath"
- "sync"
- "time"
+ "fmt"
+ "path/filepath"
+ "sync"
+ "time"
+
+ "github.com/tealeg/xlsx"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_control"
+ "github.com/watermint/toolbox/infra/report/rp_column"
+ "github.com/watermint/toolbox/infra/report/rp_column_impl"
+ "github.com/watermint/toolbox/infra/report/rp_model"
+ "github.com/watermint/toolbox/infra/report/rp_writer"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
)
const (
diff --git a/infra/security/doc.go b/infra/security/doc.go
new file mode 100644
index 000000000..d23aafec6
--- /dev/null
+++ b/infra/security/doc.go
@@ -0,0 +1,2 @@
+// Package security provides essential functionalities for security-related operations.
+package security
diff --git a/infra/security/sc_obfuscate/doc.go b/infra/security/sc_obfuscate/doc.go
new file mode 100644
index 000000000..1ea2ee812
--- /dev/null
+++ b/infra/security/sc_obfuscate/doc.go
@@ -0,0 +1,2 @@
+// Package sc_obfuscate provides functions for obfuscating and deobfuscating data using AES-GCM encryption.
+package sc_obfuscate
diff --git a/infra/security/sc_random/doc.go b/infra/security/sc_random/doc.go
new file mode 100644
index 000000000..d4123e707
--- /dev/null
+++ b/infra/security/sc_random/doc.go
@@ -0,0 +1,2 @@
+// Package sc_random provides functions for generating secure random strings and pseudo-random strings.
+package sc_random
diff --git a/infra/security/sc_storage/doc.go b/infra/security/sc_storage/doc.go
new file mode 100644
index 000000000..07cec89b7
--- /dev/null
+++ b/infra/security/sc_storage/doc.go
@@ -0,0 +1,2 @@
+// Package sc_storage provides a secure storage mechanism for application data.
+package sc_storage
diff --git a/infra/security/sc_storage_test/doc.go b/infra/security/sc_storage_test/doc.go
new file mode 100644
index 000000000..7df615746
--- /dev/null
+++ b/infra/security/sc_storage_test/doc.go
@@ -0,0 +1,2 @@
+// Package sc_storage_test contains tests for the `sc_storage` package.
+package sc_storage_test
diff --git a/infra/security/sc_storage_test/storage_test.go b/infra/security/sc_storage_test/storage_test.go
index 0a8434f62..914586362 100644
--- a/infra/security/sc_storage_test/storage_test.go
+++ b/infra/security/sc_storage_test/storage_test.go
@@ -1,13 +1,14 @@
-package sc_obfuscate_test
+package sc_storage_test
import (
+ "os"
+ "path/filepath"
+ "testing"
+
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/security/sc_storage"
"github.com/watermint/toolbox/quality/infra/qt_file"
"github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
- "os"
- "path/filepath"
- "testing"
)
func TestStorageImpl_PutGet(t *testing.T) {
diff --git a/infra/security/sc_token/doc.go b/infra/security/sc_token/doc.go
new file mode 100644
index 000000000..83060cf21
--- /dev/null
+++ b/infra/security/sc_token/doc.go
@@ -0,0 +1,2 @@
+// Package sc_token provides a secure storage mechanism for OAuth2 tokens.
+package sc_token
diff --git a/infra/security/sc_token_test/doc.go b/infra/security/sc_token_test/doc.go
new file mode 100644
index 000000000..f998af0b9
--- /dev/null
+++ b/infra/security/sc_token_test/doc.go
@@ -0,0 +1,2 @@
+// Package sc_token_test contains tests for the `sc_token` package.
+package sc_token_test
diff --git a/infra/security/sc_zap/doc.go b/infra/security/sc_zap/doc.go
new file mode 100644
index 000000000..9d251be90
--- /dev/null
+++ b/infra/security/sc_zap/doc.go
@@ -0,0 +1,2 @@
+// Package sc_zap provides functionalities for obfuscating and deobfuscating application keys.
+package sc_zap
diff --git a/infra/security/sc_zap_tool/doc.go b/infra/security/sc_zap_tool/doc.go
new file mode 100644
index 000000000..bf7add798
--- /dev/null
+++ b/infra/security/sc_zap_tool/doc.go
@@ -0,0 +1,2 @@
+// Package sc_zap_tool provides a command-line tool for zapping (obfuscating) application keys.
+package sc_zap_tool
diff --git a/infra/security/sc_zap_tool/main.go b/infra/security/sc_zap_tool/main.go
index 3ca97d7ed..eb268a548 100644
--- a/infra/security/sc_zap_tool/main.go
+++ b/infra/security/sc_zap_tool/main.go
@@ -1,4 +1,4 @@
-package main
+package sc_zap_tool
import (
"crypto/sha256"
diff --git a/infra/ui/app_msg/doc.go b/infra/ui/app_msg/doc.go
new file mode 100644
index 000000000..aaced421a
--- /dev/null
+++ b/infra/ui/app_msg/doc.go
@@ -0,0 +1,2 @@
+// Package app_msg defines interfaces and implementations for application messages.
+package app_msg
diff --git a/infra/ui/app_msg/obj.go b/infra/ui/app_msg/obj.go
index 0d845236c..17bc2cfff 100644
--- a/infra/ui/app_msg/obj.go
+++ b/infra/ui/app_msg/obj.go
@@ -1,11 +1,12 @@
package app_msg
import (
- "github.com/watermint/toolbox/essentials/go/es_reflect"
- "github.com/watermint/toolbox/essentials/strings/es_case"
- "github.com/watermint/toolbox/infra/control/app_definitions"
- "reflect"
- "strings"
+ "reflect"
+ "strings"
+
+ "github.com/watermint/toolbox/essentials/es_go/es_reflect"
+ "github.com/watermint/toolbox/essentials/strings/es_case"
+ "github.com/watermint/toolbox/infra/control/app_definitions"
)
func applyReflect(mot reflect.Type, mov reflect.Value) {
diff --git a/infra/ui/app_msg_container/container.go b/infra/ui/app_msg_container/container.go
index 02849690d..bb56be741 100644
--- a/infra/ui/app_msg_container/container.go
+++ b/infra/ui/app_msg_container/container.go
@@ -1,7 +1,7 @@
package app_msg_container
import (
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/infra/ui/app_msg"
)
diff --git a/infra/ui/app_msg_container/doc.go b/infra/ui/app_msg_container/doc.go
new file mode 100644
index 000000000..0fda2913a
--- /dev/null
+++ b/infra/ui/app_msg_container/doc.go
@@ -0,0 +1,2 @@
+// Package app_msg_container defines an interface for a message container.
+package app_msg_container
diff --git a/infra/ui/app_msg_container_impl/alt.go b/infra/ui/app_msg_container_impl/alt.go
index 4fa1250cd..01481f492 100644
--- a/infra/ui/app_msg_container_impl/alt.go
+++ b/infra/ui/app_msg_container_impl/alt.go
@@ -1,10 +1,11 @@
package app_msg_container_impl
import (
- "encoding/json"
- "fmt"
- "github.com/watermint/toolbox/essentials/go/es_lang"
- "github.com/watermint/toolbox/infra/ui/app_msg"
+ "encoding/json"
+ "fmt"
+
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
)
type Alt struct {
diff --git a/infra/ui/app_msg_container_impl/alt_test.go b/infra/ui/app_msg_container_impl/alt_test.go
index f55e3c0e5..287e913c4 100644
--- a/infra/ui/app_msg_container_impl/alt_test.go
+++ b/infra/ui/app_msg_container_impl/alt_test.go
@@ -1,8 +1,9 @@
package app_msg_container_impl
import (
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "testing"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/ui/app_msg"
)
func TestAltCompile(t *testing.T) {
diff --git a/infra/ui/app_msg_container_impl/container.go b/infra/ui/app_msg_container_impl/container.go
index e154a0822..77d1ea958 100644
--- a/infra/ui/app_msg_container_impl/container.go
+++ b/infra/ui/app_msg_container_impl/container.go
@@ -1,7 +1,7 @@
package app_msg_container_impl
import (
- lang2 "github.com/watermint/toolbox/essentials/go/es_lang"
+ lang2 "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/infra/ui/app_msg_container"
)
diff --git a/infra/ui/app_msg_container_impl/doc.go b/infra/ui/app_msg_container_impl/doc.go
new file mode 100644
index 000000000..e9d824d35
--- /dev/null
+++ b/infra/ui/app_msg_container_impl/doc.go
@@ -0,0 +1,2 @@
+// Package app_msg_container_impl provides concrete implementations for `app_msg_container.Container`.
+package app_msg_container_impl
diff --git a/infra/ui/app_msg_container_impl/multi.go b/infra/ui/app_msg_container_impl/multi.go
index fb2bcbe75..949678ea6 100644
--- a/infra/ui/app_msg_container_impl/multi.go
+++ b/infra/ui/app_msg_container_impl/multi.go
@@ -1,7 +1,9 @@
package app_msg_container_impl
import (
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "strings"
+
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/infra/ui/app_msg"
"github.com/watermint/toolbox/infra/ui/app_msg_container"
@@ -39,14 +41,25 @@ func (z mlContainer) Text(key string) string {
}
func (z *mlContainer) Exists(msg app_msg.Message) bool {
- for _, la := range z.priority {
- if c, ok := z.containers[la.Code()]; ok {
- if c.Exists(msg) {
- return true
+ switch m := msg.(type) {
+ case app_msg.MessageComplex:
+ for _, mm := range m.Messages() {
+ if !z.ExistsKey(mm.Key()) {
+ return false
+ }
+ }
+ return true
+
+ default:
+ for _, la := range z.priority {
+ if c, ok := z.containers[la.Code()]; ok {
+ if c.Exists(msg) {
+ return true
+ }
}
}
+ return false
}
- return false
}
func (z *mlContainer) ExistsKey(key string) bool {
@@ -60,21 +73,51 @@ func (z *mlContainer) ExistsKey(key string) bool {
return false
}
+func (z *mlContainer) compileComplex(messages []app_msg.Message) string {
+ compiled := make([]string, 0)
+ for _, msg := range messages {
+ compiled = append(compiled, z.Compile(msg))
+ }
+ return strings.Join(compiled, " ")
+}
+
func (z *mlContainer) Compile(m app_msg.Message) string {
l := esl.Default()
- for _, la := range z.priority {
- if c, ok := z.containers[la.Code()]; ok {
- if c.Exists(m) {
- qt_msgusage.Record().Touch(m.Key())
- return c.Compile(m)
+ key := m.Key()
+ switch m0 := m.(type) {
+ case app_msg.MessageComplex:
+ qt_msgusage.Record().Touch(key)
+ return z.compileComplex(m0.Messages())
+
+ case app_msg.MessageOptional:
+ for _, la := range z.priority {
+ if c, ok := z.containers[la.Code()]; ok {
+ if c.Exists(m) {
+ qt_msgusage.Record().Touch(key)
+ return c.Compile(m)
+ }
}
}
+ if m0.Optional() {
+ qt_msgusage.Record().Touch(key)
+ return ""
+ } else {
+ qt_msgusage.Record().NotFound(key)
+ l.Warn("Unable to find message resource", esl.String("key", key))
+ return AltCompile(m)
+ }
+
+ default:
+ for _, la := range z.priority {
+ if c, ok := z.containers[la.Code()]; ok {
+ if c.Exists(m) {
+ qt_msgusage.Record().Touch(key)
+ return c.Compile(m)
+ }
+ }
+ }
+ qt_msgusage.Record().NotFound(key)
+ l.Warn("Unable to find message resource", esl.String("key", key))
+ return AltCompile(m)
}
- if mo, ok := m.(app_msg.MessageOptional); ok && mo.Optional() {
- qt_msgusage.Record().Touch(m.Key())
- return ""
- }
- qt_msgusage.Record().NotFound(m.Key())
- l.Warn("Unable to find message resource", esl.String("key", m.Key()))
- return AltCompile(m)
}
diff --git a/infra/ui/app_msg_container_impl/multi_test.go b/infra/ui/app_msg_container_impl/multi_test.go
index 2e7903c40..82a2cb424 100644
--- a/infra/ui/app_msg_container_impl/multi_test.go
+++ b/infra/ui/app_msg_container_impl/multi_test.go
@@ -1,9 +1,10 @@
package app_msg_container_impl
import (
- "github.com/watermint/toolbox/essentials/go/es_lang"
- "github.com/watermint/toolbox/infra/ui/app_msg_container"
- "testing"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container"
)
func TestNewMultilingual(t *testing.T) {
diff --git a/infra/ui/app_msg_container_impl/single.go b/infra/ui/app_msg_container_impl/single.go
index 8163e3732..9eb9a8993 100644
--- a/infra/ui/app_msg_container_impl/single.go
+++ b/infra/ui/app_msg_container_impl/single.go
@@ -1,17 +1,18 @@
package app_msg_container_impl
import (
- "bytes"
- "encoding/json"
- "fmt"
- "github.com/watermint/toolbox/essentials/go/es_lang"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/control/app_resource"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_msg_container"
- "github.com/watermint/toolbox/quality/infra/qt_msgusage"
- "strings"
- "text/template"
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "strings"
+ "text/template"
+
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/control/app_resource"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container"
+ "github.com/watermint/toolbox/quality/infra/qt_msgusage"
)
// Load single language container
diff --git a/infra/ui/app_msg_container_impl/single_test.go b/infra/ui/app_msg_container_impl/single_test.go
index 2df162da6..ded42bfdc 100644
--- a/infra/ui/app_msg_container_impl/single_test.go
+++ b/infra/ui/app_msg_container_impl/single_test.go
@@ -1,8 +1,9 @@
package app_msg_container_impl
import (
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "testing"
+ "testing"
+
+ "github.com/watermint/toolbox/infra/ui/app_msg"
)
func TestSglContainer_Text(t *testing.T) {
diff --git a/infra/ui/app_template/doc.go b/infra/ui/app_template/doc.go
new file mode 100644
index 000000000..6870267ba
--- /dev/null
+++ b/infra/ui/app_template/doc.go
@@ -0,0 +1,2 @@
+// Package app_template defines an interface for a template engine.
+package app_template
diff --git a/infra/ui/app_template_impl/doc.go b/infra/ui/app_template_impl/doc.go
new file mode 100644
index 000000000..fa2ab60f9
--- /dev/null
+++ b/infra/ui/app_template_impl/doc.go
@@ -0,0 +1,2 @@
+// Package app_template_impl provides a development-oriented implementation of the `app_template.Template` interface.
+package app_template_impl
diff --git a/infra/ui/app_ui/console.go b/infra/ui/app_ui/console.go
index 3ba36348b..6f324822d 100644
--- a/infra/ui/app_ui/console.go
+++ b/infra/ui/app_ui/console.go
@@ -99,7 +99,7 @@ func (z conImpl) DefinitionList(definitions []Definition) {
for _, def := range definitions {
term := z.mc.Compile(def.Term)
desc := z.mc.Compile(def.Description)
-
+
// Display term in bold white
es_color.Boldfln(z.wr, "%s", term)
// Display description indented
diff --git a/infra/ui/app_ui/doc.go b/infra/ui/app_ui/doc.go
new file mode 100644
index 000000000..0d84ce75f
--- /dev/null
+++ b/infra/ui/app_ui/doc.go
@@ -0,0 +1,2 @@
+// Package app_ui defines interfaces for a user interface (UI).
+package app_ui
diff --git a/infra/ui/app_ui/join.go b/infra/ui/app_ui/join.go
index 9c4cd91e7..c6e798378 100644
--- a/infra/ui/app_ui/join.go
+++ b/infra/ui/app_ui/join.go
@@ -1,8 +1,9 @@
package app_ui
import (
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "strings"
+ "strings"
+
+ "github.com/watermint/toolbox/infra/ui/app_msg"
)
func Join(ui UI, messages ...app_msg.Message) app_msg.Message {
diff --git a/infra/ui/app_ui/join_test.go b/infra/ui/app_ui/join_test.go
index 0e4a78644..62a56453e 100644
--- a/infra/ui/app_ui/join_test.go
+++ b/infra/ui/app_ui/join_test.go
@@ -1,10 +1,11 @@
package app_ui
import (
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_msg_container_impl"
- "testing"
+ "testing"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container_impl"
)
func TestJoin(t *testing.T) {
diff --git a/infra/ui/app_ui/markdown.go b/infra/ui/app_ui/markdown.go
index a1e45ecca..99dfd4511 100644
--- a/infra/ui/app_ui/markdown.go
+++ b/infra/ui/app_ui/markdown.go
@@ -1,16 +1,17 @@
package app_ui
import (
- "bytes"
- "fmt"
- "github.com/watermint/toolbox/essentials/io/es_line"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/terminal/es_dialogue"
- "github.com/watermint/toolbox/infra/report/rp_artifact"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_msg_container"
- "io"
- "strings"
+ "bytes"
+ "fmt"
+ "io"
+ "strings"
+
+ "github.com/watermint/toolbox/essentials/io/es_line"
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/terminal/es_dialogue"
+ "github.com/watermint/toolbox/infra/report/rp_artifact"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container"
)
func MakeMarkdown(mc app_msg_container.Container, f func(ui UI)) string {
@@ -82,7 +83,7 @@ func (z mdImpl) DefinitionList(definitions []Definition) {
for _, def := range definitions {
term := z.mc.Compile(def.Term)
desc := z.mc.Compile(def.Description)
-
+
// Use markdown-style definition list format
_, _ = fmt.Fprintf(z.wr, "**%s**\n", term)
_, _ = fmt.Fprintf(z.wr, ": %s\n\n", desc)
diff --git a/infra/ui/app_ui/markdown_table.go b/infra/ui/app_ui/markdown_table.go
index 5648ea702..b5ea5ee62 100644
--- a/infra/ui/app_ui/markdown_table.go
+++ b/infra/ui/app_ui/markdown_table.go
@@ -1,13 +1,14 @@
package app_ui
import (
- "fmt"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/strings/es_width"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_msg_container"
- "io"
- "strings"
+ "fmt"
+ "io"
+ "strings"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/strings/es_width"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container"
)
func newMdTable(sy Syntax, wr io.Writer, mc app_msg_container.Container, name string) Table {
diff --git a/infra/ui/app_ui/plain.go b/infra/ui/app_ui/plain.go
index cc8ad7a65..1927c5115 100644
--- a/infra/ui/app_ui/plain.go
+++ b/infra/ui/app_ui/plain.go
@@ -1,16 +1,17 @@
package app_ui
import (
- "bytes"
- "fmt"
- "github.com/watermint/toolbox/essentials/log/esl"
- "github.com/watermint/toolbox/essentials/strings/es_width"
- "github.com/watermint/toolbox/essentials/terminal/es_dialogue"
- "github.com/watermint/toolbox/infra/report/rp_artifact"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_msg_container"
- "io"
- "strings"
+ "bytes"
+ "fmt"
+ "io"
+ "strings"
+
+ "github.com/watermint/toolbox/essentials/log/esl"
+ "github.com/watermint/toolbox/essentials/strings/es_width"
+ "github.com/watermint/toolbox/essentials/terminal/es_dialogue"
+ "github.com/watermint/toolbox/infra/report/rp_artifact"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container"
)
func MakeConsoleDemo(mc app_msg_container.Container, f func(ui UI)) string {
@@ -118,7 +119,7 @@ func (z plainImpl) DefinitionList(definitions []Definition) {
for _, def := range definitions {
term := z.mc.Compile(def.Term)
desc := z.mc.Compile(def.Description)
-
+
// Simple plain text format with indentation
_, _ = fmt.Fprintf(z.wr, "%s\n", term)
_, _ = fmt.Fprintf(z.wr, " %s\n\n", desc)
diff --git a/infra/ui/app_ui/progress.go b/infra/ui/app_ui/progress.go
index 88bf48c15..5ddfe181b 100644
--- a/infra/ui/app_ui/progress.go
+++ b/infra/ui/app_ui/progress.go
@@ -1,9 +1,10 @@
package app_ui
import (
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "sync"
- "time"
+ "sync"
+ "time"
+
+ "github.com/watermint/toolbox/infra/ui/app_msg"
)
const (
diff --git a/infra/ui/app_ui/ui.go b/infra/ui/app_ui/ui.go
index e48afd44d..be1f02015 100644
--- a/infra/ui/app_ui/ui.go
+++ b/infra/ui/app_ui/ui.go
@@ -1,11 +1,12 @@
package app_ui
import (
- "fmt"
- "github.com/watermint/toolbox/infra/report/rp_artifact"
- "github.com/watermint/toolbox/infra/ui/app_msg"
- "github.com/watermint/toolbox/infra/ui/app_msg_container"
- "go.uber.org/atomic"
+ "fmt"
+
+ "github.com/watermint/toolbox/infra/report/rp_artifact"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
+ "github.com/watermint/toolbox/infra/ui/app_msg_container"
+ "go.uber.org/atomic"
)
type Syntax interface {
diff --git a/infra/ui/app_ui/ui_test.go b/infra/ui/app_ui/ui_test.go
index 2d2ba356d..109750b14 100644
--- a/infra/ui/app_ui/ui_test.go
+++ b/infra/ui/app_ui/ui_test.go
@@ -15,7 +15,7 @@ func TestDefinitionList(t *testing.T) {
mc := app_msg_container_impl.NewSingleWithMessagesForTest(map[string]string{
"raw": "{{.Raw}}",
})
-
+
definitions := []Definition{
{
Term: app_msg.Raw("-path"),
@@ -36,7 +36,7 @@ func TestDefinitionList(t *testing.T) {
output := MakeMarkdown(mc, func(ui UI) {
ui.DefinitionList(definitions)
})
-
+
// Check that markdown format is correct
t.Logf("Markdown output:\n%s", output)
if !strings.Contains(output, "**-path**") {
@@ -54,7 +54,7 @@ func TestDefinitionList(t *testing.T) {
dg := es_dialogue.DenyAll()
ui := NewConsole(mc, lg, &buf, dg)
ui.DefinitionList(definitions)
-
+
output := buf.String()
t.Logf("Console output:\n%s", output)
if !strings.Contains(output, "-path") {
@@ -70,7 +70,7 @@ func TestDefinitionList(t *testing.T) {
output := MakeConsoleDemo(mc, func(ui UI) {
ui.DefinitionList(definitions)
})
-
+
t.Logf("Plain output:\n%s", output)
if !strings.Contains(output, "-path") {
t.Error("Expected term in plain output")
@@ -79,4 +79,4 @@ func TestDefinitionList(t *testing.T) {
t.Error("Expected indented description in plain output")
}
})
-}
\ No newline at end of file
+}
diff --git a/infra/ui/doc.go b/infra/ui/doc.go
new file mode 100644
index 000000000..573ed1083
--- /dev/null
+++ b/infra/ui/doc.go
@@ -0,0 +1,2 @@
+// Package ui provides essential functionalities for user interface interactions.
+package ui
diff --git a/infra/ui/ui_out/doc.go b/infra/ui/ui_out/doc.go
new file mode 100644
index 000000000..e0b9598bc
--- /dev/null
+++ b/infra/ui/ui_out/doc.go
@@ -0,0 +1,2 @@
+// Package ui_out provides functions for outputting text to the UI.
+package ui_out
diff --git a/ingredient/doc.go b/ingredient/doc.go
new file mode 100644
index 000000000..ed704ac0e
--- /dev/null
+++ b/ingredient/doc.go
@@ -0,0 +1,2 @@
+// Package ingredient provides various reusable components (ingredients) for recipes.
+package ingredient
diff --git a/ingredient/ig_bootstrap/doc.go b/ingredient/ig_bootstrap/doc.go
new file mode 100644
index 000000000..62883a17b
--- /dev/null
+++ b/ingredient/ig_bootstrap/doc.go
@@ -0,0 +1,2 @@
+// Package ig_bootstrap provides bootstrap functionalities for the application.
+package ig_bootstrap
diff --git a/ingredient/ig_dropbox/doc.go b/ingredient/ig_dropbox/doc.go
new file mode 100644
index 000000000..4b8594ae0
--- /dev/null
+++ b/ingredient/ig_dropbox/doc.go
@@ -0,0 +1,2 @@
+// Package ig_dropbox provides functionalities for interacting with Dropbox.
+package ig_dropbox
diff --git a/ingredient/ig_dropbox/ig_file/doc.go b/ingredient/ig_dropbox/ig_file/doc.go
new file mode 100644
index 000000000..0ee9caedb
--- /dev/null
+++ b/ingredient/ig_dropbox/ig_file/doc.go
@@ -0,0 +1,2 @@
+// Package ig_file provides functionalities for managing Dropbox files.
+package ig_file
diff --git a/ingredient/ig_dropbox/ig_team/doc.go b/ingredient/ig_dropbox/ig_team/doc.go
new file mode 100644
index 000000000..6c0e48af4
--- /dev/null
+++ b/ingredient/ig_dropbox/ig_team/doc.go
@@ -0,0 +1,2 @@
+// Package ig_team provides functionalities for managing Dropbox team-related operations.
+package ig_team
diff --git a/ingredient/ig_dropbox/ig_team/ig_namespace/doc.go b/ingredient/ig_dropbox/ig_team/ig_namespace/doc.go
new file mode 100644
index 000000000..538838879
--- /dev/null
+++ b/ingredient/ig_dropbox/ig_team/ig_namespace/doc.go
@@ -0,0 +1,2 @@
+// Package ig_namespace provides functionalities for listing and calculating sizes of files within Dropbox namespaces.
+package ig_namespace
diff --git a/ingredient/ig_dropbox/ig_team/ig_sharedlink/doc.go b/ingredient/ig_dropbox/ig_team/ig_sharedlink/doc.go
new file mode 100644
index 000000000..8750f08f3
--- /dev/null
+++ b/ingredient/ig_dropbox/ig_team/ig_sharedlink/doc.go
@@ -0,0 +1,2 @@
+// Package ig_sharedlink provides functionalities for updating Dropbox shared links.
+package ig_sharedlink
diff --git a/ingredient/ig_dropbox/ig_teamfolder/doc.go b/ingredient/ig_dropbox/ig_teamfolder/doc.go
new file mode 100644
index 000000000..961ccbd0f
--- /dev/null
+++ b/ingredient/ig_dropbox/ig_teamfolder/doc.go
@@ -0,0 +1,2 @@
+// Package ig_teamfolder provides functionalities for replicating Dropbox team folders between two teams.
+package ig_teamfolder
diff --git a/ingredient/ig_dropbox/ig_teamfolder/replication_comprehensive_test.go b/ingredient/ig_dropbox/ig_teamfolder/replication_comprehensive_test.go
index 66f51d849..c8a0004b7 100644
--- a/ingredient/ig_dropbox/ig_teamfolder/replication_comprehensive_test.go
+++ b/ingredient/ig_dropbox/ig_teamfolder/replication_comprehensive_test.go
@@ -17,7 +17,7 @@ func TestMirrorGroupNamePrefix(t *testing.T) {
func TestArchiveOnSuccess(t *testing.T) {
opts := &mirrorOpts{}
result := ArchiveOnSuccess()(opts)
-
+
if !result.archiveOnSuccess {
t.Error("Expected archiveOnSuccess to be true after applying ArchiveOnSuccess option")
}
@@ -26,7 +26,7 @@ func TestArchiveOnSuccess(t *testing.T) {
func TestSkipVerify(t *testing.T) {
opts := &mirrorOpts{}
result := SkipVerify()(opts)
-
+
if !result.skipVerify {
t.Error("Expected skipVerify to be true after applying SkipVerify option")
}
@@ -42,12 +42,12 @@ func TestMirrorPair(t *testing.T) {
TeamFolderId: "tf_456",
Name: "Test Folder Copy",
}
-
+
pair := &MirrorPair{
Src: src,
Dst: dst,
}
-
+
if pair.Src.TeamFolderId != "tf_123" {
t.Errorf("Expected Src TeamFolderId 'tf_123', got '%s'", pair.Src.TeamFolderId)
}
@@ -65,12 +65,12 @@ func TestNewScope(t *testing.T) {
},
Dst: nil,
}
-
+
scope := NewScope(pair)
if scope == nil {
t.Fatal("Expected non-nil scope")
}
-
+
// Test Pair() method
returnedPair := scope.Pair()
if returnedPair != pair {
@@ -98,11 +98,11 @@ func TestMarshalUnmarshalContext(t *testing.T) {
func TestReplication_PartialScope_Matching(t *testing.T) {
// Test the matching logic for partial scope
// This tests the internal matching function behavior
-
+
names := []string{"Marketing", "Sales", "Engineering"}
-
+
testCases := []struct {
- folderName string
+ folderName string
shouldMatch bool
}{
{"marketing", true},
@@ -116,7 +116,7 @@ func TestReplication_PartialScope_Matching(t *testing.T) {
{"HR", false},
{"", false},
}
-
+
// Test the matching logic
for _, tc := range testCases {
t.Run(tc.folderName, func(t *testing.T) {
@@ -128,7 +128,7 @@ func TestReplication_PartialScope_Matching(t *testing.T) {
break
}
}
-
+
if matches != tc.shouldMatch {
t.Errorf("Folder '%s' match result: expected %v, got %v", tc.folderName, tc.shouldMatch, matches)
}
@@ -141,7 +141,6 @@ func TestReplication_BasePath_Options(t *testing.T) {
t.Skip("BasePath test requires framework initialization")
}
-
func TestReplication_Exec_Validations(t *testing.T) {
// Skip this test as it requires proper framework initialization
t.Skip("Exec validation test requires framework initialization")
@@ -155,13 +154,13 @@ func TestScope_Interface(t *testing.T) {
Name: "Source Folder",
},
Dst: &mo_teamfolder.TeamFolder{
- TeamFolderId: "tf_dst",
+ TeamFolderId: "tf_dst",
Name: "Dest Folder",
},
}
-
+
scope := NewScope(pair)
-
+
// Test Pair method
returnedPair := scope.Pair()
if returnedPair.Src.TeamFolderId != "tf_src" {
@@ -175,11 +174,11 @@ func TestScope_Interface(t *testing.T) {
func TestMirrorOpts_MultipleOptions(t *testing.T) {
// Test applying multiple options
opts := &mirrorOpts{}
-
+
// Apply both options
opts = ArchiveOnSuccess()(opts)
opts = SkipVerify()(opts)
-
+
if !opts.archiveOnSuccess {
t.Error("Expected archiveOnSuccess to be true")
}
@@ -196,11 +195,11 @@ func TestReplication_EmptyTargetNames(t *testing.T) {
func TestReplication_CaseInsensitiveMatching(t *testing.T) {
// Test case-insensitive matching in PartialScope
targetNames := []string{"Marketing", "SALES", "engineering"}
-
+
// Test folder names that should match
testFolders := []string{
"marketing",
- "Marketing",
+ "Marketing",
"MARKETING",
"sales",
"Sales",
@@ -209,7 +208,7 @@ func TestReplication_CaseInsensitiveMatching(t *testing.T) {
"Engineering",
"ENGINEERING",
}
-
+
for _, folderName := range testFolders {
matched := false
fnl := strings.ToLower(folderName)
@@ -219,9 +218,9 @@ func TestReplication_CaseInsensitiveMatching(t *testing.T) {
break
}
}
-
+
if !matched {
t.Errorf("Folder name '%s' should have matched target names", folderName)
}
}
-}
\ No newline at end of file
+}
diff --git a/ingredient/ig_dropbox/ig_teamspace/doc.go b/ingredient/ig_dropbox/ig_teamspace/doc.go
new file mode 100644
index 000000000..a2132139c
--- /dev/null
+++ b/ingredient/ig_dropbox/ig_teamspace/doc.go
@@ -0,0 +1,2 @@
+// Package ig_teamspace provides functionalities for finding and creating Dropbox API clients for the root namespace of a team space.
+package ig_teamspace
diff --git a/ingredient/ig_job/doc.go b/ingredient/ig_job/doc.go
new file mode 100644
index 000000000..5a0021ac3
--- /dev/null
+++ b/ingredient/ig_job/doc.go
@@ -0,0 +1,2 @@
+// Package ig_job provides a recipe for deleting old job data.
+package ig_job
diff --git a/ingredient/ig_release/doc.go b/ingredient/ig_release/doc.go
new file mode 100644
index 000000000..1430bbb0c
--- /dev/null
+++ b/ingredient/ig_release/doc.go
@@ -0,0 +1,2 @@
+// Package ig_release provides functionalities for managing application releases.
+package ig_release
diff --git a/ingredient/ig_release/ig_homebrew/doc.go b/ingredient/ig_release/ig_homebrew/doc.go
new file mode 100644
index 000000000..a71e60484
--- /dev/null
+++ b/ingredient/ig_release/ig_homebrew/doc.go
@@ -0,0 +1,2 @@
+// Package ig_homebrew provides a recipe for generating and updating Homebrew formula files.
+package ig_homebrew
diff --git a/ingredient/ig_release/ig_homebrew/formula.go b/ingredient/ig_release/ig_homebrew/formula.go
index 8e6fd21d9..6848d08f8 100644
--- a/ingredient/ig_release/ig_homebrew/formula.go
+++ b/ingredient/ig_release/ig_homebrew/formula.go
@@ -6,8 +6,8 @@ import (
"github.com/watermint/toolbox/domain/github/api/gh_conn"
"github.com/watermint/toolbox/domain/github/model/mo_commit"
"github.com/watermint/toolbox/domain/github/service/sv_content"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/file/es_filehash"
- "github.com/watermint/toolbox/essentials/go/es_project"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/model/mo_path"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/quality/demo/doc.go b/quality/demo/doc.go
new file mode 100644
index 000000000..7a7aca2e0
--- /dev/null
+++ b/quality/demo/doc.go
@@ -0,0 +1,2 @@
+// Package demo provides various demo scenarios for testing and demonstration purposes.
+package demo
diff --git a/quality/demo/qdm_file/doc.go b/quality/demo/qdm_file/doc.go
new file mode 100644
index 000000000..79fde039c
--- /dev/null
+++ b/quality/demo/qdm_file/doc.go
@@ -0,0 +1,2 @@
+// Package qdm_file provides a `Scenario` struct and a function to create a test file system scenario.
+package qdm_file
diff --git a/quality/doc.go b/quality/doc.go
new file mode 100644
index 000000000..27a996b97
--- /dev/null
+++ b/quality/doc.go
@@ -0,0 +1,2 @@
+// Package quality provides quality assurance tools and tests for the application.
+package quality
diff --git a/quality/infra/doc.go b/quality/infra/doc.go
new file mode 100644
index 000000000..f9b019c5f
--- /dev/null
+++ b/quality/infra/doc.go
@@ -0,0 +1,2 @@
+// Package infra provides essential infrastructure components for the application.
+package infra
diff --git a/quality/infra/qt_control/doc.go b/quality/infra/qt_control/doc.go
new file mode 100644
index 000000000..b824c9b8e
--- /dev/null
+++ b/quality/infra/qt_control/doc.go
@@ -0,0 +1,2 @@
+// Package qt_control provides a utility function `WithControl` for creating a test `app_control.Control` instance.
+package qt_control
diff --git a/quality/infra/qt_endtoend/doc.go b/quality/infra/qt_endtoend/doc.go
new file mode 100644
index 000000000..3fa2a6d38
--- /dev/null
+++ b/quality/infra/qt_endtoend/doc.go
@@ -0,0 +1,2 @@
+// Package qt_endtoend provides a utility function `IsSkipEndToEndTest` to determine if end-to-end tests should be skipped.
+package qt_endtoend
diff --git a/quality/infra/qt_errors/doc.go b/quality/infra/qt_errors/doc.go
new file mode 100644
index 000000000..71c6bb2c6
--- /dev/null
+++ b/quality/infra/qt_errors/doc.go
@@ -0,0 +1,2 @@
+// Package qt_errors defines various marker errors for testing purposes and provides a utility function to resolve and handle these errors.
+package qt_errors
diff --git a/quality/infra/qt_file/doc.go b/quality/infra/qt_file/doc.go
new file mode 100644
index 000000000..ab90c2058
--- /dev/null
+++ b/quality/infra/qt_file/doc.go
@@ -0,0 +1,2 @@
+// Package qt_file provides utility functions for creating temporary files and folders for testing purposes.
+package qt_file
diff --git a/quality/infra/qt_messages/doc.go b/quality/infra/qt_messages/doc.go
new file mode 100644
index 000000000..f18858591
--- /dev/null
+++ b/quality/infra/qt_messages/doc.go
@@ -0,0 +1,2 @@
+// Package qt_messages provides utility functions for testing and suggesting missing message keys in the application's message resources.
+package qt_messages
diff --git a/quality/infra/qt_msgusage/doc.go b/quality/infra/qt_msgusage/doc.go
new file mode 100644
index 000000000..edecfb962
--- /dev/null
+++ b/quality/infra/qt_msgusage/doc.go
@@ -0,0 +1,2 @@
+// Package qt_msgusage provides a utility for tracking message key usage.
+package qt_msgusage
diff --git a/quality/infra/qt_replay/doc.go b/quality/infra/qt_replay/doc.go
new file mode 100644
index 000000000..ce701092c
--- /dev/null
+++ b/quality/infra/qt_replay/doc.go
@@ -0,0 +1,2 @@
+// Package qt_replay provides a utility function `LoadReplay` for loading network replay data from a file.
+package qt_replay
diff --git a/quality/infra/qt_replay/replay.go b/quality/infra/qt_replay/replay.go
index 2dd99248c..138273ea3 100644
--- a/quality/infra/qt_replay/replay.go
+++ b/quality/infra/qt_replay/replay.go
@@ -10,7 +10,7 @@ import (
"path/filepath"
"strings"
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/network/nw_replay"
)
diff --git a/quality/infra/qt_runtime/doc.go b/quality/infra/qt_runtime/doc.go
new file mode 100644
index 000000000..db127ee21
--- /dev/null
+++ b/quality/infra/qt_runtime/doc.go
@@ -0,0 +1,2 @@
+// Package qt_runtime provides a `Suite` function to perform runtime checks for the application.
+package qt_runtime
diff --git a/quality/infra/qt_secure/doc.go b/quality/infra/qt_secure/doc.go
new file mode 100644
index 000000000..0821f6a3b
--- /dev/null
+++ b/quality/infra/qt_secure/doc.go
@@ -0,0 +1,2 @@
+// Package qt_secure provides a utility function `IsSecureEndToEndTest` to determine if secure end-to-end test mode is enabled.
+package qt_secure
diff --git a/quality/recipe/doc.go b/quality/recipe/doc.go
new file mode 100644
index 000000000..ae61c363c
--- /dev/null
+++ b/quality/recipe/doc.go
@@ -0,0 +1,2 @@
+// Package recipe provides quality assurance utilities for recipes.
+package recipe
diff --git a/quality/recipe/qtr_endtoend/doc.go b/quality/recipe/qtr_endtoend/doc.go
new file mode 100644
index 000000000..5a8bba933
--- /dev/null
+++ b/quality/recipe/qtr_endtoend/doc.go
@@ -0,0 +1,2 @@
+// Package qtr_endtoend provides utility functions for writing end-to-end tests for recipes.
+package qtr_endtoend
diff --git a/quality/recipe/qtr_endtoend/endtoend.go b/quality/recipe/qtr_endtoend/endtoend.go
index 66fedec68..94f3a464e 100644
--- a/quality/recipe/qtr_endtoend/endtoend.go
+++ b/quality/recipe/qtr_endtoend/endtoend.go
@@ -80,13 +80,13 @@ func Resources() (ui app_ui.UI) {
func MustCreateControl() (ctl app_control.Control, jl app_job.Launcher) {
ui := Resources()
-
+
// Create a unique temporary directory for this test instance to avoid conflicts
tempDir, err := os.MkdirTemp("", "toolbox-test-*")
if err != nil {
panic(err)
}
-
+
// Use the temporary directory as the workspace home
wb, err := app_workspace.NewBundle(tempDir, app_budget.BudgetUnlimited, esl.ConsoleDefaultLevel(), false, false)
if err != nil {
@@ -124,7 +124,7 @@ func TestWithReplayDbxContext(t *testing.T, name string, twc func(ctx dbx_client
func BenchmarkWithControl(b *testing.B, twc func(ctl app_control.Control)) {
nw_ratelimit.SetTestMode(true)
ctl, jl := MustCreateControl()
-
+
// Register cleanup to remove temporary directory
b.Cleanup(func() {
jl.Down(nil, ctl)
@@ -140,7 +140,7 @@ func BenchmarkWithControl(b *testing.B, twc func(ctl app_control.Control)) {
func TestWithControl(t *testing.T, twc func(ctl app_control.Control)) {
nw_ratelimit.SetTestMode(true)
ctl, jl := MustCreateControl()
-
+
// Register cleanup to remove temporary directory
t.Cleanup(func() {
jl.Down(nil, ctl)
diff --git a/quality/recipe/qtr_options/doc.go b/quality/recipe/qtr_options/doc.go
new file mode 100644
index 000000000..ee10244f4
--- /dev/null
+++ b/quality/recipe/qtr_options/doc.go
@@ -0,0 +1,2 @@
+// Package qtr_options provides utility functions for verifying and touching `SelectString` options in recipes.
+package qtr_options
diff --git a/quality/recipe/qtr_options/verify.go b/quality/recipe/qtr_options/verify.go
index ca96d7399..4e8e4176c 100644
--- a/quality/recipe/qtr_options/verify.go
+++ b/quality/recipe/qtr_options/verify.go
@@ -26,11 +26,11 @@ type SelectStringOption struct {
func VerifySelectStringOptions(c app_control.Control) ([]SelectStringOption, error) {
l := c.Log()
cat := app_catalogue.Current()
-
+
var missingOptions []SelectStringOption
-
+
l.Info("Verifying SelectString option descriptions")
-
+
// Load messages file once
messages := make(map[string]string)
msgPath := filepath.Join("resources", "messages", "en", "messages.json")
@@ -41,41 +41,41 @@ func VerifySelectStringOptions(c app_control.Control) ([]SelectStringOption, err
l.Warn("Could not parse messages file", esl.Error(err))
}
}
-
+
// Check all recipes for SelectString fields
for _, r := range cat.Recipes() {
spec := rc_spec.New(r)
recipeName := spec.Name()
-
+
// Get all value names (field names)
for _, valueName := range spec.ValueNames() {
value := spec.Value(valueName)
if value == nil {
continue
}
-
+
// Check if this is a SelectString type
typeName, typeAttr := value.Spec()
-
- if typeName != "mo_string.SelectString" &&
- typeName != "github.com/watermint/toolbox/essentials/model/mo_string.selectStringInternal" &&
- typeName != "essentials.model.mo_string.select_string_internal" {
+
+ if typeName != "mo_string.SelectString" &&
+ typeName != "github.com/watermint/toolbox/essentials/model/mo_string.selectStringInternal" &&
+ typeName != "essentials.model.mo_string.select_string_internal" {
continue
}
-
+
// Extract options from type attributes
if attrMap, ok := typeAttr.(map[string]interface{}); ok {
if options, hasOptions := attrMap["options"]; hasOptions {
if optionsList, ok := options.([]string); ok && len(optionsList) > 0 {
fieldNameLow := es_case.ToLowerSnakeCase(valueName)
-
+
// Check each option for a description message
for _, option := range optionsList {
- optionKey := fmt.Sprintf("%s.flag.%s.options.%s",
- recipeName,
- fieldNameLow,
+ optionKey := fmt.Sprintf("%s.flag.%s.options.%s",
+ recipeName,
+ fieldNameLow,
es_case.ToLowerSnakeCase(option))
-
+
// Check if message exists
if _, exists := messages[optionKey]; !exists {
missingOptions = append(missingOptions, SelectStringOption{
@@ -91,52 +91,52 @@ func VerifySelectStringOptions(c app_control.Control) ([]SelectStringOption, err
}
}
}
-
+
// Sort by key for consistent output
sort.Slice(missingOptions, func(i, j int) bool {
return missingOptions[i].Key < missingOptions[j].Key
})
-
+
return missingOptions, nil
}
// TouchSelectStringOptions marks all SelectString option messages as used
func TouchSelectStringOptions(c app_control.Control, touchFunc func(string)) {
cat := app_catalogue.Current()
-
+
// Check all recipes for SelectString fields
for _, r := range cat.Recipes() {
spec := rc_spec.New(r)
recipeName := spec.Name()
-
+
// Get all value names (field names)
for _, valueName := range spec.ValueNames() {
value := spec.Value(valueName)
if value == nil {
continue
}
-
+
// Check if this is a SelectString type
typeName, typeAttr := value.Spec()
- if typeName != "mo_string.SelectString" &&
- typeName != "github.com/watermint/toolbox/essentials/model/mo_string.selectStringInternal" &&
- typeName != "essentials.model.mo_string.select_string_internal" {
+ if typeName != "mo_string.SelectString" &&
+ typeName != "github.com/watermint/toolbox/essentials/model/mo_string.selectStringInternal" &&
+ typeName != "essentials.model.mo_string.select_string_internal" {
continue
}
-
+
// Extract options from type attributes
if attrMap, ok := typeAttr.(map[string]interface{}); ok {
if options, hasOptions := attrMap["options"]; hasOptions {
if optionsList, ok := options.([]string); ok && len(optionsList) > 0 {
fieldNameLow := es_case.ToLowerSnakeCase(valueName)
-
+
// Touch each option message to mark it as used
for _, option := range optionsList {
- optionKey := fmt.Sprintf("%s.flag.%s.options.%s",
- recipeName,
- fieldNameLow,
+ optionKey := fmt.Sprintf("%s.flag.%s.options.%s",
+ recipeName,
+ fieldNameLow,
es_case.ToLowerSnakeCase(option))
-
+
touchFunc(optionKey)
}
}
@@ -144,4 +144,4 @@ func TouchSelectStringOptions(c app_control.Control, touchFunc func(string)) {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/quality/recipe/qtr_recipespec/doc.go b/quality/recipe/qtr_recipespec/doc.go
new file mode 100644
index 000000000..3015b927f
--- /dev/null
+++ b/quality/recipe/qtr_recipespec/doc.go
@@ -0,0 +1,2 @@
+// Package qtr_recipespec contains tests for the `rc_spec` package.
+package qtr_recipespec
diff --git a/quality/recipe/qtr_timeout/doc.go b/quality/recipe/qtr_timeout/doc.go
new file mode 100644
index 000000000..5eec34920
--- /dev/null
+++ b/quality/recipe/qtr_timeout/doc.go
@@ -0,0 +1,2 @@
+// Package qtr_timeout provides a utility function `RunRecipeTestWithTimeout` for executing recipe tests with a timeout.
+package qtr_timeout
diff --git a/quality/scenario/doc.go b/quality/scenario/doc.go
new file mode 100644
index 000000000..521838207
--- /dev/null
+++ b/quality/scenario/doc.go
@@ -0,0 +1,2 @@
+// Package scenario provides various scenario tests for quality assurance.
+package scenario
diff --git a/quality/scenario/qs_retry/doc.go b/quality/scenario/qs_retry/doc.go
new file mode 100644
index 000000000..529a588a2
--- /dev/null
+++ b/quality/scenario/qs_retry/doc.go
@@ -0,0 +1,2 @@
+// Package qs_retry contains scenario tests for network retry mechanisms.
+package qs_retry
diff --git a/recipe/dev/build/catalogue.go b/recipe/dev/build/catalogue.go
index 7c465c71d..d84c6987a 100644
--- a/recipe/dev/build/catalogue.go
+++ b/recipe/dev/build/catalogue.go
@@ -2,8 +2,8 @@ package build
import (
"fmt"
- "github.com/watermint/toolbox/essentials/go/es_generate"
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_generate"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/recipe/dev/build/info.go b/recipe/dev/build/info.go
index 5c1efb136..ced2ddb45 100644
--- a/recipe/dev/build/info.go
+++ b/recipe/dev/build/info.go
@@ -5,7 +5,7 @@ import (
"errors"
"github.com/go-git/go-git/v5"
"github.com/tidwall/gjson"
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/control/app_definitions"
@@ -59,7 +59,7 @@ func (z *Info) Exec(c app_control.Control) error {
headName := string(head.Name())
var branch string
-
+
if strings.HasPrefix(headName, "refs/heads/") {
branch = strings.ReplaceAll(headName, "refs/heads/", "")
} else {
diff --git a/recipe/dev/build/info_comprehensive_test.go b/recipe/dev/build/info_comprehensive_test.go
index 12652f4db..d58848dbc 100644
--- a/recipe/dev/build/info_comprehensive_test.go
+++ b/recipe/dev/build/info_comprehensive_test.go
@@ -6,7 +6,7 @@ import (
"path/filepath"
"testing"
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/control/app_definitions"
"github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
@@ -25,14 +25,14 @@ func TestInfo_Exec_NoGitRepo(t *testing.T) {
tempDir := t.TempDir()
oldWd, _ := os.Getwd()
defer os.Chdir(oldWd)
-
+
if err := os.Chdir(tempDir); err != nil {
t.Fatal(err)
}
-
+
info := &Info{}
err := info.Exec(c)
-
+
// Should fail because no git repository
if err == nil {
t.Error("Expected error when running outside git repository")
@@ -46,12 +46,12 @@ func TestInfo_Exec_MissingEnvVars(t *testing.T) {
origBuilderKey := os.Getenv(app_definitions.EnvNameToolboxBuilderKey)
origAppKeys := os.Getenv(app_definitions.EnvNameToolboxAppKeys)
origLicenseSalt := os.Getenv(app_definitions.EnvNameToolboxLicenseSalt)
-
+
// Unset env vars
os.Unsetenv(app_definitions.EnvNameToolboxBuilderKey)
os.Unsetenv(app_definitions.EnvNameToolboxAppKeys)
os.Unsetenv(app_definitions.EnvNameToolboxLicenseSalt)
-
+
defer func() {
// Restore env vars
if origBuilderKey != "" {
@@ -64,50 +64,50 @@ func TestInfo_Exec_MissingEnvVars(t *testing.T) {
os.Setenv(app_definitions.EnvNameToolboxLicenseSalt, origLicenseSalt)
}
}()
-
+
// Should run in the actual project directory
prjRoot, err := es_project.DetectRepositoryRoot()
if err != nil {
t.Skip("Not in a git repository")
}
-
+
// Change to project root
oldWd, _ := os.Getwd()
defer os.Chdir(oldWd)
if err := os.Chdir(prjRoot); err != nil {
t.Fatal(err)
}
-
+
info := &Info{FailFast: false}
err = info.Exec(c)
-
+
// Should succeed even without env vars when FailFast is false
if err != nil {
t.Errorf("Expected success without env vars when FailFast=false, got: %v", err)
}
-
+
// Verify info.json was created
infoPath := filepath.Join(prjRoot, "resources/build", "info.json")
if _, err := os.Stat(infoPath); os.IsNotExist(err) {
t.Error("info.json was not created")
}
-
+
// Read and verify content
data, err := os.ReadFile(infoPath)
if err != nil {
t.Fatal(err)
}
-
+
var buildInfo resources.BuildInfo
if err := json.Unmarshal(data, &buildInfo); err != nil {
t.Fatal(err)
}
-
+
// Verify production is false without env vars
if buildInfo.Production {
t.Error("Expected Production to be false without env vars")
}
-
+
// Verify empty values
if buildInfo.Xap != "" {
t.Error("Expected Xap to be empty without builder key")
@@ -131,23 +131,23 @@ func TestInfo_Exec_FailFastMissingBuilderKey(t *testing.T) {
os.Setenv(app_definitions.EnvNameToolboxBuilderKey, origBuilderKey)
}
}()
-
+
// Should run in the actual project directory
prjRoot, err := es_project.DetectRepositoryRoot()
if err != nil {
t.Skip("Not in a git repository")
}
-
+
// Change to project root
oldWd, _ := os.Getwd()
defer os.Chdir(oldWd)
if err := os.Chdir(prjRoot); err != nil {
t.Fatal(err)
}
-
+
info := &Info{FailFast: true}
err = info.Exec(c)
-
+
// Should fail when FailFast is true and builder key is missing
if err == nil {
t.Error("Expected error when FailFast=true and builder key is missing")
@@ -163,10 +163,10 @@ func TestInfo_Exec_FailFastMissingAppKeys(t *testing.T) {
// Save and set builder key, unset app keys
origBuilderKey := os.Getenv(app_definitions.EnvNameToolboxBuilderKey)
origAppKeys := os.Getenv(app_definitions.EnvNameToolboxAppKeys)
-
+
os.Setenv(app_definitions.EnvNameToolboxBuilderKey, "test-builder-key-12345")
os.Unsetenv(app_definitions.EnvNameToolboxAppKeys)
-
+
defer func() {
if origBuilderKey != "" {
os.Setenv(app_definitions.EnvNameToolboxBuilderKey, origBuilderKey)
@@ -177,23 +177,23 @@ func TestInfo_Exec_FailFastMissingAppKeys(t *testing.T) {
os.Setenv(app_definitions.EnvNameToolboxAppKeys, origAppKeys)
}
}()
-
+
// Should run in the actual project directory
prjRoot, err := es_project.DetectRepositoryRoot()
if err != nil {
t.Skip("Not in a git repository")
}
-
+
// Change to project root
oldWd, _ := os.Getwd()
defer os.Chdir(oldWd)
if err := os.Chdir(prjRoot); err != nil {
t.Fatal(err)
}
-
+
info := &Info{FailFast: true}
err = info.Exec(c)
-
+
// Should fail when FailFast is true and app keys are missing
if err == nil {
t.Error("Expected error when FailFast=true and app keys are missing")
@@ -209,7 +209,7 @@ func TestInfo_Exec_InvalidAppKeys(t *testing.T) {
// Save and set invalid app keys
origAppKeys := os.Getenv(app_definitions.EnvNameToolboxAppKeys)
os.Setenv(app_definitions.EnvNameToolboxAppKeys, "invalid-json-{")
-
+
defer func() {
if origAppKeys != "" {
os.Setenv(app_definitions.EnvNameToolboxAppKeys, origAppKeys)
@@ -217,23 +217,23 @@ func TestInfo_Exec_InvalidAppKeys(t *testing.T) {
os.Unsetenv(app_definitions.EnvNameToolboxAppKeys)
}
}()
-
+
// Should run in the actual project directory
prjRoot, err := es_project.DetectRepositoryRoot()
if err != nil {
t.Skip("Not in a git repository")
}
-
+
// Change to project root
oldWd, _ := os.Getwd()
defer os.Chdir(oldWd)
if err := os.Chdir(prjRoot); err != nil {
t.Fatal(err)
}
-
+
info := &Info{FailFast: false}
err = info.Exec(c)
-
+
// Should fail with invalid JSON
if err == nil {
t.Error("Expected error with invalid JSON app keys")
@@ -249,7 +249,7 @@ func TestInfo_Exec_ShortBuilderKey(t *testing.T) {
// Save and set short builder key
origBuilderKey := os.Getenv(app_definitions.EnvNameToolboxBuilderKey)
os.Setenv(app_definitions.EnvNameToolboxBuilderKey, "short")
-
+
defer func() {
if origBuilderKey != "" {
os.Setenv(app_definitions.EnvNameToolboxBuilderKey, origBuilderKey)
@@ -257,48 +257,48 @@ func TestInfo_Exec_ShortBuilderKey(t *testing.T) {
os.Unsetenv(app_definitions.EnvNameToolboxBuilderKey)
}
}()
-
+
// Should run in the actual project directory
prjRoot, err := es_project.DetectRepositoryRoot()
if err != nil {
t.Skip("Not in a git repository")
}
-
+
// Change to project root
oldWd, _ := os.Getwd()
defer os.Chdir(oldWd)
if err := os.Chdir(prjRoot); err != nil {
t.Fatal(err)
}
-
+
info := &Info{FailFast: false}
err = info.Exec(c)
-
+
// Should succeed but mark as not production ready
if err != nil {
t.Errorf("Should succeed with short builder key when FailFast=false, got: %v", err)
}
-
+
// Verify info.json was created
infoPath := filepath.Join(prjRoot, "resources/build", "info.json")
data, err := os.ReadFile(infoPath)
if err != nil {
t.Fatal(err)
}
-
+
var buildInfo resources.BuildInfo
if err := json.Unmarshal(data, &buildInfo); err != nil {
t.Fatal(err)
}
-
+
// Verify production is false with short key
if buildInfo.Production {
t.Error("Expected Production to be false with short builder key")
}
-
+
// Verify Xap is empty with short key
if buildInfo.Xap != "" {
t.Error("Expected Xap to be empty with short builder key")
}
})
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/build/license.go b/recipe/dev/build/license.go
index 1fca0ace6..0c0d3f72f 100644
--- a/recipe/dev/build/license.go
+++ b/recipe/dev/build/license.go
@@ -5,7 +5,7 @@ import (
"os"
"path/filepath"
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/io/es_stdout"
"github.com/watermint/toolbox/essentials/model/mo_path"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/recipe/dev/build/package.go b/recipe/dev/build/package.go
index 612edd7e6..58f7d3894 100644
--- a/recipe/dev/build/package.go
+++ b/recipe/dev/build/package.go
@@ -6,7 +6,7 @@ import (
"fmt"
mo_dbx_path "github.com/watermint/toolbox/domain/dropbox/model/mo_path"
"github.com/watermint/toolbox/essentials/ambient/ea_indicator"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/model/mo_path"
"github.com/watermint/toolbox/essentials/model/mo_string"
diff --git a/recipe/dev/build/package_comprehensive_test.go b/recipe/dev/build/package_comprehensive_test.go
index 8d02cb19f..eb7428c3c 100644
--- a/recipe/dev/build/package_comprehensive_test.go
+++ b/recipe/dev/build/package_comprehensive_test.go
@@ -18,7 +18,7 @@ import (
func TestPackage_Preset(t *testing.T) {
p := &Package{}
p.Preset()
-
+
if p.ExecutableName != app_definitions.ExecutableName {
t.Errorf("Expected ExecutableName to be %s, got %s", app_definitions.ExecutableName, p.ExecutableName)
}
@@ -26,7 +26,7 @@ func TestPackage_Preset(t *testing.T) {
func TestPackage_platformName(t *testing.T) {
p := &Package{}
-
+
testCases := []struct {
envValue string
expected string
@@ -39,20 +39,20 @@ func TestPackage_platformName(t *testing.T) {
{"unknown/unknown", "unknown"},
{"", "unknown"},
}
-
+
for _, tc := range testCases {
if tc.envValue == "" {
os.Unsetenv(app_definitions.EnvNameToolboxBuildTarget)
} else {
os.Setenv(app_definitions.EnvNameToolboxBuildTarget, tc.envValue)
}
-
+
result := p.platformName()
if result != tc.expected {
t.Errorf("For env value '%s', expected platform name '%s', got '%s'", tc.envValue, tc.expected, result)
}
}
-
+
// Clean up
os.Unsetenv(app_definitions.EnvNameToolboxBuildTarget)
}
@@ -65,56 +65,56 @@ func TestPackage_createPackage(t *testing.T) {
t.Fatal(err)
}
defer os.RemoveAll(buildDir)
-
+
distDir, err := qt_file.MakeTestFolder("dist", false)
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(distDir)
-
+
// Create test binary
testBinary := filepath.Join(buildDir, app_definitions.ExecutableName)
err = os.WriteFile(testBinary, []byte("test binary content"), 0755)
if err != nil {
t.Fatal(err)
}
-
+
p := &Package{
BuildPath: mo_path.NewExistingFileSystemPath(buildDir),
DistPath: mo_path.NewFileSystemPath(distDir),
ExecutableName: app_definitions.ExecutableName,
}
-
+
// Test package creation
pkgPath, err := p.createPackage(c)
if err != nil {
t.Fatal(err)
}
-
+
// Verify package was created
if _, err := os.Stat(pkgPath); os.IsNotExist(err) {
t.Error("Package file was not created")
}
-
+
// Verify package contents
reader, err := zip.OpenReader(pkgPath)
if err != nil {
t.Fatal(err)
}
defer reader.Close()
-
+
expectedFiles := map[string]bool{
- "LICENSE.txt": false,
- "README.txt": false,
+ "LICENSE.txt": false,
+ "README.txt": false,
app_definitions.ExecutableName: false,
}
-
+
for _, f := range reader.File {
if _, ok := expectedFiles[f.Name]; ok {
expectedFiles[f.Name] = true
}
}
-
+
for name, found := range expectedFiles {
if !found {
t.Errorf("Expected file '%s' not found in package", name)
@@ -128,44 +128,44 @@ func TestPackage_createPackage_withWindowsTarget(t *testing.T) {
// Set Windows target
os.Setenv(app_definitions.EnvNameToolboxBuildTarget, "windows/amd64")
defer os.Unsetenv(app_definitions.EnvNameToolboxBuildTarget)
-
+
// Create test directories
buildDir, err := qt_file.MakeTestFolder("build", false)
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(buildDir)
-
+
distDir, err := qt_file.MakeTestFolder("dist", false)
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(distDir)
-
+
// Create test binary with Windows naming
testBinary := filepath.Join(buildDir, app_definitions.ExecutableName+"-windows-amd64.exe")
err = os.WriteFile(testBinary, []byte("test binary content"), 0755)
if err != nil {
t.Fatal(err)
}
-
+
p := &Package{
BuildPath: mo_path.NewExistingFileSystemPath(buildDir),
DistPath: mo_path.NewFileSystemPath(distDir),
ExecutableName: app_definitions.ExecutableName,
}
-
+
// Test package creation
pkgPath, err := p.createPackage(c)
if err != nil {
t.Fatal(err)
}
-
+
// Verify package was created with correct name
if _, err := os.Stat(pkgPath); os.IsNotExist(err) {
t.Error("Package file was not created")
}
-
+
// Check that package name contains "win"
if !strings.Contains(pkgPath, "-win.") {
t.Errorf("Package name should contain '-win.' for Windows platform, got: %s", pkgPath)
@@ -180,14 +180,14 @@ func TestPackage_createPackage_invalidDistPath(t *testing.T) {
t.Fatal(err)
}
defer os.RemoveAll(buildDir)
-
+
// Use an invalid dist path
p := &Package{
BuildPath: mo_path.NewExistingFileSystemPath(buildDir),
DistPath: mo_path.NewFileSystemPath("/invalid/path/that/cannot/be/created"),
ExecutableName: app_definitions.ExecutableName,
}
-
+
_, err = p.createPackage(c)
if err == nil {
t.Error("Expected error for invalid dist path")
@@ -203,39 +203,39 @@ func TestPackage_Exec_withoutDeploy(t *testing.T) {
t.Fatal(err)
}
defer os.RemoveAll(buildDir)
-
+
distDir, err := qt_file.MakeTestFolder("dist", false)
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(distDir)
-
+
// Create test binary
testBinary := filepath.Join(buildDir, app_definitions.ExecutableName)
err = os.WriteFile(testBinary, []byte("test binary content"), 0755)
if err != nil {
t.Fatal(err)
}
-
+
p := &Package{
BuildPath: mo_path.NewExistingFileSystemPath(buildDir),
DistPath: mo_path.NewFileSystemPath(distDir),
ExecutableName: app_definitions.ExecutableName,
DeployPath: mo_string.NewOptional(""), // Empty deploy path
}
-
+
// Execute should succeed without deployment
err = p.Exec(c)
if err != nil {
t.Fatal(err)
}
-
+
// Verify package was created
files, err := os.ReadDir(distDir)
if err != nil {
t.Fatal(err)
}
-
+
if len(files) == 0 {
t.Error("No package files created")
}
@@ -254,38 +254,38 @@ func TestPackage_binaryNaming(t *testing.T) {
{"darwin/amd64", "", app_definitions.ExecutableName + "-darwin-amd64"},
{"darwin/arm64", "", app_definitions.ExecutableName + "-darwin-arm64"},
}
-
+
for _, tc := range testCases {
t.Run(tc.target, func(t *testing.T) {
os.Setenv(app_definitions.EnvNameToolboxBuildTarget, tc.target)
defer os.Unsetenv(app_definitions.EnvNameToolboxBuildTarget)
-
+
qtr_endtoend.TestWithControl(t, func(c app_control.Control) {
buildDir, err := qt_file.MakeTestFolder("build", false)
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(buildDir)
-
+
distDir, err := qt_file.MakeTestFolder("dist", false)
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(distDir)
-
+
// Create test binary with expected name
testBinary := filepath.Join(buildDir, tc.expectedName)
err = os.WriteFile(testBinary, []byte("test binary content"), 0755)
if err != nil {
t.Fatal(err)
}
-
+
p := &Package{
BuildPath: mo_path.NewExistingFileSystemPath(buildDir),
DistPath: mo_path.NewFileSystemPath(distDir),
ExecutableName: app_definitions.ExecutableName,
}
-
+
_, err = p.createPackage(c)
if err != nil {
t.Fatal(err)
@@ -294,4 +294,3 @@ func TestPackage_binaryNaming(t *testing.T) {
})
}
}
-
diff --git a/recipe/dev/build/preflight.go b/recipe/dev/build/preflight.go
index 7003e79ee..e5068d5a2 100644
--- a/recipe/dev/build/preflight.go
+++ b/recipe/dev/build/preflight.go
@@ -8,19 +8,19 @@ import (
"path/filepath"
"sort"
- "github.com/watermint/toolbox/essentials/go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/infra/control/app_catalogue"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/control/app_feature"
- "github.com/watermint/toolbox/quality/recipe/qtr_options"
"github.com/watermint/toolbox/infra/recipe/rc_exec"
"github.com/watermint/toolbox/infra/recipe/rc_recipe"
"github.com/watermint/toolbox/infra/recipe/rc_spec"
"github.com/watermint/toolbox/infra/ui/app_msg"
"github.com/watermint/toolbox/quality/infra/qt_messages"
"github.com/watermint/toolbox/quality/infra/qt_msgusage"
+ "github.com/watermint/toolbox/quality/recipe/qtr_options"
)
type Preflight struct {
@@ -93,14 +93,14 @@ func (z *Preflight) sortMessages(c app_control.Control, filename string) error {
func (z *Preflight) verifySelectStringOptions(c app_control.Control) error {
l := c.Log()
ui := c.UI()
-
+
l.Info("Verifying SelectString option descriptions")
-
+
missingOptions, err := qtr_options.VerifySelectStringOptions(c)
if err != nil {
return err
}
-
+
if len(missingOptions) > 0 {
l.Warn("Missing SelectString option descriptions", esl.Int("count", len(missingOptions)))
ui.Error(app_msg.Raw(fmt.Sprintf("\nMissing %d SelectString option descriptions:", len(missingOptions))))
@@ -110,7 +110,7 @@ func (z *Preflight) verifySelectStringOptions(c app_control.Control) error {
ui.Info(app_msg.Raw("\nTo generate these, run: dev doc msg options --target-path ."))
return fmt.Errorf("missing %d SelectString option descriptions", len(missingOptions))
}
-
+
l.Info("All SelectString options have descriptions")
return nil
}
@@ -194,7 +194,7 @@ func (z *Preflight) Exec(c app_control.Control) error {
qt_msgusage.Record().Touch(m.Key())
l.Debug("message", esl.String("key", m.Key()), esl.String("text", c.UI().Text(m)))
}
-
+
}
l.Info("Verify ingredients")
@@ -225,7 +225,7 @@ func (z *Preflight) Exec(c app_control.Control) error {
ll.Debug("feature agreement", esl.String("msg", c.UI().Text(app_feature.OptInAgreement(f))))
ll.Debug("feature desc", esl.String("msg", c.UI().Text(app_feature.OptInDescription(f))))
}
-
+
// Touch all SelectString option messages to mark them as used
qtr_options.TouchSelectStringOptions(c, func(key string) {
qt_msgusage.Record().Touch(key)
diff --git a/recipe/dev/build/readme.go b/recipe/dev/build/readme.go
index 76b44b0ff..2acf90abd 100644
--- a/recipe/dev/build/readme.go
+++ b/recipe/dev/build/readme.go
@@ -27,7 +27,7 @@ func (z *Readme) Preset() {
func (z *Readme) genDoc(path string, doc string, c app_control.Control) error {
l := c.Log()
-
+
if c.Feature().IsTest() {
l.Debug("Generating README to stdout (test mode)")
out := es_stdout.NewDefaultOut(c.Feature())
@@ -56,27 +56,27 @@ func (z *Readme) genDoc(path string, doc string, c app_control.Control) error {
func (z *Readme) Exec(c app_control.Control) error {
l := c.Log()
l.Info("Generating README", esl.String("path", z.Path.Path()))
-
+
// Add defensive error handling for CI environment
defer func() {
if r := recover(); r != nil {
l.Error("README generation panicked", esl.Any("panic", r))
}
}()
-
+
// Generate documentation sections with error handling
sec := dc_readme.New(dc_index.MediaRepository, c.Messages(), false)
if sec == nil {
l.Error("Failed to create README sections")
return fmt.Errorf("failed to create README sections")
}
-
+
doc := dc_section.Generate(dc_index.MediaRepository, dc_section.LayoutPage, c.Messages(), sec)
if doc == "" {
l.Error("Generated README document is empty")
return fmt.Errorf("generated README document is empty")
}
-
+
l.Debug("README document generated", esl.Int("length", len(doc)))
return z.genDoc(z.Path.Path(), doc, c)
}
diff --git a/recipe/dev/build/readme_test.go b/recipe/dev/build/readme_test.go
index 54da3a930..9e0146f61 100644
--- a/recipe/dev/build/readme_test.go
+++ b/recipe/dev/build/readme_test.go
@@ -27,21 +27,21 @@ func TestReadme_ExecWithDebug(t *testing.T) {
t.Logf("Warning: Failed to clean up test directory: %v", err)
}
}()
-
+
// Create readme instance
readme := &Readme{
Path: mo_path.NewFileSystemPath(filepath.Join(testDir, "README.txt")),
}
-
+
// Execute with debug info
t.Logf("Starting readme generation in test mode")
err = readme.Exec(c)
if err != nil {
t.Fatalf("Readme execution failed: %v", err)
}
-
+
t.Logf("Readme generation completed successfully")
-
+
// Verify output when not in test mode
if !c.Feature().IsTest() {
// Check if file was created
diff --git a/recipe/dev/doc/knowledge.go b/recipe/dev/doc/knowledge.go
index c479b101e..3474aa59f 100644
--- a/recipe/dev/doc/knowledge.go
+++ b/recipe/dev/doc/knowledge.go
@@ -95,4 +95,4 @@ func (z *Knowledge) Test(c app_control.Control) error {
m := r.(*Knowledge)
m.CommandLimit = 5
})
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/add.go b/recipe/dev/doc/msg/add.go
index c48a06dac..6dd84ac2e 100644
--- a/recipe/dev/doc/msg/add.go
+++ b/recipe/dev/doc/msg/add.go
@@ -109,4 +109,4 @@ func (z *Add) Exec(c app_control.Control) error {
func (z *Add) Test(c app_control.Control) error {
return rc_exec.Exec(c, z, rc_recipe.NoCustomValues)
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/add_test.go b/recipe/dev/doc/msg/add_test.go
index e3f608d70..f72472c86 100644
--- a/recipe/dev/doc/msg/add_test.go
+++ b/recipe/dev/doc/msg/add_test.go
@@ -7,4 +7,4 @@ import (
func TestAdd_Exec(t *testing.T) {
qtr_endtoend.TestRecipe(t, &Add{})
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/catalogueoptions_test.go b/recipe/dev/doc/msg/catalogueoptions_test.go
index c9781e732..c47a52629 100644
--- a/recipe/dev/doc/msg/catalogueoptions_test.go
+++ b/recipe/dev/doc/msg/catalogueoptions_test.go
@@ -16,7 +16,7 @@ func TestCatalogueOptions_DryRun(t *testing.T) {
func TestCatalogueOptions_GenerateOptionDescription(t *testing.T) {
z := &CatalogueOptions{}
-
+
tests := []struct {
name string
fieldName string
@@ -108,22 +108,21 @@ func TestCatalogueOptions_GenerateOptionDescription(t *testing.T) {
expected: "Visibility option: unknown",
},
}
-
+
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := z.generateOptionDescription(tt.fieldName, tt.option)
if result != tt.expected {
- t.Errorf("generateOptionDescription(%q, %q) = %q, want %q",
+ t.Errorf("generateOptionDescription(%q, %q) = %q, want %q",
tt.fieldName, tt.option, result, tt.expected)
}
})
}
}
-
func TestCatalogueOptions_EmptyOptions(t *testing.T) {
z := &CatalogueOptions{}
-
+
// Test empty option handling
result := z.generateOptionDescription("field", "")
expected := "field: "
@@ -134,7 +133,7 @@ func TestCatalogueOptions_EmptyOptions(t *testing.T) {
func TestCatalogueOptions_FieldNameCaseInsensitive(t *testing.T) {
z := &CatalogueOptions{}
-
+
// Test that field names are case insensitive
testCases := []struct {
fieldName string
@@ -147,7 +146,7 @@ func TestCatalogueOptions_FieldNameCaseInsensitive(t *testing.T) {
{"base_path", "root", "Full access to all folders with permissions"},
{"BASE_PATH", "root", "Full access to all folders with permissions"},
}
-
+
for _, tc := range testCases {
t.Run(tc.fieldName, func(t *testing.T) {
result := z.generateOptionDescription(tc.fieldName, tc.option)
@@ -161,7 +160,7 @@ func TestCatalogueOptions_FieldNameCaseInsensitive(t *testing.T) {
func TestCatalogueOptions_AllFormats(t *testing.T) {
z := &CatalogueOptions{}
-
+
// Test all format options
formats := []struct {
option string
@@ -173,7 +172,7 @@ func TestCatalogueOptions_AllFormats(t *testing.T) {
{"pdf", "PDF document format"},
{"unknown_format", "Format: unknown_format"},
}
-
+
for _, f := range formats {
t.Run(f.option, func(t *testing.T) {
result := z.generateOptionDescription("format", f.option)
@@ -183,4 +182,4 @@ func TestCatalogueOptions_AllFormats(t *testing.T) {
}
})
}
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/delete.go b/recipe/dev/doc/msg/delete.go
index bdef79fc6..9c53a3fcf 100644
--- a/recipe/dev/doc/msg/delete.go
+++ b/recipe/dev/doc/msg/delete.go
@@ -101,4 +101,4 @@ func (z *Delete) Exec(c app_control.Control) error {
func (z *Delete) Test(c app_control.Control) error {
return rc_exec.Exec(c, z, rc_recipe.NoCustomValues)
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/delete_test.go b/recipe/dev/doc/msg/delete_test.go
index 8255194a9..6196e6d02 100644
--- a/recipe/dev/doc/msg/delete_test.go
+++ b/recipe/dev/doc/msg/delete_test.go
@@ -7,4 +7,4 @@ import (
func TestDelete_Exec(t *testing.T) {
qtr_endtoend.TestRecipe(t, &Delete{})
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/list.go b/recipe/dev/doc/msg/list.go
index 2d38e7906..4c921edd0 100644
--- a/recipe/dev/doc/msg/list.go
+++ b/recipe/dev/doc/msg/list.go
@@ -99,4 +99,4 @@ func (z *List) Exec(c app_control.Control) error {
func (z *List) Test(c app_control.Control) error {
return rc_exec.Exec(c, z, rc_recipe.NoCustomValues)
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/list_test.go b/recipe/dev/doc/msg/list_test.go
index 79d50f1b1..8ac833a84 100644
--- a/recipe/dev/doc/msg/list_test.go
+++ b/recipe/dev/doc/msg/list_test.go
@@ -7,4 +7,4 @@ import (
func TestList_Exec(t *testing.T) {
qtr_endtoend.TestRecipe(t, &List{})
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/options.go b/recipe/dev/doc/msg/options.go
index 10f4c4f63..d9a826f8a 100644
--- a/recipe/dev/doc/msg/options.go
+++ b/recipe/dev/doc/msg/options.go
@@ -60,8 +60,8 @@ func (z *Options) Exec(c app_control.Control) error {
// Generate option description messages
for _, field := range fields {
if err := z.generateOptionMessages(c, field); err != nil {
- l.Error("Failed to generate messages for field",
- esl.Error(err),
+ l.Error("Failed to generate messages for field",
+ esl.Error(err),
esl.String("recipe", field.RecipePath),
esl.String("field", field.FieldName))
ui.Error(z.GenerationError.With("Field", field.FieldName).With("Recipe", field.RecipePath))
@@ -99,14 +99,14 @@ func (z *Options) scanSelectStringFields(c app_control.Control, targetPath strin
if structType, ok := typeSpec.Type.(*ast.StructType); ok {
structName := typeSpec.Name.Name
packagePath := z.getPackagePath(path)
-
+
for _, field := range structType.Fields.List {
if z.isSelectStringField(field) && len(field.Names) > 0 {
fieldName := field.Names[0].Name
-
+
// Get message prefix from package path
messagePrefix := z.buildMessagePrefix(packagePath, structName)
-
+
selectField := SelectStringField{
RecipePath: path,
StructName: structName,
@@ -204,9 +204,9 @@ func (z *Options) generateOptionMessages(c app_control.Control, field SelectStri
// Generate option description messages for each unique option value
for _, option := range options {
- optionKey := fmt.Sprintf("%s.flag.%s.options.%s",
- field.MessagePrefix,
- field.FieldNameLow,
+ optionKey := fmt.Sprintf("%s.flag.%s.options.%s",
+ field.MessagePrefix,
+ field.FieldNameLow,
es_case.ToLowerSnakeCase(option))
// Generate a descriptive message for the option
@@ -217,8 +217,8 @@ func (z *Options) generateOptionMessages(c app_control.Control, field SelectStri
} else {
// Create the message using the existing add command logic
if err := z.createMessage(c, optionKey, optionDescription); err != nil {
- l.Error("Failed to create option message",
- esl.Error(err),
+ l.Error("Failed to create option message",
+ esl.Error(err),
esl.String("key", optionKey))
return err
}
@@ -356,4 +356,4 @@ func (z *Options) createMessage(c app_control.Control, key, value string) error
func (z *Options) Test(c app_control.Control) error {
return rc_exec.Exec(c, z, rc_recipe.NoCustomValues)
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/options_test.go b/recipe/dev/doc/msg/options_test.go
index 9e01de6fd..3f318db31 100644
--- a/recipe/dev/doc/msg/options_test.go
+++ b/recipe/dev/doc/msg/options_test.go
@@ -7,4 +7,4 @@ import (
func TestOptions_Exec(t *testing.T) {
// Skip this test as it requires the full project structure
t.Skip("Skipping Options_Exec as it requires full project structure")
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/translate.go b/recipe/dev/doc/msg/translate.go
index 91ba47ca1..8c15372be 100644
--- a/recipe/dev/doc/msg/translate.go
+++ b/recipe/dev/doc/msg/translate.go
@@ -15,15 +15,15 @@ import (
type Translate struct {
rc_recipe.RemarkSecret
- Key mo_string.OptionalString
- ProcessingMessage app_msg.Message
- AddedTranslation app_msg.Message
- CompletedMessage app_msg.Message
- NoMissingFound app_msg.Message
- ErrorLoadingFiles app_msg.Message
- SingleKeyNotFound app_msg.Message
- CurrentValue app_msg.Message
- PromptTranslation app_msg.Message
+ Key mo_string.OptionalString
+ ProcessingMessage app_msg.Message
+ AddedTranslation app_msg.Message
+ CompletedMessage app_msg.Message
+ NoMissingFound app_msg.Message
+ ErrorLoadingFiles app_msg.Message
+ SingleKeyNotFound app_msg.Message
+ CurrentValue app_msg.Message
+ PromptTranslation app_msg.Message
}
func (z *Translate) Preset() {
@@ -82,7 +82,7 @@ func (z *Translate) Exec(c app_control.Control) error {
// Show translation prompt
ui.Info(z.PromptTranslation.With("Key", key))
-
+
// For now, we'll return here since we need interactive input
// In the future, this could be enhanced with interactive prompts
return nil
@@ -105,7 +105,7 @@ func (z *Translate) Exec(c app_control.Control) error {
// Show first 10 missing keys
ui.Progress(z.ProcessingMessage.With("Count", len(missingKeys)))
-
+
limit := 10
if len(missingKeys) < limit {
limit = len(missingKeys)
@@ -126,7 +126,6 @@ func (z *Translate) Exec(c app_control.Control) error {
return nil
}
-
func (z *Translate) Test(c app_control.Control) error {
return rc_exec.Exec(c, z, rc_recipe.NoCustomValues)
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/translate_test.go b/recipe/dev/doc/msg/translate_test.go
index a055ce555..c1c357f04 100644
--- a/recipe/dev/doc/msg/translate_test.go
+++ b/recipe/dev/doc/msg/translate_test.go
@@ -2,9 +2,9 @@ package msg
import (
"encoding/json"
+ "github.com/watermint/toolbox/essentials/model/mo_string"
"path/filepath"
"testing"
- "github.com/watermint/toolbox/essentials/model/mo_string"
)
func TestTranslate_Preset(t *testing.T) {
@@ -15,21 +15,21 @@ func TestTranslate_Preset(t *testing.T) {
func TestTranslate_KeyHandling(t *testing.T) {
translate := &Translate{}
-
+
// Initialize with empty optional string
translate.Key = mo_string.NewOptional("")
-
+
// Test with no key set (empty string)
if translate.Key.IsExists() {
t.Error("Key should not exist when empty")
}
-
+
// Test with key set
translate.Key = mo_string.NewOptional("test.key")
if !translate.Key.IsExists() {
t.Error("Key should exist after setting")
}
-
+
if translate.Key.Value() != "test.key" {
t.Errorf("Expected 'test.key', got %s", translate.Key.Value())
}
@@ -41,22 +41,22 @@ func TestTranslate_JSONParsing(t *testing.T) {
"test.key1": "Hello",
"test.key2": "World",
}
-
+
jsonData, err := json.Marshal(testMessages)
if err != nil {
t.Fatalf("Failed to marshal test data: %v", err)
}
-
+
var parsed map[string]string
err = json.Unmarshal(jsonData, &parsed)
if err != nil {
t.Fatalf("Failed to unmarshal test data: %v", err)
}
-
+
if len(parsed) != 2 {
t.Errorf("Expected 2 keys, got %d", len(parsed))
}
-
+
if parsed["test.key1"] != "Hello" {
t.Errorf("Expected 'Hello', got %s", parsed["test.key1"])
}
@@ -66,15 +66,15 @@ func TestTranslate_FilePaths(t *testing.T) {
// Test file path building
enPath := filepath.Join("resources", "messages", "en", "messages.json")
jaPath := filepath.Join("resources", "messages", "ja", "messages.json")
-
+
if enPath == "" {
t.Error("English path should not be empty")
}
-
+
if jaPath == "" {
t.Error("Japanese path should not be empty")
}
-
+
// Test that paths are different
if enPath == jaPath {
t.Error("English and Japanese paths should be different")
@@ -85,16 +85,16 @@ func TestTranslate_MissingKeyDetection(t *testing.T) {
// Test missing key detection logic
enMessages := map[string]string{
"key1": "English 1",
- "key2": "English 2",
+ "key2": "English 2",
"key3": "English 3",
}
-
+
jaMessages := map[string]string{
"key1": "Japanese 1",
"key2": "Japanese 2",
// key3 is missing
}
-
+
// Find missing keys
missingKeys := make([]string, 0)
for key := range enMessages {
@@ -102,12 +102,12 @@ func TestTranslate_MissingKeyDetection(t *testing.T) {
missingKeys = append(missingKeys, key)
}
}
-
+
if len(missingKeys) != 1 {
t.Errorf("Expected 1 missing key, got %d", len(missingKeys))
}
-
+
if len(missingKeys) > 0 && missingKeys[0] != "key3" {
t.Errorf("Expected missing key 'key3', got %s", missingKeys[0])
}
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/update.go b/recipe/dev/doc/msg/update.go
index 5bdefd8e0..cf284f383 100644
--- a/recipe/dev/doc/msg/update.go
+++ b/recipe/dev/doc/msg/update.go
@@ -103,4 +103,4 @@ func (z *Update) Exec(c app_control.Control) error {
func (z *Update) Test(c app_control.Control) error {
return rc_exec.Exec(c, z, rc_recipe.NoCustomValues)
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/update_test.go b/recipe/dev/doc/msg/update_test.go
index 3f60f7ac4..3b0e20f8d 100644
--- a/recipe/dev/doc/msg/update_test.go
+++ b/recipe/dev/doc/msg/update_test.go
@@ -7,4 +7,4 @@ import (
func TestUpdate_Exec(t *testing.T) {
qtr_endtoend.TestRecipe(t, &Update{})
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/verify.go b/recipe/dev/doc/msg/verify.go
index f427b3fe7..d6b0fe445 100644
--- a/recipe/dev/doc/msg/verify.go
+++ b/recipe/dev/doc/msg/verify.go
@@ -25,13 +25,13 @@ type Verify struct {
}
type ValidationResult struct {
- Key string `json:"key"`
- EnglishMessage string `json:"english_message"`
- JapaneseMessage string `json:"japanese_message,omitempty"`
- EnglishVariables []string `json:"english_variables"`
- JapaneseVariables []string `json:"japanese_variables,omitempty"`
- IssueType string `json:"issue_type,omitempty"`
- IssueDescription string `json:"issue_description,omitempty"`
+ Key string `json:"key"`
+ EnglishMessage string `json:"english_message"`
+ JapaneseMessage string `json:"japanese_message,omitempty"`
+ EnglishVariables []string `json:"english_variables"`
+ JapaneseVariables []string `json:"japanese_variables,omitempty"`
+ IssueType string `json:"issue_type,omitempty"`
+ IssueDescription string `json:"issue_description,omitempty"`
}
func (z *Verify) Preset() {
@@ -41,10 +41,10 @@ func (z *Verify) extractVariables(message string) []string {
// Regular expression to match {{.Variable}} patterns
re := regexp.MustCompile(`{{\.([^}]+)}}`)
matches := re.FindAllStringSubmatch(message, -1)
-
+
variables := make([]string, 0, len(matches))
seen := make(map[string]bool)
-
+
for _, match := range matches {
if len(match) > 1 {
variable := match[1]
@@ -54,7 +54,7 @@ func (z *Verify) extractVariables(message string) []string {
}
}
}
-
+
sort.Strings(variables)
return variables
}
@@ -63,13 +63,13 @@ func (z *Verify) variablesEqual(vars1, vars2 []string) bool {
if len(vars1) != len(vars2) {
return false
}
-
+
for i := range vars1 {
if vars1[i] != vars2[i] {
return false
}
}
-
+
return true
}
@@ -133,9 +133,9 @@ func (z *Verify) Exec(c app_control.Control) error {
for _, key := range keys {
enMessage := enMessages[key]
jaMessage, jaExists := jaMessages[key]
-
+
enVariables := z.extractVariables(enMessage)
-
+
result := ValidationResult{
Key: key,
EnglishMessage: enMessage,
@@ -150,10 +150,10 @@ func (z *Verify) Exec(c app_control.Control) error {
result.JapaneseMessage = jaMessage
jaVariables := z.extractVariables(jaMessage)
result.JapaneseVariables = jaVariables
-
+
if !z.variablesEqual(enVariables, jaVariables) {
result.IssueType = "variable_mismatch"
- result.IssueDescription = fmt.Sprintf("Variable mismatch: English has %v, Japanese has %v",
+ result.IssueDescription = fmt.Sprintf("Variable mismatch: English has %v, Japanese has %v",
enVariables, jaVariables)
hasErrors = true
}
@@ -170,17 +170,17 @@ func (z *Verify) Exec(c app_control.Control) error {
if hasErrors {
ui.Error(z.ValidationError.With("ErrorCount", len(validationResults)))
-
+
// Output detailed validation results as JSON
encoder := json.NewEncoder(out)
encoder.SetIndent("", " ")
encoder.SetEscapeHTML(false)
-
+
if err := encoder.Encode(validationResults); err != nil {
l.Error("Unable to encode validation results", esl.Error(err))
return err
}
-
+
return fmt.Errorf("validation failed with %d errors", len(validationResults))
} else {
ui.Success(z.AllValid.With("TotalMessages", len(enMessages)))
@@ -189,7 +189,7 @@ func (z *Verify) Exec(c app_control.Control) error {
ui.Info(z.Summary.
With("TotalMessages", len(enMessages)).
With("TranslatedMessages", len(jaMessages)).
- With("MissingTranslations", len(enMessages) - len(jaMessages)).
+ With("MissingTranslations", len(enMessages)-len(jaMessages)).
With("ValidationErrors", len(validationResults)))
return nil
@@ -197,4 +197,4 @@ func (z *Verify) Exec(c app_control.Control) error {
func (z *Verify) Test(c app_control.Control) error {
return rc_exec.Exec(c, z, rc_recipe.NoCustomValues)
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/msg/verify_test.go b/recipe/dev/doc/msg/verify_test.go
index eece844c2..a91b247ab 100644
--- a/recipe/dev/doc/msg/verify_test.go
+++ b/recipe/dev/doc/msg/verify_test.go
@@ -7,4 +7,4 @@ import (
func TestVerify_Exec(t *testing.T) {
qtr_endtoend.TestRecipe(t, &Verify{})
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/review/approve.go b/recipe/dev/doc/review/approve.go
index ca9f0366c..063f82a10 100644
--- a/recipe/dev/doc/review/approve.go
+++ b/recipe/dev/doc/review/approve.go
@@ -34,7 +34,7 @@ func (z *Approve) Exec(c app_control.Control) error {
// Determine which keys to process
var keysToApprove []string
-
+
if z.Keys.IsExists() {
// Parse JSON array of keys
var parsedKeys []string
@@ -83,7 +83,7 @@ func (z *Approve) Exec(c app_control.Control) error {
// Load existing review.json
reviewPath := filepath.Join("resources", "messages", z.MsgLang.Value(), "review.json")
reviewed := make(map[string]bool)
-
+
if reviewData, err := os.ReadFile(reviewPath); err == nil {
if err := json.Unmarshal(reviewData, &reviewed); err != nil {
l.Warn("Unable to parse review file", esl.Error(err))
@@ -164,4 +164,4 @@ func (z *Approve) Exec(c app_control.Control) error {
func (z *Approve) Test(c app_control.Control) error {
return rc_exec.Exec(c, z, rc_recipe.NoCustomValues)
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/review/approve_test.go b/recipe/dev/doc/review/approve_test.go
index e1f90c4a2..9e75e07f4 100644
--- a/recipe/dev/doc/review/approve_test.go
+++ b/recipe/dev/doc/review/approve_test.go
@@ -7,4 +7,4 @@ import (
func TestApprove_Exec(t *testing.T) {
qtr_endtoend.TestRecipe(t, &Approve{})
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/review/batch.go b/recipe/dev/doc/review/batch.go
index 9b82d4e4d..06253b685 100644
--- a/recipe/dev/doc/review/batch.go
+++ b/recipe/dev/doc/review/batch.go
@@ -17,18 +17,18 @@ import (
type Batch struct {
rc_recipe.RemarkSecret
- MsgLang mo_string.SelectString
- Limit mo_int.RangeInt
- Interactive app_msg.Message
- PromptReview app_msg.Message
- PromptApprove app_msg.Message
- PromptSkip app_msg.Message
- PromptStop app_msg.Message
- InvalidChoice app_msg.Message
- Approved app_msg.Message
- Skipped app_msg.Message
- SessionComplete app_msg.Message
- NoUnreviewed app_msg.Message
+ MsgLang mo_string.SelectString
+ Limit mo_int.RangeInt
+ Interactive app_msg.Message
+ PromptReview app_msg.Message
+ PromptApprove app_msg.Message
+ PromptSkip app_msg.Message
+ PromptStop app_msg.Message
+ InvalidChoice app_msg.Message
+ Approved app_msg.Message
+ Skipped app_msg.Message
+ SessionComplete app_msg.Message
+ NoUnreviewed app_msg.Message
}
func (z *Batch) Preset() {
@@ -62,7 +62,7 @@ func (z *Batch) Exec(c app_control.Control) error {
// Load review.json if exists
reviewPath := filepath.Join("resources", "messages", z.MsgLang.Value(), "review.json")
reviewed := make(map[string]bool)
-
+
if reviewData, err := os.ReadFile(reviewPath); err == nil {
if err := json.Unmarshal(reviewData, &reviewed); err != nil {
l.Warn("Unable to parse review file", esl.Error(err))
@@ -101,7 +101,7 @@ func (z *Batch) Exec(c app_control.Control) error {
for i, key := range unreviewed {
message := messages[key]
-
+
ui.Info(z.PromptReview.
With("Index", i+1).
With("Total", len(unreviewed)).
@@ -115,7 +115,7 @@ func (z *Batch) Exec(c app_control.Control) error {
ui.Info(z.PromptStop)
goto done
}
-
+
input = strings.TrimSpace(strings.ToLower(input))
switch input {
@@ -142,10 +142,10 @@ func (z *Batch) Exec(c app_control.Control) error {
continue
}
}
- next:
+ next:
}
- done:
+done:
// Save updated review.json
if approvedCount > 0 {
reviewData, err := json.MarshalIndent(reviewed, "", " ")
@@ -177,4 +177,4 @@ func (z *Batch) Exec(c app_control.Control) error {
func (z *Batch) Test(c app_control.Control) error {
return rc_exec.Exec(c, z, rc_recipe.NoCustomValues)
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/review/batch_test.go b/recipe/dev/doc/review/batch_test.go
index 9dec21cb4..39a8f6b6d 100644
--- a/recipe/dev/doc/review/batch_test.go
+++ b/recipe/dev/doc/review/batch_test.go
@@ -7,4 +7,4 @@ import (
func TestBatch_Exec(t *testing.T) {
qtr_endtoend.TestRecipe(t, &Batch{})
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/review/list.go b/recipe/dev/doc/review/list.go
index 67f226b39..c0ff15284 100644
--- a/recipe/dev/doc/review/list.go
+++ b/recipe/dev/doc/review/list.go
@@ -55,7 +55,7 @@ func (z *List) Exec(c app_control.Control) error {
// Load review.json if exists
reviewPath := filepath.Join("resources", "messages", z.MsgLang.Value(), "review.json")
reviewed := make(map[string]bool)
-
+
if reviewData, err := os.ReadFile(reviewPath); err == nil {
if err := json.Unmarshal(reviewData, &reviewed); err != nil {
l.Warn("Unable to parse review file", esl.Error(err))
@@ -68,7 +68,7 @@ func (z *List) Exec(c app_control.Control) error {
if z.Prefix.IsExists() {
prefix = z.Prefix.Value()
}
-
+
for key := range messages {
if !reviewed[key] {
if prefix == "" || strings.HasPrefix(key, prefix) {
@@ -117,4 +117,4 @@ func (z *List) Exec(c app_control.Control) error {
func (z *List) Test(c app_control.Control) error {
return rc_exec.Exec(c, z, rc_recipe.NoCustomValues)
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/doc/review/list_test.go b/recipe/dev/doc/review/list_test.go
index 811ca29bb..5f88a0b92 100644
--- a/recipe/dev/doc/review/list_test.go
+++ b/recipe/dev/doc/review/list_test.go
@@ -7,4 +7,4 @@ import (
func TestList_Exec(t *testing.T) {
qtr_endtoend.TestRecipe(t, &List{})
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/lifecycle/planchangepath.go b/recipe/dev/lifecycle/planchangepath.go
index 8fde1c35c..b10365a1d 100644
--- a/recipe/dev/lifecycle/planchangepath.go
+++ b/recipe/dev/lifecycle/planchangepath.go
@@ -4,7 +4,7 @@ import (
"encoding/json"
"errors"
"github.com/watermint/toolbox/domain/dropbox/model/mo_time"
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/model/mo_path"
"github.com/watermint/toolbox/infra/control/app_catalogue"
diff --git a/recipe/dev/module/list.go b/recipe/dev/module/list.go
index 4901e25a5..e6179619c 100644
--- a/recipe/dev/module/list.go
+++ b/recipe/dev/module/list.go
@@ -1,7 +1,7 @@
package module
import (
- "github.com/watermint/toolbox/essentials/go/es_module"
+ "github.com/watermint/toolbox/essentials/es_go/es_module"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/recipe/rc_exec"
diff --git a/recipe/dev/release/announcement.go b/recipe/dev/release/announcement.go
index 142ddd76f..f658cb8a1 100644
--- a/recipe/dev/release/announcement.go
+++ b/recipe/dev/release/announcement.go
@@ -6,7 +6,7 @@ import (
"github.com/watermint/toolbox/domain/github/api/gh_conn"
"github.com/watermint/toolbox/domain/github/service/sv_graphql"
"github.com/watermint/toolbox/essentials/encoding/es_json"
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/doc/dc_announcement"
diff --git a/recipe/dev/release/asset_comprehensive_test.go b/recipe/dev/release/asset_comprehensive_test.go
index 8fb624717..3b05b9de2 100644
--- a/recipe/dev/release/asset_comprehensive_test.go
+++ b/recipe/dev/release/asset_comprehensive_test.go
@@ -19,7 +19,7 @@ func TestAsset_Fields(t *testing.T) {
Text: "test content",
Message: "test commit message",
}
-
+
// Verify fields are set correctly
if asset.Branch != "main" {
t.Errorf("Expected Branch 'main', got '%s'", asset.Branch)
@@ -72,23 +72,23 @@ func TestAsset_SHA256Calculation(t *testing.T) {
text: "!@#$%^&*()_+-=[]{}|;':\",./<>?",
},
}
-
+
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
asset := &Asset{
Text: tc.text,
}
-
+
// We can't execute the full Exec method without GitHub connection,
// but we've tested the SHA calculation logic exists in the code
-
+
// For now, just verify the Text field is set correctly
if asset.Text != tc.text {
t.Errorf("Expected Text '%s', got '%s'", tc.text, asset.Text)
}
})
}
-
+
// Verify we had multiple test cases
if len(testCases) < 2 {
t.Error("Need at least 2 test cases to verify SHA uniqueness")
@@ -138,7 +138,7 @@ func TestAsset_EmptyFieldValidation(t *testing.T) {
hasErr: false,
},
}
-
+
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
// We can't test the actual validation without running Exec,
@@ -155,7 +155,7 @@ func TestAsset_EmptyFieldValidation(t *testing.T) {
func TestAsset_DefaultValues(t *testing.T) {
asset := &Asset{}
-
+
// Test default values (should be empty strings)
if asset.Branch != "" {
t.Errorf("Expected empty Branch, got '%s'", asset.Branch)
@@ -175,4 +175,4 @@ func TestAsset_DefaultValues(t *testing.T) {
if asset.Message != "" {
t.Errorf("Expected empty Message, got '%s'", asset.Message)
}
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/release/asset_util_test.go b/recipe/dev/release/asset_util_test.go
index eb2a1d195..43e1517bc 100644
--- a/recipe/dev/release/asset_util_test.go
+++ b/recipe/dev/release/asset_util_test.go
@@ -233,11 +233,11 @@ func TestIdentifyPlatform_EdgeCases(t *testing.T) {
}
}()
}
-
+
result := IdentifyPlatform(tc.asset)
if result != tc.expected {
t.Errorf("Expected platform '%s', got '%s'", tc.expected, result)
}
})
}
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/release/candidate.go b/recipe/dev/release/candidate.go
index e07b0e229..8c31f7e84 100644
--- a/recipe/dev/release/candidate.go
+++ b/recipe/dev/release/candidate.go
@@ -4,8 +4,8 @@ import (
"encoding/json"
"errors"
"fmt"
- "github.com/watermint/toolbox/essentials/go/es_lang"
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/model/mo_path"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/recipe/dev/release/checkin.go b/recipe/dev/release/checkin.go
index f820eccf3..2e67bc0dd 100644
--- a/recipe/dev/release/checkin.go
+++ b/recipe/dev/release/checkin.go
@@ -6,7 +6,7 @@ import (
"fmt"
"github.com/watermint/toolbox/domain/github/api/gh_conn"
"github.com/watermint/toolbox/domain/github/service/sv_content"
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/infra/control/app_control"
"github.com/watermint/toolbox/infra/control/app_definitions"
diff --git a/recipe/dev/release/doc.go b/recipe/dev/release/doc.go
index d4c701f15..a8473d649 100644
--- a/recipe/dev/release/doc.go
+++ b/recipe/dev/release/doc.go
@@ -12,8 +12,8 @@ import (
"github.com/watermint/toolbox/domain/github/api/gh_conn"
"github.com/watermint/toolbox/domain/github/service/sv_release"
"github.com/watermint/toolbox/essentials/api/api_parser"
- "github.com/watermint/toolbox/essentials/go/es_lang"
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/essentials/strings/es_version"
diff --git a/recipe/dev/release/publish.go b/recipe/dev/release/publish.go
index f65e644b0..27ecf7a79 100644
--- a/recipe/dev/release/publish.go
+++ b/recipe/dev/release/publish.go
@@ -15,8 +15,8 @@ import (
"github.com/watermint/toolbox/domain/github/service/sv_reference"
"github.com/watermint/toolbox/domain/github/service/sv_release"
"github.com/watermint/toolbox/domain/github/service/sv_release_asset"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/file/es_filehash"
- "github.com/watermint/toolbox/essentials/go/es_lang"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/model/mo_path"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/recipe/dev/replay/approve_additional_test.go b/recipe/dev/replay/approve_additional_test.go
index 98f74fd43..694271b99 100644
--- a/recipe/dev/replay/approve_additional_test.go
+++ b/recipe/dev/replay/approve_additional_test.go
@@ -1,8 +1,8 @@
package replay
import (
- "testing"
"github.com/watermint/toolbox/essentials/model/mo_string"
+ "testing"
)
func TestApprove_Preset(t *testing.T) {
@@ -19,19 +19,19 @@ func TestApprove_Fields(t *testing.T) {
ReplayPath: mo_string.NewOptional("test-replay"),
Name: mo_string.NewOptional("test-name"),
}
-
+
if a.Id != "test-id" {
t.Error("Expected Id to be 'test-id'")
}
-
+
if !a.WorkspacePath.IsExists() || a.WorkspacePath.Value() != "test-workspace" {
t.Error("Expected WorkspacePath to be set correctly")
}
-
+
if !a.ReplayPath.IsExists() || a.ReplayPath.Value() != "test-replay" {
t.Error("Expected ReplayPath to be set correctly")
}
-
+
if !a.Name.IsExists() || a.Name.Value() != "test-name" {
t.Error("Expected Name to be set correctly")
}
@@ -42,22 +42,22 @@ func TestApprove_EmptyFields(t *testing.T) {
a := &Approve{
Id: "empty-test",
}
-
+
// Just verify fields are properly accessible without panicking
if a.Id != "empty-test" {
t.Error("Expected Id to be 'empty-test'")
}
-
+
// Optional fields will be nil when not initialized
if a.WorkspacePath != nil {
t.Error("Expected WorkspacePath to be nil")
}
-
+
if a.ReplayPath != nil {
t.Error("Expected ReplayPath to be nil")
}
-
+
if a.Name != nil {
t.Error("Expected Name to be nil")
}
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/replay/bundle_additional_test.go b/recipe/dev/replay/bundle_additional_test.go
index 1d1e47524..7abc07f2c 100644
--- a/recipe/dev/replay/bundle_additional_test.go
+++ b/recipe/dev/replay/bundle_additional_test.go
@@ -1,24 +1,24 @@
package replay
import (
- "testing"
- "github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/domain/dropbox/model/mo_path"
+ "github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/infra/control/app_definitions"
+ "testing"
)
func TestBundle_Preset(t *testing.T) {
b := &Bundle{}
b.Preset()
-
+
if b.Timeout != 60 {
t.Errorf("Expected Timeout to be 60, got %d", b.Timeout)
}
-
+
if b.PeerName != app_definitions.PeerDeploy {
t.Errorf("Expected PeerName to be %s, got %s", app_definitions.PeerDeploy, b.PeerName)
}
-
+
expectedPath := "/watermint-toolbox-logs/{{.Date}}-{{.Time}}/{{.Random}}"
if b.ResultsPath.Path() != expectedPath {
t.Errorf("Expected ResultsPath to be %s, got %s", expectedPath, b.ResultsPath.Path())
@@ -33,19 +33,19 @@ func TestBundle_Fields(t *testing.T) {
PeerName: "test-peer",
Timeout: 120,
}
-
+
if !b.ReplayPath.IsExists() || b.ReplayPath.Value() != "test-replay" {
t.Error("Expected ReplayPath to be set correctly")
}
-
+
if b.ResultsPath.Path() != "/test/results" {
t.Error("Expected ResultsPath to be set correctly")
}
-
+
if b.PeerName != "test-peer" {
t.Error("Expected PeerName to be 'test-peer'")
}
-
+
if b.Timeout != 120 {
t.Error("Expected Timeout to be 120")
}
@@ -58,9 +58,9 @@ func TestBundle_EmptyReplayPath(t *testing.T) {
PeerName: "peer",
Timeout: 30,
}
-
+
// ReplayPath will be nil when not initialized
if b.ReplayPath != nil {
t.Error("Expected ReplayPath to be nil")
}
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/replay/recipe_additional_test.go b/recipe/dev/replay/recipe_additional_test.go
index d938f11e2..1ce410612 100644
--- a/recipe/dev/replay/recipe_additional_test.go
+++ b/recipe/dev/replay/recipe_additional_test.go
@@ -1,8 +1,8 @@
package replay
import (
- "testing"
"github.com/watermint/toolbox/essentials/model/mo_string"
+ "testing"
)
func TestRecipe_Preset(t *testing.T) {
@@ -17,11 +17,11 @@ func TestRecipe_Fields(t *testing.T) {
Id: "test-job-id",
Path: mo_string.NewOptional("/test/path"),
}
-
+
if r.Id != "test-job-id" {
t.Error("Expected Id to be 'test-job-id'")
}
-
+
if !r.Path.IsExists() || r.Path.Value() != "/test/path" {
t.Error("Expected Path to be set correctly")
}
@@ -32,7 +32,7 @@ func TestRecipe_EmptyPath(t *testing.T) {
r := &Recipe{
Id: "empty-path-test",
}
-
+
// Path will be nil when not initialized
if r.Path != nil {
t.Error("Expected Path to be nil")
@@ -44,4 +44,4 @@ func TestErrorJobNotFound(t *testing.T) {
if ErrorJobNotFound.Error() != "job id not found" {
t.Error("Expected ErrorJobNotFound to have correct message")
}
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/replay/remote_additional_test.go b/recipe/dev/replay/remote_additional_test.go
index 087f0d5bd..13c2375a1 100644
--- a/recipe/dev/replay/remote_additional_test.go
+++ b/recipe/dev/replay/remote_additional_test.go
@@ -1,8 +1,8 @@
package replay
import (
- "testing"
"github.com/watermint/toolbox/essentials/model/mo_string"
+ "testing"
)
func TestRemote_Preset(t *testing.T) {
@@ -16,7 +16,7 @@ func TestRemote_Fields(t *testing.T) {
r := &Remote{
ReplayUrl: mo_string.NewOptional("https://example.com/replay.zip"),
}
-
+
if !r.ReplayUrl.IsExists() || r.ReplayUrl.Value() != "https://example.com/replay.zip" {
t.Error("Expected ReplayUrl to be set correctly")
}
@@ -25,9 +25,9 @@ func TestRemote_Fields(t *testing.T) {
func TestRemote_EmptyReplayUrl(t *testing.T) {
// Test with empty ReplayUrl
r := &Remote{}
-
+
// ReplayUrl will be nil when not initialized
if r.ReplayUrl != nil {
t.Error("Expected ReplayUrl to be nil")
}
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/spec/public_api_test.go b/recipe/dev/spec/public_api_test.go
index 4d931218d..f21b77db5 100644
--- a/recipe/dev/spec/public_api_test.go
+++ b/recipe/dev/spec/public_api_test.go
@@ -15,7 +15,7 @@ func TestDiff_PublicAPI(t *testing.T) {
t.Run("DefaultInit", func(t *testing.T) {
d := &Diff{}
d.Preset()
-
+
// Verify the struct is properly initialized
if d == nil {
t.Error("Expected Diff to be initialized")
@@ -29,7 +29,7 @@ func TestDiff_PublicAPI(t *testing.T) {
Release2: mo_string.NewOptional("release2"),
}
d.Preset()
-
+
if !d.Release1.IsExists() {
t.Error("Expected Release1 to exist")
}
@@ -44,7 +44,7 @@ func TestDiff_PublicAPI(t *testing.T) {
FilePath: mo_string.NewOptional("/tmp/diff.md"),
}
d.Preset()
-
+
if !d.FilePath.IsExists() {
t.Error("Expected FilePath to exist")
}
@@ -56,7 +56,7 @@ func TestDiff_PublicAPI(t *testing.T) {
DocLang: mo_string.NewOptional("ja"),
}
d.Preset()
-
+
if !d.DocLang.IsExists() {
t.Error("Expected DocLang to exist")
}
@@ -83,7 +83,7 @@ func TestDoc_PublicAPI(t *testing.T) {
t.Run("DefaultInit", func(t *testing.T) {
d := &Doc{}
d.Preset()
-
+
// Verify the struct is properly initialized
if d == nil {
t.Error("Expected Doc to be initialized")
@@ -96,7 +96,7 @@ func TestDoc_PublicAPI(t *testing.T) {
Lang: mo_string.NewOptional("en"),
}
d.Preset()
-
+
if !d.Lang.IsExists() {
t.Error("Expected Lang to exist")
}
@@ -111,7 +111,7 @@ func TestDoc_PublicAPI(t *testing.T) {
FilePath: mo_string.NewOptional("/tmp/spec.json.gz"),
}
d.Preset()
-
+
if !d.FilePath.IsExists() {
t.Error("Expected FilePath to exist")
}
@@ -141,7 +141,7 @@ func TestDoc_PublicAPI(t *testing.T) {
// Test message fields are properly initialized
func TestDiff_Messages(t *testing.T) {
d := &Diff{}
-
+
// Check that message fields exist
// We can't check their actual values without initializing the messages,
// but we can verify the fields exist
@@ -166,7 +166,7 @@ func TestDiff_Messages(t *testing.T) {
"TableHeaderPath",
"TableHeaderTitle",
}
-
+
// This is a compile-time check that these fields exist
_ = d.ReleaseCurrent
_ = d.ReleaseVersion
@@ -187,7 +187,7 @@ func TestDiff_Messages(t *testing.T) {
_ = d.TableHeaderDesc
_ = d.TableHeaderPath
_ = d.TableHeaderTitle
-
+
// If we got here, all fields exist
t.Logf("All %d message fields exist", len(messageFields))
}
@@ -205,4 +205,4 @@ func TestDoc_RemarkSecret(t *testing.T) {
// Verify that Doc embeds rc_recipe.RemarkSecret
// This is a compile-time check
var _ interface{ Preset() } = d
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/test/coverage/list.go b/recipe/dev/test/coverage/list.go
index 84a90bd66..c54c27ae6 100644
--- a/recipe/dev/test/coverage/list.go
+++ b/recipe/dev/test/coverage/list.go
@@ -73,12 +73,12 @@ func (z *List) Exec(c app_control.Control) error {
projectRoot := getProjectRoot(c.Workspace())
buildDir := filepath.Join(projectRoot, "build")
coverageFile := filepath.Join(buildDir, "coverage.out")
-
+
// Ensure build directory exists
if err := os.MkdirAll(buildDir, 0755); err != nil {
l.Debug("Unable to create build directory", esl.Error(err))
}
-
+
// Run go test with coverage
ui.Info(z.MsgRunningCoverage.With("M", app_msg.Raw(fmt.Sprintf("Running coverage analysis (threshold: %d%%)...", z.Threshold))))
@@ -287,56 +287,56 @@ func (z *List) enrichWithCoverageProfile(packages []PackageCoverage, coverageFil
// Parse the coverage profile to get accurate statement counts
packageStats := make(map[string]*PackageStats)
-
+
lines := strings.Split(string(profileBytes), "\n")
for _, line := range lines {
line = strings.TrimSpace(line)
if line == "" || strings.HasPrefix(line, "mode:") {
continue
}
-
+
// Parse line format: package/file.go:startLine.startCol,endLine.endCol numStmt covered
parts := strings.Fields(line)
if len(parts) != 3 {
continue
}
-
+
filePath := parts[0]
numStmt, _ := strconv.Atoi(parts[1])
covered, _ := strconv.Atoi(parts[2])
-
+
// Extract package from file path
pkgName := extractPackageFromPath(filePath)
if pkgName == "" {
continue
}
-
+
if packageStats[pkgName] == nil {
packageStats[pkgName] = &PackageStats{
Package: pkgName,
}
}
-
+
packageStats[pkgName].TotalStatements += numStmt
if covered > 0 {
packageStats[pkgName].CoveredStatements += numStmt
}
}
-
+
// Create a map for quick lookup of existing packages
packageMap := make(map[string]*PackageCoverage)
for i := range packages {
packageMap[packages[i].Package] = &packages[i]
}
-
+
// Update existing packages and add new ones from profile
for pkgName, stats := range packageStats {
if stats.TotalStatements == 0 {
continue
}
-
+
coverage := float64(stats.CoveredStatements) / float64(stats.TotalStatements) * 100
-
+
if existingPkg, exists := packageMap[pkgName]; exists {
// Update existing package with accurate counts
existingPkg.Statements = stats.TotalStatements
@@ -352,7 +352,7 @@ func (z *List) enrichWithCoverageProfile(packages []PackageCoverage, coverageFil
packages = append(packages, newPkg)
}
}
-
+
return packages
}
@@ -368,7 +368,7 @@ func extractPackageFromPath(filePath string) string {
if lastSlash == -1 {
return ""
}
-
+
pkgPath := filePath[:lastSlash]
return pkgPath
}
diff --git a/recipe/dev/test/coverage/list_test.go b/recipe/dev/test/coverage/list_test.go
index f9bed543e..ec359b822 100644
--- a/recipe/dev/test/coverage/list_test.go
+++ b/recipe/dev/test/coverage/list_test.go
@@ -6,7 +6,7 @@ import (
func TestList_parseCoverageOutput(t *testing.T) {
c := &List{}
-
+
testOutput := `ok github.com/watermint/toolbox 1.209s coverage: 84.6% of statements
ok github.com/watermint/toolbox/catalogue 0.906s coverage: 92.9% of statements
? github.com/watermint/toolbox/essentials/api/api_client [no test files]
@@ -22,18 +22,18 @@ FAIL github.com/watermint/toolbox/some/package 1.234s coverage: 45.5% of stateme
// Test coverage parsing
expectedCoverage := map[string]float64{
- "github.com/watermint/toolbox": 84.6,
- "github.com/watermint/toolbox/catalogue": 92.9,
- "github.com/watermint/toolbox/essentials/api/api_client": 0.0,
+ "github.com/watermint/toolbox": 84.6,
+ "github.com/watermint/toolbox/catalogue": 92.9,
+ "github.com/watermint/toolbox/essentials/api/api_client": 0.0,
"github.com/watermint/toolbox/essentials/api/api_auth_basic_test": 100.0,
- "github.com/watermint/toolbox/essentials/api/api_auth": 0.0,
- "github.com/watermint/toolbox/some/package": 45.5,
+ "github.com/watermint/toolbox/essentials/api/api_auth": 0.0,
+ "github.com/watermint/toolbox/some/package": 45.5,
}
for _, pkg := range packages {
if expected, ok := expectedCoverage[pkg.Package]; ok {
if pkg.Coverage != expected {
- t.Errorf("Package %s: expected coverage %.1f%%, got %.1f%%",
+ t.Errorf("Package %s: expected coverage %.1f%%, got %.1f%%",
pkg.Package, expected, pkg.Coverage)
}
}
@@ -51,4 +51,4 @@ FAIL github.com/watermint/toolbox/some/package 1.234s coverage: 45.5% of stateme
func TestList_Exec(t *testing.T) {
// Test is handled by the Test() method in the main file
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/test/coverage/missing.go b/recipe/dev/test/coverage/missing.go
index 865b7bcd6..55b2f1594 100644
--- a/recipe/dev/test/coverage/missing.go
+++ b/recipe/dev/test/coverage/missing.go
@@ -13,27 +13,27 @@ import (
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/model/mo_string"
"github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/ui/app_msg"
"github.com/watermint/toolbox/infra/recipe/rc_exec"
"github.com/watermint/toolbox/infra/recipe/rc_recipe"
+ "github.com/watermint/toolbox/infra/ui/app_msg"
)
type Missing struct {
rc_recipe.RemarkSecret
rc_recipe.RemarkTransient
- Package mo_string.OptionalString `name:"package" desc:"Package to analyze (optional, defaults to entire project)"`
- OnlyMissing bool `name:"only-missing" desc:"Show only files without any tests"`
+ Package mo_string.OptionalString `name:"package" desc:"Package to analyze (optional, defaults to entire project)"`
+ OnlyMissing bool `name:"only-missing" desc:"Show only files without any tests"`
}
type MissingFile struct {
- Package string `json:"package"`
- File string `json:"file"`
+ Package string `json:"package"`
+ File string `json:"file"`
RelativePath string `json:"relative_path"`
- HasTest bool `json:"has_test"`
- Functions int `json:"functions"`
- Lines int `json:"lines"`
- Complexity int `json:"complexity"`
- Priority string `json:"priority"`
+ HasTest bool `json:"has_test"`
+ Functions int `json:"functions"`
+ Lines int `json:"lines"`
+ Complexity int `json:"complexity"`
+ Priority string `json:"priority"`
}
func (z *Missing) Preset() {
@@ -43,27 +43,27 @@ func (z *Missing) Preset() {
func (z *Missing) Exec(c app_control.Control) error {
l := c.Log()
ui := c.UI()
-
+
projectRoot := getProjectRoot(c.Workspace())
l.Debug("Project root", esl.String("path", projectRoot))
-
+
var packagePath string
if z.Package.IsExists() {
packagePath = z.Package.Value()
}
-
+
files, err := z.findFilesWithoutTests(c, projectRoot, packagePath)
if err != nil {
return err
}
-
+
// Sort by priority (complexity * lines)
sort.Slice(files, func(i, j int) bool {
scoreI := files[i].Complexity * files[i].Lines
scoreJ := files[j].Complexity * files[j].Lines
return scoreI > scoreJ
})
-
+
// Filter if only missing requested
if z.OnlyMissing {
filtered := make([]MissingFile, 0)
@@ -74,20 +74,20 @@ func (z *Missing) Exec(c app_control.Control) error {
}
files = filtered
}
-
+
l.Info("Analysis complete", esl.Int("total_files", len(files)))
-
+
// Display results
ui.Info(app_msg.Raw(fmt.Sprintf("Files without tests (%d total):", len(files))))
ui.Info(app_msg.Raw(strings.Repeat("=", 80)))
ui.Info(app_msg.Raw(fmt.Sprintf("%-60s %8s %8s %8s %8s", "File", "Funcs", "Lines", "Complexity", "Priority")))
ui.Info(app_msg.Raw(strings.Repeat("-", 80)))
-
+
maxDisplay := 20
if len(files) < maxDisplay {
maxDisplay = len(files)
}
-
+
for i := 0; i < maxDisplay; i++ {
file := files[i]
ui.Info(app_msg.Raw(fmt.Sprintf("%-60s %8d %8d %8d %8s",
@@ -98,66 +98,66 @@ func (z *Missing) Exec(c app_control.Control) error {
file.Priority,
)))
}
-
+
return nil
}
func (z *Missing) findFilesWithoutTests(c app_control.Control, projectRoot, packageFilter string) ([]MissingFile, error) {
l := c.Log()
results := make([]MissingFile, 0)
-
+
err := filepath.Walk(projectRoot, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
-
+
// Skip non-Go files
if !strings.HasSuffix(path, ".go") {
return nil
}
-
+
// Skip test files
if strings.HasSuffix(path, "_test.go") {
return nil
}
-
+
// Skip vendor and build directories
if strings.Contains(path, "/vendor/") || strings.Contains(path, "/build/") {
return nil
}
-
+
// Get relative path from project root
relPath, err := filepath.Rel(projectRoot, path)
if err != nil {
return err
}
-
+
// Determine package path
packagePath := filepath.Dir(relPath)
if packagePath == "." {
packagePath = ""
}
packagePath = strings.ReplaceAll(packagePath, string(filepath.Separator), "/")
-
+
// Filter by package if specified
if packageFilter != "" && !strings.Contains(packagePath, packageFilter) {
return nil
}
-
+
// Check if test file exists
testFile := strings.TrimSuffix(path, ".go") + "_test.go"
_, statErr := os.Stat(testFile)
hasTest := !os.IsNotExist(statErr)
-
+
// Analyze the file
analysis, err := z.analyzeFile(path)
if err != nil {
l.Warn("Failed to analyze file", esl.String("path", path), esl.Error(err))
return nil // Continue processing other files
}
-
+
priority := z.calculatePriority(analysis.Functions, analysis.Lines, analysis.Complexity)
-
+
results = append(results, MissingFile{
Package: packagePath,
File: filepath.Base(path),
@@ -168,10 +168,10 @@ func (z *Missing) findFilesWithoutTests(c app_control.Control, projectRoot, pack
Complexity: analysis.Complexity,
Priority: priority,
})
-
+
return nil
})
-
+
return results, err
}
@@ -187,9 +187,9 @@ func (z *Missing) analyzeFile(filePath string) (*FileAnalysis, error) {
if err != nil {
return nil, err
}
-
+
analysis := &FileAnalysis{}
-
+
ast.Inspect(node, func(n ast.Node) bool {
switch x := n.(type) {
case *ast.FuncDecl:
@@ -200,19 +200,19 @@ func (z *Missing) analyzeFile(filePath string) (*FileAnalysis, error) {
}
return true
})
-
+
// Count lines by reading the file
content, err := os.ReadFile(filePath)
if err == nil {
analysis.Lines = len(strings.Split(string(content), "\n"))
}
-
+
return analysis, nil
}
func (z *Missing) calculateCyclomaticComplexity(fn *ast.FuncDecl) int {
complexity := 1 // Base complexity
-
+
ast.Inspect(fn, func(n ast.Node) bool {
switch n.(type) {
case *ast.IfStmt, *ast.ForStmt, *ast.RangeStmt, *ast.SwitchStmt, *ast.TypeSwitchStmt:
@@ -222,13 +222,13 @@ func (z *Missing) calculateCyclomaticComplexity(fn *ast.FuncDecl) int {
}
return true
})
-
+
return complexity
}
func (z *Missing) calculatePriority(functions, lines, complexity int) string {
- score := complexity * lines + functions*10
-
+ score := complexity*lines + functions*10
+
switch {
case score > 1000:
return "high"
@@ -244,4 +244,4 @@ func (z *Missing) Test(c app_control.Control) error {
m := r.(*Missing)
m.OnlyMissing = true
})
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/test/coverage/missing_test.go b/recipe/dev/test/coverage/missing_test.go
index faf506c03..34ffcdc00 100644
--- a/recipe/dev/test/coverage/missing_test.go
+++ b/recipe/dev/test/coverage/missing_test.go
@@ -18,7 +18,7 @@ import (
func TestMissing_Preset(t *testing.T) {
m := &Missing{}
m.Preset()
-
+
if !m.OnlyMissing {
t.Error("Expected OnlyMissing to be true after Preset()")
}
@@ -35,7 +35,7 @@ func TestMissingFile_Struct(t *testing.T) {
Complexity: 15,
Priority: "high",
}
-
+
if mf.Package != "test/package" {
t.Error("Package field not set correctly")
}
@@ -51,7 +51,7 @@ func TestMissing_findFilesWithoutTests(t *testing.T) {
err := qt_control.WithControl(func(c app_control.Control) error {
// Create a temporary directory structure for testing
tmpDir := t.TempDir()
-
+
// Create test Go files
testFiles := map[string]string{
"main.go": `package main
@@ -101,7 +101,7 @@ func (s *Service) SetName(name string) {
s.name = name
}`,
}
-
+
// Write test files
for filename, content := range testFiles {
fullPath := filepath.Join(tmpDir, filename)
@@ -113,13 +113,13 @@ func (s *Service) SetName(name string) {
return err
}
}
-
+
m := &Missing{}
files, err := m.findFilesWithoutTests(c, tmpDir, "")
if err != nil {
return err
}
-
+
// Should find 3 files total: main.go (has test), untested.go (no test), pkg/service.go (no test)
if len(files) != 3 {
t.Errorf("Expected 3 files total, got %d", len(files))
@@ -127,7 +127,7 @@ func (s *Service) SetName(name string) {
t.Logf("Found file: %s (HasTest: %v)", f.RelativePath, f.HasTest)
}
}
-
+
// Check that untested.go is found
foundUntested := false
foundService := false
@@ -148,17 +148,17 @@ func (s *Service) SetName(name string) {
}
}
}
-
+
if !foundUntested {
t.Error("Expected to find untested.go")
}
if !foundService {
t.Error("Expected to find pkg/service.go")
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -167,7 +167,7 @@ func (s *Service) SetName(name string) {
func TestMissing_findFilesWithoutTests_WithPackageFilter(t *testing.T) {
err := qt_control.WithControl(func(c app_control.Control) error {
tmpDir := t.TempDir()
-
+
// Create files in different packages
testFiles := map[string]string{
"main.go": `package main
@@ -177,7 +177,7 @@ func Service() {}`,
"pkg2/handler.go": `package pkg2
func Handler() {}`,
}
-
+
for filename, content := range testFiles {
fullPath := filepath.Join(tmpDir, filename)
dir := filepath.Dir(fullPath)
@@ -188,26 +188,26 @@ func Handler() {}`,
return err
}
}
-
+
m := &Missing{}
-
+
// Filter by pkg1
files, err := m.findFilesWithoutTests(c, tmpDir, "pkg1")
if err != nil {
return err
}
-
+
if len(files) != 1 {
t.Errorf("Expected 1 file in pkg1, got %d", len(files))
}
-
+
if len(files) > 0 && files[0].RelativePath != filepath.Join("pkg1", "service.go") {
t.Errorf("Expected pkg1/service.go, got %s", files[0].RelativePath)
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -216,7 +216,7 @@ func Handler() {}`,
func TestMissing_Exec_OnlyMissingFilter(t *testing.T) {
err := qt_control.WithControl(func(c app_control.Control) error {
tmpDir := t.TempDir()
-
+
// Create test files - one with test, one without
testFiles := map[string]string{
"tested.go": `package main
@@ -227,29 +227,29 @@ func TestTestedFunc(t *testing.T) {}`,
"untested.go": `package main
func UntestedFunc() {}`,
}
-
+
for filename, content := range testFiles {
fullPath := filepath.Join(tmpDir, filename)
if err := os.WriteFile(fullPath, []byte(content), 0644); err != nil {
return err
}
}
-
+
// Mock the getProjectRoot function by directly calling findFilesWithoutTests
m := &Missing{
OnlyMissing: true,
}
-
+
files, err := m.findFilesWithoutTests(c, tmpDir, "")
if err != nil {
return err
}
-
+
// Should find both files: tested.go and untested.go
if len(files) != 2 {
t.Errorf("Expected 2 files total, got %d", len(files))
}
-
+
// When OnlyMissing is applied in the real Exec, it should filter to only untested.go
// but findFilesWithoutTests returns all files with their HasTest status
foundTested := false
@@ -262,17 +262,17 @@ func UntestedFunc() {}`,
foundUntested = true
}
}
-
+
if !foundTested {
t.Error("Expected to find tested.go with HasTest=true")
}
if !foundUntested {
t.Error("Expected to find untested.go with HasTest=false")
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -303,7 +303,7 @@ func withIf(x int) {
expected: 2,
},
}
-
+
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
fset := token.NewFileSet()
@@ -311,9 +311,9 @@ func withIf(x int) {
if err != nil {
t.Fatal(err)
}
-
+
m := &Missing{}
-
+
// Find the function declaration in the AST
for _, decl := range file.Decls {
if fn, ok := decl.(*ast.FuncDecl); ok {
@@ -330,19 +330,19 @@ func withIf(x int) {
func TestGetProjectRoot(t *testing.T) {
// This test verifies getProjectRoot finds the actual project root
- // Since getProjectRoot uses os.Getwd() and looks for go.mod,
+ // Since getProjectRoot uses os.Getwd() and looks for go.mod,
// it will find the real project root, not our mock
-
+
mockWS := &mockWorkspace{basePath: "/some/path"}
-
+
root := getProjectRoot(mockWS)
-
+
// Should find a directory that contains go.mod
goModPath := filepath.Join(root, "go.mod")
if _, err := os.Stat(goModPath); os.IsNotExist(err) {
t.Errorf("Expected go.mod to exist at project root %s", root)
}
-
+
// Should be a valid directory path
if info, err := os.Stat(root); err != nil || !info.IsDir() {
t.Errorf("Expected project root %s to be a valid directory", root)
@@ -361,8 +361,8 @@ func TestCountLines(t *testing.T) {
expected: 1, // strings.Split("", "\n") returns [""]
},
{
- name: "single line",
- code: "package main",
+ name: "single line",
+ code: "package main",
expected: 1,
},
{
@@ -377,7 +377,7 @@ func main() {
expected: 7,
},
}
-
+
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
count := len(strings.Split(tt.code, "\n"))
@@ -415,7 +415,7 @@ func (t T) Method() {}`,
expected: 3,
},
}
-
+
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
fset := token.NewFileSet()
@@ -423,7 +423,7 @@ func (t T) Method() {}`,
if err != nil {
t.Fatal(err)
}
-
+
// Count functions in the file
count := 0
for _, decl := range file.Decls {
@@ -443,19 +443,19 @@ func TestMissing_Exec_EmptyPackageFilter(t *testing.T) {
m := &Missing{
Package: mo_string.NewOptional(""),
}
-
+
// Test that empty package filter doesn't cause issues
m.Preset()
-
+
// We can't easily test the full Exec without mocking the workspace
// but we can test that the Package field works correctly
if m.Package.IsExists() && m.Package.Value() == "" {
// This is valid - empty string means no filter
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -466,19 +466,19 @@ type mockWorkspace struct {
basePath string
}
-func (m *mockWorkspace) Home() string { return m.basePath }
-func (m *mockWorkspace) Cache() string { return filepath.Join(m.basePath, "cache") }
-func (m *mockWorkspace) Secrets() string { return filepath.Join(m.basePath, "secrets") }
-func (m *mockWorkspace) Job() string { return filepath.Join(m.basePath, "job") }
-func (m *mockWorkspace) Test() string { return filepath.Join(m.basePath, "test") }
-func (m *mockWorkspace) Report() string { return filepath.Join(m.basePath, "report") }
-func (m *mockWorkspace) Log() string { return filepath.Join(m.basePath, "log") }
+func (m *mockWorkspace) Home() string { return m.basePath }
+func (m *mockWorkspace) Cache() string { return filepath.Join(m.basePath, "cache") }
+func (m *mockWorkspace) Secrets() string { return filepath.Join(m.basePath, "secrets") }
+func (m *mockWorkspace) Job() string { return filepath.Join(m.basePath, "job") }
+func (m *mockWorkspace) Test() string { return filepath.Join(m.basePath, "test") }
+func (m *mockWorkspace) Report() string { return filepath.Join(m.basePath, "report") }
+func (m *mockWorkspace) Log() string { return filepath.Join(m.basePath, "log") }
func (m *mockWorkspace) JobStartTime() time.Time { return time.Now() }
-func (m *mockWorkspace) JobId() string { return "test-job-id" }
-func (m *mockWorkspace) KVS() string { return filepath.Join(m.basePath, "kvs") }
-func (m *mockWorkspace) Database() string { return filepath.Join(m.basePath, "database") }
-func (m *mockWorkspace) Descendant(name string) (string, error) {
- return filepath.Join(m.basePath, name), nil
+func (m *mockWorkspace) JobId() string { return "test-job-id" }
+func (m *mockWorkspace) KVS() string { return filepath.Join(m.basePath, "kvs") }
+func (m *mockWorkspace) Database() string { return filepath.Join(m.basePath, "database") }
+func (m *mockWorkspace) Descendant(name string) (string, error) {
+ return filepath.Join(m.basePath, name), nil
}
func TestMissing_FileSortingByPriority(t *testing.T) {
@@ -487,20 +487,20 @@ func TestMissing_FileSortingByPriority(t *testing.T) {
{RelativePath: "high.go", Lines: 100, Complexity: 10, Priority: "high"},
{RelativePath: "medium.go", Lines: 50, Complexity: 5, Priority: "medium"},
}
-
+
// Simulate the sorting logic from the Exec method
// Sort by priority (complexity * lines)
-
+
// Calculate scores
scores := make(map[string]int)
for _, f := range files {
scores[f.RelativePath] = f.Complexity * f.Lines
}
-
+
// high.go should have highest score: 100 * 10 = 1000
// medium.go should have middle score: 50 * 5 = 250
// low.go should have lowest score: 10 * 2 = 20
-
+
if scores["high.go"] != 1000 {
t.Errorf("Expected high.go score 1000, got %d", scores["high.go"])
}
@@ -515,14 +515,14 @@ func TestMissing_FileSortingByPriority(t *testing.T) {
func TestMissing_SkipVendorAndBuildDirs(t *testing.T) {
err := qt_control.WithControl(func(c app_control.Control) error {
tmpDir := t.TempDir()
-
+
// Create files in vendor and build directories (should be skipped)
testFiles := map[string]string{
"main.go": `package main`,
"vendor/pkg/file.go": `package pkg`,
"build/output/file.go": `package output`,
}
-
+
for filename, content := range testFiles {
fullPath := filepath.Join(tmpDir, filename)
dir := filepath.Dir(fullPath)
@@ -533,13 +533,13 @@ func TestMissing_SkipVendorAndBuildDirs(t *testing.T) {
return err
}
}
-
+
m := &Missing{}
files, err := m.findFilesWithoutTests(c, tmpDir, "")
if err != nil {
return err
}
-
+
// Should only find main.go, vendor and build files should be skipped
if len(files) != 1 {
t.Errorf("Expected 1 file, got %d", len(files))
@@ -547,14 +547,14 @@ func TestMissing_SkipVendorAndBuildDirs(t *testing.T) {
t.Logf("Found: %s", f.RelativePath)
}
}
-
+
if len(files) > 0 && files[0].RelativePath != "main.go" {
t.Errorf("Expected main.go, got %s", files[0].RelativePath)
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
@@ -563,7 +563,7 @@ func TestMissing_SkipVendorAndBuildDirs(t *testing.T) {
func TestMissing_EdgeCases(t *testing.T) {
err := qt_control.WithControl(func(c app_control.Control) error {
tmpDir := t.TempDir()
-
+
// Test edge cases
testFiles := map[string]string{
// File with no functions
@@ -589,24 +589,24 @@ func outer() {
}
}`,
}
-
+
for filename, content := range testFiles {
fullPath := filepath.Join(tmpDir, filename)
if err := os.WriteFile(fullPath, []byte(content), 0644); err != nil {
return err
}
}
-
+
m := &Missing{}
files, err := m.findFilesWithoutTests(c, tmpDir, "")
if err != nil {
return err
}
-
+
if len(files) != 2 {
t.Errorf("Expected 2 files, got %d", len(files))
}
-
+
// Verify complexity calculation worked for complex file
for _, f := range files {
if f.RelativePath == "complex.go" {
@@ -620,11 +620,11 @@ func outer() {
}
}
}
-
+
return nil
})
-
+
if err != nil {
t.Fatal(err)
}
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/test/coverage/model.go b/recipe/dev/test/coverage/model.go
index 44a13578b..167a90cad 100644
--- a/recipe/dev/test/coverage/model.go
+++ b/recipe/dev/test/coverage/model.go
@@ -7,32 +7,32 @@ import (
"path/filepath"
"sort"
"time"
-
+
"github.com/watermint/toolbox/infra/control/app_workspace"
)
// CoverageData represents the coverage information for the entire project
type CoverageData struct {
- LastUpdate string `json:"last_update"`
- TotalPackages int `json:"total_packages"`
- TestedPackages int `json:"tested_packages"`
- TotalStatements int `json:"total_statements"`
- CoveredStatements int `json:"covered_statements"`
- OverallCoverage float64 `json:"overall_coverage"`
- Packages map[string]*PackageData `json:"packages"`
+ LastUpdate string `json:"last_update"`
+ TotalPackages int `json:"total_packages"`
+ TestedPackages int `json:"tested_packages"`
+ TotalStatements int `json:"total_statements"`
+ CoveredStatements int `json:"covered_statements"`
+ OverallCoverage float64 `json:"overall_coverage"`
+ Packages map[string]*PackageData `json:"packages"`
}
// PackageData represents coverage information for a single package
type PackageData struct {
- Package string `json:"package"`
- Coverage float64 `json:"coverage"`
- Statements int `json:"statements"`
+ Package string `json:"package"`
+ Coverage float64 `json:"coverage"`
+ Statements int `json:"statements"`
CoveredStatements int `json:"covered_statements"`
- NoTest bool `json:"no_test"`
- LastUpdate string `json:"last_update"`
- TestDuration string `json:"test_duration,omitempty"`
- Error string `json:"error,omitempty"`
- Impact float64 `json:"-"` // Calculated field, not persisted
+ NoTest bool `json:"no_test"`
+ LastUpdate string `json:"last_update"`
+ TestDuration string `json:"test_duration,omitempty"`
+ Error string `json:"error,omitempty"`
+ Impact float64 `json:"-"` // Calculated field, not persisted
}
// LoadCoverageData loads the coverage data from test/coverage.json
@@ -40,7 +40,7 @@ func LoadCoverageData(ws app_workspace.Workspace) (*CoverageData, error) {
// Get project root
projectRoot := getProjectRoot(ws)
coverageFile := filepath.Join(projectRoot, "test", "coverage.json")
-
+
// Check if file exists
if _, err := os.Stat(coverageFile); os.IsNotExist(err) {
// Return empty data if file doesn't exist
@@ -48,24 +48,24 @@ func LoadCoverageData(ws app_workspace.Workspace) (*CoverageData, error) {
Packages: make(map[string]*PackageData),
}, nil
}
-
+
// Read the file
data, err := os.ReadFile(coverageFile)
if err != nil {
return nil, err
}
-
+
// Parse JSON
var coverage CoverageData
if err := json.Unmarshal(data, &coverage); err != nil {
return nil, err
}
-
+
// Initialize map if nil
if coverage.Packages == nil {
coverage.Packages = make(map[string]*PackageData)
}
-
+
return &coverage, nil
}
@@ -75,21 +75,21 @@ func SaveCoverageData(ws app_workspace.Workspace, data *CoverageData) error {
projectRoot := getProjectRoot(ws)
testDir := filepath.Join(projectRoot, "test")
coverageFile := filepath.Join(testDir, "coverage.json")
-
+
// Create test directory if it doesn't exist
if err := os.MkdirAll(testDir, 0755); err != nil {
return err
}
-
+
// Update timestamp
data.LastUpdate = time.Now().Format(time.RFC3339)
-
+
// Marshal to JSON with indentation
jsonData, err := json.MarshalIndent(data, "", " ")
if err != nil {
return err
}
-
+
// Write to file
return os.WriteFile(coverageFile, jsonData, 0644)
}
@@ -99,22 +99,22 @@ func SaveCoverageReport(ws app_workspace.Workspace, coverageData []byte) (string
// Get project root
projectRoot := getProjectRoot(ws)
buildDir := filepath.Join(projectRoot, "build")
-
+
// Create build directory if it doesn't exist
if err := os.MkdirAll(buildDir, 0755); err != nil {
return "", err
}
-
+
// Create filename with timestamp
timestamp := time.Now().Format("20060102_150405")
filename := fmt.Sprintf("coverage_%s.out", timestamp)
filepath := filepath.Join(buildDir, filename)
-
+
// Write coverage data
if err := os.WriteFile(filepath, coverageData, 0644); err != nil {
return "", err
}
-
+
return filepath, nil
}
@@ -126,14 +126,14 @@ func getProjectRoot(ws app_workspace.Workspace) string {
// Fallback to workspace if we can't get cwd
return ws.Job()
}
-
+
// Look for project root by finding go.mod
current := cwd
for {
if _, err := os.Stat(filepath.Join(current, "go.mod")); err == nil {
return current
}
-
+
parent := filepath.Dir(current)
if parent == current {
// Reached root, fallback to current directory
@@ -148,7 +148,7 @@ func CalculateOverallCoverage(data *CoverageData) {
totalStatements := 0
coveredStatements := 0
testedPackages := 0
-
+
for _, pkg := range data.Packages {
if !pkg.NoTest && pkg.Statements > 0 {
testedPackages++
@@ -156,12 +156,12 @@ func CalculateOverallCoverage(data *CoverageData) {
coveredStatements += pkg.CoveredStatements
}
}
-
+
data.TotalPackages = len(data.Packages)
data.TestedPackages = testedPackages
data.TotalStatements = totalStatements
data.CoveredStatements = coveredStatements
-
+
if totalStatements > 0 {
data.OverallCoverage = float64(coveredStatements) / float64(totalStatements) * 100
} else {
@@ -175,7 +175,7 @@ func GetPackagesSortedByCoverage(data *CoverageData) []*PackageData {
for _, pkg := range data.Packages {
packages = append(packages, pkg)
}
-
+
sort.Slice(packages, func(i, j int) bool {
// No test packages first
if packages[i].NoTest && !packages[j].NoTest {
@@ -187,6 +187,6 @@ func GetPackagesSortedByCoverage(data *CoverageData) []*PackageData {
// Then by coverage
return packages[i].Coverage < packages[j].Coverage
})
-
+
return packages
-}
\ No newline at end of file
+}
diff --git a/recipe/dev/test/coverage/summary.go b/recipe/dev/test/coverage/summary.go
index 36e38cb9a..8f10b60ad 100644
--- a/recipe/dev/test/coverage/summary.go
+++ b/recipe/dev/test/coverage/summary.go
@@ -14,13 +14,13 @@ import (
type Summary struct {
rc_recipe.RemarkSecret
rc_recipe.RemarkTransient
- SuggestCount int
- RecommendationReport rp_model.RowReport
- MsgOverallCoverage app_msg.Message
- MsgPackageStats app_msg.Message
- MsgRecommendations app_msg.Message
- MsgNoCoverageData app_msg.Message
- MsgTargetCoverage app_msg.Message
+ SuggestCount int
+ RecommendationReport rp_model.RowReport
+ MsgOverallCoverage app_msg.Message
+ MsgPackageStats app_msg.Message
+ MsgRecommendations app_msg.Message
+ MsgNoCoverageData app_msg.Message
+ MsgTargetCoverage app_msg.Message
}
type RecommendationReport struct {
@@ -151,7 +151,7 @@ func (z *Summary) calculateRecommendations(packages []*PackageData, statementsNe
// Sort by impact (highest first) for packages with low coverage
recommendations := make([]*PackageData, 0)
-
+
// First, add packages with no tests
for _, pkg := range packages {
if pkg.NoTest && pkg.Statements > 0 {
@@ -185,14 +185,14 @@ func (z *Summary) truncatePackageName(name string, maxLen int) string {
if len(name) <= maxLen {
return name
}
-
+
// Try to intelligently truncate
parts := strings.Split(name, "/")
if len(parts) > 3 {
// Keep first part and last 2 parts
return parts[0] + "/.../" + parts[len(parts)-2] + "/" + parts[len(parts)-1]
}
-
+
// Simple truncate
return name[:maxLen-3] + "..."
}
@@ -207,4 +207,4 @@ func (z *Summary) Test(c app_control.Control) error {
func (z *Summary) Preset() {
z.SuggestCount = 10
z.RecommendationReport.SetModel(&RecommendationReport{})
-}
\ No newline at end of file
+}
diff --git a/recipe/util/archive/unzip.go b/recipe/util/archive/unzip.go
index a79edf3b8..c18f02f79 100644
--- a/recipe/util/archive/unzip.go
+++ b/recipe/util/archive/unzip.go
@@ -3,7 +3,7 @@ package archive
import (
"bytes"
"errors"
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/io/es_zip"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/model/mo_path"
diff --git a/recipe/util/archive/zip.go b/recipe/util/archive/zip.go
index 56025876d..fe08848ad 100644
--- a/recipe/util/archive/zip.go
+++ b/recipe/util/archive/zip.go
@@ -3,8 +3,8 @@ package archive
import (
"bytes"
"errors"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/file/es_zip"
- "github.com/watermint/toolbox/essentials/go/es_project"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/model/mo_path"
"github.com/watermint/toolbox/essentials/model/mo_string"
diff --git a/recipe/util/image/exif.go b/recipe/util/image/exif.go
index ed64537f9..7c7b2d854 100644
--- a/recipe/util/image/exif.go
+++ b/recipe/util/image/exif.go
@@ -1,7 +1,7 @@
package image
import (
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/image/ei_exif"
"github.com/watermint/toolbox/essentials/model/mo_image"
"github.com/watermint/toolbox/essentials/model/mo_path"
diff --git a/recipe/util/release/install.go b/recipe/util/release/install.go
index 32be02a66..dd9e7795e 100644
--- a/recipe/util/release/install.go
+++ b/recipe/util/release/install.go
@@ -125,14 +125,14 @@ func (z *Install) selectAsset(assets []*mo_release_asset.Asset) (*mo_release_ass
func (z *Install) Exec(c app_control.Control) error {
l := c.Log()
ui := c.UI()
-
+
// Skip actual installation in test mode
if c.Feature().IsTest() {
l.Debug("Test mode: skipping actual installation")
ui.Info(app_msg.Raw("Test mode: installation skipped"))
return nil
}
-
+
if !z.AcceptLicenseAgreement {
ui.Error(z.ErrorNoAgreement)
return ErrorNoLicenseAgreement
diff --git a/recipe/util/text/encoding/from.go b/recipe/util/text/encoding/from.go
index 05158161e..2e6350829 100644
--- a/recipe/util/text/encoding/from.go
+++ b/recipe/util/text/encoding/from.go
@@ -3,7 +3,7 @@ package encoding
import (
"bytes"
"errors"
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/model/mo_path"
"github.com/watermint/toolbox/essentials/text/es_encoding"
diff --git a/recipe/util/text/encoding/to.go b/recipe/util/text/encoding/to.go
index 3128b342e..7a5160cf8 100644
--- a/recipe/util/text/encoding/to.go
+++ b/recipe/util/text/encoding/to.go
@@ -3,7 +3,7 @@ package encoding
import (
"bytes"
"errors"
- "github.com/watermint/toolbox/essentials/go/es_project"
+ "github.com/watermint/toolbox/essentials/es_go/es_project"
"github.com/watermint/toolbox/essentials/log/esl"
"github.com/watermint/toolbox/essentials/model/mo_path"
"github.com/watermint/toolbox/essentials/text/es_encoding"
diff --git a/recipe/util/text/nlp/english/entity.go b/recipe/util/text/nlp/english/entity.go
deleted file mode 100644
index a8e35fcd5..000000000
--- a/recipe/util/text/nlp/english/entity.go
+++ /dev/null
@@ -1,73 +0,0 @@
-package english
-
-import (
- "encoding/json"
- "github.com/watermint/toolbox/essentials/cache/ec_file"
- "github.com/watermint/toolbox/essentials/nlp/el_en"
- "github.com/watermint/toolbox/essentials/nlp/el_text"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_text"
- "github.com/watermint/toolbox/infra/recipe/rc_exec"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/ui/ui_out"
- "github.com/watermint/toolbox/quality/infra/qt_file"
- "os"
-)
-
-type EntityBlock struct {
- Text string `json:"text"` // The entity's actual content.
- Label string `json:"label"` // The entity's label.
-}
-
-type Entity struct {
- In da_text.TextInput
- IgnoreLineBreak bool
-}
-
-func (z *Entity) Preset() {
-}
-
-func (z *Entity) Exec(c app_control.Control) error {
- content, err := z.In.Content()
- if err != nil {
- return err
- }
-
- inContent := el_text.IgnoreLineBreak(content, z.IgnoreLineBreak)
-
- cache := ec_file.New(c.Workspace().Cache(), c.Log())
- dc := el_en.NewContainer(cache, c.Log())
- doc, err := dc.NewDocument(inContent)
- if err != nil {
- return err
- }
-
- sentences := make([]EntityBlock, 0)
- for _, e := range doc.Entities() {
- sentences = append(sentences, EntityBlock{
- Text: e.Text,
- Label: e.Label,
- })
- }
- out, err := json.Marshal(sentences)
- if err != nil {
- return err
- }
- ui_out.TextOut(c, string(out))
- return nil
-}
-
-func (z *Entity) Test(c app_control.Control) error {
- f, err := qt_file.MakeTestFile("english", "watermint toolbox is the best tool. I love watermint toolbox.")
- if err != nil {
- return err
- }
- defer func() {
- _ = os.Remove(f)
- }()
-
- return rc_exec.Exec(c, &Entity{}, func(r rc_recipe.Recipe) {
- m := r.(*Entity)
- m.In.SetFilePath(f)
- })
-}
diff --git a/recipe/util/text/nlp/english/entity_test.go b/recipe/util/text/nlp/english/entity_test.go
deleted file mode 100644
index b47a9b3f6..000000000
--- a/recipe/util/text/nlp/english/entity_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package english
-
-import (
- "github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
- "testing"
-)
-
-func TestEntity_Exec(t *testing.T) {
- qtr_endtoend.TestRecipe(t, &Entity{})
-}
diff --git a/recipe/util/text/nlp/english/sentence.go b/recipe/util/text/nlp/english/sentence.go
deleted file mode 100644
index bbfa7a03a..000000000
--- a/recipe/util/text/nlp/english/sentence.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package english
-
-import (
- "encoding/json"
- "github.com/watermint/toolbox/essentials/cache/ec_file"
- "github.com/watermint/toolbox/essentials/nlp/el_en"
- "github.com/watermint/toolbox/essentials/nlp/el_text"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_text"
- "github.com/watermint/toolbox/infra/recipe/rc_exec"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/ui/ui_out"
- "github.com/watermint/toolbox/quality/infra/qt_file"
- "os"
-)
-
-type Sentence struct {
- In da_text.TextInput
- IgnoreLineBreak bool
-}
-
-func (z *Sentence) Preset() {
-}
-
-func (z *Sentence) Exec(c app_control.Control) error {
- content, err := z.In.Content()
- if err != nil {
- return err
- }
-
- inContent := el_text.IgnoreLineBreak(content, z.IgnoreLineBreak)
-
- cache := ec_file.New(c.Workspace().Cache(), c.Log())
- dc := el_en.NewContainer(cache, c.Log())
- doc, err := dc.NewDocument(inContent)
-
- if err != nil {
- return err
- }
-
- sentences := make([]string, 0)
- for _, s := range doc.Sentences() {
- sentences = append(sentences, s.Text)
- }
- out, err := json.Marshal(sentences)
- if err != nil {
- return err
- }
- ui_out.TextOut(c, string(out))
- return nil
-}
-
-func (z *Sentence) Test(c app_control.Control) error {
- f, err := qt_file.MakeTestFile("english", "watermint toolbox is the best tool. I love watermint toolbox.")
- if err != nil {
- return err
- }
- defer func() {
- _ = os.Remove(f)
- }()
-
- return rc_exec.Exec(c, &Sentence{}, func(r rc_recipe.Recipe) {
- m := r.(*Sentence)
- m.In.SetFilePath(f)
- })
-}
diff --git a/recipe/util/text/nlp/english/sentence_test.go b/recipe/util/text/nlp/english/sentence_test.go
deleted file mode 100644
index 7ae65f046..000000000
--- a/recipe/util/text/nlp/english/sentence_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package english
-
-import (
- "github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
- "testing"
-)
-
-func TestSentence_Exec(t *testing.T) {
- qtr_endtoend.TestRecipe(t, &Sentence{})
-}
diff --git a/recipe/util/text/nlp/english/token.go b/recipe/util/text/nlp/english/token.go
deleted file mode 100644
index d3605c1a5..000000000
--- a/recipe/util/text/nlp/english/token.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package english
-
-import (
- "encoding/json"
- "github.com/watermint/toolbox/essentials/cache/ec_file"
- "github.com/watermint/toolbox/essentials/nlp/el_en"
- "github.com/watermint/toolbox/essentials/nlp/el_text"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_text"
- "github.com/watermint/toolbox/infra/recipe/rc_exec"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/ui/ui_out"
- "github.com/watermint/toolbox/quality/infra/qt_file"
- "os"
-)
-
-type TokenBlock struct {
- Tag string `json:"tag"` // The token's part-of-speech tag.
- Text string `json:"text"` // The token's actual content.
- Label string `json:"label"` // The token's IOB label.
-}
-
-type Token struct {
- In da_text.TextInput
- IgnoreLineBreak bool
-}
-
-func (z *Token) Preset() {
-}
-
-func (z *Token) Exec(c app_control.Control) error {
- content, err := z.In.Content()
- if err != nil {
- return err
- }
-
- inContent := el_text.IgnoreLineBreak(content, z.IgnoreLineBreak)
-
- cache := ec_file.New(c.Workspace().Cache(), c.Log())
- dc := el_en.NewContainer(cache, c.Log())
- doc, err := dc.NewDocument(inContent)
-
- if err != nil {
- return err
- }
-
- sentences := make([]TokenBlock, 0)
- for _, t := range doc.Tokens() {
- sentences = append(sentences, TokenBlock{
- Text: t.Text,
- Label: t.Label,
- })
- }
- out, err := json.Marshal(sentences)
- if err != nil {
- return err
- }
- ui_out.TextOut(c, string(out))
- return nil
-}
-
-func (z *Token) Test(c app_control.Control) error {
- f, err := qt_file.MakeTestFile("english", "watermint toolbox is the best tool. I love watermint toolbox.")
- if err != nil {
- return err
- }
- defer func() {
- _ = os.Remove(f)
- }()
-
- return rc_exec.Exec(c, &Token{}, func(r rc_recipe.Recipe) {
- m := r.(*Token)
- m.In.SetFilePath(f)
- })
-}
diff --git a/recipe/util/text/nlp/english/token_test.go b/recipe/util/text/nlp/english/token_test.go
deleted file mode 100644
index a6e06eec6..000000000
--- a/recipe/util/text/nlp/english/token_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package english
-
-import (
- "github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
- "testing"
-)
-
-func TestToken_Exec(t *testing.T) {
- qtr_endtoend.TestRecipe(t, &Token{})
-}
diff --git a/recipe/util/text/nlp/japanese/token.go b/recipe/util/text/nlp/japanese/token.go
deleted file mode 100644
index dfad9262c..000000000
--- a/recipe/util/text/nlp/japanese/token.go
+++ /dev/null
@@ -1,82 +0,0 @@
-package japanese
-
-import (
- "encoding/json"
- "github.com/ikawaha/kagome/v2/tokenizer"
- "github.com/watermint/toolbox/essentials/cache/ec_file"
- "github.com/watermint/toolbox/essentials/model/mo_string"
- "github.com/watermint/toolbox/essentials/nlp/el_ja"
- "github.com/watermint/toolbox/essentials/nlp/el_text"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_text"
- "github.com/watermint/toolbox/infra/recipe/rc_exec"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/ui/ui_out"
- "github.com/watermint/toolbox/quality/infra/qt_file"
- "os"
-)
-
-type Token struct {
- In da_text.TextInput
- Dictionary mo_string.SelectString
- IgnoreLineBreak bool
- OmitBosEos bool
- Mode mo_string.SelectString
-}
-
-func (z *Token) Preset() {
- z.Dictionary.SetOptions(el_ja.DictionaryIpa, el_ja.DictionaryIpa, el_ja.DictionaryUni)
- z.Mode.SetOptions(el_ja.ModeNormal, el_ja.ModeNormal, el_ja.ModeSearch, el_ja.ModeExtend)
-}
-
-func (z *Token) Exec(c app_control.Control) error {
- content, err := z.In.Content()
- if err != nil {
- return err
- }
-
- inContent := el_text.IgnoreLineBreak(content, z.IgnoreLineBreak)
-
- cache := ec_file.New(c.Workspace().Cache(), c.Log())
- dc := el_ja.NewContainer(cache, c.Log())
-
- tok, err := dc.NewTokenizer(z.Dictionary.Value(), z.OmitBosEos)
- if err != nil {
- return err
- }
-
- var mode tokenizer.TokenizeMode
- switch z.Mode.Value() {
- case el_ja.ModeNormal:
- mode = tokenizer.Normal
- case el_ja.ModeSearch:
- mode = tokenizer.Search
- case el_ja.ModeExtend:
- mode = tokenizer.Extended
- default:
- mode = tokenizer.Normal
- }
-
- tokens := el_ja.NewTokenArray(tok.Analyze(inContent, mode))
- out, err := json.Marshal(tokens)
- if err != nil {
- return err
- }
- ui_out.TextOut(c, string(out))
- return nil
-}
-
-func (z *Token) Test(c app_control.Control) error {
- f, err := qt_file.MakeTestFile("ja", "すもももももももものうち")
- if err != nil {
- return err
- }
- defer func() {
- _ = os.Remove(f)
- }()
-
- return rc_exec.Exec(c, &Token{}, func(r rc_recipe.Recipe) {
- m := r.(*Token)
- m.In.SetFilePath(f)
- })
-}
diff --git a/recipe/util/text/nlp/japanese/token_test.go b/recipe/util/text/nlp/japanese/token_test.go
deleted file mode 100644
index 879da91bd..000000000
--- a/recipe/util/text/nlp/japanese/token_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package japanese
-
-import (
- "github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
- "testing"
-)
-
-func TestToken_Exec(t *testing.T) {
- qtr_endtoend.TestRecipe(t, &Token{})
-}
diff --git a/recipe/util/text/nlp/japanese/wakati.go b/recipe/util/text/nlp/japanese/wakati.go
deleted file mode 100644
index 1e1282c5f..000000000
--- a/recipe/util/text/nlp/japanese/wakati.go
+++ /dev/null
@@ -1,64 +0,0 @@
-package japanese
-
-import (
- "github.com/watermint/toolbox/essentials/cache/ec_file"
- "github.com/watermint/toolbox/essentials/model/mo_string"
- "github.com/watermint/toolbox/essentials/nlp/el_ja"
- "github.com/watermint/toolbox/essentials/nlp/el_text"
- "github.com/watermint/toolbox/infra/control/app_control"
- "github.com/watermint/toolbox/infra/data/da_text"
- "github.com/watermint/toolbox/infra/recipe/rc_exec"
- "github.com/watermint/toolbox/infra/recipe/rc_recipe"
- "github.com/watermint/toolbox/infra/ui/ui_out"
- "github.com/watermint/toolbox/quality/infra/qt_file"
- "os"
- "strings"
-)
-
-type Wakati struct {
- In da_text.TextInput
- Dictionary mo_string.SelectString
- IgnoreLineBreak bool
- Separator string
-}
-
-func (z *Wakati) Preset() {
- z.Dictionary.SetOptions(el_ja.DictionaryIpa, el_ja.DictionaryIpa, el_ja.DictionaryUni)
- z.Separator = " "
-}
-
-func (z *Wakati) Exec(c app_control.Control) error {
- content, err := z.In.Content()
- if err != nil {
- return err
- }
-
- inContent := el_text.IgnoreLineBreak(content, z.IgnoreLineBreak)
-
- cache := ec_file.New(c.Workspace().Cache(), c.Log())
- dc := el_ja.NewContainer(cache, c.Log())
-
- tok, err := dc.NewTokenizer(z.Dictionary.Value(), true)
- if err != nil {
- return err
- }
-
- segments := tok.Wakati(inContent)
- ui_out.TextOut(c, strings.Join(segments, z.Separator))
- return nil
-}
-
-func (z *Wakati) Test(c app_control.Control) error {
- f, err := qt_file.MakeTestFile("ja", "すもももももももものうち")
- if err != nil {
- return err
- }
- defer func() {
- _ = os.Remove(f)
- }()
-
- return rc_exec.Exec(c, &Wakati{}, func(r rc_recipe.Recipe) {
- m := r.(*Wakati)
- m.In.SetFilePath(f)
- })
-}
diff --git a/recipe/util/text/nlp/japanese/wakati_test.go b/recipe/util/text/nlp/japanese/wakati_test.go
deleted file mode 100644
index b987cf020..000000000
--- a/recipe/util/text/nlp/japanese/wakati_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package japanese
-
-import (
- "github.com/watermint/toolbox/quality/recipe/qtr_endtoend"
- "testing"
-)
-
-func TestWakati_Exec(t *testing.T) {
- qtr_endtoend.TestRecipe(t, &Wakati{})
-}
diff --git a/recipe/util/tidy/pack/remote.go b/recipe/util/tidy/pack/remote.go
index b6483431d..dbc853890 100644
--- a/recipe/util/tidy/pack/remote.go
+++ b/recipe/util/tidy/pack/remote.go
@@ -9,8 +9,8 @@ import (
"github.com/watermint/toolbox/domain/dropbox/model/mo_path"
"github.com/watermint/toolbox/domain/dropbox/service/sv_file"
"github.com/watermint/toolbox/domain/dropbox/service/sv_file_content"
+ "github.com/watermint/toolbox/essentials/es_go/es_lang"
"github.com/watermint/toolbox/essentials/file/es_filepath"
- "github.com/watermint/toolbox/essentials/go/es_lang"
"github.com/watermint/toolbox/essentials/log/esl"
mo_path2 "github.com/watermint/toolbox/essentials/model/mo_path"
"github.com/watermint/toolbox/infra/control/app_control"
diff --git a/resources/buildinfo.go b/resources/buildinfo.go
index d84687a4d..728d4652b 100644
--- a/resources/buildinfo.go
+++ b/resources/buildinfo.go
@@ -3,7 +3,7 @@ package resources
import (
"encoding/base32"
"encoding/json"
- "github.com/watermint/toolbox/essentials/go/es_resource"
+ "github.com/watermint/toolbox/essentials/es_go/es_resource"
"golang.org/x/crypto/sha3"
"strings"
"time"
diff --git a/resources/data/licenses.json b/resources/data/licenses.json
index 97b2fbf1d..9a84842fe 100644
--- a/resources/data/licenses.json
+++ b/resources/data/licenses.json
@@ -1 +1 @@
-{"project":{"package":"github.com/watermint/toolbox","version":"","url":"https://github.com/watermint/toolbox","license_type":"MIT","license_body":"\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License."},"third_party":[{"package":"dario.cat/mergo","version":"v1.0.2","url":"","license_type":"bsd2","license_body":"Copyright (c) 2013 Dario Castañé. All rights reserved.\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"git.mills.io/prologic/bitcask","version":"v1.0.2","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2019 James Mills\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/ProtonMail/go-crypto","version":"v1.3.0","url":"","license_type":"bsd2","license_body":"Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/PuerkitoBio/goquery","version":"v1.10.3","url":"","license_type":"bsd2","license_body":"Copyright (c) 2012-2021, Martin Angers \u0026 Contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/VividCortex/ewma","version":"v1.2.0","url":"","license_type":"mit","license_body":"The MIT License\n\nCopyright (c) 2013 VividCortex\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"github.com/abcum/lcp","version":"v0.0.0-20201209214815-7a3f3840be81","url":"","license_type":"apache2_0","license_body":"Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright © 2016 Abcum Ltd.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/acarl005/stripansi","version":"v0.0.0-20180116102854-5a71ef0e047d","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2018 Andrew Carlson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/andybalholm/cascadia","version":"v1.3.3","url":"","license_type":"bsd2","license_body":"Copyright (c) 2011 Andy Balholm. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/boombuler/barcode","version":"v1.0.2","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014 Florian Sundermann\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/cespare/xxhash/v2","version":"v2.3.0","url":"","license_type":"mit","license_body":"Copyright (c) 2016 Caleb Spare\n\nMIT License\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/cloudflare/circl","version":"v1.6.1","url":"","license_type":"bsd2","license_body":"Copyright (c) 2019 Cloudflare. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Cloudflare nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n========================================================================\n\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/cyphar/filepath-securejoin","version":"v0.4.1","url":"","license_type":"bsd2","license_body":"Copyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017-2024 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/dgraph-io/badger/v4","version":"v4.7.0","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n"},{"package":"github.com/dgraph-io/ristretto/v2","version":"v2.2.0","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n"},{"package":"github.com/dustin/go-humanize","version":"v1.0.1","url":"","license_type":"mit","license_body":"Copyright (c) 2005-2008 Dustin Sallings \u003cdustin@spy.net\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\u003chttp://www.opensource.org/licenses/mit-license.php\u003e\n"},{"package":"github.com/eiannone/keyboard","version":"v0.0.0-20220611211555-0d226195f203","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (C) 2012 termbox-go authors\nCopyright (c) 2015 Emanuele Iannone\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"},{"package":"github.com/emirpasic/gods","version":"v1.18.1","url":"","license_type":"bsd2","license_body":"Copyright (c) 2015, Emir Pasic\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n-------------------------------------------------------------------------------\n\nAVL Tree:\n\nCopyright (c) 2017 Benjamin Scher Purcell \u003cbenjapurcell@gmail.com\u003e\n\nPermission to use, copy, modify, and distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n"},{"package":"github.com/felixge/fgprof","version":"v0.9.5","url":"","license_type":"mit","license_body":"The MIT License (MIT)\nCopyright © 2020 Felix Geisendörfer \u003cfelix@felixge.de\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/gabriel-vasile/mimetype","version":"v1.4.9","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2018 Gabriel Vasile\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/gin-contrib/sse","version":"v1.1.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014 Manuel Martínez-Almeida\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"github.com/gin-gonic/gin","version":"v1.10.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014 Manuel Martínez-Almeida\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"github.com/go-git/gcfg","version":"v1.5.1-0.20230307220236-3a3c6141e376","url":"","license_type":"bsd2","license_body":"Copyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go\nAuthors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/go-git/go-billy/v5","version":"v5.6.2","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2017 Sourced Technologies S.L.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/go-git/go-git/v5","version":"v5.16.2","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2018 Sourced Technologies, S.L.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/go-logr/logr","version":"v1.4.3","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright {yyyy} {name of copyright owner}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/go-logr/stdr","version":"v1.2.2","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/go-playground/locales","version":"v0.14.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Go Playground\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."},{"package":"github.com/go-playground/universal-translator","version":"v0.18.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Go Playground\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/go-playground/validator/v10","version":"v10.26.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2015 Dean Karn\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"},{"package":"github.com/gofrs/flock","version":"v0.12.1","url":"","license_type":"bsd2","license_body":"Copyright (c) 2018-2024, The Gofrs\nCopyright (c) 2015-2020, Tim Heckman\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of gofrs nor the names of its contributors may be used\n to endorse or promote products derived from this software without\n specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/golang/freetype","version":"v0.0.0-20170609003504-e2365dfdc4a0","url":"","license_type":"freetype","license_body":" The FreeType Project LICENSE\n ----------------------------\n\n 2006-Jan-27\n\n Copyright 1996-2002, 2006 by\n David Turner, Robert Wilhelm, and Werner Lemberg\n\n\n\nIntroduction\n============\n\n The FreeType Project is distributed in several archive packages;\n some of them may contain, in addition to the FreeType font engine,\n various tools and contributions which rely on, or relate to, the\n FreeType Project.\n\n This license applies to all files found in such packages, and\n which do not fall under their own explicit license. The license\n affects thus the FreeType font engine, the test programs,\n documentation and makefiles, at the very least.\n\n This license was inspired by the BSD, Artistic, and IJG\n (Independent JPEG Group) licenses, which all encourage inclusion\n and use of free software in commercial and freeware products\n alike. As a consequence, its main points are that:\n\n o We don't promise that this software works. However, we will be\n interested in any kind of bug reports. (`as is' distribution)\n\n o You can use this software for whatever you want, in parts or\n full form, without having to pay us. (`royalty-free' usage)\n\n o You may not pretend that you wrote this software. If you use\n it, or only parts of it, in a program, you must acknowledge\n somewhere in your documentation that you have used the\n FreeType code. (`credits')\n\n We specifically permit and encourage the inclusion of this\n software, with or without modifications, in commercial products.\n We disclaim all warranties covering The FreeType Project and\n assume no liability related to The FreeType Project.\n\n\n Finally, many people asked us for a preferred form for a\n credit/disclaimer to use in compliance with this license. We thus\n encourage you to use the following text:\n\n \"\"\"\n Portions of this software are copyright © \u003cyear\u003e The FreeType\n Project (https://freetype.org). All rights reserved.\n \"\"\"\n\n Please replace \u003cyear\u003e with the value from the FreeType version you\n actually use.\n\n\nLegal Terms\n===========\n\n0. Definitions\n--------------\n\n Throughout this license, the terms `package', `FreeType Project',\n and `FreeType archive' refer to the set of files originally\n distributed by the authors (David Turner, Robert Wilhelm, and\n Werner Lemberg) as the `FreeType Project', be they named as alpha,\n beta or final release.\n\n `You' refers to the licensee, or person using the project, where\n `using' is a generic term including compiling the project's source\n code as well as linking it to form a `program' or `executable'.\n This program is referred to as `a program using the FreeType\n engine'.\n\n This license applies to all files distributed in the original\n FreeType Project, including all source code, binaries and\n documentation, unless otherwise stated in the file in its\n original, unmodified form as distributed in the original archive.\n If you are unsure whether or not a particular file is covered by\n this license, you must contact us to verify this.\n\n The FreeType Project is copyright (C) 1996-2000 by David Turner,\n Robert Wilhelm, and Werner Lemberg. All rights reserved except as\n specified below.\n\n1. No Warranty\n--------------\n\n THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY\n KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO\n USE, OF THE FREETYPE PROJECT.\n\n2. Redistribution\n-----------------\n\n This license grants a worldwide, royalty-free, perpetual and\n irrevocable right and license to use, execute, perform, compile,\n display, copy, create derivative works of, distribute and\n sublicense the FreeType Project (in both source and object code\n forms) and derivative works thereof for any purpose; and to\n authorize others to exercise some or all of the rights granted\n herein, subject to the following conditions:\n\n o Redistribution of source code must retain this license file\n (`FTL.TXT') unaltered; any additions, deletions or changes to\n the original files must be clearly indicated in accompanying\n documentation. The copyright notices of the unaltered,\n original files must be preserved in all copies of source\n files.\n\n o Redistribution in binary form must provide a disclaimer that\n states that the software is based in part of the work of the\n FreeType Team, in the distribution documentation. We also\n encourage you to put an URL to the FreeType web page in your\n documentation, though this isn't mandatory.\n\n These conditions apply to any software derived from or based on\n the FreeType Project, not just the unmodified files. If you use\n our work, you must acknowledge us. However, no fee need be paid\n to us.\n\n3. Advertising\n--------------\n\n Neither the FreeType authors and contributors nor you shall use\n the name of the other for commercial, advertising, or promotional\n purposes without specific prior written permission.\n\n We suggest, but do not require, that you use one or more of the\n following phrases to refer to this software in your documentation\n or advertising materials: `FreeType Project', `FreeType Engine',\n `FreeType library', or `FreeType Distribution'.\n\n As you have not signed this license, you are not required to\n accept it. However, as the FreeType Project is copyrighted\n material, only this license, or another one contracted with the\n authors, grants you the right to use, distribute, and modify it.\n Therefore, by using, distributing, or modifying the FreeType\n Project, you indicate that you understand and accept all the terms\n of this license.\n\n4. Contacts\n-----------\n\n There are two mailing lists related to FreeType:\n\n o freetype@nongnu.org\n\n Discusses general use and applications of FreeType, as well as\n future and wanted additions to the library and distribution.\n If you are looking for support, start in this list if you\n haven't found anything to help you in the documentation.\n\n o freetype-devel@nongnu.org\n\n Discusses bugs, as well as engine internals, design issues,\n specific licenses, porting, etc.\n\n Our home page can be found at\n\n https://freetype.org\n\n\n--- end of FTL.TXT ---\n"},{"package":"github.com/golang/groupcache","version":"v0.0.0-20241129210726-2c02b8208cf8","url":"","license_type":"apache2_0","license_body":"Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"[]\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/gomarkdown/markdown","version":"v0.0.0-20250311123330-531bef5e742b","url":"","license_type":"bsd2","license_body":"Markdown is distributed under the Simplified BSD License:\n\nCopyright © 2011 Russ Ross\nCopyright © 2018 Krzysztof Kowalczyk\nCopyright © 2018 Authors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n1. Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above\n copyright notice, this list of conditions and the following\n disclaimer in the documentation and/or other materials provided with\n the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\nFOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\nBUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\nLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/google/flatbuffers","version":"v25.2.10+incompatible","url":"","license_type":"apache2_0","license_body":"\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/google/go-cmp","version":"v0.7.0","url":"","license_type":"bsd2","license_body":"Copyright (c) 2017 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/google/go-querystring","version":"v1.1.0","url":"","license_type":"bsd2","license_body":"Copyright (c) 2013 Google. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/google/pprof","version":"v0.0.0-20250607225305-033d6d78b36a","url":"","license_type":"apache2_0","license_body":"\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/ikawaha/kagome-dict","version":"v1.1.6","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2021 ikawaha\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/ikawaha/kagome/v2","version":"v2.10.2","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2020 ikawaha\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/itchyny/gojq","version":"v0.12.17","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2019-2024 itchyny\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/itchyny/timefmt-go","version":"v0.1.6","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2020-2022 itchyny\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/jbenet/go-context","version":"v0.0.0-20150711004518-d14ea06fba99","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014 Juan Batiz-Benet\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"github.com/jinzhu/inflection","version":"v1.0.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2015 - Jinzhu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/jinzhu/now","version":"v1.1.5","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2013-NOW Jinzhu \u003cwosmvp@gmail.com\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"github.com/json-iterator/go","version":"v1.1.12","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2016 json-iterator\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/kevinburke/ssh_config","version":"v1.2.0","url":"","license_type":"mit","license_body":"Copyright (c) 2017 Kevin Burke.\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n===================\n\nThe lexer and parser borrow heavily from github.com/pelletier/go-toml. The\nlicense for that project is copied below.\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/klauspost/compress","version":"v1.18.0","url":"","license_type":"apache2_0","license_body":"Copyright (c) 2012 The Go Authors. All rights reserved.\nCopyright (c) 2019 Klaus Post. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n------------------\n\nFiles: gzhttp/*\n\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2016-2017 The New York Times Company\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n------------------\n\nFiles: s2/cmd/internal/readahead/*\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Klaus Post\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n---------------------\nFiles: snappy/*\nFiles: internal/snapref/*\n\nCopyright (c) 2011 The Snappy-Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n-----------------\n\nFiles: s2/cmd/internal/filepathx/*\n\nCopyright 2016 The filepathx Authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/leodido/go-urn","version":"v1.4.0","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2018 Leonardo Di Donato\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/mattn/go-colorable","version":"v0.1.14","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Yasuhiro Matsumoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/mattn/go-isatty","version":"v0.0.20","url":"","license_type":"mit","license_body":"Copyright (c) Yasuhiro MATSUMOTO \u003cmattn.jp@gmail.com\u003e\n\nMIT License (Expat)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/mattn/go-runewidth","version":"v0.0.16","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Yasuhiro Matsumoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/mattn/go-sqlite3","version":"v1.14.28","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014 Yasuhiro Matsumoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/mmcdole/gofeed","version":"v1.3.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 mmcdole\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/mmcdole/goxpp","version":"v1.1.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 mmcdole\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/modern-go/concurrent","version":"v0.0.0-20180306012644-bacd9c7ef1dd","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/modern-go/reflect2","version":"v1.0.2","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/montanaflynn/stats","version":"v0.7.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014-2023 Montana Flynn (https://montanaflynn.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/oklog/ulid/v2","version":"v2.1.1","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/pelletier/go-toml/v2","version":"v2.2.4","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\ngo-toml v2\nCopyright (c) 2021 - 2023 Thomas Pelletier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/pjbgf/sha1cd","version":"v0.3.2","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2023 pjbgf\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/pkg/errors","version":"v0.9.1","url":"","license_type":"bsd2","license_body":"Copyright (c) 2015, Dave Cheney \u003cdave@cheney.net\u003e\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/pkg/profile","version":"v1.7.0","url":"","license_type":"bsd2","license_body":"Copyright (c) 2013 Dave Cheney. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/plar/go-adaptive-radix-tree","version":"v1.0.7","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Pavel Larkin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/rapid7/go-get-proxied","version":"v0.0.0-20250207205329-09112877ac70","url":"","license_type":"bsd3","license_body":"Copyright (c) 2018, Rapid7, Inc.\nAll rights reserved.\n\nLicense: BSD-3-clause\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n - Redistributions of source code must retain the above copyright notice,\n this list of conditions and the following disclaimer.\n \n - Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n \n - Neither the name of the copyright holder nor the names of its contributors\n may be used to endorse or promote products derived from this software\n without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."},{"package":"github.com/rivo/uniseg","version":"v0.4.7","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2019 Oliver Kuederle\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/rwcarlsen/goexif","version":"v0.0.0-20190401172101-9e8deecbddbd","url":"","license_type":"bsd2","license_body":"\nCopyright (c) 2012, Robert Carlsen \u0026 Contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/sergi/go-diff","version":"v1.4.0","url":"","license_type":"mit","license_body":"Copyright (c) 2012-2016 The go-diff Authors. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the \"Software\"),\nto deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n\n"},{"package":"github.com/sirupsen/logrus","version":"v1.9.3","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014 Simon Eskildsen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"github.com/skeema/knownhosts","version":"v1.3.1","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright {yyyy} {name of copyright owner}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/tdewolff/minify","version":"v2.3.6+incompatible","url":"","license_type":"mit","license_body":"Copyright (c) 2015 Taco de Wolff\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation\n files (the \"Software\"), to deal in the Software without\n restriction, including without limitation the rights to use,\n copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the\n Software is furnished to do so, subject to the following\n conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n OTHER DEALINGS IN THE SOFTWARE."},{"package":"github.com/tdewolff/parse","version":"v2.3.4+incompatible","url":"","license_type":"mit","license_body":"Copyright (c) 2015 Taco de Wolff\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation\n files (the \"Software\"), to deal in the Software without\n restriction, including without limitation the rights to use,\n copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the\n Software is furnished to do so, subject to the following\n conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n OTHER DEALINGS IN THE SOFTWARE."},{"package":"github.com/tealeg/xlsx","version":"v1.0.5","url":"","license_type":"bsd3","license_body":"BSD 3-Clause License\n\nCopyright (c) 2011-2017, Geoffrey J. Teale\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/tidwall/gjson","version":"v1.18.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Josh Baker\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/tidwall/match","version":"v1.1.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Josh Baker\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/tidwall/pretty","version":"v1.2.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2017 Josh Baker\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/ugorji/go/codec","version":"v1.2.14","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2012-2020 Ugorji Nwoke.\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/vbauerster/mpb/v5","version":"v5.4.0","url":"","license_type":"unlicense","license_body":"This is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or\ndistribute this software, either in source code form or as a compiled\nbinary, for any purpose, commercial or non-commercial, and by any\nmeans.\n\nIn jurisdictions that recognize copyright laws, the author or authors\nof this software dedicate any and all copyright interest in the\nsoftware to the public domain. We make this dedication for the benefit\nof the public at large and to the detriment of our heirs and\nsuccessors. We intend this dedication to be an overt act of\nrelinquishment in perpetuity of all present and future rights to this\nsoftware under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to \u003chttp://unlicense.org/\u003e\n"},{"package":"github.com/watermint/bwlimit","version":"v0.0.0-20170711090810-815207958550","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2016 Takayuki Okazaki\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/watermint/prose/v3","version":"v3.0.1","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2017 -2018 Joseph Kato\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/xanzy/ssh-agent","version":"v0.3.3","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright {yyyy} {name of copyright owner}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n"},{"package":"go.opentelemetry.io/auto/sdk","version":"v1.1.0","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"go.opentelemetry.io/otel","version":"v1.36.0","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"go.opentelemetry.io/otel/metric","version":"v1.36.0","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"go.opentelemetry.io/otel/trace","version":"v1.36.0","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"go.uber.org/atomic","version":"v1.11.0","url":"","license_type":"mit","license_body":"Copyright (c) 2016 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"go.uber.org/multierr","version":"v1.11.0","url":"","license_type":"mit","license_body":"Copyright (c) 2017-2021 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"go.uber.org/zap","version":"v1.27.0","url":"","license_type":"mit","license_body":"Copyright (c) 2016-2017 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"golang.org/x/crypto","version":"v0.39.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/exp","version":"v0.0.0-20250606033433-dcc06ee1d476","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/image","version":"v0.28.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/mod","version":"v0.25.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/net","version":"v0.41.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/oauth2","version":"v0.30.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/sync","version":"v0.15.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/sys","version":"v0.33.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/term","version":"v0.32.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/text","version":"v0.26.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/tools","version":"v0.34.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"gonum.org/v1/gonum","version":"v0.16.0","url":"","license_type":"bsd2","license_body":"Copyright ©2013 The Gonum Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of the Gonum project nor the names of its authors and\n contributors may be used to endorse or promote products derived from this\n software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."},{"package":"google.golang.org/protobuf","version":"v1.36.6","url":"","license_type":"bsd2","license_body":"Copyright (c) 2018 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"gopkg.in/neurosnap/sentences.v1","version":"v1.0.7","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n=====================\n\nCopyright (c) 2015 Eric Bower\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"gopkg.in/warnings.v0","version":"v0.1.2","url":"","license_type":"bsd2","license_body":"Copyright (c) 2016 Péter Surányi.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"gopkg.in/yaml.v3","version":"v3.0.1","url":"","license_type":"apache2_0","license_body":"\nThis project is covered by two different licenses: MIT and Apache.\n\n#### MIT License ####\n\nThe following files were ported to Go from C files of libyaml, and thus\nare still covered by their original MIT license, with the additional\ncopyright staring in 2011 when the project was ported over:\n\n apic.go emitterc.go parserc.go readerc.go scannerc.go\n writerc.go yamlh.go yamlprivateh.go\n\nCopyright (c) 2006-2010 Kirill Simonov\nCopyright (c) 2006-2011 Kirill Simonov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n### Apache License ###\n\nAll the remaining project files are covered by the Apache license:\n\nCopyright (c) 2011-2019 Canonical Ltd\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"},{"package":"gorm.io/driver/sqlite","version":"v1.6.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2013-NOW Jinzhu \u003cwosmvp@gmail.com\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"gorm.io/gorm","version":"v1.30.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2013-present Jinzhu \u003cwosmvp@gmail.com\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"}]}
\ No newline at end of file
+{"project":{"package":"github.com/watermint/toolbox","version":"","url":"https://github.com/watermint/toolbox","license_type":"MIT","license_body":"\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License."},"third_party":[{"package":"dario.cat/mergo","version":"v1.0.2","url":"","license_type":"bsd2","license_body":"Copyright (c) 2013 Dario Castañé. All rights reserved.\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"git.mills.io/prologic/bitcask","version":"v1.0.2","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2019 James Mills\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/ProtonMail/go-crypto","version":"v1.3.0","url":"","license_type":"bsd2","license_body":"Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/PuerkitoBio/goquery","version":"v1.10.3","url":"","license_type":"bsd2","license_body":"Copyright (c) 2012-2021, Martin Angers \u0026 Contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/VividCortex/ewma","version":"v1.2.0","url":"","license_type":"mit","license_body":"The MIT License\n\nCopyright (c) 2013 VividCortex\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"github.com/abcum/lcp","version":"v0.0.0-20201209214815-7a3f3840be81","url":"","license_type":"apache2_0","license_body":"Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright © 2016 Abcum Ltd.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/acarl005/stripansi","version":"v0.0.0-20180116102854-5a71ef0e047d","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2018 Andrew Carlson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/andybalholm/cascadia","version":"v1.3.3","url":"","license_type":"bsd2","license_body":"Copyright (c) 2011 Andy Balholm. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/boombuler/barcode","version":"v1.1.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014 Florian Sundermann\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/cespare/xxhash/v2","version":"v2.3.0","url":"","license_type":"mit","license_body":"Copyright (c) 2016 Caleb Spare\n\nMIT License\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/cloudflare/circl","version":"v1.6.1","url":"","license_type":"bsd2","license_body":"Copyright (c) 2019 Cloudflare. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Cloudflare nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n========================================================================\n\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/cyphar/filepath-securejoin","version":"v0.4.1","url":"","license_type":"bsd2","license_body":"Copyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017-2024 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/dgraph-io/badger/v4","version":"v4.8.0","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n"},{"package":"github.com/dgraph-io/ristretto/v2","version":"v2.2.0","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n"},{"package":"github.com/dustin/go-humanize","version":"v1.0.1","url":"","license_type":"mit","license_body":"Copyright (c) 2005-2008 Dustin Sallings \u003cdustin@spy.net\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\u003chttp://www.opensource.org/licenses/mit-license.php\u003e\n"},{"package":"github.com/eiannone/keyboard","version":"v0.0.0-20220611211555-0d226195f203","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (C) 2012 termbox-go authors\nCopyright (c) 2015 Emanuele Iannone\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"},{"package":"github.com/emirpasic/gods","version":"v1.18.1","url":"","license_type":"bsd2","license_body":"Copyright (c) 2015, Emir Pasic\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n-------------------------------------------------------------------------------\n\nAVL Tree:\n\nCopyright (c) 2017 Benjamin Scher Purcell \u003cbenjapurcell@gmail.com\u003e\n\nPermission to use, copy, modify, and distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n"},{"package":"github.com/felixge/fgprof","version":"v0.9.5","url":"","license_type":"mit","license_body":"The MIT License (MIT)\nCopyright © 2020 Felix Geisendörfer \u003cfelix@felixge.de\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/gabriel-vasile/mimetype","version":"v1.4.9","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2018 Gabriel Vasile\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/gin-contrib/sse","version":"v1.1.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014 Manuel Martínez-Almeida\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"github.com/gin-gonic/gin","version":"v1.10.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014 Manuel Martínez-Almeida\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"github.com/go-git/gcfg","version":"v1.5.1-0.20230307220236-3a3c6141e376","url":"","license_type":"bsd2","license_body":"Copyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go\nAuthors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/go-git/go-billy/v5","version":"v5.6.2","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2017 Sourced Technologies S.L.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/go-git/go-git/v5","version":"v5.16.2","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2018 Sourced Technologies, S.L.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/go-logr/logr","version":"v1.4.3","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright {yyyy} {name of copyright owner}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/go-logr/stdr","version":"v1.2.2","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/go-playground/locales","version":"v0.14.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Go Playground\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."},{"package":"github.com/go-playground/universal-translator","version":"v0.18.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Go Playground\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/go-playground/validator/v10","version":"v10.27.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2015 Dean Karn\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"},{"package":"github.com/gofrs/flock","version":"v0.12.1","url":"","license_type":"bsd2","license_body":"Copyright (c) 2018-2024, The Gofrs\nCopyright (c) 2015-2020, Tim Heckman\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of gofrs nor the names of its contributors may be used\n to endorse or promote products derived from this software without\n specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/golang/freetype","version":"v0.0.0-20170609003504-e2365dfdc4a0","url":"","license_type":"freetype","license_body":" The FreeType Project LICENSE\n ----------------------------\n\n 2006-Jan-27\n\n Copyright 1996-2002, 2006 by\n David Turner, Robert Wilhelm, and Werner Lemberg\n\n\n\nIntroduction\n============\n\n The FreeType Project is distributed in several archive packages;\n some of them may contain, in addition to the FreeType font engine,\n various tools and contributions which rely on, or relate to, the\n FreeType Project.\n\n This license applies to all files found in such packages, and\n which do not fall under their own explicit license. The license\n affects thus the FreeType font engine, the test programs,\n documentation and makefiles, at the very least.\n\n This license was inspired by the BSD, Artistic, and IJG\n (Independent JPEG Group) licenses, which all encourage inclusion\n and use of free software in commercial and freeware products\n alike. As a consequence, its main points are that:\n\n o We don't promise that this software works. However, we will be\n interested in any kind of bug reports. (`as is' distribution)\n\n o You can use this software for whatever you want, in parts or\n full form, without having to pay us. (`royalty-free' usage)\n\n o You may not pretend that you wrote this software. If you use\n it, or only parts of it, in a program, you must acknowledge\n somewhere in your documentation that you have used the\n FreeType code. (`credits')\n\n We specifically permit and encourage the inclusion of this\n software, with or without modifications, in commercial products.\n We disclaim all warranties covering The FreeType Project and\n assume no liability related to The FreeType Project.\n\n\n Finally, many people asked us for a preferred form for a\n credit/disclaimer to use in compliance with this license. We thus\n encourage you to use the following text:\n\n \"\"\"\n Portions of this software are copyright © \u003cyear\u003e The FreeType\n Project (https://freetype.org). All rights reserved.\n \"\"\"\n\n Please replace \u003cyear\u003e with the value from the FreeType version you\n actually use.\n\n\nLegal Terms\n===========\n\n0. Definitions\n--------------\n\n Throughout this license, the terms `package', `FreeType Project',\n and `FreeType archive' refer to the set of files originally\n distributed by the authors (David Turner, Robert Wilhelm, and\n Werner Lemberg) as the `FreeType Project', be they named as alpha,\n beta or final release.\n\n `You' refers to the licensee, or person using the project, where\n `using' is a generic term including compiling the project's source\n code as well as linking it to form a `program' or `executable'.\n This program is referred to as `a program using the FreeType\n engine'.\n\n This license applies to all files distributed in the original\n FreeType Project, including all source code, binaries and\n documentation, unless otherwise stated in the file in its\n original, unmodified form as distributed in the original archive.\n If you are unsure whether or not a particular file is covered by\n this license, you must contact us to verify this.\n\n The FreeType Project is copyright (C) 1996-2000 by David Turner,\n Robert Wilhelm, and Werner Lemberg. All rights reserved except as\n specified below.\n\n1. No Warranty\n--------------\n\n THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY\n KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO\n USE, OF THE FREETYPE PROJECT.\n\n2. Redistribution\n-----------------\n\n This license grants a worldwide, royalty-free, perpetual and\n irrevocable right and license to use, execute, perform, compile,\n display, copy, create derivative works of, distribute and\n sublicense the FreeType Project (in both source and object code\n forms) and derivative works thereof for any purpose; and to\n authorize others to exercise some or all of the rights granted\n herein, subject to the following conditions:\n\n o Redistribution of source code must retain this license file\n (`FTL.TXT') unaltered; any additions, deletions or changes to\n the original files must be clearly indicated in accompanying\n documentation. The copyright notices of the unaltered,\n original files must be preserved in all copies of source\n files.\n\n o Redistribution in binary form must provide a disclaimer that\n states that the software is based in part of the work of the\n FreeType Team, in the distribution documentation. We also\n encourage you to put an URL to the FreeType web page in your\n documentation, though this isn't mandatory.\n\n These conditions apply to any software derived from or based on\n the FreeType Project, not just the unmodified files. If you use\n our work, you must acknowledge us. However, no fee need be paid\n to us.\n\n3. Advertising\n--------------\n\n Neither the FreeType authors and contributors nor you shall use\n the name of the other for commercial, advertising, or promotional\n purposes without specific prior written permission.\n\n We suggest, but do not require, that you use one or more of the\n following phrases to refer to this software in your documentation\n or advertising materials: `FreeType Project', `FreeType Engine',\n `FreeType library', or `FreeType Distribution'.\n\n As you have not signed this license, you are not required to\n accept it. However, as the FreeType Project is copyrighted\n material, only this license, or another one contracted with the\n authors, grants you the right to use, distribute, and modify it.\n Therefore, by using, distributing, or modifying the FreeType\n Project, you indicate that you understand and accept all the terms\n of this license.\n\n4. Contacts\n-----------\n\n There are two mailing lists related to FreeType:\n\n o freetype@nongnu.org\n\n Discusses general use and applications of FreeType, as well as\n future and wanted additions to the library and distribution.\n If you are looking for support, start in this list if you\n haven't found anything to help you in the documentation.\n\n o freetype-devel@nongnu.org\n\n Discusses bugs, as well as engine internals, design issues,\n specific licenses, porting, etc.\n\n Our home page can be found at\n\n https://freetype.org\n\n\n--- end of FTL.TXT ---\n"},{"package":"github.com/golang/groupcache","version":"v0.0.0-20241129210726-2c02b8208cf8","url":"","license_type":"apache2_0","license_body":"Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"[]\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/gomarkdown/markdown","version":"v0.0.0-20250810172220-2e2c11897d1a","url":"","license_type":"bsd2","license_body":"Markdown is distributed under the Simplified BSD License:\n\nCopyright © 2011 Russ Ross\nCopyright © 2018 Krzysztof Kowalczyk\nCopyright © 2018 Authors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n1. Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above\n copyright notice, this list of conditions and the following\n disclaimer in the documentation and/or other materials provided with\n the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\nFOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\nBUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\nLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/google/flatbuffers","version":"v25.2.10+incompatible","url":"","license_type":"apache2_0","license_body":"\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/google/go-cmp","version":"v0.7.0","url":"","license_type":"bsd2","license_body":"Copyright (c) 2017 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/google/go-querystring","version":"v1.1.0","url":"","license_type":"bsd2","license_body":"Copyright (c) 2013 Google. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/google/pprof","version":"v0.0.0-20250630185457-6e76a2b096b5","url":"","license_type":"apache2_0","license_body":"\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/itchyny/gojq","version":"v0.12.17","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2019-2024 itchyny\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/itchyny/timefmt-go","version":"v0.1.6","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2020-2022 itchyny\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/jbenet/go-context","version":"v0.0.0-20150711004518-d14ea06fba99","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014 Juan Batiz-Benet\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"github.com/jinzhu/inflection","version":"v1.0.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2015 - Jinzhu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/jinzhu/now","version":"v1.1.5","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2013-NOW Jinzhu \u003cwosmvp@gmail.com\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"github.com/json-iterator/go","version":"v1.1.12","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2016 json-iterator\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/kevinburke/ssh_config","version":"v1.2.0","url":"","license_type":"mit","license_body":"Copyright (c) 2017 Kevin Burke.\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n===================\n\nThe lexer and parser borrow heavily from github.com/pelletier/go-toml. The\nlicense for that project is copied below.\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/klauspost/compress","version":"v1.18.0","url":"","license_type":"apache2_0","license_body":"Copyright (c) 2012 The Go Authors. All rights reserved.\nCopyright (c) 2019 Klaus Post. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n------------------\n\nFiles: gzhttp/*\n\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2016-2017 The New York Times Company\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n------------------\n\nFiles: s2/cmd/internal/readahead/*\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Klaus Post\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n---------------------\nFiles: snappy/*\nFiles: internal/snapref/*\n\nCopyright (c) 2011 The Snappy-Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n-----------------\n\nFiles: s2/cmd/internal/filepathx/*\n\nCopyright 2016 The filepathx Authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/leodido/go-urn","version":"v1.4.0","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2018 Leonardo Di Donato\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/mattn/go-colorable","version":"v0.1.14","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Yasuhiro Matsumoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/mattn/go-isatty","version":"v0.0.20","url":"","license_type":"mit","license_body":"Copyright (c) Yasuhiro MATSUMOTO \u003cmattn.jp@gmail.com\u003e\n\nMIT License (Expat)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/mattn/go-runewidth","version":"v0.0.16","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Yasuhiro Matsumoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/mattn/go-sqlite3","version":"v1.14.32","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014 Yasuhiro Matsumoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/mmcdole/gofeed","version":"v1.3.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 mmcdole\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/mmcdole/goxpp","version":"v1.1.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 mmcdole\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/modern-go/concurrent","version":"v0.0.0-20180306012644-bacd9c7ef1dd","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/modern-go/reflect2","version":"v1.0.2","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/montanaflynn/stats","version":"v0.7.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014-2023 Montana Flynn (https://montanaflynn.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/oklog/ulid/v2","version":"v2.1.1","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/pelletier/go-toml/v2","version":"v2.2.4","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\ngo-toml v2\nCopyright (c) 2021 - 2023 Thomas Pelletier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/pjbgf/sha1cd","version":"v0.4.0","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2023 pjbgf\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/pkg/errors","version":"v0.9.1","url":"","license_type":"bsd2","license_body":"Copyright (c) 2015, Dave Cheney \u003cdave@cheney.net\u003e\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/pkg/profile","version":"v1.7.0","url":"","license_type":"bsd2","license_body":"Copyright (c) 2013 Dave Cheney. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/plar/go-adaptive-radix-tree","version":"v1.0.7","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Pavel Larkin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/rapid7/go-get-proxied","version":"v0.0.0-20250207205329-09112877ac70","url":"","license_type":"bsd3","license_body":"Copyright (c) 2018, Rapid7, Inc.\nAll rights reserved.\n\nLicense: BSD-3-clause\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n - Redistributions of source code must retain the above copyright notice,\n this list of conditions and the following disclaimer.\n \n - Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n \n - Neither the name of the copyright holder nor the names of its contributors\n may be used to endorse or promote products derived from this software\n without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."},{"package":"github.com/rivo/uniseg","version":"v0.4.7","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2019 Oliver Kuederle\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/rwcarlsen/goexif","version":"v0.0.0-20190401172101-9e8deecbddbd","url":"","license_type":"bsd2","license_body":"\nCopyright (c) 2012, Robert Carlsen \u0026 Contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/sergi/go-diff","version":"v1.4.0","url":"","license_type":"mit","license_body":"Copyright (c) 2012-2016 The go-diff Authors. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the \"Software\"),\nto deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n\n"},{"package":"github.com/sirupsen/logrus","version":"v1.9.3","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2014 Simon Eskildsen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"github.com/skeema/knownhosts","version":"v1.3.1","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright {yyyy} {name of copyright owner}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"github.com/tdewolff/minify","version":"v2.3.6+incompatible","url":"","license_type":"mit","license_body":"Copyright (c) 2015 Taco de Wolff\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation\n files (the \"Software\"), to deal in the Software without\n restriction, including without limitation the rights to use,\n copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the\n Software is furnished to do so, subject to the following\n conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n OTHER DEALINGS IN THE SOFTWARE."},{"package":"github.com/tdewolff/parse","version":"v2.3.4+incompatible","url":"","license_type":"mit","license_body":"Copyright (c) 2015 Taco de Wolff\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation\n files (the \"Software\"), to deal in the Software without\n restriction, including without limitation the rights to use,\n copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the\n Software is furnished to do so, subject to the following\n conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n OTHER DEALINGS IN THE SOFTWARE."},{"package":"github.com/tealeg/xlsx","version":"v1.0.5","url":"","license_type":"bsd3","license_body":"BSD 3-Clause License\n\nCopyright (c) 2011-2017, Geoffrey J. Teale\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"github.com/tidwall/gjson","version":"v1.18.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Josh Baker\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/tidwall/match","version":"v1.1.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2016 Josh Baker\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/tidwall/pretty","version":"v1.2.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2017 Josh Baker\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"},{"package":"github.com/ugorji/go/codec","version":"v1.3.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2012-2020 Ugorji Nwoke.\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/vbauerster/mpb/v5","version":"v5.4.0","url":"","license_type":"unlicense","license_body":"This is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or\ndistribute this software, either in source code form or as a compiled\nbinary, for any purpose, commercial or non-commercial, and by any\nmeans.\n\nIn jurisdictions that recognize copyright laws, the author or authors\nof this software dedicate any and all copyright interest in the\nsoftware to the public domain. We make this dedication for the benefit\nof the public at large and to the detriment of our heirs and\nsuccessors. We intend this dedication to be an overt act of\nrelinquishment in perpetuity of all present and future rights to this\nsoftware under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to \u003chttp://unlicense.org/\u003e\n"},{"package":"github.com/watermint/bwlimit","version":"v0.0.0-20170711090810-815207958550","url":"","license_type":"mit","license_body":"MIT License\n\nCopyright (c) 2016 Takayuki Okazaki\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"package":"github.com/xanzy/ssh-agent","version":"v0.3.3","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright {yyyy} {name of copyright owner}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n"},{"package":"go.opentelemetry.io/auto/sdk","version":"v1.1.0","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"go.opentelemetry.io/otel","version":"v1.37.0","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"go.opentelemetry.io/otel/metric","version":"v1.37.0","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"go.opentelemetry.io/otel/trace","version":"v1.37.0","url":"","license_type":"apache2_0","license_body":" Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n"},{"package":"go.uber.org/atomic","version":"v1.11.0","url":"","license_type":"mit","license_body":"Copyright (c) 2016 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"go.uber.org/multierr","version":"v1.11.0","url":"","license_type":"mit","license_body":"Copyright (c) 2017-2021 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"go.uber.org/zap","version":"v1.27.0","url":"","license_type":"mit","license_body":"Copyright (c) 2016-2017 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"golang.org/x/crypto","version":"v0.41.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/exp","version":"v0.0.0-20250813145105-42675adae3e6","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/image","version":"v0.30.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/mod","version":"v0.27.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/net","version":"v0.43.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/oauth2","version":"v0.30.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/sync","version":"v0.16.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/sys","version":"v0.35.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/term","version":"v0.34.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/text","version":"v0.28.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"golang.org/x/tools","version":"v0.36.0","url":"","license_type":"bsd2","license_body":"Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"google.golang.org/protobuf","version":"v1.36.7","url":"","license_type":"bsd2","license_body":"Copyright (c) 2018 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"gopkg.in/warnings.v0","version":"v0.1.2","url":"","license_type":"bsd2","license_body":"Copyright (c) 2016 Péter Surányi.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"package":"gopkg.in/yaml.v3","version":"v3.0.1","url":"","license_type":"apache2_0","license_body":"\nThis project is covered by two different licenses: MIT and Apache.\n\n#### MIT License ####\n\nThe following files were ported to Go from C files of libyaml, and thus\nare still covered by their original MIT license, with the additional\ncopyright staring in 2011 when the project was ported over:\n\n apic.go emitterc.go parserc.go readerc.go scannerc.go\n writerc.go yamlh.go yamlprivateh.go\n\nCopyright (c) 2006-2010 Kirill Simonov\nCopyright (c) 2006-2011 Kirill Simonov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n### Apache License ###\n\nAll the remaining project files are covered by the Apache license:\n\nCopyright (c) 2011-2019 Canonical Ltd\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"},{"package":"gorm.io/driver/sqlite","version":"v1.6.0","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2013-NOW Jinzhu \u003cwosmvp@gmail.com\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},{"package":"gorm.io/gorm","version":"v1.30.1","url":"","license_type":"mit","license_body":"The MIT License (MIT)\n\nCopyright (c) 2013-present Jinzhu \u003cwosmvp@gmail.com\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"}]}
\ No newline at end of file
diff --git a/resources/messages/en/messages.json b/resources/messages/en/messages.json
index 302d16373..f44ad1956 100644
--- a/resources/messages/en/messages.json
+++ b/resources/messages/en/messages.json
@@ -2786,6 +2786,8 @@
"infra.doc.dc_readme.doc_security.desc": "Security and privacy",
"infra.doc.dc_readme.header.header_body": "The watermint toolbox is the multi-purpose utility command-line tool for web services including Dropbox, Figma, GitHub, etc. The purpose of the tool is to provide users of cloud services and system administrators with a way to automate workflows and provide a work-around for some issues.",
"infra.doc.dc_readme.header.header_title": "{{.AppName}}",
+ "infra.doc.dc_readme.ktlo_announcement.announcement_body": "**⚠️ Important Notice: This project is no longer actively maintained.**\n\nAs of August 2025, this project has entered Keep The Lights On (KTLO) mode. While the current version will continue to function, no new features, bug fixes, or API updates will be implemented. Only minimal security updates may be applied as needed.\n\nFor more details about this decision and recommendations for alternatives, please see: [Project Maintenance Status - Discussion #911](https://github.com/watermint/toolbox/discussions/911)",
+ "infra.doc.dc_readme.ktlo_announcement.announcement_title": "⚠️ Maintenance Status",
"infra.doc.dc_readme.license.body_license": "watermint toolbox is licensed under the Apache License, Version 2.0.\nPlease see LICENSE.md or LICENSE.txt for more detail.",
"infra.doc.dc_readme.license.body_license_quote": "Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.",
"infra.doc.dc_readme.license.body_license_remarks": "Please carefully note:",
@@ -3042,6 +3044,7 @@
"infra.recipe.rc_exec.msg_panic.error_invalid_or_expired_oauth_token": "Authentication token was expired or invalid. Please rerun to reacquire the authentication token.",
"infra.recipe.rc_exec.msg_panic.error_recipe_panic": "Application crashed. Please report below information.",
"infra.recipe.rc_group.msg_header.header": "{{.AppName}} {{.AppVersion}}",
+ "infra.recipe.rc_group.msg_header.ktlo_announcement": "This project is no longer actively maintained. For more details, see: https://github.com/watermint/toolbox/discussions/911",
"infra.recipe.rc_group.msg_header.license": "Licensed under open source licenses. Use the `license` command for more detail.",
"infra.recipe.rc_group_impl.msg_group.group_available_commands": "Available commands:",
"infra.recipe.rc_group_impl.msg_group.group_header_usage": "Usage:",
@@ -4051,39 +4054,6 @@
"recipe.util.text.encoding.to.flag.out": "Output file path",
"recipe.util.text.encoding.to.text_input.in.desc": "Text to change encoding",
"recipe.util.text.encoding.to.title": "Convert text encoding to specified encoding from UTF-8 text file.",
- "recipe.util.text.nlp.english.entity.cli.args": "-in /LOCAL/PATH/TO/INPUT.txt",
- "recipe.util.text.nlp.english.entity.flag.ignore_line_break": "Consider line break as regular white space while tokenizing",
- "recipe.util.text.nlp.english.entity.flag.in": "Input file path",
- "recipe.util.text.nlp.english.entity.text_input.in.desc": "English text file to split",
- "recipe.util.text.nlp.english.entity.title": "Split English text into entities",
- "recipe.util.text.nlp.english.sentence.cli.args": "-in /LOCAL/PATH/TO/INPUT.txt",
- "recipe.util.text.nlp.english.sentence.flag.ignore_line_break": "Consider line break as regular white space while tokenizing",
- "recipe.util.text.nlp.english.sentence.flag.in": "Input file path",
- "recipe.util.text.nlp.english.sentence.text_input.in.desc": "English text file to split",
- "recipe.util.text.nlp.english.sentence.title": "Split English text into sentences",
- "recipe.util.text.nlp.english.title": "English NLP (Natural Language Processing) commands",
- "recipe.util.text.nlp.english.token.cli.args": "-in /LOCAL/PATH/TO/INPUT.txt",
- "recipe.util.text.nlp.english.token.flag.ignore_line_break": "Consider line break as regular white space while tokenizing",
- "recipe.util.text.nlp.english.token.flag.in": "Input file path",
- "recipe.util.text.nlp.english.token.text_input.in.desc": "English text file to split",
- "recipe.util.text.nlp.english.token.title": "Split English text into tokens",
- "recipe.util.text.nlp.japanese.title": "Japanese text natural language processing commands",
- "recipe.util.text.nlp.japanese.token.cli.args": "-in /LOCAL/PATH/TO/INPUT.txt",
- "recipe.util.text.nlp.japanese.token.flag.dictionary": "Dictionary name of the token",
- "recipe.util.text.nlp.japanese.token.flag.ignore_line_break": "Ignore line break",
- "recipe.util.text.nlp.japanese.token.flag.in": "Input file path",
- "recipe.util.text.nlp.japanese.token.flag.mode": "Tokenize mode (normal/search/extended)",
- "recipe.util.text.nlp.japanese.token.flag.omit_bos_eos": "Omit BOS/EOS tokens",
- "recipe.util.text.nlp.japanese.token.text_input.in.desc": "Input file path",
- "recipe.util.text.nlp.japanese.token.title": "Tokenize Japanese text",
- "recipe.util.text.nlp.japanese.wakati.cli.args": "-in /LOCAL/PATH/TO/INPUT.txt",
- "recipe.util.text.nlp.japanese.wakati.flag.dictionary": "Dictionary name (ipa/uni)",
- "recipe.util.text.nlp.japanese.wakati.flag.ignore_line_break": "Ignore line break",
- "recipe.util.text.nlp.japanese.wakati.flag.in": "Input file path",
- "recipe.util.text.nlp.japanese.wakati.flag.separator": "Text separator",
- "recipe.util.text.nlp.japanese.wakati.text_input.in.desc": "Input text file path",
- "recipe.util.text.nlp.japanese.wakati.title": "Wakachigaki (tokenize Japanese text)",
- "recipe.util.text.nlp.title": "NLP (Natural Language Processing) commands",
"recipe.util.text.title": "Text utility commands",
"recipe.util.tidy.move.dispatch.cli.args": "-file /PATH/TO/DATA_FILE.csv",
"recipe.util.tidy.move.dispatch.flag.file": "Path to data file",
@@ -4210,11 +4180,6 @@
"size.flag.scan_timeout.options.short": "scantimeout: short",
"summary.flag.base_path.options.home": "Access limited to personal home folder",
"summary.flag.base_path.options.root": "Full access to all folders with permissions",
- "token.flag.dictionary.options.ipa": "dictionary: ipa",
- "token.flag.dictionary.options.uni": "dictionary: uni",
- "token.flag.mode.options.extend": "mode: extend",
- "token.flag.mode.options.normal": "mode: normal",
- "token.flag.mode.options.search": "mode: search",
"type.flag.type.options.company_managed": "type: company_managed",
"type.flag.type.options.user_managed": "type: user_managed",
"unshare.flag.base_path.options.home": "Access limited to personal home folder",
@@ -4233,8 +4198,6 @@
"visibility.flag.base_path.options.root": "Full access to all folders with permissions",
"visibility.flag.new_visibility.options.public": "newvisibility: public",
"visibility.flag.new_visibility.options.team_only": "newvisibility: team_only",
- "wakati.flag.dictionary.options.ipa": "dictionary: ipa",
- "wakati.flag.dictionary.options.uni": "dictionary: uni",
"watch.flag.base_path.options.home": "Access limited to personal home folder",
"watch.flag.base_path.options.root": "Full access to all folders with permissions",
"wifi.flag.error_correction_level.options.h": "errorcorrectionlevel: h",
diff --git a/resources/messages/ja/messages.json b/resources/messages/ja/messages.json
index 5f55db23e..b546e2ad4 100644
--- a/resources/messages/ja/messages.json
+++ b/resources/messages/ja/messages.json
@@ -2786,6 +2786,8 @@
"infra.doc.dc_readme.doc_security.desc": "セキュリティとプライバシー",
"infra.doc.dc_readme.header.header_body": "watermint toolboxは、Dropbox、Figma、GitHubなどのウェブサービス用の多目的ユーティリティコマンドラインツールです。このツールの目的は、クラウドサービスのユーザーやシステム管理者に、ワークフローを自動化する方法を提供し、いくつかの問題に対する回避策を提供することです。",
"infra.doc.dc_readme.header.header_title": "{{.AppName}}",
+ "infra.doc.dc_readme.ktlo_announcement.announcement_body": "**⚠️ 重要なお知らせ:このプロジェクトは積極的にメンテナンスされていません。**\n\n2025年8月より、このプロジェクトはKTLO(Keep The Lights On)モードに移行しました。現在のバージョンは引き続き機能しますが、新機能、バグ修正、API更新は実装されません。必要に応じて最小限のセキュリティ更新のみが適用される場合があります。\n\nこの決定の詳細と代替案の推奨については、[プロジェクトメンテナンス状況 - ディスカッション #911](https://github.com/watermint/toolbox/discussions/911) をご覧ください。",
+ "infra.doc.dc_readme.ktlo_announcement.announcement_title": "⚠️ メンテナンス状況",
"infra.doc.dc_readme.license.body_license": "watermint toolboxはApache License, Version 2.0でライセンスされています。\n詳細はファイル LICENSE.mdまたは LICENSE.txt ご参照ください.",
"infra.doc.dc_readme.license.body_license_quote": "Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.",
"infra.doc.dc_readme.license.body_license_remarks": "以下にご留意ください:",
@@ -3042,6 +3044,7 @@
"infra.recipe.rc_exec.msg_panic.error_invalid_or_expired_oauth_token": "認証トークンが期限切れか無効でした。認証トークンを再取得するため、再実行してください。",
"infra.recipe.rc_exec.msg_panic.error_recipe_panic": "アプリケーションがクラッシュしました. 以下の情報を報告してください.",
"infra.recipe.rc_group.msg_header.header": "{{.AppName}} {{.AppVersion}}",
+ "infra.recipe.rc_group.msg_header.ktlo_announcement": "このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。",
"infra.recipe.rc_group.msg_header.license": "オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.",
"infra.recipe.rc_group_impl.msg_group.group_available_commands": "利用可能なコマンド:",
"infra.recipe.rc_group_impl.msg_group.group_header_usage": "使い方:",
@@ -4052,39 +4055,6 @@
"recipe.util.text.encoding.to.flag.out": "出力ファイルのパス",
"recipe.util.text.encoding.to.text_input.in.desc": "エンコードを変更するテキスト",
"recipe.util.text.encoding.to.title": "UTF-8テキストファイルから指定されたエンコーディングに変換する.",
- "recipe.util.text.nlp.english.entity.cli.args": "-in /LOCAL/PATH/TO/INPUT.txt",
- "recipe.util.text.nlp.english.entity.flag.ignore_line_break": "トークン化時に改行を通常の空白とみなす",
- "recipe.util.text.nlp.english.entity.flag.in": "入力ファイルのパス",
- "recipe.util.text.nlp.english.entity.text_input.in.desc": "分割する英文テキストファイル",
- "recipe.util.text.nlp.english.entity.title": "英文をエンティティに分割する",
- "recipe.util.text.nlp.english.sentence.cli.args": "-in /LOCAL/PATH/TO/INPUT.txt",
- "recipe.util.text.nlp.english.sentence.flag.ignore_line_break": "トークン化時に改行を通常の空白とみなす",
- "recipe.util.text.nlp.english.sentence.flag.in": "入力ファイルのパス",
- "recipe.util.text.nlp.english.sentence.text_input.in.desc": "分割する英文テキストファイル",
- "recipe.util.text.nlp.english.sentence.title": "英文を文章に分割する",
- "recipe.util.text.nlp.english.title": "英語NLP(自然言語処理)コマンド",
- "recipe.util.text.nlp.english.token.cli.args": "-in /LOCAL/PATH/TO/INPUT.txt",
- "recipe.util.text.nlp.english.token.flag.ignore_line_break": "トークン化時に改行を通常の空白とみなす",
- "recipe.util.text.nlp.english.token.flag.in": "入力ファイルのパス",
- "recipe.util.text.nlp.english.token.text_input.in.desc": "分割する英文テキストファイル",
- "recipe.util.text.nlp.english.token.title": "英文をトークンに分割する",
- "recipe.util.text.nlp.japanese.title": "日本語テキスト自然言語処理コマンド",
- "recipe.util.text.nlp.japanese.token.cli.args": "-in /LOCAL/PATH/TO/INPUT.txt",
- "recipe.util.text.nlp.japanese.token.flag.dictionary": "トークンの辞書名",
- "recipe.util.text.nlp.japanese.token.flag.ignore_line_break": "改行を無視する",
- "recipe.util.text.nlp.japanese.token.flag.in": "入力ファイルのパス",
- "recipe.util.text.nlp.japanese.token.flag.mode": "トークン化モード(normal/search/extended)",
- "recipe.util.text.nlp.japanese.token.flag.omit_bos_eos": "BOS/EOSトークンの省略",
- "recipe.util.text.nlp.japanese.token.text_input.in.desc": "入力ファイルのパス",
- "recipe.util.text.nlp.japanese.token.title": "日本語テキストのトークン化",
- "recipe.util.text.nlp.japanese.wakati.cli.args": "-in /LOCAL/PATH/TO/INPUT.txt",
- "recipe.util.text.nlp.japanese.wakati.flag.dictionary": "辞書名(ipa/uni)",
- "recipe.util.text.nlp.japanese.wakati.flag.ignore_line_break": "改行を無視する",
- "recipe.util.text.nlp.japanese.wakati.flag.in": "入力ファイルのパス",
- "recipe.util.text.nlp.japanese.wakati.flag.separator": "テキストセパレータ",
- "recipe.util.text.nlp.japanese.wakati.text_input.in.desc": "入力テキストファイルのパス",
- "recipe.util.text.nlp.japanese.wakati.title": "分かち書き(日本語テキストのトークン化) ",
- "recipe.util.text.nlp.title": "NLP(自然言語処理)コマンド",
"recipe.util.text.title": "テキストユーティリティコマンド",
"recipe.util.tidy.move.dispatch.cli.args": "-file /PATH/TO/DATA_FILE.csv",
"recipe.util.tidy.move.dispatch.flag.file": "データファイルへのパス",
@@ -4211,11 +4181,6 @@
"size.flag.scan_timeout.options.short": "スキャンタイムアウト: short",
"summary.flag.base_path.options.home": "個人用ホームフォルダへの限定アクセス",
"summary.flag.base_path.options.root": "権限を持つすべてのフォルダへのフルアクセス",
- "token.flag.dictionary.options.ipa": "辞書: ipa",
- "token.flag.dictionary.options.uni": "辞書: uni",
- "token.flag.mode.options.extend": "モード: extend",
- "token.flag.mode.options.normal": "モード: normal",
- "token.flag.mode.options.search": "モード: search",
"type.flag.type.options.company_managed": "タイプ: company_managed",
"type.flag.type.options.user_managed": "タイプ: user_managed",
"unshare.flag.base_path.options.home": "個人用ホームフォルダーへの限定アクセス",
@@ -4234,8 +4199,6 @@
"visibility.flag.base_path.options.root": "すべてのフォルダーへのフルアクセス権限",
"visibility.flag.new_visibility.options.public": "公開設定",
"visibility.flag.new_visibility.options.team_only": "チームのみ設定",
- "wakati.flag.dictionary.options.ipa": "辞書: ipa",
- "wakati.flag.dictionary.options.uni": "辞書: uni",
"watch.flag.base_path.options.home": "個人用ホームフォルダへの限定アクセス",
"watch.flag.base_path.options.root": "権限を持つすべてのフォルダへのフルアクセス",
"wifi.flag.error_correction_level.options.h": "高レベルエラー訂正",
diff --git a/resources/release/announcements.json b/resources/release/announcements.json
index a01d85dc7..553eb7393 100644
--- a/resources/release/announcements.json
+++ b/resources/release/announcements.json
@@ -3,17 +3,17 @@
"repository": {
"discussions": {
"nodes": [
+ {
+ "number": 911,
+ "title": "watermint toolbox will no longer be actively maintained",
+ "updatedAt": "2025-08-18T01:11:06Z",
+ "url": "https://github.com/watermint/toolbox/discussions/911"
+ },
{
"number": 906,
"title": "AI Powered Q\u0026A Bot on ChatGPT",
"updatedAt": "2025-06-14T16:35:08Z",
"url": "https://github.com/watermint/toolbox/discussions/906"
- },
- {
- "number": 905,
- "title": "Deprecation: Some of utilities command will be removed after release of 2025-08-01",
- "updatedAt": "2025-06-13T22:55:28Z",
- "url": "https://github.com/watermint/toolbox/discussions/905"
}
]
}
diff --git a/resources/release/en/spec_143.json.gz b/resources/release/en/spec_143.json.gz
new file mode 100644
index 000000000..fea351235
Binary files /dev/null and b/resources/release/en/spec_143.json.gz differ
diff --git a/resources/release/ja/spec_143.json.gz b/resources/release/ja/spec_143.json.gz
new file mode 100644
index 000000000..fea351235
Binary files /dev/null and b/resources/release/ja/spec_143.json.gz differ
diff --git a/resources/release/release b/resources/release/release
index 83248fb9d..aa59885c8 100644
--- a/resources/release/release
+++ b/resources/release/release
@@ -1 +1 @@
-142
\ No newline at end of file
+143
\ No newline at end of file
diff --git a/resources/release/release_license b/resources/release/release_license
index d3b51d0fb..a364fde80 100644
--- a/resources/release/release_license
+++ b/resources/release/release_license
@@ -64,6 +64,11 @@
"release": 142,
"key": "6D2OQDKZOZWJTK5YOAUVY74JRHMJVB4KEG7",
"hashed_salt": "BUPMD2LFXN3T6WMNU3TUEINGAOWJD37L"
+ },
+ {
+ "release": 143,
+ "key": "HDMKPF77ESDVUGDKGODFQ2CAJF3GXR7FIWN",
+ "hashed_salt": "5BVZ3FXT2FEO2LHHGLYOHPEZ566FOI36"
}
]
}
\ No newline at end of file