@suprsend/node-sdk 1.2.0 → 1.3.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.
@@ -75,18 +75,7 @@ var _BulkSubscribersChunk = /*#__PURE__*/function () {
75
75
  (0, _createClass2["default"])(_BulkSubscribersChunk, [{
76
76
  key: "__get_url",
77
77
  value: function __get_url() {
78
- var url_template = "event/";
79
-
80
- if (this.config.include_signature_param) {
81
- if (this.config.auth_enabled) {
82
- url_template = url_template + "?verify=true";
83
- } else {
84
- url_template = url_template + "?verify=false";
85
- }
86
- }
87
-
88
- var url_formatted = "".concat(this.config.base_url).concat(url_template);
89
- return url_formatted;
78
+ return "".concat(this.config.base_url, "event/");
90
79
  }
91
80
  }, {
92
81
  key: "__common_headers",
@@ -155,20 +144,16 @@ var _BulkSubscribersChunk = /*#__PURE__*/function () {
155
144
  switch (_context.prev = _context.next) {
156
145
  case 0:
157
146
  headers = _objectSpread(_objectSpread({}, this.__headers), this.__dynamic_headers());
158
- content_text = JSON.stringify(this.__chunk); // Based on whether signature is required or not, add Authorization header
159
-
160
- if (this.config.auth_enabled) {
161
- signature = (0, _signature["default"])(this.__url, "POST", content_text, headers, this.config.workspace_secret);
162
- headers["Authorization"] = "".concat(this.config.workspace_key, ":").concat(signature);
163
- }
164
-
165
- _context.prev = 3;
166
- _context.next = 6;
147
+ content_text = JSON.stringify(this.__chunk);
148
+ signature = (0, _signature["default"])(this.__url, "POST", content_text, headers, this.config.workspace_secret);
149
+ headers["Authorization"] = "".concat(this.config.workspace_key, ":").concat(signature);
150
+ _context.prev = 4;
151
+ _context.next = 7;
167
152
  return _axios["default"].post(this.__url, content_text, {
168
153
  headers: headers
169
154
  });
170
155
 
171
- case 6:
156
+ case 7:
172
157
  response = _context.sent;
173
158
  ok_response = Math.floor(response.status / 100) == 2;
174
159
 
@@ -198,12 +183,12 @@ var _BulkSubscribersChunk = /*#__PURE__*/function () {
198
183
  };
199
184
  }
200
185
 
201
- _context.next = 15;
186
+ _context.next = 16;
202
187
  break;
203
188
 
204
- case 11:
205
- _context.prev = 11;
206
- _context.t0 = _context["catch"](3);
189
+ case 12:
190
+ _context.prev = 12;
191
+ _context.t0 = _context["catch"](4);
207
192
  error_status = _context.t0.status || 500;
208
193
  return _context.abrupt("return", {
209
194
  status: "fail",
@@ -221,12 +206,12 @@ var _BulkSubscribersChunk = /*#__PURE__*/function () {
221
206
  })
222
207
  });
223
208
 
224
- case 15:
209
+ case 16:
225
210
  case "end":
226
211
  return _context.stop();
227
212
  }
228
213
  }
229
- }, _callee, this, [[3, 11]]);
214
+ }, _callee, this, [[4, 12]]);
230
215
  }));
231
216
 
232
217
  function trigger() {
@@ -269,27 +254,14 @@ var BulkSubscribers = /*#__PURE__*/function () {
269
254
  this.response.warnings = [].concat((0, _toConsumableArray2["default"])(this.response.warnings), (0, _toConsumableArray2["default"])(warnings_list));
270
255
  }
271
256
 
272
- var ev_arr = sub.events();
273
-
274
- var _iterator2 = _createForOfIteratorHelper(ev_arr),
275
- _step2;
257
+ var ev = sub.get_events();
276
258
 
277
- try {
278
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
279
- var ev = _step2.value;
259
+ var _sub$validate_event_s = sub.validate_event_size(ev),
260
+ _sub$validate_event_s2 = (0, _slicedToArray2["default"])(_sub$validate_event_s, 2),
261
+ ev_json = _sub$validate_event_s2[0],
262
+ body_size = _sub$validate_event_s2[1];
280
263
 
281
- var _sub$validate_event_s = sub.validate_event_size(ev),
282
- _sub$validate_event_s2 = (0, _slicedToArray2["default"])(_sub$validate_event_s, 2),
283
- ev_json = _sub$validate_event_s2[0],
284
- body_size = _sub$validate_event_s2[1];
285
-
286
- this.__pending_records.push([ev_json, body_size]);
287
- }
288
- } catch (err) {
289
- _iterator2.e(err);
290
- } finally {
291
- _iterator2.f();
292
- }
264
+ this.__pending_records.push([ev_json, body_size]);
293
265
  }
294
266
  } catch (err) {
295
267
  _iterator.e(err);
@@ -306,14 +278,14 @@ var BulkSubscribers = /*#__PURE__*/function () {
306
278
 
307
279
  var entries = this.__pending_records.slice(start_idx).entries();
308
280
 
309
- var _iterator3 = _createForOfIteratorHelper(entries),
310
- _step3;
281
+ var _iterator2 = _createForOfIteratorHelper(entries),
282
+ _step2;
311
283
 
312
284
  try {
313
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
314
- var _step3$value = (0, _slicedToArray2["default"])(_step3.value, 2),
315
- rel_idx = _step3$value[0],
316
- rec = _step3$value[1];
285
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
286
+ var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2),
287
+ rel_idx = _step2$value[0],
288
+ rec = _step2$value[1];
317
289
 
318
290
  var is_added = curr_chunk.try_to_add_into_chunk(rec[0], rec[1]);
319
291
 
@@ -326,9 +298,9 @@ var BulkSubscribers = /*#__PURE__*/function () {
326
298
  }
327
299
  }
328
300
  } catch (err) {
329
- _iterator3.e(err);
301
+ _iterator2.e(err);
330
302
  } finally {
331
- _iterator3.f();
303
+ _iterator2.f();
332
304
  }
333
305
  }
334
306
  }, {
@@ -346,7 +318,7 @@ var BulkSubscribers = /*#__PURE__*/function () {
346
318
  var sub = _subscribers[_i];
347
319
 
348
320
  if (!sub) {
349
- throw new SuprsendError("null/empty element found in bulk instance");
321
+ continue;
350
322
  }
351
323
 
352
324
  if (!(sub instanceof _subscriber.Subscriber)) {
@@ -367,7 +339,7 @@ var BulkSubscribers = /*#__PURE__*/function () {
367
339
  key: "save",
368
340
  value: function () {
369
341
  var _save = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
370
- var _iterator4, _step4, _step4$value, c_idx, ch;
342
+ var _iterator3, _step3, _step3$value, c_idx, ch;
371
343
 
372
344
  return _regenerator["default"].wrap(function _callee2$(_context2) {
373
345
  while (1) {
@@ -377,18 +349,18 @@ var BulkSubscribers = /*#__PURE__*/function () {
377
349
 
378
350
  this.__chunkify();
379
351
 
380
- _iterator4 = _createForOfIteratorHelper(this.chunks.entries());
352
+ _iterator3 = _createForOfIteratorHelper(this.chunks.entries());
381
353
  _context2.prev = 3;
382
354
 
383
- _iterator4.s();
355
+ _iterator3.s();
384
356
 
385
357
  case 5:
386
- if ((_step4 = _iterator4.n()).done) {
358
+ if ((_step3 = _iterator3.n()).done) {
387
359
  _context2.next = 13;
388
360
  break;
389
361
  }
390
362
 
391
- _step4$value = (0, _slicedToArray2["default"])(_step4.value, 2), c_idx = _step4$value[0], ch = _step4$value[1];
363
+ _step3$value = (0, _slicedToArray2["default"])(_step3.value, 2), c_idx = _step3$value[0], ch = _step3$value[1];
392
364
 
393
365
  if (this.config.req_log_level > 0) {
394
366
  console.log("DEBUG: triggering api call for chunk: ".concat(c_idx));
@@ -414,12 +386,12 @@ var BulkSubscribers = /*#__PURE__*/function () {
414
386
  _context2.prev = 15;
415
387
  _context2.t0 = _context2["catch"](3);
416
388
 
417
- _iterator4.e(_context2.t0);
389
+ _iterator3.e(_context2.t0);
418
390
 
419
391
  case 18:
420
392
  _context2.prev = 18;
421
393
 
422
- _iterator4.f();
394
+ _iterator3.f();
423
395
 
424
396
  return _context2.finish(18);
425
397
 
package/dist/workflow.js CHANGED
@@ -106,18 +106,7 @@ var _WorkflowTrigger = /*#__PURE__*/function () {
106
106
  (0, _createClass2["default"])(_WorkflowTrigger, [{
107
107
  key: "_get_url",
108
108
  value: function _get_url() {
109
- var url_template = "/trigger/";
110
-
111
- if (this.config.include_signature_param) {
112
- if (this.config.auth_enabled) {
113
- url_template = url_template + "?verify=true";
114
- } else {
115
- url_template = url_template + "?verify=false";
116
- }
117
- }
118
-
119
- var url_formatted = "".concat(this.config.base_url).concat(this.config.workspace_key).concat(url_template);
120
- return url_formatted;
109
+ return "".concat(this.config.base_url).concat(this.config.workspace_key, "/trigger/");
121
110
  }
122
111
  }, {
123
112
  key: "_get_headers",
@@ -151,24 +140,20 @@ var _WorkflowTrigger = /*#__PURE__*/function () {
151
140
  case 0:
152
141
  headers = this._get_headers();
153
142
  content_text = JSON.stringify(workflow_body);
154
-
155
- if (this.config.auth_enabled) {
156
- signature = (0, _signature["default"])(this.url, "POST", content_text, headers, this.config.workspace_secret);
157
- headers["Authorization"] = "".concat(this.config.workspace_key, ":").concat(signature);
158
- }
159
-
160
- _context.prev = 3;
161
- _context.next = 6;
143
+ signature = (0, _signature["default"])(this.url, "POST", content_text, headers, this.config.workspace_secret);
144
+ headers["Authorization"] = "".concat(this.config.workspace_key, ":").concat(signature);
145
+ _context.prev = 4;
146
+ _context.next = 7;
162
147
  return _axios["default"].post(this.url, content_text, {
163
148
  headers: headers
164
149
  });
165
150
 
166
- case 6:
151
+ case 7:
167
152
  response = _context.sent;
168
153
  ok_response = Math.floor(response.status / 100) == 2;
169
154
 
170
155
  if (!ok_response) {
171
- _context.next = 12;
156
+ _context.next = 13;
172
157
  break;
173
158
  }
174
159
 
@@ -179,7 +164,7 @@ var _WorkflowTrigger = /*#__PURE__*/function () {
179
164
  message: response.statusText
180
165
  });
181
166
 
182
- case 12:
167
+ case 13:
183
168
  return _context.abrupt("return", {
184
169
  success: false,
185
170
  status: "fail",
@@ -187,13 +172,13 @@ var _WorkflowTrigger = /*#__PURE__*/function () {
187
172
  message: response.statusText
188
173
  });
189
174
 
190
- case 13:
191
- _context.next = 18;
175
+ case 14:
176
+ _context.next = 19;
192
177
  break;
193
178
 
194
- case 15:
195
- _context.prev = 15;
196
- _context.t0 = _context["catch"](3);
179
+ case 16:
180
+ _context.prev = 16;
181
+ _context.t0 = _context["catch"](4);
197
182
  return _context.abrupt("return", {
198
183
  success: false,
199
184
  status: "fail",
@@ -201,12 +186,12 @@ var _WorkflowTrigger = /*#__PURE__*/function () {
201
186
  message: _context.t0.message
202
187
  });
203
188
 
204
- case 18:
189
+ case 19:
205
190
  case "end":
206
191
  return _context.stop();
207
192
  }
208
193
  }
209
- }, _callee, this, [[3, 15]]);
194
+ }, _callee, this, [[4, 16]]);
210
195
  }));
211
196
 
212
197
  function send(_x) {
@@ -75,18 +75,7 @@ var _BulkWorkflowsChunk = /*#__PURE__*/function () {
75
75
  (0, _createClass2["default"])(_BulkWorkflowsChunk, [{
76
76
  key: "__get_url",
77
77
  value: function __get_url() {
78
- var url_template = "/trigger/";
79
-
80
- if (this.config.include_signature_param) {
81
- if (this.config.auth_enabled) {
82
- url_template = url_template + "?verify=true";
83
- } else {
84
- url_template = url_template + "?verify=false";
85
- }
86
- }
87
-
88
- var url_formatted = "".concat(this.config.base_url).concat(this.config.workspace_key).concat(url_template);
89
- return url_formatted;
78
+ return "".concat(this.config.base_url).concat(this.config.workspace_key, "/trigger/");
90
79
  }
91
80
  }, {
92
81
  key: "__common_headers",
@@ -159,20 +148,16 @@ var _BulkWorkflowsChunk = /*#__PURE__*/function () {
159
148
  switch (_context.prev = _context.next) {
160
149
  case 0:
161
150
  headers = _objectSpread(_objectSpread({}, this.__headers), this.__dynamic_headers());
162
- content_text = JSON.stringify(this.__chunk); // Based on whether signature is required or not, add Authorization header
163
-
164
- if (this.config.auth_enabled) {
165
- signature = (0, _signature["default"])(this.__url, "POST", content_text, headers, this.config.workspace_secret);
166
- headers["Authorization"] = "".concat(this.config.workspace_key, ":").concat(signature);
167
- }
168
-
169
- _context.prev = 3;
170
- _context.next = 6;
151
+ content_text = JSON.stringify(this.__chunk);
152
+ signature = (0, _signature["default"])(this.__url, "POST", content_text, headers, this.config.workspace_secret);
153
+ headers["Authorization"] = "".concat(this.config.workspace_key, ":").concat(signature);
154
+ _context.prev = 4;
155
+ _context.next = 7;
171
156
  return _axios["default"].post(this.__url, content_text, {
172
157
  headers: headers
173
158
  });
174
159
 
175
- case 6:
160
+ case 7:
176
161
  response = _context.sent;
177
162
  ok_response = Math.floor(response.status / 100) == 2;
178
163
 
@@ -202,12 +187,12 @@ var _BulkWorkflowsChunk = /*#__PURE__*/function () {
202
187
  };
203
188
  }
204
189
 
205
- _context.next = 15;
190
+ _context.next = 16;
206
191
  break;
207
192
 
208
- case 11:
209
- _context.prev = 11;
210
- _context.t0 = _context["catch"](3);
193
+ case 12:
194
+ _context.prev = 12;
195
+ _context.t0 = _context["catch"](4);
211
196
  error_status = _context.t0.status || 500;
212
197
  return _context.abrupt("return", {
213
198
  status: "fail",
@@ -225,12 +210,12 @@ var _BulkWorkflowsChunk = /*#__PURE__*/function () {
225
210
  })
226
211
  });
227
212
 
228
- case 15:
213
+ case 16:
229
214
  case "end":
230
215
  return _context.stop();
231
216
  }
232
217
  }
233
- }, _callee, this, [[3, 11]]);
218
+ }, _callee, this, [[4, 12]]);
234
219
  }));
235
220
 
236
221
  function trigger() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@suprsend/node-sdk",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Suprsend Node SDK to trigger workflow from backend",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
package/src/constants.js CHANGED
@@ -26,7 +26,7 @@ export const ALLOW_ATTACHMENTS_IN_BULK_API = true;
26
26
  export const ATTACHMENT_UPLOAD_ENABLED = false;
27
27
 
28
28
  // -- single Identity event limit
29
- export const IDENTITY_SINGLE_EVENT_MAX_APPARENT_SIZE_IN_BYTES = 2 * 1024;
30
- export const IDENTITY_SINGLE_EVENT_MAX_APPARENT_SIZE_IN_BYTES_READABLE = "2KB";
29
+ export const IDENTITY_SINGLE_EVENT_MAX_APPARENT_SIZE_IN_BYTES = 10 * 1024;
30
+ export const IDENTITY_SINGLE_EVENT_MAX_APPARENT_SIZE_IN_BYTES_READABLE = "10KB";
31
31
 
32
32
  export const MAX_IDENTITY_EVENTS_IN_BULK_API = 400;
package/src/event.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import {
2
- is_object,
3
2
  is_string,
4
3
  SuprsendError,
5
4
  has_special_char,
@@ -130,15 +129,7 @@ export class EventCollector {
130
129
  }
131
130
 
132
131
  __get_url() {
133
- let url_template = "event/";
134
- if (this.config.include_signature_param) {
135
- if (this.config.auth_enabled) {
136
- url_template = url_template + "?verify=true";
137
- } else {
138
- url_template = url_template + "?verify=false";
139
- }
140
- }
141
- return `${this.config.base_url}${url_template}`;
132
+ return `${this.config.base_url}event/`;
142
133
  }
143
134
 
144
135
  __common_headers() {
@@ -161,16 +152,15 @@ export class EventCollector {
161
152
  async send(event) {
162
153
  const headers = { ...this.__headers, ...this.__dynamic_headers() };
163
154
  const content_text = JSON.stringify(event);
164
- if (this.config.auth_enabled) {
165
- const signature = get_request_signature(
166
- this.__url,
167
- "POST",
168
- content_text,
169
- headers,
170
- this.config.workspace_secret
171
- );
172
- headers["Authorization"] = `${this.config.workspace_key}:${signature}`;
173
- }
155
+ const signature = get_request_signature(
156
+ this.__url,
157
+ "POST",
158
+ content_text,
159
+ headers,
160
+ this.config.workspace_secret
161
+ );
162
+ headers["Authorization"] = `${this.config.workspace_key}:${signature}`;
163
+
174
164
  try {
175
165
  const response = await axios.post(this.__url, content_text, { headers });
176
166
  const ok_response = Math.floor(response.status / 100) == 2;
@@ -36,15 +36,7 @@ class _BulkEventsChunk {
36
36
  }
37
37
 
38
38
  __get_url() {
39
- let url_template = "event/";
40
- if (this.config.include_signature_param) {
41
- if (this.config.auth_enabled) {
42
- url_template = url_template + "?verify=true";
43
- } else {
44
- url_template = url_template + "?verify=false";
45
- }
46
- }
47
- const url_formatted = `${this.config.base_url}${url_template}`;
39
+ const url_formatted = `${this.config.base_url}event/`;
48
40
  return url_formatted;
49
41
  }
50
42
 
@@ -105,17 +97,16 @@ class _BulkEventsChunk {
105
97
  async trigger() {
106
98
  const headers = { ...this.__headers, ...this.__dynamic_headers() };
107
99
  const content_text = JSON.stringify(this.__chunk);
108
- // Based on whether signature is required or not, add Authorization header
109
- if (this.config.auth_enabled) {
110
- const signature = get_request_signature(
111
- this.__url,
112
- "POST",
113
- content_text,
114
- headers,
115
- this.config.workspace_secret
116
- );
117
- headers["Authorization"] = `${this.config.workspace_key}:${signature}`;
118
- }
100
+
101
+ const signature = get_request_signature(
102
+ this.__url,
103
+ "POST",
104
+ content_text,
105
+ headers,
106
+ this.config.workspace_secret
107
+ );
108
+ headers["Authorization"] = `${this.config.workspace_key}:${signature}`;
109
+
119
110
  try {
120
111
  const response = await axios.post(this.__url, content_text, { headers });
121
112
  const ok_response = Math.floor(response.status / 100) == 2;
package/src/index.js CHANGED
@@ -22,8 +22,6 @@ class Suprsend {
22
22
  this.config = config;
23
23
 
24
24
  this.base_url = this._get_url(config.base_url);
25
- this.auth_enabled = config.auth_enabled !== false;
26
- this.include_signature_param = config.include_signature_param !== false;
27
25
  this.user_agent = `suprsend/${
28
26
  package_json.version
29
27
  };node/${process.version.slice(1)}`;
package/src/subscriber.js CHANGED
@@ -44,31 +44,16 @@ export class Subscriber {
44
44
  this.config = config;
45
45
  this.distinct_id = distinct_id;
46
46
  this.__url = this.__get_url();
47
- this.__supr_props = this.__super_properties();
47
+ this.__super_props = this.__super_properties();
48
48
 
49
49
  this.__errors = [];
50
50
  this.__info = [];
51
- this._append_count = 0;
52
- this._remove_count = 0;
53
- this._set_count = 0;
54
- this._unset_count = 0;
55
- this._events = [];
56
- this._helper = new _SubscriberInternalHelper(
57
- distinct_id,
58
- config.workspace_key
59
- );
51
+ this.user_operations = [];
52
+ this._helper = new _SubscriberInternalHelper();
60
53
  }
61
54
 
62
55
  __get_url() {
63
- let url_template = "event/";
64
- if (this.config.include_signature_param) {
65
- if (this.config.auth_enabled) {
66
- url_template = url_template + "?verify=true";
67
- } else {
68
- url_template = url_template + "?verify=false";
69
- }
70
- }
71
- return `${this.config.base_url}${url_template}`;
56
+ return `${this.config.base_url}event/`;
72
57
  }
73
58
 
74
59
  __get_headers() {
@@ -85,30 +70,16 @@ export class Subscriber {
85
70
  };
86
71
  }
87
72
 
88
- events() {
89
- let all_events = [...this._events];
90
- for (let e of all_events) {
91
- e["properties"] = this.__supr_props;
92
- }
93
-
94
- if (
95
- all_events.length === 0 ||
96
- this._append_count > 0 ||
97
- this._set_count > 0
98
- ) {
99
- const user_identify_event = {
100
- $insert_id: uuid(),
101
- $time: epoch_milliseconds(),
102
- env: this.config.workspace_key,
103
- event: "$identify",
104
- properties: {
105
- $identified_id: this.distinct_id,
106
- ...this.__supr_props,
107
- },
108
- };
109
- all_events = [user_identify_event, ...all_events];
110
- }
111
- return all_events;
73
+ get_events() {
74
+ return {
75
+ $schema: "2",
76
+ $insert_id: uuid(),
77
+ $time: epoch_milliseconds(),
78
+ env: this.config.workspace_key,
79
+ distinct_id: this.distinct_id,
80
+ $user_operations: this.user_operations,
81
+ properties: this.__super_props,
82
+ };
112
83
  }
113
84
 
114
85
  validate_event_size(event_dict) {
@@ -147,22 +118,19 @@ export class Subscriber {
147
118
  const is_part_of_bulk = false;
148
119
  this.validate_body(is_part_of_bulk);
149
120
  const headers = this.__get_headers();
150
- const events = this.events();
151
- for (let ev of events) {
152
- const [validated_ev, size] = this.validate_event_size(ev);
153
- }
121
+ const event = this.get_events();
122
+ const [validated_ev, size] = this.validate_event_size(event);
123
+ const content_text = JSON.stringify(validated_ev);
124
+
125
+ const signature = get_request_signature(
126
+ this.__url,
127
+ "POST",
128
+ content_text,
129
+ headers,
130
+ this.config.workspace_secret
131
+ );
132
+ headers["Authorization"] = `${this.config.workspace_key}:${signature}`;
154
133
 
155
- const content_text = JSON.stringify(events);
156
- if (this.config.auth_enabled) {
157
- const signature = get_request_signature(
158
- this.__url,
159
- "POST",
160
- content_text,
161
- headers,
162
- this.config.workspace_secret
163
- );
164
- headers["Authorization"] = `${this.config.workspace_key}:${signature}`;
165
- }
166
134
  try {
167
135
  const response = await axios.post(this.__url, content_text, { headers });
168
136
  const ok_response = Math.floor(response.status / 100) == 2;
@@ -200,11 +168,7 @@ export class Subscriber {
200
168
  this.__info = [...this.__info, ...resp["info"]];
201
169
  }
202
170
  if (!is_empty(resp["event"])) {
203
- this._events.push(resp["event"]);
204
- this._set_count += resp["set"];
205
- this._append_count += resp["append"];
206
- this._remove_count += resp["remove"];
207
- this._unset_count += resp["unset"];
171
+ this.user_operations.push(resp["event"]);
208
172
  }
209
173
  }
210
174