wrangler 0.0.0-daf73fbe → 0.0.0-db11a0fd

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 (235) hide show
  1. package/README.md +13 -19
  2. package/bin/wrangler.js +24 -93
  3. package/config-schema.json +3059 -0
  4. package/package.json +196 -185
  5. package/templates/__tests__/pages-dev-util.test.ts +128 -0
  6. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  7. package/templates/__tests__/tsconfig.json +8 -0
  8. package/templates/checked-fetch.js +19 -6
  9. package/templates/facade.d.ts +19 -0
  10. package/templates/gitignore +2 -3
  11. package/templates/init-tests/test-jest-new-worker.js +3 -5
  12. package/templates/init-tests/test-vitest-new-worker.js +4 -6
  13. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  14. package/templates/middleware/common.ts +9 -4
  15. package/templates/middleware/loader-modules.ts +94 -44
  16. package/templates/middleware/loader-sw.ts +48 -32
  17. package/templates/middleware/middleware-ensure-req-body-drained.ts +18 -0
  18. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  19. package/templates/middleware/middleware-serve-static-assets.d.ts +6 -0
  20. package/templates/middleware/middleware-serve-static-assets.ts +56 -0
  21. package/templates/modules-watch-stub.js +4 -0
  22. package/templates/new-worker-scheduled.ts +1 -1
  23. package/templates/new-worker.ts +4 -1
  24. package/templates/pages-dev-pipeline.ts +10 -13
  25. package/templates/pages-dev-util.ts +55 -0
  26. package/templates/pages-shim.ts +1 -1
  27. package/templates/pages-template-plugin.ts +37 -14
  28. package/templates/pages-template-worker.ts +33 -7
  29. package/templates/startDevWorker/InspectorProxyWorker.ts +664 -0
  30. package/templates/startDevWorker/ProxyWorker.ts +334 -0
  31. package/templates/tsconfig-sanity.ts +11 -0
  32. package/templates/tsconfig.init.json +22 -0
  33. package/templates/tsconfig.json +5 -102
  34. package/wrangler-dist/InspectorProxyWorker.js +464 -0
  35. package/wrangler-dist/InspectorProxyWorker.js.map +6 -0
  36. package/wrangler-dist/ProxyWorker.js +240 -0
  37. package/wrangler-dist/ProxyWorker.js.map +6 -0
  38. package/wrangler-dist/cli.d.ts +26019 -471
  39. package/wrangler-dist/cli.js +161568 -111507
  40. package/wrangler-dist/wasm-sync.wasm +0 -0
  41. package/Cloudflare_CA.pem +0 -18
  42. package/import_meta_url.js +0 -3
  43. package/miniflare-config-stubs/.env.empty +0 -0
  44. package/miniflare-config-stubs/package.empty.json +0 -1
  45. package/miniflare-config-stubs/wrangler.empty.toml +0 -0
  46. package/miniflare-dist/index.mjs +0 -6310
  47. package/src/__tests__/api-dev.test.ts +0 -209
  48. package/src/__tests__/api-devregistry.test.js +0 -56
  49. package/src/__tests__/api.test.ts +0 -80
  50. package/src/__tests__/config-cache-without-cache-dir.test.ts +0 -38
  51. package/src/__tests__/config-cache.test.ts +0 -42
  52. package/src/__tests__/configuration.test.ts +0 -3864
  53. package/src/__tests__/dev.test.tsx +0 -1356
  54. package/src/__tests__/dialogs.test.tsx +0 -40
  55. package/src/__tests__/generate.test.ts +0 -91
  56. package/src/__tests__/guess-worker-format.test.ts +0 -85
  57. package/src/__tests__/helpers/clipboardy-mock.js +0 -4
  58. package/src/__tests__/helpers/cmd-shim.d.ts +0 -11
  59. package/src/__tests__/helpers/mock-account-id.ts +0 -48
  60. package/src/__tests__/helpers/mock-bin.ts +0 -36
  61. package/src/__tests__/helpers/mock-cfetch.ts +0 -316
  62. package/src/__tests__/helpers/mock-console.ts +0 -106
  63. package/src/__tests__/helpers/mock-dialogs.ts +0 -153
  64. package/src/__tests__/helpers/mock-get-zone-from-host.ts +0 -8
  65. package/src/__tests__/helpers/mock-http-server.ts +0 -46
  66. package/src/__tests__/helpers/mock-istty.ts +0 -74
  67. package/src/__tests__/helpers/mock-known-routes.ts +0 -7
  68. package/src/__tests__/helpers/mock-kv.ts +0 -33
  69. package/src/__tests__/helpers/mock-oauth-flow.ts +0 -252
  70. package/src/__tests__/helpers/mock-process.ts +0 -39
  71. package/src/__tests__/helpers/mock-stdin.ts +0 -108
  72. package/src/__tests__/helpers/mock-web-socket.ts +0 -29
  73. package/src/__tests__/helpers/msw/handlers/index.ts +0 -13
  74. package/src/__tests__/helpers/msw/handlers/namespaces.ts +0 -104
  75. package/src/__tests__/helpers/msw/handlers/oauth.ts +0 -36
  76. package/src/__tests__/helpers/msw/handlers/r2.ts +0 -80
  77. package/src/__tests__/helpers/msw/handlers/user.ts +0 -63
  78. package/src/__tests__/helpers/msw/index.ts +0 -4
  79. package/src/__tests__/helpers/run-in-tmp.ts +0 -38
  80. package/src/__tests__/helpers/run-wrangler.ts +0 -16
  81. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +0 -1
  82. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +0 -5
  83. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +0 -1
  84. package/src/__tests__/helpers/worker-scripts/parent-worker.js +0 -8
  85. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +0 -5
  86. package/src/__tests__/helpers/write-worker-source.ts +0 -31
  87. package/src/__tests__/helpers/write-wrangler-toml.ts +0 -17
  88. package/src/__tests__/https-options.test.ts +0 -163
  89. package/src/__tests__/index.test.ts +0 -249
  90. package/src/__tests__/init.test.ts +0 -2816
  91. package/src/__tests__/jest.setup.ts +0 -186
  92. package/src/__tests__/kv.test.ts +0 -1671
  93. package/src/__tests__/logger.test.ts +0 -141
  94. package/src/__tests__/metrics.test.ts +0 -450
  95. package/src/__tests__/middleware.scheduled.test.ts +0 -135
  96. package/src/__tests__/middleware.test.ts +0 -726
  97. package/src/__tests__/package-manager.test.ts +0 -353
  98. package/src/__tests__/pages.test.ts +0 -1995
  99. package/src/__tests__/parse.test.ts +0 -330
  100. package/src/__tests__/paths.test.ts +0 -39
  101. package/src/__tests__/publish.test.ts +0 -7090
  102. package/src/__tests__/pubsub.test.ts +0 -367
  103. package/src/__tests__/r2.test.ts +0 -371
  104. package/src/__tests__/route.test.ts +0 -45
  105. package/src/__tests__/secret.test.ts +0 -644
  106. package/src/__tests__/tail.test.ts +0 -775
  107. package/src/__tests__/test-old-node-version.js +0 -31
  108. package/src/__tests__/user.test.ts +0 -155
  109. package/src/__tests__/validate-dev-props.test.ts +0 -56
  110. package/src/__tests__/version.test.ts +0 -35
  111. package/src/__tests__/whoami.test.tsx +0 -273
  112. package/src/__tests__/worker-namespace.test.ts +0 -319
  113. package/src/abort.d.ts +0 -3
  114. package/src/api/dev.ts +0 -207
  115. package/src/api/index.ts +0 -2
  116. package/src/bundle-reporter.tsx +0 -29
  117. package/src/bundle.ts +0 -756
  118. package/src/cfetch/index.ts +0 -121
  119. package/src/cfetch/internal.ts +0 -314
  120. package/src/cli.ts +0 -29
  121. package/src/config/README.md +0 -107
  122. package/src/config/config.ts +0 -275
  123. package/src/config/diagnostics.ts +0 -80
  124. package/src/config/environment.ts +0 -505
  125. package/src/config/index.ts +0 -293
  126. package/src/config/validation-helpers.ts +0 -597
  127. package/src/config/validation.ts +0 -1930
  128. package/src/config-cache.ts +0 -85
  129. package/src/create-worker-preview.ts +0 -275
  130. package/src/create-worker-upload-form.ts +0 -301
  131. package/src/d1/backups.tsx +0 -212
  132. package/src/d1/create.tsx +0 -54
  133. package/src/d1/delete.tsx +0 -56
  134. package/src/d1/execute.tsx +0 -294
  135. package/src/d1/formatTimeAgo.ts +0 -14
  136. package/src/d1/index.ts +0 -75
  137. package/src/d1/list.tsx +0 -48
  138. package/src/d1/options.ts +0 -12
  139. package/src/d1/types.tsx +0 -14
  140. package/src/d1/utils.ts +0 -39
  141. package/src/dev/dev-vars.ts +0 -36
  142. package/src/dev/dev.tsx +0 -575
  143. package/src/dev/get-local-persistence-path.tsx +0 -31
  144. package/src/dev/local.tsx +0 -686
  145. package/src/dev/remote.tsx +0 -590
  146. package/src/dev/start-server.ts +0 -506
  147. package/src/dev/use-esbuild.ts +0 -197
  148. package/src/dev/validate-dev-props.ts +0 -31
  149. package/src/dev-registry.tsx +0 -190
  150. package/src/dev.tsx +0 -872
  151. package/src/dialogs.tsx +0 -158
  152. package/src/dispatch-namespace.ts +0 -206
  153. package/src/durable.ts +0 -102
  154. package/src/entry.ts +0 -329
  155. package/src/environment-variables.ts +0 -50
  156. package/src/errors.ts +0 -11
  157. package/src/generate.ts +0 -131
  158. package/src/git-client.ts +0 -42
  159. package/src/global-wrangler-config-path.ts +0 -26
  160. package/src/https-options.ts +0 -127
  161. package/src/index.tsx +0 -2369
  162. package/src/init.ts +0 -971
  163. package/src/inspect.ts +0 -747
  164. package/src/intl-polyfill.d.ts +0 -139
  165. package/src/is-ci.ts +0 -14
  166. package/src/is-interactive.ts +0 -12
  167. package/src/kv.ts +0 -430
  168. package/src/logger.ts +0 -80
  169. package/src/metrics/index.ts +0 -5
  170. package/src/metrics/metrics-config.ts +0 -239
  171. package/src/metrics/metrics-dispatcher.ts +0 -96
  172. package/src/metrics/metrics-usage-headers.ts +0 -24
  173. package/src/metrics/send-event.ts +0 -93
  174. package/src/miniflare-cli/README.md +0 -30
  175. package/src/miniflare-cli/assets.ts +0 -215
  176. package/src/miniflare-cli/index.ts +0 -208
  177. package/src/miniflare-cli/request-context.ts +0 -40
  178. package/src/module-collection.ts +0 -267
  179. package/src/open-in-browser.ts +0 -17
  180. package/src/package-manager.ts +0 -219
  181. package/src/pages/build.tsx +0 -238
  182. package/src/pages/constants.ts +0 -16
  183. package/src/pages/deployments.tsx +0 -106
  184. package/src/pages/dev.tsx +0 -687
  185. package/src/pages/errors.ts +0 -66
  186. package/src/pages/functions/buildPlugin.ts +0 -110
  187. package/src/pages/functions/buildWorker.ts +0 -156
  188. package/src/pages/functions/filepath-routing.test.ts +0 -234
  189. package/src/pages/functions/filepath-routing.ts +0 -189
  190. package/src/pages/functions/identifiers.ts +0 -78
  191. package/src/pages/functions/routes-consolidation.test.ts +0 -250
  192. package/src/pages/functions/routes-consolidation.ts +0 -73
  193. package/src/pages/functions/routes-transformation.test.ts +0 -282
  194. package/src/pages/functions/routes-transformation.ts +0 -115
  195. package/src/pages/functions/routes-validation.test.ts +0 -403
  196. package/src/pages/functions/routes-validation.ts +0 -202
  197. package/src/pages/functions/routes.ts +0 -151
  198. package/src/pages/functions.tsx +0 -82
  199. package/src/pages/hash.tsx +0 -13
  200. package/src/pages/index.tsx +0 -94
  201. package/src/pages/projects.tsx +0 -169
  202. package/src/pages/publish.tsx +0 -419
  203. package/src/pages/types.ts +0 -49
  204. package/src/pages/upload.tsx +0 -398
  205. package/src/pages/utils.ts +0 -12
  206. package/src/parse.ts +0 -286
  207. package/src/paths.ts +0 -71
  208. package/src/preview.ts +0 -31
  209. package/src/proxy.ts +0 -657
  210. package/src/publish.ts +0 -878
  211. package/src/pubsub/index.ts +0 -286
  212. package/src/pubsub/pubsub-commands.tsx +0 -623
  213. package/src/r2.ts +0 -131
  214. package/src/selfsigned.d.ts +0 -29
  215. package/src/sites.tsx +0 -372
  216. package/src/tail/filters.ts +0 -277
  217. package/src/tail/index.ts +0 -315
  218. package/src/tail/printing.ts +0 -107
  219. package/src/update-check.ts +0 -19
  220. package/src/user/choose-account.tsx +0 -69
  221. package/src/user/env-vars.ts +0 -46
  222. package/src/user/generate-auth-url.ts +0 -33
  223. package/src/user/generate-random-state.ts +0 -16
  224. package/src/user/index.ts +0 -3
  225. package/src/user/user.tsx +0 -1192
  226. package/src/whoami.tsx +0 -169
  227. package/src/worker.ts +0 -234
  228. package/src/zones.ts +0 -167
  229. package/templates/d1-beta-facade.js +0 -174
  230. package/templates/experimental-local-cache-stubs.js +0 -27
  231. package/templates/first-party-worker-module-facade.ts +0 -18
  232. package/templates/format-dev-errors.ts +0 -32
  233. package/templates/serve-static-assets.ts +0 -63
  234. package/templates/service-bindings-module-facade.js +0 -54
  235. package/templates/service-bindings-sw-facade.js +0 -42
package/README.md CHANGED
@@ -1,13 +1,11 @@
1
1
  <h1 align="center"> ⛅️ wrangler </h1>
2
2
  <section align="center" id="shieldio-badges">
3
3
  <a href="https://www.npmjs.com/package/wrangler"><img alt="npm" src="https://img.shields.io/npm/dw/wrangler?style=flat-square"></a>
4
- <img alt="GitHub contributors" src="https://img.shields.io/github/contributors/cloudflare/wrangler2?style=flat-square">
5
- <img alt="GitHub commit activity (branch)" src="https://img.shields.io/github/commit-activity/w/cloudflare/wrangler2/main?style=flat-square">
6
- <a href="https://discord.gg/CloudflareDev"><img alt="Discord" src="https://img.shields.io/discord/595317990191398933?color=%23F48120&style=flat-square"></a>
4
+ <img alt="GitHub contributors" src="https://img.shields.io/github/contributors/cloudflare/workers-sdk?style=flat-square">
5
+ <img alt="GitHub commit activity (branch)" src="https://img.shields.io/github/commit-activity/w/cloudflare/workers-sdk/main?style=flat-square">
6
+ <a href="https://discord.cloudflare.com"><img alt="Discord" src="https://img.shields.io/discord/595317990191398933?color=%23F48120&style=flat-square"></a>
7
7
  </section>
8
8
 
9
- > This package is for wrangler v2.x, released first in May 2022. If you're looking for v1.x of the `@cloudflare/wrangler` package, visit https://www.npmjs.com/package/@cloudflare/wrangler / https://github.com/cloudflare/wrangler.
10
-
11
9
  `wrangler` is a command line tool for building [Cloudflare Workers](https://workers.cloudflare.com/).
12
10
 
13
11
  ## Quick Start
@@ -17,8 +15,8 @@
17
15
  echo "export default { fetch() { return new Response('hello world') } }" > index.js
18
16
  # try it out
19
17
  npx wrangler dev index.js
20
- # and then publish it
21
- npx wrangler publish index.js --name my-worker
18
+ # and then deploy it
19
+ npx wrangler deploy index.js --name my-worker
22
20
  # visit https://my-worker.<your workers subdomain>.workers.dev
23
21
  ```
24
22
 
@@ -26,10 +24,10 @@ npx wrangler publish index.js --name my-worker
26
24
 
27
25
  ```bash
28
26
  # Generate a new project
29
- npx wrangler init my-worker
27
+ npx wrangler init my-worker --no-delegate-c3
30
28
  # try it out
31
29
  cd my-worker && npm run start
32
- # and then publish it
30
+ # and then deploy it
33
31
  npm run deploy
34
32
  ```
35
33
 
@@ -43,15 +41,15 @@ $ npm install wrangler --save-dev
43
41
 
44
42
  Wrangler is configured via a `wrangler.toml` file in the project root. When utilizing the `wrangler init` command, a `wrangler.toml` file will be created for you.
45
43
 
46
- example:
44
+ Example:
47
45
 
48
46
  ```toml
49
- main = "./src/index.ts" # init w/ TypeScript
50
47
  name = "my-worker"
51
- compatibility_date = "YYY-MM-DD"
48
+ main = "./src/index.ts" # init w/ TypeScript
49
+ compatibility_date = "YYYY-MM-DD"
52
50
  ```
53
51
 
54
- for more detailed information about configuration, see the [documentation](https://developers.cloudflare.com/workers/cli-wrangler/configuration)
52
+ For more detailed information about configuration, refer to the [documentation](https://developers.cloudflare.com/workers/wrangler/configuration/).
55
53
 
56
54
  ## Commands
57
55
 
@@ -63,11 +61,11 @@ Creates a Worker project. For details on configuration keys and values, refer to
63
61
 
64
62
  Start a local development server, with live reloading and devtools.
65
63
 
66
- ### `wrangler publish`
64
+ ### `wrangler deploy`
67
65
 
68
66
  Publish the given script to the worldwide Cloudflare network.
69
67
 
70
- For more commands and options, refer to the [documentation](https://developers.cloudflare.com/workers/cli-wrangler/commands).
68
+ For more commands and options, refer to the [documentation](https://developers.cloudflare.com/workers/wrangler/commands/).
71
69
 
72
70
  ## Pages
73
71
 
@@ -82,7 +80,3 @@ For more commands and options, refer to the [documentation](https://developers.c
82
80
  ## Documentation
83
81
 
84
82
  For the latest Wrangler documentation, [click here](https://developers.cloudflare.com/workers/wrangler/).
85
-
86
- ```
87
-
88
- ```
package/bin/wrangler.js CHANGED
@@ -20,7 +20,7 @@ function runWrangler() {
20
20
  // Note Volta and nvm are also recommended in the official docs:
21
21
  // https://developers.cloudflare.com/workers/get-started/guide#2-install-the-workers-cli
22
22
  console.error(
23
- `Wrangler requires at least node.js v${MIN_NODE_VERSION}. You are using v${process.versions.node}. Please update your version of node.js.
23
+ `Wrangler requires at least Node.js v${MIN_NODE_VERSION}. You are using v${process.versions.node}. Please update your version of Node.js.
24
24
 
25
25
  Consider using a Node.js version manager such as https://volta.sh/ or https://github.com/nvm-sh/nvm.`
26
26
  );
@@ -28,30 +28,6 @@ Consider using a Node.js version manager such as https://volta.sh/ or https://gi
28
28
  return;
29
29
  }
30
30
 
31
- let pathToCACerts = process.env.NODE_EXTRA_CA_CERTS;
32
- if (pathToCACerts) {
33
- // TODO:
34
- // - should we log a warning here?
35
- // - maybe we can generate a certificate that concatenates with ours?
36
- //
37
- // I do think it'll be rare that someone wants to add a cert AND
38
- // use Cloudflare WARP, but let's wait till the situation actually
39
- // arises before we do anything about it
40
- } else {
41
- const osTempDir = os.tmpdir();
42
- const certDir = path.join(osTempDir, "wrangler-cert");
43
- const certPath = path.join(certDir, "Cloudflare_CA.pem");
44
- // copy cert to the system temp dir if needed
45
- if (!fs.existsSync(certPath)) {
46
- fs.mkdirSync(certDir, { recursive: true });
47
- fs.writeFileSync(
48
- certPath,
49
- fs.readFileSync(path.join(__dirname, "../Cloudflare_CA.pem"), "utf-8")
50
- );
51
- }
52
- pathToCACerts = certPath;
53
- }
54
-
55
31
  return spawn(
56
32
  process.execPath,
57
33
  [
@@ -62,77 +38,24 @@ Consider using a Node.js version manager such as https://volta.sh/ or https://gi
62
38
  ...process.argv.slice(2),
63
39
  ],
64
40
  {
65
- stdio: "inherit",
66
- env: {
67
- ...process.env,
68
- NODE_EXTRA_CA_CERTS: pathToCACerts,
69
- },
41
+ stdio: ["inherit", "inherit", "inherit", "ipc"],
70
42
  }
71
- ).on("exit", (code) =>
72
- process.exit(code === undefined || code === null ? 0 : code)
73
- );
74
- }
75
-
76
- /**
77
- * Runs a locally-installed version of wrangler, delegating from this version.
78
- * @throws {MODULE_NOT_FOUND} if there isn't a locally installed version of wrangler.
79
- */
80
- function runDelegatedWrangler() {
81
- const packageJsonPath = require.resolve("wrangler/package.json", {
82
- paths: [process.cwd()],
83
- });
84
- const {
85
- bin: { wrangler: binaryPath },
86
- version,
87
- } = JSON.parse(fs.readFileSync(packageJsonPath));
88
- const resolvedBinaryPath = path.resolve(packageJsonPath, "..", binaryPath);
89
-
90
- debug(`Delegating to locally-installed version of wrangler @ v${version}`);
91
-
92
- // this call to `spawn` is simpler because the delegated version will do all
93
- // of the other work.
94
- return spawn(
95
- process.execPath,
96
- [resolvedBinaryPath, ...process.argv.slice(2)],
97
- {
98
- stdio: "inherit",
99
- }
100
- ).on("exit", (code) =>
101
- process.exit(code === undefined || code === null ? 0 : code)
102
- );
103
- }
104
-
105
- /**
106
- * Indicates if this invocation of `wrangler` should delegate
107
- * to a locally-installed version.
108
- */
109
- function shouldDelegate() {
110
- try {
111
- // `require.resolve` will throw if it can't find
112
- // a locally-installed version of `wrangler`
113
- const delegatedPackageJson = require.resolve("wrangler/package.json", {
114
- paths: [process.cwd()],
43
+ )
44
+ .on("exit", (code) =>
45
+ process.exit(code === undefined || code === null ? 0 : code)
46
+ )
47
+ .on("message", (message) => {
48
+ if (process.send) {
49
+ process.send(message);
50
+ }
51
+ })
52
+ .on("disconnect", () => {
53
+ if (process.disconnect) {
54
+ process.disconnect();
55
+ }
115
56
  });
116
- const thisPackageJson = path.resolve(__dirname, "..", "package.json");
117
- // if it's the same path, then we're already a local install -- no need to delegate
118
- return thisPackageJson !== delegatedPackageJson;
119
- } catch (e) {
120
- // there's no local version to delegate to -- `require.resolve` threw
121
- return false;
122
- }
123
57
  }
124
58
 
125
- async function main() {
126
- wranglerProcess = shouldDelegate() ? runDelegatedWrangler() : runWrangler();
127
- }
128
-
129
- process.on("SIGINT", () => {
130
- wranglerProcess && wranglerProcess.kill();
131
- });
132
- process.on("SIGTERM", () => {
133
- wranglerProcess && wranglerProcess.kill();
134
- });
135
-
136
59
  // semiver implementation via https://github.com/lukeed/semiver/blob/ae7eebe6053c96be63032b14fb0b68e2553fcac4/src/index.js
137
60
 
138
61
  /**
@@ -165,4 +88,12 @@ function semiver(a, b, bool) {
165
88
 
166
89
  // end semiver implementation
167
90
 
168
- void main();
91
+ if (module === require.main) {
92
+ wranglerProcess = runWrangler();
93
+ process.on("SIGINT", () => {
94
+ wranglerProcess && wranglerProcess.kill();
95
+ });
96
+ process.on("SIGTERM", () => {
97
+ wranglerProcess && wranglerProcess.kill();
98
+ });
99
+ }