db-wrapper 0.0.7 → 0.0.9

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.
@@ -1,779 +1,410 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { InjectionToken } from '@angular/core';
7
- import { WindowService } from './window.service';
8
- export class DbWrapperService {
9
- /**
10
- * @param {?} dbConfig
11
- * @param {?=} dbSchema
12
- */
13
- constructor(dbConfig, dbSchema) {
14
- this._dbName = dbConfig.dbName;
15
- this._location = dbConfig.location || 'default';
16
- this._iosDatabaseLocation = dbConfig.iosDatabaseLocation || 'Library';
17
- /** @type {?} */
18
- const window = (new WindowService()).nativeWindow;
19
- if (dbSchema) {
20
- this.schema = dbSchema;
21
- }
22
- this._readyPromise = new Promise((/**
23
- * @param {?} resolve
24
- * @param {?} reject
25
- * @return {?}
26
- */
27
- (resolve, reject) => {
28
- if (typeof window.cordova === 'undefined') {
29
- setTimeout((/**
30
- * @return {?}
31
- */
32
- () => {
33
- this.init(dbSchema).then((/**
34
- * @return {?}
35
- */
36
- () => {
37
- resolve();
38
- }))
39
- .catch((/**
40
- * @param {?} err
41
- * @return {?}
42
- */
43
- (err) => {
44
- reject(err);
45
- }));
46
- }), 500);
47
- }
48
- else {
49
- document.addEventListener('deviceready', (/**
50
- * @return {?}
51
- */
52
- () => {
53
- console.log('dbWrapper: device ready.');
54
- this.initDevice(dbSchema).then((/**
55
- * @return {?}
56
- */
57
- () => resolve())).catch((/**
58
- * @param {?} err
59
- * @return {?}
60
- */
61
- (err) => reject(err)));
62
- }));
63
- }
64
- }));
65
- }
66
- /**
67
- * @return {?}
68
- */
69
- ready() {
70
- return this._readyPromise;
71
- }
72
- /**
73
- * @param {?} dbSchema
74
- * @return {?}
75
- */
76
- initDevice(dbSchema) {
77
- /** @type {?} */
78
- const window = (new WindowService()).nativeWindow;
79
- return new Promise((/**
80
- * @param {?} resolve
81
- * @param {?} reject
82
- * @return {?}
83
- */
84
- (resolve, reject) => {
85
- this.db = window.sqlitePlugin.openDatabase({
86
- name: this._dbName,
87
- location: this._location,
88
- androidLockWorkaround: 1
89
- });
90
- if (dbSchema) {
91
- this.generate(dbSchema).catch((/**
92
- * @param {?} err
93
- * @return {?}
94
- */
95
- err => {
96
- reject(err);
97
- })).then((/**
98
- * @return {?}
99
- */
100
- () => { resolve(); }));
101
- }
102
- else {
103
- resolve();
104
- }
105
- }));
106
- }
107
- /**
108
- * @param {?} dbSchema
109
- * @return {?}
110
- */
111
- init(dbSchema) {
112
- /** @type {?} */
113
- const window = (new WindowService()).nativeWindow;
114
- return new Promise((/**
115
- * @param {?} resolve
116
- * @param {?} reject
117
- * @return {?}
118
- */
119
- (resolve, reject) => {
120
- this.db = window.openDatabase(this._dbName, '1.0', 'database', -1);
121
- if (dbSchema) {
122
- this.generate(dbSchema).catch((/**
123
- * @param {?} err
124
- * @return {?}
125
- */
126
- err => {
127
- reject(err);
128
- })).then((/**
129
- * @return {?}
130
- */
131
- () => {
132
- resolve();
133
- }));
134
- }
135
- else {
136
- resolve();
137
- }
138
- }));
139
- }
140
- /**
141
- * @param {?} schema
142
- * @return {?}
143
- */
144
- generate(schema) {
145
- /** @type {?} */
146
- const sentences = [];
147
- this.schema = schema;
148
- if (schema.tables) {
149
- schema.tables.forEach((/**
150
- * @param {?} table
151
- * @return {?}
152
- */
153
- table => {
154
- sentences.push(this.createTable(table));
155
- }));
156
- }
157
- if (schema.views) {
158
- schema.views.forEach((/**
159
- * @param {?} view
160
- * @return {?}
161
- */
162
- view => {
163
- sentences.push(this.createView(view));
164
- }));
165
- }
166
- if (sentences.length === 0) {
167
- throw new Error('Esquema de la base de datos vacia.');
168
- }
169
- return Promise.all(sentences);
170
- }
171
- /**
172
- * @param {?} table
173
- * @return {?}
174
- */
175
- createTable(table) {
176
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
177
- /** @type {?} */
178
- let sql = '';
179
- /** @type {?} */
180
- let onConflictPrimary;
181
- /** @type {?} */
182
- const sentences = [];
183
- /** @type {?} */
184
- const newColumns = [];
185
- /** @type {?} */
186
- const tableDDL = yield this.tableExists(table.name);
187
- if (tableDDL) {
188
- table.columns.forEach((/**
189
- * @param {?} col
190
- * @return {?}
191
- */
192
- col => {
193
- if (!this.columnExists((/** @type {?} */ (tableDDL)), col.name)) {
194
- newColumns.push(this.addColumn(table.name, col));
195
- }
196
- }));
197
- }
198
- else {
199
- table.columns.forEach((/**
200
- * @param {?} col
201
- * @return {?}
202
- */
203
- col => {
204
- sentences.push(this.defColumn(col));
205
- }));
206
- }
207
- onConflictPrimary = 'on conflict fail';
208
- if (Array.isArray(table.primary)) {
209
- sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary.join(',') + ') ' + onConflictPrimary);
210
- }
211
- if (typeof table.primary === 'string') {
212
- sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary + ') ' + onConflictPrimary);
213
- }
214
- if (table.uniques) {
215
- table.uniques.forEach((/**
216
- * @param {?} uniq
217
- * @return {?}
218
- */
219
- uniq => {
220
- sentences.push(this.defUnique(uniq));
221
- }));
222
- }
223
- if (table.foreigns) {
224
- table.foreigns.forEach((/**
225
- * @param {?} fore
226
- * @return {?}
227
- */
228
- fore => {
229
- sentences.push(this.defForeign(fore));
230
- }));
231
- }
232
- if (tableDDL && newColumns.length !== 0) {
233
- return Promise.all(newColumns)
234
- .then((/**
235
- * @return {?}
236
- */
237
- () => { console.log(`Table ${table.name} altered.`); }))
238
- .catch((/**
239
- * @param {?} err
240
- * @return {?}
241
- */
242
- (err) => {
243
- console.error(`Table ${table.name}: ${err.message}`);
244
- throw new Error(`Table ${table.name}: ${err.message}`);
245
- }));
246
- }
247
- else if (!tableDDL) {
248
- sql = 'CREATE TABLE IF NOT EXISTS ' + table.name + ' (' + sentences.join(',') + ')';
249
- return this.query(sql)
250
- .then((/**
251
- * @return {?}
252
- */
253
- () => { console.log(`Table ${table.name} created.`); }))
254
- .catch((/**
255
- * @param {?} err
256
- * @return {?}
257
- */
258
- (err) => {
259
- console.error(`Table ${table.name}: ${err.message}`);
260
- throw new Error(`Table ${table.name}: ${err.message}`);
261
- }));
262
- }
263
- else {
264
- return Promise.resolve().then((/**
265
- * @return {?}
266
- */
267
- () => { console.log(`Table ${table.name} initialized.`); }));
268
- }
269
- });
270
- }
271
- /**
272
- * @param {?} view
273
- * @return {?}
274
- */
275
- createView(view) {
276
- /** @type {?} */
277
- let sql;
278
- sql = 'CREATE VIEW IF NOT EXISTS ' + view.name
279
- + ' AS ' + view.sql;
280
- return this.query(sql);
281
- }
282
- /**
283
- * @param {?} tableName
284
- * @return {?}
285
- */
286
- getSchemaTable(tableName) {
287
- /** @type {?} */
288
- let res;
289
- this.schema.tables.forEach((/**
290
- * @param {?} table
291
- * @return {?}
292
- */
293
- table => {
294
- if (table.name === tableName) {
295
- res = table;
296
- }
297
- }));
298
- return res;
299
- }
300
- /**
301
- * @param {?} table
302
- * @return {?}
303
- */
304
- getUniquesTable(table) {
305
- /** @type {?} */
306
- let res;
307
- table.uniques.forEach((/**
308
- * @param {?} uniq
309
- * @return {?}
310
- */
311
- uniq => {
312
- res[uniq.name] = uniq;
313
- }));
314
- return res;
315
- }
316
- /**
317
- * @param {?} query
318
- * @param {?=} bindings
319
- * @return {?}
320
- */
321
- query(query, bindings = []) {
322
- return new Promise((/**
323
- * @param {?} resolve
324
- * @param {?} reject
325
- * @return {?}
326
- */
327
- (resolve, reject) => {
328
- if (query.indexOf('select') === 0) {
329
- this.db.readTransaction((/**
330
- * @param {?} transaction
331
- * @return {?}
332
- */
333
- (transaction) => {
334
- transaction.executeSql(query, bindings, (/**
335
- * @param {?} transaction
336
- * @param {?} result
337
- * @return {?}
338
- */
339
- (transaction, result) => {
340
- resolve(result);
341
- }), (/**
342
- * @param {?} transaction
343
- * @param {?} error
344
- * @return {?}
345
- */
346
- (transaction, error) => {
347
- reject(error);
348
- }));
349
- }), (/**
350
- * @param {?} err
351
- * @return {?}
352
- */
353
- (err) => reject(err)));
354
- }
355
- else {
356
- this.db.transaction((/**
357
- * @param {?} transaction
358
- * @return {?}
359
- */
360
- (transaction) => {
361
- transaction.executeSql(query, bindings, (/**
362
- * @param {?} transaction
363
- * @param {?} result
364
- * @return {?}
365
- */
366
- (transaction, result) => {
367
- resolve(result);
368
- }), (/**
369
- * @param {?} transaction
370
- * @param {?} error
371
- * @return {?}
372
- */
373
- (transaction, error) => {
374
- reject(error);
375
- }));
376
- }), (/**
377
- * @param {?} err
378
- * @return {?}
379
- */
380
- (err) => reject(err)));
381
- }
382
- }));
383
- }
384
- /**
385
- * @param {?} query
386
- * @param {?=} bindings
387
- * @return {?}
388
- */
389
- Count(query, bindings = []) {
390
- return this.query(query, bindings).then((/**
391
- * @param {?} rows
392
- * @return {?}
393
- */
394
- rows => {
395
- return this.rowsCount(rows);
396
- }));
397
- }
398
- /**
399
- * @param {?} table
400
- * @param {?} bindings
401
- * @return {?}
402
- */
403
- insert(table, bindings) {
404
- /** @type {?} */
405
- let sql = '';
406
- /** @type {?} */
407
- let sqlBinds = [];
408
- /** @type {?} */
409
- let sqlKeys = [];
410
- /** @type {?} */
411
- let sqlValues = [];
412
- sql = sql + 'insert into ' + table + ' ';
413
- for (const index in bindings) {
414
- if (bindings.hasOwnProperty(index)) {
415
- sqlKeys.push(index);
416
- sqlValues.push(bindings[index]);
417
- sqlBinds.push('?');
418
- }
419
- }
420
- sql = sql + '(' + sqlKeys.join(',') + ') values (' + sqlBinds.join(',') + ')';
421
- return new Promise((/**
422
- * @param {?} resolve
423
- * @param {?} reject
424
- * @return {?}
425
- */
426
- (resolve, reject) => {
427
- this.db.transaction((/**
428
- * @param {?} transaction
429
- * @return {?}
430
- */
431
- transaction => {
432
- transaction.executeSql(sql, sqlValues, (/**
433
- * @param {?} transaction
434
- * @param {?} result
435
- * @return {?}
436
- */
437
- (transaction, result) => {
438
- resolve(result);
439
- }), (/**
440
- * @param {?} transaction
441
- * @param {?} error
442
- * @return {?}
443
- */
444
- (transaction, error) => {
445
- reject(error);
446
- }));
447
- }));
448
- }));
449
- }
450
- /**
451
- * @param {?} table
452
- * @param {?} bindings
453
- * @param {?} where
454
- * @return {?}
455
- */
456
- update(table, bindings, where) {
457
- /** @type {?} */
458
- let sql = '';
459
- /** @type {?} */
460
- let sqlBinds = [];
461
- /** @type {?} */
462
- let sqlKeys = [];
463
- /** @type {?} */
464
- let sqlValues = [];
465
- sql = sql + 'update ' + table + ' set ';
466
- for (let index in bindings) {
467
- if (bindings.hasOwnProperty(index)) {
468
- /** @type {?} */
469
- let newObj = bindings[index];
470
- if (typeof newObj === 'object' && newObj !== null) {
471
- sqlValues.push(newObj.value);
472
- if (newObj.ifnull) {
473
- sqlBinds.push(index + ' = ifnull( ' + index + ',0) + ?');
474
- }
475
- else if (newObj.operator) {
476
- sqlBinds.push(index + ' = ' + index + newObj.operator + ' ?');
477
- }
478
- else {
479
- sqlBinds.push(index + ' = ?');
480
- }
481
- }
482
- else {
483
- sqlBinds.push(index + ' = ?');
484
- sqlValues.push(bindings[index]);
485
- }
486
- }
487
- }
488
- for (let index in where) {
489
- if (where.hasOwnProperty(index)) {
490
- if (typeof where[index] === 'object' && where[index] !== null) {
491
- sqlKeys.push(index + ' ' + where[index].operator + ' ?');
492
- sqlValues.push(where[index].value);
493
- }
494
- else {
495
- sqlKeys.push(index + ' = ?');
496
- sqlValues.push(where[index]);
497
- }
498
- }
499
- }
500
- sql = sql + sqlBinds.join(',') + ' where ' + sqlKeys.join(' and ');
501
- return new Promise((/**
502
- * @param {?} resolve
503
- * @param {?} reject
504
- * @return {?}
505
- */
506
- (resolve, reject) => {
507
- this.db.transaction((/**
508
- * @param {?} transaction
509
- * @return {?}
510
- */
511
- transaction => {
512
- transaction.executeSql(sql, sqlValues, (/**
513
- * @param {?} transaction
514
- * @param {?} result
515
- * @return {?}
516
- */
517
- (transaction, result) => {
518
- resolve(result);
519
- }), (/**
520
- * @param {?} transaction
521
- * @param {?} error
522
- * @return {?}
523
- */
524
- (transaction, error) => {
525
- reject(error);
526
- }));
527
- }));
528
- }));
529
- }
530
- /**
531
- * @param {?} tables
532
- * @return {?}
533
- */
534
- dropTable(tables) {
535
- /** @type {?} */
536
- let cont = 1;
537
- cont = tables.length;
538
- return new Promise((/**
539
- * @param {?} resolve
540
- * @param {?} reject
541
- * @return {?}
542
- */
543
- (resolve, reject) => {
544
- tables.some((/**
545
- * @param {?} table
546
- * @return {?}
547
- */
548
- table => {
549
- if (cont !== 0) {
550
- this.query('DROP TABLE ' + table)
551
- .then((/**
552
- * @return {?}
553
- */
554
- () => {
555
- if (cont === 1) {
556
- resolve();
557
- }
558
- else {
559
- cont--;
560
- }
561
- }), (/**
562
- * @param {?} err
563
- * @return {?}
564
- */
565
- err => {
566
- cont = 0;
567
- reject(err);
568
- return true;
569
- }));
570
- return false;
571
- }
572
- }));
573
- }));
574
- }
575
- /**
576
- * @param {?} result
577
- * @return {?}
578
- */
579
- fetchAll(result) {
580
- /** @type {?} */
581
- let output = [];
582
- for (let i = 0; i < result.rows.length; i++) {
583
- output.push(result.rows.item(i));
584
- }
585
- return output;
586
- }
587
- /**
588
- * @param {?} result
589
- * @return {?}
590
- */
591
- fetch(result) {
592
- /** @type {?} */
593
- let objeto = undefined;
594
- /** @type {?} */
595
- let newObj = undefined;
596
- if (result.rows.length !== 0) {
597
- objeto = result.rows.item(0);
598
- newObj = {};
599
- /** @type {?} */
600
- const keys = Object.keys(objeto);
601
- for (let key in keys) {
602
- newObj[keys[key]] = objeto[keys[key]];
603
- }
604
- }
605
- return newObj;
606
- }
607
- /**
608
- * @param {?} result
609
- * @return {?}
610
- */
611
- rowsCount(result) {
612
- return result.rows.length;
613
- }
614
- /* Private */
615
- /**
616
- * @private
617
- * @param {?} col
618
- * @return {?}
619
- */
620
- defColumn(col) {
621
- /** @type {?} */
622
- let colSql;
623
- colSql = col.name + ' ' + col.type;
624
- if (!col.isNullable) {
625
- colSql += ' NOT NULL ';
626
- }
627
- if (col.default) {
628
- colSql += ' DEFAULT ' + col.default + ' ';
629
- }
630
- if (col.type === 'text' && col.length) {
631
- colSql += ` CONSTRAINT ${col.name}_length CHECK ( `;
632
- if (col.isNullable) {
633
- colSql += `${col.name} is null OR `;
634
- }
635
- colSql += `length(${col.name}) <= ${col.length} )`;
636
- }
637
- return colSql;
638
- }
639
- /**
640
- * @private
641
- * @param {?} unique
642
- * @return {?}
643
- */
644
- defUnique(unique) {
645
- /** @type {?} */
646
- let uniqSql;
647
- // depende del entorno, producción o desarrollo
648
- /** @type {?} */
649
- const onConflictUnique = 'on conflict fail';
650
- if (Array.isArray(unique.fields)) {
651
- uniqSql = ` CONSTRAINT ${unique.name} UNIQUE ( ${unique.fields.join(',')} ) ${onConflictUnique} `;
652
- }
653
- if (typeof unique.fields === 'string') {
654
- uniqSql = ` CONSTRAINT ${unique.name} UNIQUE ( ${unique.fields} ) ${onConflictUnique} `;
655
- }
656
- return uniqSql;
657
- }
658
- /**
659
- * @private
660
- * @param {?} fore
661
- * @return {?}
662
- */
663
- defForeign(fore) {
664
- /** @type {?} */
665
- let foreSql;
666
- if (Array.isArray(fore.foreignKey)) {
667
- foreSql = ` FOREIGN KEY ( ${fore.foreignKey.join(',')} ) `;
668
- }
669
- if (typeof fore.foreignKey === 'string') {
670
- foreSql = ` FOREIGN KEY ( ${fore.foreignKey} ) `;
671
- }
672
- if (Array.isArray(fore.primaryKey)) {
673
- foreSql = ` REFERENCES ${fore.referenceTable} ( ${fore.primaryKey.join(',')} ) `;
674
- }
675
- if (typeof fore.primaryKey === 'string') {
676
- foreSql = ` REFERENCES ${fore.referenceTable} ( ${fore.primaryKey} ) `;
677
- }
678
- return foreSql;
679
- }
680
- /**
681
- * @private
682
- * @param {?} table
683
- * @return {?}
684
- */
685
- tableExists(table) {
686
- return this.query('select sql from sqlite_master ' +
687
- 'where type=\'table\' and name=\'' + table + '\'')
688
- .then((/**
689
- * @param {?} result
690
- * @return {?}
691
- */
692
- result => {
693
- if (this.rowsCount(result) === 1) {
694
- return (/** @type {?} */ (((/** @type {?} */ (this.fetch(result)))).sql));
695
- }
696
- else {
697
- return false;
698
- }
699
- }));
700
- }
701
- /**
702
- * @private
703
- * @param {?} tableDDL
704
- * @param {?} column
705
- * @return {?}
706
- */
707
- columnExists(tableDDL, column) {
708
- if (tableDDL.indexOf(column) === -1) {
709
- return false;
710
- }
711
- else {
712
- return true;
713
- }
714
- }
715
- /**
716
- * @private
717
- * @param {?} table
718
- * @param {?} col
719
- * @return {?}
720
- */
721
- addColumn(table, col) {
722
- /** @type {?} */
723
- const colSql = this.defColumn(col);
724
- /** @type {?} */
725
- const query = 'alter TABLE ' + table + ' add COLUMN ' + colSql;
726
- return this.query(query);
727
- }
728
- }
729
- if (false) {
730
- /**
731
- * @type {?}
732
- * @private
733
- */
734
- DbWrapperService.prototype._dbName;
735
- /**
736
- * @type {?}
737
- * @private
738
- */
739
- DbWrapperService.prototype._location;
740
- /**
741
- * @type {?}
742
- * @private
743
- */
744
- DbWrapperService.prototype._iosDatabaseLocation;
745
- /**
746
- * @type {?}
747
- * @private
748
- */
749
- DbWrapperService.prototype._readyPromise;
750
- /** @type {?} */
751
- DbWrapperService.prototype.schema;
752
- /** @type {?} */
753
- DbWrapperService.prototype.db;
754
- }
755
- /** @type {?} */
756
- export const DB_CONFIG = new InjectionToken('dbWrapperConfig');
757
- /** @type {?} */
758
- export const DB_SCHEMA = new InjectionToken('dbWrapperSchema');
759
- /**
760
- * @return {?}
761
- */
762
- export function getDefaultDbConfig() {
763
- return {
764
- dbName: 'db.sqlite',
765
- location: 'default',
766
- iosDatabaseLocation: 'Library'
767
- };
768
- }
769
- /**
770
- * @param {?} dbConfig
771
- * @param {?=} dbSchema
772
- * @return {?}
773
- */
774
- export function provideDbWrapper(dbConfig, dbSchema) {
775
- /** @type {?} */
776
- const config = !!dbConfig ? dbConfig : getDefaultDbConfig();
777
- return new DbWrapperService(config, dbSchema);
778
- }
779
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItd3JhcHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGItd3JhcHBlci8iLCJzb3VyY2VzIjpbImxpYi9kYi13cmFwcGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUlqRCxNQUFNLE9BQU8sZ0JBQWdCOzs7OztJQVEzQixZQUFZLFFBQWtCLEVBQUUsUUFBbUI7UUFFakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUM7UUFDaEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsSUFBSSxTQUFTLENBQUM7O2NBQ2hFLE1BQU0sR0FBRyxDQUFDLElBQUksYUFBYSxFQUFFLENBQUMsQ0FBQyxZQUFZO1FBQ2pELElBQUksUUFBUSxFQUFFO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7U0FBRTtRQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksT0FBTzs7Ozs7UUFBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyRCxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxXQUFXLEVBQUU7Z0JBQ3pDLFVBQVU7OztnQkFBRSxHQUFHLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJOzs7b0JBQ3RCLEdBQUcsRUFBRTt3QkFDSCxPQUFPLEVBQUUsQ0FBQztvQkFDWixDQUFDLEVBQUU7eUJBQ0YsS0FBSzs7OztvQkFBRyxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNmLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDZCxDQUFDLEVBQUUsQ0FB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UTs7O0FBZ2FWLE1BQU0sT0FBTyxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQVcsaUJBQWlCLENBQUM7O0FBQ3hFLE1BQU0sT0FBTyxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQVcsaUJBQWlCLENBQUM7Ozs7QUFFeEUsTUFBTSxVQUFVLGtCQUFrQjtJQUNoQyxPQUFPO1FBQ0wsTUFBTSxFQUFFLFdBQVc7UUFDbkIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsbUJBQW1CLEVBQUUsU0FBUztLQUMvQixDQUFDO0FBQ0osQ0FBQzs7Ozs7O0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQWtCLEVBQUUsUUFBbUI7O1VBQ2hFLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFO0lBQzNELE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuL3dpbmRvdy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgREJUYWJsZSwgRGJDb25maWcsIERCU2NoZW1hLCBEQlZpZXcsXHJcbiAgREJDb2x1bW4sIERCVW5pcXVlLCBEQkZvcmVpZ24sIFNxbFRyYW5zYWN0aW9uLCBTcWxSZXN1bHRTZXQsIFNxbEVycm9yLCBEZWZhdWx0VHlwZSB9IGZyb20gJy4vZGItd3JhcHBlci5tb2RlbHMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIERiV3JhcHBlclNlcnZpY2Uge1xyXG4gIHByaXZhdGUgX2RiTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2xvY2F0aW9uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfaW9zRGF0YWJhc2VMb2NhdGlvbjogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3JlYWR5UHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcclxuICBzY2hlbWE6IERCU2NoZW1hO1xyXG4gIGRiOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRiQ29uZmlnOiBEYkNvbmZpZywgZGJTY2hlbWE/OiBEQlNjaGVtYSkge1xyXG5cclxuICAgIHRoaXMuX2RiTmFtZSA9IGRiQ29uZmlnLmRiTmFtZTtcclxuICAgIHRoaXMuX2xvY2F0aW9uID0gZGJDb25maWcubG9jYXRpb24gfHwgJ2RlZmF1bHQnO1xyXG4gICAgdGhpcy5faW9zRGF0YWJhc2VMb2NhdGlvbiA9IGRiQ29uZmlnLmlvc0RhdGFiYXNlTG9jYXRpb24gfHwgJ0xpYnJhcnknO1xyXG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcclxuICAgIGlmIChkYlNjaGVtYSkgeyB0aGlzLnNjaGVtYSA9IGRiU2NoZW1hOyB9XHJcbiAgICB0aGlzLl9yZWFkeVByb21pc2UgPSBuZXcgUHJvbWlzZSAoIChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuY29yZG92YSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmluaXQoZGJTY2hlbWEpLnRoZW4gKFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9IClcclxuICAgICAgICAgICAgLmNhdGNoICggKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICB9ICk7XHJcbiAgICAgICAgfSwgNTAwKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsICgpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdkYldyYXBwZXI6IGRldmljZSByZWFkeS4nKTtcclxuICAgICAgICAgIHRoaXMuaW5pdERldmljZShkYlNjaGVtYSkudGhlbiAoICgpID0+IHJlc29sdmUoKSApLmNhdGNoICggKGVycikgPT4gcmVqZWN0KGVycikgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLl9yZWFkeVByb21pc2U7XHJcbiAgfVxyXG5cclxuICBpbml0RGV2aWNlKGRiU2NoZW1hOiBEQlNjaGVtYSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSggKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRiID0gd2luZG93LnNxbGl0ZVBsdWdpbi5vcGVuRGF0YWJhc2Uoe1xyXG4gICAgICAgIG5hbWU6IHRoaXMuX2RiTmFtZSxcclxuICAgICAgICBsb2NhdGlvbjogdGhpcy5fbG9jYXRpb24sXHJcbiAgICAgICAgYW5kcm9pZExvY2tXb3JrYXJvdW5kOiAxXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKGRiU2NoZW1hKSB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZShkYlNjaGVtYSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pLnRoZW4oKCkgPT4geyByZXNvbHZlKCk7IH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpbml0KGRiU2NoZW1hOiBEQlNjaGVtYSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcclxuICAgIHJldHVybiAgbmV3IFByb21pc2UgKCAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGIgPSB3aW5kb3cub3BlbkRhdGFiYXNlKHRoaXMuX2RiTmFtZSwgJzEuMCcsICdkYXRhYmFzZScsIC0xKTtcclxuICAgICAgaWYgKGRiU2NoZW1hKSB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZShkYlNjaGVtYSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSkudGhlbiggKCkgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZShzY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTxhbnk+IHtcclxuXHJcbiAgICBjb25zdCBzZW50ZW5jZXMgPSBbXTtcclxuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xyXG5cclxuICAgIGlmIChzY2hlbWEudGFibGVzKSB7XHJcbiAgICAgIHNjaGVtYS50YWJsZXMuZm9yRWFjaCh0YWJsZSA9PiB7XHJcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5jcmVhdGVUYWJsZSh0YWJsZSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChzY2hlbWEudmlld3MpIHtcclxuICAgICAgc2NoZW1hLnZpZXdzLmZvckVhY2goIHZpZXcgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuY3JlYXRlVmlldyh2aWV3KSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHNlbnRlbmNlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFc3F1ZW1hIGRlIGxhIGJhc2UgZGUgZGF0b3MgdmFjaWEuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoc2VudGVuY2VzKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNyZWF0ZVRhYmxlKHRhYmxlOiBEQlRhYmxlKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGxldCBzcWwgPSAnJywgIG9uQ29uZmxpY3RQcmltYXJ5O1xyXG4gICAgY29uc3Qgc2VudGVuY2VzID0gW10sICBuZXdDb2x1bW5zID0gW11cclxuXHJcbiAgICBjb25zdCB0YWJsZURETCA9IGF3YWl0IHRoaXMudGFibGVFeGlzdHModGFibGUubmFtZSk7XHJcbiAgICBpZiAodGFibGVEREwpIHtcclxuICAgICAgICB0YWJsZS5jb2x1bW5zLmZvckVhY2goIGNvbCA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuY29sdW1uRXhpc3RzKHRhYmxlRERMIGFzIHN0cmluZywgY29sLm5hbWUpICkge1xyXG4gICAgICAgICAgICBuZXdDb2x1bW5zLnB1c2godGhpcy5hZGRDb2x1bW4odGFibGUubmFtZSwgY29sKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0YWJsZS5jb2x1bW5zLmZvckVhY2goIGNvbCA9PiB7XHJcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5kZWZDb2x1bW4oY29sKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgb25Db25mbGljdFByaW1hcnkgPSAnb24gY29uZmxpY3QgZmFpbCc7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFibGUucHJpbWFyeSkgKSAge1xyXG4gICAgICBzZW50ZW5jZXMucHVzaCAoJyBDT05TVFJBSU5UIGlkZW50aWZpY2Fkb3IgUFJJTUFSWSBLRVkgKCcgKyB0YWJsZS5wcmltYXJ5LmpvaW4oJywnKSArICcpICcgKyBvbkNvbmZsaWN0UHJpbWFyeSApO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB0YWJsZS5wcmltYXJ5ID09PSAnc3RyaW5nJykgICB7XHJcbiAgICAgIHNlbnRlbmNlcy5wdXNoICgnIENPTlNUUkFJTlQgaWRlbnRpZmljYWRvciBQUklNQVJZIEtFWSAoJyArIHRhYmxlLnByaW1hcnkgKyAnKSAnICsgb25Db25mbGljdFByaW1hcnkgKTtcclxuICAgIH1cclxuICAgIGlmICh0YWJsZS51bmlxdWVzKSB7XHJcbiAgICAgIHRhYmxlLnVuaXF1ZXMuZm9yRWFjaCggdW5pcSA9PiB7XHJcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5kZWZVbmlxdWUodW5pcSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGFibGUuZm9yZWlnbnMpIHtcclxuICAgICAgdGFibGUuZm9yZWlnbnMuZm9yRWFjaCAoIGZvcmUgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuZGVmRm9yZWlnbihmb3JlKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0YWJsZURETCAmJiBuZXdDb2x1bW5zLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwobmV3Q29sdW1ucylcclxuICAgICAgLnRoZW4oICgpID0+IHsgY29uc29sZS5sb2coYFRhYmxlICR7dGFibGUubmFtZX0gYWx0ZXJlZC5gKTsgfSApXHJcbiAgICAgIC5jYXRjaCggKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IgKGBUYWJsZSAke3RhYmxlLm5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgJHt0YWJsZS5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSBlbHNlIGlmICghdGFibGVEREwpIHtcclxuICAgICAgc3FsID0gJ0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICcgKyB0YWJsZS5uYW1lICsgJyAoJyArIHNlbnRlbmNlcy5qb2luKCcsJykgKyAnKSc7XHJcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNxbClcclxuICAgICAgLnRoZW4oICgpID0+IHsgY29uc29sZS5sb2coYFRhYmxlICR7dGFibGUubmFtZX0gY3JlYXRlZC5gKTsgfSlcclxuICAgICAgLmNhdGNoKCAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvciAoYFRhYmxlICR7dGFibGUubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSAke3RhYmxlLm5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCAoKSA9PiB7IGNvbnNvbGUubG9nKGBUYWJsZSAke3RhYmxlLm5hbWV9IGluaXRpYWxpemVkLmApOyB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBjcmVhdGVWaWV3KHZpZXc6IERCVmlldyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBsZXQgc3FsOiBzdHJpbmc7XHJcblxyXG4gICAgc3FsID0gJ0NSRUFURSBWSUVXIElGIE5PVCBFWElTVFMgJyArIHZpZXcubmFtZVxyXG4gICAgICArICcgQVMgJyArIHZpZXcuc3FsO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNxbCk7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0U2NoZW1hVGFibGUodGFibGVOYW1lOiBzdHJpbmcpOiBEQlRhYmxlIHtcclxuICAgIGxldCByZXM6IERCVGFibGU7XHJcblxyXG4gICAgdGhpcy5zY2hlbWEudGFibGVzLmZvckVhY2goIHRhYmxlID0+IHtcclxuICAgICAgaWYgKHRhYmxlLm5hbWUgPT09IHRhYmxlTmFtZSkge1xyXG4gICAgICAgIHJlcyA9IHRhYmxlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXM7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0VW5pcXVlc1RhYmxlKHRhYmxlOiBEQlRhYmxlKTogb2JqZWN0IHtcclxuICAgIGxldCByZXM6IHt9O1xyXG4gICAgdGFibGUudW5pcXVlcy5mb3JFYWNoKHVuaXEgPT4ge1xyXG4gICAgICByZXNbdW5pcS5uYW1lXSA9IHVuaXE7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBxdWVyeShxdWVyeTogc3RyaW5nLCBiaW5kaW5nczogYW55W109IFtdKTogUHJvbWlzZTxTcWxSZXN1bHRTZXQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChxdWVyeS5pbmRleE9mKCdzZWxlY3QnKSA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMuZGIucmVhZFRyYW5zYWN0aW9uKCh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24pID0+IHtcclxuICAgICAgICAgICAgdHJhbnNhY3Rpb24uZXhlY3V0ZVNxbChxdWVyeSwgYmluZGluZ3MsICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIHJlc3VsdDogU3FsUmVzdWx0U2V0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0sICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIGVycm9yOiBTcWxFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwgKGVycjogU3FsRXJyb3IpID0+IHJlamVjdChlcnIpICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYi50cmFuc2FjdGlvbigodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIGJpbmRpbmdzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCBlcnJvcjogU3FsRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIChlcnI6IFNxbEVycm9yKSA9PiByZWplY3QoZXJyKSApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIENvdW50KHF1ZXJ5OiBzdHJpbmcsIGJpbmRpbmdzOiBhbnlbXT0gW10pOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMucXVlcnkocXVlcnksIGJpbmRpbmdzKS50aGVuKHJvd3MgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd3NDb3VudChyb3dzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5zZXJ0KHRhYmxlOiBzdHJpbmcsIGJpbmRpbmdzOiB7fSk6IFByb21pc2U8U3FsUmVzdWx0U2V0PiB7XHJcbiAgICBsZXQgc3FsID0gJycsIHNxbEJpbmRzID0gW10sIHNxbEtleXMgPSBbXSwgc3FsVmFsdWVzID0gW10gO1xyXG5cclxuICAgIHNxbCA9IHNxbCArICdpbnNlcnQgaW50byAnICsgdGFibGUgKyAnICc7XHJcblxyXG4gICAgZm9yIChjb25zdCBpbmRleCBpbiBiaW5kaW5ncykge1xyXG4gICAgICAgaWYgKGJpbmRpbmdzLmhhc093blByb3BlcnR5KGluZGV4KSkge1xyXG4gICAgICAgICAgICBzcWxLZXlzLnB1c2goaW5kZXgpO1xyXG4gICAgICAgICAgICBzcWxWYWx1ZXMucHVzaChiaW5kaW5nc1tpbmRleF0pO1xyXG4gICAgICAgICAgICBzcWxCaW5kcy5wdXNoKCc/Jyk7XHJcbiAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3FsID0gc3FsICsgJygnICsgc3FsS2V5cy5qb2luKCcsJykgKyAnKSB2YWx1ZXMgKCcgKyBzcWxCaW5kcy5qb2luKCcsJykgKyAnKSc7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRiLnRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uID0+IHtcclxuICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwoc3FsLCBzcWxWYWx1ZXMsICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIHJlc3VsdDogU3FsUmVzdWx0U2V0KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgfSwgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgZXJyb3I6IFNxbEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKHRhYmxlOiBzdHJpbmcsIGJpbmRpbmdzOiB7fSwgd2hlcmU6IHt9KTogUHJvbWlzZTxTcWxSZXN1bHRTZXQ+IHtcclxuICAgIGxldCBzcWwgPSAnJywgc3FsQmluZHMgPSBbXSwgc3FsS2V5cyA9W10sIHNxbFZhbHVlcyA9IFtdIDtcclxuXHJcbiAgICBzcWwgPSBzcWwgKyAndXBkYXRlICcgKyB0YWJsZSArICcgc2V0ICc7XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggaW4gYmluZGluZ3MpIHtcclxuICAgICAgIGlmIChiaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcclxuICAgICAgICAgICAgbGV0IG5ld09iaiA9IGJpbmRpbmdzW2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdPYmogPT09ICdvYmplY3QnICYmIG5ld09iaiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2gobmV3T2JqLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdPYmouaWZudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3FsQmluZHMucHVzaChpbmRleCArICcgPSBpZm51bGwoICcgKyBpbmRleCArICcsMCkgKyA/Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld09iai5vcGVyYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gJyArIGluZGV4ICsgbmV3T2JqLm9wZXJhdG9yICsgJyA/Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gPycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gPycpO1xyXG4gICAgICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2goYmluZGluZ3NbaW5kZXhdKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpbmRleCBpbiB3aGVyZSkge1xyXG4gICAgICAgaWYgKHdoZXJlLmhhc093blByb3BlcnR5KGluZGV4KSkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHdoZXJlW2luZGV4XSA9PT0gJ29iamVjdCcgICYmIHdoZXJlW2luZGV4XSAhPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICBzcWxLZXlzLnB1c2goaW5kZXggKyAnICcgKyB3aGVyZVtpbmRleF0ub3BlcmF0b3IgKyAnID8nKTtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKHdoZXJlW2luZGV4XS52YWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzcWxLZXlzLnB1c2goaW5kZXggKyAnID0gPycpO1xyXG4gICAgICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2god2hlcmVbaW5kZXhdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNxbCA9IHNxbCArIHNxbEJpbmRzLmpvaW4oJywnKSArICcgd2hlcmUgJyArIHNxbEtleXMuam9pbignIGFuZCAnKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGIudHJhbnNhY3Rpb24odHJhbnNhY3Rpb24gPT4ge1xyXG4gICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwoc3FsLCBzcWxWYWx1ZXMsICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIHJlc3VsdDogU3FsUmVzdWx0U2V0KSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICB9LCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCBlcnJvcjogU3FsRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRyb3BUYWJsZSAodGFibGVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNvbnQgPSAxO1xyXG5cclxuICAgIGNvbnQgPSB0YWJsZXMubGVuZ3RoO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGFibGVzLnNvbWUoIHRhYmxlID0+IHtcclxuICAgICAgICBpZiAoY29udCAhPT0gMCkge1xyXG4gICAgICAgICAgdGhpcy5xdWVyeSgnRFJPUCBUQUJMRSAnICsgdGFibGUpXHJcbiAgICAgICAgICAudGhlbiggKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChjb250ID09PSAxICkgeyByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHsgY29udC0tOyB9XHJcbiAgICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICBjb250ID0gMDtcclxuICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBmZXRjaEFsbChyZXN1bHQ6IFNxbFJlc3VsdFNldCk6IG9iamVjdFtdIHtcclxuICAgIGxldCBvdXRwdXQgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgb3V0cHV0LnB1c2gocmVzdWx0LnJvd3MuaXRlbShpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxuICB9XHJcblxyXG4gIGZldGNoKHJlc3VsdDogU3FsUmVzdWx0U2V0KTogb2JqZWN0IHtcclxuICAgICAgbGV0IG9iamV0byA9IHVuZGVmaW5lZCwgbmV3T2JqPSB1bmRlZmluZWQ7XHJcbiAgICAgIGlmIChyZXN1bHQucm93cy5sZW5ndGggIT09IDApIHtcclxuICAgICAgICAgIG9iamV0byA9IHJlc3VsdC5yb3dzLml0ZW0oMCk7XHJcbiAgICAgICAgICBuZXdPYmogPSB7fTtcclxuICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmpldG8pO1xyXG4gICAgICAgICAgZm9yIChsZXQga2V5IGluIGtleXMpIHtcclxuICAgICAgICAgICAgICBuZXdPYmpba2V5c1trZXldXSA9IG9iamV0b1trZXlzW2tleV1dO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBuZXdPYmo7XHJcbiAgfVxyXG5cclxuXHJcbiAgcm93c0NvdW50KHJlc3VsdDogU3FsUmVzdWx0U2V0KTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzLmxlbmd0aDtcclxuICB9XHJcblxyXG4vKiBQcml2YXRlICovXHJcblxyXG4gIHByaXZhdGUgZGVmQ29sdW1uKGNvbDogREJDb2x1bW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IGNvbFNxbDogc3RyaW5nO1xyXG5cclxuICAgIGNvbFNxbCA9IGNvbC5uYW1lICsgJyAnICsgY29sLnR5cGU7XHJcbiAgICBpZiAoIWNvbC5pc051bGxhYmxlKSB7XHJcbiAgICAgIGNvbFNxbCArPSAgJyBOT1QgTlVMTCAnO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbC5kZWZhdWx0KSB7XHJcbiAgICAgIGNvbFNxbCArPSAnIERFRkFVTFQgJyArIGNvbC5kZWZhdWx0ICsgJyAnO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbC50eXBlID09PSAndGV4dCcgJiYgY29sLmxlbmd0aCkge1xyXG4gICAgICBjb2xTcWwgKz0gYCBDT05TVFJBSU5UICR7Y29sLm5hbWV9X2xlbmd0aCBDSEVDSyAoIGA7XHJcbiAgICAgIGlmIChjb2wuaXNOdWxsYWJsZSkge1xyXG4gICAgICAgIGNvbFNxbCArPSBgJHtjb2wubmFtZX0gaXMgbnVsbCBPUiBgO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbFNxbCArPSBgbGVuZ3RoKCR7Y29sLm5hbWV9KSA8PSAke2NvbC5sZW5ndGh9IClgO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sU3FsO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVmVW5pcXVlKHVuaXF1ZTogREJVbmlxdWUpOiBzdHJpbmcge1xyXG4gICAgbGV0IHVuaXFTcWw6IHN0cmluZztcclxuXHJcbiAgICAvLyBkZXBlbmRlIGRlbCBlbnRvcm5vLCBwcm9kdWNjacOzbiBvIGRlc2Fycm9sbG9cclxuICAgIGNvbnN0IG9uQ29uZmxpY3RVbmlxdWUgPSAnb24gY29uZmxpY3QgZmFpbCc7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodW5pcXVlLmZpZWxkcykgKSAge1xyXG4gICAgICB1bmlxU3FsID0gYCBDT05TVFJBSU5UICR7dW5pcXVlLm5hbWV9IFVOSVFVRSAoICR7dW5pcXVlLmZpZWxkcy5qb2luKCcsJyl9ICkgJHtvbkNvbmZsaWN0VW5pcXVlfSBgO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB1bmlxdWUuZmllbGRzID09PSAnc3RyaW5nJykgICB7XHJcbiAgICAgIHVuaXFTcWwgPSBgIENPTlNUUkFJTlQgJHt1bmlxdWUubmFtZX0gVU5JUVVFICggJHt1bmlxdWUuZmllbGRzfSApICR7b25Db25mbGljdFVuaXF1ZX0gYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdW5pcVNxbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVmRm9yZWlnbihmb3JlOiBEQkZvcmVpZ24pOiBzdHJpbmcge1xyXG4gICAgbGV0IGZvcmVTcWw6IHN0cmluZztcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JlLmZvcmVpZ25LZXkpICkgIHtcclxuICAgICAgZm9yZVNxbCA9IGAgRk9SRUlHTiBLRVkgKCAgJHtmb3JlLmZvcmVpZ25LZXkuam9pbignLCcpfSApIGA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBmb3JlLmZvcmVpZ25LZXkgPT09ICdzdHJpbmcnKSAgIHtcclxuICAgICAgZm9yZVNxbCA9IGAgRk9SRUlHTiBLRVkgKCAgJHtmb3JlLmZvcmVpZ25LZXl9ICkgYDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JlLnByaW1hcnlLZXkpICkgIHtcclxuICAgICAgZm9yZVNxbCA9IGAgUkVGRVJFTkNFUyAke2ZvcmUucmVmZXJlbmNlVGFibGV9ICggICR7Zm9yZS5wcmltYXJ5S2V5LmpvaW4oJywnKX0gKSBgO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZm9yZS5wcmltYXJ5S2V5ID09PSAnc3RyaW5nJykgICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIFJFRkVSRU5DRVMgJHtmb3JlLnJlZmVyZW5jZVRhYmxlfSAoICAke2ZvcmUucHJpbWFyeUtleX0gKSBgO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JlU3FsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0YWJsZUV4aXN0cyh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnc2VsZWN0ICBzcWwgZnJvbSBzcWxpdGVfbWFzdGVyICcgK1xyXG4gICAgICAgICd3aGVyZSB0eXBlPVxcJ3RhYmxlXFwnIGFuZCBuYW1lPVxcJycgKyB0YWJsZSArICdcXCcnKVxyXG4gICAgLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICBpZiAodGhpcy5yb3dzQ291bnQocmVzdWx0KSA9PT0gMSkgeyByZXR1cm4gKHRoaXMuZmV0Y2gocmVzdWx0KSBhcyBhbnkpLnNxbCBhcyBzdHJpbmc7IH0gZWxzZSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbHVtbkV4aXN0cyh0YWJsZURETDogc3RyaW5nLCBjb2x1bW46IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICh0YWJsZURETC5pbmRleE9mKGNvbHVtbikgPT09IC0xKSB7IHJldHVybiBmYWxzZTsgfSBlbHNlIHsgIHJldHVybiB0cnVlOyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENvbHVtbih0YWJsZTogc3RyaW5nLCBjb2w6IERCQ29sdW1uKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGNvbFNxbCA9IHRoaXMuZGVmQ29sdW1uKGNvbCk7XHJcbiAgICBjb25zdCBxdWVyeSA9ICdhbHRlciBUQUJMRSAnICsgdGFibGUgKyAnIGFkZCBDT0xVTU4gJyArIGNvbFNxbDtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHF1ZXJ5KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBEQl9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48RGJDb25maWc+KCdkYldyYXBwZXJDb25maWcnKTtcclxuZXhwb3J0IGNvbnN0IERCX1NDSEVNQSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxEQlNjaGVtYT4oJ2RiV3JhcHBlclNjaGVtYScpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHREYkNvbmZpZygpOiBEYkNvbmZpZyB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGRiTmFtZTogJ2RiLnNxbGl0ZScsXHJcbiAgICBsb2NhdGlvbjogJ2RlZmF1bHQnLFxyXG4gICAgaW9zRGF0YWJhc2VMb2NhdGlvbjogJ0xpYnJhcnknXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYldyYXBwZXIoZGJDb25maWc6IERiQ29uZmlnLCBkYlNjaGVtYT86IERCU2NoZW1hKTogRGJXcmFwcGVyU2VydmljZSB7XHJcbiAgY29uc3QgY29uZmlnID0gISFkYkNvbmZpZyA/IGRiQ29uZmlnIDogZ2V0RGVmYXVsdERiQ29uZmlnKCk7XHJcbiAgcmV0dXJuIG5ldyBEYldyYXBwZXJTZXJ2aWNlKGNvbmZpZywgZGJTY2hlbWEpO1xyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==
1
+ import { __awaiter } from "tslib";
2
+ import { InjectionToken } from '@angular/core';
3
+ import { WindowService } from './window.service';
4
+ export class DbWrapperService {
5
+ constructor(dbConfig, dbSchema) {
6
+ this._dbName = dbConfig.dbName;
7
+ this._location = dbConfig.location || 'default';
8
+ this._iosDatabaseLocation = dbConfig.iosDatabaseLocation || 'Library';
9
+ this._androidDatabaseProvider = dbConfig.androidDatabaseProvider || 'default';
10
+ const window = (new WindowService()).nativeWindow;
11
+ if (dbSchema) {
12
+ this.schema = dbSchema;
13
+ }
14
+ this._readyPromise = new Promise((resolve, reject) => {
15
+ if (typeof window.cordova === 'undefined') {
16
+ setTimeout(() => {
17
+ this.init(dbSchema).then(() => {
18
+ resolve();
19
+ })
20
+ .catch((err) => {
21
+ reject(err);
22
+ });
23
+ }, 500);
24
+ }
25
+ else {
26
+ document.addEventListener('deviceready', () => {
27
+ console.log('dbWrapper: device ready.');
28
+ this.initDevice(dbSchema).then(() => resolve()).catch((err) => reject(err));
29
+ });
30
+ }
31
+ });
32
+ }
33
+ ready() {
34
+ return this._readyPromise;
35
+ }
36
+ initDevice(dbSchema) {
37
+ const window = (new WindowService()).nativeWindow;
38
+ return new Promise((resolve, reject) => {
39
+ this.db = window.sqlitePlugin.openDatabase({
40
+ name: this._dbName,
41
+ location: this._location,
42
+ androidLockWorkaround: 1,
43
+ androidDatabaseProvider: this._androidDatabaseProvider,
44
+ });
45
+ if (dbSchema) {
46
+ this.generate(dbSchema).catch(err => {
47
+ reject(err);
48
+ }).then(() => { resolve(); });
49
+ }
50
+ else {
51
+ resolve();
52
+ }
53
+ });
54
+ }
55
+ init(dbSchema) {
56
+ const window = (new WindowService()).nativeWindow;
57
+ return new Promise((resolve, reject) => {
58
+ this.db = window.openDatabase(this._dbName, '1.0', 'database', -1);
59
+ if (dbSchema) {
60
+ this.generate(dbSchema).catch(err => {
61
+ reject(err);
62
+ }).then(() => {
63
+ resolve();
64
+ });
65
+ }
66
+ else {
67
+ resolve();
68
+ }
69
+ });
70
+ }
71
+ generate(schema) {
72
+ const sentences = [];
73
+ this.schema = schema;
74
+ if (schema.tables) {
75
+ schema.tables.forEach(table => {
76
+ sentences.push(this.createTable(table));
77
+ });
78
+ }
79
+ if (schema.views) {
80
+ schema.views.forEach(view => {
81
+ sentences.push(this.createView(view));
82
+ });
83
+ }
84
+ if (sentences.length === 0) {
85
+ throw new Error('Esquema de la base de datos vacia.');
86
+ }
87
+ return Promise.all(sentences);
88
+ }
89
+ createTable(table) {
90
+ return __awaiter(this, void 0, void 0, function* () {
91
+ let sql = '', onConflictPrimary;
92
+ const sentences = [], newColumns = [];
93
+ const tableDDL = yield this._tableExists(table.name);
94
+ if (tableDDL) {
95
+ table.columns.forEach(col => {
96
+ if (!this._columnExists(tableDDL, col.name)) {
97
+ newColumns.push(this.addColumn(table.name, col));
98
+ }
99
+ });
100
+ }
101
+ else {
102
+ table.columns.forEach(col => {
103
+ sentences.push(this.defColumn(col));
104
+ });
105
+ }
106
+ onConflictPrimary = 'on conflict fail';
107
+ if (Array.isArray(table.primary)) {
108
+ sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary.join(',') + ') ' + onConflictPrimary);
109
+ }
110
+ if (typeof table.primary === 'string') {
111
+ sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary + ') ' + onConflictPrimary);
112
+ }
113
+ if (table.uniques) {
114
+ table.uniques.forEach(uniq => {
115
+ sentences.push(this.defUnique(uniq));
116
+ });
117
+ }
118
+ if (table.foreigns) {
119
+ table.foreigns.forEach(fore => {
120
+ sentences.push(this.defForeign(fore));
121
+ });
122
+ }
123
+ if (tableDDL && newColumns.length !== 0) {
124
+ return Promise.all(newColumns)
125
+ .then(() => { console.log(`Table ${table.name} altered.`); })
126
+ .catch((err) => {
127
+ console.error(`Table ${table.name}: ${err.message}`);
128
+ throw new Error(`Table ${table.name}: ${err.message}`);
129
+ });
130
+ }
131
+ else if (!tableDDL) {
132
+ sql = 'CREATE TABLE IF NOT EXISTS ' + table.name + ' (' + sentences.join(',') + ')';
133
+ return this.query(sql)
134
+ .then(() => { console.log(`Table ${table.name} created.`); })
135
+ .catch((err) => {
136
+ console.error(`Table ${table.name}: ${err.message}`);
137
+ throw new Error(`Table ${table.name}: ${err.message}`);
138
+ });
139
+ }
140
+ else {
141
+ return Promise.resolve().then(() => { console.log(`Table ${table.name} initialized.`); });
142
+ }
143
+ });
144
+ }
145
+ createView(view) {
146
+ let sql;
147
+ sql = 'CREATE VIEW IF NOT EXISTS ' + view.name
148
+ + ' AS ' + view.sql;
149
+ return this.query(sql);
150
+ }
151
+ getSchemaTable(tableName) {
152
+ let res;
153
+ this.schema.tables.forEach(table => {
154
+ if (table.name === tableName) {
155
+ res = table;
156
+ }
157
+ });
158
+ return res;
159
+ }
160
+ getUniquesTable(table) {
161
+ let res;
162
+ table.uniques.forEach(uniq => {
163
+ res[uniq.name] = uniq;
164
+ });
165
+ return res;
166
+ }
167
+ query(query, bindings = []) {
168
+ return new Promise((resolve, reject) => {
169
+ if (query.indexOf('select') === 0) {
170
+ this.db.readTransaction((transaction) => {
171
+ transaction.executeSql(query, bindings, (transaction, result) => {
172
+ resolve(result);
173
+ }, (transaction, error) => {
174
+ reject(error);
175
+ });
176
+ }, (err) => reject(err));
177
+ }
178
+ else {
179
+ this.db.transaction((transaction) => {
180
+ transaction.executeSql(query, bindings, (transaction, result) => {
181
+ resolve(result);
182
+ }, (transaction, error) => {
183
+ reject(error);
184
+ });
185
+ }, (err) => reject(err));
186
+ }
187
+ });
188
+ }
189
+ Count(query, bindings = []) {
190
+ return this.query(query, bindings).then(rows => {
191
+ return this.rowsCount(rows);
192
+ });
193
+ }
194
+ insert(table, bindings) {
195
+ let sql = '', sqlBinds = [], sqlKeys = [], sqlValues = [];
196
+ sql = sql + 'insert into ' + table + ' ';
197
+ for (const index in bindings) {
198
+ if (bindings.hasOwnProperty(index)) {
199
+ sqlKeys.push(index);
200
+ sqlValues.push(bindings[index]);
201
+ sqlBinds.push('?');
202
+ }
203
+ }
204
+ sql = sql + '(' + sqlKeys.join(',') + ') values (' + sqlBinds.join(',') + ')';
205
+ return new Promise((resolve, reject) => {
206
+ this.db.transaction(transaction => {
207
+ transaction.executeSql(sql, sqlValues, (transaction, result) => {
208
+ resolve(result);
209
+ }, (transaction, error) => {
210
+ reject(error);
211
+ });
212
+ });
213
+ });
214
+ }
215
+ update(table, bindings, where) {
216
+ let sql = '', sqlBinds = [], sqlKeys = [], sqlValues = [];
217
+ sql = sql + 'update ' + table + ' set ';
218
+ for (let index in bindings) {
219
+ if (bindings.hasOwnProperty(index)) {
220
+ let newObj = bindings[index];
221
+ if (typeof newObj === 'object' && newObj !== null) {
222
+ sqlValues.push(newObj.value);
223
+ if (newObj.ifnull) {
224
+ sqlBinds.push(index + ' = ifnull( ' + index + ',0) + ?');
225
+ }
226
+ else if (newObj.operator) {
227
+ sqlBinds.push(index + ' = ' + index + newObj.operator + ' ?');
228
+ }
229
+ else {
230
+ sqlBinds.push(index + ' = ?');
231
+ }
232
+ }
233
+ else {
234
+ sqlBinds.push(index + ' = ?');
235
+ sqlValues.push(bindings[index]);
236
+ }
237
+ }
238
+ }
239
+ for (let index in where) {
240
+ if (where.hasOwnProperty(index)) {
241
+ if (typeof where[index] === 'object' && where[index] !== null) {
242
+ sqlKeys.push(index + ' ' + where[index].operator + ' ?');
243
+ sqlValues.push(where[index].value);
244
+ }
245
+ else {
246
+ sqlKeys.push(index + ' = ?');
247
+ sqlValues.push(where[index]);
248
+ }
249
+ }
250
+ }
251
+ sql = sql + sqlBinds.join(',') + ' where ' + sqlKeys.join(' and ');
252
+ return new Promise((resolve, reject) => {
253
+ this.db.transaction(transaction => {
254
+ transaction.executeSql(sql, sqlValues, (transaction, result) => {
255
+ resolve(result);
256
+ }, (transaction, error) => {
257
+ reject(error);
258
+ });
259
+ });
260
+ });
261
+ }
262
+ dropTable(tables) {
263
+ let cont = 1;
264
+ cont = tables.length;
265
+ return new Promise((resolve, reject) => {
266
+ tables.some(table => {
267
+ if (cont !== 0) {
268
+ this.query('DROP TABLE ' + table)
269
+ .then(() => {
270
+ if (cont === 1) {
271
+ resolve();
272
+ }
273
+ else {
274
+ cont--;
275
+ }
276
+ }, err => {
277
+ cont = 0;
278
+ reject(err);
279
+ return true;
280
+ });
281
+ return false;
282
+ }
283
+ });
284
+ });
285
+ }
286
+ fetchAll(result) {
287
+ let output = [];
288
+ for (let i = 0; i < result.rows.length; i++) {
289
+ output.push(result.rows.item(i));
290
+ }
291
+ return output;
292
+ }
293
+ fetch(result) {
294
+ let objeto = undefined, newObj = undefined;
295
+ if (result.rows.length !== 0) {
296
+ objeto = result.rows.item(0);
297
+ newObj = {};
298
+ const keys = Object.keys(objeto);
299
+ for (let key in keys) {
300
+ newObj[keys[key]] = objeto[keys[key]];
301
+ }
302
+ }
303
+ return newObj;
304
+ }
305
+ rowsCount(result) {
306
+ return result.rows.length;
307
+ }
308
+ tableExists(table) {
309
+ return this.query('select sql from sqlite_master ' +
310
+ 'where type=\'table\' and name=\'' + table + '\'')
311
+ .then(result => (this.rowsCount(result) === 1));
312
+ }
313
+ columnExists(table, column) {
314
+ return this._tableExists(table)
315
+ .then((tableDDL) => {
316
+ if (tableDDL) {
317
+ return this._columnExists(tableDDL, column);
318
+ }
319
+ else {
320
+ return false;
321
+ }
322
+ });
323
+ }
324
+ /* Private */
325
+ defColumn(col) {
326
+ let colSql;
327
+ colSql = col.name + ' ' + col.type;
328
+ if (!col.isNullable) {
329
+ colSql += ' NOT NULL ';
330
+ }
331
+ if (col.default) {
332
+ colSql += ' DEFAULT ' + col.default + ' ';
333
+ }
334
+ if (col.type === 'text' && col.length) {
335
+ colSql += ` CONSTRAINT ${col.name}_length CHECK ( `;
336
+ if (col.isNullable) {
337
+ colSql += `${col.name} is null OR `;
338
+ }
339
+ colSql += `length(${col.name}) <= ${col.length} )`;
340
+ }
341
+ return colSql;
342
+ }
343
+ defUnique(unique) {
344
+ let uniqSql;
345
+ // depende del entorno, producción o desarrollo
346
+ const onConflictUnique = 'on conflict replace';
347
+ if (Array.isArray(unique.fields)) {
348
+ uniqSql = ` CONSTRAINT ${unique.name} UNIQUE ( ${unique.fields.join(',')} ) ${onConflictUnique} `;
349
+ }
350
+ if (typeof unique.fields === 'string') {
351
+ uniqSql = ` CONSTRAINT ${unique.name} UNIQUE ( ${unique.fields} ) ${onConflictUnique} `;
352
+ }
353
+ return uniqSql;
354
+ }
355
+ defForeign(fore) {
356
+ let foreSql;
357
+ if (Array.isArray(fore.foreignKey)) {
358
+ foreSql = ` FOREIGN KEY ( ${fore.foreignKey.join(',')} ) `;
359
+ }
360
+ if (typeof fore.foreignKey === 'string') {
361
+ foreSql = ` FOREIGN KEY ( ${fore.foreignKey} ) `;
362
+ }
363
+ if (Array.isArray(fore.primaryKey)) {
364
+ foreSql = ` REFERENCES ${fore.referenceTable} ( ${fore.primaryKey.join(',')} ) `;
365
+ }
366
+ if (typeof fore.primaryKey === 'string') {
367
+ foreSql = ` REFERENCES ${fore.referenceTable} ( ${fore.primaryKey} ) `;
368
+ }
369
+ return foreSql;
370
+ }
371
+ _tableExists(table) {
372
+ return this.query('select sql from sqlite_master ' +
373
+ 'where type=\'table\' and name=\'' + table + '\'')
374
+ .then(result => {
375
+ if (this.rowsCount(result) === 1) {
376
+ return this.fetch(result).sql;
377
+ }
378
+ else {
379
+ return false;
380
+ }
381
+ });
382
+ }
383
+ _columnExists(tableDDL, column) {
384
+ if (tableDDL.indexOf(column) === -1) {
385
+ return false;
386
+ }
387
+ else {
388
+ return true;
389
+ }
390
+ }
391
+ addColumn(table, col) {
392
+ const colSql = this.defColumn(col);
393
+ const query = 'alter TABLE ' + table + ' add COLUMN ' + colSql;
394
+ return this.query(query);
395
+ }
396
+ }
397
+ export const DB_CONFIG = new InjectionToken('dbWrapperConfig');
398
+ export const DB_SCHEMA = new InjectionToken('dbWrapperSchema');
399
+ export function getDefaultDbConfig() {
400
+ return {
401
+ dbName: 'db.sqlite',
402
+ location: 'default',
403
+ iosDatabaseLocation: 'Library'
404
+ };
405
+ }
406
+ export function provideDbWrapper(dbConfig, dbSchema) {
407
+ const config = !!dbConfig ? dbConfig : getDefaultDbConfig();
408
+ return new DbWrapperService(config, dbSchema);
409
+ }
410
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItd3JhcHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGItd3JhcHBlci8iLCJzb3VyY2VzIjpbImxpYi9kYi13cmFwcGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSWpELE1BQU0sT0FBTyxnQkFBZ0I7SUFTM0IsWUFBWSxRQUFrQixFQUFFLFFBQW1CO1FBRWpELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDO1FBQ2hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLENBQUMsbUJBQW1CLElBQUksU0FBUyxDQUFDO1FBQ3RFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxRQUFRLENBQUMsdUJBQXVCLElBQUksU0FBUyxDQUFDO1FBQzlFLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUNsRCxJQUFJLFFBQVEsRUFBRTtZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO1NBQUU7UUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLE9BQU8sQ0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyRCxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxXQUFXLEVBQUU7Z0JBQ3pDLFVBQVUsQ0FBRSxHQUFHLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ3RCLEdBQUcsRUFBRTt3QkFDSCxPQUFPLEVBQUUsQ0FBQztvQkFDWixDQUFDLENBQUU7eUJBQ0YsS0FBSyxDQUFHLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JB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TUFBYztRQUVwRCxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztTQUFFO2FBQU07WUFBRyxPQUFPLElBQUksQ0FBQztTQUFFO0lBQy9FLENBQUM7SUFFTyxTQUFTLENBQUMsS0FBYSxFQUFFLEdBQWE7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxjQUFjLEdBQUcsS0FBSyxHQUFHLGNBQWMsR0FBRyxNQUFNLENBQUM7UUFDL0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7Q0FFRjtBQUlELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3pFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0FBRXpFLE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsT0FBTztRQUNMLE1BQU0sRUFBRSxXQUFXO1FBQ25CLFFBQVEsRUFBRSxTQUFTO1FBQ25CLG1CQUFtQixFQUFFLFNBQVM7S0FDL0IsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBa0IsRUFBRSxRQUFtQjtJQUN0RSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuL3dpbmRvdy5zZXJ2aWNlJztcbmltcG9ydCB7IERCVGFibGUsIERiQ29uZmlnLCBEQlNjaGVtYSwgREJWaWV3LFxuICBEQkNvbHVtbiwgREJVbmlxdWUsIERCRm9yZWlnbiwgU3FsVHJhbnNhY3Rpb24sIFNxbFJlc3VsdFNldCwgU3FsRXJyb3IsIERlZmF1bHRUeXBlIH0gZnJvbSAnLi9kYi13cmFwcGVyLm1vZGVscyc7XG5cbmV4cG9ydCBjbGFzcyBEYldyYXBwZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfZGJOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX2xvY2F0aW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX2lvc0RhdGFiYXNlTG9jYXRpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfYW5kcm9pZERhdGFiYXNlUHJvdmlkZXI6IHN0cmluZztcbiAgcHJpdmF0ZSBfcmVhZHlQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICBzY2hlbWE6IERCU2NoZW1hO1xuICBkYjogYW55O1xuXG4gIGNvbnN0cnVjdG9yKGRiQ29uZmlnOiBEYkNvbmZpZywgZGJTY2hlbWE/OiBEQlNjaGVtYSkge1xuXG4gICAgdGhpcy5fZGJOYW1lID0gZGJDb25maWcuZGJOYW1lO1xuICAgIHRoaXMuX2xvY2F0aW9uID0gZGJDb25maWcubG9jYXRpb24gfHwgJ2RlZmF1bHQnO1xuICAgIHRoaXMuX2lvc0RhdGFiYXNlTG9jYXRpb24gPSBkYkNvbmZpZy5pb3NEYXRhYmFzZUxvY2F0aW9uIHx8ICdMaWJyYXJ5JztcbiAgICB0aGlzLl9hbmRyb2lkRGF0YWJhc2VQcm92aWRlciA9IGRiQ29uZmlnLmFuZHJvaWREYXRhYmFzZVByb3ZpZGVyIHx8ICdkZWZhdWx0JztcbiAgICBjb25zdCB3aW5kb3cgPSAobmV3IFdpbmRvd1NlcnZpY2UoKSkubmF0aXZlV2luZG93O1xuICAgIGlmIChkYlNjaGVtYSkgeyB0aGlzLnNjaGVtYSA9IGRiU2NoZW1hOyB9XG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbmV3IFByb21pc2UgKCAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5jb3Jkb3ZhID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbml0KGRiU2NoZW1hKS50aGVuIChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSApXG4gICAgICAgICAgICAuY2F0Y2ggKCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSApO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlcmVhZHknLCAoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2RiV3JhcHBlcjogZGV2aWNlIHJlYWR5LicpO1xuICAgICAgICAgIHRoaXMuaW5pdERldmljZShkYlNjaGVtYSkudGhlbiAoICgpID0+IHJlc29sdmUoKSApLmNhdGNoICggKGVycikgPT4gcmVqZWN0KGVycikgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlO1xuICB9XG5cbiAgaW5pdERldmljZShkYlNjaGVtYTogREJTY2hlbWEpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3aW5kb3cgPSAobmV3IFdpbmRvd1NlcnZpY2UoKSkubmF0aXZlV2luZG93O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSggKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYiA9IHdpbmRvdy5zcWxpdGVQbHVnaW4ub3BlbkRhdGFiYXNlKHtcbiAgICAgICAgbmFtZTogdGhpcy5fZGJOYW1lLFxuICAgICAgICBsb2NhdGlvbjogdGhpcy5fbG9jYXRpb24sXG4gICAgICAgIGFuZHJvaWRMb2NrV29ya2Fyb3VuZDogMSxcbiAgICAgICAgYW5kcm9pZERhdGFiYXNlUHJvdmlkZXI6IHRoaXMuX2FuZHJvaWREYXRhYmFzZVByb3ZpZGVyLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkYlNjaGVtYSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRlKGRiU2NoZW1hKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KS50aGVuKCgpID0+IHsgcmVzb2x2ZSgpOyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGluaXQoZGJTY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcbiAgICByZXR1cm4gIG5ldyBQcm9taXNlICggKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYiA9IHdpbmRvdy5vcGVuRGF0YWJhc2UodGhpcy5fZGJOYW1lLCAnMS4wJywgJ2RhdGFiYXNlJywgLTEpO1xuICAgICAgaWYgKGRiU2NoZW1hKSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGUoZGJTY2hlbWEpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSkudGhlbiggKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZW5lcmF0ZShzY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTxhbnk+IHtcblxuICAgIGNvbnN0IHNlbnRlbmNlcyA9IFtdO1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuXG4gICAgaWYgKHNjaGVtYS50YWJsZXMpIHtcbiAgICAgIHNjaGVtYS50YWJsZXMuZm9yRWFjaCh0YWJsZSA9PiB7XG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuY3JlYXRlVGFibGUodGFibGUpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2NoZW1hLnZpZXdzKSB7XG4gICAgICBzY2hlbWEudmlld3MuZm9yRWFjaCggdmlldyA9PiB7XG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuY3JlYXRlVmlldyh2aWV3KSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXNxdWVtYSBkZSBsYSBiYXNlIGRlIGRhdG9zIHZhY2lhLicpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoc2VudGVuY2VzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVRhYmxlKHRhYmxlOiBEQlRhYmxlKTogUHJvbWlzZTxhbnk+IHtcbiAgICBsZXQgc3FsID0gJycsICBvbkNvbmZsaWN0UHJpbWFyeTtcbiAgICBjb25zdCBzZW50ZW5jZXMgPSBbXSwgIG5ld0NvbHVtbnMgPSBbXVxuXG4gICAgY29uc3QgdGFibGVEREwgPSBhd2FpdCB0aGlzLl90YWJsZUV4aXN0cyh0YWJsZS5uYW1lKTtcbiAgICBpZiAodGFibGVEREwpIHtcbiAgICAgICAgdGFibGUuY29sdW1ucy5mb3JFYWNoKCBjb2wgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5fY29sdW1uRXhpc3RzKHRhYmxlRERMIGFzIHN0cmluZywgY29sLm5hbWUpICkge1xuICAgICAgICAgICAgbmV3Q29sdW1ucy5wdXNoKHRoaXMuYWRkQ29sdW1uKHRhYmxlLm5hbWUsIGNvbCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlLmNvbHVtbnMuZm9yRWFjaCggY29sID0+IHtcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5kZWZDb2x1bW4oY29sKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgb25Db25mbGljdFByaW1hcnkgPSAnb24gY29uZmxpY3QgZmFpbCc7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWJsZS5wcmltYXJ5KSApICB7XG4gICAgICBzZW50ZW5jZXMucHVzaCAoJyBDT05TVFJBSU5UIGlkZW50aWZpY2Fkb3IgUFJJTUFSWSBLRVkgKCcgKyB0YWJsZS5wcmltYXJ5LmpvaW4oJywnKSArICcpICcgKyBvbkNvbmZsaWN0UHJpbWFyeSApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRhYmxlLnByaW1hcnkgPT09ICdzdHJpbmcnKSAgIHtcbiAgICAgIHNlbnRlbmNlcy5wdXNoICgnIENPTlNUUkFJTlQgaWRlbnRpZmljYWRvciBQUklNQVJZIEtFWSAoJyArIHRhYmxlLnByaW1hcnkgKyAnKSAnICsgb25Db25mbGljdFByaW1hcnkgKTtcbiAgICB9XG4gICAgaWYgKHRhYmxlLnVuaXF1ZXMpIHtcbiAgICAgIHRhYmxlLnVuaXF1ZXMuZm9yRWFjaCggdW5pcSA9PiB7XG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuZGVmVW5pcXVlKHVuaXEpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0YWJsZS5mb3JlaWducykge1xuICAgICAgdGFibGUuZm9yZWlnbnMuZm9yRWFjaCAoIGZvcmUgPT4ge1xuICAgICAgICBzZW50ZW5jZXMucHVzaCh0aGlzLmRlZkZvcmVpZ24oZm9yZSkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRhYmxlRERMICYmIG5ld0NvbHVtbnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwobmV3Q29sdW1ucylcbiAgICAgIC50aGVuKCAoKSA9PiB7IGNvbnNvbGUubG9nKGBUYWJsZSAke3RhYmxlLm5hbWV9IGFsdGVyZWQuYCk7IH0gKVxuICAgICAgLmNhdGNoKCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IgKGBUYWJsZSAke3RhYmxlLm5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlICR7dGFibGUubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9KTtcblxuICAgIH0gZWxzZSBpZiAoIXRhYmxlRERMKSB7XG4gICAgICBzcWwgPSAnQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJyArIHRhYmxlLm5hbWUgKyAnICgnICsgc2VudGVuY2VzLmpvaW4oJywnKSArICcpJztcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNxbClcbiAgICAgIC50aGVuKCAoKSA9PiB7IGNvbnNvbGUubG9nKGBUYWJsZSAke3RhYmxlLm5hbWV9IGNyZWF0ZWQuYCk7IH0pXG4gICAgICAuY2F0Y2goIChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvciAoYFRhYmxlICR7dGFibGUubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgJHt0YWJsZS5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbiggKCkgPT4geyBjb25zb2xlLmxvZyhgVGFibGUgJHt0YWJsZS5uYW1lfSBpbml0aWFsaXplZC5gKTsgfSk7XG4gICAgfVxuICB9XG5cblxuICBjcmVhdGVWaWV3KHZpZXc6IERCVmlldyk6IFByb21pc2U8YW55PiB7XG4gICAgbGV0IHNxbDogc3RyaW5nO1xuXG4gICAgc3FsID0gJ0NSRUFURSBWSUVXIElGIE5PVCBFWElTVFMgJyArIHZpZXcubmFtZVxuICAgICAgKyAnIEFTICcgKyB2aWV3LnNxbDtcblxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNxbCk7XG5cbiAgfVxuXG4gIGdldFNjaGVtYVRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogREJUYWJsZSB7XG4gICAgbGV0IHJlczogREJUYWJsZTtcblxuICAgIHRoaXMuc2NoZW1hLnRhYmxlcy5mb3JFYWNoKCB0YWJsZSA9PiB7XG4gICAgICBpZiAodGFibGUubmFtZSA9PT0gdGFibGVOYW1lKSB7XG4gICAgICAgIHJlcyA9IHRhYmxlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG5cbiAgfVxuXG4gIGdldFVuaXF1ZXNUYWJsZSh0YWJsZTogREJUYWJsZSk6IG9iamVjdCB7XG4gICAgbGV0IHJlczoge307XG4gICAgdGFibGUudW5pcXVlcy5mb3JFYWNoKHVuaXEgPT4ge1xuICAgICAgcmVzW3VuaXEubmFtZV0gPSB1bmlxO1xuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBxdWVyeShxdWVyeTogc3RyaW5nLCBiaW5kaW5nczogYW55W109IFtdKTogUHJvbWlzZTxTcWxSZXN1bHRTZXQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHF1ZXJ5LmluZGV4T2YoJ3NlbGVjdCcpID09PSAwKSB7XG4gICAgICAgIHRoaXMuZGIucmVhZFRyYW5zYWN0aW9uKCh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIGJpbmRpbmdzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH0sICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIGVycm9yOiBTcWxFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgKGVycjogU3FsRXJyb3IpID0+IHJlamVjdChlcnIpICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRiLnRyYW5zYWN0aW9uKCh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIGJpbmRpbmdzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH0sICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIGVycm9yOiBTcWxFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgKGVycjogU3FsRXJyb3IpID0+IHJlamVjdChlcnIpICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBDb3VudChxdWVyeTogc3RyaW5nLCBiaW5kaW5nczogYW55W109IFtdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeShxdWVyeSwgYmluZGluZ3MpLnRoZW4ocm93cyA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd3NDb3VudChyb3dzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGluc2VydCh0YWJsZTogc3RyaW5nLCBiaW5kaW5nczoge30pOiBQcm9taXNlPFNxbFJlc3VsdFNldD4ge1xuICAgIGxldCBzcWwgPSAnJywgc3FsQmluZHMgPSBbXSwgc3FsS2V5cyA9IFtdLCBzcWxWYWx1ZXMgPSBbXSA7XG5cbiAgICBzcWwgPSBzcWwgKyAnaW5zZXJ0IGludG8gJyArIHRhYmxlICsgJyAnO1xuXG4gICAgZm9yIChjb25zdCBpbmRleCBpbiBiaW5kaW5ncykge1xuICAgICAgIGlmIChiaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcbiAgICAgICAgICAgIHNxbEtleXMucHVzaChpbmRleCk7XG4gICAgICAgICAgICBzcWxWYWx1ZXMucHVzaChiaW5kaW5nc1tpbmRleF0pO1xuICAgICAgICAgICAgc3FsQmluZHMucHVzaCgnPycpO1xuICAgICAgIH1cbiAgICB9XG5cbiAgICBzcWwgPSBzcWwgKyAnKCcgKyBzcWxLZXlzLmpvaW4oJywnKSArICcpIHZhbHVlcyAoJyArIHNxbEJpbmRzLmpvaW4oJywnKSArICcpJztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYi50cmFuc2FjdGlvbih0cmFuc2FjdGlvbiA9PiB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZXhlY3V0ZVNxbChzcWwsIHNxbFZhbHVlcywgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgcmVzdWx0OiBTcWxSZXN1bHRTZXQpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgIH0sICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIGVycm9yOiBTcWxFcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGUodGFibGU6IHN0cmluZywgYmluZGluZ3M6IHt9LCB3aGVyZToge30pOiBQcm9taXNlPFNxbFJlc3VsdFNldD4ge1xuICAgIGxldCBzcWwgPSAnJywgc3FsQmluZHMgPSBbXSwgc3FsS2V5cyA9W10sIHNxbFZhbHVlcyA9IFtdIDtcblxuICAgIHNxbCA9IHNxbCArICd1cGRhdGUgJyArIHRhYmxlICsgJyBzZXQgJztcblxuICAgIGZvciAobGV0IGluZGV4IGluIGJpbmRpbmdzKSB7XG4gICAgICAgaWYgKGJpbmRpbmdzLmhhc093blByb3BlcnR5KGluZGV4KSkge1xuICAgICAgICAgICAgbGV0IG5ld09iaiA9IGJpbmRpbmdzW2luZGV4XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3T2JqID09PSAnb2JqZWN0JyAmJiBuZXdPYmogIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzcWxWYWx1ZXMucHVzaChuZXdPYmoudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdPYmouaWZudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gaWZudWxsKCAnICsgaW5kZXggKyAnLDApICsgPycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3T2JqLm9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gJyArIGluZGV4ICsgbmV3T2JqLm9wZXJhdG9yICsgJyA/Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3FsQmluZHMucHVzaChpbmRleCArICcgPSA/Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gPycpO1xuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKGJpbmRpbmdzW2luZGV4XSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaW5kZXggaW4gd2hlcmUpIHtcbiAgICAgICBpZiAod2hlcmUuaGFzT3duUHJvcGVydHkoaW5kZXgpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdoZXJlW2luZGV4XSA9PT0gJ29iamVjdCcgICYmIHdoZXJlW2luZGV4XSAhPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4ICsgJyAnICsgd2hlcmVbaW5kZXhdLm9wZXJhdG9yICsgJyA/Jyk7XG4gICAgICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2god2hlcmVbaW5kZXhdLnZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcbiAgICAgICAgICAgICAgICBzcWxWYWx1ZXMucHVzaCh3aGVyZVtpbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgIH1cbiAgICB9XG5cbiAgICBzcWwgPSBzcWwgKyBzcWxCaW5kcy5qb2luKCcsJykgKyAnIHdoZXJlICcgKyBzcWxLZXlzLmpvaW4oJyBhbmQgJyk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGIudHJhbnNhY3Rpb24odHJhbnNhY3Rpb24gPT4ge1xuICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHNxbCwgc3FsVmFsdWVzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCBlcnJvcjogU3FsRXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBkcm9wVGFibGUgKHRhYmxlczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgY29udCA9IDE7XG5cbiAgICBjb250ID0gdGFibGVzLmxlbmd0aDtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGFibGVzLnNvbWUoIHRhYmxlID0+IHtcbiAgICAgICAgaWYgKGNvbnQgIT09IDApIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5KCdEUk9QIFRBQkxFICcgKyB0YWJsZSlcbiAgICAgICAgICAudGhlbiggKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udCA9PT0gMSApIHsgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9IGVsc2UgeyBjb250LS07IH1cbiAgICAgICAgICB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgY29udCA9IDA7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSlcbiAgfVxuXG4gIGZldGNoQWxsKHJlc3VsdDogU3FsUmVzdWx0U2V0KTogb2JqZWN0W10ge1xuICAgIGxldCBvdXRwdXQgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0LnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3V0cHV0LnB1c2gocmVzdWx0LnJvd3MuaXRlbShpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIGZldGNoKHJlc3VsdDogU3FsUmVzdWx0U2V0KTogb2JqZWN0IHtcbiAgICAgIGxldCBvYmpldG8gPSB1bmRlZmluZWQsIG5ld09iaj0gdW5kZWZpbmVkO1xuICAgICAgaWYgKHJlc3VsdC5yb3dzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIG9iamV0byA9IHJlc3VsdC5yb3dzLml0ZW0oMCk7XG4gICAgICAgICAgbmV3T2JqID0ge307XG4gICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iamV0byk7XG4gICAgICAgICAgZm9yIChsZXQga2V5IGluIGtleXMpIHtcbiAgICAgICAgICAgICAgbmV3T2JqW2tleXNba2V5XV0gPSBvYmpldG9ba2V5c1trZXldXTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3T2JqO1xuICB9XG5cblxuICByb3dzQ291bnQocmVzdWx0OiBTcWxSZXN1bHRTZXQpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzLmxlbmd0aDtcbiAgfVxuXG4gIHRhYmxlRXhpc3RzKHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnc2VsZWN0ICBzcWwgZnJvbSBzcWxpdGVfbWFzdGVyICcgK1xuICAgICAgICAnd2hlcmUgdHlwZT1cXCd0YWJsZVxcJyBhbmQgbmFtZT1cXCcnICsgdGFibGUgKyAnXFwnJylcbiAgICAudGhlbihyZXN1bHQgPT4gICh0aGlzLnJvd3NDb3VudChyZXN1bHQpID09PSAxKSApO1xuICB9ICBcblxuICBjb2x1bW5FeGlzdHModGFibGU6IHN0cmluZywgY29sdW1uOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVFeGlzdHModGFibGUpXG4gICAgICAudGhlbigodGFibGVEREwpID0+IHtcbiAgICAgICAgaWYgKHRhYmxlRERMKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkV4aXN0cygodGFibGVEREwgYXMgc3RyaW5nKSwgY29sdW1uKTtcbiAgICAgICAgfSBlbHNlIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICB9KTtcbiAgfVxuXG4vKiBQcml2YXRlICovXG5cbiAgcHJpdmF0ZSBkZWZDb2x1bW4oY29sOiBEQkNvbHVtbik6IHN0cmluZyB7XG4gICAgbGV0IGNvbFNxbDogc3RyaW5nO1xuXG4gICAgY29sU3FsID0gY29sLm5hbWUgKyAnICcgKyBjb2wudHlwZTtcbiAgICBpZiAoIWNvbC5pc051bGxhYmxlKSB7XG4gICAgICBjb2xTcWwgKz0gICcgTk9UIE5VTEwgJztcbiAgICB9XG4gICAgaWYgKGNvbC5kZWZhdWx0KSB7XG4gICAgICBjb2xTcWwgKz0gJyBERUZBVUxUICcgKyBjb2wuZGVmYXVsdCArICcgJztcbiAgICB9XG4gICAgaWYgKGNvbC50eXBlID09PSAndGV4dCcgJiYgY29sLmxlbmd0aCkge1xuICAgICAgY29sU3FsICs9IGAgQ09OU1RSQUlOVCAke2NvbC5uYW1lfV9sZW5ndGggQ0hFQ0sgKCBgO1xuICAgICAgaWYgKGNvbC5pc051bGxhYmxlKSB7XG4gICAgICAgIGNvbFNxbCArPSBgJHtjb2wubmFtZX0gaXMgbnVsbCBPUiBgO1xuICAgICAgfVxuICAgICAgY29sU3FsICs9IGBsZW5ndGgoJHtjb2wubmFtZX0pIDw9ICR7Y29sLmxlbmd0aH0gKWA7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gY29sU3FsO1xuXG4gIH1cblxuICBwcml2YXRlIGRlZlVuaXF1ZSh1bmlxdWU6IERCVW5pcXVlKTogc3RyaW5nIHtcbiAgICBsZXQgdW5pcVNxbDogc3RyaW5nO1xuXG4gICAgLy8gZGVwZW5kZSBkZWwgZW50b3JubywgcHJvZHVjY2nDs24gbyBkZXNhcnJvbGxvXG4gICAgY29uc3Qgb25Db25mbGljdFVuaXF1ZSA9ICdvbiBjb25mbGljdCByZXBsYWNlJztcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHVuaXF1ZS5maWVsZHMpICkgIHtcbiAgICAgIHVuaXFTcWwgPSBgIENPTlNUUkFJTlQgJHt1bmlxdWUubmFtZX0gVU5JUVVFICggJHt1bmlxdWUuZmllbGRzLmpvaW4oJywnKX0gKSAke29uQ29uZmxpY3RVbmlxdWV9IGA7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdW5pcXVlLmZpZWxkcyA9PT0gJ3N0cmluZycpICAge1xuICAgICAgdW5pcVNxbCA9IGAgQ09OU1RSQUlOVCAke3VuaXF1ZS5uYW1lfSBVTklRVUUgKCAke3VuaXF1ZS5maWVsZHN9ICkgJHtvbkNvbmZsaWN0VW5pcXVlfSBgO1xuICAgIH1cblxuICAgIHJldHVybiB1bmlxU3FsO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZGb3JlaWduKGZvcmU6IERCRm9yZWlnbik6IHN0cmluZyB7XG4gICAgbGV0IGZvcmVTcWw6IHN0cmluZztcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGZvcmUuZm9yZWlnbktleSkgKSAge1xuICAgICAgZm9yZVNxbCA9IGAgRk9SRUlHTiBLRVkgKCAgJHtmb3JlLmZvcmVpZ25LZXkuam9pbignLCcpfSApIGA7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmb3JlLmZvcmVpZ25LZXkgPT09ICdzdHJpbmcnKSAgIHtcbiAgICAgIGZvcmVTcWwgPSBgIEZPUkVJR04gS0VZICggICR7Zm9yZS5mb3JlaWduS2V5fSApIGA7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9yZS5wcmltYXJ5S2V5KSApICB7XG4gICAgICBmb3JlU3FsID0gYCBSRUZFUkVOQ0VTICR7Zm9yZS5yZWZlcmVuY2VUYWJsZX0gKCAgJHtmb3JlLnByaW1hcnlLZXkuam9pbignLCcpfSApIGA7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmb3JlLnByaW1hcnlLZXkgPT09ICdzdHJpbmcnKSAgIHtcbiAgICAgIGZvcmVTcWwgPSBgIFJFRkVSRU5DRVMgJHtmb3JlLnJlZmVyZW5jZVRhYmxlfSAoICAke2ZvcmUucHJpbWFyeUtleX0gKSBgO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JlU3FsO1xuICB9XG5cbiAgcHJpdmF0ZSBfdGFibGVFeGlzdHModGFibGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCdzZWxlY3QgIHNxbCBmcm9tIHNxbGl0ZV9tYXN0ZXIgJyArXG4gICAgICAgICd3aGVyZSB0eXBlPVxcJ3RhYmxlXFwnIGFuZCBuYW1lPVxcJycgKyB0YWJsZSArICdcXCcnKVxuICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnJvd3NDb3VudChyZXN1bHQpID09PSAxKSB7IHJldHVybiAodGhpcy5mZXRjaChyZXN1bHQpIGFzIGFueSkuc3FsIGFzIHN0cmluZzsgfSBlbHNlIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jb2x1bW5FeGlzdHModGFibGVEREw6IHN0cmluZywgY29sdW1uOiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgIGlmICh0YWJsZURETC5pbmRleE9mKGNvbHVtbikgPT09IC0xKSB7IHJldHVybiBmYWxzZTsgfSBlbHNlIHsgIHJldHVybiB0cnVlOyB9XG4gIH1cblxuICBwcml2YXRlIGFkZENvbHVtbih0YWJsZTogc3RyaW5nLCBjb2w6IERCQ29sdW1uKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBjb2xTcWwgPSB0aGlzLmRlZkNvbHVtbihjb2wpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ2FsdGVyIFRBQkxFICcgKyB0YWJsZSArICcgYWRkIENPTFVNTiAnICsgY29sU3FsO1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHF1ZXJ5KTtcbiAgfVxuXG59XG5cblxuXG5leHBvcnQgY29uc3QgREJfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPERiQ29uZmlnPignZGJXcmFwcGVyQ29uZmlnJyk7XG5leHBvcnQgY29uc3QgREJfU0NIRU1BID0gbmV3IEluamVjdGlvblRva2VuPERCU2NoZW1hPignZGJXcmFwcGVyU2NoZW1hJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0RGJDb25maWcoKTogRGJDb25maWcge1xuICByZXR1cm4ge1xuICAgIGRiTmFtZTogJ2RiLnNxbGl0ZScsXG4gICAgbG9jYXRpb246ICdkZWZhdWx0JyxcbiAgICBpb3NEYXRhYmFzZUxvY2F0aW9uOiAnTGlicmFyeSdcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYldyYXBwZXIoZGJDb25maWc6IERiQ29uZmlnLCBkYlNjaGVtYT86IERCU2NoZW1hKTogRGJXcmFwcGVyU2VydmljZSB7XG4gIGNvbnN0IGNvbmZpZyA9ICEhZGJDb25maWcgPyBkYkNvbmZpZyA6IGdldERlZmF1bHREYkNvbmZpZygpO1xuICByZXR1cm4gbmV3IERiV3JhcHBlclNlcnZpY2UoY29uZmlnLCBkYlNjaGVtYSk7XG59XG5cblxuXG4iXX0=