@nsshunt/stsdatamanagement 1.18.131 → 1.18.133

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.
@@ -11,7 +11,7 @@ CREATE TABLE stsresfhir (
11
11
  RES_PUBLISHED BIGINT NOT NULL,
12
12
  RES_UPDATED BIGINT NOT NULL,
13
13
  RES_DELETED_AT BIGINT,
14
- UNIQUE (RES_ID, RES_TYPE)
14
+ UNIQUE (RES_TYPE, RES_ID)
15
15
  );
16
16
 
17
17
  ---- stsresfhirver ------------------------------------------------------------------------------------------
@@ -25,11 +25,15 @@ CREATE TABLE stsresfhirver (
25
25
  RES_TYPE TEXT NOT NULL,
26
26
  RES_VER INTEGER NOT NULL,
27
27
  RES TEXT NOT NULL,
28
- UNIQUE (RES_ID, RES_TYPE, RES_VER),
28
+ -- Uniqueness of each version per resource:
29
+ CONSTRAINT uq_stsresfhirver_triplet UNIQUE (RES_TYPE, RES_ID, RES_VER),
29
30
  -- We only need (RES_ID, RES_TYPE) as the FK because the parent table always holds the current version.
30
- FOREIGN KEY (RES_ID, RES_TYPE) REFERENCES stsresfhir(RES_ID, RES_TYPE)
31
+ FOREIGN KEY (RES_TYPE, RES_ID) REFERENCES stsresfhir(RES_TYPE, RES_ID)
31
32
  );
32
33
 
34
+ -- Seek-friendly sort index for keyset pagination:
35
+ CREATE INDEX idx_stsresfhirver_seek ON stsresfhirver (RES_TYPE, RES_ID, RES_VER DESC);
36
+
33
37
  ---- stsresfhirlink ------------------------------------------------------------------------------------------
34
38
 
35
39
  CREATE TABLE stsresfhirlink (
@@ -48,6 +52,10 @@ CREATE TABLE stsresfhirlink (
48
52
  UPDATED BIGINT NOT NULL
49
53
  );
50
54
 
55
+ CREATE INDEX idx_stsresfhirlink_identity ON stsresfhirlink (SP_NAME, SRC_RESOURCE_TYPE);
56
+ CREATE INDEX idx_stsresfhirlink_identity_target_id ON stsresfhirlink (SP_NAME, SRC_RESOURCE_TYPE, TARGET_RESOURCE_TYPE, TARGET_RESOURCE_ID);
57
+ CREATE INDEX idx_stsresfhirlink_identity_target_url ON stsresfhirlink (SP_NAME, SRC_RESOURCE_TYPE, TARGET_RESOURCE_TYPE, TARGET_RESOURCE_URL);
58
+
51
59
  ---- stsresfhirstring ------------------------------------------------------------------------------------------
52
60
 
53
61
  CREATE TABLE stsresfhirstring (
@@ -68,8 +76,9 @@ CREATE TABLE stsresfhirstring (
68
76
  );
69
77
 
70
78
  CREATE INDEX idx_stsresfhirstring_hash_identity ON stsresfhirstring (HASH_IDENTITY);
71
- CREATE INDEX idx_stsresfhirstring_hash_exact ON stsresfhirstring (HASH_EXACT);
72
- CREATE INDEX idx_stsresfhirstring_hash_value ON stsresfhirstring (HASH_IDENTITY, SP_VALUE_NORMALIZED);
79
+ CREATE INDEX idx_stsresfhirstring_hash_exact ON stsresfhirstring (HASH_EXACT, SP_VALUE_EXACT);
80
+ CREATE INDEX idx_stsresfhirstring_hash_value_norm ON stsresfhirstring (HASH_IDENTITY, SP_VALUE_NORMALIZED);
81
+ CREATE INDEX idx_stsresfhirstring_hash_value_exact ON stsresfhirstring (HASH_IDENTITY, SP_VALUE_EXACT);
73
82
 
74
83
  ---- stsresfhirtoken ------------------------------------------------------------------------------------------
75
84
 
@@ -93,9 +102,10 @@ CREATE TABLE stsresfhirtoken (
93
102
  );
94
103
 
95
104
  CREATE INDEX idx_stsresfhirtoken_hash_identity ON stsresfhirtoken (HASH_IDENTITY);
96
- CREATE INDEX idx_stsresfhirtoken_hash_value ON stsresfhirtoken (HASH_VALUE);
97
- CREATE INDEX idx_stsresfhirtoken_hash_sys ON stsresfhirtoken (HASH_SYS);
98
- CREATE INDEX idx_stsresfhirtoken_hash_sys_and_value ON stsresfhirtoken (HASH_SYS_AND_VALUE);
105
+ CREATE INDEX idx_stsresfhirtoken_hash_identity_value ON stsresfhirtoken (HASH_IDENTITY, SP_VALUE);
106
+ CREATE INDEX idx_stsresfhirtoken_hash_value ON stsresfhirtoken (HASH_VALUE, SP_VALUE);
107
+ CREATE INDEX idx_stsresfhirtoken_hash_sys ON stsresfhirtoken (HASH_SYS, SP_SYSTEM);
108
+ CREATE INDEX idx_stsresfhirtoken_hash_sys_and_value ON stsresfhirtoken (HASH_SYS_AND_VALUE, SP_SYSTEM, SP_VALUE);
99
109
 
100
110
  ---- stsresfhirquantity ------------------------------------------------------------------------------------------
101
111
 
@@ -119,8 +129,9 @@ CREATE TABLE stsresfhirquantity (
119
129
  );
120
130
 
121
131
  CREATE INDEX idx_stsresfhirquantity_hash_identity ON stsresfhirquantity (HASH_IDENTITY);
122
- CREATE INDEX idx_stsresfhirquantity_hash_units ON stsresfhirquantity (HASH_IDENTITY_AND_UNITS);
123
- CREATE INDEX idx_stsresfhirquantity_hash_sys_units ON stsresfhirquantity (HASH_IDENTITY_SYS_UNITS);
132
+ CREATE INDEX idx_stsresfhirquantity_hash_identity_value ON stsresfhirquantity (HASH_IDENTITY, SP_VALUE);
133
+ CREATE INDEX idx_stsresfhirquantity_hash_units ON stsresfhirquantity (HASH_IDENTITY_AND_UNITS, SP_UNITS);
134
+ CREATE INDEX idx_stsresfhirquantity_hash_sys_units ON stsresfhirquantity (HASH_IDENTITY_SYS_UNITS, SP_SYSTEM, SP_UNITS);
124
135
 
125
136
  ---- stsresfhirnumber ------------------------------------------------------------------------------------------
126
137
 
@@ -140,6 +151,7 @@ CREATE TABLE stsresfhirnumber (
140
151
  );
141
152
 
142
153
  CREATE INDEX idx_stsresfhirnumber_hash_identity ON stsresfhirnumber (HASH_IDENTITY);
154
+ CREATE INDEX idx_stsresfhirnumber_hash_identity_value ON stsresfhirnumber (HASH_IDENTITY, SP_VALUE);
143
155
 
144
156
  ---- stsresfhiruri ------------------------------------------------------------------------------------------
145
157
 
@@ -160,7 +172,8 @@ CREATE TABLE stsresfhiruri (
160
172
  );
161
173
 
162
174
  CREATE INDEX idx_stsresfhiruri_hash_identity ON stsresfhiruri (HASH_IDENTITY);
163
- CREATE INDEX idx_stsresfhiruri_hash_uri ON stsresfhiruri (HASH_URI);
175
+ CREATE INDEX idx_stsresfhiruri_hash_uri ON stsresfhiruri (HASH_URI, SP_URI);
176
+ CREATE INDEX idx_stsresfhiruri_identity_uri ON stsresfhiruri (HASH_IDENTITY, SP_URI);
164
177
 
165
178
  ---- stsresfhirdate ------------------------------------------------------------------------------------------
166
179
 
@@ -183,6 +196,8 @@ CREATE TABLE stsresfhirdate (
183
196
  );
184
197
 
185
198
  CREATE INDEX idx_stsresfhirdate_hash_identity ON stsresfhirdate (HASH_IDENTITY);
199
+ CREATE INDEX idx_stsresfhirdate_hash_identity_low ON stsresfhirdate (HASH_IDENTITY, SP_VALUE_LOW);
200
+ CREATE INDEX idx_stsresfhirdate_hash_identity_high ON stsresfhirdate (HASH_IDENTITY, SP_VALUE_HIGH);
186
201
 
187
202
  ---- stsresfhircoords ------------------------------------------------------------------------------------------
188
203
 
@@ -203,6 +218,7 @@ CREATE TABLE stsresfhircoords (
203
218
  );
204
219
 
205
220
  CREATE INDEX idx_stsresfhircoords_hash_identity ON stsresfhircoords (HASH_IDENTITY);
221
+ CREATE INDEX idx_stsresfhircoords_hash_identity_lat_long ON stsresfhircoords (HASH_IDENTITY, SP_LATITUDE, SP_LONGITUDE);
206
222
 
207
223
  ---- stsresfhircombo ------------------------------------------------------------------------------------------
208
224
 
@@ -226,6 +242,7 @@ CREATE TABLE stsresfhircombo (
226
242
 
227
243
  CREATE INDEX idx_stsresfhircombo_hash_identity ON stsresfhircombo (HASH_IDENTITY);
228
244
  CREATE INDEX idx_stsresfhircombo_hash_complete ON stsresfhircombo (HASH_COMPLETE);
245
+ CREATE INDEX idx_stsresfhircombo_hash_identity_string ON stsresfhircombo (HASH_IDENTITY, IDX_STRING);
229
246
 
230
247
  ---- STS Generic Resource/Entity Tables and Procs ---------------------------------------------------------------
231
248
 
@@ -74,7 +74,7 @@ var eResouceStatus;
74
74
  });
75
75
  logger.info(chalk_1.default.green(`accessLayer:startdatabase()`));
76
76
  await accessLayer.StartDatabase();
77
- }, 30000);
77
+ }, 60000);
78
78
  (0, vitest_1.test)('Testing STSUser', async () => {
79
79
  vitest_1.expect.assertions(6);
80
80
  const userManager = new dalUserManager_1.DALUserManager({
@@ -106,7 +106,7 @@ var eResouceStatus;
106
106
  (0, vitest_1.expect)(deleteUser01).toMatchObject(userRecord);
107
107
  const getUser01AfterDelete = await userManager.GetUser({ name: 'user01' });
108
108
  (0, vitest_1.expect)(getUser01AfterDelete).toBeNull();
109
- }, 30000);
109
+ }, 60000);
110
110
  (0, vitest_1.afterAll)(async () => {
111
111
  await accessLayer.EndDatabase();
112
112
  await (0, stsutils_1.JestSleep)();
@@ -32,7 +32,7 @@ vitest_1.describe.skip("Testing Database Functions", () => {
32
32
  test('Testing Database entity delete and creates', async () =>
33
33
  {
34
34
 
35
- jest.setTimeout(30000);
35
+ jest.setTimeout(60000);
36
36
  expect.assertions(1);
37
37
 
38
38
  let start = 100;
@@ -83,7 +83,7 @@ const sort = (a, b) => {
83
83
  });
84
84
  logger.info(chalk_1.default.green(`accessLayer:startdatabase()`));
85
85
  await accessLayer.StartDatabase();
86
- }, 30000);
86
+ }, 60000);
87
87
  (0, vitest_1.test)('Testing Database Entity create, update, patch, read and delete', async () => {
88
88
  vitest_1.expect.assertions(30);
89
89
  const userResourceOptions = {
@@ -327,7 +327,7 @@ const sort = (a, b) => {
327
327
  detail: createCount
328
328
  };
329
329
  (0, vitest_1.expect)(entityCountPostMultiCreate).toMatchObject(matchEntityCountPostMultiCreate);
330
- }, 30000);
330
+ }, 60000);
331
331
  (0, vitest_1.test)('Testing Database Entity Batch Create', async () => {
332
332
  const createStart = 100;
333
333
  const createNum = 60;
@@ -365,7 +365,7 @@ const sort = (a, b) => {
365
365
  (0, vitest_1.expect)(new Date(createdRecord.validfrom).getTime()).toBeLessThanOrEqual(new Date().getTime());
366
366
  (0, vitest_1.expect)(parseInt(createdRecord.oid)).toBeGreaterThan(0);
367
367
  }
368
- }, 30000);
368
+ }, 60000);
369
369
  (0, vitest_1.test)('Testing Database Entity Batch Create using Update', async () => {
370
370
  const updateStart = 100;
371
371
  const updateNum = 5;
@@ -420,7 +420,7 @@ const sort = (a, b) => {
420
420
  (0, vitest_1.expect)(parseInt(updatedResourceRecord.oid)).toBeGreaterThan(0);
421
421
  }
422
422
  }
423
- }, 30000);
423
+ }, 60000);
424
424
  (0, vitest_1.test)('Testing Database Entity Batch Update', async () => {
425
425
  const updateStart = 100;
426
426
  const updateNum = 5;
@@ -475,7 +475,7 @@ const sort = (a, b) => {
475
475
  (0, vitest_1.expect)(parseInt(updatedResourceRecord.oid)).toBeGreaterThan(0);
476
476
  }
477
477
  }
478
- }, 30000);
478
+ }, 60000);
479
479
  (0, vitest_1.test)('Testing Database Entity Batch Update with Errors', async () => {
480
480
  const updateErrorStart = 110;
481
481
  const updateErrorNum = 5;
@@ -549,7 +549,7 @@ const sort = (a, b) => {
549
549
  }
550
550
  }
551
551
  }
552
- }, 30000);
552
+ }, 60000);
553
553
  (0, vitest_1.test)('Testing Database Entity Batch Patch', async () => {
554
554
  const patchStart = 120;
555
555
  const patchNum = 5;
@@ -608,7 +608,7 @@ const sort = (a, b) => {
608
608
  (0, vitest_1.expect)(parseInt(updatedResourceRecord.oid)).toBeGreaterThan(0);
609
609
  }
610
610
  }
611
- }, 30000);
611
+ }, 60000);
612
612
  (0, vitest_1.test)('Testing Database Entity Batch Patch with Errors', async () => {
613
613
  const patchErrorStart = 130;
614
614
  const patchErrorNum = 5;
@@ -687,7 +687,7 @@ const sort = (a, b) => {
687
687
  }
688
688
  }
689
689
  }
690
- }, 30000);
690
+ }, 60000);
691
691
  (0, vitest_1.test)('Testing Database Entity Batch Delete', async () => {
692
692
  const deleteStart = 140;
693
693
  const deleteNum = 5;
@@ -745,7 +745,7 @@ const sort = (a, b) => {
745
745
  (0, vitest_1.expect)(parseInt(updatedResourceRecord.oid)).toBeGreaterThan(0);
746
746
  }
747
747
  }
748
- }, 30000);
748
+ }, 60000);
749
749
  (0, vitest_1.test)('Testing Database Entity Batch Delete with Errors', async () => {
750
750
  const deleteErrorStart = 150;
751
751
  const deleteErrorNum = 5;
@@ -816,7 +816,7 @@ const sort = (a, b) => {
816
816
  }
817
817
  }
818
818
  }
819
- }, 30000);
819
+ }, 60000);
820
820
  (0, vitest_1.test)('Get All user_patch_test_ Resources', async () => {
821
821
  vitest_1.expect.assertions(51);
822
822
  // All Records
@@ -77,7 +77,7 @@ const sort = (a, b) => {
77
77
  });
78
78
  logger.info(chalk_1.default.green(`accessLayer:startdatabase()`));
79
79
  await accessLayer.StartDatabase();
80
- }, 30000);
80
+ }, 60000);
81
81
  (0, vitest_1.test)('Testing Database Resource create, update, patch, read and delete', async () => {
82
82
  vitest_1.expect.assertions(22);
83
83
  const initialCount = await accessLayer.GetResourceCount();
@@ -246,7 +246,7 @@ const sort = (a, b) => {
246
246
  }
247
247
  });
248
248
  (0, vitest_1.expect)(resources.detail.length).toEqual(10);
249
- }, 30000);
249
+ }, 60000);
250
250
  (0, vitest_1.test)('Testing Database Entity create, update, patch, read and delete', async () => {
251
251
  vitest_1.expect.assertions(30);
252
252
  const userResourceType = {
@@ -494,7 +494,7 @@ const sort = (a, b) => {
494
494
  detail: createCount
495
495
  };
496
496
  (0, vitest_1.expect)(entityCountPostMultiCreate).toMatchObject(matchEntityCountPostMultiCreate);
497
- }, 30000);
497
+ }, 60000);
498
498
  /*
499
499
  test('Testing Database Resource create and patch', async () => {
500
500
  const createStart = 100;
@@ -726,7 +726,7 @@ const sort = (a, b) => {
726
726
  console.log(detail);
727
727
  });
728
728
 
729
- }, 30000);
729
+ }, 60000);
730
730
 
731
731
  test('Testing Database Entity create and patch', async () => {
732
732
  expect.assertions(5);
@@ -816,7 +816,7 @@ const sort = (a, b) => {
816
816
  console.log(getRecord2);
817
817
 
818
818
  expect(getRecord2).toMatchObject(userEntity01PatchedRecord);
819
- }, 30000);
819
+ }, 60000);
820
820
 
821
821
 
822
822
  const __TestBatchOperationsForResources = async <T>(start: number, iterations: number, GetResourceData: (i: number) => Partial<T>, GetTestObject: null | ((i: number) => IDBReturnData<Partial<T>>), cb: (p: ResourceParameterRecords<T>) => Promise<IDBReturnData<T>>) => {
@@ -1104,7 +1104,7 @@ const sort = (a, b) => {
1104
1104
  });
1105
1105
  console.log(detail);
1106
1106
  });
1107
- }, 30000);
1107
+ }, 60000);
1108
1108
  */
1109
1109
  (0, vitest_1.test)('Testing Database Resource Batch Create', async () => {
1110
1110
  const createStart = 100;
@@ -1139,7 +1139,7 @@ const sort = (a, b) => {
1139
1139
  (0, vitest_1.expect)(new Date(createdResourceRecord.validfrom).getTime()).toBeLessThanOrEqual(new Date().getTime());
1140
1140
  (0, vitest_1.expect)(parseInt(createdResourceRecord.oid)).toBeGreaterThan(0);
1141
1141
  }
1142
- }, 30000);
1142
+ }, 60000);
1143
1143
  (0, vitest_1.test)('Testing Database Resource Batch Create using Update', async () => {
1144
1144
  const updateStart = 100;
1145
1145
  const updateNum = 5;
@@ -1191,7 +1191,7 @@ const sort = (a, b) => {
1191
1191
  (0, vitest_1.expect)(parseInt(updatedResourceRecord.oid)).toBeGreaterThan(0);
1192
1192
  }
1193
1193
  }
1194
- }, 30000);
1194
+ }, 60000);
1195
1195
  (0, vitest_1.test)('Testing Database Resource Batch Update', async () => {
1196
1196
  const updateStart = 100;
1197
1197
  const updateNum = 5;
@@ -1243,7 +1243,7 @@ const sort = (a, b) => {
1243
1243
  (0, vitest_1.expect)(parseInt(updatedResourceRecord.oid)).toBeGreaterThan(0);
1244
1244
  }
1245
1245
  }
1246
- }, 30000);
1246
+ }, 60000);
1247
1247
  (0, vitest_1.test)('Testing Database Resource Batch Update with Errors', async () => {
1248
1248
  const updateErrorStart = 110;
1249
1249
  const updateErrorNum = 5;
@@ -1315,7 +1315,7 @@ const sort = (a, b) => {
1315
1315
  }
1316
1316
  }
1317
1317
  }
1318
- }, 30000);
1318
+ }, 60000);
1319
1319
  (0, vitest_1.test)('Testing Database Resource Batch Patch', async () => {
1320
1320
  const patchStart = 120;
1321
1321
  const patchNum = 5;
@@ -1371,7 +1371,7 @@ const sort = (a, b) => {
1371
1371
  (0, vitest_1.expect)(parseInt(patchedResourceRecord.oid)).toBeGreaterThan(0);
1372
1372
  }
1373
1373
  }
1374
- }, 30000);
1374
+ }, 60000);
1375
1375
  (0, vitest_1.test)('Testing Database Resource Batch Patch with Errors', async () => {
1376
1376
  const patchErrorStart = 130;
1377
1377
  const patchErrorNum = 5;
@@ -1442,7 +1442,7 @@ const sort = (a, b) => {
1442
1442
  }
1443
1443
  }
1444
1444
  }
1445
- }, 30000);
1445
+ }, 60000);
1446
1446
  (0, vitest_1.test)('Testing Database Resource Batch Delete', async () => {
1447
1447
  const deleteStart = 140;
1448
1448
  const deleteNum = 5;
@@ -1497,7 +1497,7 @@ const sort = (a, b) => {
1497
1497
  (0, vitest_1.expect)(parseInt(deletedResourceRecord.oid)).toBeGreaterThan(0);
1498
1498
  }
1499
1499
  }
1500
- }, 30000);
1500
+ }, 60000);
1501
1501
  (0, vitest_1.test)('Testing Database Resource Batch Delete with Error', async () => {
1502
1502
  const deleteErrorStart = 150;
1503
1503
  const deleteErrorNum = 5;
@@ -1566,7 +1566,7 @@ const sort = (a, b) => {
1566
1566
  }
1567
1567
  }
1568
1568
  }
1569
- }, 30000);
1569
+ }, 60000);
1570
1570
  (0, vitest_1.test)('Get All user_patch_test_ Resources', async () => {
1571
1571
  vitest_1.expect.assertions(51);
1572
1572
  // All Records
@@ -207,7 +207,7 @@ vitest_1.describe.skip("Test Auth Controller", () => {
207
207
  d.value.resdesc = ConvertUserData(d.value.resdesc);
208
208
  console.log(d);
209
209
  });
210
- }, 30000);
210
+ }, 60000);
211
211
  (0, vitest_1.afterAll)(async () => {
212
212
  await (0, stsutils_1.JestSleep)();
213
213
  if (ioRedisClient) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nsshunt/stsdatamanagement",
3
- "version": "1.18.131",
3
+ "version": "1.18.133",
4
4
  "description": "STS Data Management Modules, Utilities and Services",
5
5
  "main": "./dist/dbaccess.js",
6
6
  "types": "./types/dbaccess.d.ts",
@@ -12,15 +12,15 @@
12
12
  "README.md"
13
13
  ],
14
14
  "dependencies": {
15
- "@aws-sdk/client-dynamodb": "^3.857.0",
16
- "@aws-sdk/lib-dynamodb": "^3.857.0",
17
- "@nsshunt/stsconfig": "^1.27.25",
18
- "@nsshunt/stsutils": "^1.19.36",
15
+ "@aws-sdk/client-dynamodb": "^3.862.0",
16
+ "@aws-sdk/lib-dynamodb": "^3.862.0",
17
+ "@nsshunt/stsconfig": "^1.27.26",
18
+ "@nsshunt/stsutils": "^1.19.37",
19
19
  "axios": "^1.11.0",
20
20
  "chalk": "^4.1.2",
21
21
  "cli-progress": "^3.12.0",
22
22
  "http-status-codes": "^2.3.0",
23
- "ioredis": "^5.6.1",
23
+ "ioredis": "^5.7.0",
24
24
  "pg": "^8.16.3",
25
25
  "pg-copy-streams": "^7.0.0",
26
26
  "prompts": "^2.4.2",
@@ -32,19 +32,19 @@
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/cli-progress": "^3.11.6",
35
- "@types/node": "^24.1.0",
35
+ "@types/node": "^24.2.0",
36
36
  "@types/pg": "^8.15.5",
37
37
  "@types/pg-copy-streams": "^1.2.5",
38
38
  "@types/prompts": "^2.4.9",
39
39
  "@types/uuid": "^10.0.0",
40
- "@typescript-eslint/eslint-plugin": "^8.38.0",
41
- "@typescript-eslint/parser": "^8.38.0",
40
+ "@typescript-eslint/eslint-plugin": "^8.39.0",
41
+ "@typescript-eslint/parser": "^8.39.0",
42
42
  "eslint": "^9.32.0",
43
43
  "globals": "^16.3.0",
44
44
  "rollup-plugin-polyfill-node": "^0.13.0",
45
45
  "rollup-plugin-visualizer": "^6.0.3",
46
- "testcontainers": "^11.4.0",
47
- "typescript": "^5.8.3",
46
+ "testcontainers": "^11.5.1",
47
+ "typescript": "^5.9.2",
48
48
  "vite": "^6.3.5",
49
49
  "vitest": "^3.2.4"
50
50
  },