genlayer 0.38.9 → 0.38.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/.eslintignore +2 -0
  2. package/.github/workflows/cli-docs.yml +124 -0
  3. package/.github/workflows/publish.yml +55 -0
  4. package/.github/workflows/smoke.yml +27 -0
  5. package/.github/workflows/validate-code.yml +51 -0
  6. package/.prettierignore +19 -0
  7. package/.prettierrc +12 -0
  8. package/.release-it.json +66 -0
  9. package/CHANGELOG.md +545 -0
  10. package/CLAUDE.md +55 -0
  11. package/CONTRIBUTING.md +117 -0
  12. package/dist/index.js +221 -62
  13. package/docs/api-references/_meta.json +9 -0
  14. package/docs/api-references/accounts/_meta.json +3 -0
  15. package/docs/api-references/accounts/account/create.mdx +19 -0
  16. package/docs/api-references/accounts/account/export.mdx +19 -0
  17. package/docs/api-references/accounts/account/import.mdx +22 -0
  18. package/docs/api-references/accounts/account/list.mdx +15 -0
  19. package/docs/api-references/accounts/account/lock.mdx +16 -0
  20. package/docs/api-references/accounts/account/remove.mdx +20 -0
  21. package/docs/api-references/accounts/account/send.mdx +24 -0
  22. package/docs/api-references/accounts/account/show.mdx +17 -0
  23. package/docs/api-references/accounts/account/unlock.mdx +17 -0
  24. package/docs/api-references/accounts/account/use.mdx +19 -0
  25. package/docs/api-references/accounts/account.mdx +32 -0
  26. package/docs/api-references/configuration/_meta.json +4 -0
  27. package/docs/api-references/configuration/config/get.mdx +21 -0
  28. package/docs/api-references/configuration/config/reset.mdx +21 -0
  29. package/docs/api-references/configuration/config/set.mdx +21 -0
  30. package/docs/api-references/configuration/config.mdx +25 -0
  31. package/docs/api-references/configuration/network/info.mdx +15 -0
  32. package/docs/api-references/configuration/network/list.mdx +15 -0
  33. package/docs/api-references/configuration/network/set.mdx +21 -0
  34. package/docs/api-references/configuration/network.mdx +25 -0
  35. package/docs/api-references/contracts/_meta.json +7 -0
  36. package/docs/api-references/contracts/call.mdx +21 -0
  37. package/docs/api-references/contracts/code.mdx +20 -0
  38. package/docs/api-references/contracts/deploy.mdx +17 -0
  39. package/docs/api-references/contracts/schema.mdx +20 -0
  40. package/docs/api-references/contracts/write.mdx +21 -0
  41. package/docs/api-references/environment/_meta.json +7 -0
  42. package/docs/api-references/environment/init.mdx +20 -0
  43. package/docs/api-references/environment/new.mdx +21 -0
  44. package/docs/api-references/environment/stop.mdx +15 -0
  45. package/docs/api-references/environment/up.mdx +20 -0
  46. package/docs/api-references/environment/update/ollama.mdx +16 -0
  47. package/docs/api-references/environment/update.mdx +23 -0
  48. package/docs/api-references/index.mdx +35 -0
  49. package/docs/api-references/localnet/_meta.json +3 -0
  50. package/docs/api-references/localnet/localnet/validators/count.mdx +15 -0
  51. package/docs/api-references/localnet/localnet/validators/create-random.mdx +16 -0
  52. package/docs/api-references/localnet/localnet/validators/create.mdx +19 -0
  53. package/docs/api-references/localnet/localnet/validators/delete.mdx +16 -0
  54. package/docs/api-references/localnet/localnet/validators/get.mdx +16 -0
  55. package/docs/api-references/localnet/localnet/validators/update.mdx +23 -0
  56. package/docs/api-references/localnet/localnet/validators.mdx +28 -0
  57. package/docs/api-references/localnet/localnet.mdx +23 -0
  58. package/docs/api-references/staking/_meta.json +3 -0
  59. package/docs/api-references/staking/staking/active-validators.mdx +18 -0
  60. package/docs/api-references/staking/staking/banned-validators.mdx +18 -0
  61. package/docs/api-references/staking/staking/delegation-info.mdx +25 -0
  62. package/docs/api-references/staking/staking/delegator-claim.mdx +26 -0
  63. package/docs/api-references/staking/staking/delegator-exit.mdx +26 -0
  64. package/docs/api-references/staking/staking/delegator-join.mdx +26 -0
  65. package/docs/api-references/staking/staking/epoch-info.mdx +19 -0
  66. package/docs/api-references/staking/staking/prime-all.mdx +20 -0
  67. package/docs/api-references/staking/staking/quarantined-validators.mdx +18 -0
  68. package/docs/api-references/staking/staking/set-identity.mdx +33 -0
  69. package/docs/api-references/staking/staking/set-operator.mdx +26 -0
  70. package/docs/api-references/staking/staking/validator-claim.mdx +24 -0
  71. package/docs/api-references/staking/staking/validator-deposit.mdx +25 -0
  72. package/docs/api-references/staking/staking/validator-exit.mdx +25 -0
  73. package/docs/api-references/staking/staking/validator-history.mdx +29 -0
  74. package/docs/api-references/staking/staking/validator-info.mdx +25 -0
  75. package/docs/api-references/staking/staking/validator-join.mdx +22 -0
  76. package/docs/api-references/staking/staking/validator-prime.mdx +25 -0
  77. package/docs/api-references/staking/staking/validators.mdx +19 -0
  78. package/docs/api-references/staking/staking/wizard.mdx +20 -0
  79. package/docs/api-references/staking/staking.mdx +42 -0
  80. package/docs/api-references/transactions/_meta.json +6 -0
  81. package/docs/api-references/transactions/appeal-bond.mdx +20 -0
  82. package/docs/api-references/transactions/appeal.mdx +21 -0
  83. package/docs/api-references/transactions/receipt.mdx +25 -0
  84. package/docs/api-references/transactions/trace.mdx +21 -0
  85. package/docs/delegator-guide.md +203 -0
  86. package/docs/validator-guide.md +329 -0
  87. package/esbuild.config.dev.js +17 -0
  88. package/esbuild.config.js +22 -0
  89. package/esbuild.config.prod.js +17 -0
  90. package/eslint.config.js +60 -0
  91. package/package.json +2 -11
  92. package/renovate.json +22 -0
  93. package/scripts/generate-cli-docs.mjs +68 -5
  94. package/src/commands/account/create.ts +30 -0
  95. package/src/commands/account/export.ts +106 -0
  96. package/src/commands/account/import.ts +135 -0
  97. package/src/commands/account/index.ts +129 -0
  98. package/src/commands/account/list.ts +34 -0
  99. package/src/commands/account/lock.ts +39 -0
  100. package/src/commands/account/remove.ts +30 -0
  101. package/src/commands/account/send.ts +162 -0
  102. package/src/commands/account/show.ts +74 -0
  103. package/src/commands/account/unlock.ts +56 -0
  104. package/src/commands/account/use.ts +21 -0
  105. package/src/commands/config/getSetReset.ts +51 -0
  106. package/src/commands/config/index.ts +30 -0
  107. package/src/commands/contracts/call.ts +39 -0
  108. package/src/commands/contracts/code.ts +33 -0
  109. package/src/commands/contracts/deploy.ts +161 -0
  110. package/src/commands/contracts/index.ts +150 -0
  111. package/src/commands/contracts/schema.ts +31 -0
  112. package/src/commands/contracts/write.ts +49 -0
  113. package/src/commands/general/index.ts +45 -0
  114. package/src/commands/general/init.ts +180 -0
  115. package/src/commands/general/start.ts +128 -0
  116. package/src/commands/general/stop.ts +26 -0
  117. package/src/commands/localnet/index.ts +100 -0
  118. package/src/commands/localnet/validators.ts +269 -0
  119. package/src/commands/network/index.ts +29 -0
  120. package/src/commands/network/setNetwork.ts +77 -0
  121. package/src/commands/scaffold/index.ts +16 -0
  122. package/src/commands/scaffold/new.ts +34 -0
  123. package/src/commands/staking/StakingAction.ts +279 -0
  124. package/src/commands/staking/delegatorClaim.ts +41 -0
  125. package/src/commands/staking/delegatorExit.ts +56 -0
  126. package/src/commands/staking/delegatorJoin.ts +44 -0
  127. package/src/commands/staking/index.ts +357 -0
  128. package/src/commands/staking/setIdentity.ts +78 -0
  129. package/src/commands/staking/setOperator.ts +46 -0
  130. package/src/commands/staking/stakingInfo.ts +584 -0
  131. package/src/commands/staking/validatorClaim.ts +43 -0
  132. package/src/commands/staking/validatorDeposit.ts +48 -0
  133. package/src/commands/staking/validatorExit.ts +63 -0
  134. package/src/commands/staking/validatorHistory.ts +300 -0
  135. package/src/commands/staking/validatorJoin.ts +47 -0
  136. package/src/commands/staking/validatorPrime.ts +73 -0
  137. package/src/commands/staking/wizard.ts +809 -0
  138. package/src/commands/transactions/appeal.ts +83 -0
  139. package/src/commands/transactions/index.ts +60 -0
  140. package/src/commands/transactions/receipt.ts +90 -0
  141. package/src/commands/transactions/trace.ts +42 -0
  142. package/src/commands/update/index.ts +25 -0
  143. package/src/commands/update/ollama.ts +103 -0
  144. package/src/lib/actions/BaseAction.ts +301 -0
  145. package/src/lib/clients/jsonRpcClient.ts +41 -0
  146. package/src/lib/clients/system.ts +73 -0
  147. package/src/lib/config/ConfigFileManager.ts +194 -0
  148. package/src/lib/config/KeychainManager.ts +89 -0
  149. package/src/lib/config/simulator.ts +68 -0
  150. package/src/lib/config/text.ts +2 -0
  151. package/src/lib/errors/missingRequirement.ts +9 -0
  152. package/src/lib/errors/versionRequired.ts +9 -0
  153. package/src/lib/interfaces/ISimulatorService.ts +39 -0
  154. package/src/lib/services/simulator.ts +386 -0
  155. package/src/types/node-fetch.d.ts +1 -0
  156. package/tests/actions/appeal.test.ts +141 -0
  157. package/tests/actions/call.test.ts +94 -0
  158. package/tests/actions/code.test.ts +87 -0
  159. package/tests/actions/create.test.ts +65 -0
  160. package/tests/actions/deploy.test.ts +420 -0
  161. package/tests/actions/getSetReset.test.ts +88 -0
  162. package/tests/actions/init.test.ts +483 -0
  163. package/tests/actions/lock.test.ts +86 -0
  164. package/tests/actions/new.test.ts +80 -0
  165. package/tests/actions/ollama.test.ts +193 -0
  166. package/tests/actions/receipt.test.ts +261 -0
  167. package/tests/actions/schema.test.ts +94 -0
  168. package/tests/actions/setNetwork.test.ts +161 -0
  169. package/tests/actions/staking.test.ts +280 -0
  170. package/tests/actions/start.test.ts +257 -0
  171. package/tests/actions/stop.test.ts +77 -0
  172. package/tests/actions/unlock.test.ts +139 -0
  173. package/tests/actions/validators.test.ts +750 -0
  174. package/tests/actions/write.test.ts +102 -0
  175. package/tests/commands/account.test.ts +146 -0
  176. package/tests/commands/appeal.test.ts +97 -0
  177. package/tests/commands/call.test.ts +78 -0
  178. package/tests/commands/code.test.ts +69 -0
  179. package/tests/commands/config.test.ts +54 -0
  180. package/tests/commands/deploy.test.ts +83 -0
  181. package/tests/commands/init.test.ts +101 -0
  182. package/tests/commands/localnet.test.ts +131 -0
  183. package/tests/commands/network.test.ts +60 -0
  184. package/tests/commands/new.test.ts +68 -0
  185. package/tests/commands/parseArg.test.ts +156 -0
  186. package/tests/commands/receipt.test.ts +142 -0
  187. package/tests/commands/schema.test.ts +67 -0
  188. package/tests/commands/staking.test.ts +329 -0
  189. package/tests/commands/stop.test.ts +27 -0
  190. package/tests/commands/up.test.ts +105 -0
  191. package/tests/commands/update.test.ts +45 -0
  192. package/tests/commands/write.test.ts +76 -0
  193. package/tests/index.test.ts +56 -0
  194. package/tests/libs/baseAction.test.ts +535 -0
  195. package/tests/libs/configFileManager.test.ts +118 -0
  196. package/tests/libs/jsonRpcClient.test.ts +59 -0
  197. package/tests/libs/keychainManager.test.ts +156 -0
  198. package/tests/libs/platformCommands.test.ts +78 -0
  199. package/tests/libs/system.test.ts +148 -0
  200. package/tests/services/simulator.test.ts +789 -0
  201. package/tests/smoke.test.ts +134 -0
  202. package/tests/utils.ts +13 -0
  203. package/tsconfig.json +120 -0
  204. package/vitest.config.ts +13 -0
  205. package/vitest.smoke.config.ts +17 -0
package/.eslintignore ADDED
@@ -0,0 +1,2 @@
1
+ node_modules
2
+ dist
@@ -0,0 +1,124 @@
1
+ name: Generate CLI Docs and PR to genlayer-docs
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ release:
6
+ types: [published]
7
+
8
+ jobs:
9
+ generate-and-sync:
10
+ # Skip for pre-releases (tags containing '-') unless manually dispatched
11
+ if: github.event_name != 'release' || !contains(github.event.release.tag_name, '-')
12
+ runs-on: ubuntu-latest
13
+ permissions:
14
+ contents: read
15
+ steps:
16
+ - name: Checkout CLI repo
17
+ uses: actions/checkout@v4
18
+
19
+ - name: Setup Node.js
20
+ uses: actions/setup-node@v4
21
+ with:
22
+ node-version: '20'
23
+ cache: 'npm'
24
+
25
+ - name: Install dependencies
26
+ run: npm ci
27
+
28
+ - name: Build
29
+ run: npm run build
30
+
31
+ - name: Determine version for docs
32
+ id: version
33
+ run: |
34
+ if [ "${{ github.event_name }}" = "release" ]; then
35
+ echo "value=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT
36
+ else
37
+ # Prefer package.json version when not a release event
38
+ echo "value=$(node -p 'require("./package.json").version')" >> $GITHUB_OUTPUT
39
+ fi
40
+
41
+ - name: Generate CLI docs (MDX)
42
+ env:
43
+ DOCS_CLEAN: 'true'
44
+ DOCS_VERSION: ${{ steps.version.outputs.value }}
45
+ run: node scripts/generate-cli-docs.mjs | cat
46
+
47
+ - name: Set up Git (for committing to CLI repo)
48
+ run: |
49
+ git config user.name "github-actions[bot]"
50
+ git config user.email "github-actions[bot]@users.noreply.github.com"
51
+
52
+ - name: Commit and push docs back to CLI repo (non-beta releases)
53
+ if: github.event_name == 'release' && !contains(github.event.release.tag_name, '-')
54
+ run: |
55
+ set -euo pipefail
56
+ if [ -n "$(git status --porcelain docs/api-references || true)" ]; then
57
+ git add docs/api-references
58
+ VERSION=${{ steps.version.outputs.value }}
59
+ git commit -m "docs(cli): update API reference for ${VERSION}"
60
+ git push
61
+ else
62
+ echo "No docs changes to commit"
63
+ fi
64
+
65
+ - name: Generate docs repo token
66
+ id: app-token
67
+ uses: actions/create-github-app-token@v1
68
+ with:
69
+ app-id: ${{ vars.DOCS_SYNC_APP_ID }}
70
+ private-key: ${{ secrets.DOCS_SYNC_APP_KEY }}
71
+ repositories: genlayer-docs
72
+
73
+ - name: Checkout docs repo
74
+ uses: actions/checkout@v4
75
+ with:
76
+ repository: genlayerlabs/genlayer-docs
77
+ token: ${{ steps.app-token.outputs.token }}
78
+ path: docs-repo
79
+ fetch-depth: 0
80
+
81
+ - name: Sync and push docs
82
+ working-directory: docs-repo
83
+ run: |
84
+ set -euo pipefail
85
+ git config user.name "github-actions[bot]"
86
+ git config user.email "github-actions[bot]@users.noreply.github.com"
87
+ rm -rf pages/api-references/genlayer-cli
88
+ mkdir -p pages/api-references/genlayer-cli
89
+ rsync -a "${{ github.workspace }}/docs/api-references/" pages/api-references/genlayer-cli/
90
+ # Copy README as sibling file (strip badges/emojis)
91
+ sed -E '/^\[!\[.*\]\(https:\/\/(img\.shields\.io|dcbadge|badge\.fury)/d' "${{ github.workspace }}/README.md" > pages/api-references/genlayer-cli.mdx
92
+ # Write _meta.json
93
+ cat > pages/api-references/genlayer-cli/_meta.json << 'METAEOF'
94
+ {
95
+ "init": "init",
96
+ "up": "up",
97
+ "stop": "stop",
98
+ "new": "new",
99
+ "config": "config",
100
+ "network": "network",
101
+ "deploy": "deploy",
102
+ "call": "call",
103
+ "write": "write",
104
+ "schema": "schema",
105
+ "code": "code",
106
+ "receipt": "receipt",
107
+ "trace": "trace",
108
+ "appeal": "appeal",
109
+ "appeal-bond": "appeal-bond",
110
+ "account": "account",
111
+ "staking": "staking",
112
+ "localnet": "localnet",
113
+ "update": "update"
114
+ }
115
+ METAEOF
116
+ if [ -z "$(git status --porcelain)" ]; then
117
+ echo "No changes to commit"
118
+ exit 0
119
+ fi
120
+ git add pages/api-references/genlayer-cli pages/api-references/genlayer-cli.mdx
121
+ git commit -m "docs(cli): sync API reference ${{ steps.version.outputs.value }}"
122
+ git push
123
+
124
+
@@ -0,0 +1,55 @@
1
+ name: Release & Publish Package to NPM
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ branches:
7
+ - main
8
+ - staging
9
+ paths-ignore:
10
+ - 'docs/**'
11
+
12
+ permissions:
13
+ contents: write
14
+ id-token: write
15
+
16
+ jobs:
17
+ release:
18
+ runs-on: ubuntu-latest
19
+ environment: npm
20
+ steps:
21
+ - name: Get CI Bot Token
22
+ uses: tibdex/github-app-token@v2
23
+ id: ci_bot_token
24
+ with:
25
+ app_id: ${{ secrets.CI_BOT_APP_ID }}
26
+ private_key: ${{ secrets.CI_BOT_SECRET }}
27
+
28
+ - name: Checkout source code
29
+ uses: actions/checkout@v4
30
+ with:
31
+ token: ${{ steps.ci_bot_token.outputs.token }}
32
+
33
+ - name: Initialize Git User
34
+ run: |
35
+ git config --global user.email "github-actions[bot]@genlayer.com"
36
+ git config --global user.name "github-actions[bot]"
37
+
38
+ - uses: actions/setup-node@v4
39
+ with:
40
+ node-version: "22"
41
+ registry-url: "https://registry.npmjs.org"
42
+
43
+ - run: npm install -g npm@latest
44
+
45
+ - run: npm ci
46
+
47
+ - name: Release
48
+ run: |
49
+ if [ "${{ github.ref_name }}" = "staging" ]; then
50
+ npm run release-beta
51
+ else
52
+ npm run release
53
+ fi
54
+ env:
55
+ GITHUB_TOKEN: ${{ steps.ci_bot_token.outputs.token }}
@@ -0,0 +1,27 @@
1
+ name: Smoke Tests
2
+
3
+ on:
4
+ pull_request:
5
+ schedule:
6
+ - cron: '0 8 * * *'
7
+ workflow_dispatch:
8
+
9
+ jobs:
10
+ smoke:
11
+ name: Testnet Smoke Tests
12
+ runs-on: ubuntu-latest
13
+ timeout-minutes: 5
14
+ continue-on-error: true
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - uses: actions/setup-node@v4
20
+ with:
21
+ node-version: 18
22
+ cache: npm
23
+
24
+ - run: npm ci
25
+
26
+ - name: Run smoke tests
27
+ run: npm run test:smoke
@@ -0,0 +1,51 @@
1
+ name: CI Workflow
2
+
3
+ on:
4
+ pull_request:
5
+ types:
6
+ - opened
7
+ - synchronize
8
+ - reopened
9
+ push:
10
+ branches:
11
+ - main
12
+
13
+ jobs:
14
+ build-and-test:
15
+ name: Build and Test (${{ matrix.os }})
16
+ runs-on: ${{ matrix.os }}
17
+ strategy:
18
+ matrix:
19
+ os: [ubuntu-latest, macos-latest, windows-latest]
20
+
21
+ steps:
22
+ - name: Checkout code
23
+ uses: actions/checkout@v4
24
+
25
+ - name: Install libsecret runtime
26
+ if: runner.os == 'Linux'
27
+ run: sudo apt-get update && sudo apt-get install -y libsecret-1-0
28
+
29
+ - name: Set up Node.js
30
+ uses: actions/setup-node@v4
31
+ with:
32
+ node-version: 18
33
+ cache: "npm"
34
+
35
+ - name: Install dependencies
36
+ run: npm ci
37
+
38
+ - name: Build the project
39
+ run: npm run build
40
+
41
+ - name: Run tests
42
+ run: npm run test:coverage
43
+
44
+ - name: Upload coverage report
45
+ if: success() && matrix.os == 'ubuntu-latest'
46
+ uses: codecov/codecov-action@v5.4.3
47
+ with:
48
+ verbose: true
49
+ token: ${{ secrets.CODECOV_TOKEN }}
50
+ fail_ci_if_error: true
51
+ directory: coverage
@@ -0,0 +1,19 @@
1
+ # Node artifact files
2
+ node_modules/
3
+ dist/
4
+ package-lock.json
5
+ yarn.lock
6
+ pnpm-lock.yaml
7
+
8
+ # Log files
9
+ *.log
10
+
11
+ # Generated by MacOS
12
+ .DS_Store
13
+
14
+ # Generated by Windows
15
+ Thumbs.db
16
+
17
+ # aws
18
+ .aws-sam
19
+ .sam
package/.prettierrc ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "tabWidth": 2,
3
+ "useTabs": false,
4
+ "semi": true,
5
+ "singleQuote": false,
6
+ "jsxSingleQuote": false,
7
+ "trailingComma": "all",
8
+ "bracketSpacing": false,
9
+ "bracketSameLine": false,
10
+ "arrowParens": "avoid",
11
+ "printWidth": 110
12
+ }
@@ -0,0 +1,66 @@
1
+ {
2
+ "git": {
3
+ "commitMessage": "Release v${version} [skip ci]",
4
+ "tagName": "v${version}",
5
+ "requireCleanWorkingDir": false,
6
+ "requireUpstream": false,
7
+ "requireCommits": false,
8
+ "push": true
9
+ },
10
+ "github": {
11
+ "release": true,
12
+ "tokenRef": "GITHUB_TOKEN"
13
+ },
14
+ "npm": {
15
+ "publish": true,
16
+ "publishArgs": ["--provenance --access public"],
17
+ "skipChecks": true
18
+ },
19
+ "plugins": {
20
+ "@release-it/conventional-changelog": {
21
+ "preset": "conventionalcommits",
22
+ "infile": "CHANGELOG.md",
23
+ "types": [
24
+ {
25
+ "type": "feat",
26
+ "section": "Features"
27
+ },
28
+ {
29
+ "type": "fix",
30
+ "section": "Bug Fixes"
31
+ },
32
+ {
33
+ "type": "chore",
34
+ "section": "Improvement Tasks"
35
+ },
36
+ {
37
+ "type": "ci",
38
+ "section": "Continuous Integration"
39
+ },
40
+ {
41
+ "type": "docs",
42
+ "section": "Documentation"
43
+ },
44
+ {
45
+ "type": "style",
46
+ "section": "Styles"
47
+ },
48
+ {
49
+ "type": "refactor",
50
+ "section": "Refactor Tasks"
51
+ },
52
+ {
53
+ "type": "perf",
54
+ "section": "Performance Improvements"
55
+ },
56
+ {
57
+ "type": "test",
58
+ "section": "Testing"
59
+ }
60
+ ]
61
+ }
62
+ },
63
+ "hooks": {
64
+ "after:bump": "npm run build"
65
+ }
66
+ }