@uql/core 0.4.80 → 0.4.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +11 -11
  2. package/dialect/abstractSqlDialect-spec.d.ts +49 -0
  3. package/dialect/abstractSqlDialect-spec.js +765 -0
  4. package/dialect/abstractSqlDialect.js +11 -17
  5. package/dialect/mysqlDialect.js +2 -2
  6. package/dialect/mysqlDialect.spec.d.ts +6 -0
  7. package/dialect/mysqlDialect.spec.js +33 -0
  8. package/dialect/postgresDialect.js +2 -2
  9. package/dialect/postgresDialect.spec.d.ts +1 -0
  10. package/dialect/postgresDialect.spec.js +139 -0
  11. package/dialect/sqliteDialect.spec.d.ts +1 -0
  12. package/dialect/sqliteDialect.spec.js +12 -0
  13. package/entity/decorator/definition.js +22 -24
  14. package/entity/decorator/definition.spec.d.ts +1 -0
  15. package/entity/decorator/definition.spec.js +725 -0
  16. package/entity/decorator/relation.spec.d.ts +1 -0
  17. package/entity/decorator/relation.spec.js +55 -0
  18. package/options.js +2 -2
  19. package/options.spec.d.ts +1 -0
  20. package/options.spec.js +50 -0
  21. package/package.json +3 -3
  22. package/querier/abstractQuerier-it.d.ts +41 -0
  23. package/querier/abstractQuerier-it.js +410 -0
  24. package/querier/abstractSqlQuerier-it.d.ts +9 -0
  25. package/querier/abstractSqlQuerier-it.js +19 -0
  26. package/querier/abstractSqlQuerier-spec.d.ts +53 -0
  27. package/querier/abstractSqlQuerier-spec.js +607 -0
  28. package/querier/abstractSqlQuerier.js +2 -3
  29. package/querier/decorator/injectQuerier.js +2 -3
  30. package/querier/decorator/injectQuerier.spec.d.ts +1 -0
  31. package/querier/decorator/injectQuerier.spec.js +108 -0
  32. package/querier/decorator/transactional.js +2 -2
  33. package/querier/decorator/transactional.spec.d.ts +1 -0
  34. package/querier/decorator/transactional.spec.js +241 -0
  35. package/repository/genericRepository.spec.d.ts +1 -0
  36. package/repository/genericRepository.spec.js +86 -0
  37. package/test/entityMock.d.ts +180 -0
  38. package/test/entityMock.js +451 -0
  39. package/test/index.d.ts +3 -0
  40. package/test/index.js +7 -0
  41. package/test/it.util.d.ts +4 -0
  42. package/test/it.util.js +60 -0
  43. package/test/spec.util.d.ts +13 -0
  44. package/test/spec.util.js +54 -0
  45. package/type/entity.d.ts +12 -17
  46. package/type/entity.js +1 -1
  47. package/type/utility.d.ts +3 -2
  48. package/type/utility.js +1 -1
  49. package/util/dialect.util.js +2 -3
  50. package/util/dialect.util.spec.d.ts +1 -0
  51. package/util/dialect.util.spec.js +23 -0
  52. package/util/object.util.spec.d.ts +1 -0
  53. package/util/object.util.spec.js +26 -0
  54. package/util/sql.util.spec.d.ts +1 -0
  55. package/util/sql.util.spec.js +164 -0
  56. package/util/string.util.spec.d.ts +1 -0
  57. package/util/string.util.spec.js +26 -0
@@ -0,0 +1,451 @@
1
+ "use strict";
2
+ var User_1, LedgerAccount_1;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ItemAdjustment = exports.InventoryAdjustment = exports.ItemTag = exports.Tag = exports.Item = exports.Storehouse = exports.MeasureUnit = exports.MeasureUnitCategory = exports.Tax = exports.Test = exports.TaxCategory = exports.LedgerAccount = exports.User = exports.Profile = exports.Company = exports.BaseEntity = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const uuid_1 = require("uuid");
7
+ const entity_1 = require("@uql/core/entity");
8
+ const util_1 = require("@uql/core/util");
9
+ const type_1 = require("@uql/core/type");
10
+ /**
11
+ * an abstract class can (optionally) be used as a "template" for the entities
12
+ * (so the common attributes' declaration is reused).
13
+ */
14
+ class BaseEntity {
15
+ }
16
+ tslib_1.__decorate([
17
+ (0, entity_1.Id)(),
18
+ tslib_1.__metadata("design:type", Number)
19
+ ], BaseEntity.prototype, "id", void 0);
20
+ tslib_1.__decorate([
21
+ (0, entity_1.Field)({ reference: () => Company }),
22
+ tslib_1.__metadata("design:type", Number)
23
+ ], BaseEntity.prototype, "companyId", void 0);
24
+ tslib_1.__decorate([
25
+ (0, entity_1.ManyToOne)({ entity: () => Company }),
26
+ tslib_1.__metadata("design:type", Object)
27
+ ], BaseEntity.prototype, "company", void 0);
28
+ tslib_1.__decorate([
29
+ (0, entity_1.Field)({ reference: () => User }),
30
+ tslib_1.__metadata("design:type", Number)
31
+ ], BaseEntity.prototype, "creatorId", void 0);
32
+ tslib_1.__decorate([
33
+ (0, entity_1.ManyToOne)({ entity: () => User }),
34
+ tslib_1.__metadata("design:type", Object)
35
+ ], BaseEntity.prototype, "creator", void 0);
36
+ tslib_1.__decorate([
37
+ (0, entity_1.Field)({ onInsert: () => Date.now() }),
38
+ tslib_1.__metadata("design:type", Number)
39
+ ], BaseEntity.prototype, "createdAt", void 0);
40
+ tslib_1.__decorate([
41
+ (0, entity_1.Field)({ onUpdate: () => Date.now() }),
42
+ tslib_1.__metadata("design:type", Number)
43
+ ], BaseEntity.prototype, "updatedAt", void 0);
44
+ exports.BaseEntity = BaseEntity;
45
+ /**
46
+ * `Company` will inherit all the fields (including the `Id`) declared in `BaseEntity`.
47
+ */
48
+ let Company = class Company extends BaseEntity {
49
+ };
50
+ tslib_1.__decorate([
51
+ (0, entity_1.Field)(),
52
+ tslib_1.__metadata("design:type", String)
53
+ ], Company.prototype, "name", void 0);
54
+ tslib_1.__decorate([
55
+ (0, entity_1.Field)(),
56
+ tslib_1.__metadata("design:type", String)
57
+ ], Company.prototype, "description", void 0);
58
+ Company = tslib_1.__decorate([
59
+ (0, entity_1.Entity)()
60
+ ], Company);
61
+ exports.Company = Company;
62
+ /**
63
+ * and entity can specify the table name
64
+ */
65
+ let Profile = class Profile extends BaseEntity {
66
+ };
67
+ tslib_1.__decorate([
68
+ (0, entity_1.Id)({ name: 'pk' }),
69
+ tslib_1.__metadata("design:type", Number)
70
+ ], Profile.prototype, "id", void 0);
71
+ tslib_1.__decorate([
72
+ (0, entity_1.Field)({ name: 'image' }),
73
+ tslib_1.__metadata("design:type", String)
74
+ ], Profile.prototype, "picture", void 0);
75
+ tslib_1.__decorate([
76
+ (0, entity_1.OneToOne)({ entity: () => User }),
77
+ tslib_1.__metadata("design:type", Object)
78
+ ], Profile.prototype, "creator", void 0);
79
+ Profile = tslib_1.__decorate([
80
+ (0, entity_1.Entity)({ name: 'user_profile' })
81
+ ], Profile);
82
+ exports.Profile = Profile;
83
+ let User = User_1 = class User extends BaseEntity {
84
+ };
85
+ tslib_1.__decorate([
86
+ (0, entity_1.Field)(),
87
+ tslib_1.__metadata("design:type", String)
88
+ ], User.prototype, "name", void 0);
89
+ tslib_1.__decorate([
90
+ (0, entity_1.Field)(),
91
+ tslib_1.__metadata("design:type", String)
92
+ ], User.prototype, "email", void 0);
93
+ tslib_1.__decorate([
94
+ (0, entity_1.Field)(),
95
+ tslib_1.__metadata("design:type", String)
96
+ ], User.prototype, "password", void 0);
97
+ tslib_1.__decorate([
98
+ (0, entity_1.OneToOne)({ entity: () => Profile, mappedBy: (profile) => profile.creator, cascade: true }),
99
+ tslib_1.__metadata("design:type", Profile)
100
+ ], User.prototype, "profile", void 0);
101
+ tslib_1.__decorate([
102
+ (0, entity_1.OneToMany)({ entity: () => User_1, mappedBy: 'creator' }),
103
+ tslib_1.__metadata("design:type", Array)
104
+ ], User.prototype, "users", void 0);
105
+ User = User_1 = tslib_1.__decorate([
106
+ (0, entity_1.Entity)()
107
+ ], User);
108
+ exports.User = User;
109
+ let LedgerAccount = LedgerAccount_1 = class LedgerAccount extends BaseEntity {
110
+ };
111
+ tslib_1.__decorate([
112
+ (0, entity_1.Field)(),
113
+ tslib_1.__metadata("design:type", String)
114
+ ], LedgerAccount.prototype, "name", void 0);
115
+ tslib_1.__decorate([
116
+ (0, entity_1.Field)(),
117
+ tslib_1.__metadata("design:type", String)
118
+ ], LedgerAccount.prototype, "description", void 0);
119
+ tslib_1.__decorate([
120
+ (0, entity_1.Field)({ reference: () => LedgerAccount_1 }),
121
+ tslib_1.__metadata("design:type", Number)
122
+ ], LedgerAccount.prototype, "parentLedgerId", void 0);
123
+ tslib_1.__decorate([
124
+ (0, entity_1.ManyToOne)(),
125
+ tslib_1.__metadata("design:type", LedgerAccount)
126
+ ], LedgerAccount.prototype, "parentLedger", void 0);
127
+ LedgerAccount = LedgerAccount_1 = tslib_1.__decorate([
128
+ (0, entity_1.Entity)()
129
+ ], LedgerAccount);
130
+ exports.LedgerAccount = LedgerAccount;
131
+ let TaxCategory = class TaxCategory extends BaseEntity {
132
+ };
133
+ tslib_1.__decorate([
134
+ (0, entity_1.Id)({ onInsert: uuid_1.v4 }),
135
+ tslib_1.__metadata("design:type", String)
136
+ ], TaxCategory.prototype, "pk", void 0);
137
+ tslib_1.__decorate([
138
+ (0, entity_1.Field)(),
139
+ tslib_1.__metadata("design:type", String)
140
+ ], TaxCategory.prototype, "name", void 0);
141
+ tslib_1.__decorate([
142
+ (0, entity_1.Field)(),
143
+ tslib_1.__metadata("design:type", String)
144
+ ], TaxCategory.prototype, "description", void 0);
145
+ TaxCategory = tslib_1.__decorate([
146
+ (0, entity_1.Entity)()
147
+ ], TaxCategory);
148
+ exports.TaxCategory = TaxCategory;
149
+ class Test {
150
+ }
151
+ tslib_1.__decorate([
152
+ (0, entity_1.Field)(),
153
+ tslib_1.__metadata("design:type", String)
154
+ ], Test.prototype, "name", void 0);
155
+ tslib_1.__decorate([
156
+ (0, entity_1.Field)(),
157
+ tslib_1.__metadata("design:type", Number)
158
+ ], Test.prototype, "percentage", void 0);
159
+ tslib_1.__decorate([
160
+ (0, entity_1.Field)({ reference: () => TaxCategory }),
161
+ tslib_1.__metadata("design:type", String)
162
+ ], Test.prototype, "categoryId", void 0);
163
+ tslib_1.__decorate([
164
+ (0, entity_1.ManyToOne)(),
165
+ tslib_1.__metadata("design:type", TaxCategory)
166
+ ], Test.prototype, "category", void 0);
167
+ tslib_1.__decorate([
168
+ (0, entity_1.Field)(),
169
+ tslib_1.__metadata("design:type", String)
170
+ ], Test.prototype, "description", void 0);
171
+ exports.Test = Test;
172
+ let Tax = class Tax extends BaseEntity {
173
+ };
174
+ tslib_1.__decorate([
175
+ (0, entity_1.Field)(),
176
+ tslib_1.__metadata("design:type", String)
177
+ ], Tax.prototype, "name", void 0);
178
+ tslib_1.__decorate([
179
+ (0, entity_1.Field)(),
180
+ tslib_1.__metadata("design:type", Number)
181
+ ], Tax.prototype, "percentage", void 0);
182
+ tslib_1.__decorate([
183
+ (0, entity_1.Field)({ reference: () => TaxCategory }),
184
+ tslib_1.__metadata("design:type", String)
185
+ ], Tax.prototype, "categoryId", void 0);
186
+ tslib_1.__decorate([
187
+ (0, entity_1.ManyToOne)(),
188
+ tslib_1.__metadata("design:type", TaxCategory)
189
+ ], Tax.prototype, "category", void 0);
190
+ tslib_1.__decorate([
191
+ (0, entity_1.Field)(),
192
+ tslib_1.__metadata("design:type", String)
193
+ ], Tax.prototype, "description", void 0);
194
+ Tax = tslib_1.__decorate([
195
+ (0, entity_1.Entity)()
196
+ ], Tax);
197
+ exports.Tax = Tax;
198
+ /**
199
+ * `softDelete` will make the entity "soft deletable".
200
+ */
201
+ let MeasureUnitCategory = class MeasureUnitCategory extends BaseEntity {
202
+ };
203
+ tslib_1.__decorate([
204
+ (0, entity_1.Field)(),
205
+ tslib_1.__metadata("design:type", String)
206
+ ], MeasureUnitCategory.prototype, "name", void 0);
207
+ tslib_1.__decorate([
208
+ (0, entity_1.OneToMany)({ entity: () => MeasureUnit, mappedBy: (measureUnit) => measureUnit.categoryId }),
209
+ tslib_1.__metadata("design:type", Array)
210
+ ], MeasureUnitCategory.prototype, "measureUnits", void 0);
211
+ tslib_1.__decorate([
212
+ (0, entity_1.Field)({ onDelete: () => Date.now() }),
213
+ tslib_1.__metadata("design:type", Number)
214
+ ], MeasureUnitCategory.prototype, "deletedAt", void 0);
215
+ MeasureUnitCategory = tslib_1.__decorate([
216
+ (0, entity_1.Entity)({ softDelete: true })
217
+ ], MeasureUnitCategory);
218
+ exports.MeasureUnitCategory = MeasureUnitCategory;
219
+ let MeasureUnit = class MeasureUnit extends BaseEntity {
220
+ };
221
+ tslib_1.__decorate([
222
+ (0, entity_1.Field)(),
223
+ tslib_1.__metadata("design:type", String)
224
+ ], MeasureUnit.prototype, "name", void 0);
225
+ tslib_1.__decorate([
226
+ (0, entity_1.Field)({ reference: () => MeasureUnitCategory }),
227
+ tslib_1.__metadata("design:type", Number)
228
+ ], MeasureUnit.prototype, "categoryId", void 0);
229
+ tslib_1.__decorate([
230
+ (0, entity_1.ManyToOne)({ cascade: 'persist' }),
231
+ tslib_1.__metadata("design:type", MeasureUnitCategory)
232
+ ], MeasureUnit.prototype, "category", void 0);
233
+ tslib_1.__decorate([
234
+ (0, entity_1.Field)({ onDelete: () => Date.now() }),
235
+ tslib_1.__metadata("design:type", Number)
236
+ ], MeasureUnit.prototype, "deletedAt", void 0);
237
+ MeasureUnit = tslib_1.__decorate([
238
+ (0, entity_1.Entity)({ softDelete: true })
239
+ ], MeasureUnit);
240
+ exports.MeasureUnit = MeasureUnit;
241
+ let Storehouse = class Storehouse extends BaseEntity {
242
+ };
243
+ tslib_1.__decorate([
244
+ (0, entity_1.Field)(),
245
+ tslib_1.__metadata("design:type", String)
246
+ ], Storehouse.prototype, "name", void 0);
247
+ tslib_1.__decorate([
248
+ (0, entity_1.Field)(),
249
+ tslib_1.__metadata("design:type", String)
250
+ ], Storehouse.prototype, "address", void 0);
251
+ tslib_1.__decorate([
252
+ (0, entity_1.Field)(),
253
+ tslib_1.__metadata("design:type", String)
254
+ ], Storehouse.prototype, "description", void 0);
255
+ Storehouse = tslib_1.__decorate([
256
+ (0, entity_1.Entity)()
257
+ ], Storehouse);
258
+ exports.Storehouse = Storehouse;
259
+ let Item = class Item extends BaseEntity {
260
+ };
261
+ tslib_1.__decorate([
262
+ (0, entity_1.Field)(),
263
+ tslib_1.__metadata("design:type", String)
264
+ ], Item.prototype, "name", void 0);
265
+ tslib_1.__decorate([
266
+ (0, entity_1.Field)(),
267
+ tslib_1.__metadata("design:type", String)
268
+ ], Item.prototype, "description", void 0);
269
+ tslib_1.__decorate([
270
+ (0, entity_1.Field)(),
271
+ tslib_1.__metadata("design:type", String)
272
+ ], Item.prototype, "code", void 0);
273
+ tslib_1.__decorate([
274
+ (0, entity_1.Field)({ reference: () => LedgerAccount }),
275
+ tslib_1.__metadata("design:type", Number)
276
+ ], Item.prototype, "buyLedgerAccountId", void 0);
277
+ tslib_1.__decorate([
278
+ (0, entity_1.ManyToOne)(),
279
+ tslib_1.__metadata("design:type", LedgerAccount)
280
+ ], Item.prototype, "buyLedgerAccount", void 0);
281
+ tslib_1.__decorate([
282
+ (0, entity_1.Field)({ reference: () => LedgerAccount }),
283
+ tslib_1.__metadata("design:type", Number)
284
+ ], Item.prototype, "saleLedgerAccountId", void 0);
285
+ tslib_1.__decorate([
286
+ (0, entity_1.ManyToOne)(),
287
+ tslib_1.__metadata("design:type", LedgerAccount)
288
+ ], Item.prototype, "saleLedgerAccount", void 0);
289
+ tslib_1.__decorate([
290
+ (0, entity_1.Field)({ reference: () => Tax }),
291
+ tslib_1.__metadata("design:type", Number)
292
+ ], Item.prototype, "taxId", void 0);
293
+ tslib_1.__decorate([
294
+ (0, entity_1.ManyToOne)(),
295
+ tslib_1.__metadata("design:type", Tax)
296
+ ], Item.prototype, "tax", void 0);
297
+ tslib_1.__decorate([
298
+ (0, entity_1.Field)({ reference: () => MeasureUnit }),
299
+ tslib_1.__metadata("design:type", Number)
300
+ ], Item.prototype, "measureUnitId", void 0);
301
+ tslib_1.__decorate([
302
+ (0, entity_1.ManyToOne)(),
303
+ tslib_1.__metadata("design:type", MeasureUnit)
304
+ ], Item.prototype, "measureUnit", void 0);
305
+ tslib_1.__decorate([
306
+ (0, entity_1.Field)(),
307
+ tslib_1.__metadata("design:type", Number)
308
+ ], Item.prototype, "salePrice", void 0);
309
+ tslib_1.__decorate([
310
+ (0, entity_1.Field)(),
311
+ tslib_1.__metadata("design:type", Boolean)
312
+ ], Item.prototype, "inventoryable", void 0);
313
+ tslib_1.__decorate([
314
+ (0, entity_1.ManyToMany)({ entity: () => Tag, through: () => ItemTag, cascade: true }),
315
+ tslib_1.__metadata("design:type", Array)
316
+ ], Item.prototype, "tags", void 0);
317
+ tslib_1.__decorate([
318
+ (0, entity_1.Field)({
319
+ /**
320
+ * `virtual` property allows defining the value for a non-persistent field,
321
+ * such value might be a scalar or a (`raw`) function. Virtual-fields can be
322
+ * used in `$project`, `$filter` and `$having` as a common field whose value
323
+ * is replaced at runtime.
324
+ */
325
+ virtual: (0, util_1.raw)(({ escapedPrefix, dialect }) => {
326
+ const query = dialect.count(ItemTag, {
327
+ $filter: {
328
+ itemId: (0, util_1.raw)(`${escapedPrefix}${dialect.escapeId('id')}`),
329
+ },
330
+ }, { autoPrefix: true });
331
+ return `(${query})`;
332
+ }),
333
+ }),
334
+ tslib_1.__metadata("design:type", Number)
335
+ ], Item.prototype, "tagsCount", void 0);
336
+ Item = tslib_1.__decorate([
337
+ (0, entity_1.Entity)()
338
+ ], Item);
339
+ exports.Item = Item;
340
+ let Tag = class Tag extends BaseEntity {
341
+ };
342
+ tslib_1.__decorate([
343
+ (0, entity_1.Field)(),
344
+ tslib_1.__metadata("design:type", String)
345
+ ], Tag.prototype, "name", void 0);
346
+ tslib_1.__decorate([
347
+ (0, entity_1.ManyToMany)({ entity: () => Item, mappedBy: (item) => item.tags }),
348
+ tslib_1.__metadata("design:type", Array)
349
+ ], Tag.prototype, "items", void 0);
350
+ tslib_1.__decorate([
351
+ (0, entity_1.Field)({
352
+ virtual: (0, util_1.raw)(({ escapedPrefix, dialect }) => {
353
+ /**
354
+ * `virtual` property allows defining the value for a non-persistent field,
355
+ * such value might be a scalar or a (`raw`) function. Virtual-fields can be
356
+ * used in `$project`, `$filter` and `$having` as a common field whose value
357
+ * is replaced at runtime.
358
+ */
359
+ const query = dialect.count(ItemTag, {
360
+ $filter: {
361
+ tagId: (0, util_1.raw)(`${escapedPrefix}${dialect.escapeId('id')}`),
362
+ },
363
+ }, { autoPrefix: true });
364
+ return `(${query})`;
365
+ }),
366
+ }),
367
+ tslib_1.__metadata("design:type", Number)
368
+ ], Tag.prototype, "itemsCount", void 0);
369
+ Tag = tslib_1.__decorate([
370
+ (0, entity_1.Entity)()
371
+ ], Tag);
372
+ exports.Tag = Tag;
373
+ let ItemTag = class ItemTag {
374
+ };
375
+ tslib_1.__decorate([
376
+ (0, entity_1.Id)(),
377
+ tslib_1.__metadata("design:type", Number)
378
+ ], ItemTag.prototype, "id", void 0);
379
+ tslib_1.__decorate([
380
+ (0, entity_1.Field)({ reference: () => Item }),
381
+ tslib_1.__metadata("design:type", Number)
382
+ ], ItemTag.prototype, "itemId", void 0);
383
+ tslib_1.__decorate([
384
+ (0, entity_1.Field)({ reference: () => Tag }),
385
+ tslib_1.__metadata("design:type", Number)
386
+ ], ItemTag.prototype, "tagId", void 0);
387
+ ItemTag = tslib_1.__decorate([
388
+ (0, entity_1.Entity)()
389
+ ], ItemTag);
390
+ exports.ItemTag = ItemTag;
391
+ let InventoryAdjustment = class InventoryAdjustment extends BaseEntity {
392
+ };
393
+ tslib_1.__decorate([
394
+ (0, entity_1.OneToMany)({
395
+ entity: () => ItemAdjustment,
396
+ mappedBy: (rel) => rel.inventoryAdjustment,
397
+ cascade: true,
398
+ }),
399
+ tslib_1.__metadata("design:type", Array)
400
+ ], InventoryAdjustment.prototype, "itemAdjustments", void 0);
401
+ tslib_1.__decorate([
402
+ (0, entity_1.Field)(),
403
+ tslib_1.__metadata("design:type", Date)
404
+ ], InventoryAdjustment.prototype, "date", void 0);
405
+ tslib_1.__decorate([
406
+ (0, entity_1.Field)(),
407
+ tslib_1.__metadata("design:type", String)
408
+ ], InventoryAdjustment.prototype, "description", void 0);
409
+ InventoryAdjustment = tslib_1.__decorate([
410
+ (0, entity_1.Entity)()
411
+ ], InventoryAdjustment);
412
+ exports.InventoryAdjustment = InventoryAdjustment;
413
+ let ItemAdjustment = class ItemAdjustment extends BaseEntity {
414
+ };
415
+ tslib_1.__decorate([
416
+ (0, entity_1.Field)({ reference: () => Item }),
417
+ tslib_1.__metadata("design:type", Number)
418
+ ], ItemAdjustment.prototype, "itemId", void 0);
419
+ tslib_1.__decorate([
420
+ (0, entity_1.ManyToOne)(),
421
+ tslib_1.__metadata("design:type", Item)
422
+ ], ItemAdjustment.prototype, "item", void 0);
423
+ tslib_1.__decorate([
424
+ (0, entity_1.Field)(),
425
+ tslib_1.__metadata("design:type", Number)
426
+ ], ItemAdjustment.prototype, "number", void 0);
427
+ tslib_1.__decorate([
428
+ (0, entity_1.Field)(),
429
+ tslib_1.__metadata("design:type", Number)
430
+ ], ItemAdjustment.prototype, "buyPrice", void 0);
431
+ tslib_1.__decorate([
432
+ (0, entity_1.Field)({ reference: () => Storehouse }),
433
+ tslib_1.__metadata("design:type", Number)
434
+ ], ItemAdjustment.prototype, "storehouseId", void 0);
435
+ tslib_1.__decorate([
436
+ (0, entity_1.ManyToOne)(),
437
+ tslib_1.__metadata("design:type", Storehouse)
438
+ ], ItemAdjustment.prototype, "storehouse", void 0);
439
+ tslib_1.__decorate([
440
+ (0, entity_1.Field)({ reference: () => InventoryAdjustment }),
441
+ tslib_1.__metadata("design:type", Number)
442
+ ], ItemAdjustment.prototype, "inventoryAdjustmentId", void 0);
443
+ tslib_1.__decorate([
444
+ (0, entity_1.ManyToOne)(),
445
+ tslib_1.__metadata("design:type", InventoryAdjustment)
446
+ ], ItemAdjustment.prototype, "inventoryAdjustment", void 0);
447
+ ItemAdjustment = tslib_1.__decorate([
448
+ (0, entity_1.Entity)()
449
+ ], ItemAdjustment);
450
+ exports.ItemAdjustment = ItemAdjustment;
451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5TW9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2VudGl0eU1vY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrQkFBb0M7QUFDcEMsNkNBQWlHO0FBQ2pHLHlDQUFxQztBQUNyQyx5Q0FBdUM7QUEyQnZDOzs7R0FHRztBQUNILE1BQXNCLFVBQVU7Q0EwQi9CO0FBeEJDO0lBREMsSUFBQSxXQUFFLEdBQUU7O3NDQUNPO0FBS1o7SUFEQyxJQUFBLGNBQUssRUFBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7NkNBQ2pCO0FBRW5CO0lBREMsSUFBQSxrQkFBUyxFQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDOzsyQ0FDbEI7QUFFbkI7SUFEQyxJQUFBLGNBQUssRUFBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7NkNBQ2Q7QUFFbkI7SUFEQyxJQUFBLGtCQUFTLEVBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7OzJDQUNsQjtBQU1oQjtJQURDLElBQUEsY0FBSyxFQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDOzs2Q0FDbkI7QUFNbkI7SUFEQyxJQUFBLGNBQUssRUFBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7NkNBQ25CO0FBekJyQixnQ0EwQkM7QUFFRDs7R0FFRztBQUVILElBQWEsT0FBTyxHQUFwQixNQUFhLE9BQVEsU0FBUSxVQUFVO0NBS3RDLENBQUE7QUFIQztJQURDLElBQUEsY0FBSyxHQUFFOztxQ0FDTTtBQUVkO0lBREMsSUFBQSxjQUFLLEdBQUU7OzRDQUNhO0FBSlYsT0FBTztJQURuQixJQUFBLGVBQU0sR0FBRTtHQUNJLE9BQU8sQ0FLbkI7QUFMWSwwQkFBTztBQU9wQjs7R0FFRztBQUVILElBQWEsT0FBTyxHQUFwQixNQUFhLE9BQVEsU0FBUSxVQUFVO0NBYXRDLENBQUE7QUFMQztJQURDLElBQUEsV0FBRSxFQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOzttQ0FDRTtBQUVyQjtJQURDLElBQUEsY0FBSyxFQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDOzt3Q0FDUjtBQUVqQjtJQURDLElBQUEsaUJBQVEsRUFBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7d0NBQ1I7QUFaZCxPQUFPO0lBRG5CLElBQUEsZUFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDO0dBQ3BCLE9BQU8sQ0FhbkI7QUFiWSwwQkFBTztBQWdCcEIsSUFBYSxJQUFJLFlBQWpCLE1BQWEsSUFBSyxTQUFRLFVBQVU7Q0FjbkMsQ0FBQTtBQVpDO0lBREMsSUFBQSxjQUFLLEdBQUU7O2tDQUNNO0FBRWQ7SUFEQyxJQUFBLGNBQUssR0FBRTs7bUNBQ087QUFFZjtJQURDLElBQUEsY0FBSyxHQUFFOztzQ0FDVTtBQUtsQjtJQURDLElBQUEsaUJBQVEsRUFBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztzQ0FDakYsT0FBTztxQ0FBQztBQUVsQjtJQURDLElBQUEsa0JBQVMsRUFBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDOzttQ0FDeEM7QUFiSixJQUFJO0lBRGhCLElBQUEsZUFBTSxHQUFFO0dBQ0ksSUFBSSxDQWNoQjtBQWRZLG9CQUFJO0FBaUJqQixJQUFhLGFBQWEscUJBQTFCLE1BQWEsYUFBYyxTQUFRLFVBQVU7Q0FTNUMsQ0FBQTtBQVBDO0lBREMsSUFBQSxjQUFLLEdBQUU7OzJDQUNNO0FBRWQ7SUFEQyxJQUFBLGNBQUssR0FBRTs7a0RBQ2E7QUFFckI7SUFEQyxJQUFBLGNBQUssRUFBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxlQUFhLEVBQUUsQ0FBQzs7cURBQ2xCO0FBRXhCO0lBREMsSUFBQSxrQkFBUyxHQUFFO3NDQUNHLGFBQWE7bURBQUM7QUFSbEIsYUFBYTtJQUR6QixJQUFBLGVBQU0sR0FBRTtHQUNJLGFBQWEsQ0FTekI7QUFUWSxzQ0FBYTtBQVkxQixJQUFhLFdBQVcsR0FBeEIsTUFBYSxXQUFZLFNBQVEsVUFBVTtDQW1CMUMsQ0FBQTtBQUxDO0lBREMsSUFBQSxXQUFFLEVBQUMsRUFBRSxRQUFRLEVBQUUsU0FBTSxFQUFFLENBQUM7O3VDQUNiO0FBRVo7SUFEQyxJQUFBLGNBQUssR0FBRTs7eUNBQ007QUFFZDtJQURDLElBQUEsY0FBSyxHQUFFOztnREFDYTtBQWxCVixXQUFXO0lBRHZCLElBQUEsZUFBTSxHQUFFO0dBQ0ksV0FBVyxDQW1CdkI7QUFuQlksa0NBQVc7QUFxQnhCLE1BQWEsSUFBSTtDQVdoQjtBQVRDO0lBREMsSUFBQSxjQUFLLEdBQUU7O2tDQUNNO0FBRWQ7SUFEQyxJQUFBLGNBQUssR0FBRTs7d0NBQ1k7QUFFcEI7SUFEQyxJQUFBLGNBQUssRUFBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7d0NBQ3BCO0FBRXBCO0lBREMsSUFBQSxrQkFBUyxHQUFFO3NDQUNELFdBQVc7c0NBQUM7QUFFdkI7SUFEQyxJQUFBLGNBQUssR0FBRTs7eUNBQ2E7QUFWdkIsb0JBV0M7QUFHRCxJQUFhLEdBQUcsR0FBaEIsTUFBYSxHQUFJLFNBQVEsVUFBVTtDQVdsQyxDQUFBO0FBVEM7SUFEQyxJQUFBLGNBQUssR0FBRTs7aUNBQ007QUFFZDtJQURDLElBQUEsY0FBSyxHQUFFOzt1Q0FDWTtBQUVwQjtJQURDLElBQUEsY0FBSyxFQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDOzt1Q0FDcEI7QUFFcEI7SUFEQyxJQUFBLGtCQUFTLEdBQUU7c0NBQ0QsV0FBVztxQ0FBQztBQUV2QjtJQURDLElBQUEsY0FBSyxHQUFFOzt3Q0FDYTtBQVZWLEdBQUc7SUFEZixJQUFBLGVBQU0sR0FBRTtHQUNJLEdBQUcsQ0FXZjtBQVhZLGtCQUFHO0FBYWhCOztHQUVHO0FBRUgsSUFBYSxtQkFBbUIsR0FBaEMsTUFBYSxtQkFBb0IsU0FBUSxVQUFVO0NBVWxELENBQUE7QUFSQztJQURDLElBQUEsY0FBSyxHQUFFOztpREFDTTtBQUVkO0lBREMsSUFBQSxrQkFBUyxFQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7eURBQy9EO0FBSzdCO0lBREMsSUFBQSxjQUFLLEVBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7O3NEQUNuQjtBQVRSLG1CQUFtQjtJQUQvQixJQUFBLGVBQU0sRUFBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQztHQUNoQixtQkFBbUIsQ0FVL0I7QUFWWSxrREFBbUI7QUFhaEMsSUFBYSxXQUFXLEdBQXhCLE1BQWEsV0FBWSxTQUFRLFVBQVU7Q0FTMUMsQ0FBQTtBQVBDO0lBREMsSUFBQSxjQUFLLEdBQUU7O3lDQUNNO0FBRWQ7SUFEQyxJQUFBLGNBQUssRUFBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDOzsrQ0FDNUI7QUFFcEI7SUFEQyxJQUFBLGtCQUFTLEVBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUM7c0NBQ3ZCLG1CQUFtQjs2Q0FBQztBQUUvQjtJQURDLElBQUEsY0FBSyxFQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDOzs4Q0FDbkI7QUFSUixXQUFXO0lBRHZCLElBQUEsZUFBTSxFQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDO0dBQ2hCLFdBQVcsQ0FTdkI7QUFUWSxrQ0FBVztBQVl4QixJQUFhLFVBQVUsR0FBdkIsTUFBYSxVQUFXLFNBQVEsVUFBVTtDQU96QyxDQUFBO0FBTEM7SUFEQyxJQUFBLGNBQUssR0FBRTs7d0NBQ007QUFFZDtJQURDLElBQUEsY0FBSyxHQUFFOzsyQ0FDUztBQUVqQjtJQURDLElBQUEsY0FBSyxHQUFFOzsrQ0FDYTtBQU5WLFVBQVU7SUFEdEIsSUFBQSxlQUFNLEdBQUU7R0FDSSxVQUFVLENBT3RCO0FBUFksZ0NBQVU7QUFVdkIsSUFBYSxJQUFJLEdBQWpCLE1BQWEsSUFBSyxTQUFRLFVBQVU7Q0FrRG5DLENBQUE7QUFoREM7SUFEQyxJQUFBLGNBQUssR0FBRTs7a0NBQ007QUFFZDtJQURDLElBQUEsY0FBSyxHQUFFOzt5Q0FDYTtBQUVyQjtJQURDLElBQUEsY0FBSyxHQUFFOztrQ0FDTTtBQUVkO0lBREMsSUFBQSxjQUFLLEVBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7O2dEQUNkO0FBRTVCO0lBREMsSUFBQSxrQkFBUyxHQUFFO3NDQUNPLGFBQWE7OENBQUM7QUFFakM7SUFEQyxJQUFBLGNBQUssRUFBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7aURBQ2I7QUFFN0I7SUFEQyxJQUFBLGtCQUFTLEdBQUU7c0NBQ1EsYUFBYTsrQ0FBQztBQUVsQztJQURDLElBQUEsY0FBSyxFQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDOzttQ0FDakI7QUFFZjtJQURDLElBQUEsa0JBQVMsR0FBRTtzQ0FDTixHQUFHO2lDQUFDO0FBRVY7SUFEQyxJQUFBLGNBQUssRUFBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7MkNBQ2pCO0FBRXZCO0lBREMsSUFBQSxrQkFBUyxHQUFFO3NDQUNFLFdBQVc7eUNBQUM7QUFFMUI7SUFEQyxJQUFBLGNBQUssR0FBRTs7dUNBQ1c7QUFFbkI7SUFEQyxJQUFBLGNBQUssR0FBRTs7MkNBQ2dCO0FBRXhCO0lBREMsSUFBQSxtQkFBVSxFQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7a0NBQzVEO0FBcUJiO0lBcEJDLElBQUEsY0FBSyxFQUFDO1FBQ0w7Ozs7O1dBS0c7UUFDSCxPQUFPLEVBQUUsSUFBQSxVQUFHLEVBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1lBQzFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQ3pCLE9BQU8sRUFDUDtnQkFDRSxPQUFPLEVBQUU7b0JBQ1AsTUFBTSxFQUFFLElBQUEsVUFBRyxFQUFDLEdBQUcsYUFBYSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztpQkFDekQ7YUFDRixFQUNELEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUNyQixDQUFDO1lBQ0YsT0FBTyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQ3RCLENBQUMsQ0FBQztLQUNILENBQUM7O3VDQUNpQjtBQWpEUixJQUFJO0lBRGhCLElBQUEsZUFBTSxHQUFFO0dBQ0ksSUFBSSxDQWtEaEI7QUFsRFksb0JBQUk7QUFxRGpCLElBQWEsR0FBRyxHQUFoQixNQUFhLEdBQUksU0FBUSxVQUFVO0NBMEJsQyxDQUFBO0FBeEJDO0lBREMsSUFBQSxjQUFLLEdBQUU7O2lDQUNNO0FBRWQ7SUFEQyxJQUFBLG1CQUFVLEVBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDOztrQ0FDbkQ7QUFxQmY7SUFwQkMsSUFBQSxjQUFLLEVBQUM7UUFDTCxPQUFPLEVBQUUsSUFBQSxVQUFHLEVBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1lBQzFDOzs7OztlQUtHO1lBQ0gsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FDekIsT0FBTyxFQUNQO2dCQUNFLE9BQU8sRUFBRTtvQkFDUCxLQUFLLEVBQUUsSUFBQSxVQUFHLEVBQUMsR0FBRyxhQUFhLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2lCQUN4RDthQUNGLEVBQ0QsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQ3JCLENBQUM7WUFDRixPQUFPLElBQUksS0FBSyxHQUFHLENBQUM7UUFDdEIsQ0FBQyxDQUFDO0tBQ0gsQ0FBQzs7dUNBQ2tCO0FBekJULEdBQUc7SUFEZixJQUFBLGVBQU0sR0FBRTtHQUNJLEdBQUcsQ0EwQmY7QUExQlksa0JBQUc7QUE2QmhCLElBQWEsT0FBTyxHQUFwQixNQUFhLE9BQU87Q0FPbkIsQ0FBQTtBQUxDO0lBREMsSUFBQSxXQUFFLEdBQUU7O21DQUNPO0FBRVo7SUFEQyxJQUFBLGNBQUssRUFBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7dUNBQ2pCO0FBRWhCO0lBREMsSUFBQSxjQUFLLEVBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7O3NDQUNqQjtBQU5KLE9BQU87SUFEbkIsSUFBQSxlQUFNLEdBQUU7R0FDSSxPQUFPLENBT25CO0FBUFksMEJBQU87QUFVcEIsSUFBYSxtQkFBbUIsR0FBaEMsTUFBYSxtQkFBb0IsU0FBUSxVQUFVO0NBV2xELENBQUE7QUFMQztJQUxDLElBQUEsa0JBQVMsRUFBQztRQUNULE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxjQUFjO1FBQzVCLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtRQUMxQyxPQUFPLEVBQUUsSUFBSTtLQUNkLENBQUM7OzREQUNpQztBQUVuQztJQURDLElBQUEsY0FBSyxHQUFFO3NDQUNELElBQUk7aURBQUM7QUFFWjtJQURDLElBQUEsY0FBSyxHQUFFOzt3REFDYTtBQVZWLG1CQUFtQjtJQUQvQixJQUFBLGVBQU0sR0FBRTtHQUNJLG1CQUFtQixDQVcvQjtBQVhZLGtEQUFtQjtBQWNoQyxJQUFhLGNBQWMsR0FBM0IsTUFBYSxjQUFlLFNBQVEsVUFBVTtDQWlCN0MsQ0FBQTtBQWZDO0lBREMsSUFBQSxjQUFLLEVBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7OzhDQUNqQjtBQUVoQjtJQURDLElBQUEsa0JBQVMsR0FBRTtzQ0FDTCxJQUFJOzRDQUFDO0FBRVo7SUFEQyxJQUFBLGNBQUssR0FBRTs7OENBQ1E7QUFFaEI7SUFEQyxJQUFBLGNBQUssR0FBRTs7Z0RBQ1U7QUFFbEI7SUFEQyxJQUFBLGNBQUssRUFBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7b0RBQ2pCO0FBRXRCO0lBREMsSUFBQSxrQkFBUyxHQUFFO3NDQUNDLFVBQVU7a0RBQUM7QUFFeEI7SUFEQyxJQUFBLGNBQUssRUFBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDOzs2REFDakI7QUFFL0I7SUFEQyxJQUFBLGtCQUFTLEdBQUU7c0NBQ1UsbUJBQW1COzJEQUFDO0FBaEIvQixjQUFjO0lBRDFCLElBQUEsZUFBTSxHQUFFO0dBQ0ksY0FBYyxDQWlCMUI7QUFqQlksd0NBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IEZpZWxkLCBNYW55VG9PbmUsIElkLCBPbmVUb01hbnksIEVudGl0eSwgT25lVG9PbmUsIE1hbnlUb01hbnkgfSBmcm9tICdAdXFsL2NvcmUvZW50aXR5JztcbmltcG9ydCB7IHJhdyB9IGZyb20gJ0B1cWwvY29yZS91dGlsJztcbmltcG9ydCB7IGlkS2V5IH0gZnJvbSAnQHVxbC9jb3JlL3R5cGUnO1xuXG4vKipcbiAqIGludGVyZmFjZXMgY2FuIChvcHRpb25hbGx5KSBiZSB1c2VkIHRvIGF2b2lkIGNpcmN1bGFyLXJlZmVyZW5jZSBpc3N1ZSBiZXR3ZWVuIGVudGl0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFbnRpdHkge1xuICBpZD86IG51bWJlcjtcbiAgY29tcGFueUlkPzogbnVtYmVyO1xuICBjb21wYW55PzogSUNvbXBhbnk7XG4gIGNyZWF0b3JJZD86IG51bWJlcjtcbiAgY3JlYXRvcj86IElVc2VyO1xuICBjcmVhdGVkQXQ/OiBudW1iZXI7XG4gIHVwZGF0ZWRBdD86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIElDb21wYW55IGV4dGVuZHMgSUVudGl0eSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSVVzZXIgZXh0ZW5kcyBJRW50aXR5IHtcbiAgbmFtZT86IHN0cmluZztcbiAgZW1haWw/OiBzdHJpbmc7XG4gIHBhc3N3b3JkPzogc3RyaW5nO1xuICBwcm9maWxlPzogUHJvZmlsZTtcbn1cblxuLyoqXG4gKiBhbiBhYnN0cmFjdCBjbGFzcyBjYW4gKG9wdGlvbmFsbHkpIGJlIHVzZWQgYXMgYSBcInRlbXBsYXRlXCIgZm9yIHRoZSBlbnRpdGllc1xuICogKHNvIHRoZSBjb21tb24gYXR0cmlidXRlcycgZGVjbGFyYXRpb24gaXMgcmV1c2VkKS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBJRW50aXR5IHtcbiAgQElkKClcbiAgaWQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBmb3JlaWduLWtleXMgYXJlIHJlYWxseSBzaW1wbGUgdG8gc3BlY2lmeVxuICAgKi9cbiAgQEZpZWxkKHsgcmVmZXJlbmNlOiAoKSA9PiBDb21wYW55IH0pXG4gIGNvbXBhbnlJZD86IG51bWJlcjtcbiAgQE1hbnlUb09uZSh7IGVudGl0eTogKCkgPT4gQ29tcGFueSB9KVxuICBjb21wYW55PzogSUNvbXBhbnk7XG4gIEBGaWVsZCh7IHJlZmVyZW5jZTogKCkgPT4gVXNlciB9KVxuICBjcmVhdG9ySWQ/OiBudW1iZXI7XG4gIEBNYW55VG9PbmUoeyBlbnRpdHk6ICgpID0+IFVzZXIgfSlcbiAgY3JlYXRvcj86IElVc2VyO1xuICAvKipcbiAgICogJ29uSW5zZXJ0JyBjYWxsYmFjayBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgY3VzdG9tIG1lY2hhbmlzbSBmb3JcbiAgICogb2J0YWluaW5nIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIHdoZW4gaW5zZXJ0aW5nOlxuICAgKi9cbiAgQEZpZWxkKHsgb25JbnNlcnQ6ICgpID0+IERhdGUubm93KCkgfSlcbiAgY3JlYXRlZEF0PzogbnVtYmVyO1xuICAvKipcbiAgICogJ29uVXBkYXRlJyBjYWxsYmFjayBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgY3VzdG9tIG1lY2hhbmlzbSBmb3JcbiAgICogb2J0YWluaW5nIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIHdoZW4gdXBkYXRpbmc6XG4gICAqL1xuICBARmllbGQoeyBvblVwZGF0ZTogKCkgPT4gRGF0ZS5ub3coKSB9KVxuICB1cGRhdGVkQXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogYENvbXBhbnlgIHdpbGwgaW5oZXJpdCBhbGwgdGhlIGZpZWxkcyAoaW5jbHVkaW5nIHRoZSBgSWRgKSBkZWNsYXJlZCBpbiBgQmFzZUVudGl0eWAuXG4gKi9cbkBFbnRpdHkoKVxuZXhwb3J0IGNsYXNzIENvbXBhbnkgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgSUNvbXBhbnkge1xuICBARmllbGQoKVxuICBuYW1lPzogc3RyaW5nO1xuICBARmllbGQoKVxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBhbmQgZW50aXR5IGNhbiBzcGVjaWZ5IHRoZSB0YWJsZSBuYW1lXG4gKi9cbkBFbnRpdHkoeyBuYW1lOiAndXNlcl9wcm9maWxlJyB9KVxuZXhwb3J0IGNsYXNzIFByb2ZpbGUgZXh0ZW5kcyBCYXNlRW50aXR5IHtcbiAgLyoqXG4gICAqIGFuIGVudGl0eSBjYW4gc3BlY2lmeSBpdHMgb3duIElEIEZpZWxkIGFuZCBzdGlsbCBpbmhlcml0IHRoZSBvdGhlcnNcbiAgICogY29sdW1ucy9yZWxhdGlvbnMgZnJvbSBpdHMgcGFyZW50IGVudGl0eS5cbiAgICogJ29uSW5zZXJ0JyBjYWxsYmFjayBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgY3VzdG9tIG1lY2hhbmlzbSBmb3JcbiAgICogYXV0by1nZW5lcmF0aW5nIHRoZSBwcmltYXJ5LWtleSdzIHZhbHVlIHdoZW4gaW5zZXJ0aW5nLlxuICAgKi9cbiAgQElkKHsgbmFtZTogJ3BrJyB9KVxuICBvdmVycmlkZSBpZD86IG51bWJlcjtcbiAgQEZpZWxkKHsgbmFtZTogJ2ltYWdlJyB9KVxuICBwaWN0dXJlPzogc3RyaW5nO1xuICBAT25lVG9PbmUoeyBlbnRpdHk6ICgpID0+IFVzZXIgfSlcbiAgb3ZlcnJpZGUgY3JlYXRvcj86IElVc2VyO1xufVxuXG5ARW50aXR5KClcbmV4cG9ydCBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIElVc2VyIHtcbiAgQEZpZWxkKClcbiAgbmFtZT86IHN0cmluZztcbiAgQEZpZWxkKClcbiAgZW1haWw/OiBzdHJpbmc7XG4gIEBGaWVsZCgpXG4gIHBhc3N3b3JkPzogc3RyaW5nO1xuICAvKipcbiAgICogYG1hcHBlZEJ5YCBjYW4gYmUgYSBjYWxsYmFjayBvciBhIHN0cmluZyAoY2FsbGJhY2sgaXMgdXNlZnVsIGZvciBhdXRvLXJlZmFjdG9yaW5nKS5cbiAgICovXG4gIEBPbmVUb09uZSh7IGVudGl0eTogKCkgPT4gUHJvZmlsZSwgbWFwcGVkQnk6IChwcm9maWxlKSA9PiBwcm9maWxlLmNyZWF0b3IsIGNhc2NhZGU6IHRydWUgfSlcbiAgcHJvZmlsZT86IFByb2ZpbGU7XG4gIEBPbmVUb01hbnkoeyBlbnRpdHk6ICgpID0+IFVzZXIsIG1hcHBlZEJ5OiAnY3JlYXRvcicgfSlcbiAgdXNlcnM/OiBVc2VyW107XG59XG5cbkBFbnRpdHkoKVxuZXhwb3J0IGNsYXNzIExlZGdlckFjY291bnQgZXh0ZW5kcyBCYXNlRW50aXR5IHtcbiAgQEZpZWxkKClcbiAgbmFtZT86IHN0cmluZztcbiAgQEZpZWxkKClcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEBGaWVsZCh7IHJlZmVyZW5jZTogKCkgPT4gTGVkZ2VyQWNjb3VudCB9KVxuICBwYXJlbnRMZWRnZXJJZD86IG51bWJlcjtcbiAgQE1hbnlUb09uZSgpXG4gIHBhcmVudExlZGdlcj86IExlZGdlckFjY291bnQ7XG59XG5cbkBFbnRpdHkoKVxuZXhwb3J0IGNsYXNzIFRheENhdGVnb3J5IGV4dGVuZHMgQmFzZUVudGl0eSB7XG4gIC8qKlxuICAgKiBgaWRLZXlgIHN5bWJvbCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBpZGVudGlmaWVyIHByb3BlcnR5LFxuICAgKiBzbyB0aGUgdHlwZSBvZiB0aGUgaWRlbnRpZmllciBjYW4gYWx3YXlzIGJlIHR5cGUtc2FmZVxuICAgKiAodGhlIGlkZW50aWZpZXJzIG5hbWVkIGFzIGBpZGAgb3IgYF9pZGAgYXJlIGF1dG8taW5mZXJyZWQpLlxuICAgKi9cbiAgW2lkS2V5XT86ICdwayc7XG4gIC8qKlxuICAgKiBhbiBlbnRpdHkgY2FuIHNwZWNpZnkgaXRzIG93biBJRCBGaWVsZCBhbmQgc3RpbGwgaW5oZXJpdCB0aGUgb3RoZXJzXG4gICAqIGNvbHVtbnMvcmVsYXRpb25zIGZyb20gaXRzIHBhcmVudCBlbnRpdHkuXG4gICAqICdvbkluc2VydCcgY2FsbGJhY2sgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGN1c3RvbSBtZWNoYW5pc20gZm9yXG4gICAqIGF1dG8tZ2VuZXJhdGluZyB0aGUgcHJpbWFyeS1rZXkncyB2YWx1ZSB3aGVuIGluc2VydGluZy5cbiAgICovXG4gIEBJZCh7IG9uSW5zZXJ0OiB1dWlkdjQgfSlcbiAgcGs/OiBzdHJpbmc7XG4gIEBGaWVsZCgpXG4gIG5hbWU/OiBzdHJpbmc7XG4gIEBGaWVsZCgpXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdCB7XG4gIEBGaWVsZCgpXG4gIG5hbWU/OiBzdHJpbmc7XG4gIEBGaWVsZCgpXG4gIHBlcmNlbnRhZ2U/OiBudW1iZXI7XG4gIEBGaWVsZCh7IHJlZmVyZW5jZTogKCkgPT4gVGF4Q2F0ZWdvcnkgfSlcbiAgY2F0ZWdvcnlJZD86IHN0cmluZztcbiAgQE1hbnlUb09uZSgpXG4gIGNhdGVnb3J5PzogVGF4Q2F0ZWdvcnk7XG4gIEBGaWVsZCgpXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5ARW50aXR5KClcbmV4cG9ydCBjbGFzcyBUYXggZXh0ZW5kcyBCYXNlRW50aXR5IHtcbiAgQEZpZWxkKClcbiAgbmFtZT86IHN0cmluZztcbiAgQEZpZWxkKClcbiAgcGVyY2VudGFnZT86IG51bWJlcjtcbiAgQEZpZWxkKHsgcmVmZXJlbmNlOiAoKSA9PiBUYXhDYXRlZ29yeSB9KVxuICBjYXRlZ29yeUlkPzogc3RyaW5nO1xuICBATWFueVRvT25lKClcbiAgY2F0ZWdvcnk/OiBUYXhDYXRlZ29yeTtcbiAgQEZpZWxkKClcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogYHNvZnREZWxldGVgIHdpbGwgbWFrZSB0aGUgZW50aXR5IFwic29mdCBkZWxldGFibGVcIi5cbiAqL1xuQEVudGl0eSh7IHNvZnREZWxldGU6IHRydWUgfSlcbmV4cG9ydCBjbGFzcyBNZWFzdXJlVW5pdENhdGVnb3J5IGV4dGVuZHMgQmFzZUVudGl0eSB7XG4gIEBGaWVsZCgpXG4gIG5hbWU/OiBzdHJpbmc7XG4gIEBPbmVUb01hbnkoeyBlbnRpdHk6ICgpID0+IE1lYXN1cmVVbml0LCBtYXBwZWRCeTogKG1lYXN1cmVVbml0KSA9PiBtZWFzdXJlVW5pdC5jYXRlZ29yeUlkIH0pXG4gIG1lYXN1cmVVbml0cz86IE1lYXN1cmVVbml0W107XG4gIC8qKlxuICAgKiBgb25EZWxldGVgIGNhbGxiYWNrIGFsbG93cyB0byBzcGVjaWZ5IHdoaWNoIGZpZWxkIHdpbGwgYmUgdXNlZCB3aGVuIGRlbGV0aW5nL3F1ZXJ5aW5nIHRoaXMgZW50aXR5LlxuICAgKi9cbiAgQEZpZWxkKHsgb25EZWxldGU6ICgpID0+IERhdGUubm93KCkgfSlcbiAgZGVsZXRlZEF0PzogbnVtYmVyO1xufVxuXG5ARW50aXR5KHsgc29mdERlbGV0ZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIE1lYXN1cmVVbml0IGV4dGVuZHMgQmFzZUVudGl0eSB7XG4gIEBGaWVsZCgpXG4gIG5hbWU/OiBzdHJpbmc7XG4gIEBGaWVsZCh7IHJlZmVyZW5jZTogKCkgPT4gTWVhc3VyZVVuaXRDYXRlZ29yeSB9KVxuICBjYXRlZ29yeUlkPzogbnVtYmVyO1xuICBATWFueVRvT25lKHsgY2FzY2FkZTogJ3BlcnNpc3QnIH0pXG4gIGNhdGVnb3J5PzogTWVhc3VyZVVuaXRDYXRlZ29yeTtcbiAgQEZpZWxkKHsgb25EZWxldGU6ICgpID0+IERhdGUubm93KCkgfSlcbiAgZGVsZXRlZEF0PzogbnVtYmVyO1xufVxuXG5ARW50aXR5KClcbmV4cG9ydCBjbGFzcyBTdG9yZWhvdXNlIGV4dGVuZHMgQmFzZUVudGl0eSB7XG4gIEBGaWVsZCgpXG4gIG5hbWU/OiBzdHJpbmc7XG4gIEBGaWVsZCgpXG4gIGFkZHJlc3M/OiBzdHJpbmc7XG4gIEBGaWVsZCgpXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5ARW50aXR5KClcbmV4cG9ydCBjbGFzcyBJdGVtIGV4dGVuZHMgQmFzZUVudGl0eSB7XG4gIEBGaWVsZCgpXG4gIG5hbWU/OiBzdHJpbmc7XG4gIEBGaWVsZCgpXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBARmllbGQoKVxuICBjb2RlPzogc3RyaW5nO1xuICBARmllbGQoeyByZWZlcmVuY2U6ICgpID0+IExlZGdlckFjY291bnQgfSlcbiAgYnV5TGVkZ2VyQWNjb3VudElkPzogbnVtYmVyO1xuICBATWFueVRvT25lKClcbiAgYnV5TGVkZ2VyQWNjb3VudD86IExlZGdlckFjY291bnQ7XG4gIEBGaWVsZCh7IHJlZmVyZW5jZTogKCkgPT4gTGVkZ2VyQWNjb3VudCB9KVxuICBzYWxlTGVkZ2VyQWNjb3VudElkPzogbnVtYmVyO1xuICBATWFueVRvT25lKClcbiAgc2FsZUxlZGdlckFjY291bnQ/OiBMZWRnZXJBY2NvdW50O1xuICBARmllbGQoeyByZWZlcmVuY2U6ICgpID0+IFRheCB9KVxuICB0YXhJZD86IG51bWJlcjtcbiAgQE1hbnlUb09uZSgpXG4gIHRheD86IFRheDtcbiAgQEZpZWxkKHsgcmVmZXJlbmNlOiAoKSA9PiBNZWFzdXJlVW5pdCB9KVxuICBtZWFzdXJlVW5pdElkPzogbnVtYmVyO1xuICBATWFueVRvT25lKClcbiAgbWVhc3VyZVVuaXQ/OiBNZWFzdXJlVW5pdDtcbiAgQEZpZWxkKClcbiAgc2FsZVByaWNlPzogbnVtYmVyO1xuICBARmllbGQoKVxuICBpbnZlbnRvcnlhYmxlPzogYm9vbGVhbjtcbiAgQE1hbnlUb01hbnkoeyBlbnRpdHk6ICgpID0+IFRhZywgdGhyb3VnaDogKCkgPT4gSXRlbVRhZywgY2FzY2FkZTogdHJ1ZSB9KVxuICB0YWdzPzogVGFnW107XG4gIEBGaWVsZCh7XG4gICAgLyoqXG4gICAgICogYHZpcnR1YWxgIHByb3BlcnR5IGFsbG93cyBkZWZpbmluZyB0aGUgdmFsdWUgZm9yIGEgbm9uLXBlcnNpc3RlbnQgZmllbGQsXG4gICAgICogc3VjaCB2YWx1ZSBtaWdodCBiZSBhIHNjYWxhciBvciBhIChgcmF3YCkgZnVuY3Rpb24uIFZpcnR1YWwtZmllbGRzIGNhbiBiZVxuICAgICAqIHVzZWQgaW4gYCRwcm9qZWN0YCwgYCRmaWx0ZXJgIGFuZCBgJGhhdmluZ2AgYXMgYSBjb21tb24gZmllbGQgd2hvc2UgdmFsdWVcbiAgICAgKiBpcyByZXBsYWNlZCBhdCBydW50aW1lLlxuICAgICAqL1xuICAgIHZpcnR1YWw6IHJhdygoeyBlc2NhcGVkUHJlZml4LCBkaWFsZWN0IH0pID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gZGlhbGVjdC5jb3VudChcbiAgICAgICAgSXRlbVRhZyxcbiAgICAgICAge1xuICAgICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICAgIGl0ZW1JZDogcmF3KGAke2VzY2FwZWRQcmVmaXh9JHtkaWFsZWN0LmVzY2FwZUlkKCdpZCcpfWApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgYXV0b1ByZWZpeDogdHJ1ZSB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIGAoJHtxdWVyeX0pYDtcbiAgICB9KSxcbiAgfSlcbiAgdGFnc0NvdW50PzogbnVtYmVyO1xufVxuXG5ARW50aXR5KClcbmV4cG9ydCBjbGFzcyBUYWcgZXh0ZW5kcyBCYXNlRW50aXR5IHtcbiAgQEZpZWxkKClcbiAgbmFtZT86IHN0cmluZztcbiAgQE1hbnlUb01hbnkoeyBlbnRpdHk6ICgpID0+IEl0ZW0sIG1hcHBlZEJ5OiAoaXRlbSkgPT4gaXRlbS50YWdzIH0pXG4gIGl0ZW1zPzogSXRlbVtdO1xuICBARmllbGQoe1xuICAgIHZpcnR1YWw6IHJhdygoeyBlc2NhcGVkUHJlZml4LCBkaWFsZWN0IH0pID0+IHtcbiAgICAgIC8qKlxuICAgICAgICogYHZpcnR1YWxgIHByb3BlcnR5IGFsbG93cyBkZWZpbmluZyB0aGUgdmFsdWUgZm9yIGEgbm9uLXBlcnNpc3RlbnQgZmllbGQsXG4gICAgICAgKiBzdWNoIHZhbHVlIG1pZ2h0IGJlIGEgc2NhbGFyIG9yIGEgKGByYXdgKSBmdW5jdGlvbi4gVmlydHVhbC1maWVsZHMgY2FuIGJlXG4gICAgICAgKiB1c2VkIGluIGAkcHJvamVjdGAsIGAkZmlsdGVyYCBhbmQgYCRoYXZpbmdgIGFzIGEgY29tbW9uIGZpZWxkIHdob3NlIHZhbHVlXG4gICAgICAgKiBpcyByZXBsYWNlZCBhdCBydW50aW1lLlxuICAgICAgICovXG4gICAgICBjb25zdCBxdWVyeSA9IGRpYWxlY3QuY291bnQoXG4gICAgICAgIEl0ZW1UYWcsXG4gICAgICAgIHtcbiAgICAgICAgICAkZmlsdGVyOiB7XG4gICAgICAgICAgICB0YWdJZDogcmF3KGAke2VzY2FwZWRQcmVmaXh9JHtkaWFsZWN0LmVzY2FwZUlkKCdpZCcpfWApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgYXV0b1ByZWZpeDogdHJ1ZSB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIGAoJHtxdWVyeX0pYDtcbiAgICB9KSxcbiAgfSlcbiAgaXRlbXNDb3VudD86IG51bWJlcjtcbn1cblxuQEVudGl0eSgpXG5leHBvcnQgY2xhc3MgSXRlbVRhZyB7XG4gIEBJZCgpXG4gIGlkPzogbnVtYmVyO1xuICBARmllbGQoeyByZWZlcmVuY2U6ICgpID0+IEl0ZW0gfSlcbiAgaXRlbUlkPzogbnVtYmVyO1xuICBARmllbGQoeyByZWZlcmVuY2U6ICgpID0+IFRhZyB9KVxuICB0YWdJZD86IG51bWJlcjtcbn1cblxuQEVudGl0eSgpXG5leHBvcnQgY2xhc3MgSW52ZW50b3J5QWRqdXN0bWVudCBleHRlbmRzIEJhc2VFbnRpdHkge1xuICBAT25lVG9NYW55KHtcbiAgICBlbnRpdHk6ICgpID0+IEl0ZW1BZGp1c3RtZW50LFxuICAgIG1hcHBlZEJ5OiAocmVsKSA9PiByZWwuaW52ZW50b3J5QWRqdXN0bWVudCxcbiAgICBjYXNjYWRlOiB0cnVlLFxuICB9KVxuICBpdGVtQWRqdXN0bWVudHM/OiBJdGVtQWRqdXN0bWVudFtdO1xuICBARmllbGQoKVxuICBkYXRlPzogRGF0ZTtcbiAgQEZpZWxkKClcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbkBFbnRpdHkoKVxuZXhwb3J0IGNsYXNzIEl0ZW1BZGp1c3RtZW50IGV4dGVuZHMgQmFzZUVudGl0eSB7XG4gIEBGaWVsZCh7IHJlZmVyZW5jZTogKCkgPT4gSXRlbSB9KVxuICBpdGVtSWQ/OiBudW1iZXI7XG4gIEBNYW55VG9PbmUoKVxuICBpdGVtPzogSXRlbTtcbiAgQEZpZWxkKClcbiAgbnVtYmVyPzogbnVtYmVyO1xuICBARmllbGQoKVxuICBidXlQcmljZT86IG51bWJlcjtcbiAgQEZpZWxkKHsgcmVmZXJlbmNlOiAoKSA9PiBTdG9yZWhvdXNlIH0pXG4gIHN0b3JlaG91c2VJZD86IG51bWJlcjtcbiAgQE1hbnlUb09uZSgpXG4gIHN0b3JlaG91c2U/OiBTdG9yZWhvdXNlO1xuICBARmllbGQoeyByZWZlcmVuY2U6ICgpID0+IEludmVudG9yeUFkanVzdG1lbnQgfSlcbiAgaW52ZW50b3J5QWRqdXN0bWVudElkPzogbnVtYmVyO1xuICBATWFueVRvT25lKClcbiAgaW52ZW50b3J5QWRqdXN0bWVudD86IEludmVudG9yeUFkanVzdG1lbnQ7XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export * from './entityMock';
2
+ export * from './spec.util';
3
+ export * from './it.util';
package/test/index.js ADDED
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./entityMock"), exports);
5
+ tslib_1.__exportStar(require("./spec.util"), exports);
6
+ tslib_1.__exportStar(require("./it.util"), exports);
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1REFBNkI7QUFDN0Isc0RBQTRCO0FBQzVCLG9EQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZW50aXR5TW9jayc7XG5leHBvcnQgKiBmcm9tICcuL3NwZWMudXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2l0LnV0aWwnO1xuIl19
@@ -0,0 +1,4 @@
1
+ import { AbstractSqlQuerier } from '@uql/core/querier';
2
+ export declare function createTables(querier: AbstractSqlQuerier, primaryKeyType: string): Promise<void>;
3
+ export declare function dropTables(querier: AbstractSqlQuerier): Promise<void>;
4
+ export declare function clearTables(querier: AbstractSqlQuerier): Promise<void>;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clearTables = exports.dropTables = exports.createTables = void 0;
4
+ const entity_1 = require("@uql/core/entity");
5
+ const util_1 = require("@uql/core/util");
6
+ async function createTables(querier, primaryKeyType) {
7
+ const entities = (0, entity_1.getEntities)();
8
+ await Promise.all(entities.map((entity) => {
9
+ const sql = getDdlForTable(entity, querier, primaryKeyType);
10
+ return querier.run(sql);
11
+ }));
12
+ }
13
+ exports.createTables = createTables;
14
+ async function dropTables(querier) {
15
+ const entities = (0, entity_1.getEntities)();
16
+ await Promise.all(entities.map((entity) => {
17
+ const meta = (0, entity_1.getMeta)(entity);
18
+ const sql = `DROP TABLE IF EXISTS ${querier.dialect.escapeId(meta.name)}`;
19
+ return querier.run(sql);
20
+ }));
21
+ }
22
+ exports.dropTables = dropTables;
23
+ async function clearTables(querier) {
24
+ const entities = (0, entity_1.getEntities)();
25
+ await Promise.all(entities.map((entity) => {
26
+ const sql = querier.dialect.delete(entity, {}, { softDelete: false });
27
+ return querier.run(sql);
28
+ }));
29
+ }
30
+ exports.clearTables = clearTables;
31
+ function getDdlForTable(entity, querier, primaryKeyType) {
32
+ const meta = (0, entity_1.getMeta)(entity);
33
+ let sql = `CREATE TABLE ${querier.dialect.escapeId(meta.name)} (\n\t`;
34
+ const insertableIdType = 'VARCHAR(36)';
35
+ const defaultType = 'VARCHAR(50)';
36
+ const columns = (0, util_1.getKeys)(meta.fields).map((key) => {
37
+ const field = meta.fields[key];
38
+ let propSql = querier.dialect.escapeId(field.name) + ' ';
39
+ if (field.isId) {
40
+ propSql += field.onInsert ? `${insertableIdType} PRIMARY KEY` : primaryKeyType;
41
+ }
42
+ else {
43
+ if (field.type === Number) {
44
+ propSql += 'BIGINT';
45
+ }
46
+ else if (field.type === Date) {
47
+ propSql += 'TIMESTAMP';
48
+ }
49
+ else {
50
+ propSql += defaultType;
51
+ }
52
+ }
53
+ return propSql;
54
+ });
55
+ sql += columns.join(',\n\t');
56
+ sql += `\n);`;
57
+ // log('sql', sql);
58
+ return sql;
59
+ }
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2l0LnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXdEO0FBRXhELHlDQUF5QztBQUdsQyxLQUFLLFVBQVUsWUFBWSxDQUFDLE9BQTJCLEVBQUUsY0FBc0I7SUFDcEYsTUFBTSxRQUFRLEdBQUcsSUFBQSxvQkFBVyxHQUFFLENBQUM7SUFDL0IsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUN0QixNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUM1RCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFSRCxvQ0FRQztBQUVNLEtBQUssVUFBVSxVQUFVLENBQUMsT0FBMkI7SUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBQSxvQkFBVyxHQUFFLENBQUM7SUFDL0IsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUN0QixNQUFNLElBQUksR0FBRyxJQUFBLGdCQUFPLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsTUFBTSxHQUFHLEdBQUcsd0JBQXdCLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzFFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQVRELGdDQVNDO0FBRU0sS0FBSyxVQUFVLFdBQVcsQ0FBQyxPQUEyQjtJQUMzRCxNQUFNLFFBQVEsR0FBRyxJQUFBLG9CQUFXLEdBQUUsQ0FBQztJQUMvQixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ3RCLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN0RSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFSRCxrQ0FRQztBQUVELFNBQVMsY0FBYyxDQUFJLE1BQWUsRUFBRSxPQUEyQixFQUFFLGNBQXNCO0lBQzdGLE1BQU0sSUFBSSxHQUFHLElBQUEsZ0JBQU8sRUFBQyxNQUFNLENBQUMsQ0FBQztJQUU3QixJQUFJLEdBQUcsR0FBRyxnQkFBZ0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFFdEUsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7SUFDdkMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDO0lBRWxDLE1BQU0sT0FBTyxHQUFHLElBQUEsY0FBTyxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekQsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2QsT0FBTyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLGNBQWMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO1NBQ2hGO2FBQU07WUFDTCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO2dCQUN6QixPQUFPLElBQUksUUFBUSxDQUFDO2FBQ3JCO2lCQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQzlCLE9BQU8sSUFBSSxXQUFXLENBQUM7YUFDeEI7aUJBQU07Z0JBQ0wsT0FBTyxJQUFJLFdBQVcsQ0FBQzthQUN4QjtTQUNGO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUM7SUFFSCxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixHQUFHLElBQUksTUFBTSxDQUFDO0lBRWQsbUJBQW1CO0lBRW5CLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEVudGl0aWVzLCBnZXRNZXRhIH0gZnJvbSAnQHVxbC9jb3JlL2VudGl0eSc7XG5pbXBvcnQgeyBUeXBlIH0gZnJvbSAnQHVxbC9jb3JlL3R5cGUnO1xuaW1wb3J0IHsgZ2V0S2V5cyB9IGZyb20gJ0B1cWwvY29yZS91dGlsJztcbmltcG9ydCB7IEFic3RyYWN0U3FsUXVlcmllciB9IGZyb20gJ0B1cWwvY29yZS9xdWVyaWVyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRhYmxlcyhxdWVyaWVyOiBBYnN0cmFjdFNxbFF1ZXJpZXIsIHByaW1hcnlLZXlUeXBlOiBzdHJpbmcpIHtcbiAgY29uc3QgZW50aXRpZXMgPSBnZXRFbnRpdGllcygpO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBlbnRpdGllcy5tYXAoKGVudGl0eSkgPT4ge1xuICAgICAgY29uc3Qgc3FsID0gZ2V0RGRsRm9yVGFibGUoZW50aXR5LCBxdWVyaWVyLCBwcmltYXJ5S2V5VHlwZSk7XG4gICAgICByZXR1cm4gcXVlcmllci5ydW4oc3FsKTtcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZHJvcFRhYmxlcyhxdWVyaWVyOiBBYnN0cmFjdFNxbFF1ZXJpZXIpIHtcbiAgY29uc3QgZW50aXRpZXMgPSBnZXRFbnRpdGllcygpO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBlbnRpdGllcy5tYXAoKGVudGl0eSkgPT4ge1xuICAgICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICAgIGNvbnN0IHNxbCA9IGBEUk9QIFRBQkxFIElGIEVYSVNUUyAke3F1ZXJpZXIuZGlhbGVjdC5lc2NhcGVJZChtZXRhLm5hbWUpfWA7XG4gICAgICByZXR1cm4gcXVlcmllci5ydW4oc3FsKTtcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJUYWJsZXMocXVlcmllcjogQWJzdHJhY3RTcWxRdWVyaWVyKSB7XG4gIGNvbnN0IGVudGl0aWVzID0gZ2V0RW50aXRpZXMoKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZW50aXRpZXMubWFwKChlbnRpdHkpID0+IHtcbiAgICAgIGNvbnN0IHNxbCA9IHF1ZXJpZXIuZGlhbGVjdC5kZWxldGUoZW50aXR5LCB7fSwgeyBzb2Z0RGVsZXRlOiBmYWxzZSB9KTtcbiAgICAgIHJldHVybiBxdWVyaWVyLnJ1bihzcWwpO1xuICAgIH0pXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldERkbEZvclRhYmxlPEU+KGVudGl0eTogVHlwZTxFPiwgcXVlcmllcjogQWJzdHJhY3RTcWxRdWVyaWVyLCBwcmltYXJ5S2V5VHlwZTogc3RyaW5nKSB7XG4gIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG5cbiAgbGV0IHNxbCA9IGBDUkVBVEUgVEFCTEUgJHtxdWVyaWVyLmRpYWxlY3QuZXNjYXBlSWQobWV0YS5uYW1lKX0gKFxcblxcdGA7XG5cbiAgY29uc3QgaW5zZXJ0YWJsZUlkVHlwZSA9ICdWQVJDSEFSKDM2KSc7XG4gIGNvbnN0IGRlZmF1bHRUeXBlID0gJ1ZBUkNIQVIoNTApJztcblxuICBjb25zdCBjb2x1bW5zID0gZ2V0S2V5cyhtZXRhLmZpZWxkcykubWFwKChrZXkpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IG1ldGEuZmllbGRzW2tleV07XG4gICAgbGV0IHByb3BTcWwgPSBxdWVyaWVyLmRpYWxlY3QuZXNjYXBlSWQoZmllbGQubmFtZSkgKyAnICc7XG4gICAgaWYgKGZpZWxkLmlzSWQpIHtcbiAgICAgIHByb3BTcWwgKz0gZmllbGQub25JbnNlcnQgPyBgJHtpbnNlcnRhYmxlSWRUeXBlfSBQUklNQVJZIEtFWWAgOiBwcmltYXJ5S2V5VHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IE51bWJlcikge1xuICAgICAgICBwcm9wU3FsICs9ICdCSUdJTlQnO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBEYXRlKSB7XG4gICAgICAgIHByb3BTcWwgKz0gJ1RJTUVTVEFNUCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wU3FsICs9IGRlZmF1bHRUeXBlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcFNxbDtcbiAgfSk7XG5cbiAgc3FsICs9IGNvbHVtbnMuam9pbignLFxcblxcdCcpO1xuICBzcWwgKz0gYFxcbik7YDtcblxuICAvLyBsb2coJ3NxbCcsIHNxbCk7XG5cbiAgcmV0dXJuIHNxbDtcbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import type { Global } from '@jest/types';
2
+ export declare function createSpec<T extends Spec>(spec: T): void;
3
+ declare const hooks: {
4
+ readonly beforeAll: Global.HookBase;
5
+ readonly beforeEach: Global.HookBase;
6
+ readonly afterEach: Global.HookBase;
7
+ readonly afterAll: Global.HookBase;
8
+ };
9
+ declare type SpecHooks = Partial<typeof hooks>;
10
+ export declare type Spec = SpecHooks & {
11
+ readonly [k: string]: Global.It | any;
12
+ };
13
+ export {};
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSpec = void 0;
4
+ const globals_1 = require("@jest/globals");
5
+ function createSpec(spec) {
6
+ const proto = Object.getPrototypeOf(spec);
7
+ let describeFn;
8
+ const specName = proto.constructor.name;
9
+ if (specName.startsWith('Fff')) {
10
+ describeFn = globals_1.fdescribe;
11
+ }
12
+ else if (specName.startsWith('Xxx')) {
13
+ describeFn = globals_1.xdescribe;
14
+ }
15
+ else {
16
+ describeFn = globals_1.describe;
17
+ }
18
+ describeFn(specName, () => createTestCases(spec));
19
+ }
20
+ exports.createSpec = createSpec;
21
+ function createTestCases(spec) {
22
+ let proto = Object.getPrototypeOf(spec);
23
+ const processedMethodsMap = {};
24
+ while (proto.constructor !== Object) {
25
+ for (const key of Object.getOwnPropertyNames(proto)) {
26
+ const isProcessed = processedMethodsMap[key];
27
+ processedMethodsMap[key] = true;
28
+ if (isProcessed || key === 'constructor' || typeof spec[key] !== 'function') {
29
+ continue;
30
+ }
31
+ const callback = spec[key].bind(spec);
32
+ if (hooks[key]) {
33
+ hooks[key](callback);
34
+ }
35
+ else if (key.startsWith('should')) {
36
+ (0, globals_1.it)(key, callback);
37
+ }
38
+ else if (key.startsWith('fffshould')) {
39
+ (0, globals_1.fit)(key, callback);
40
+ }
41
+ else if (key.startsWith('xxxshould')) {
42
+ (0, globals_1.xit)(key, callback);
43
+ }
44
+ }
45
+ proto = Object.getPrototypeOf(proto);
46
+ }
47
+ }
48
+ const hooks = {
49
+ beforeAll: globals_1.beforeAll,
50
+ beforeEach: globals_1.beforeEach,
51
+ afterEach: globals_1.afterEach,
52
+ afterAll: globals_1.afterAll,
53
+ };
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlYy51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3Qvc3BlYy51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF5SDtBQUl6SCxTQUFnQixVQUFVLENBQWlCLElBQU87SUFDaEQsTUFBTSxLQUFLLEdBQXdCLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsSUFBSSxVQUErQixDQUFDO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBRXhDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM5QixVQUFVLEdBQUcsbUJBQVMsQ0FBQztLQUN4QjtTQUFNLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNyQyxVQUFVLEdBQUcsbUJBQVMsQ0FBQztLQUN4QjtTQUFNO1FBQ0wsVUFBVSxHQUFHLGtCQUFRLENBQUM7S0FDdkI7SUFFRCxVQUFVLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFkRCxnQ0FjQztBQUVELFNBQVMsZUFBZSxDQUFDLElBQVk7SUFDbkMsSUFBSSxLQUFLLEdBQXdCLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFN0QsTUFBTSxtQkFBbUIsR0FBMEIsRUFBRSxDQUFDO0lBRXRELE9BQU8sS0FBSyxDQUFDLFdBQVcsS0FBSyxNQUFNLEVBQUU7UUFDbkMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbkQsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0MsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ2hDLElBQUksV0FBVyxJQUFJLEdBQUcsS0FBSyxhQUFhLElBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssVUFBVSxFQUFFO2dCQUMzRSxTQUFTO2FBQ1Y7WUFDRCxNQUFNLFFBQVEsR0FBa0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRCxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDZCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDdEI7aUJBQU0sSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNuQyxJQUFBLFlBQUUsRUFBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDbkI7aUJBQU0sSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUN0QyxJQUFBLGFBQUcsRUFBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDcEI7aUJBQU0sSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUN0QyxJQUFBLGFBQUcsRUFBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDcEI7U0FDRjtRQUNELEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3RDO0FBQ0gsQ0FBQztBQUVELE1BQU0sS0FBSyxHQUFHO0lBQ1osU0FBUyxFQUFULG1CQUFTO0lBQ1QsVUFBVSxFQUFWLG9CQUFVO0lBQ1YsU0FBUyxFQUFULG1CQUFTO0lBQ1QsUUFBUSxFQUFSLGtCQUFRO0NBQ0EsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBmZGVzY3JpYmUsIHhkZXNjcmliZSwgaXQsIGZpdCwgeGl0LCBiZWZvcmVBbGwsIGJlZm9yZUVhY2gsIGFmdGVyRWFjaCwgYWZ0ZXJBbGwgfSBmcm9tICdAamVzdC9nbG9iYWxzJztcblxuaW1wb3J0IHR5cGUgeyBHbG9iYWwgfSBmcm9tICdAamVzdC90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTcGVjPFQgZXh0ZW5kcyBTcGVjPihzcGVjOiBUKSB7XG4gIGNvbnN0IHByb3RvOiBGdW5jdGlvbkNvbnN0cnVjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHNwZWMpO1xuICBsZXQgZGVzY3JpYmVGbjogR2xvYmFsLkRlc2NyaWJlQmFzZTtcbiAgY29uc3Qgc3BlY05hbWUgPSBwcm90by5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gIGlmIChzcGVjTmFtZS5zdGFydHNXaXRoKCdGZmYnKSkge1xuICAgIGRlc2NyaWJlRm4gPSBmZGVzY3JpYmU7XG4gIH0gZWxzZSBpZiAoc3BlY05hbWUuc3RhcnRzV2l0aCgnWHh4JykpIHtcbiAgICBkZXNjcmliZUZuID0geGRlc2NyaWJlO1xuICB9IGVsc2Uge1xuICAgIGRlc2NyaWJlRm4gPSBkZXNjcmliZTtcbiAgfVxuXG4gIGRlc2NyaWJlRm4oc3BlY05hbWUsICgpID0+IGNyZWF0ZVRlc3RDYXNlcyhzcGVjKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRlc3RDYXNlcyhzcGVjOiBvYmplY3QpIHtcbiAgbGV0IHByb3RvOiBGdW5jdGlvbkNvbnN0cnVjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHNwZWMpO1xuXG4gIGNvbnN0IHByb2Nlc3NlZE1ldGhvZHNNYXA6IHsgW2s6IHN0cmluZ106IHRydWUgfSA9IHt9O1xuXG4gIHdoaWxlIChwcm90by5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG8pKSB7XG4gICAgICBjb25zdCBpc1Byb2Nlc3NlZCA9IHByb2Nlc3NlZE1ldGhvZHNNYXBba2V5XTtcbiAgICAgIHByb2Nlc3NlZE1ldGhvZHNNYXBba2V5XSA9IHRydWU7XG4gICAgICBpZiAoaXNQcm9jZXNzZWQgfHwga2V5ID09PSAnY29uc3RydWN0b3InIHx8IHR5cGVvZiBzcGVjW2tleV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjYWxsYmFjazogR2xvYmFsLlRlc3RGbiA9IHNwZWNba2V5XS5iaW5kKHNwZWMpO1xuICAgICAgaWYgKGhvb2tzW2tleV0pIHtcbiAgICAgICAgaG9va3Nba2V5XShjYWxsYmFjayk7XG4gICAgICB9IGVsc2UgaWYgKGtleS5zdGFydHNXaXRoKCdzaG91bGQnKSkge1xuICAgICAgICBpdChrZXksIGNhbGxiYWNrKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoJ2ZmZnNob3VsZCcpKSB7XG4gICAgICAgIGZpdChrZXksIGNhbGxiYWNrKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoJ3h4eHNob3VsZCcpKSB7XG4gICAgICAgIHhpdChrZXksIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG59XG5cbmNvbnN0IGhvb2tzID0ge1xuICBiZWZvcmVBbGwsXG4gIGJlZm9yZUVhY2gsXG4gIGFmdGVyRWFjaCxcbiAgYWZ0ZXJBbGwsXG59IGFzIGNvbnN0O1xuXG50eXBlIFNwZWNIb29rcyA9IFBhcnRpYWw8dHlwZW9mIGhvb2tzPjtcblxuZXhwb3J0IHR5cGUgU3BlYyA9IFNwZWNIb29rcyAmIHtcbiAgcmVhZG9ubHkgW2s6IHN0cmluZ106IEdsb2JhbC5JdCB8IGFueTtcbn07XG4iXX0=