@forge/events 2.1.8-next.1-experimental-44b7a12 → 3.0.0

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.
package/CHANGELOG.md CHANGED
@@ -1,11 +1,27 @@
1
1
  # @forge/events
2
2
 
3
- ## 2.1.8-next.1-experimental-44b7a12
3
+ ## 3.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 78fcb7f: Adds support for TypeScript 5
4
8
 
5
9
  ### Patch Changes
6
10
 
7
11
  - Updated dependencies [561f8f4]
8
- - @forge/api@8.0.0-next.1-experimental-44b7a12
12
+ - Updated dependencies [78fcb7f]
13
+ - @forge/api@8.0.0
14
+
15
+ ## 3.0.0-next.2
16
+
17
+ ### Major Changes
18
+
19
+ - 78fcb7f: Adds support for TypeScript 5
20
+
21
+ ### Patch Changes
22
+
23
+ - Updated dependencies [78fcb7f]
24
+ - @forge/api@8.0.0-next.2
9
25
 
10
26
  ## 2.1.8-next.1
11
27
 
@@ -1,8 +1,8 @@
1
1
  export interface AppEvent {
2
2
  key: string;
3
3
  }
4
- export declare type AppEventPublishResult = AppEventPublishSuccess | AppEventPublishError;
5
- export declare type AppEventPublishSuccess = {
4
+ export type AppEventPublishResult = AppEventPublishSuccess | AppEventPublishError;
5
+ export type AppEventPublishSuccess = {
6
6
  type: 'success';
7
7
  failedEvents: AppEventPublishFailure[];
8
8
  };
@@ -15,7 +15,7 @@ export interface AppEventPublishError {
15
15
  errorType: AppEventErrorType;
16
16
  errorMessage: string;
17
17
  }
18
- export declare type AppEventErrorType = 'VALIDATION_ERROR' | 'AUTHENTICATION_ERROR' | 'AUTHORIZATION_ERROR' | 'RATE_LIMIT' | 'SERVICE_ERROR' | 'SERVICE_UNAVAILABLE' | `OTHER`;
18
+ export type AppEventErrorType = 'VALIDATION_ERROR' | 'AUTHENTICATION_ERROR' | 'AUTHORIZATION_ERROR' | 'RATE_LIMIT' | 'SERVICE_ERROR' | 'SERVICE_UNAVAILABLE' | `OTHER`;
19
19
  export declare const appEvents: {
20
20
  publish(events: AppEvent | AppEvent[]): Promise<AppEventPublishResult>;
21
21
  };
@@ -1 +1 @@
1
- {"version":3,"file":"appEvents.d.ts","sourceRoot":"","sources":["../src/appEvents.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,oBAAY,qBAAqB,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;AASlF,oBAAY,sBAAsB,GAAG;IACnC,IAAI,EAAE,SAAS,CAAC;IAEhB,YAAY,EAAE,sBAAsB,EAAE,CAAC;CACxC,CAAC;AAKF,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,iBAAiB,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,oBAAY,iBAAiB,GACzB,kBAAkB,GAClB,sBAAsB,GACtB,qBAAqB,GACrB,YAAY,GACZ,eAAe,GACf,qBAAqB,GACrB,OAAO,CAAC;AAsBZ,eAAO,MAAM,SAAS;oBACE,QAAQ,GAAG,QAAQ,EAAE,GAAG,QAAQ,qBAAqB,CAAC;CAwB7E,CAAC"}
1
+ {"version":3,"file":"appEvents.d.ts","sourceRoot":"","sources":["../src/appEvents.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,qBAAqB,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;AASlF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,SAAS,CAAC;IAEhB,YAAY,EAAE,sBAAsB,EAAE,CAAC;CACxC,CAAC;AAKF,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,iBAAiB,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GACzB,kBAAkB,GAClB,sBAAsB,GACtB,qBAAqB,GACrB,YAAY,GACZ,eAAe,GACf,qBAAqB,GACrB,OAAO,CAAC;AAsBZ,eAAO,MAAM,SAAS;oBACE,QAAQ,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAwB7E,CAAC"}
@@ -9,4 +9,4 @@ var InvocationErrorCode;
9
9
  InvocationErrorCode["FUNCTION_PLATFORM_RATE_LIMITED"] = "FUNCTION_PLATFORM_RATE_LIMITED";
10
10
  InvocationErrorCode["FUNCTION_UPSTREAM_RATE_LIMITED"] = "FUNCTION_UPSTREAM_RATE_LIMITED";
11
11
  InvocationErrorCode["FUNCTION_RETRY_REQUEST"] = "FUNCTION_RETRY_REQUEST";
12
- })(InvocationErrorCode = exports.InvocationErrorCode || (exports.InvocationErrorCode = {}));
12
+ })(InvocationErrorCode || (exports.InvocationErrorCode = InvocationErrorCode = {}));
@@ -1,6 +1,6 @@
1
1
  import { FetchMethod } from '@forge/api';
2
2
  import { QueueParams } from './types';
3
- export declare type JobStats = {
3
+ export type JobStats = {
4
4
  success: number;
5
5
  inProgress: number;
6
6
  failed: number;
@@ -1 +1 @@
1
- {"version":3,"file":"jobProgress.d.ts","sourceRoot":"","sources":["../src/jobProgress.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,WAAW,EAAE,MAAM,YAAY,CAAC;AAQlE,OAAO,EAAqC,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzE,oBAAY,QAAQ,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAFT,WAAW,EAAE,WAAW,EACxB,EAAE,EAAE,MAAM,EACV,SAAS,GAAE,WAAqC;IAG7D,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAe7B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAY9B"}
1
+ {"version":3,"file":"jobProgress.d.ts","sourceRoot":"","sources":["../src/jobProgress.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,WAAW,EAAE,MAAM,YAAY,CAAC;AAQlE,OAAO,EAAqC,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzE,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAFT,WAAW,EAAE,WAAW,EACxB,EAAE,EAAE,MAAM,EACV,SAAS,GAAE,WAAqC;IAG7D,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAe7B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAY9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtD,eAAO,MAAM,SAAS,6EAA6E,CAAC;AACpG,eAAO,MAAM,cAAc,2EAA2E,CAAC;AACvG,eAAO,MAAM,eAAe,4EAA4E,CAAC;AAEzG,eAAO,MAAM,IAAI,aAAoB,MAAM,QAAQ,OAAO,aAAa,WAAW,KAAG,QAAQ,WAAW,CAUvG,CAAC"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtD,eAAO,MAAM,SAAS,6EAA6E,CAAC;AACpG,eAAO,MAAM,cAAc,2EAA2E,CAAC;AACvG,eAAO,MAAM,eAAe,4EAA4E,CAAC;AAEzG,eAAO,MAAM,IAAI,GAAU,UAAU,MAAM,EAAE,MAAM,OAAO,EAAE,WAAW,WAAW,KAAG,OAAO,CAAC,WAAW,CAUvG,CAAC"}
package/out/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare type Payload = Record<string, unknown>;
1
+ export type Payload = Record<string, unknown>;
2
2
  export interface QueueParams {
3
3
  key: string;
4
4
  }
@@ -18,7 +18,7 @@ export interface PushEvent<T extends Body = Body> {
18
18
  delayInSeconds?: number;
19
19
  concurrency?: Concurrency;
20
20
  }
21
- export declare type Body = Record<string, unknown>;
21
+ export type Body = Record<string, unknown>;
22
22
  export interface Concurrency {
23
23
  key: string;
24
24
  limit: number;
@@ -46,6 +46,6 @@ export interface RetentionWindow {
46
46
  startTime: string;
47
47
  remainingTimeMs: number;
48
48
  }
49
- export declare type GetStatsRequest = APIRequest;
50
- export declare type CancelJobRequest = APIRequest;
49
+ export type GetStatsRequest = APIRequest;
50
+ export type CancelJobRequest = APIRequest;
51
51
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oBAAY,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAE,SAAQ,UAAU;IACpE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI;IAC9C,IAAI,EAAE,CAAC,CAAC;IACR,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,oBAAY,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,GAAG,CAAC;IACf,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,oBAAY,eAAe,GAAG,UAAU,CAAC;AACzC,oBAAY,gBAAgB,GAAG,UAAU,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAE,SAAQ,UAAU;IACpE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI;IAC9C,IAAI,EAAE,CAAC,CAAC;IACR,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,GAAG,CAAC;IACf,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC;AACzC,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAezC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAMtG,eAAO,MAAM,gBAAgB,cAAe,MAAM,SAIjD,CAAC;AAEF,eAAO,MAAM,oBAAoB,UAAW,UAAU,IAAI,CAAC,SAI1D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CA6B5G;AAED,eAAO,MAAM,uBAAuB,oBAAqB,eAAe,SAKvE,CAAC;AAEF,eAAO,MAAM,wBAAwB,qBAAsB,gBAAgB,SAK1E,CAAC;AAEF,eAAO,MAAM,mBAAmB,aAAoB,WAAW,yBAAyB,MAAM,kBA6B7F,CAAC;AAEF,eAAO,MAAM,uBAAuB,gBAAuB,WAAW,YAAY,WAAW,UAAU,UAAU,kBAkChH,CAAC;AAEF,eAAO,MAAM,2BAA2B,aAAoB,WAAW,mBAAmB,eAAe,kBAMxG,CAAC;AAEF,eAAO,MAAM,4BAA4B,aAAoB,WAAW,oBAAoB,eAAe,kBAM1G,CAAC"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAezC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAMtG,eAAO,MAAM,gBAAgB,GAAI,WAAW,MAAM,SAIjD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,OAAO,SAAS,CAAC,IAAI,CAAC,SAI1D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CA6B5G;AAED,eAAO,MAAM,uBAAuB,GAAI,iBAAiB,eAAe,SAKvE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,kBAAkB,gBAAgB,SAK1E,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,UAAU,WAAW,EAAE,uBAAuB,MAAM,kBA6B7F,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,aAAa,WAAW,EAAE,UAAU,WAAW,EAAE,QAAQ,UAAU,kBAkChH,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAU,UAAU,WAAW,EAAE,iBAAiB,eAAe,kBAMxG,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAU,UAAU,WAAW,EAAE,kBAAkB,eAAe,kBAM1G,CAAC"}
package/out/validators.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateCancelJobAPIResponse = exports.validateGetStatsAPIResponse = exports.validatePushAPIResponse = exports.validateAPIResponse = exports.validateCancelJobRequest = exports.validateGetStatsPayload = exports.validatePushEvents = exports.validatePushSettings = exports.validateQueueKey = void 0;
3
+ exports.validateCancelJobAPIResponse = exports.validateGetStatsAPIResponse = exports.validatePushAPIResponse = exports.validateAPIResponse = exports.validateCancelJobRequest = exports.validateGetStatsPayload = exports.validatePushSettings = exports.validateQueueKey = void 0;
4
+ exports.validatePushEvents = validatePushEvents;
4
5
  const errors_1 = require("./errors");
5
6
  const text_1 = require("./text");
6
7
  const VALID_QUEUE_NAME_PATTERN = /^[a-zA-Z0-9-_]+$/;
@@ -41,7 +42,6 @@ function validatePushEvents(arg) {
41
42
  }
42
43
  return events;
43
44
  }
44
- exports.validatePushEvents = validatePushEvents;
45
45
  const validateGetStatsPayload = (getStatsRequest) => {
46
46
  if (!getStatsRequest.jobId) {
47
47
  throw new errors_1.JobDoesNotExistError(text_1.Text.error.jobIdEmpty);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forge/events",
3
- "version": "2.1.8-next.1-experimental-44b7a12",
3
+ "version": "3.0.0",
4
4
  "description": "Forge Async Event methods",
5
5
  "author": "Atlassian",
6
6
  "license": "SEE LICENSE IN LICENSE.txt",
@@ -12,12 +12,21 @@
12
12
  "compile": "tsc -b -v"
13
13
  },
14
14
  "devDependencies": {
15
- "@types/node": "20.19.1"
15
+ "@types/node": "20.19.1",
16
+ "typescript": "5.9.2"
16
17
  },
17
18
  "dependencies": {
18
- "@forge/api": "8.0.0-next.1-experimental-44b7a12"
19
+ "@forge/api": "8.0.0"
19
20
  },
20
21
  "publishConfig": {
21
22
  "registry": "https://packages.atlassian.com/api/npm/npm-public/"
23
+ },
24
+ "peerDependencies": {
25
+ "typescript": ">=5.0.0"
26
+ },
27
+ "peerDependenciesMeta": {
28
+ "typescript": {
29
+ "optional": true
30
+ }
22
31
  }
23
32
  }