@payloadcms/db-postgres 0.1.0-beta.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/connect.js +82 -0
- package/dist/create.js +32 -0
- package/dist/createGlobal.js +32 -0
- package/dist/createGlobalVersion.js +48 -0
- package/dist/createMigration.js +85 -0
- package/dist/createVersion.js +54 -0
- package/dist/deleteMany.js +44 -0
- package/dist/deleteOne.js +47 -0
- package/dist/deleteVersions.js +46 -0
- package/dist/destroy.js +16 -0
- package/dist/find/buildFindManyArgs.js +61 -0
- package/dist/find/chainMethods.js +21 -0
- package/dist/find/findMany.js +197 -0
- package/dist/find/traverseFields.js +118 -0
- package/dist/find.js +35 -0
- package/dist/findGlobal.js +38 -0
- package/dist/findGlobalVersions.js +39 -0
- package/dist/findOne.js +49 -0
- package/dist/findVersions.js +39 -0
- package/dist/index.js +95 -0
- package/dist/init.js +74 -0
- package/dist/migrate.js +81 -0
- package/dist/migrateStatus.js +54 -0
- package/dist/mock.js +13 -0
- package/dist/queries/buildAndOrConditions.js +39 -0
- package/dist/queries/buildQuery.js +80 -0
- package/dist/queries/createJSONQuery/convertPathToJSONTraversal.js +24 -0
- package/dist/queries/createJSONQuery/formatJSONPathSegment.js +15 -0
- package/dist/queries/createJSONQuery/index.js +64 -0
- package/dist/queries/getTableColumnFromPath.js +333 -0
- package/dist/queries/operatorMap.js +34 -0
- package/dist/queries/parseParams.js +146 -0
- package/dist/queries/sanitizeQueryValue.js +79 -0
- package/dist/queryDrafts.js +56 -0
- package/dist/reference.js +76 -0
- package/dist/schema/build.js +245 -0
- package/dist/schema/createIndex.js +19 -0
- package/dist/schema/parentIDColumnMap.js +18 -0
- package/dist/schema/traverseFields.js +430 -0
- package/dist/schema/validateExistingBlockIsIdentical.js +34 -0
- package/dist/transactions/beginTransaction.js +51 -0
- package/dist/transactions/commitTransaction.js +24 -0
- package/dist/transactions/rollbackTransaction.js +20 -0
- package/dist/transform/read/hasManyNumber.js +20 -0
- package/dist/transform/read/index.js +42 -0
- package/dist/transform/read/relationship.js +74 -0
- package/dist/transform/read/traverseFields.js +325 -0
- package/dist/transform/write/array.js +55 -0
- package/dist/transform/write/blocks.js +56 -0
- package/dist/transform/write/index.js +46 -0
- package/dist/transform/write/numbers.js +21 -0
- package/dist/transform/write/relationships.js +33 -0
- package/dist/transform/write/selects.js +29 -0
- package/dist/transform/write/traverseFields.js +379 -0
- package/dist/transform/write/types.js +6 -0
- package/dist/types.js +6 -0
- package/dist/update.js +48 -0
- package/dist/updateGlobal.js +39 -0
- package/dist/updateGlobalVersion.js +50 -0
- package/dist/updateVersion.js +50 -0
- package/dist/upsertRow/deleteExistingArrayRows.js +20 -0
- package/dist/upsertRow/deleteExistingRowsByPath.js +43 -0
- package/dist/upsertRow/index.js +243 -0
- package/dist/upsertRow/insertArrays.js +64 -0
- package/dist/upsertRow/types.js +6 -0
- package/dist/utilities/appendPrefixToKeys.js +16 -0
- package/dist/utilities/createBlocksMap.js +39 -0
- package/dist/utilities/createMigrationTable.js +23 -0
- package/dist/utilities/createRelationshipMap.js +29 -0
- package/dist/utilities/hasLocalesTable.js +21 -0
- package/dist/utilities/isArrayOfRows.js +15 -0
- package/dist/utilities/migrationTableExists.js +19 -0
- package/dist/webpack.js +30 -0
- package/package.json +47 -0
@@ -0,0 +1,333 @@
|
|
1
|
+
/* eslint-disable no-param-reassign */ "use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
3
|
+
value: true
|
4
|
+
});
|
5
|
+
Object.defineProperty(exports, "getTableColumnFromPath", {
|
6
|
+
enumerable: true,
|
7
|
+
get: function() {
|
8
|
+
return getTableColumnFromPath;
|
9
|
+
}
|
10
|
+
});
|
11
|
+
const _drizzleorm = require("drizzle-orm");
|
12
|
+
const _pgcore = require("drizzle-orm/pg-core");
|
13
|
+
const _errors = require("payload/errors");
|
14
|
+
const _types = require("payload/types");
|
15
|
+
const _utilities = require("payload/utilities");
|
16
|
+
const _tosnakecase = /*#__PURE__*/ _interop_require_default(require("to-snake-case"));
|
17
|
+
const _uuid = require("uuid");
|
18
|
+
function _interop_require_default(obj) {
|
19
|
+
return obj && obj.__esModule ? obj : {
|
20
|
+
default: obj
|
21
|
+
};
|
22
|
+
}
|
23
|
+
const getTableColumnFromPath = ({ adapter, aliasTable, collectionPath, columnPrefix = '', constraints = [], fields, joinAliases, joins, locale: incomingLocale, pathSegments: incomingSegments, selectFields, tableName })=>{
|
24
|
+
const fieldPath = incomingSegments[0];
|
25
|
+
let locale = incomingLocale;
|
26
|
+
const field = (0, _utilities.flattenTopLevelFields)(fields).find((fieldToFind)=>(0, _types.fieldAffectsData)(fieldToFind) && fieldToFind.name === fieldPath);
|
27
|
+
let newTableName = tableName;
|
28
|
+
if (!field && fieldPath === 'id') {
|
29
|
+
selectFields.id = adapter.tables[newTableName].id;
|
30
|
+
return {
|
31
|
+
columnName: 'id',
|
32
|
+
constraints,
|
33
|
+
field: {
|
34
|
+
name: 'id',
|
35
|
+
type: 'number'
|
36
|
+
},
|
37
|
+
table: adapter.tables[newTableName]
|
38
|
+
};
|
39
|
+
}
|
40
|
+
if (field) {
|
41
|
+
const pathSegments = [
|
42
|
+
...incomingSegments
|
43
|
+
];
|
44
|
+
// If next segment is a locale,
|
45
|
+
// we need to take it out and use it as the locale from this point on
|
46
|
+
if ('localized' in field && field.localized && adapter.payload.config.localization) {
|
47
|
+
const matchedLocale = adapter.payload.config.localization.localeCodes.find((locale)=>locale === pathSegments[1]);
|
48
|
+
if (matchedLocale) {
|
49
|
+
locale = matchedLocale;
|
50
|
+
pathSegments.splice(1, 1);
|
51
|
+
}
|
52
|
+
}
|
53
|
+
switch(field.type){
|
54
|
+
case 'tabs':
|
55
|
+
{
|
56
|
+
return getTableColumnFromPath({
|
57
|
+
adapter,
|
58
|
+
aliasTable,
|
59
|
+
collectionPath,
|
60
|
+
columnPrefix,
|
61
|
+
constraints,
|
62
|
+
fields: field.tabs.map((tab)=>({
|
63
|
+
...tab,
|
64
|
+
type: 'tab'
|
65
|
+
})),
|
66
|
+
joinAliases,
|
67
|
+
joins,
|
68
|
+
locale,
|
69
|
+
pathSegments: pathSegments.slice(1),
|
70
|
+
selectFields,
|
71
|
+
tableName: newTableName
|
72
|
+
});
|
73
|
+
}
|
74
|
+
case 'tab':
|
75
|
+
{
|
76
|
+
if ((0, _types.tabHasName)(field)) {
|
77
|
+
return getTableColumnFromPath({
|
78
|
+
adapter,
|
79
|
+
aliasTable,
|
80
|
+
collectionPath,
|
81
|
+
columnPrefix: `${columnPrefix}${field.name}_`,
|
82
|
+
constraints,
|
83
|
+
fields: field.fields,
|
84
|
+
joinAliases,
|
85
|
+
joins,
|
86
|
+
locale,
|
87
|
+
pathSegments: pathSegments.slice(1),
|
88
|
+
selectFields,
|
89
|
+
tableName: newTableName
|
90
|
+
});
|
91
|
+
}
|
92
|
+
return getTableColumnFromPath({
|
93
|
+
adapter,
|
94
|
+
aliasTable,
|
95
|
+
collectionPath,
|
96
|
+
columnPrefix,
|
97
|
+
constraints,
|
98
|
+
fields: field.fields,
|
99
|
+
joinAliases,
|
100
|
+
joins,
|
101
|
+
locale,
|
102
|
+
pathSegments: pathSegments.slice(1),
|
103
|
+
selectFields,
|
104
|
+
tableName: newTableName
|
105
|
+
});
|
106
|
+
}
|
107
|
+
case 'group':
|
108
|
+
{
|
109
|
+
if (locale && field.localized && adapter.payload.config.localization) {
|
110
|
+
newTableName = `${tableName}_locales`;
|
111
|
+
joins[tableName] = (0, _drizzleorm.eq)(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID);
|
112
|
+
if (locale !== 'all') {
|
113
|
+
constraints.push({
|
114
|
+
columnName: '_locale',
|
115
|
+
table: adapter.tables[newTableName],
|
116
|
+
value: locale
|
117
|
+
});
|
118
|
+
}
|
119
|
+
}
|
120
|
+
return getTableColumnFromPath({
|
121
|
+
adapter,
|
122
|
+
aliasTable,
|
123
|
+
collectionPath,
|
124
|
+
columnPrefix: `${columnPrefix}${field.name}_`,
|
125
|
+
constraints,
|
126
|
+
fields: field.fields,
|
127
|
+
joinAliases,
|
128
|
+
joins,
|
129
|
+
locale,
|
130
|
+
pathSegments: pathSegments.slice(1),
|
131
|
+
selectFields,
|
132
|
+
tableName: newTableName
|
133
|
+
});
|
134
|
+
}
|
135
|
+
case 'array':
|
136
|
+
{
|
137
|
+
newTableName = `${tableName}_${(0, _tosnakecase.default)(field.name)}`;
|
138
|
+
if (locale && field.localized && adapter.payload.config.localization) {
|
139
|
+
joins[newTableName] = (0, _drizzleorm.and)((0, _drizzleorm.eq)(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID), (0, _drizzleorm.eq)(adapter.tables[newTableName]._locale, locale));
|
140
|
+
if (locale !== 'all') {
|
141
|
+
constraints.push({
|
142
|
+
columnName: '_locale',
|
143
|
+
table: adapter.tables[newTableName],
|
144
|
+
value: locale
|
145
|
+
});
|
146
|
+
}
|
147
|
+
} else {
|
148
|
+
joins[newTableName] = (0, _drizzleorm.eq)(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID);
|
149
|
+
}
|
150
|
+
return getTableColumnFromPath({
|
151
|
+
adapter,
|
152
|
+
collectionPath,
|
153
|
+
constraints,
|
154
|
+
fields: field.fields,
|
155
|
+
joinAliases,
|
156
|
+
joins,
|
157
|
+
locale,
|
158
|
+
pathSegments: pathSegments.slice(1),
|
159
|
+
selectFields,
|
160
|
+
tableName: newTableName
|
161
|
+
});
|
162
|
+
}
|
163
|
+
case 'blocks':
|
164
|
+
{
|
165
|
+
let blockTableColumn;
|
166
|
+
let newTableName;
|
167
|
+
const hasBlockField = field.blocks.some((block)=>{
|
168
|
+
newTableName = `${tableName}_blocks_${(0, _tosnakecase.default)(block.slug)}`;
|
169
|
+
let result;
|
170
|
+
const blockConstraints = [];
|
171
|
+
const blockSelectFields = {};
|
172
|
+
try {
|
173
|
+
result = getTableColumnFromPath({
|
174
|
+
adapter,
|
175
|
+
collectionPath,
|
176
|
+
constraints: blockConstraints,
|
177
|
+
fields: block.fields,
|
178
|
+
joinAliases,
|
179
|
+
joins,
|
180
|
+
locale,
|
181
|
+
pathSegments: pathSegments.slice(1),
|
182
|
+
selectFields: blockSelectFields,
|
183
|
+
tableName: newTableName
|
184
|
+
});
|
185
|
+
} catch (error) {
|
186
|
+
// this is fine, not every block will have the field
|
187
|
+
}
|
188
|
+
if (!result) {
|
189
|
+
return;
|
190
|
+
}
|
191
|
+
blockTableColumn = result;
|
192
|
+
constraints = constraints.concat(blockConstraints);
|
193
|
+
selectFields = {
|
194
|
+
...selectFields,
|
195
|
+
...blockSelectFields
|
196
|
+
};
|
197
|
+
if (field.localized && adapter.payload.config.localization) {
|
198
|
+
joins[newTableName] = (0, _drizzleorm.and)((0, _drizzleorm.eq)(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID), (0, _drizzleorm.eq)(adapter.tables[newTableName]._locale, locale));
|
199
|
+
if (locale) {
|
200
|
+
constraints.push({
|
201
|
+
columnName: '_locale',
|
202
|
+
table: adapter.tables[newTableName],
|
203
|
+
value: locale
|
204
|
+
});
|
205
|
+
}
|
206
|
+
} else {
|
207
|
+
joins[newTableName] = (0, _drizzleorm.eq)(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID);
|
208
|
+
}
|
209
|
+
return result;
|
210
|
+
});
|
211
|
+
if (hasBlockField) {
|
212
|
+
return {
|
213
|
+
columnName: blockTableColumn.columnName,
|
214
|
+
constraints,
|
215
|
+
field: blockTableColumn.field,
|
216
|
+
pathSegments: pathSegments.slice(1),
|
217
|
+
rawColumn: blockTableColumn.rawColumn,
|
218
|
+
table: adapter.tables[newTableName]
|
219
|
+
};
|
220
|
+
}
|
221
|
+
break;
|
222
|
+
}
|
223
|
+
case 'relationship':
|
224
|
+
case 'upload':
|
225
|
+
{
|
226
|
+
let relationshipFields;
|
227
|
+
const relationTableName = `${tableName}_relationships`;
|
228
|
+
const newCollectionPath = pathSegments.slice(1).join('.');
|
229
|
+
const aliasRelationshipTableName = (0, _uuid.v4)();
|
230
|
+
const aliasRelationshipTable = (0, _pgcore.alias)(adapter.tables[relationTableName], aliasRelationshipTableName);
|
231
|
+
// Join in the relationships table
|
232
|
+
joinAliases.push({
|
233
|
+
condition: (0, _drizzleorm.eq)((aliasTable || adapter.tables[tableName]).id, aliasRelationshipTable.parent),
|
234
|
+
table: aliasRelationshipTable
|
235
|
+
});
|
236
|
+
selectFields[`${relationTableName}.path`] = aliasRelationshipTable.path;
|
237
|
+
constraints.push({
|
238
|
+
columnName: 'path',
|
239
|
+
table: aliasRelationshipTable,
|
240
|
+
value: field.name
|
241
|
+
});
|
242
|
+
let newAliasTable;
|
243
|
+
if (typeof field.relationTo === 'string') {
|
244
|
+
newTableName = `${(0, _tosnakecase.default)(field.relationTo)}`;
|
245
|
+
// parent to relationship join table
|
246
|
+
relationshipFields = adapter.payload.collections[field.relationTo].config.fields;
|
247
|
+
newAliasTable = (0, _pgcore.alias)(adapter.tables[newTableName], (0, _tosnakecase.default)((0, _uuid.v4)()));
|
248
|
+
joinAliases.push({
|
249
|
+
condition: (0, _drizzleorm.eq)(newAliasTable.id, aliasRelationshipTable[`${field.relationTo}ID`]),
|
250
|
+
table: newAliasTable
|
251
|
+
});
|
252
|
+
if (newCollectionPath === '') {
|
253
|
+
return {
|
254
|
+
columnName: `${field.relationTo}ID`,
|
255
|
+
constraints,
|
256
|
+
field,
|
257
|
+
table: aliasRelationshipTable
|
258
|
+
};
|
259
|
+
}
|
260
|
+
} else if (newCollectionPath === 'value') {
|
261
|
+
const tableColumnsNames = field.relationTo.map((relationTo)=>`"${aliasRelationshipTableName}"."${(0, _tosnakecase.default)(relationTo)}_id"`);
|
262
|
+
return {
|
263
|
+
constraints,
|
264
|
+
field,
|
265
|
+
rawColumn: _drizzleorm.sql.raw(`COALESCE(${tableColumnsNames.join(', ')})`),
|
266
|
+
table: aliasRelationshipTable
|
267
|
+
};
|
268
|
+
} else if (newCollectionPath === 'relationTo') {
|
269
|
+
const relationTo = Array.isArray(field.relationTo) ? field.relationTo : [
|
270
|
+
field.relationTo
|
271
|
+
];
|
272
|
+
return {
|
273
|
+
constraints,
|
274
|
+
field,
|
275
|
+
getNotNullColumnByValue: (val)=>{
|
276
|
+
const matchedRelation = relationTo.find((relation)=>relation === val);
|
277
|
+
if (matchedRelation) return `${matchedRelation}ID`;
|
278
|
+
return undefined;
|
279
|
+
},
|
280
|
+
table: aliasRelationshipTable
|
281
|
+
};
|
282
|
+
} else {
|
283
|
+
throw new _errors.APIError('Not supported');
|
284
|
+
}
|
285
|
+
return getTableColumnFromPath({
|
286
|
+
adapter,
|
287
|
+
aliasTable: newAliasTable,
|
288
|
+
collectionPath: newCollectionPath,
|
289
|
+
constraints,
|
290
|
+
fields: relationshipFields,
|
291
|
+
joinAliases,
|
292
|
+
joins,
|
293
|
+
locale,
|
294
|
+
pathSegments: pathSegments.slice(1),
|
295
|
+
selectFields,
|
296
|
+
tableName: newTableName
|
297
|
+
});
|
298
|
+
}
|
299
|
+
default:
|
300
|
+
{
|
301
|
+
if ((0, _types.fieldAffectsData)(field)) {
|
302
|
+
if (field.localized && adapter.payload.config.localization) {
|
303
|
+
// If localized, we go to localized table and set aliasTable to undefined
|
304
|
+
// so it is not picked up below to be used as targetTable
|
305
|
+
newTableName = `${tableName}_locales`;
|
306
|
+
const parentTable = aliasTable || adapter.tables[tableName];
|
307
|
+
joins[newTableName] = (0, _drizzleorm.eq)(parentTable.id, adapter.tables[newTableName]._parentID);
|
308
|
+
aliasTable = undefined;
|
309
|
+
if (locale !== 'all') {
|
310
|
+
constraints.push({
|
311
|
+
columnName: '_locale',
|
312
|
+
table: adapter.tables[newTableName],
|
313
|
+
value: locale
|
314
|
+
});
|
315
|
+
}
|
316
|
+
}
|
317
|
+
const targetTable = aliasTable || adapter.tables[newTableName];
|
318
|
+
selectFields[`${newTableName}.${columnPrefix}${field.name}`] = targetTable[`${columnPrefix}${field.name}`];
|
319
|
+
return {
|
320
|
+
columnName: `${columnPrefix}${field.name}`,
|
321
|
+
constraints,
|
322
|
+
field,
|
323
|
+
pathSegments: pathSegments,
|
324
|
+
table: targetTable
|
325
|
+
};
|
326
|
+
}
|
327
|
+
}
|
328
|
+
}
|
329
|
+
}
|
330
|
+
throw new _errors.APIError(`Cannot find field for path at ${fieldPath}`);
|
331
|
+
};
|
332
|
+
|
333
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9xdWVyaWVzL2dldFRhYmxlQ29sdW1uRnJvbVBhdGgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCB0eXBlIHsgU1FMIH0gZnJvbSAnZHJpenpsZS1vcm0nXG5pbXBvcnQgdHlwZSB7IEZpZWxkLCBGaWVsZEFmZmVjdGluZ0RhdGEsIFRhYkFzRmllbGQgfSBmcm9tICdwYXlsb2FkL3R5cGVzJ1xuXG5pbXBvcnQgeyBhbmQsIGVxLCBzcWwgfSBmcm9tICdkcml6emxlLW9ybSdcbmltcG9ydCB7IGFsaWFzIH0gZnJvbSAnZHJpenpsZS1vcm0vcGctY29yZSdcbmltcG9ydCB7IEFQSUVycm9yIH0gZnJvbSAncGF5bG9hZC9lcnJvcnMnXG5pbXBvcnQgeyBmaWVsZEFmZmVjdHNEYXRhLCB0YWJIYXNOYW1lIH0gZnJvbSAncGF5bG9hZC90eXBlcydcbmltcG9ydCB7IGZsYXR0ZW5Ub3BMZXZlbEZpZWxkcyB9IGZyb20gJ3BheWxvYWQvdXRpbGl0aWVzJ1xuaW1wb3J0IHRvU25ha2VDYXNlIGZyb20gJ3RvLXNuYWtlLWNhc2UnXG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSAndXVpZCdcblxuaW1wb3J0IHR5cGUgeyBHZW5lcmljQ29sdW1uLCBHZW5lcmljVGFibGUsIFBvc3RncmVzQWRhcHRlciB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBCdWlsZFF1ZXJ5Sm9pbkFsaWFzZXMsIEJ1aWxkUXVlcnlKb2lucyB9IGZyb20gJy4vYnVpbGRRdWVyeSdcblxudHlwZSBDb25zdHJhaW50ID0ge1xuICBjb2x1bW5OYW1lOiBzdHJpbmdcbiAgdGFibGU6IEdlbmVyaWNUYWJsZVxuICB2YWx1ZTogdW5rbm93blxufVxuXG50eXBlIFRhYmxlQ29sdW1uID0ge1xuICBjb2x1bW5OYW1lPzogc3RyaW5nXG4gIGNvbnN0cmFpbnRzOiBDb25zdHJhaW50W11cbiAgZmllbGQ6IEZpZWxkQWZmZWN0aW5nRGF0YVxuICBnZXROb3ROdWxsQ29sdW1uQnlWYWx1ZT86ICh2YWw6IHVua25vd24pID0+IHN0cmluZ1xuICBwYXRoU2VnbWVudHM/OiBzdHJpbmdbXVxuICByYXdDb2x1bW4/OiBTUUxcbiAgdGFibGU6IEdlbmVyaWNUYWJsZVxufVxuXG50eXBlIEFyZ3MgPSB7XG4gIGFkYXB0ZXI6IFBvc3RncmVzQWRhcHRlclxuICBhbGlhc1RhYmxlPzogR2VuZXJpY1RhYmxlXG4gIGNvbGxlY3Rpb25QYXRoOiBzdHJpbmdcbiAgY29sdW1uUHJlZml4Pzogc3RyaW5nXG4gIGNvbnN0cmFpbnRzPzogQ29uc3RyYWludFtdXG4gIGZpZWxkczogKEZpZWxkIHwgVGFiQXNGaWVsZClbXVxuICBqb2luQWxpYXNlczogQnVpbGRRdWVyeUpvaW5BbGlhc2VzXG4gIGpvaW5zOiBCdWlsZFF1ZXJ5Sm9pbnNcbiAgbG9jYWxlPzogc3RyaW5nXG4gIHBhdGhTZWdtZW50czogc3RyaW5nW11cbiAgc2VsZWN0RmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBHZW5lcmljQ29sdW1uPlxuICB0YWJsZU5hbWU6IHN0cmluZ1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHBhdGggdG8gdGFibGUgYW5kIGNvbHVtbiBuYW1lXG4gKiBBZGRzIHRhYmxlcyB0byBgam9pbmBcbiAqIEByZXR1cm5zIFRhYmxlQ29sdW1uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRUYWJsZUNvbHVtbkZyb21QYXRoID0gKHtcbiAgYWRhcHRlcixcbiAgYWxpYXNUYWJsZSxcbiAgY29sbGVjdGlvblBhdGgsXG4gIGNvbHVtblByZWZpeCA9ICcnLFxuICBjb25zdHJhaW50cyA9IFtdLFxuICBmaWVsZHMsXG4gIGpvaW5BbGlhc2VzLFxuICBqb2lucyxcbiAgbG9jYWxlOiBpbmNvbWluZ0xvY2FsZSxcbiAgcGF0aFNlZ21lbnRzOiBpbmNvbWluZ1NlZ21lbnRzLFxuICBzZWxlY3RGaWVsZHMsXG4gIHRhYmxlTmFtZSxcbn06IEFyZ3MpOiBUYWJsZUNvbHVtbiA9PiB7XG4gIGNvbnN0IGZpZWxkUGF0aCA9IGluY29taW5nU2VnbWVudHNbMF1cbiAgbGV0IGxvY2FsZSA9IGluY29taW5nTG9jYWxlXG4gIGNvbnN0IGZpZWxkID0gZmxhdHRlblRvcExldmVsRmllbGRzKGZpZWxkcyBhcyBGaWVsZFtdKS5maW5kKFxuICAgIChmaWVsZFRvRmluZCkgPT4gZmllbGRBZmZlY3RzRGF0YShmaWVsZFRvRmluZCkgJiYgZmllbGRUb0ZpbmQubmFtZSA9PT0gZmllbGRQYXRoLFxuICApIGFzIEZpZWxkIHwgVGFiQXNGaWVsZFxuICBsZXQgbmV3VGFibGVOYW1lID0gdGFibGVOYW1lXG5cbiAgaWYgKCFmaWVsZCAmJiBmaWVsZFBhdGggPT09ICdpZCcpIHtcbiAgICBzZWxlY3RGaWVsZHMuaWQgPSBhZGFwdGVyLnRhYmxlc1tuZXdUYWJsZU5hbWVdLmlkXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbHVtbk5hbWU6ICdpZCcsXG4gICAgICBjb25zdHJhaW50cyxcbiAgICAgIGZpZWxkOiB7XG4gICAgICAgIG5hbWU6ICdpZCcsXG4gICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgfSxcbiAgICAgIHRhYmxlOiBhZGFwdGVyLnRhYmxlc1tuZXdUYWJsZU5hbWVdLFxuICAgIH1cbiAgfVxuXG4gIGlmIChmaWVsZCkge1xuICAgIGNvbnN0IHBhdGhTZWdtZW50cyA9IFsuLi5pbmNvbWluZ1NlZ21lbnRzXVxuXG4gICAgLy8gSWYgbmV4dCBzZWdtZW50IGlzIGEgbG9jYWxlLFxuICAgIC8vIHdlIG5lZWQgdG8gdGFrZSBpdCBvdXQgYW5kIHVzZSBpdCBhcyB0aGUgbG9jYWxlIGZyb20gdGhpcyBwb2ludCBvblxuICAgIGlmICgnbG9jYWxpemVkJyBpbiBmaWVsZCAmJiBmaWVsZC5sb2NhbGl6ZWQgJiYgYWRhcHRlci5wYXlsb2FkLmNvbmZpZy5sb2NhbGl6YXRpb24pIHtcbiAgICAgIGNvbnN0IG1hdGNoZWRMb2NhbGUgPSBhZGFwdGVyLnBheWxvYWQuY29uZmlnLmxvY2FsaXphdGlvbi5sb2NhbGVDb2Rlcy5maW5kKFxuICAgICAgICAobG9jYWxlKSA9PiBsb2NhbGUgPT09IHBhdGhTZWdtZW50c1sxXSxcbiAgICAgIClcblxuICAgICAgaWYgKG1hdGNoZWRMb2NhbGUpIHtcbiAgICAgICAgbG9jYWxlID0gbWF0Y2hlZExvY2FsZVxuICAgICAgICBwYXRoU2VnbWVudHMuc3BsaWNlKDEsIDEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICBjYXNlICd0YWJzJzoge1xuICAgICAgICByZXR1cm4gZ2V0VGFibGVDb2x1bW5Gcm9tUGF0aCh7XG4gICAgICAgICAgYWRhcHRlcixcbiAgICAgICAgICBhbGlhc1RhYmxlLFxuICAgICAgICAgIGNvbGxlY3Rpb25QYXRoLFxuICAgICAgICAgIGNvbHVtblByZWZpeCxcbiAgICAgICAgICBjb25zdHJhaW50cyxcbiAgICAgICAgICBmaWVsZHM6IGZpZWxkLnRhYnMubWFwKCh0YWIpID0+ICh7XG4gICAgICAgICAgICAuLi50YWIsXG4gICAgICAgICAgICB0eXBlOiAndGFiJyxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgam9pbkFsaWFzZXMsXG4gICAgICAgICAgam9pbnMsXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIHBhdGhTZWdtZW50czogcGF0aFNlZ21lbnRzLnNsaWNlKDEpLFxuICAgICAgICAgIHNlbGVjdEZpZWxkcyxcbiAgICAgICAgICB0YWJsZU5hbWU6IG5ld1RhYmxlTmFtZSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhYic6IHtcbiAgICAgICAgaWYgKHRhYkhhc05hbWUoZmllbGQpKSB7XG4gICAgICAgICAgcmV0dXJuIGdldFRhYmxlQ29sdW1uRnJvbVBhdGgoe1xuICAgICAgICAgICAgYWRhcHRlcixcbiAgICAgICAgICAgIGFsaWFzVGFibGUsXG4gICAgICAgICAgICBjb2xsZWN0aW9uUGF0aCxcbiAgICAgICAgICAgIGNvbHVtblByZWZpeDogYCR7Y29sdW1uUHJlZml4fSR7ZmllbGQubmFtZX1fYCxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLFxuICAgICAgICAgICAgZmllbGRzOiBmaWVsZC5maWVsZHMsXG4gICAgICAgICAgICBqb2luQWxpYXNlcyxcbiAgICAgICAgICAgIGpvaW5zLFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgcGF0aFNlZ21lbnRzOiBwYXRoU2VnbWVudHMuc2xpY2UoMSksXG4gICAgICAgICAgICBzZWxlY3RGaWVsZHMsXG4gICAgICAgICAgICB0YWJsZU5hbWU6IG5ld1RhYmxlTmFtZSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRUYWJsZUNvbHVtbkZyb21QYXRoKHtcbiAgICAgICAgICBhZGFwdGVyLFxuICAgICAgICAgIGFsaWFzVGFibGUsXG4gICAgICAgICAgY29sbGVjdGlvblBhdGgsXG4gICAgICAgICAgY29sdW1uUHJlZml4LFxuICAgICAgICAgIGNvbnN0cmFpbnRzLFxuICAgICAgICAgIGZpZWxkczogZmllbGQuZmllbGRzLFxuICAgICAgICAgIGpvaW5BbGlhc2VzLFxuICAgICAgICAgIGpvaW5zLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICBwYXRoU2VnbWVudHM6IHBhdGhTZWdtZW50cy5zbGljZSgxKSxcbiAgICAgICAgICBzZWxlY3RGaWVsZHMsXG4gICAgICAgICAgdGFibGVOYW1lOiBuZXdUYWJsZU5hbWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dyb3VwJzoge1xuICAgICAgICBpZiAobG9jYWxlICYmIGZpZWxkLmxvY2FsaXplZCAmJiBhZGFwdGVyLnBheWxvYWQuY29uZmlnLmxvY2FsaXphdGlvbikge1xuICAgICAgICAgIG5ld1RhYmxlTmFtZSA9IGAke3RhYmxlTmFtZX1fbG9jYWxlc2BcblxuICAgICAgICAgIGpvaW5zW3RhYmxlTmFtZV0gPSBlcShcbiAgICAgICAgICAgIGFkYXB0ZXIudGFibGVzW3RhYmxlTmFtZV0uaWQsXG4gICAgICAgICAgICBhZGFwdGVyLnRhYmxlc1tuZXdUYWJsZU5hbWVdLl9wYXJlbnRJRCxcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKGxvY2FsZSAhPT0gJ2FsbCcpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLnB1c2goe1xuICAgICAgICAgICAgICBjb2x1bW5OYW1lOiAnX2xvY2FsZScsXG4gICAgICAgICAgICAgIHRhYmxlOiBhZGFwdGVyLnRhYmxlc1tuZXdUYWJsZU5hbWVdLFxuICAgICAgICAgICAgICB2YWx1ZTogbG9jYWxlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldFRhYmxlQ29sdW1uRnJvbVBhdGgoe1xuICAgICAgICAgIGFkYXB0ZXIsXG4gICAgICAgICAgYWxpYXNUYWJsZSxcbiAgICAgICAgICBjb2xsZWN0aW9uUGF0aCxcbiAgICAgICAgICBjb2x1bW5QcmVmaXg6IGAke2NvbHVtblByZWZpeH0ke2ZpZWxkLm5hbWV9X2AsXG4gICAgICAgICAgY29uc3RyYWludHMsXG4gICAgICAgICAgZmllbGRzOiBmaWVsZC5maWVsZHMsXG4gICAgICAgICAgam9pbkFsaWFzZXMsXG4gICAgICAgICAgam9pbnMsXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIHBhdGhTZWdtZW50czogcGF0aFNlZ21lbnRzLnNsaWNlKDEpLFxuICAgICAgICAgIHNlbGVjdEZpZWxkcyxcbiAgICAgICAgICB0YWJsZU5hbWU6IG5ld1RhYmxlTmFtZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY2FzZSAnYXJyYXknOiB7XG4gICAgICAgIG5ld1RhYmxlTmFtZSA9IGAke3RhYmxlTmFtZX1fJHt0b1NuYWtlQ2FzZShmaWVsZC5uYW1lKX1gXG4gICAgICAgIGlmIChsb2NhbGUgJiYgZmllbGQubG9jYWxpemVkICYmIGFkYXB0ZXIucGF5bG9hZC5jb25maWcubG9jYWxpemF0aW9uKSB7XG4gICAgICAgICAgam9pbnNbbmV3VGFibGVOYW1lXSA9IGFuZChcbiAgICAgICAgICAgIGVxKGFkYXB0ZXIudGFibGVzW3RhYmxlTmFtZV0uaWQsIGFkYXB0ZXIudGFibGVzW25ld1RhYmxlTmFtZV0uX3BhcmVudElEKSxcbiAgICAgICAgICAgIGVxKGFkYXB0ZXIudGFibGVzW25ld1RhYmxlTmFtZV0uX2xvY2FsZSwgbG9jYWxlKSxcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKGxvY2FsZSAhPT0gJ2FsbCcpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLnB1c2goe1xuICAgICAgICAgICAgICBjb2x1bW5OYW1lOiAnX2xvY2FsZScsXG4gICAgICAgICAgICAgIHRhYmxlOiBhZGFwdGVyLnRhYmxlc1tuZXdUYWJsZU5hbWVdLFxuICAgICAgICAgICAgICB2YWx1ZTogbG9jYWxlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgam9pbnNbbmV3VGFibGVOYW1lXSA9IGVxKFxuICAgICAgICAgICAgYWRhcHRlci50YWJsZXNbdGFibGVOYW1lXS5pZCxcbiAgICAgICAgICAgIGFkYXB0ZXIudGFibGVzW25ld1RhYmxlTmFtZV0uX3BhcmVudElELFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0VGFibGVDb2x1bW5Gcm9tUGF0aCh7XG4gICAgICAgICAgYWRhcHRlcixcbiAgICAgICAgICBjb2xsZWN0aW9uUGF0aCxcbiAgICAgICAgICBjb25zdHJhaW50cyxcbiAgICAgICAgICBmaWVsZHM6IGZpZWxkLmZpZWxkcyxcbiAgICAgICAgICBqb2luQWxpYXNlcyxcbiAgICAgICAgICBqb2lucyxcbiAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgcGF0aFNlZ21lbnRzOiBwYXRoU2VnbWVudHMuc2xpY2UoMSksXG4gICAgICAgICAgc2VsZWN0RmllbGRzLFxuICAgICAgICAgIHRhYmxlTmFtZTogbmV3VGFibGVOYW1lLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjYXNlICdibG9ja3MnOiB7XG4gICAgICAgIGxldCBibG9ja1RhYmxlQ29sdW1uOiBUYWJsZUNvbHVtblxuICAgICAgICBsZXQgbmV3VGFibGVOYW1lOiBzdHJpbmdcbiAgICAgICAgY29uc3QgaGFzQmxvY2tGaWVsZCA9IGZpZWxkLmJsb2Nrcy5zb21lKChibG9jaykgPT4ge1xuICAgICAgICAgIG5ld1RhYmxlTmFtZSA9IGAke3RhYmxlTmFtZX1fYmxvY2tzXyR7dG9TbmFrZUNhc2UoYmxvY2suc2x1Zyl9YFxuICAgICAgICAgIGxldCByZXN1bHRcbiAgICAgICAgICBjb25zdCBibG9ja0NvbnN0cmFpbnRzID0gW11cbiAgICAgICAgICBjb25zdCBibG9ja1NlbGVjdEZpZWxkcyA9IHt9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGdldFRhYmxlQ29sdW1uRnJvbVBhdGgoe1xuICAgICAgICAgICAgICBhZGFwdGVyLFxuICAgICAgICAgICAgICBjb2xsZWN0aW9uUGF0aCxcbiAgICAgICAgICAgICAgY29uc3RyYWludHM6IGJsb2NrQ29uc3RyYWludHMsXG4gICAgICAgICAgICAgIGZpZWxkczogYmxvY2suZmllbGRzLFxuICAgICAgICAgICAgICBqb2luQWxpYXNlcyxcbiAgICAgICAgICAgICAgam9pbnMsXG4gICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgcGF0aFNlZ21lbnRzOiBwYXRoU2VnbWVudHMuc2xpY2UoMSksXG4gICAgICAgICAgICAgIHNlbGVjdEZpZWxkczogYmxvY2tTZWxlY3RGaWVsZHMsXG4gICAgICAgICAgICAgIHRhYmxlTmFtZTogbmV3VGFibGVOYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBmaW5lLCBub3QgZXZlcnkgYmxvY2sgd2lsbCBoYXZlIHRoZSBmaWVsZFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGJsb2NrVGFibGVDb2x1bW4gPSByZXN1bHRcbiAgICAgICAgICBjb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzLmNvbmNhdChibG9ja0NvbnN0cmFpbnRzKVxuICAgICAgICAgIHNlbGVjdEZpZWxkcyA9IHsgLi4uc2VsZWN0RmllbGRzLCAuLi5ibG9ja1NlbGVjdEZpZWxkcyB9XG4gICAgICAgICAgaWYgKGZpZWxkLmxvY2FsaXplZCAmJiBhZGFwdGVyLnBheWxvYWQuY29uZmlnLmxvY2FsaXphdGlvbikge1xuICAgICAgICAgICAgam9pbnNbbmV3VGFibGVOYW1lXSA9IGFuZChcbiAgICAgICAgICAgICAgZXEoYWRhcHRlci50YWJsZXNbdGFibGVOYW1lXS5pZCwgYWRhcHRlci50YWJsZXNbbmV3VGFibGVOYW1lXS5fcGFyZW50SUQpLFxuICAgICAgICAgICAgICBlcShhZGFwdGVyLnRhYmxlc1tuZXdUYWJsZU5hbWVdLl9sb2NhbGUsIGxvY2FsZSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWU6ICdfbG9jYWxlJyxcbiAgICAgICAgICAgICAgICB0YWJsZTogYWRhcHRlci50YWJsZXNbbmV3VGFibGVOYW1lXSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbG9jYWxlLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqb2luc1tuZXdUYWJsZU5hbWVdID0gZXEoXG4gICAgICAgICAgICAgIGFkYXB0ZXIudGFibGVzW3RhYmxlTmFtZV0uaWQsXG4gICAgICAgICAgICAgIGFkYXB0ZXIudGFibGVzW25ld1RhYmxlTmFtZV0uX3BhcmVudElELFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH0pXG4gICAgICAgIGlmIChoYXNCbG9ja0ZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbHVtbk5hbWU6IGJsb2NrVGFibGVDb2x1bW4uY29sdW1uTmFtZSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLFxuICAgICAgICAgICAgZmllbGQ6IGJsb2NrVGFibGVDb2x1bW4uZmllbGQsXG4gICAgICAgICAgICBwYXRoU2VnbWVudHM6IHBhdGhTZWdtZW50cy5zbGljZSgxKSxcbiAgICAgICAgICAgIHJhd0NvbHVtbjogYmxvY2tUYWJsZUNvbHVtbi5yYXdDb2x1bW4sXG4gICAgICAgICAgICB0YWJsZTogYWRhcHRlci50YWJsZXNbbmV3VGFibGVOYW1lXSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncmVsYXRpb25zaGlwJzpcbiAgICAgIGNhc2UgJ3VwbG9hZCc6IHtcbiAgICAgICAgbGV0IHJlbGF0aW9uc2hpcEZpZWxkc1xuICAgICAgICBjb25zdCByZWxhdGlvblRhYmxlTmFtZSA9IGAke3RhYmxlTmFtZX1fcmVsYXRpb25zaGlwc2BcbiAgICAgICAgY29uc3QgbmV3Q29sbGVjdGlvblBhdGggPSBwYXRoU2VnbWVudHMuc2xpY2UoMSkuam9pbignLicpXG5cbiAgICAgICAgY29uc3QgYWxpYXNSZWxhdGlvbnNoaXBUYWJsZU5hbWUgPSB1dWlkKClcbiAgICAgICAgY29uc3QgYWxpYXNSZWxhdGlvbnNoaXBUYWJsZSA9IGFsaWFzKFxuICAgICAgICAgIGFkYXB0ZXIudGFibGVzW3JlbGF0aW9uVGFibGVOYW1lXSxcbiAgICAgICAgICBhbGlhc1JlbGF0aW9uc2hpcFRhYmxlTmFtZSxcbiAgICAgICAgKVxuXG4gICAgICAgIC8vIEpvaW4gaW4gdGhlIHJlbGF0aW9uc2hpcHMgdGFibGVcbiAgICAgICAgam9pbkFsaWFzZXMucHVzaCh7XG4gICAgICAgICAgY29uZGl0aW9uOiBlcShcbiAgICAgICAgICAgIChhbGlhc1RhYmxlIHx8IGFkYXB0ZXIudGFibGVzW3RhYmxlTmFtZV0pLmlkLFxuICAgICAgICAgICAgYWxpYXNSZWxhdGlvbnNoaXBUYWJsZS5wYXJlbnQsXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0YWJsZTogYWxpYXNSZWxhdGlvbnNoaXBUYWJsZSxcbiAgICAgICAgfSlcblxuICAgICAgICBzZWxlY3RGaWVsZHNbYCR7cmVsYXRpb25UYWJsZU5hbWV9LnBhdGhgXSA9IGFsaWFzUmVsYXRpb25zaGlwVGFibGUucGF0aFxuXG4gICAgICAgIGNvbnN0cmFpbnRzLnB1c2goe1xuICAgICAgICAgIGNvbHVtbk5hbWU6ICdwYXRoJyxcbiAgICAgICAgICB0YWJsZTogYWxpYXNSZWxhdGlvbnNoaXBUYWJsZSxcbiAgICAgICAgICB2YWx1ZTogZmllbGQubmFtZSxcbiAgICAgICAgfSlcblxuICAgICAgICBsZXQgbmV3QWxpYXNUYWJsZVxuXG4gICAgICAgIGlmICh0eXBlb2YgZmllbGQucmVsYXRpb25UbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBuZXdUYWJsZU5hbWUgPSBgJHt0b1NuYWtlQ2FzZShmaWVsZC5yZWxhdGlvblRvKX1gXG4gICAgICAgICAgLy8gcGFyZW50IHRvIHJlbGF0aW9uc2hpcCBqb2luIHRhYmxlXG4gICAgICAgICAgcmVsYXRpb25zaGlwRmllbGRzID0gYWRhcHRlci5wYXlsb2FkLmNvbGxlY3Rpb25zW2ZpZWxkLnJlbGF0aW9uVG9dLmNvbmZpZy5maWVsZHNcblxuICAgICAgICAgIG5ld0FsaWFzVGFibGUgPSBhbGlhcyhhZGFwdGVyLnRhYmxlc1tuZXdUYWJsZU5hbWVdLCB0b1NuYWtlQ2FzZSh1dWlkKCkpKVxuXG4gICAgICAgICAgam9pbkFsaWFzZXMucHVzaCh7XG4gICAgICAgICAgICBjb25kaXRpb246IGVxKG5ld0FsaWFzVGFibGUuaWQsIGFsaWFzUmVsYXRpb25zaGlwVGFibGVbYCR7ZmllbGQucmVsYXRpb25Ub31JRGBdKSxcbiAgICAgICAgICAgIHRhYmxlOiBuZXdBbGlhc1RhYmxlLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAobmV3Q29sbGVjdGlvblBhdGggPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBgJHtmaWVsZC5yZWxhdGlvblRvfUlEYCxcbiAgICAgICAgICAgICAgY29uc3RyYWludHMsXG4gICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICB0YWJsZTogYWxpYXNSZWxhdGlvbnNoaXBUYWJsZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmV3Q29sbGVjdGlvblBhdGggPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICBjb25zdCB0YWJsZUNvbHVtbnNOYW1lcyA9IGZpZWxkLnJlbGF0aW9uVG8ubWFwKFxuICAgICAgICAgICAgKHJlbGF0aW9uVG8pID0+IGBcIiR7YWxpYXNSZWxhdGlvbnNoaXBUYWJsZU5hbWV9XCIuXCIke3RvU25ha2VDYXNlKHJlbGF0aW9uVG8pfV9pZFwiYCxcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLFxuICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICByYXdDb2x1bW46IHNxbC5yYXcoYENPQUxFU0NFKCR7dGFibGVDb2x1bW5zTmFtZXMuam9pbignLCAnKX0pYCksXG4gICAgICAgICAgICB0YWJsZTogYWxpYXNSZWxhdGlvbnNoaXBUYWJsZSxcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmV3Q29sbGVjdGlvblBhdGggPT09ICdyZWxhdGlvblRvJykge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aW9uVG8gPSBBcnJheS5pc0FycmF5KGZpZWxkLnJlbGF0aW9uVG8pID8gZmllbGQucmVsYXRpb25UbyA6IFtmaWVsZC5yZWxhdGlvblRvXVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLFxuICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICBnZXROb3ROdWxsQ29sdW1uQnlWYWx1ZTogKHZhbCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkUmVsYXRpb24gPSByZWxhdGlvblRvLmZpbmQoKHJlbGF0aW9uKSA9PiByZWxhdGlvbiA9PT0gdmFsKVxuICAgICAgICAgICAgICBpZiAobWF0Y2hlZFJlbGF0aW9uKSByZXR1cm4gYCR7bWF0Y2hlZFJlbGF0aW9ufUlEYFxuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGFibGU6IGFsaWFzUmVsYXRpb25zaGlwVGFibGUsXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBBUElFcnJvcignTm90IHN1cHBvcnRlZCcpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0VGFibGVDb2x1bW5Gcm9tUGF0aCh7XG4gICAgICAgICAgYWRhcHRlcixcbiAgICAgICAgICBhbGlhc1RhYmxlOiBuZXdBbGlhc1RhYmxlLFxuICAgICAgICAgIGNvbGxlY3Rpb25QYXRoOiBuZXdDb2xsZWN0aW9uUGF0aCxcbiAgICAgICAgICBjb25zdHJhaW50cyxcbiAgICAgICAgICBmaWVsZHM6IHJlbGF0aW9uc2hpcEZpZWxkcyxcbiAgICAgICAgICBqb2luQWxpYXNlcyxcbiAgICAgICAgICBqb2lucyxcbiAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgcGF0aFNlZ21lbnRzOiBwYXRoU2VnbWVudHMuc2xpY2UoMSksXG4gICAgICAgICAgc2VsZWN0RmllbGRzLFxuICAgICAgICAgIHRhYmxlTmFtZTogbmV3VGFibGVOYW1lLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGlmIChmaWVsZEFmZmVjdHNEYXRhKGZpZWxkKSkge1xuICAgICAgICAgIGlmIChmaWVsZC5sb2NhbGl6ZWQgJiYgYWRhcHRlci5wYXlsb2FkLmNvbmZpZy5sb2NhbGl6YXRpb24pIHtcbiAgICAgICAgICAgIC8vIElmIGxvY2FsaXplZCwgd2UgZ28gdG8gbG9jYWxpemVkIHRhYmxlIGFuZCBzZXQgYWxpYXNUYWJsZSB0byB1bmRlZmluZWRcbiAgICAgICAgICAgIC8vIHNvIGl0IGlzIG5vdCBwaWNrZWQgdXAgYmVsb3cgdG8gYmUgdXNlZCBhcyB0YXJnZXRUYWJsZVxuICAgICAgICAgICAgbmV3VGFibGVOYW1lID0gYCR7dGFibGVOYW1lfV9sb2NhbGVzYFxuXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRUYWJsZSA9IGFsaWFzVGFibGUgfHwgYWRhcHRlci50YWJsZXNbdGFibGVOYW1lXVxuXG4gICAgICAgICAgICBqb2luc1tuZXdUYWJsZU5hbWVdID0gZXEocGFyZW50VGFibGUuaWQsIGFkYXB0ZXIudGFibGVzW25ld1RhYmxlTmFtZV0uX3BhcmVudElEKVxuXG4gICAgICAgICAgICBhbGlhc1RhYmxlID0gdW5kZWZpbmVkXG5cbiAgICAgICAgICAgIGlmIChsb2NhbGUgIT09ICdhbGwnKSB7XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWU6ICdfbG9jYWxlJyxcbiAgICAgICAgICAgICAgICB0YWJsZTogYWRhcHRlci50YWJsZXNbbmV3VGFibGVOYW1lXSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbG9jYWxlLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRhcmdldFRhYmxlID0gYWxpYXNUYWJsZSB8fCBhZGFwdGVyLnRhYmxlc1tuZXdUYWJsZU5hbWVdXG5cbiAgICAgICAgICBzZWxlY3RGaWVsZHNbYCR7bmV3VGFibGVOYW1lfS4ke2NvbHVtblByZWZpeH0ke2ZpZWxkLm5hbWV9YF0gPVxuICAgICAgICAgICAgdGFyZ2V0VGFibGVbYCR7Y29sdW1uUHJlZml4fSR7ZmllbGQubmFtZX1gXVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbHVtbk5hbWU6IGAke2NvbHVtblByZWZpeH0ke2ZpZWxkLm5hbWV9YCxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLFxuICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICBwYXRoU2VnbWVudHM6IHBhdGhTZWdtZW50cyxcbiAgICAgICAgICAgIHRhYmxlOiB0YXJnZXRUYWJsZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgQVBJRXJyb3IoYENhbm5vdCBmaW5kIGZpZWxkIGZvciBwYXRoIGF0ICR7ZmllbGRQYXRofWApXG59XG4iXSwibmFtZXMiOlsiZ2V0VGFibGVDb2x1bW5Gcm9tUGF0aCIsImFkYXB0ZXIiLCJhbGlhc1RhYmxlIiwiY29sbGVjdGlvblBhdGgiLCJjb2x1bW5QcmVmaXgiLCJjb25zdHJhaW50cyIsImZpZWxkcyIsImpvaW5BbGlhc2VzIiwiam9pbnMiLCJsb2NhbGUiLCJpbmNvbWluZ0xvY2FsZSIsInBhdGhTZWdtZW50cyIsImluY29taW5nU2VnbWVudHMiLCJzZWxlY3RGaWVsZHMiLCJ0YWJsZU5hbWUiLCJmaWVsZFBhdGgiLCJmaWVsZCIsImZsYXR0ZW5Ub3BMZXZlbEZpZWxkcyIsImZpbmQiLCJmaWVsZFRvRmluZCIsImZpZWxkQWZmZWN0c0RhdGEiLCJuYW1lIiwibmV3VGFibGVOYW1lIiwiaWQiLCJ0YWJsZXMiLCJjb2x1bW5OYW1lIiwidHlwZSIsInRhYmxlIiwibG9jYWxpemVkIiwicGF5bG9hZCIsImNvbmZpZyIsImxvY2FsaXphdGlvbiIsIm1hdGNoZWRMb2NhbGUiLCJsb2NhbGVDb2RlcyIsInNwbGljZSIsInRhYnMiLCJtYXAiLCJ0YWIiLCJzbGljZSIsInRhYkhhc05hbWUiLCJlcSIsIl9wYXJlbnRJRCIsInB1c2giLCJ2YWx1ZSIsInRvU25ha2VDYXNlIiwiYW5kIiwiX2xvY2FsZSIsImJsb2NrVGFibGVDb2x1bW4iLCJoYXNCbG9ja0ZpZWxkIiwiYmxvY2tzIiwic29tZSIsImJsb2NrIiwic2x1ZyIsInJlc3VsdCIsImJsb2NrQ29uc3RyYWludHMiLCJibG9ja1NlbGVjdEZpZWxkcyIsImVycm9yIiwiY29uY2F0IiwicmF3Q29sdW1uIiwicmVsYXRpb25zaGlwRmllbGRzIiwicmVsYXRpb25UYWJsZU5hbWUiLCJuZXdDb2xsZWN0aW9uUGF0aCIsImpvaW4iLCJhbGlhc1JlbGF0aW9uc2hpcFRhYmxlTmFtZSIsInV1aWQiLCJhbGlhc1JlbGF0aW9uc2hpcFRhYmxlIiwiYWxpYXMiLCJjb25kaXRpb24iLCJwYXJlbnQiLCJwYXRoIiwibmV3QWxpYXNUYWJsZSIsInJlbGF0aW9uVG8iLCJjb2xsZWN0aW9ucyIsInRhYmxlQ29sdW1uc05hbWVzIiwic3FsIiwicmF3IiwiQXJyYXkiLCJpc0FycmF5IiwiZ2V0Tm90TnVsbENvbHVtbkJ5VmFsdWUiLCJ2YWwiLCJtYXRjaGVkUmVsYXRpb24iLCJyZWxhdGlvbiIsInVuZGVmaW5lZCIsIkFQSUVycm9yIiwicGFyZW50VGFibGUiLCJ0YXJnZXRUYWJsZSJdLCJtYXBwaW5ncyI6IkFBQUEsb0NBQW9DOzs7OytCQWtEdkJBOzs7ZUFBQUE7Ozs0QkE5Q2dCO3dCQUNQO3dCQUNHO3VCQUNvQjsyQkFDUDtvRUFDZDtzQkFDRzs7Ozs7O0FBd0NwQixNQUFNQSx5QkFBeUIsQ0FBQyxFQUNyQ0MsT0FBTyxFQUNQQyxVQUFVLEVBQ1ZDLGNBQWMsRUFDZEMsZUFBZSxFQUFFLEVBQ2pCQyxjQUFjLEVBQUUsRUFDaEJDLE1BQU0sRUFDTkMsV0FBVyxFQUNYQyxLQUFLLEVBQ0xDLFFBQVFDLGNBQWMsRUFDdEJDLGNBQWNDLGdCQUFnQixFQUM5QkMsWUFBWSxFQUNaQyxTQUFTLEVBQ0o7SUFDTCxNQUFNQyxZQUFZSCxnQkFBZ0Is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
|
@@ -0,0 +1,34 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
3
|
+
value: true
|
4
|
+
});
|
5
|
+
Object.defineProperty(exports, "operatorMap", {
|
6
|
+
enumerable: true,
|
7
|
+
get: function() {
|
8
|
+
return operatorMap;
|
9
|
+
}
|
10
|
+
});
|
11
|
+
const _drizzleorm = require("drizzle-orm");
|
12
|
+
const operatorMap = {
|
13
|
+
// intersects: intersects,
|
14
|
+
and: _drizzleorm.and,
|
15
|
+
contains: _drizzleorm.ilike,
|
16
|
+
equals: _drizzleorm.eq,
|
17
|
+
exists: _drizzleorm.isNotNull,
|
18
|
+
greater_than: _drizzleorm.gt,
|
19
|
+
greater_than_equal: _drizzleorm.gte,
|
20
|
+
in: _drizzleorm.inArray,
|
21
|
+
isNull: _drizzleorm.isNull,
|
22
|
+
less_than: _drizzleorm.lt,
|
23
|
+
less_than_equal: _drizzleorm.lte,
|
24
|
+
like: _drizzleorm.ilike,
|
25
|
+
not_equals: _drizzleorm.ne,
|
26
|
+
// TODO: geojson queries
|
27
|
+
// near: near,
|
28
|
+
// within: within,
|
29
|
+
// all: all,
|
30
|
+
not_in: _drizzleorm.notInArray,
|
31
|
+
or: _drizzleorm.or
|
32
|
+
};
|
33
|
+
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9xdWVyaWVzL29wZXJhdG9yTWFwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFuZCxcbiAgZXEsXG4gIGd0LFxuICBndGUsXG4gIGlsaWtlLFxuICBpbkFycmF5LFxuICBpc05vdE51bGwsXG4gIGlzTnVsbCxcbiAgbHQsXG4gIGx0ZSxcbiAgbmUsXG4gIG5vdEluQXJyYXksXG4gIG9yLFxufSBmcm9tICdkcml6emxlLW9ybSdcblxuZXhwb3J0IGNvbnN0IG9wZXJhdG9yTWFwID0ge1xuICAvLyBpbnRlcnNlY3RzOiBpbnRlcnNlY3RzLFxuICBhbmQsXG4gIGNvbnRhaW5zOiBpbGlrZSxcbiAgZXF1YWxzOiBlcSxcbiAgZXhpc3RzOiBpc05vdE51bGwsXG4gIGdyZWF0ZXJfdGhhbjogZ3QsXG4gIGdyZWF0ZXJfdGhhbl9lcXVhbDogZ3RlLFxuICBpbjogaW5BcnJheSxcbiAgaXNOdWxsLCAvLyBoYW5kbGVzIGV4aXN0czogZmFsc2VcbiAgbGVzc190aGFuOiBsdCxcbiAgbGVzc190aGFuX2VxdWFsOiBsdGUsXG4gIGxpa2U6IGlsaWtlLFxuICBub3RfZXF1YWxzOiBuZSxcbiAgLy8gVE9ETzogZ2VvanNvbiBxdWVyaWVzXG4gIC8vIG5lYXI6IG5lYXIsXG4gIC8vIHdpdGhpbjogd2l0aGluLFxuICAvLyBhbGw6IGFsbCxcbiAgbm90X2luOiBub3RJbkFycmF5LFxuICBvcixcbn1cbiJdLCJuYW1lcyI6WyJvcGVyYXRvck1hcCIsImFuZCIsImNvbnRhaW5zIiwiaWxpa2UiLCJlcXVhbHMiLCJlcSIsImV4aXN0cyIsImlzTm90TnVsbCIsImdyZWF0ZXJfdGhhbiIsImd0IiwiZ3JlYXRlcl90aGFuX2VxdWFsIiwiZ3RlIiwiaW4iLCJpbkFycmF5IiwiaXNOdWxsIiwibGVzc190aGFuIiwibHQiLCJsZXNzX3RoYW5fZXF1YWwiLCJsdGUiLCJsaWtlIiwibm90X2VxdWFscyIsIm5lIiwibm90X2luIiwibm90SW5BcnJheSIsIm9yIl0sIm1hcHBpbmdzIjoiOzs7OytCQWdCYUE7OztlQUFBQTs7OzRCQUZOO0FBRUEsTUFBTUEsY0FBYztJQUN6QiwwQkFBMEI7SUFDMUJDLEtBQUFBLGVBQUc7SUFDSEMsVUFBVUMsaUJBQUs7SUFDZkMsUUFBUUMsY0FBRTtJQUNWQyxRQUFRQyxxQkFBUztJQUNqQkMsY0FBY0MsY0FBRTtJQUNoQkMsb0JBQW9CQyxlQUFHO0lBQ3ZCQyxJQUFJQyxtQkFBTztJQUNYQyxRQUFBQSxrQkFBTTtJQUNOQyxXQUFXQyxjQUFFO0lBQ2JDLGlCQUFpQkMsZUFBRztJQUNwQkMsTUFBTWhCLGlCQUFLO0lBQ1hpQixZQUFZQyxjQUFFO0lBQ2Qsd0JBQXdCO0lBQ3hCLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsWUFBWTtJQUNaQyxRQUFRQyxzQkFBVTtJQUNsQkMsSUFBQUEsY0FBRTtBQUNKIn0=
|
@@ -0,0 +1,146 @@
|
|
1
|
+
/* eslint-disable no-await-in-loop */ "use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
3
|
+
value: true
|
4
|
+
});
|
5
|
+
Object.defineProperty(exports, "parseParams", {
|
6
|
+
enumerable: true,
|
7
|
+
get: function() {
|
8
|
+
return parseParams;
|
9
|
+
}
|
10
|
+
});
|
11
|
+
const _drizzleorm = require("drizzle-orm");
|
12
|
+
const _errors = require("payload/errors");
|
13
|
+
const _types = require("payload/types");
|
14
|
+
const _buildAndOrConditions = require("./buildAndOrConditions");
|
15
|
+
const _createJSONQuery = require("./createJSONQuery");
|
16
|
+
const _convertPathToJSONTraversal = require("./createJSONQuery/convertPathToJSONTraversal");
|
17
|
+
const _getTableColumnFromPath = require("./getTableColumnFromPath");
|
18
|
+
const _operatorMap = require("./operatorMap");
|
19
|
+
const _sanitizeQueryValue = require("./sanitizeQueryValue");
|
20
|
+
async function parseParams({ adapter, fields, joinAliases, joins, locale, selectFields, tableName, where }) {
|
21
|
+
let result;
|
22
|
+
const constraints = [];
|
23
|
+
if (typeof where === 'object' && Object.keys(where).length > 0) {
|
24
|
+
// We need to determine if the whereKey is an AND, OR, or a schema path
|
25
|
+
for (const relationOrPath of Object.keys(where)){
|
26
|
+
if (relationOrPath) {
|
27
|
+
const condition = where[relationOrPath];
|
28
|
+
let conditionOperator;
|
29
|
+
if (relationOrPath.toLowerCase() === 'and') {
|
30
|
+
conditionOperator = 'and';
|
31
|
+
} else if (relationOrPath.toLowerCase() === 'or') {
|
32
|
+
conditionOperator = 'or';
|
33
|
+
}
|
34
|
+
if (Array.isArray(condition)) {
|
35
|
+
const builtConditions = await (0, _buildAndOrConditions.buildAndOrConditions)({
|
36
|
+
adapter,
|
37
|
+
fields,
|
38
|
+
joinAliases,
|
39
|
+
joins,
|
40
|
+
locale,
|
41
|
+
selectFields,
|
42
|
+
tableName,
|
43
|
+
where: condition
|
44
|
+
});
|
45
|
+
if (builtConditions.length > 0) {
|
46
|
+
if (result) {
|
47
|
+
result = _operatorMap.operatorMap[conditionOperator](result, ...builtConditions);
|
48
|
+
} else {
|
49
|
+
result = _operatorMap.operatorMap[conditionOperator](...builtConditions);
|
50
|
+
}
|
51
|
+
}
|
52
|
+
} else {
|
53
|
+
// It's a path - and there can be multiple comparisons on a single path.
|
54
|
+
// For example - title like 'test' and title not equal to 'tester'
|
55
|
+
// So we need to loop on keys again here to handle each operator independently
|
56
|
+
const pathOperators = where[relationOrPath];
|
57
|
+
if (typeof pathOperators === 'object') {
|
58
|
+
for (const operator of Object.keys(pathOperators)){
|
59
|
+
if (_types.validOperators.includes(operator)) {
|
60
|
+
const { columnName, constraints: queryConstraints, field, getNotNullColumnByValue, pathSegments, rawColumn, table } = (0, _getTableColumnFromPath.getTableColumnFromPath)({
|
61
|
+
adapter,
|
62
|
+
collectionPath: relationOrPath,
|
63
|
+
fields,
|
64
|
+
joinAliases,
|
65
|
+
joins,
|
66
|
+
locale,
|
67
|
+
pathSegments: relationOrPath.replace(/__/g, '.').split('.'),
|
68
|
+
selectFields,
|
69
|
+
tableName
|
70
|
+
});
|
71
|
+
const val = where[relationOrPath][operator];
|
72
|
+
queryConstraints.forEach(({ columnName: col, table: constraintTable, value })=>{
|
73
|
+
constraints.push(_operatorMap.operatorMap.equals(constraintTable[col], value));
|
74
|
+
});
|
75
|
+
if ([
|
76
|
+
'json',
|
77
|
+
'richText'
|
78
|
+
].includes(field.type) && Array.isArray(pathSegments)) {
|
79
|
+
const segments = pathSegments.slice(1);
|
80
|
+
segments.unshift(table[columnName].name);
|
81
|
+
if (field.type === 'richText') {
|
82
|
+
const jsonQuery = (0, _createJSONQuery.createJSONQuery)({
|
83
|
+
operator,
|
84
|
+
pathSegments: segments,
|
85
|
+
treatAsArray: [
|
86
|
+
'children'
|
87
|
+
],
|
88
|
+
treatRootAsArray: true,
|
89
|
+
value: val
|
90
|
+
});
|
91
|
+
constraints.push(_drizzleorm.sql.raw(jsonQuery));
|
92
|
+
}
|
93
|
+
if (field.type === 'json') {
|
94
|
+
const jsonQuery = (0, _convertPathToJSONTraversal.convertPathToJSONTraversal)(pathSegments);
|
95
|
+
constraints.push(_drizzleorm.sql.raw(`${table[columnName].name}${jsonQuery} = '%${val}%'`));
|
96
|
+
}
|
97
|
+
break;
|
98
|
+
}
|
99
|
+
if (getNotNullColumnByValue) {
|
100
|
+
const columnName = getNotNullColumnByValue(val);
|
101
|
+
if (columnName) {
|
102
|
+
constraints.push((0, _drizzleorm.isNotNull)(table[columnName]));
|
103
|
+
} else {
|
104
|
+
throw new _errors.QueryError([
|
105
|
+
{
|
106
|
+
path: relationOrPath
|
107
|
+
}
|
108
|
+
]);
|
109
|
+
}
|
110
|
+
break;
|
111
|
+
}
|
112
|
+
if (operator === 'like') {
|
113
|
+
constraints.push((0, _drizzleorm.and)(...val.split(' ').map((word)=>(0, _drizzleorm.ilike)(table[columnName], `%${word}%`))));
|
114
|
+
break;
|
115
|
+
}
|
116
|
+
const { operator: queryOperator, value: queryValue } = (0, _sanitizeQueryValue.sanitizeQueryValue)({
|
117
|
+
field,
|
118
|
+
operator,
|
119
|
+
val
|
120
|
+
});
|
121
|
+
if (queryOperator === 'not_equals' && queryValue !== null) {
|
122
|
+
constraints.push((0, _drizzleorm.or)((0, _drizzleorm.isNull)(rawColumn || table[columnName]), /* eslint-disable @typescript-eslint/no-explicit-any */ (0, _drizzleorm.ne)(rawColumn || table[columnName], queryValue)));
|
123
|
+
} else {
|
124
|
+
constraints.push(_operatorMap.operatorMap[queryOperator](rawColumn || table[columnName], queryValue));
|
125
|
+
}
|
126
|
+
}
|
127
|
+
}
|
128
|
+
}
|
129
|
+
}
|
130
|
+
}
|
131
|
+
}
|
132
|
+
}
|
133
|
+
if (constraints.length > 0) {
|
134
|
+
if (result) {
|
135
|
+
result = (0, _drizzleorm.and)(result, ...constraints);
|
136
|
+
} else {
|
137
|
+
result = (0, _drizzleorm.and)(...constraints);
|
138
|
+
}
|
139
|
+
}
|
140
|
+
if (constraints.length === 1 && !result) {
|
141
|
+
[result] = constraints;
|
142
|
+
}
|
143
|
+
return result;
|
144
|
+
}
|
145
|
+
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9xdWVyaWVzL3BhcnNlUGFyYW1zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWF3YWl0LWluLWxvb3AgKi9cbmltcG9ydCB0eXBlIHsgU1FMIH0gZnJvbSAnZHJpenpsZS1vcm0nXG5pbXBvcnQgdHlwZSB7IEZpZWxkLCBPcGVyYXRvciwgV2hlcmUgfSBmcm9tICdwYXlsb2FkL3R5cGVzJ1xuXG5pbXBvcnQgeyBhbmQsIGlsaWtlLCBpc05vdE51bGwsIGlzTnVsbCwgbmUsIG9yLCBzcWwgfSBmcm9tICdkcml6emxlLW9ybSdcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tICdwYXlsb2FkL2Vycm9ycydcbmltcG9ydCB7IHZhbGlkT3BlcmF0b3JzIH0gZnJvbSAncGF5bG9hZC90eXBlcydcblxuaW1wb3J0IHR5cGUgeyBHZW5lcmljQ29sdW1uLCBQb3N0Z3Jlc0FkYXB0ZXIgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB0eXBlIHsgQnVpbGRRdWVyeUpvaW5BbGlhc2VzLCBCdWlsZFF1ZXJ5Sm9pbnMgfSBmcm9tICcuL2J1aWxkUXVlcnknXG5cbmltcG9ydCB7IGJ1aWxkQW5kT3JDb25kaXRpb25zIH0gZnJvbSAnLi9idWlsZEFuZE9yQ29uZGl0aW9ucydcbmltcG9ydCB7IGNyZWF0ZUpTT05RdWVyeSB9IGZyb20gJy4vY3JlYXRlSlNPTlF1ZXJ5J1xuaW1wb3J0IHsgY29udmVydFBhdGhUb0pTT05UcmF2ZXJzYWwgfSBmcm9tICcuL2NyZWF0ZUpTT05RdWVyeS9jb252ZXJ0UGF0aFRvSlNPTlRyYXZlcnNhbCdcbmltcG9ydCB7IGdldFRhYmxlQ29sdW1uRnJvbVBhdGggfSBmcm9tICcuL2dldFRhYmxlQ29sdW1uRnJvbVBhdGgnXG5pbXBvcnQgeyBvcGVyYXRvck1hcCB9IGZyb20gJy4vb3BlcmF0b3JNYXAnXG5pbXBvcnQgeyBzYW5pdGl6ZVF1ZXJ5VmFsdWUgfSBmcm9tICcuL3Nhbml0aXplUXVlcnlWYWx1ZSdcblxudHlwZSBBcmdzID0ge1xuICBhZGFwdGVyOiBQb3N0Z3Jlc0FkYXB0ZXJcbiAgZmllbGRzOiBGaWVsZFtdXG4gIGpvaW5BbGlhc2VzOiBCdWlsZFF1ZXJ5Sm9pbkFsaWFzZXNcbiAgam9pbnM6IEJ1aWxkUXVlcnlKb2luc1xuICBsb2NhbGU6IHN0cmluZ1xuICBzZWxlY3RGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEdlbmVyaWNDb2x1bW4+XG4gIHRhYmxlTmFtZTogc3RyaW5nXG4gIHdoZXJlOiBXaGVyZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VQYXJhbXMgKHtcbiAgYWRhcHRlcixcbiAgZmllbGRzLFxuICBqb2luQWxpYXNlcyxcbiAgam9pbnMsXG4gIGxvY2FsZSxcbiAgc2VsZWN0RmllbGRzLFxuICB0YWJsZU5hbWUsXG4gIHdoZXJlLFxufTogQXJncyk6IFByb21pc2U8U1FMPiB7XG4gIGxldCByZXN1bHQ6IFNRTFxuICBjb25zdCBjb25zdHJhaW50czogU1FMW10gPSBbXVxuXG4gIGlmICh0eXBlb2Ygd2hlcmUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHdoZXJlKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gV2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHdoZXJlS2V5IGlzIGFuIEFORCwgT1IsIG9yIGEgc2NoZW1hIHBhdGhcbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uT3JQYXRoIG9mIE9iamVjdC5rZXlzKHdoZXJlKSkge1xuICAgICAgaWYgKHJlbGF0aW9uT3JQYXRoKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHdoZXJlW3JlbGF0aW9uT3JQYXRoXVxuICAgICAgICBsZXQgY29uZGl0aW9uT3BlcmF0b3I6ICdhbmQnIHwgJ29yJ1xuICAgICAgICBpZiAocmVsYXRpb25PclBhdGgudG9Mb3dlckNhc2UoKSA9PT0gJ2FuZCcpIHtcbiAgICAgICAgICBjb25kaXRpb25PcGVyYXRvciA9ICdhbmQnXG4gICAgICAgIH0gZWxzZSBpZiAocmVsYXRpb25PclBhdGgudG9Mb3dlckNhc2UoKSA9PT0gJ29yJykge1xuICAgICAgICAgIGNvbmRpdGlvbk9wZXJhdG9yID0gJ29yJ1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmRpdGlvbikpIHtcbiAgICAgICAgICBjb25zdCBidWlsdENvbmRpdGlvbnMgPSBhd2FpdCBidWlsZEFuZE9yQ29uZGl0aW9ucyh7XG4gICAgICAgICAgICBhZGFwdGVyLFxuICAgICAgICAgICAgZmllbGRzLFxuICAgICAgICAgICAgam9pbkFsaWFzZXMsXG4gICAgICAgICAgICBqb2lucyxcbiAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgIHNlbGVjdEZpZWxkcyxcbiAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgIHdoZXJlOiBjb25kaXRpb24sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAoYnVpbHRDb25kaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gb3BlcmF0b3JNYXBbY29uZGl0aW9uT3BlcmF0b3JdKHJlc3VsdCwgLi4uYnVpbHRDb25kaXRpb25zKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gb3BlcmF0b3JNYXBbY29uZGl0aW9uT3BlcmF0b3JdKC4uLmJ1aWx0Q29uZGl0aW9ucylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSXQncyBhIHBhdGggLSBhbmQgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGNvbXBhcmlzb25zIG9uIGEgc2luZ2xlIHBhdGguXG4gICAgICAgICAgLy8gRm9yIGV4YW1wbGUgLSB0aXRsZSBsaWtlICd0ZXN0JyBhbmQgdGl0bGUgbm90IGVxdWFsIHRvICd0ZXN0ZXInXG4gICAgICAgICAgLy8gU28gd2UgbmVlZCB0byBsb29wIG9uIGtleXMgYWdhaW4gaGVyZSB0byBoYW5kbGUgZWFjaCBvcGVyYXRvciBpbmRlcGVuZGVudGx5XG4gICAgICAgICAgY29uc3QgcGF0aE9wZXJhdG9ycyA9IHdoZXJlW3JlbGF0aW9uT3JQYXRoXVxuICAgICAgICAgIGlmICh0eXBlb2YgcGF0aE9wZXJhdG9ycyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3BlcmF0b3Igb2YgT2JqZWN0LmtleXMocGF0aE9wZXJhdG9ycykpIHtcbiAgICAgICAgICAgICAgaWYgKHZhbGlkT3BlcmF0b3JzLmluY2x1ZGVzKG9wZXJhdG9yIGFzIE9wZXJhdG9yKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgICBjb25zdHJhaW50czogcXVlcnlDb25zdHJhaW50cyxcbiAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgZ2V0Tm90TnVsbENvbHVtbkJ5VmFsdWUsXG4gICAgICAgICAgICAgICAgICBwYXRoU2VnbWVudHMsXG4gICAgICAgICAgICAgICAgICByYXdDb2x1bW4sXG4gICAgICAgICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgICAgICB9ID0gZ2V0VGFibGVDb2x1bW5Gcm9tUGF0aCh7XG4gICAgICAgICAgICAgICAgICBhZGFwdGVyLFxuICAgICAgICAgICAgICAgICAgY29sbGVjdGlvblBhdGg6IHJlbGF0aW9uT3JQYXRoLFxuICAgICAgICAgICAgICAgICAgZmllbGRzLFxuICAgICAgICAgICAgICAgICAgam9pbkFsaWFzZXMsXG4gICAgICAgICAgICAgICAgICBqb2lucyxcbiAgICAgICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgICAgIHBhdGhTZWdtZW50czogcmVsYXRpb25PclBhdGgucmVwbGFjZSgvX18vZywgJy4nKS5zcGxpdCgnLicpLFxuICAgICAgICAgICAgICAgICAgc2VsZWN0RmllbGRzLFxuICAgICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB3aGVyZVtyZWxhdGlvbk9yUGF0aF1bb3BlcmF0b3JdXG5cbiAgICAgICAgICAgICAgICBxdWVyeUNvbnN0cmFpbnRzLmZvckVhY2goKHsgY29sdW1uTmFtZTogY29sLCB0YWJsZTogY29uc3RyYWludFRhYmxlLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdHJhaW50cy5wdXNoKG9wZXJhdG9yTWFwLmVxdWFscyhjb25zdHJhaW50VGFibGVbY29sXSwgdmFsdWUpKVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAoWydqc29uJywgJ3JpY2hUZXh0J10uaW5jbHVkZXMoZmllbGQudHlwZSkgJiYgQXJyYXkuaXNBcnJheShwYXRoU2VnbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50cyA9IHBhdGhTZWdtZW50cy5zbGljZSgxKVxuICAgICAgICAgICAgICAgICAgc2VnbWVudHMudW5zaGlmdCh0YWJsZVtjb2x1bW5OYW1lXS5uYW1lKVxuXG4gICAgICAgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3JpY2hUZXh0Jykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uUXVlcnkgPSBjcmVhdGVKU09OUXVlcnkoe1xuICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICAgIHBhdGhTZWdtZW50czogc2VnbWVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgdHJlYXRBc0FycmF5OiBbJ2NoaWxkcmVuJ10sXG4gICAgICAgICAgICAgICAgICAgICAgdHJlYXRSb290QXNBcnJheTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsLFxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzLnB1c2goc3FsLnJhdyhqc29uUXVlcnkpKVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2pzb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb25RdWVyeSA9IGNvbnZlcnRQYXRoVG9KU09OVHJhdmVyc2FsKHBhdGhTZWdtZW50cylcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHMucHVzaChzcWwucmF3KGAke3RhYmxlW2NvbHVtbk5hbWVdLm5hbWV9JHtqc29uUXVlcnl9ID0gJyUke3ZhbH0lJ2ApKVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChnZXROb3ROdWxsQ29sdW1uQnlWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGdldE5vdE51bGxDb2x1bW5CeVZhbHVlKHZhbClcbiAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzLnB1c2goaXNOb3ROdWxsKHRhYmxlW2NvbHVtbk5hbWVdKSlcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFt7IHBhdGg6IHJlbGF0aW9uT3JQYXRoIH1dKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3BlcmF0b3IgPT09ICdsaWtlJykge1xuICAgICAgICAgICAgICAgICAgY29uc3RyYWludHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYW5kKC4uLnZhbC5zcGxpdCgnICcpLm1hcCgod29yZCkgPT4gaWxpa2UodGFibGVbY29sdW1uTmFtZV0sIGAlJHt3b3JkfSVgKSkpLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB7IG9wZXJhdG9yOiBxdWVyeU9wZXJhdG9yLCB2YWx1ZTogcXVlcnlWYWx1ZSB9ID0gc2FuaXRpemVRdWVyeVZhbHVlKHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGlmIChxdWVyeU9wZXJhdG9yID09PSAnbm90X2VxdWFscycgJiYgcXVlcnlWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgY29uc3RyYWludHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgb3IoXG4gICAgICAgICAgICAgICAgICAgICAgaXNOdWxsKHJhd0NvbHVtbiB8fCB0YWJsZVtjb2x1bW5OYW1lXSksXG4gICAgICAgICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICAgICAgICAgICAgICAgICAgICAgIG5lPGFueT4ocmF3Q29sdW1uIHx8IHRhYmxlW2NvbHVtbk5hbWVdLCBxdWVyeVZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjb25zdHJhaW50cy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvck1hcFtxdWVyeU9wZXJhdG9yXShyYXdDb2x1bW4gfHwgdGFibGVbY29sdW1uTmFtZV0sIHF1ZXJ5VmFsdWUpLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoY29uc3RyYWludHMubGVuZ3RoID4gMCkge1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHJlc3VsdCA9IGFuZChyZXN1bHQsIC4uLmNvbnN0cmFpbnRzKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBhbmQoLi4uY29uc3RyYWludHMpXG4gICAgfVxuICB9XG4gIGlmIChjb25zdHJhaW50cy5sZW5ndGggPT09IDEgJiYgIXJlc3VsdCkge1xuICAgIDtbcmVzdWx0XSA9IGNvbnN0cmFpbnRzXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG4iXSwibmFtZXMiOlsicGFyc2VQYXJhbXMiLCJhZGFwdGVyIiwiZmllbGRzIiwiam9pbkFsaWFzZXMiLCJqb2lucyIsImxvY2FsZSIsInNlbGVjdEZpZWxkcyIsInRhYmxlTmFtZSIsIndoZXJlIiwicmVzdWx0IiwiY29uc3RyYWludHMiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwicmVsYXRpb25PclBhdGgiLCJjb25kaXRpb24iLCJjb25kaXRpb25PcGVyYXRvciIsInRvTG93ZXJDYXNlIiwiQXJyYXkiLCJpc0FycmF5IiwiYnVpbHRDb25kaXRpb25zIiwiYnVpbGRBbmRPckNvbmRpdGlvbnMiLCJvcGVyYXRvck1hcCIsInBhdGhPcGVyYXRvcnMiLCJvcGVyYXRvciIsInZhbGlkT3BlcmF0b3JzIiwiaW5jbHVkZXMiLCJjb2x1bW5OYW1lIiwicXVlcnlDb25zdHJhaW50cyIsImZpZWxkIiwiZ2V0Tm90TnVsbENvbHVtbkJ5VmFsdWUiLCJwYXRoU2VnbWVudHMiLCJyYXdDb2x1bW4iLCJ0YWJsZSIsImdldFRhYmxlQ29sdW1uRnJvbVBhdGgiLCJjb2xsZWN0aW9uUGF0aCIsInJlcGxhY2UiLCJzcGxpdCIsInZhbCIsImZvckVhY2giLCJjb2wiLCJjb25zdHJhaW50VGFibGUiLCJ2YWx1ZSIsInB1c2giLCJlcXVhbHMiLCJ0eXBlIiwic2VnbWVudHMiLCJzbGljZSIsInVuc2hpZnQiLCJuYW1lIiwianNvblF1ZXJ5IiwiY3JlYXRlSlNPTlF1ZXJ5IiwidHJlYXRBc0FycmF5IiwidHJlYXRSb290QXNBcnJheSIsInNxbCIsInJhdyIsImNvbnZlcnRQYXRoVG9KU09OVHJhdmVyc2FsIiwiaXNOb3ROdWxsIiwiUXVlcnlFcnJvciIsInBhdGgiLCJhbmQiLCJtYXAiLCJ3b3JkIiwiaWxpa2UiLCJxdWVyeU9wZXJhdG9yIiwicXVlcnlWYWx1ZSIsInNhbml0aXplUXVlcnlWYWx1ZSIsIm9yIiwiaXNOdWxsIiwibmUiXSwibWFwcGluZ3MiOiJBQUFBLG1DQUFtQzs7OzsrQkE2QmJBOzs7ZUFBQUE7Ozs0QkF6QnFDO3dCQUNoQzt1QkFDSTtzQ0FLTTtpQ0FDTDs0Q0FDVzt3Q0FDSjs2QkFDWDtvQ0FDTztBQWE1QixlQUFlQSxZQUFhLEVBQ2pDQyxPQUFPLEVBQ1BDLE1BQU0sRUFDTkMsV0FBVyxFQUNYQyxLQUFLLEVBQ0xDLE1BQU0sRUFDTkMsWUFBWSxFQUNaQyxTQUFTLEVBQ1RDLEtBQUssRUFDQTtJQUNMLElBQUlDO0lBQ0osTUFBTUMsY0FBcUIsRUFBRTtJQUU3QixJQUFJLE9BQU9GLFVBQVUsWUFBWUcsT0FBT0MsSUFBSSxDQUFDSixPQUFPSyxNQUFNLEdBQUcsR0FBRztRQUM5RCx1RUFBdUU7UUFDdkUsS0FBSyxNQUFNQyxrQkFBa0JILE9BQU9DLElBQUksQ0FBQ0osT0FBUTtZQUMvQyxJQUFJTSxnQkFBZ0I7Z0JBQ2xCLE1BQU1DLFlBQVlQLEtBQUssQ0FBQ00sZUFBZTtnQkFDdkMsSUFBSUU7Z0JBQ0osSUFBSUYsZUFBZUcsV0FBVyxPQUFPLE9BQU87b0JBQzFDRCxvQkFBb0I7Z0JBQ3RCLE9BQU8sSUFBSUYsZUFBZUcsV0FBVyxPQUFPLE1BQU07b0JBQ2hERCxvQkFBb0I7Z0JBQ3RCO2dCQUNBLElBQUlFLE1BQU1DLE9BQU8sQ0FBQ0osWUFBWTtvQkFDNUIsTUFBTUssa0JBQWtCLE1BQU1DLElBQUFBLDBD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
|