@timothyw/pat-common 1.0.112 → 1.0.113

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 (19) hide show
  1. package/dist/types/api/notifications/create-notification-template-types.d.ts +3 -18
  2. package/dist/types/api/notifications/create-notification-template-types.js +1 -7
  3. package/dist/types/api/notifications/delete-notification-template-types.d.ts +2 -11
  4. package/dist/types/api/notifications/delete-notification-template-types.js +1 -6
  5. package/dist/types/api/notifications/get-notification-templates-types.d.ts +3 -18
  6. package/dist/types/api/notifications/get-notification-templates-types.js +1 -7
  7. package/dist/types/api/notifications/preview-notification-template-types.d.ts +5 -34
  8. package/dist/types/api/notifications/preview-notification-template-types.js +1 -12
  9. package/dist/types/api/notifications/sync-notification-template-types.d.ts +3 -18
  10. package/dist/types/api/notifications/sync-notification-template-types.js +1 -7
  11. package/dist/types/api/notifications/update-notification-template-types.d.ts +3 -146
  12. package/dist/types/api/notifications/update-notification-template-types.js +1 -4
  13. package/package.json +1 -1
  14. package/src/types/api/notifications/create-notification-template-types.ts +3 -12
  15. package/src/types/api/notifications/delete-notification-template-types.ts +1 -7
  16. package/src/types/api/notifications/get-notification-templates-types.ts +3 -12
  17. package/src/types/api/notifications/preview-notification-template-types.ts +8 -13
  18. package/src/types/api/notifications/sync-notification-template-types.ts +3 -12
  19. package/src/types/api/notifications/update-notification-template-types.ts +4 -11
@@ -73,21 +73,6 @@ export declare const createNotificationTemplateRequestSchema: z.ZodObject<{
73
73
  customized?: boolean | undefined;
74
74
  }>;
75
75
  export type CreateNotificationTemplateRequest = z.infer<typeof createNotificationTemplateRequestSchema>;
76
- export declare const createNotificationTemplateResponseSchema: z.ZodObject<{
77
- success: z.ZodBoolean;
78
- template: z.ZodOptional<z.ZodAny>;
79
- error: z.ZodOptional<z.ZodString>;
80
- }, "strip", z.ZodTypeAny, {
81
- success: boolean;
82
- error?: string | undefined;
83
- template?: any;
84
- }, {
85
- success: boolean;
86
- error?: string | undefined;
87
- template?: any;
88
- }>;
89
- export type CreateNotificationTemplateResponse = {
90
- success: boolean;
91
- template?: Serialized<NotificationTemplateData>;
92
- error?: string;
93
- };
76
+ export interface CreateNotificationTemplateResponse {
77
+ template: Serialized<NotificationTemplateData>;
78
+ }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createNotificationTemplateResponseSchema = exports.createNotificationTemplateRequestSchema = void 0;
3
+ exports.createNotificationTemplateRequestSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const notification_template_data_1 = require("../../models/notification-template-data");
6
6
  // Request schema
@@ -23,9 +23,3 @@ exports.createNotificationTemplateRequestSchema = zod_1.z.object({
23
23
  inheritedFrom: zod_1.z.string().optional(),
24
24
  customized: zod_1.z.boolean().default(false)
25
25
  });
26
- // Response schema
27
- exports.createNotificationTemplateResponseSchema = zod_1.z.object({
28
- success: zod_1.z.boolean(),
29
- template: zod_1.z.any().optional(), // Will be Serialized<NotificationTemplateData>
30
- error: zod_1.z.string().optional()
31
- });
@@ -1,14 +1,5 @@
1
1
  import { z } from "zod";
2
2
  export declare const deleteNotificationTemplateRequestSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
3
3
  export type DeleteNotificationTemplateRequest = z.infer<typeof deleteNotificationTemplateRequestSchema>;
4
- export declare const deleteNotificationTemplateResponseSchema: z.ZodObject<{
5
- success: z.ZodBoolean;
6
- error: z.ZodOptional<z.ZodString>;
7
- }, "strip", z.ZodTypeAny, {
8
- success: boolean;
9
- error?: string | undefined;
10
- }, {
11
- success: boolean;
12
- error?: string | undefined;
13
- }>;
14
- export type DeleteNotificationTemplateResponse = z.infer<typeof deleteNotificationTemplateResponseSchema>;
4
+ export interface DeleteNotificationTemplateResponse {
5
+ }
@@ -1,11 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.deleteNotificationTemplateResponseSchema = exports.deleteNotificationTemplateRequestSchema = void 0;
3
+ exports.deleteNotificationTemplateRequestSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  // Request schema - no body needed for DELETE
6
6
  exports.deleteNotificationTemplateRequestSchema = zod_1.z.object({});
7
- // Response schema
8
- exports.deleteNotificationTemplateResponseSchema = zod_1.z.object({
9
- success: zod_1.z.boolean(),
10
- error: zod_1.z.string().optional()
11
- });
@@ -3,21 +3,6 @@ import { Serialized } from "../../../utils";
3
3
  import { NotificationTemplateData } from "../../models/notification-template-data";
4
4
  export declare const getNotificationTemplatesRequestSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
5
5
  export type GetNotificationTemplatesRequest = z.infer<typeof getNotificationTemplatesRequestSchema>;
6
- export declare const getNotificationTemplatesResponseSchema: z.ZodObject<{
7
- success: z.ZodBoolean;
8
- templates: z.ZodOptional<z.ZodArray<z.ZodAny, "many">>;
9
- error: z.ZodOptional<z.ZodString>;
10
- }, "strip", z.ZodTypeAny, {
11
- success: boolean;
12
- templates?: any[] | undefined;
13
- error?: string | undefined;
14
- }, {
15
- success: boolean;
16
- templates?: any[] | undefined;
17
- error?: string | undefined;
18
- }>;
19
- export type GetNotificationTemplatesResponse = {
20
- success: boolean;
21
- templates?: Serialized<NotificationTemplateData>[];
22
- error?: string;
23
- };
6
+ export interface GetNotificationTemplatesResponse {
7
+ templates: Serialized<NotificationTemplateData>[];
8
+ }
@@ -1,12 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getNotificationTemplatesResponseSchema = exports.getNotificationTemplatesRequestSchema = void 0;
3
+ exports.getNotificationTemplatesRequestSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  // Request schema - no body needed for GET
6
6
  exports.getNotificationTemplatesRequestSchema = zod_1.z.object({});
7
- // Response schema
8
- exports.getNotificationTemplatesResponseSchema = zod_1.z.object({
9
- success: zod_1.z.boolean(),
10
- templates: zod_1.z.array(zod_1.z.any()).optional(), // Will be Serialized<NotificationTemplateData>[]
11
- error: zod_1.z.string().optional()
12
- });
@@ -19,40 +19,11 @@ export declare const previewNotificationTemplateRequestSchema: z.ZodObject<{
19
19
  variables?: Record<string, any> | undefined;
20
20
  }>;
21
21
  export type PreviewNotificationTemplateRequest = z.infer<typeof previewNotificationTemplateRequestSchema>;
22
- export declare const previewNotificationTemplateResponseSchema: z.ZodObject<{
23
- success: z.ZodBoolean;
24
- preview: z.ZodOptional<z.ZodObject<{
25
- title: z.ZodString;
26
- body: z.ZodString;
27
- variables: z.ZodRecord<z.ZodString, z.ZodAny>;
28
- }, "strip", z.ZodTypeAny, {
22
+ export interface PreviewNotificationTemplateResponse {
23
+ preview: {
29
24
  title: string;
30
25
  body: string;
31
26
  variables: Record<string, any>;
32
- }, {
33
- title: string;
34
- body: string;
35
- variables: Record<string, any>;
36
- }>>;
37
- missingVariables: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
38
- error: z.ZodOptional<z.ZodString>;
39
- }, "strip", z.ZodTypeAny, {
40
- success: boolean;
41
- error?: string | undefined;
42
- preview?: {
43
- title: string;
44
- body: string;
45
- variables: Record<string, any>;
46
- } | undefined;
47
- missingVariables?: string[] | undefined;
48
- }, {
49
- success: boolean;
50
- error?: string | undefined;
51
- preview?: {
52
- title: string;
53
- body: string;
54
- variables: Record<string, any>;
55
- } | undefined;
56
- missingVariables?: string[] | undefined;
57
- }>;
58
- export type PreviewNotificationTemplateResponse = z.infer<typeof previewNotificationTemplateResponseSchema>;
27
+ };
28
+ missingVariables: string[];
29
+ }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.previewNotificationTemplateResponseSchema = exports.previewNotificationTemplateRequestSchema = void 0;
3
+ exports.previewNotificationTemplateRequestSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  // Request schema
6
6
  exports.previewNotificationTemplateRequestSchema = zod_1.z.object({
@@ -10,14 +10,3 @@ exports.previewNotificationTemplateRequestSchema = zod_1.z.object({
10
10
  entityId: zod_1.z.string(),
11
11
  variables: zod_1.z.record(zod_1.z.any()).optional()
12
12
  });
13
- // Response schema
14
- exports.previewNotificationTemplateResponseSchema = zod_1.z.object({
15
- success: zod_1.z.boolean(),
16
- preview: zod_1.z.object({
17
- title: zod_1.z.string(),
18
- body: zod_1.z.string(),
19
- variables: zod_1.z.record(zod_1.z.any())
20
- }).optional(),
21
- missingVariables: zod_1.z.array(zod_1.z.string()).optional(),
22
- error: zod_1.z.string().optional()
23
- });
@@ -9,21 +9,6 @@ export declare const syncNotificationTemplateRequestSchema: z.ZodObject<{
9
9
  sync: boolean;
10
10
  }>;
11
11
  export type SyncNotificationTemplateRequest = z.infer<typeof syncNotificationTemplateRequestSchema>;
12
- export declare const syncNotificationTemplateResponseSchema: z.ZodObject<{
13
- success: z.ZodBoolean;
14
- template: z.ZodOptional<z.ZodAny>;
15
- error: z.ZodOptional<z.ZodString>;
16
- }, "strip", z.ZodTypeAny, {
17
- success: boolean;
18
- error?: string | undefined;
19
- template?: any;
20
- }, {
21
- success: boolean;
22
- error?: string | undefined;
23
- template?: any;
24
- }>;
25
- export type SyncNotificationTemplateResponse = {
26
- success: boolean;
27
- template?: Serialized<NotificationTemplateData>;
28
- error?: string;
29
- };
12
+ export interface SyncNotificationTemplateResponse {
13
+ template: Serialized<NotificationTemplateData>;
14
+ }
@@ -1,14 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.syncNotificationTemplateResponseSchema = exports.syncNotificationTemplateRequestSchema = void 0;
3
+ exports.syncNotificationTemplateRequestSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  // Request schema
6
6
  exports.syncNotificationTemplateRequestSchema = zod_1.z.object({
7
7
  sync: zod_1.z.boolean() // true to sync with parent, false to unsync
8
8
  });
9
- // Response schema
10
- exports.syncNotificationTemplateResponseSchema = zod_1.z.object({
11
- success: zod_1.z.boolean(),
12
- template: zod_1.z.any().optional(), // Will be Serialized<NotificationTemplateData>
13
- error: zod_1.z.string().optional()
14
- });
@@ -64,149 +64,6 @@ export declare const updateNotificationTemplateRequestSchema: z.ZodObject<{
64
64
  customized?: boolean | undefined;
65
65
  }>;
66
66
  export type UpdateNotificationTemplateRequest = z.infer<typeof updateNotificationTemplateRequestSchema>;
67
- export declare const updateNotificationTemplateResponseSchema: z.ZodObject<{
68
- template: z.ZodObject<{
69
- _id: z.ZodEffects<z.ZodString, import("../..").NotificationTemplateId, string>;
70
- userId: z.ZodEffects<z.ZodString, import("../..").UserId, string>;
71
- entityType: z.ZodEnum<["agenda", "tasks", "habits", "inbox", "agenda_item", "habit", "agenda_defaults", "habits_defaults"]>;
72
- entityId: z.ZodOptional<z.ZodString>;
73
- name: z.ZodString;
74
- description: z.ZodOptional<z.ZodString>;
75
- trigger: z.ZodObject<{
76
- type: z.ZodEnum<["time_based", "event_based", "recurring"]>;
77
- conditions: z.ZodRecord<z.ZodString, z.ZodAny>;
78
- timing: z.ZodRecord<z.ZodString, z.ZodAny>;
79
- }, "strip", z.ZodTypeAny, {
80
- type: "time_based" | "event_based" | "recurring";
81
- conditions: Record<string, any>;
82
- timing: Record<string, any>;
83
- }, {
84
- type: "time_based" | "event_based" | "recurring";
85
- conditions: Record<string, any>;
86
- timing: Record<string, any>;
87
- }>;
88
- content: z.ZodObject<{
89
- title: z.ZodString;
90
- body: z.ZodString;
91
- variables: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
92
- }, "strip", z.ZodTypeAny, {
93
- title: string;
94
- body: string;
95
- variables?: Record<string, string> | undefined;
96
- }, {
97
- title: string;
98
- body: string;
99
- variables?: Record<string, string> | undefined;
100
- }>;
101
- active: z.ZodDefault<z.ZodBoolean>;
102
- inheritedFrom: z.ZodOptional<z.ZodEffects<z.ZodString, import("../..").NotificationTemplateId, string>>;
103
- customized: z.ZodDefault<z.ZodBoolean>;
104
- createdAt: z.ZodDate;
105
- updatedAt: z.ZodDate;
106
- }, "strip", z.ZodTypeAny, {
107
- _id: string & {
108
- readonly __brand: "NotificationTemplateId";
109
- };
110
- createdAt: Date;
111
- updatedAt: Date;
112
- userId: string & {
113
- readonly __brand: "UserId";
114
- };
115
- entityType: "agenda" | "inbox" | "habits" | "tasks" | "agenda_item" | "habit" | "agenda_defaults" | "habits_defaults";
116
- name: string;
117
- trigger: {
118
- type: "time_based" | "event_based" | "recurring";
119
- conditions: Record<string, any>;
120
- timing: Record<string, any>;
121
- };
122
- content: {
123
- title: string;
124
- body: string;
125
- variables?: Record<string, string> | undefined;
126
- };
127
- active: boolean;
128
- customized: boolean;
129
- entityId?: string | undefined;
130
- description?: string | undefined;
131
- inheritedFrom?: import("../..").NotificationTemplateId | undefined;
132
- }, {
133
- _id: string;
134
- createdAt: Date;
135
- updatedAt: Date;
136
- userId: string;
137
- entityType: "agenda" | "inbox" | "habits" | "tasks" | "agenda_item" | "habit" | "agenda_defaults" | "habits_defaults";
138
- name: string;
139
- trigger: {
140
- type: "time_based" | "event_based" | "recurring";
141
- conditions: Record<string, any>;
142
- timing: Record<string, any>;
143
- };
144
- content: {
145
- title: string;
146
- body: string;
147
- variables?: Record<string, string> | undefined;
148
- };
149
- entityId?: string | undefined;
150
- description?: string | undefined;
151
- active?: boolean | undefined;
152
- inheritedFrom?: string | undefined;
153
- customized?: boolean | undefined;
154
- }>;
155
- }, "strip", z.ZodTypeAny, {
156
- template: {
157
- _id: string & {
158
- readonly __brand: "NotificationTemplateId";
159
- };
160
- createdAt: Date;
161
- updatedAt: Date;
162
- userId: string & {
163
- readonly __brand: "UserId";
164
- };
165
- entityType: "agenda" | "inbox" | "habits" | "tasks" | "agenda_item" | "habit" | "agenda_defaults" | "habits_defaults";
166
- name: string;
167
- trigger: {
168
- type: "time_based" | "event_based" | "recurring";
169
- conditions: Record<string, any>;
170
- timing: Record<string, any>;
171
- };
172
- content: {
173
- title: string;
174
- body: string;
175
- variables?: Record<string, string> | undefined;
176
- };
177
- active: boolean;
178
- customized: boolean;
179
- entityId?: string | undefined;
180
- description?: string | undefined;
181
- inheritedFrom?: import("../..").NotificationTemplateId | undefined;
182
- };
183
- }, {
184
- template: {
185
- _id: string;
186
- createdAt: Date;
187
- updatedAt: Date;
188
- userId: string;
189
- entityType: "agenda" | "inbox" | "habits" | "tasks" | "agenda_item" | "habit" | "agenda_defaults" | "habits_defaults";
190
- name: string;
191
- trigger: {
192
- type: "time_based" | "event_based" | "recurring";
193
- conditions: Record<string, any>;
194
- timing: Record<string, any>;
195
- };
196
- content: {
197
- title: string;
198
- body: string;
199
- variables?: Record<string, string> | undefined;
200
- };
201
- entityId?: string | undefined;
202
- description?: string | undefined;
203
- active?: boolean | undefined;
204
- inheritedFrom?: string | undefined;
205
- customized?: boolean | undefined;
206
- };
207
- }>;
208
- export type UpdateNotificationTemplateResponse = {
209
- success: boolean;
210
- template?: Serialized<NotificationTemplateData>;
211
- error?: string;
212
- };
67
+ export interface UpdateNotificationTemplateResponse {
68
+ template: Serialized<NotificationTemplateData>;
69
+ }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.updateNotificationTemplateResponseSchema = exports.updateNotificationTemplateRequestSchema = void 0;
3
+ exports.updateNotificationTemplateRequestSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const models_1 = require("../../models");
6
6
  // Request schema
@@ -20,6 +20,3 @@ exports.updateNotificationTemplateRequestSchema = zod_1.z.object({
20
20
  active: zod_1.z.boolean().optional(),
21
21
  customized: zod_1.z.boolean().optional()
22
22
  });
23
- exports.updateNotificationTemplateResponseSchema = zod_1.z.object({
24
- template: models_1.notificationTemplateDataSchema,
25
- });
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@timothyw/pat-common",
3
3
  "description": "",
4
4
  "author": "Timothy Washburn",
5
- "version": "1.0.112",
5
+ "version": "1.0.113",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "scripts": {
@@ -25,15 +25,6 @@ export const createNotificationTemplateRequestSchema = z.object({
25
25
 
26
26
  export type CreateNotificationTemplateRequest = z.infer<typeof createNotificationTemplateRequestSchema>;
27
27
 
28
- // Response schema
29
- export const createNotificationTemplateResponseSchema = z.object({
30
- success: z.boolean(),
31
- template: z.any().optional(), // Will be Serialized<NotificationTemplateData>
32
- error: z.string().optional()
33
- });
34
-
35
- export type CreateNotificationTemplateResponse = {
36
- success: boolean;
37
- template?: Serialized<NotificationTemplateData>;
38
- error?: string;
39
- };
28
+ export interface CreateNotificationTemplateResponse {
29
+ template: Serialized<NotificationTemplateData>;
30
+ }
@@ -5,10 +5,4 @@ export const deleteNotificationTemplateRequestSchema = z.object({});
5
5
 
6
6
  export type DeleteNotificationTemplateRequest = z.infer<typeof deleteNotificationTemplateRequestSchema>;
7
7
 
8
- // Response schema
9
- export const deleteNotificationTemplateResponseSchema = z.object({
10
- success: z.boolean(),
11
- error: z.string().optional()
12
- });
13
-
14
- export type DeleteNotificationTemplateResponse = z.infer<typeof deleteNotificationTemplateResponseSchema>;
8
+ export interface DeleteNotificationTemplateResponse {}
@@ -7,15 +7,6 @@ export const getNotificationTemplatesRequestSchema = z.object({});
7
7
 
8
8
  export type GetNotificationTemplatesRequest = z.infer<typeof getNotificationTemplatesRequestSchema>;
9
9
 
10
- // Response schema
11
- export const getNotificationTemplatesResponseSchema = z.object({
12
- success: z.boolean(),
13
- templates: z.array(z.any()).optional(), // Will be Serialized<NotificationTemplateData>[]
14
- error: z.string().optional()
15
- });
16
-
17
- export type GetNotificationTemplatesResponse = {
18
- success: boolean;
19
- templates?: Serialized<NotificationTemplateData>[];
20
- error?: string;
21
- };
10
+ export interface GetNotificationTemplatesResponse {
11
+ templates: Serialized<NotificationTemplateData>[];
12
+ }
@@ -11,16 +11,11 @@ export const previewNotificationTemplateRequestSchema = z.object({
11
11
 
12
12
  export type PreviewNotificationTemplateRequest = z.infer<typeof previewNotificationTemplateRequestSchema>;
13
13
 
14
- // Response schema
15
- export const previewNotificationTemplateResponseSchema = z.object({
16
- success: z.boolean(),
17
- preview: z.object({
18
- title: z.string(),
19
- body: z.string(),
20
- variables: z.record(z.any())
21
- }).optional(),
22
- missingVariables: z.array(z.string()).optional(),
23
- error: z.string().optional()
24
- });
25
-
26
- export type PreviewNotificationTemplateResponse = z.infer<typeof previewNotificationTemplateResponseSchema>;
14
+ export interface PreviewNotificationTemplateResponse {
15
+ preview: {
16
+ title: string;
17
+ body: string;
18
+ variables: Record<string, any>;
19
+ };
20
+ missingVariables: string[];
21
+ }
@@ -9,15 +9,6 @@ export const syncNotificationTemplateRequestSchema = z.object({
9
9
 
10
10
  export type SyncNotificationTemplateRequest = z.infer<typeof syncNotificationTemplateRequestSchema>;
11
11
 
12
- // Response schema
13
- export const syncNotificationTemplateResponseSchema = z.object({
14
- success: z.boolean(),
15
- template: z.any().optional(), // Will be Serialized<NotificationTemplateData>
16
- error: z.string().optional()
17
- });
18
-
19
- export type SyncNotificationTemplateResponse = {
20
- success: boolean;
21
- template?: Serialized<NotificationTemplateData>;
22
- error?: string;
23
- };
12
+ export interface SyncNotificationTemplateResponse {
13
+ template: Serialized<NotificationTemplateData>;
14
+ }
@@ -2,8 +2,7 @@ import { z } from "zod";
2
2
  import { Serialized } from "../../../utils";
3
3
  import {
4
4
  NotificationTemplateData,
5
- notificationTriggerTypeSchema,
6
- notificationTemplateDataSchema
5
+ notificationTriggerTypeSchema
7
6
  } from "../../models";
8
7
 
9
8
  // Request schema
@@ -26,12 +25,6 @@ export const updateNotificationTemplateRequestSchema = z.object({
26
25
 
27
26
  export type UpdateNotificationTemplateRequest = z.infer<typeof updateNotificationTemplateRequestSchema>;
28
27
 
29
- export const updateNotificationTemplateResponseSchema = z.object({
30
- template: notificationTemplateDataSchema,
31
- });
32
-
33
- export type UpdateNotificationTemplateResponse = {
34
- success: boolean;
35
- template?: Serialized<NotificationTemplateData>;
36
- error?: string;
37
- };
28
+ export interface UpdateNotificationTemplateResponse {
29
+ template: Serialized<NotificationTemplateData>;
30
+ }