@types/node 22.7.2 → 22.7.4

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.
node/buffer.d.ts CHANGED
@@ -261,113 +261,15 @@ declare module "buffer" {
261
261
  | {
262
262
  valueOf(): T;
263
263
  };
264
- // `WithArrayBufferLike` is a backwards-compatible workaround for the addition of a `TArrayBuffer` type parameter to
265
- // `Uint8Array` to ensure that `Buffer` remains assignment-compatible with `Uint8Array`, but without the added
266
- // complexity involved with making `Buffer` itself generic as that would require re-introducing `"typesVersions"` to
267
- // the NodeJS types. It is likely this interface will become deprecated in the future once `Buffer` does become generic.
268
- interface WithArrayBufferLike<TArrayBuffer extends ArrayBufferLike> {
269
- readonly buffer: TArrayBuffer;
270
- }
271
264
  /**
272
265
  * Raw data is stored in instances of the Buffer class.
273
266
  * A Buffer is similar to an array of integers but corresponds to a raw memory allocation outside the V8 heap. A Buffer cannot be resized.
274
267
  * Valid string encodings: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'base64url'|'binary'(deprecated)|'hex'
275
268
  */
276
269
  interface BufferConstructor {
277
- /**
278
- * Allocates a new buffer containing the given {str}.
279
- *
280
- * @param str String to store in buffer.
281
- * @param encoding encoding to use, optional. Default is 'utf8'
282
- * @deprecated since v10.0.0 - Use `Buffer.from(string[, encoding])` instead.
283
- */
284
- new(str: string, encoding?: BufferEncoding): Buffer;
285
- /**
286
- * Allocates a new buffer of {size} octets.
287
- *
288
- * @param size count of octets to allocate.
289
- * @deprecated since v10.0.0 - Use `Buffer.alloc()` instead (also see `Buffer.allocUnsafe()`).
290
- */
291
- new(size: number): Buffer;
292
- /**
293
- * Allocates a new buffer containing the given {array} of octets.
294
- *
295
- * @param array The octets to store.
296
- * @deprecated since v10.0.0 - Use `Buffer.from(array)` instead.
297
- */
298
- new(array: Uint8Array): Buffer;
299
- /**
300
- * Produces a Buffer backed by the same allocated memory as
301
- * the given {ArrayBuffer}/{SharedArrayBuffer}.
302
- *
303
- * @param arrayBuffer The ArrayBuffer with which to share memory.
304
- * @deprecated since v10.0.0 - Use `Buffer.from(arrayBuffer[, byteOffset[, length]])` instead.
305
- */
306
- new(arrayBuffer: ArrayBuffer | SharedArrayBuffer): Buffer;
307
- /**
308
- * Allocates a new buffer containing the given {array} of octets.
309
- *
310
- * @param array The octets to store.
311
- * @deprecated since v10.0.0 - Use `Buffer.from(array)` instead.
312
- */
313
- new(array: readonly any[]): Buffer;
314
- /**
315
- * Copies the passed {buffer} data onto a new {Buffer} instance.
316
- *
317
- * @param buffer The buffer to copy.
318
- * @deprecated since v10.0.0 - Use `Buffer.from(buffer)` instead.
319
- */
320
- new(buffer: Buffer): Buffer;
321
- /**
322
- * Allocates a new `Buffer` using an `array` of bytes in the range `0` – `255`.
323
- * Array entries outside that range will be truncated to fit into it.
324
- *
325
- * ```js
326
- * import { Buffer } from 'node:buffer';
327
- *
328
- * // Creates a new Buffer containing the UTF-8 bytes of the string 'buffer'.
329
- * const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
330
- * ```
331
- *
332
- * If `array` is an `Array`\-like object (that is, one with a `length` property of
333
- * type `number`), it is treated as if it is an array, unless it is a `Buffer` or
334
- * a `Uint8Array`. This means all other `TypedArray` variants get treated as an `Array`. To create a `Buffer` from the bytes backing a `TypedArray`, use `Buffer.copyBytesFrom()`.
335
- *
336
- * A `TypeError` will be thrown if `array` is not an `Array` or another type
337
- * appropriate for `Buffer.from()` variants.
338
- *
339
- * `Buffer.from(array)` and `Buffer.from(string)` may also use the internal `Buffer` pool like `Buffer.allocUnsafe()` does.
340
- * @since v5.10.0
341
- */
342
- from(
343
- arrayBuffer: WithImplicitCoercion<ArrayBuffer | SharedArrayBuffer>,
344
- byteOffset?: number,
345
- length?: number,
346
- ): Buffer;
347
- /**
348
- * Creates a new Buffer using the passed {data}
349
- * @param data data to create a new Buffer
350
- */
351
- from(data: Uint8Array | readonly number[]): Buffer;
352
- from(data: WithImplicitCoercion<Uint8Array | readonly number[] | string>): Buffer;
353
- /**
354
- * Creates a new Buffer containing the given JavaScript string {str}.
355
- * If provided, the {encoding} parameter identifies the character encoding.
356
- * If not provided, {encoding} defaults to 'utf8'.
357
- */
358
- from(
359
- str:
360
- | WithImplicitCoercion<string>
361
- | {
362
- [Symbol.toPrimitive](hint: "string"): string;
363
- },
364
- encoding?: BufferEncoding,
365
- ): Buffer;
366
- /**
367
- * Creates a new Buffer using the passed {data}
368
- * @param values to create a new Buffer
369
- */
370
- of(...items: number[]): Buffer;
270
+ // see buffer.buffer.d.ts for implementation specific to TypeScript 5.7 and later
271
+ // see ts5.6/buffer.buffer.d.ts for implementation specific to TypeScript 5.6 and earlier
272
+
371
273
  /**
372
274
  * Returns `true` if `obj` is a `Buffer`, `false` otherwise.
373
275
  *
@@ -439,62 +341,6 @@ declare module "buffer" {
439
341
  string: string | Buffer | NodeJS.ArrayBufferView | ArrayBuffer | SharedArrayBuffer,
440
342
  encoding?: BufferEncoding,
441
343
  ): number;
442
- /**
443
- * Returns a new `Buffer` which is the result of concatenating all the `Buffer` instances in the `list` together.
444
- *
445
- * If the list has no items, or if the `totalLength` is 0, then a new zero-length `Buffer` is returned.
446
- *
447
- * If `totalLength` is not provided, it is calculated from the `Buffer` instances
448
- * in `list` by adding their lengths.
449
- *
450
- * If `totalLength` is provided, it is coerced to an unsigned integer. If the
451
- * combined length of the `Buffer`s in `list` exceeds `totalLength`, the result is
452
- * truncated to `totalLength`.
453
- *
454
- * ```js
455
- * import { Buffer } from 'node:buffer';
456
- *
457
- * // Create a single `Buffer` from a list of three `Buffer` instances.
458
- *
459
- * const buf1 = Buffer.alloc(10);
460
- * const buf2 = Buffer.alloc(14);
461
- * const buf3 = Buffer.alloc(18);
462
- * const totalLength = buf1.length + buf2.length + buf3.length;
463
- *
464
- * console.log(totalLength);
465
- * // Prints: 42
466
- *
467
- * const bufA = Buffer.concat([buf1, buf2, buf3], totalLength);
468
- *
469
- * console.log(bufA);
470
- * // Prints: <Buffer 00 00 00 00 ...>
471
- * console.log(bufA.length);
472
- * // Prints: 42
473
- * ```
474
- *
475
- * `Buffer.concat()` may also use the internal `Buffer` pool like `Buffer.allocUnsafe()` does.
476
- * @since v0.7.11
477
- * @param list List of `Buffer` or {@link Uint8Array} instances to concatenate.
478
- * @param totalLength Total length of the `Buffer` instances in `list` when concatenated.
479
- */
480
- concat(list: readonly Uint8Array[], totalLength?: number): Buffer;
481
- /**
482
- * Copies the underlying memory of `view` into a new `Buffer`.
483
- *
484
- * ```js
485
- * const u16 = new Uint16Array([0, 0xffff]);
486
- * const buf = Buffer.copyBytesFrom(u16, 1, 1);
487
- * u16[1] = 0;
488
- * console.log(buf.length); // 2
489
- * console.log(buf[0]); // 255
490
- * console.log(buf[1]); // 255
491
- * ```
492
- * @since v19.8.0
493
- * @param view The {TypedArray} to copy.
494
- * @param [offset=0] The starting offset within `view`.
495
- * @param [length=view.length - offset] The number of elements from `view` to copy.
496
- */
497
- copyBytesFrom(view: NodeJS.TypedArray, offset?: number, length?: number): Buffer;
498
344
  /**
499
345
  * Compares `buf1` to `buf2`, typically for the purpose of sorting arrays of `Buffer` instances. This is equivalent to calling `buf1.compare(buf2)`.
500
346
  *
@@ -513,135 +359,6 @@ declare module "buffer" {
513
359
  * @return Either `-1`, `0`, or `1`, depending on the result of the comparison. See `compare` for details.
514
360
  */
515
361
  compare(buf1: Uint8Array, buf2: Uint8Array): -1 | 0 | 1;
516
- /**
517
- * Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the`Buffer` will be zero-filled.
518
- *
519
- * ```js
520
- * import { Buffer } from 'node:buffer';
521
- *
522
- * const buf = Buffer.alloc(5);
523
- *
524
- * console.log(buf);
525
- * // Prints: <Buffer 00 00 00 00 00>
526
- * ```
527
- *
528
- * If `size` is larger than {@link constants.MAX_LENGTH} or smaller than 0, `ERR_OUT_OF_RANGE` is thrown.
529
- *
530
- * If `fill` is specified, the allocated `Buffer` will be initialized by calling `buf.fill(fill)`.
531
- *
532
- * ```js
533
- * import { Buffer } from 'node:buffer';
534
- *
535
- * const buf = Buffer.alloc(5, 'a');
536
- *
537
- * console.log(buf);
538
- * // Prints: <Buffer 61 61 61 61 61>
539
- * ```
540
- *
541
- * If both `fill` and `encoding` are specified, the allocated `Buffer` will be
542
- * initialized by calling `buf.fill(fill, encoding)`.
543
- *
544
- * ```js
545
- * import { Buffer } from 'node:buffer';
546
- *
547
- * const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
548
- *
549
- * console.log(buf);
550
- * // Prints: <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
551
- * ```
552
- *
553
- * Calling `Buffer.alloc()` can be measurably slower than the alternative `Buffer.allocUnsafe()` but ensures that the newly created `Buffer` instance
554
- * contents will never contain sensitive data from previous allocations, including
555
- * data that might not have been allocated for `Buffer`s.
556
- *
557
- * A `TypeError` will be thrown if `size` is not a number.
558
- * @since v5.10.0
559
- * @param size The desired length of the new `Buffer`.
560
- * @param [fill=0] A value to pre-fill the new `Buffer` with.
561
- * @param [encoding='utf8'] If `fill` is a string, this is its encoding.
562
- */
563
- alloc(size: number, fill?: string | Uint8Array | number, encoding?: BufferEncoding): Buffer;
564
- /**
565
- * Allocates a new `Buffer` of `size` bytes. If `size` is larger than {@link constants.MAX_LENGTH} or smaller than 0, `ERR_OUT_OF_RANGE` is thrown.
566
- *
567
- * The underlying memory for `Buffer` instances created in this way is _not_
568
- * _initialized_. The contents of the newly created `Buffer` are unknown and _may contain sensitive data_. Use `Buffer.alloc()` instead to initialize`Buffer` instances with zeroes.
569
- *
570
- * ```js
571
- * import { Buffer } from 'node:buffer';
572
- *
573
- * const buf = Buffer.allocUnsafe(10);
574
- *
575
- * console.log(buf);
576
- * // Prints (contents may vary): <Buffer a0 8b 28 3f 01 00 00 00 50 32>
577
- *
578
- * buf.fill(0);
579
- *
580
- * console.log(buf);
581
- * // Prints: <Buffer 00 00 00 00 00 00 00 00 00 00>
582
- * ```
583
- *
584
- * A `TypeError` will be thrown if `size` is not a number.
585
- *
586
- * The `Buffer` module pre-allocates an internal `Buffer` instance of
587
- * size `Buffer.poolSize` that is used as a pool for the fast allocation of new `Buffer` instances created using `Buffer.allocUnsafe()`, `Buffer.from(array)`,
588
- * and `Buffer.concat()` only when `size` is less than `Buffer.poolSize >>> 1` (floor of `Buffer.poolSize` divided by two).
589
- *
590
- * Use of this pre-allocated internal memory pool is a key difference between
591
- * calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`.
592
- * Specifically, `Buffer.alloc(size, fill)` will _never_ use the internal `Buffer`pool, while `Buffer.allocUnsafe(size).fill(fill)`_will_ use the internal`Buffer` pool if `size` is less
593
- * than or equal to half `Buffer.poolSize`. The
594
- * difference is subtle but can be important when an application requires the
595
- * additional performance that `Buffer.allocUnsafe()` provides.
596
- * @since v5.10.0
597
- * @param size The desired length of the new `Buffer`.
598
- */
599
- allocUnsafe(size: number): Buffer;
600
- /**
601
- * Allocates a new `Buffer` of `size` bytes. If `size` is larger than {@link constants.MAX_LENGTH} or smaller than 0, `ERR_OUT_OF_RANGE` is thrown. A zero-length `Buffer` is created if
602
- * `size` is 0.
603
- *
604
- * The underlying memory for `Buffer` instances created in this way is _not_
605
- * _initialized_. The contents of the newly created `Buffer` are unknown and _may contain sensitive data_. Use `buf.fill(0)` to initialize
606
- * such `Buffer` instances with zeroes.
607
- *
608
- * When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances,
609
- * allocations under 4 KiB are sliced from a single pre-allocated `Buffer`. This
610
- * allows applications to avoid the garbage collection overhead of creating many
611
- * individually allocated `Buffer` instances. This approach improves both
612
- * performance and memory usage by eliminating the need to track and clean up as
613
- * many individual `ArrayBuffer` objects.
614
- *
615
- * However, in the case where a developer may need to retain a small chunk of
616
- * memory from a pool for an indeterminate amount of time, it may be appropriate
617
- * to create an un-pooled `Buffer` instance using `Buffer.allocUnsafeSlow()` and
618
- * then copying out the relevant bits.
619
- *
620
- * ```js
621
- * import { Buffer } from 'node:buffer';
622
- *
623
- * // Need to keep around a few small chunks of memory.
624
- * const store = [];
625
- *
626
- * socket.on('readable', () => {
627
- * let data;
628
- * while (null !== (data = readable.read())) {
629
- * // Allocate for retained data.
630
- * const sb = Buffer.allocUnsafeSlow(10);
631
- *
632
- * // Copy the data into the new allocation.
633
- * data.copy(sb, 0, 0, 10);
634
- *
635
- * store.push(sb);
636
- * }
637
- * });
638
- * ```
639
- *
640
- * A `TypeError` will be thrown if `size` is not a number.
641
- * @since v5.12.0
642
- * @param size The desired length of the new `Buffer`.
643
- */
644
- allocUnsafeSlow(size: number): Buffer;
645
362
  /**
646
363
  * This is the size (in bytes) of pre-allocated internal `Buffer` instances used
647
364
  * for pooling. This value may be modified.
@@ -649,7 +366,10 @@ declare module "buffer" {
649
366
  */
650
367
  poolSize: number;
651
368
  }
652
- interface Buffer extends Uint8Array {
369
+ interface Buffer {
370
+ // see buffer.buffer.d.ts for implementation specific to TypeScript 5.7 and later
371
+ // see ts5.6/buffer.buffer.d.ts for implementation specific to TypeScript 5.6 and earlier
372
+
653
373
  /**
654
374
  * Writes `string` to `buf` at `offset` according to the character encoding in`encoding`. The `length` parameter is the number of bytes to write. If `buf` did
655
375
  * not contain enough space to fit the entire string, only part of `string` will be
@@ -886,100 +606,6 @@ declare module "buffer" {
886
606
  * @return The number of bytes copied.
887
607
  */
888
608
  copy(target: Uint8Array, targetStart?: number, sourceStart?: number, sourceEnd?: number): number;
889
- /**
890
- * Returns a new `Buffer` that references the same memory as the original, but
891
- * offset and cropped by the `start` and `end` indices.
892
- *
893
- * This method is not compatible with the `Uint8Array.prototype.slice()`,
894
- * which is a superclass of `Buffer`. To copy the slice, use`Uint8Array.prototype.slice()`.
895
- *
896
- * ```js
897
- * import { Buffer } from 'node:buffer';
898
- *
899
- * const buf = Buffer.from('buffer');
900
- *
901
- * const copiedBuf = Uint8Array.prototype.slice.call(buf);
902
- * copiedBuf[0]++;
903
- * console.log(copiedBuf.toString());
904
- * // Prints: cuffer
905
- *
906
- * console.log(buf.toString());
907
- * // Prints: buffer
908
- *
909
- * // With buf.slice(), the original buffer is modified.
910
- * const notReallyCopiedBuf = buf.slice();
911
- * notReallyCopiedBuf[0]++;
912
- * console.log(notReallyCopiedBuf.toString());
913
- * // Prints: cuffer
914
- * console.log(buf.toString());
915
- * // Also prints: cuffer (!)
916
- * ```
917
- * @since v0.3.0
918
- * @deprecated Use `subarray` instead.
919
- * @param [start=0] Where the new `Buffer` will start.
920
- * @param [end=buf.length] Where the new `Buffer` will end (not inclusive).
921
- */
922
- slice(start?: number, end?: number): Buffer & WithArrayBufferLike<ArrayBuffer>;
923
- /**
924
- * Returns a new `Buffer` that references the same memory as the original, but
925
- * offset and cropped by the `start` and `end` indices.
926
- *
927
- * Specifying `end` greater than `buf.length` will return the same result as
928
- * that of `end` equal to `buf.length`.
929
- *
930
- * This method is inherited from [`TypedArray.prototype.subarray()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray).
931
- *
932
- * Modifying the new `Buffer` slice will modify the memory in the original `Buffer`because the allocated memory of the two objects overlap.
933
- *
934
- * ```js
935
- * import { Buffer } from 'node:buffer';
936
- *
937
- * // Create a `Buffer` with the ASCII alphabet, take a slice, and modify one byte
938
- * // from the original `Buffer`.
939
- *
940
- * const buf1 = Buffer.allocUnsafe(26);
941
- *
942
- * for (let i = 0; i < 26; i++) {
943
- * // 97 is the decimal ASCII value for 'a'.
944
- * buf1[i] = i + 97;
945
- * }
946
- *
947
- * const buf2 = buf1.subarray(0, 3);
948
- *
949
- * console.log(buf2.toString('ascii', 0, buf2.length));
950
- * // Prints: abc
951
- *
952
- * buf1[0] = 33;
953
- *
954
- * console.log(buf2.toString('ascii', 0, buf2.length));
955
- * // Prints: !bc
956
- * ```
957
- *
958
- * Specifying negative indexes causes the slice to be generated relative to the
959
- * end of `buf` rather than the beginning.
960
- *
961
- * ```js
962
- * import { Buffer } from 'node:buffer';
963
- *
964
- * const buf = Buffer.from('buffer');
965
- *
966
- * console.log(buf.subarray(-6, -1).toString());
967
- * // Prints: buffe
968
- * // (Equivalent to buf.subarray(0, 5).)
969
- *
970
- * console.log(buf.subarray(-6, -2).toString());
971
- * // Prints: buff
972
- * // (Equivalent to buf.subarray(0, 4).)
973
- *
974
- * console.log(buf.subarray(-5, -2).toString());
975
- * // Prints: uff
976
- * // (Equivalent to buf.subarray(1, 4).)
977
- * ```
978
- * @since v3.0.0
979
- * @param [start=0] Where the new `Buffer` will start.
980
- * @param [end=buf.length] Where the new `Buffer` will end (not inclusive).
981
- */
982
- subarray(start?: number, end?: number): Buffer & WithArrayBufferLike<this["buffer"]>;
983
609
  /**
984
610
  * Writes `value` to `buf` at the specified `offset` as big-endian.
985
611
  *
node/globals.d.ts CHANGED
@@ -483,20 +483,6 @@ declare global {
483
483
  unref(): this;
484
484
  }
485
485
 
486
- type TypedArray =
487
- | Uint8Array
488
- | Uint8ClampedArray
489
- | Uint16Array
490
- | Uint32Array
491
- | Int8Array
492
- | Int16Array
493
- | Int32Array
494
- | BigUint64Array
495
- | BigInt64Array
496
- | Float32Array
497
- | Float64Array;
498
- type ArrayBufferView = TypedArray | DataView;
499
-
500
486
  interface Require {
501
487
  (id: string): any;
502
488
  resolve: RequireResolve;
@@ -0,0 +1,21 @@
1
+ export {}; // Make this a module
2
+
3
+ declare global {
4
+ namespace NodeJS {
5
+ type TypedArray<TArrayBuffer extends ArrayBufferLike = ArrayBufferLike> =
6
+ | Uint8Array<TArrayBuffer>
7
+ | Uint8ClampedArray<TArrayBuffer>
8
+ | Uint16Array<TArrayBuffer>
9
+ | Uint32Array<TArrayBuffer>
10
+ | Int8Array<TArrayBuffer>
11
+ | Int16Array<TArrayBuffer>
12
+ | Int32Array<TArrayBuffer>
13
+ | BigUint64Array<TArrayBuffer>
14
+ | BigInt64Array<TArrayBuffer>
15
+ | Float32Array<TArrayBuffer>
16
+ | Float64Array<TArrayBuffer>;
17
+ type ArrayBufferView<TArrayBuffer extends ArrayBufferLike = ArrayBufferLike> =
18
+ | TypedArray<TArrayBuffer>
19
+ | DataView<TArrayBuffer>;
20
+ }
21
+ }
node/index.d.ts CHANGED
@@ -22,7 +22,7 @@
22
22
  * IN THE SOFTWARE.
23
23
  */
24
24
 
25
- // NOTE: These definitions support NodeJS and TypeScript 4.9+.
25
+ // NOTE: These definitions support NodeJS and TypeScript 5.7+.
26
26
 
27
27
  // Reference required types from the default lib:
28
28
  /// <reference lib="es2020" />
@@ -30,6 +30,10 @@
30
30
  /// <reference lib="esnext.intl" />
31
31
  /// <reference lib="esnext.bigint" />
32
32
 
33
+ // Definitions specific to TypeScript 4.9 through 5.7+
34
+ /// <reference path="globals.typedarray.d.ts" />
35
+ /// <reference path="buffer.buffer.d.ts" />
36
+
33
37
  // Base definitions for all NodeJS modules that are not specific to any version of TypeScript:
34
38
  /// <reference path="assert.d.ts" />
35
39
  /// <reference path="assert/strict.d.ts" />
node/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@types/node",
3
- "version": "22.7.2",
3
+ "version": "22.7.4",
4
4
  "description": "TypeScript definitions for node",
5
5
  "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node",
6
6
  "license": "MIT",
@@ -203,6 +203,13 @@
203
203
  ],
204
204
  "main": "",
205
205
  "types": "index.d.ts",
206
+ "typesVersions": {
207
+ "<=5.6": {
208
+ "*": [
209
+ "ts5.6/*"
210
+ ]
211
+ }
212
+ },
206
213
  "repository": {
207
214
  "type": "git",
208
215
  "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
@@ -212,6 +219,6 @@
212
219
  "dependencies": {
213
220
  "undici-types": "~6.19.2"
214
221
  },
215
- "typesPublisherContentHash": "8376ea7c8f7b17e938afe6a3333c3c4901e0574831c87341327c713768249c73",
222
+ "typesPublisherContentHash": "58c8a4b0f59c44e08d89b33eab493f0e44c78851904ecec99425a6357184e01b",
216
223
  "typeScriptVersion": "4.8"
217
224
  }