@uql/core 0.4.81 → 0.4.82

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 (43) hide show
  1. package/dialect/abstractSqlDialect-spec.d.ts +49 -0
  2. package/dialect/abstractSqlDialect-spec.js +765 -0
  3. package/dialect/mysqlDialect.spec.d.ts +6 -0
  4. package/dialect/mysqlDialect.spec.js +33 -0
  5. package/dialect/postgresDialect.spec.d.ts +1 -0
  6. package/dialect/postgresDialect.spec.js +139 -0
  7. package/dialect/sqliteDialect.spec.d.ts +1 -0
  8. package/dialect/sqliteDialect.spec.js +12 -0
  9. package/entity/decorator/definition.spec.d.ts +1 -0
  10. package/entity/decorator/definition.spec.js +737 -0
  11. package/entity/decorator/relation.spec.d.ts +1 -0
  12. package/entity/decorator/relation.spec.js +55 -0
  13. package/options.spec.d.ts +1 -0
  14. package/options.spec.js +50 -0
  15. package/package.json +3 -3
  16. package/querier/abstractQuerier-it.d.ts +41 -0
  17. package/querier/abstractQuerier-it.js +410 -0
  18. package/querier/abstractSqlQuerier-it.d.ts +9 -0
  19. package/querier/abstractSqlQuerier-it.js +19 -0
  20. package/querier/abstractSqlQuerier-spec.d.ts +53 -0
  21. package/querier/abstractSqlQuerier-spec.js +609 -0
  22. package/querier/decorator/injectQuerier.spec.d.ts +1 -0
  23. package/querier/decorator/injectQuerier.spec.js +108 -0
  24. package/querier/decorator/transactional.spec.d.ts +1 -0
  25. package/querier/decorator/transactional.spec.js +241 -0
  26. package/repository/genericRepository.spec.d.ts +1 -0
  27. package/repository/genericRepository.spec.js +86 -0
  28. package/test/entityMock.d.ts +180 -0
  29. package/test/entityMock.js +451 -0
  30. package/test/index.d.ts +3 -0
  31. package/test/index.js +7 -0
  32. package/test/it.util.d.ts +4 -0
  33. package/test/it.util.js +60 -0
  34. package/test/spec.util.d.ts +13 -0
  35. package/test/spec.util.js +54 -0
  36. package/util/dialect.util.spec.d.ts +1 -0
  37. package/util/dialect.util.spec.js +23 -0
  38. package/util/object.util.spec.d.ts +1 -0
  39. package/util/object.util.spec.js +26 -0
  40. package/util/sql.util.spec.d.ts +1 -0
  41. package/util/sql.util.spec.js +164 -0
  42. package/util/string.util.spec.d.ts +1 -0
  43. package/util/string.util.spec.js +26 -0
@@ -0,0 +1,737 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const util_1 = require("@uql/core/util");
5
+ const test_1 = require("@uql/core/test");
6
+ const definition_1 = require("./definition");
7
+ const entity_1 = require("./entity");
8
+ const id_1 = require("./id");
9
+ const field_1 = require("./field");
10
+ it('User', () => {
11
+ const meta = (0, definition_1.getMeta)(test_1.User);
12
+ expect(meta.fields.companyId.reference.entity()).toBe(test_1.Company);
13
+ expect(meta.relations.company.entity()).toBe(test_1.Company);
14
+ expect(meta.relations.company.references).toEqual([{ local: 'companyId', foreign: 'id' }]);
15
+ expect(meta.fields.creatorId.reference.entity()).toBe(test_1.User);
16
+ expect(meta.relations.creator.entity()).toBe(test_1.User);
17
+ expect(meta.relations.creator.references).toEqual([{ local: 'creatorId', foreign: 'id' }]);
18
+ const expectedMeta = {
19
+ entity: test_1.User,
20
+ name: 'User',
21
+ id: 'id',
22
+ processed: true,
23
+ fields: {
24
+ id: { name: 'id', type: Number, isId: true },
25
+ companyId: {
26
+ name: 'companyId',
27
+ type: Number,
28
+ reference: { entity: expect.any(Function) },
29
+ },
30
+ creatorId: {
31
+ name: 'creatorId',
32
+ type: Number,
33
+ reference: { entity: expect.any(Function) },
34
+ },
35
+ createdAt: { name: 'createdAt', type: Number, onInsert: expect.any(Function) },
36
+ updatedAt: { name: 'updatedAt', type: Number, onUpdate: expect.any(Function) },
37
+ name: { name: 'name', type: String },
38
+ email: { name: 'email', type: String },
39
+ password: { name: 'password', type: String },
40
+ },
41
+ relations: {
42
+ company: {
43
+ cardinality: 'm1',
44
+ entity: expect.any(Function),
45
+ references: [{ local: 'companyId', foreign: 'id' }],
46
+ },
47
+ creator: {
48
+ cardinality: 'm1',
49
+ entity: expect.any(Function),
50
+ references: [{ local: 'creatorId', foreign: 'id' }],
51
+ },
52
+ users: {
53
+ cardinality: '1m',
54
+ entity: expect.any(Function),
55
+ mappedBy: 'creator',
56
+ references: [{ local: 'id', foreign: 'creatorId' }],
57
+ },
58
+ profile: {
59
+ cardinality: '11',
60
+ cascade: true,
61
+ entity: expect.any(Function),
62
+ mappedBy: 'creator',
63
+ references: [{ local: 'id', foreign: 'creatorId' }],
64
+ },
65
+ },
66
+ };
67
+ expect(meta).toEqual(expectedMeta);
68
+ });
69
+ it('Profile', () => {
70
+ const meta = (0, definition_1.getMeta)(test_1.Profile);
71
+ const expectedMeta = {
72
+ entity: test_1.Profile,
73
+ name: 'user_profile',
74
+ id: 'id',
75
+ processed: true,
76
+ fields: {
77
+ id: { name: 'pk', type: Number, isId: true },
78
+ companyId: {
79
+ name: 'companyId',
80
+ type: Number,
81
+ reference: { entity: expect.any(Function) },
82
+ },
83
+ creatorId: {
84
+ name: 'creatorId',
85
+ type: Number,
86
+ reference: { entity: expect.any(Function) },
87
+ },
88
+ createdAt: { name: 'createdAt', type: Number, onInsert: expect.any(Function) },
89
+ updatedAt: { name: 'updatedAt', type: Number, onUpdate: expect.any(Function) },
90
+ picture: { name: 'image', type: String },
91
+ },
92
+ relations: {
93
+ company: {
94
+ cardinality: 'm1',
95
+ entity: expect.any(Function),
96
+ references: [{ local: 'companyId', foreign: 'id' }],
97
+ },
98
+ creator: {
99
+ cardinality: '11',
100
+ entity: expect.any(Function),
101
+ references: [{ local: 'creatorId', foreign: 'id' }],
102
+ },
103
+ },
104
+ };
105
+ expect(meta).toEqual(expectedMeta);
106
+ });
107
+ it('Item', () => {
108
+ const meta = (0, definition_1.getMeta)(test_1.Item);
109
+ const expectedMeta = {
110
+ entity: test_1.Item,
111
+ name: 'Item',
112
+ id: 'id',
113
+ processed: true,
114
+ fields: {
115
+ id: { name: 'id', type: Number, isId: true },
116
+ companyId: {
117
+ name: 'companyId',
118
+ type: Number,
119
+ reference: { entity: expect.any(Function) },
120
+ },
121
+ creatorId: {
122
+ name: 'creatorId',
123
+ type: Number,
124
+ reference: { entity: expect.any(Function) },
125
+ },
126
+ createdAt: { name: 'createdAt', type: Number, onInsert: expect.any(Function) },
127
+ updatedAt: { name: 'updatedAt', type: Number, onUpdate: expect.any(Function) },
128
+ name: { name: 'name', type: String },
129
+ description: { name: 'description', type: String },
130
+ code: { name: 'code', type: String },
131
+ buyLedgerAccountId: {
132
+ name: 'buyLedgerAccountId',
133
+ type: Number,
134
+ reference: { entity: expect.any(Function) },
135
+ },
136
+ saleLedgerAccountId: {
137
+ name: 'saleLedgerAccountId',
138
+ type: Number,
139
+ reference: { entity: expect.any(Function) },
140
+ },
141
+ taxId: {
142
+ name: 'taxId',
143
+ type: Number,
144
+ reference: { entity: expect.any(Function) },
145
+ },
146
+ measureUnitId: {
147
+ name: 'measureUnitId',
148
+ type: Number,
149
+ reference: { entity: expect.any(Function) },
150
+ },
151
+ salePrice: { name: 'salePrice', type: Number },
152
+ inventoryable: { name: 'inventoryable', type: Boolean },
153
+ tagsCount: {
154
+ name: 'tagsCount',
155
+ type: Number,
156
+ virtual: expect.any(util_1.Raw),
157
+ },
158
+ },
159
+ relations: {
160
+ company: {
161
+ cardinality: 'm1',
162
+ entity: expect.any(Function),
163
+ references: [{ local: 'companyId', foreign: 'id' }],
164
+ },
165
+ creator: {
166
+ cardinality: 'm1',
167
+ entity: expect.any(Function),
168
+ references: [{ local: 'creatorId', foreign: 'id' }],
169
+ },
170
+ buyLedgerAccount: {
171
+ cardinality: 'm1',
172
+ entity: expect.any(Function),
173
+ references: [{ local: 'buyLedgerAccountId', foreign: 'id' }],
174
+ },
175
+ saleLedgerAccount: {
176
+ cardinality: 'm1',
177
+ entity: expect.any(Function),
178
+ references: [{ local: 'saleLedgerAccountId', foreign: 'id' }],
179
+ },
180
+ tax: {
181
+ cardinality: 'm1',
182
+ entity: expect.any(Function),
183
+ references: [{ local: 'taxId', foreign: 'id' }],
184
+ },
185
+ measureUnit: {
186
+ cardinality: 'm1',
187
+ entity: expect.any(Function),
188
+ references: [{ local: 'measureUnitId', foreign: 'id' }],
189
+ },
190
+ tags: {
191
+ cardinality: 'mm',
192
+ cascade: true,
193
+ entity: expect.any(Function),
194
+ through: expect.any(Function),
195
+ references: [
196
+ { local: 'itemId', foreign: 'id' },
197
+ { local: 'tagId', foreign: 'id' },
198
+ ],
199
+ },
200
+ },
201
+ };
202
+ expect(meta).toEqual(expectedMeta);
203
+ });
204
+ it('Tag', () => {
205
+ const meta = (0, definition_1.getMeta)(test_1.Tag);
206
+ const expectedMeta = {
207
+ entity: test_1.Tag,
208
+ id: 'id',
209
+ name: 'Tag',
210
+ processed: true,
211
+ fields: {
212
+ id: {
213
+ isId: true,
214
+ name: 'id',
215
+ type: Number,
216
+ },
217
+ companyId: {
218
+ name: 'companyId',
219
+ reference: {
220
+ entity: expect.any(Function),
221
+ },
222
+ type: Number,
223
+ },
224
+ createdAt: {
225
+ name: 'createdAt',
226
+ onInsert: expect.any(Function),
227
+ type: Number,
228
+ },
229
+ name: {
230
+ name: 'name',
231
+ type: String,
232
+ },
233
+ itemsCount: {
234
+ name: 'itemsCount',
235
+ type: Number,
236
+ virtual: {
237
+ alias: undefined,
238
+ value: expect.any(Function),
239
+ },
240
+ },
241
+ updatedAt: {
242
+ name: 'updatedAt',
243
+ onUpdate: expect.any(Function),
244
+ type: Number,
245
+ },
246
+ creatorId: {
247
+ name: 'creatorId',
248
+ reference: {
249
+ entity: expect.any(Function),
250
+ },
251
+ type: Number,
252
+ },
253
+ },
254
+ relations: {
255
+ company: {
256
+ cardinality: 'm1',
257
+ entity: expect.any(Function),
258
+ references: [{ local: 'companyId', foreign: 'id' }],
259
+ },
260
+ items: {
261
+ cardinality: 'mm',
262
+ entity: expect.any(Function),
263
+ mappedBy: 'tags',
264
+ through: expect.any(Function),
265
+ references: [
266
+ { local: 'tagId', foreign: 'id' },
267
+ { local: 'itemId', foreign: 'id' },
268
+ ],
269
+ },
270
+ creator: {
271
+ cardinality: 'm1',
272
+ entity: expect.any(Function),
273
+ references: [{ local: 'creatorId', foreign: 'id' }],
274
+ },
275
+ },
276
+ };
277
+ expect(meta).toEqual(expectedMeta);
278
+ });
279
+ it('ItemTag', () => {
280
+ const meta = (0, definition_1.getMeta)(test_1.ItemTag);
281
+ const expectedMeta = {
282
+ entity: test_1.ItemTag,
283
+ name: 'ItemTag',
284
+ id: 'id',
285
+ processed: true,
286
+ fields: {
287
+ id: { name: 'id', type: Number, isId: true },
288
+ itemId: {
289
+ name: 'itemId',
290
+ type: Number,
291
+ reference: { entity: expect.any(Function) },
292
+ },
293
+ tagId: {
294
+ name: 'tagId',
295
+ type: Number,
296
+ reference: { entity: expect.any(Function) },
297
+ },
298
+ },
299
+ relations: {
300
+ item: {
301
+ cardinality: 'm1',
302
+ entity: expect.any(Function),
303
+ references: [{ local: 'itemId', foreign: 'id' }],
304
+ },
305
+ tag: {
306
+ cardinality: 'm1',
307
+ entity: expect.any(Function),
308
+ references: [{ local: 'tagId', foreign: 'id' }],
309
+ },
310
+ },
311
+ };
312
+ expect(meta).toEqual(expectedMeta);
313
+ });
314
+ it('TaxCategory', () => {
315
+ const meta = (0, definition_1.getMeta)(test_1.TaxCategory);
316
+ const expectedMeta = {
317
+ entity: test_1.TaxCategory,
318
+ name: 'TaxCategory',
319
+ id: 'pk',
320
+ processed: true,
321
+ fields: {
322
+ pk: { name: 'pk', type: String, isId: true, onInsert: expect.any(Function) },
323
+ companyId: {
324
+ name: 'companyId',
325
+ type: Number,
326
+ reference: { entity: expect.any(Function) },
327
+ },
328
+ creatorId: {
329
+ name: 'creatorId',
330
+ type: Number,
331
+ reference: { entity: expect.any(Function) },
332
+ },
333
+ createdAt: { name: 'createdAt', type: Number, onInsert: expect.any(Function) },
334
+ updatedAt: { name: 'updatedAt', type: Number, onUpdate: expect.any(Function) },
335
+ name: { name: 'name', type: String },
336
+ description: { name: 'description', type: String },
337
+ },
338
+ relations: {
339
+ company: {
340
+ cardinality: 'm1',
341
+ entity: expect.any(Function),
342
+ references: [{ local: 'companyId', foreign: 'id' }],
343
+ },
344
+ creator: {
345
+ cardinality: 'm1',
346
+ entity: expect.any(Function),
347
+ references: [{ local: 'creatorId', foreign: 'id' }],
348
+ },
349
+ },
350
+ };
351
+ expect(meta).toEqual(expectedMeta);
352
+ });
353
+ it('Tax', () => {
354
+ const meta = (0, definition_1.getMeta)(test_1.Tax);
355
+ const expectedMeta = {
356
+ entity: test_1.Tax,
357
+ name: 'Tax',
358
+ id: 'id',
359
+ processed: true,
360
+ fields: {
361
+ id: { name: 'id', type: Number, isId: true },
362
+ categoryId: {
363
+ name: 'categoryId',
364
+ reference: {
365
+ entity: expect.any(Function),
366
+ },
367
+ type: String,
368
+ },
369
+ percentage: {
370
+ name: 'percentage',
371
+ type: Number,
372
+ },
373
+ companyId: {
374
+ name: 'companyId',
375
+ type: Number,
376
+ reference: { entity: expect.any(Function) },
377
+ },
378
+ creatorId: {
379
+ name: 'creatorId',
380
+ type: Number,
381
+ reference: { entity: expect.any(Function) },
382
+ },
383
+ createdAt: { name: 'createdAt', type: Number, onInsert: expect.any(Function) },
384
+ updatedAt: { name: 'updatedAt', type: Number, onUpdate: expect.any(Function) },
385
+ name: { name: 'name', type: String },
386
+ description: { name: 'description', type: String },
387
+ },
388
+ relations: {
389
+ category: {
390
+ cardinality: 'm1',
391
+ entity: expect.any(Function),
392
+ references: [
393
+ {
394
+ local: 'categoryId',
395
+ foreign: 'pk',
396
+ },
397
+ ],
398
+ },
399
+ company: {
400
+ cardinality: 'm1',
401
+ entity: expect.any(Function),
402
+ references: [{ local: 'companyId', foreign: 'id' }],
403
+ },
404
+ creator: {
405
+ cardinality: 'm1',
406
+ entity: expect.any(Function),
407
+ references: [{ local: 'creatorId', foreign: 'id' }],
408
+ },
409
+ },
410
+ };
411
+ expect(meta).toEqual(expectedMeta);
412
+ });
413
+ it('ItemAdjustment', () => {
414
+ const meta = (0, definition_1.getMeta)(test_1.ItemAdjustment);
415
+ const expectedMeta = {
416
+ entity: test_1.ItemAdjustment,
417
+ name: 'ItemAdjustment',
418
+ id: 'id',
419
+ processed: true,
420
+ fields: {
421
+ id: { name: 'id', type: Number, isId: true },
422
+ buyPrice: {
423
+ name: 'buyPrice',
424
+ type: Number,
425
+ },
426
+ inventoryAdjustmentId: {
427
+ name: 'inventoryAdjustmentId',
428
+ reference: {
429
+ entity: expect.any(Function),
430
+ },
431
+ type: Number,
432
+ },
433
+ itemId: {
434
+ name: 'itemId',
435
+ reference: {
436
+ entity: expect.any(Function),
437
+ },
438
+ type: Number,
439
+ },
440
+ number: {
441
+ name: 'number',
442
+ type: Number,
443
+ },
444
+ storehouseId: {
445
+ name: 'storehouseId',
446
+ reference: {
447
+ entity: expect.any(Function),
448
+ },
449
+ type: Number,
450
+ },
451
+ companyId: {
452
+ name: 'companyId',
453
+ type: Number,
454
+ reference: { entity: expect.any(Function) },
455
+ },
456
+ creatorId: {
457
+ name: 'creatorId',
458
+ type: Number,
459
+ reference: { entity: expect.any(Function) },
460
+ },
461
+ createdAt: { name: 'createdAt', type: Number, onInsert: expect.any(Function) },
462
+ updatedAt: { name: 'updatedAt', type: Number, onUpdate: expect.any(Function) },
463
+ },
464
+ relations: {
465
+ storehouse: {
466
+ cardinality: 'm1',
467
+ entity: expect.any(Function),
468
+ references: [{ local: 'storehouseId', foreign: 'id' }],
469
+ },
470
+ item: {
471
+ cardinality: 'm1',
472
+ entity: expect.any(Function),
473
+ references: [{ local: 'itemId', foreign: 'id' }],
474
+ },
475
+ company: {
476
+ cardinality: 'm1',
477
+ entity: expect.any(Function),
478
+ references: [{ local: 'companyId', foreign: 'id' }],
479
+ },
480
+ creator: {
481
+ cardinality: 'm1',
482
+ entity: expect.any(Function),
483
+ references: [{ local: 'creatorId', foreign: 'id' }],
484
+ },
485
+ inventoryAdjustment: {
486
+ cardinality: 'm1',
487
+ entity: expect.any(Function),
488
+ references: [
489
+ {
490
+ local: 'inventoryAdjustmentId',
491
+ foreign: 'id',
492
+ },
493
+ ],
494
+ },
495
+ },
496
+ };
497
+ expect(meta).toEqual(expectedMeta);
498
+ });
499
+ it('InventoryAdjustment', () => {
500
+ const meta = (0, definition_1.getMeta)(test_1.InventoryAdjustment);
501
+ const expectedMeta = {
502
+ entity: test_1.InventoryAdjustment,
503
+ name: 'InventoryAdjustment',
504
+ id: 'id',
505
+ processed: true,
506
+ fields: {
507
+ id: { name: 'id', type: Number, isId: true },
508
+ companyId: {
509
+ name: 'companyId',
510
+ type: Number,
511
+ reference: { entity: expect.any(Function) },
512
+ },
513
+ creatorId: {
514
+ name: 'creatorId',
515
+ type: Number,
516
+ reference: { entity: expect.any(Function) },
517
+ },
518
+ createdAt: { name: 'createdAt', type: Number, onInsert: expect.any(Function) },
519
+ updatedAt: { name: 'updatedAt', type: Number, onUpdate: expect.any(Function) },
520
+ description: { name: 'description', type: String },
521
+ date: { name: 'date', type: Date },
522
+ },
523
+ relations: {
524
+ itemAdjustments: {
525
+ cardinality: '1m',
526
+ cascade: true,
527
+ entity: expect.any(Function),
528
+ mappedBy: 'inventoryAdjustment',
529
+ references: [{ local: 'id', foreign: 'inventoryAdjustmentId' }],
530
+ },
531
+ company: {
532
+ cardinality: 'm1',
533
+ entity: expect.any(Function),
534
+ references: [{ local: 'companyId', foreign: 'id' }],
535
+ },
536
+ creator: {
537
+ cardinality: 'm1',
538
+ entity: expect.any(Function),
539
+ references: [{ local: 'creatorId', foreign: 'id' }],
540
+ },
541
+ },
542
+ };
543
+ expect(meta).toEqual(expectedMeta);
544
+ });
545
+ it('MeasureUnitCategory', () => {
546
+ const meta = (0, definition_1.getMeta)(test_1.MeasureUnitCategory);
547
+ const expectedMeta = {
548
+ entity: test_1.MeasureUnitCategory,
549
+ name: 'MeasureUnitCategory',
550
+ id: 'id',
551
+ softDelete: 'deletedAt',
552
+ processed: true,
553
+ fields: {
554
+ id: { name: 'id', type: Number, isId: true },
555
+ name: { name: 'name', type: String },
556
+ companyId: {
557
+ name: 'companyId',
558
+ type: Number,
559
+ reference: { entity: expect.any(Function) },
560
+ },
561
+ creatorId: {
562
+ name: 'creatorId',
563
+ type: Number,
564
+ reference: { entity: expect.any(Function) },
565
+ },
566
+ createdAt: { name: 'createdAt', type: Number, onInsert: expect.any(Function) },
567
+ updatedAt: { name: 'updatedAt', type: Number, onUpdate: expect.any(Function) },
568
+ deletedAt: { name: 'deletedAt', type: Number, onDelete: expect.any(Function) },
569
+ },
570
+ relations: {
571
+ measureUnits: {
572
+ cardinality: '1m',
573
+ entity: expect.any(Function),
574
+ mappedBy: 'category',
575
+ references: [{ local: 'id', foreign: 'categoryId' }],
576
+ },
577
+ company: {
578
+ cardinality: 'm1',
579
+ entity: expect.any(Function),
580
+ references: [{ local: 'companyId', foreign: 'id' }],
581
+ },
582
+ creator: {
583
+ cardinality: 'm1',
584
+ entity: expect.any(Function),
585
+ references: [{ local: 'creatorId', foreign: 'id' }],
586
+ },
587
+ },
588
+ };
589
+ expect(meta).toEqual(expectedMeta);
590
+ });
591
+ it('MeasureUnit', () => {
592
+ const meta = (0, definition_1.getMeta)(test_1.MeasureUnit);
593
+ const expectedMeta = {
594
+ entity: test_1.MeasureUnit,
595
+ name: 'MeasureUnit',
596
+ id: 'id',
597
+ softDelete: 'deletedAt',
598
+ processed: true,
599
+ fields: {
600
+ id: { name: 'id', type: Number, isId: true },
601
+ name: { name: 'name', type: String },
602
+ categoryId: {
603
+ name: 'categoryId',
604
+ type: Number,
605
+ reference: { entity: expect.any(Function) },
606
+ },
607
+ companyId: {
608
+ name: 'companyId',
609
+ type: Number,
610
+ reference: { entity: expect.any(Function) },
611
+ },
612
+ creatorId: {
613
+ name: 'creatorId',
614
+ type: Number,
615
+ reference: { entity: expect.any(Function) },
616
+ },
617
+ createdAt: { name: 'createdAt', type: Number, onInsert: expect.any(Function) },
618
+ updatedAt: { name: 'updatedAt', type: Number, onUpdate: expect.any(Function) },
619
+ deletedAt: { name: 'deletedAt', type: Number, onDelete: expect.any(Function) },
620
+ },
621
+ relations: {
622
+ category: {
623
+ cardinality: 'm1',
624
+ cascade: 'persist',
625
+ entity: expect.any(Function),
626
+ references: [{ local: 'categoryId', foreign: 'id' }],
627
+ },
628
+ company: {
629
+ cardinality: 'm1',
630
+ entity: expect.any(Function),
631
+ references: [{ local: 'companyId', foreign: 'id' }],
632
+ },
633
+ creator: {
634
+ cardinality: 'm1',
635
+ entity: expect.any(Function),
636
+ references: [{ local: 'creatorId', foreign: 'id' }],
637
+ },
638
+ },
639
+ };
640
+ expect(meta).toEqual(expectedMeta);
641
+ });
642
+ it('not an @Entity', () => {
643
+ class SomeClass {
644
+ }
645
+ expect(() => {
646
+ (0, definition_1.getMeta)(SomeClass);
647
+ }).toThrow(`'SomeClass' is not an entity`);
648
+ class AnotherClass {
649
+ }
650
+ expect(() => (0, definition_1.getMeta)(AnotherClass)).toThrow(`'AnotherClass' is not an entity`);
651
+ });
652
+ it('getEntities', () => {
653
+ const entities = (0, definition_1.getEntities)();
654
+ expect(entities.sort()).toEqual([
655
+ test_1.Company,
656
+ test_1.Profile,
657
+ test_1.User,
658
+ test_1.LedgerAccount,
659
+ test_1.TaxCategory,
660
+ test_1.Tax,
661
+ test_1.MeasureUnitCategory,
662
+ test_1.MeasureUnit,
663
+ test_1.Storehouse,
664
+ test_1.Item,
665
+ test_1.Tag,
666
+ test_1.ItemTag,
667
+ test_1.ItemAdjustment,
668
+ test_1.InventoryAdjustment,
669
+ ].sort());
670
+ });
671
+ it('no @Id', () => {
672
+ expect(() => {
673
+ let SomeEntity = class SomeEntity {
674
+ };
675
+ tslib_1.__decorate([
676
+ (0, field_1.Field)(),
677
+ tslib_1.__metadata("design:type", String)
678
+ ], SomeEntity.prototype, "id", void 0);
679
+ SomeEntity = tslib_1.__decorate([
680
+ (0, entity_1.Entity)()
681
+ ], SomeEntity);
682
+ }).toThrow(`'SomeEntity' must have one field decorated with @Id`);
683
+ });
684
+ it('one @Id', () => {
685
+ expect(() => {
686
+ class SomeEntity {
687
+ }
688
+ tslib_1.__decorate([
689
+ (0, id_1.Id)(),
690
+ tslib_1.__metadata("design:type", String)
691
+ ], SomeEntity.prototype, "idOne", void 0);
692
+ tslib_1.__decorate([
693
+ (0, id_1.Id)(),
694
+ tslib_1.__metadata("design:type", String)
695
+ ], SomeEntity.prototype, "idTwo", void 0);
696
+ }).toThrow(`'SomeEntity' must have a single field decorated with @Id`);
697
+ });
698
+ it('no fields', () => {
699
+ expect(() => {
700
+ let SomeEntity = class SomeEntity {
701
+ };
702
+ SomeEntity = tslib_1.__decorate([
703
+ (0, entity_1.Entity)()
704
+ ], SomeEntity);
705
+ }).toThrow(`'SomeEntity' must have fields`);
706
+ });
707
+ it('softDelete onDelete', () => {
708
+ expect(() => {
709
+ let SomeEntity = class SomeEntity {
710
+ };
711
+ tslib_1.__decorate([
712
+ (0, field_1.Field)(),
713
+ tslib_1.__metadata("design:type", String)
714
+ ], SomeEntity.prototype, "id", void 0);
715
+ SomeEntity = tslib_1.__decorate([
716
+ (0, entity_1.Entity)({ softDelete: true })
717
+ ], SomeEntity);
718
+ }).toThrow(`'SomeEntity' must have one field with 'onDelete' to enable 'softDelete'`);
719
+ });
720
+ it('max 1 onDelete', () => {
721
+ expect(() => {
722
+ let SomeEntity = class SomeEntity {
723
+ };
724
+ tslib_1.__decorate([
725
+ (0, field_1.Field)({ onDelete: Date.now }),
726
+ tslib_1.__metadata("design:type", Number)
727
+ ], SomeEntity.prototype, "deletedAt", void 0);
728
+ tslib_1.__decorate([
729
+ (0, field_1.Field)({ onDelete: () => true }),
730
+ tslib_1.__metadata("design:type", Boolean)
731
+ ], SomeEntity.prototype, "deleted", void 0);
732
+ SomeEntity = tslib_1.__decorate([
733
+ (0, entity_1.Entity)({ softDelete: true })
734
+ ], SomeEntity);
735
+ }).toThrow(`'SomeEntity' must have one field with 'onDelete' as maximum`);
736
+ });
737
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VudGl0eS9kZWNvcmF0b3IvZGVmaW5pdGlvbi5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUFxQztBQUNyQyx5Q0Fld0I7QUFDeEIsNkNBQW9EO0FBQ3BELHFDQUFrQztBQUNsQyw2QkFBMEI7QUFDMUIsbUNBQWdDO0FBRWhDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO0lBQ2QsTUFBTSxJQUFJLEdBQUcsSUFBQSxvQkFBTyxFQUFDLFdBQUksQ0FBQyxDQUFDO0lBRTNCLE1BQU0sQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUE4QixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQU8sQ0FBQyxDQUFDO0lBQ3JGLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFPLENBQUMsQ0FBQztJQUN0RCxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFM0YsTUFBTSxDQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQThCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBSSxDQUFDLENBQUM7SUFDbEYsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQUksQ0FBQyxDQUFDO0lBQ25ELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENB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RSxDQUFDO1dBQ3ZCLFVBQVUsQ0FLZjtJQUNILENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0FBQzVFLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5TWV0YSwgUmVmZXJlbmNlT3B0aW9ucyB9IGZyb20gJ0B1cWwvY29yZS90eXBlJztcbmltcG9ydCB7IFJhdyB9IGZyb20gJ0B1cWwvY29yZS91dGlsJztcbmltcG9ydCB7XG4gIFVzZXIsXG4gIEl0ZW0sXG4gIFRheENhdGVnb3J5LFxuICBQcm9maWxlLFxuICBDb21wYW55LFxuICBNZWFzdXJlVW5pdCxcbiAgVGF4LFxuICBMZWRnZXJBY2NvdW50LFxuICBJbnZlbnRvcnlBZGp1c3RtZW50LFxuICBJdGVtQWRqdXN0bWVudCxcbiAgTWVhc3VyZVVuaXRDYXRlZ29yeSxcbiAgU3RvcmVob3VzZSxcbiAgVGFnLFxuICBJdGVtVGFnLFxufSBmcm9tICdAdXFsL2NvcmUvdGVzdCc7XG5pbXBvcnQgeyBnZXRFbnRpdGllcywgZ2V0TWV0YSB9IGZyb20gJy4vZGVmaW5pdGlvbic7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuL2VudGl0eSc7XG5pbXBvcnQgeyBJZCB9IGZyb20gJy4vaWQnO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuL2ZpZWxkJztcblxuaXQoJ1VzZXInLCAoKSA9PiB7XG4gIGNvbnN0IG1ldGEgPSBnZXRNZXRhKFVzZXIpO1xuXG4gIGV4cGVjdCgobWV0YS5maWVsZHMuY29tcGFueUlkLnJlZmVyZW5jZSBhcyBSZWZlcmVuY2VPcHRpb25zKS5lbnRpdHkoKSkudG9CZShDb21wYW55KTtcbiAgZXhwZWN0KG1ldGEucmVsYXRpb25zLmNvbXBhbnkuZW50aXR5KCkpLnRvQmUoQ29tcGFueSk7XG4gIGV4cGVjdChtZXRhLnJlbGF0aW9ucy5jb21wYW55LnJlZmVyZW5jZXMpLnRvRXF1YWwoW3sgbG9jYWw6ICdjb21wYW55SWQnLCBmb3JlaWduOiAnaWQnIH1dKTtcblxuICBleHBlY3QoKG1ldGEuZmllbGRzLmNyZWF0b3JJZC5yZWZlcmVuY2UgYXMgUmVmZXJlbmNlT3B0aW9ucykuZW50aXR5KCkpLnRvQmUoVXNlcik7XG4gIGV4cGVjdChtZXRhLnJlbGF0aW9ucy5jcmVhdG9yLmVudGl0eSgpKS50b0JlKFVzZXIpO1xuICBleHBlY3QobWV0YS5yZWxhdGlvbnMuY3JlYXRvci5yZWZlcmVuY2VzKS50b0VxdWFsKFt7IGxvY2FsOiAnY3JlYXRvcklkJywgZm9yZWlnbjogJ2lkJyB9XSk7XG5cbiAgY29uc3QgZXhwZWN0ZWRNZXRhOiBFbnRpdHlNZXRhPFVzZXI+ID0ge1xuICAgIGVudGl0eTogVXNlcixcbiAgICBuYW1lOiAnVXNlcicsXG4gICAgaWQ6ICdpZCcsXG4gICAgcHJvY2Vzc2VkOiB0cnVlLFxuICAgIGZpZWxkczoge1xuICAgICAgaWQ6IHsgbmFtZTogJ2lkJywgdHlwZTogTnVtYmVyLCBpc0lkOiB0cnVlIH0sXG4gICAgICBjb21wYW55SWQ6IHtcbiAgICAgICAgbmFtZTogJ2NvbXBhbnlJZCcsXG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgcmVmZXJlbmNlOiB7IGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIH0sXG4gICAgICBjcmVhdG9ySWQ6IHtcbiAgICAgICAgbmFtZTogJ2NyZWF0b3JJZCcsXG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgcmVmZXJlbmNlOiB7IGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIH0sXG4gICAgICBjcmVhdGVkQXQ6IHsgbmFtZTogJ2NyZWF0ZWRBdCcsIHR5cGU6IE51bWJlciwgb25JbnNlcnQ6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICB1cGRhdGVkQXQ6IHsgbmFtZTogJ3VwZGF0ZWRBdCcsIHR5cGU6IE51bWJlciwgb25VcGRhdGU6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICBuYW1lOiB7IG5hbWU6ICduYW1lJywgdHlwZTogU3RyaW5nIH0sXG4gICAgICBlbWFpbDogeyBuYW1lOiAnZW1haWwnLCB0eXBlOiBTdHJpbmcgfSxcbiAgICAgIHBhc3N3b3JkOiB7IG5hbWU6ICdwYXNzd29yZCcsIHR5cGU6IFN0cmluZyB9LFxuICAgIH0sXG4gICAgcmVsYXRpb25zOiB7XG4gICAgICBjb21wYW55OiB7XG4gICAgICAgIGNhcmRpbmFsaXR5OiAnbTEnLFxuICAgICAgICBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICAgICByZWZlcmVuY2VzOiBbeyBsb2NhbDogJ2NvbXBhbnlJZCcsIGZvcmVpZ246ICdpZCcgfV0sXG4gICAgICB9LFxuICAgICAgY3JlYXRvcjoge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6ICdjcmVhdG9ySWQnLCBmb3JlaWduOiAnaWQnIH1dLFxuICAgICAgfSxcbiAgICAgIHVzZXJzOiB7XG4gICAgICAgIGNhcmRpbmFsaXR5OiAnMW0nLFxuICAgICAgICBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICAgICBtYXBwZWRCeTogJ2NyZWF0b3InLFxuICAgICAgICByZWZlcmVuY2VzOiBbeyBsb2NhbDogJ2lkJywgZm9yZWlnbjogJ2NyZWF0b3JJZCcgfV0sXG4gICAgICB9LFxuICAgICAgcHJvZmlsZToge1xuICAgICAgICBjYXJkaW5hbGl0eTogJzExJyxcbiAgICAgICAgY2FzY2FkZTogdHJ1ZSxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgbWFwcGVkQnk6ICdjcmVhdG9yJyxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6ICdpZCcsIGZvcmVpZ246ICdjcmVhdG9ySWQnIH1dLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIGV4cGVjdChtZXRhKS50b0VxdWFsKGV4cGVjdGVkTWV0YSk7XG59KTtcblxuaXQoJ1Byb2ZpbGUnLCAoKSA9PiB7XG4gIGNvbnN0IG1ldGEgPSBnZXRNZXRhKFByb2ZpbGUpO1xuICBjb25zdCBleHBlY3RlZE1ldGE6IEVudGl0eU1ldGE8UHJvZmlsZT4gPSB7XG4gICAgZW50aXR5OiBQcm9maWxlLFxuICAgIG5hbWU6ICd1c2VyX3Byb2ZpbGUnLFxuICAgIGlkOiAnaWQnLFxuICAgIHByb2Nlc3NlZDogdHJ1ZSxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGlkOiB7IG5hbWU6ICdwaycsIHR5cGU6IE51bWJlciwgaXNJZDogdHJ1ZSB9LFxuICAgICAgY29tcGFueUlkOiB7XG4gICAgICAgIG5hbWU6ICdjb21wYW55SWQnLFxuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIHJlZmVyZW5jZTogeyBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICB9LFxuICAgICAgY3JlYXRvcklkOiB7XG4gICAgICAgIG5hbWU6ICdjcmVhdG9ySWQnLFxuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIHJlZmVyZW5jZTogeyBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICB9LFxuICAgICAgY3JlYXRlZEF0OiB7IG5hbWU6ICdjcmVhdGVkQXQnLCB0eXBlOiBOdW1iZXIsIG9uSW5zZXJ0OiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgICAgdXBkYXRlZEF0OiB7IG5hbWU6ICd1cGRhdGVkQXQnLCB0eXBlOiBOdW1iZXIsIG9uVXBkYXRlOiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgICAgcGljdHVyZTogeyBuYW1lOiAnaW1hZ2UnLCB0eXBlOiBTdHJpbmcgfSxcbiAgICB9LFxuICAgIHJlbGF0aW9uczoge1xuICAgICAgY29tcGFueToge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6ICdjb21wYW55SWQnLCBmb3JlaWduOiAnaWQnIH1dLFxuICAgICAgfSxcbiAgICAgIGNyZWF0b3I6IHtcbiAgICAgICAgY2FyZGluYWxpdHk6ICcxMScsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFt7IGxvY2FsOiAnY3JlYXRvcklkJywgZm9yZWlnbjogJ2lkJyB9XSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgZXhwZWN0KG1ldGEpLnRvRXF1YWwoZXhwZWN0ZWRNZXRhKTtcbn0pO1xuXG5pdCgnSXRlbScsICgpID0+IHtcbiAgY29uc3QgbWV0YSA9IGdldE1ldGEoSXRlbSk7XG4gIGNvbnN0IGV4cGVjdGVkTWV0YTogRW50aXR5TWV0YTxJdGVtPiA9IHtcbiAgICBlbnRpdHk6IEl0ZW0sXG4gICAgbmFtZTogJ0l0ZW0nLFxuICAgIGlkOiAnaWQnLFxuICAgIHByb2Nlc3NlZDogdHJ1ZSxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGlkOiB7IG5hbWU6ICdpZCcsIHR5cGU6IE51bWJlciwgaXNJZDogdHJ1ZSB9LFxuICAgICAgY29tcGFueUlkOiB7XG4gICAgICAgIG5hbWU6ICdjb21wYW55SWQnLFxuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIHJlZmVyZW5jZTogeyBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICB9LFxuICAgICAgY3JlYXRvcklkOiB7XG4gICAgICAgIG5hbWU6ICdjcmVhdG9ySWQnLFxuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIHJlZmVyZW5jZTogeyBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICB9LFxuICAgICAgY3JlYXRlZEF0OiB7IG5hbWU6ICdjcmVhdGVkQXQnLCB0eXBlOiBOdW1iZXIsIG9uSW5zZXJ0OiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgICAgdXBkYXRlZEF0OiB7IG5hbWU6ICd1cGRhdGVkQXQnLCB0eXBlOiBOdW1iZXIsIG9uVXBkYXRlOiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgICAgbmFtZTogeyBuYW1lOiAnbmFtZScsIHR5cGU6IFN0cmluZyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbmFtZTogJ2Rlc2NyaXB0aW9uJywgdHlwZTogU3RyaW5nIH0sXG4gICAgICBjb2RlOiB7IG5hbWU6ICdjb2RlJywgdHlwZTogU3RyaW5nIH0sXG4gICAgICBidXlMZWRnZXJBY2NvdW50SWQ6IHtcbiAgICAgICAgbmFtZTogJ2J1eUxlZGdlckFjY291bnRJZCcsXG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgcmVmZXJlbmNlOiB7IGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIH0sXG4gICAgICBzYWxlTGVkZ2VyQWNjb3VudElkOiB7XG4gICAgICAgIG5hbWU6ICdzYWxlTGVkZ2VyQWNjb3VudElkJyxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICByZWZlcmVuY2U6IHsgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgICAgfSxcbiAgICAgIHRheElkOiB7XG4gICAgICAgIG5hbWU6ICd0YXhJZCcsXG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgcmVmZXJlbmNlOiB7IGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlVW5pdElkOiB7XG4gICAgICAgIG5hbWU6ICdtZWFzdXJlVW5pdElkJyxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICByZWZlcmVuY2U6IHsgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgICAgfSxcbiAgICAgIHNhbGVQcmljZTogeyBuYW1lOiAnc2FsZVByaWNlJywgdHlwZTogTnVtYmVyIH0sXG4gICAgICBpbnZlbnRvcnlhYmxlOiB7IG5hbWU6ICdpbnZlbnRvcnlhYmxlJywgdHlwZTogQm9vbGVhbiB9LFxuICAgICAgdGFnc0NvdW50OiB7XG4gICAgICAgIG5hbWU6ICd0YWdzQ291bnQnLFxuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIHZpcnR1YWw6IGV4cGVjdC5hbnkoUmF3KSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICByZWxhdGlvbnM6IHtcbiAgICAgIGNvbXBhbnk6IHtcbiAgICAgICAgY2FyZGluYWxpdHk6ICdtMScsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFt7IGxvY2FsOiAnY29tcGFueUlkJywgZm9yZWlnbjogJ2lkJyB9XSxcbiAgICAgIH0sXG4gICAgICBjcmVhdG9yOiB7XG4gICAgICAgIGNhcmRpbmFsaXR5OiAnbTEnLFxuICAgICAgICBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICAgICByZWZlcmVuY2VzOiBbeyBsb2NhbDogJ2NyZWF0b3JJZCcsIGZvcmVpZ246ICdpZCcgfV0sXG4gICAgICB9LFxuICAgICAgYnV5TGVkZ2VyQWNjb3VudDoge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6ICdidXlMZWRnZXJBY2NvdW50SWQnLCBmb3JlaWduOiAnaWQnIH1dLFxuICAgICAgfSxcbiAgICAgIHNhbGVMZWRnZXJBY2NvdW50OiB7XG4gICAgICAgIGNhcmRpbmFsaXR5OiAnbTEnLFxuICAgICAgICBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICAgICByZWZlcmVuY2VzOiBbeyBsb2NhbDogJ3NhbGVMZWRnZXJBY2NvdW50SWQnLCBmb3JlaWduOiAnaWQnIH1dLFxuICAgICAgfSxcbiAgICAgIHRheDoge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6ICd0YXhJZCcsIGZvcmVpZ246ICdpZCcgfV0sXG4gICAgICB9LFxuICAgICAgbWVhc3VyZVVuaXQ6IHtcbiAgICAgICAgY2FyZGluYWxpdHk6ICdtMScsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFt7IGxvY2FsOiAnbWVhc3VyZVVuaXRJZCcsIGZvcmVpZ246ICdpZCcgfV0sXG4gICAgICB9LFxuICAgICAgdGFnczoge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ21tJyxcbiAgICAgICAgY2FzY2FkZTogdHJ1ZSxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgdGhyb3VnaDogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFtcbiAgICAgICAgICB7IGxvY2FsOiAnaXRlbUlkJywgZm9yZWlnbjogJ2lkJyB9LFxuICAgICAgICAgIHsgbG9jYWw6ICd0YWdJZCcsIGZvcmVpZ246ICdpZCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgZXhwZWN0KG1ldGEpLnRvRXF1YWwoZXhwZWN0ZWRNZXRhKTtcbn0pO1xuXG5pdCgnVGFnJywgKCkgPT4ge1xuICBjb25zdCBtZXRhID0gZ2V0TWV0YShUYWcpO1xuICBjb25zdCBleHBlY3RlZE1ldGE6IEVudGl0eU1ldGE8VGFnPiA9IHtcbiAgICBlbnRpdHk6IFRhZyxcbiAgICBpZDogJ2lkJyxcbiAgICBuYW1lOiAnVGFnJyxcbiAgICBwcm9jZXNzZWQ6IHRydWUsXG4gICAgZmllbGRzOiB7XG4gICAgICBpZDoge1xuICAgICAgICBpc0lkOiB0cnVlLFxuICAgICAgICBuYW1lOiAnaWQnLFxuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICB9LFxuICAgICAgY29tcGFueUlkOiB7XG4gICAgICAgIG5hbWU6ICdjb21wYW55SWQnLFxuICAgICAgICByZWZlcmVuY2U6IHtcbiAgICAgICAgICBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICB9LFxuICAgICAgY3JlYXRlZEF0OiB7XG4gICAgICAgIG5hbWU6ICdjcmVhdGVkQXQnLFxuICAgICAgICBvbkluc2VydDogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIH0sXG4gICAgICBuYW1lOiB7XG4gICAgICAgIG5hbWU6ICduYW1lJyxcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgfSxcbiAgICAgIGl0ZW1zQ291bnQ6IHtcbiAgICAgICAgbmFtZTogJ2l0ZW1zQ291bnQnLFxuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIHZpcnR1YWw6IHtcbiAgICAgICAgICBhbGlhczogdW5kZWZpbmVkLFxuICAgICAgICAgIHZhbHVlOiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB1cGRhdGVkQXQ6IHtcbiAgICAgICAgbmFtZTogJ3VwZGF0ZWRBdCcsXG4gICAgICAgIG9uVXBkYXRlOiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgfSxcbiAgICAgIGNyZWF0b3JJZDoge1xuICAgICAgICBuYW1lOiAnY3JlYXRvcklkJyxcbiAgICAgICAgcmVmZXJlbmNlOiB7XG4gICAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlbGF0aW9uczoge1xuICAgICAgY29tcGFueToge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6ICdjb21wYW55SWQnLCBmb3JlaWduOiAnaWQnIH1dLFxuICAgICAgfSxcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIGNhcmRpbmFsaXR5OiAnbW0nLFxuICAgICAgICBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICAgICBtYXBwZWRCeTogJ3RhZ3MnLFxuICAgICAgICB0aHJvdWdoOiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgcmVmZXJlbmNlczogW1xuICAgICAgICAgIHsgbG9jYWw6ICd0YWdJZCcsIGZvcmVpZ246ICdpZCcgfSxcbiAgICAgICAgICB7IGxvY2FsOiAnaXRlbUlkJywgZm9yZWlnbjogJ2lkJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIGNyZWF0b3I6IHtcbiAgICAgICAgY2FyZGluYWxpdHk6ICdtMScsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFt7IGxvY2FsOiAnY3JlYXRvcklkJywgZm9yZWlnbjogJ2lkJyB9XSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgZXhwZWN0KG1ldGEpLnRvRXF1YWwoZXhwZWN0ZWRNZXRhKTtcbn0pO1xuXG5pdCgnSXRlbVRhZycsICgpID0+IHtcbiAgY29uc3QgbWV0YSA9IGdldE1ldGEoSXRlbVRhZyk7XG4gIGNvbnN0IGV4cGVjdGVkTWV0YTogRW50aXR5TWV0YTxJdGVtVGFnPiA9IHtcbiAgICBlbnRpdHk6IEl0ZW1UYWcsXG4gICAgbmFtZTogJ0l0ZW1UYWcnLFxuICAgIGlkOiAnaWQnLFxuICAgIHByb2Nlc3NlZDogdHJ1ZSxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGlkOiB7IG5hbWU6ICdpZCcsIHR5cGU6IE51bWJlciwgaXNJZDogdHJ1ZSB9LFxuICAgICAgaXRlbUlkOiB7XG4gICAgICAgIG5hbWU6ICdpdGVtSWQnLFxuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIHJlZmVyZW5jZTogeyBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICB9LFxuICAgICAgdGFnSWQ6IHtcbiAgICAgICAgbmFtZTogJ3RhZ0lkJyxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICByZWZlcmVuY2U6IHsgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlbGF0aW9uczoge1xuICAgICAgaXRlbToge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6ICdpdGVtSWQnLCBmb3JlaWduOiAnaWQnIH1dLFxuICAgICAgfSxcbiAgICAgIHRhZzoge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6ICd0YWdJZCcsIGZvcmVpZ246ICdpZCcgfV0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIGV4cGVjdChtZXRhKS50b0VxdWFsKGV4cGVjdGVkTWV0YSk7XG59KTtcblxuaXQoJ1RheENhdGVnb3J5JywgKCkgPT4ge1xuICBjb25zdCBtZXRhID0gZ2V0TWV0YShUYXhDYXRlZ29yeSk7XG4gIGNvbnN0IGV4cGVjdGVkTWV0YTogRW50aXR5TWV0YTxUYXhDYXRlZ29yeT4gPSB7XG4gICAgZW50aXR5OiBUYXhDYXRlZ29yeSxcbiAgICBuYW1lOiAnVGF4Q2F0ZWdvcnknLFxuICAgIGlkOiAncGsnLFxuICAgIHByb2Nlc3NlZDogdHJ1ZSxcbiAgICBmaWVsZHM6IHtcbiAgICAgIHBrOiB7IG5hbWU6ICdwaycsIHR5cGU6IFN0cmluZywgaXNJZDogdHJ1ZSwgb25JbnNlcnQ6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICBjb21wYW55SWQ6IHtcbiAgICAgICAgbmFtZTogJ2NvbXBhbnlJZCcsXG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgcmVmZXJlbmNlOiB7IGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIH0sXG4gICAgICBjcmVhdG9ySWQ6IHtcbiAgICAgICAgbmFtZTogJ2NyZWF0b3JJZCcsXG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgcmVmZXJlbmNlOiB7IGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIH0sXG4gICAgICBjcmVhdGVkQXQ6IHsgbmFtZTogJ2NyZWF0ZWRBdCcsIHR5cGU6IE51bWJlciwgb25JbnNlcnQ6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICB1cGRhdGVkQXQ6IHsgbmFtZTogJ3VwZGF0ZWRBdCcsIHR5cGU6IE51bWJlciwgb25VcGRhdGU6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICBuYW1lOiB7IG5hbWU6ICduYW1lJywgdHlwZTogU3RyaW5nIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBuYW1lOiAnZGVzY3JpcHRpb24nLCB0eXBlOiBTdHJpbmcgfSxcbiAgICB9LFxuICAgIHJlbGF0aW9uczoge1xuICAgICAgY29tcGFueToge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6ICdjb21wYW55SWQnLCBmb3JlaWduOiAnaWQnIH1dLFxuICAgICAgfSxcbiAgICAgIGNyZWF0b3I6IHtcbiAgICAgICAgY2FyZGluYWxpdHk6ICdtMScsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFt7IGxvY2FsOiAnY3JlYXRvcklkJywgZm9yZWlnbjogJ2lkJyB9XSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgZXhwZWN0KG1ldGEpLnRvRXF1YWwoZXhwZWN0ZWRNZXRhKTtcbn0pO1xuXG5pdCgnVGF4JywgKCkgPT4ge1xuICBjb25zdCBtZXRhID0gZ2V0TWV0YShUYXgpO1xuICBjb25zdCBleHBlY3RlZE1ldGE6IEVudGl0eU1ldGE8VGF4PiA9IHtcbiAgICBlbnRpdHk6IFRheCxcbiAgICBuYW1lOiAnVGF4JyxcbiAgICBpZDogJ2lkJyxcbiAgICBwcm9jZXNzZWQ6IHRydWUsXG4gICAgZmllbGRzOiB7XG4gICAgICBpZDogeyBuYW1lOiAnaWQnLCB0eXBlOiBOdW1iZXIsIGlzSWQ6IHRydWUgfSxcbiAgICAgIGNhdGVnb3J5SWQ6IHtcbiAgICAgICAgbmFtZTogJ2NhdGVnb3J5SWQnLFxuICAgICAgICByZWZlcmVuY2U6IHtcbiAgICAgICAgICBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB9LFxuICAgICAgcGVyY2VudGFnZToge1xuICAgICAgICBuYW1lOiAncGVyY2VudGFnZScsXG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIH0sXG4gICAgICBjb21wYW55SWQ6IHtcbiAgICAgICAgbmFtZTogJ2NvbXBhbnlJZCcsXG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgcmVmZXJlbmNlOiB7IGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIH0sXG4gICAgICBjcmVhdG9ySWQ6IHtcbiAgICAgICAgbmFtZTogJ2NyZWF0b3JJZCcsXG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgcmVmZXJlbmNlOiB7IGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIH0sXG4gICAgICBjcmVhdGVkQXQ6IHsgbmFtZTogJ2NyZWF0ZWRBdCcsIHR5cGU6IE51bWJlciwgb25JbnNlcnQ6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICB1cGRhdGVkQXQ6IHsgbmFtZTogJ3VwZGF0ZWRBdCcsIHR5cGU6IE51bWJlciwgb25VcGRhdGU6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICBuYW1lOiB7IG5hbWU6ICduYW1lJywgdHlwZTogU3RyaW5nIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBuYW1lOiAnZGVzY3JpcHRpb24nLCB0eXBlOiBTdHJpbmcgfSxcbiAgICB9LFxuICAgIHJlbGF0aW9uczoge1xuICAgICAgY2F0ZWdvcnk6IHtcbiAgICAgICAgY2FyZGluYWxpdHk6ICdtMScsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsb2NhbDogJ2NhdGVnb3J5SWQnLFxuICAgICAgICAgICAgZm9yZWlnbjogJ3BrJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIGNvbXBhbnk6IHtcbiAgICAgICAgY2FyZGluYWxpdHk6ICdtMScsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFt7IGxvY2FsOiAnY29tcGFueUlkJywgZm9yZWlnbjogJ2lkJyB9XSxcbiAgICAgIH0sXG4gICAgICBjcmVhdG9yOiB7XG4gICAgICAgIGNhcmRpbmFsaXR5OiAnbTEnLFxuICAgICAgICBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICAgICByZWZlcmVuY2VzOiBbeyBsb2NhbDogJ2NyZWF0b3JJZCcsIGZvcmVpZ246ICdpZCcgfV0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIGV4cGVjdChtZXRhKS50b0VxdWFsKGV4cGVjdGVkTWV0YSk7XG59KTtcblxuaXQoJ0l0ZW1BZGp1c3RtZW50JywgKCkgPT4ge1xuICBjb25zdCBtZXRhID0gZ2V0TWV0YShJdGVtQWRqdXN0bWVudCk7XG4gIGNvbnN0IGV4cGVjdGVkTWV0YTogRW50aXR5TWV0YTxJdGVtQWRqdXN0bWVudD4gPSB7XG4gICAgZW50aXR5OiBJdGVtQWRqdXN0bWVudCxcbiAgICBuYW1lOiAnSXRlbUFkanVzdG1lbnQnLFxuICAgIGlkOiAnaWQnLFxuICAgIHByb2Nlc3NlZDogdHJ1ZSxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGlkOiB7IG5hbWU6ICdpZCcsIHR5cGU6IE51bWJlciwgaXNJZDogdHJ1ZSB9LFxuICAgICAgYnV5UHJpY2U6IHtcbiAgICAgICAgbmFtZTogJ2J1eVByaWNlJyxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgfSxcbiAgICAgIGludmVudG9yeUFkanVzdG1lbnRJZDoge1xuICAgICAgICBuYW1lOiAnaW52ZW50b3J5QWRqdXN0bWVudElkJyxcbiAgICAgICAgcmVmZXJlbmNlOiB7XG4gICAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgfSxcbiAgICAgIGl0ZW1JZDoge1xuICAgICAgICBuYW1lOiAnaXRlbUlkJyxcbiAgICAgICAgcmVmZXJlbmNlOiB7XG4gICAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgfSxcbiAgICAgIG51bWJlcjoge1xuICAgICAgICBuYW1lOiAnbnVtYmVyJyxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgfSxcbiAgICAgIHN0b3JlaG91c2VJZDoge1xuICAgICAgICBuYW1lOiAnc3RvcmVob3VzZUlkJyxcbiAgICAgICAgcmVmZXJlbmNlOiB7XG4gICAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgfSxcbiAgICAgIGNvbXBhbnlJZDoge1xuICAgICAgICBuYW1lOiAnY29tcGFueUlkJyxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICByZWZlcmVuY2U6IHsgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgICAgfSxcbiAgICAgIGNyZWF0b3JJZDoge1xuICAgICAgICBuYW1lOiAnY3JlYXRvcklkJyxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICByZWZlcmVuY2U6IHsgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgICAgfSxcbiAgICAgIGNyZWF0ZWRBdDogeyBuYW1lOiAnY3JlYXRlZEF0JywgdHlwZTogTnVtYmVyLCBvbkluc2VydDogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIHVwZGF0ZWRBdDogeyBuYW1lOiAndXBkYXRlZEF0JywgdHlwZTogTnVtYmVyLCBvblVwZGF0ZTogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICB9LFxuICAgIHJlbGF0aW9uczoge1xuICAgICAgc3RvcmVob3VzZToge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6ICdzdG9yZWhvdXNlSWQnLCBmb3JlaWduOiAnaWQnIH1dLFxuICAgICAgfSxcbiAgICAgIGl0ZW06IHtcbiAgICAgICAgY2FyZGluYWxpdHk6ICdtMScsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFt7IGxvY2FsOiAnaXRlbUlkJywgZm9yZWlnbjogJ2lkJyB9XSxcbiAgICAgIH0sXG4gICAgICBjb21wYW55OiB7XG4gICAgICAgIGNhcmRpbmFsaXR5OiAnbTEnLFxuICAgICAgICBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICAgICByZWZlcmVuY2VzOiBbeyBsb2NhbDogJ2NvbXBhbnlJZCcsIGZvcmVpZ246ICdpZCcgfV0sXG4gICAgICB9LFxuICAgICAgY3JlYXRvcjoge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6ICdjcmVhdG9ySWQnLCBmb3JlaWduOiAnaWQnIH1dLFxuICAgICAgfSxcbiAgICAgIGludmVudG9yeUFkanVzdG1lbnQ6IHtcbiAgICAgICAgY2FyZGluYWxpdHk6ICdtMScsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsb2NhbDogJ2ludmVudG9yeUFkanVzdG1lbnRJZCcsXG4gICAgICAgICAgICBmb3JlaWduOiAnaWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIGV4cGVjdChtZXRhKS50b0VxdWFsKGV4cGVjdGVkTWV0YSk7XG59KTtcblxuaXQoJ0ludmVudG9yeUFkanVzdG1lbnQnLCAoKSA9PiB7XG4gIGNvbnN0IG1ldGEgPSBnZXRNZXRhKEludmVudG9yeUFkanVzdG1lbnQpO1xuICBjb25zdCBleHBlY3RlZE1ldGE6IEVudGl0eU1ldGE8SW52ZW50b3J5QWRqdXN0bWVudD4gPSB7XG4gICAgZW50aXR5OiBJbnZlbnRvcnlBZGp1c3RtZW50LFxuICAgIG5hbWU6ICdJbnZlbnRvcnlBZGp1c3RtZW50JyxcbiAgICBpZDogJ2lkJyxcbiAgICBwcm9jZXNzZWQ6IHRydWUsXG4gICAgZmllbGRzOiB7XG4gICAgICBpZDogeyBuYW1lOiAnaWQnLCB0eXBlOiBOdW1iZXIsIGlzSWQ6IHRydWUgfSxcbiAgICAgIGNvbXBhbnlJZDoge1xuICAgICAgICBuYW1lOiAnY29tcGFueUlkJyxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICByZWZlcmVuY2U6IHsgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgICAgfSxcbiAgICAgIGNyZWF0b3JJZDoge1xuICAgICAgICBuYW1lOiAnY3JlYXRvcklkJyxcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICByZWZlcmVuY2U6IHsgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgICAgfSxcbiAgICAgIGNyZWF0ZWRBdDogeyBuYW1lOiAnY3JlYXRlZEF0JywgdHlwZTogTnVtYmVyLCBvbkluc2VydDogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIHVwZGF0ZWRBdDogeyBuYW1lOiAndXBkYXRlZEF0JywgdHlwZTogTnVtYmVyLCBvblVwZGF0ZTogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IG5hbWU6ICdkZXNjcmlwdGlvbicsIHR5cGU6IFN0cmluZyB9LFxuICAgICAgZGF0ZTogeyBuYW1lOiAnZGF0ZScsIHR5cGU6IERhdGUgfSxcbiAgICB9LFxuICAgIHJlbGF0aW9uczoge1xuICAgICAgaXRlbUFkanVzdG1lbnRzOiB7XG4gICAgICAgIGNhcmRpbmFsaXR5OiAnMW0nLFxuICAgICAgICBjYXNjYWRlOiB0cnVlLFxuICAgICAgICBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICAgICBtYXBwZWRCeTogJ2ludmVudG9yeUFkanVzdG1lbnQnLFxuICAgICAgICByZWZlcmVuY2VzOiBbeyBsb2NhbDogJ2lkJywgZm9yZWlnbjogJ2ludmVudG9yeUFkanVzdG1lbnRJZCcgfV0sXG4gICAgICB9LFxuICAgICAgY29tcGFueToge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6ICdjb21wYW55SWQnLCBmb3JlaWduOiAnaWQnIH1dLFxuICAgICAgfSxcbiAgICAgIGNyZWF0b3I6IHtcbiAgICAgICAgY2FyZGluYWxpdHk6ICdtMScsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFt7IGxvY2FsOiAnY3JlYXRvcklkJywgZm9yZWlnbjogJ2lkJyB9XSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgZXhwZWN0KG1ldGEpLnRvRXF1YWwoZXhwZWN0ZWRNZXRhKTtcbn0pO1xuXG5pdCgnTWVhc3VyZVVuaXRDYXRlZ29yeScsICgpID0+IHtcbiAgY29uc3QgbWV0YSA9IGdldE1ldGEoTWVhc3VyZVVuaXRDYXRlZ29yeSk7XG4gIGNvbnN0IGV4cGVjdGVkTWV0YTogRW50aXR5TWV0YTxNZWFzdXJlVW5pdENhdGVnb3J5PiA9IHtcbiAgICBlbnRpdHk6IE1lYXN1cmVVbml0Q2F0ZWdvcnksXG4gICAgbmFtZTogJ01lYXN1cmVVbml0Q2F0ZWdvcnknLFxuICAgIGlkOiAnaWQnLFxuICAgIHNvZnREZWxldGU6ICdkZWxldGVkQXQnLFxuICAgIHByb2Nlc3NlZDogdHJ1ZSxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGlkOiB7IG5hbWU6ICdpZCcsIHR5cGU6IE51bWJlciwgaXNJZDogdHJ1ZSB9LFxuICAgICAgbmFtZTogeyBuYW1lOiAnbmFtZScsIHR5cGU6IFN0cmluZyB9LFxuICAgICAgY29tcGFueUlkOiB7XG4gICAgICAgIG5hbWU6ICdjb21wYW55SWQnLFxuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIHJlZmVyZW5jZTogeyBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICB9LFxuICAgICAgY3JlYXRvcklkOiB7XG4gICAgICAgIG5hbWU6ICdjcmVhdG9ySWQnLFxuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIHJlZmVyZW5jZTogeyBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICB9LFxuICAgICAgY3JlYXRlZEF0OiB7IG5hbWU6ICdjcmVhdGVkQXQnLCB0eXBlOiBOdW1iZXIsIG9uSW5zZXJ0OiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgICAgdXBkYXRlZEF0OiB7IG5hbWU6ICd1cGRhdGVkQXQnLCB0eXBlOiBOdW1iZXIsIG9uVXBkYXRlOiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgICAgZGVsZXRlZEF0OiB7IG5hbWU6ICdkZWxldGVkQXQnLCB0eXBlOiBOdW1iZXIsIG9uRGVsZXRlOiBleHBlY3QuYW55KEZ1bmN0aW9uKSB9LFxuICAgIH0sXG4gICAgcmVsYXRpb25zOiB7XG4gICAgICBtZWFzdXJlVW5pdHM6IHtcbiAgICAgICAgY2FyZGluYWxpdHk6ICcxbScsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIG1hcHBlZEJ5OiAnY2F0ZWdvcnknLFxuICAgICAgICByZWZlcmVuY2VzOiBbeyBsb2NhbDogJ2lkJywgZm9yZWlnbjogJ2NhdGVnb3J5SWQnIH1dLFxuICAgICAgfSxcbiAgICAgIGNvbXBhbnk6IHtcbiAgICAgICAgY2FyZGluYWxpdHk6ICdtMScsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFt7IGxvY2FsOiAnY29tcGFueUlkJywgZm9yZWlnbjogJ2lkJyB9XSxcbiAgICAgIH0sXG4gICAgICBjcmVhdG9yOiB7XG4gICAgICAgIGNhcmRpbmFsaXR5OiAnbTEnLFxuICAgICAgICBlbnRpdHk6IGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICAgICByZWZlcmVuY2VzOiBbeyBsb2NhbDogJ2NyZWF0b3JJZCcsIGZvcmVpZ246ICdpZCcgfV0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIGV4cGVjdChtZXRhKS50b0VxdWFsKGV4cGVjdGVkTWV0YSk7XG59KTtcblxuaXQoJ01lYXN1cmVVbml0JywgKCkgPT4ge1xuICBjb25zdCBtZXRhID0gZ2V0TWV0YShNZWFzdXJlVW5pdCk7XG4gIGNvbnN0IGV4cGVjdGVkTWV0YTogRW50aXR5TWV0YTxNZWFzdXJlVW5pdD4gPSB7XG4gICAgZW50aXR5OiBNZWFzdXJlVW5pdCxcbiAgICBuYW1lOiAnTWVhc3VyZVVuaXQnLFxuICAgIGlkOiAnaWQnLFxuICAgIHNvZnREZWxldGU6ICdkZWxldGVkQXQnLFxuICAgIHByb2Nlc3NlZDogdHJ1ZSxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGlkOiB7IG5hbWU6ICdpZCcsIHR5cGU6IE51bWJlciwgaXNJZDogdHJ1ZSB9LFxuICAgICAgbmFtZTogeyBuYW1lOiAnbmFtZScsIHR5cGU6IFN0cmluZyB9LFxuICAgICAgY2F0ZWdvcnlJZDoge1xuICAgICAgICBuYW1lOiAnY2F0ZWdvcnlJZCcsXG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgcmVmZXJlbmNlOiB7IGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIH0sXG4gICAgICBjb21wYW55SWQ6IHtcbiAgICAgICAgbmFtZTogJ2NvbXBhbnlJZCcsXG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgcmVmZXJlbmNlOiB7IGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIH0sXG4gICAgICBjcmVhdG9ySWQ6IHtcbiAgICAgICAgbmFtZTogJ2NyZWF0b3JJZCcsXG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgcmVmZXJlbmNlOiB7IGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbikgfSxcbiAgICAgIH0sXG4gICAgICBjcmVhdGVkQXQ6IHsgbmFtZTogJ2NyZWF0ZWRBdCcsIHR5cGU6IE51bWJlciwgb25JbnNlcnQ6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICB1cGRhdGVkQXQ6IHsgbmFtZTogJ3VwZGF0ZWRBdCcsIHR5cGU6IE51bWJlciwgb25VcGRhdGU6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgICBkZWxldGVkQXQ6IHsgbmFtZTogJ2RlbGV0ZWRBdCcsIHR5cGU6IE51bWJlciwgb25EZWxldGU6IGV4cGVjdC5hbnkoRnVuY3Rpb24pIH0sXG4gICAgfSxcbiAgICByZWxhdGlvbnM6IHtcbiAgICAgIGNhdGVnb3J5OiB7XG4gICAgICAgIGNhcmRpbmFsaXR5OiAnbTEnLFxuICAgICAgICBjYXNjYWRlOiAncGVyc2lzdCcsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFt7IGxvY2FsOiAnY2F0ZWdvcnlJZCcsIGZvcmVpZ246ICdpZCcgfV0sXG4gICAgICB9LFxuICAgICAgY29tcGFueToge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgZW50aXR5OiBleHBlY3QuYW55KEZ1bmN0aW9uKSxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6ICdjb21wYW55SWQnLCBmb3JlaWduOiAnaWQnIH1dLFxuICAgICAgfSxcbiAgICAgIGNyZWF0b3I6IHtcbiAgICAgICAgY2FyZGluYWxpdHk6ICdtMScsXG4gICAgICAgIGVudGl0eTogZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIHJlZmVyZW5jZXM6IFt7IGxvY2FsOiAnY3JlYXRvcklkJywgZm9yZWlnbjogJ2lkJyB9XSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgZXhwZWN0KG1ldGEpLnRvRXF1YWwoZXhwZWN0ZWRNZXRhKTtcbn0pO1xuXG5pdCgnbm90IGFuIEBFbnRpdHknLCAoKSA9PiB7XG4gIGNsYXNzIFNvbWVDbGFzcyB7fVxuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZ2V0TWV0YShTb21lQ2xhc3MpO1xuICB9KS50b1Rocm93KGAnU29tZUNsYXNzJyBpcyBub3QgYW4gZW50aXR5YCk7XG5cbiAgY2xhc3MgQW5vdGhlckNsYXNzIHtcbiAgICBpZDogc3RyaW5nO1xuICB9XG5cbiAgZXhwZWN0KCgpID0+IGdldE1ldGEoQW5vdGhlckNsYXNzKSkudG9UaHJvdyhgJ0Fub3RoZXJDbGFzcycgaXMgbm90IGFuIGVudGl0eWApO1xufSk7XG5cbml0KCdnZXRFbnRpdGllcycsICgpID0+IHtcbiAgY29uc3QgZW50aXRpZXMgPSBnZXRFbnRpdGllcygpO1xuICBleHBlY3QoZW50aXRpZXMuc29ydCgpKS50b0VxdWFsKFxuICAgIFtcbiAgICAgIENvbXBhbnksXG4gICAgICBQcm9maWxlLFxuICAgICAgVXNlcixcbiAgICAgIExlZGdlckFjY291bnQsXG4gICAgICBUYXhDYXRlZ29yeSxcbiAgICAgIFRheCxcbiAgICAgIE1lYXN1cmVVbml0Q2F0ZWdvcnksXG4gICAgICBNZWFzdXJlVW5pdCxcbiAgICAgIFN0b3JlaG91c2UsXG4gICAgICBJdGVtLFxuICAgICAgVGFnLFxuICAgICAgSXRlbVRhZyxcbiAgICAgIEl0ZW1BZGp1c3RtZW50LFxuICAgICAgSW52ZW50b3J5QWRqdXN0bWVudCxcbiAgICBdLnNvcnQoKVxuICApO1xufSk7XG5cbml0KCdubyBASWQnLCAoKSA9PiB7XG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgQEVudGl0eSgpXG4gICAgY2xhc3MgU29tZUVudGl0eSB7XG4gICAgICBARmllbGQoKVxuICAgICAgaWQ6IHN0cmluZztcbiAgICB9XG4gIH0pLnRvVGhyb3coYCdTb21lRW50aXR5JyBtdXN0IGhhdmUgb25lIGZpZWxkIGRlY29yYXRlZCB3aXRoIEBJZGApO1xufSk7XG5cbml0KCdvbmUgQElkJywgKCkgPT4ge1xuICBleHBlY3QoKCkgPT4ge1xuICAgIGNsYXNzIFNvbWVFbnRpdHkge1xuICAgICAgQElkKClcbiAgICAgIGlkT25lOiBzdHJpbmc7XG4gICAgICBASWQoKVxuICAgICAgaWRUd286IHN0cmluZztcbiAgICB9XG4gIH0pLnRvVGhyb3coYCdTb21lRW50aXR5JyBtdXN0IGhhdmUgYSBzaW5nbGUgZmllbGQgZGVjb3JhdGVkIHdpdGggQElkYCk7XG59KTtcblxuaXQoJ25vIGZpZWxkcycsICgpID0+IHtcbiAgZXhwZWN0KCgpID0+IHtcbiAgICBARW50aXR5KClcbiAgICBjbGFzcyBTb21lRW50aXR5IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgfVxuICB9KS50b1Rocm93KGAnU29tZUVudGl0eScgbXVzdCBoYXZlIGZpZWxkc2ApO1xufSk7XG5cbml0KCdzb2Z0RGVsZXRlIG9uRGVsZXRlJywgKCkgPT4ge1xuICBleHBlY3QoKCkgPT4ge1xuICAgIEBFbnRpdHkoeyBzb2Z0RGVsZXRlOiB0cnVlIH0pXG4gICAgY2xhc3MgU29tZUVudGl0eSB7XG4gICAgICBARmllbGQoKVxuICAgICAgaWQ6IHN0cmluZztcbiAgICB9XG4gIH0pLnRvVGhyb3coYCdTb21lRW50aXR5JyBtdXN0IGhhdmUgb25lIGZpZWxkIHdpdGggJ29uRGVsZXRlJyB0byBlbmFibGUgJ3NvZnREZWxldGUnYCk7XG59KTtcblxuaXQoJ21heCAxIG9uRGVsZXRlJywgKCkgPT4ge1xuICBleHBlY3QoKCkgPT4ge1xuICAgIEBFbnRpdHkoeyBzb2Z0RGVsZXRlOiB0cnVlIH0pXG4gICAgY2xhc3MgU29tZUVudGl0eSB7XG4gICAgICBARmllbGQoeyBvbkRlbGV0ZTogRGF0ZS5ub3cgfSlcbiAgICAgIGRlbGV0ZWRBdDogbnVtYmVyO1xuICAgICAgQEZpZWxkKHsgb25EZWxldGU6ICgpID0+IHRydWUgfSlcbiAgICAgIGRlbGV0ZWQ6IGJvb2xlYW47XG4gICAgfVxuICB9KS50b1Rocm93KGAnU29tZUVudGl0eScgbXVzdCBoYXZlIG9uZSBmaWVsZCB3aXRoICdvbkRlbGV0ZScgYXMgbWF4aW11bWApO1xufSk7XG4iXX0=