db-wrapper 0.0.8 → 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,408 +1,410 @@
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
- const window = (new WindowService()).nativeWindow;
10
- if (dbSchema) {
11
- this.schema = dbSchema;
12
- }
13
- this._readyPromise = new Promise((resolve, reject) => {
14
- if (typeof window.cordova === 'undefined') {
15
- setTimeout(() => {
16
- this.init(dbSchema).then(() => {
17
- resolve();
18
- })
19
- .catch((err) => {
20
- reject(err);
21
- });
22
- }, 500);
23
- }
24
- else {
25
- document.addEventListener('deviceready', () => {
26
- console.log('dbWrapper: device ready.');
27
- this.initDevice(dbSchema).then(() => resolve()).catch((err) => reject(err));
28
- });
29
- }
30
- });
31
- }
32
- ready() {
33
- return this._readyPromise;
34
- }
35
- initDevice(dbSchema) {
36
- const window = (new WindowService()).nativeWindow;
37
- return new Promise((resolve, reject) => {
38
- this.db = window.sqlitePlugin.openDatabase({
39
- name: this._dbName,
40
- location: this._location,
41
- androidLockWorkaround: 1
42
- });
43
- if (dbSchema) {
44
- this.generate(dbSchema).catch(err => {
45
- reject(err);
46
- }).then(() => { resolve(); });
47
- }
48
- else {
49
- resolve();
50
- }
51
- });
52
- }
53
- init(dbSchema) {
54
- const window = (new WindowService()).nativeWindow;
55
- return new Promise((resolve, reject) => {
56
- this.db = window.openDatabase(this._dbName, '1.0', 'database', -1);
57
- if (dbSchema) {
58
- this.generate(dbSchema).catch(err => {
59
- reject(err);
60
- }).then(() => {
61
- resolve();
62
- });
63
- }
64
- else {
65
- resolve();
66
- }
67
- });
68
- }
69
- generate(schema) {
70
- const sentences = [];
71
- this.schema = schema;
72
- if (schema.tables) {
73
- schema.tables.forEach(table => {
74
- sentences.push(this.createTable(table));
75
- });
76
- }
77
- if (schema.views) {
78
- schema.views.forEach(view => {
79
- sentences.push(this.createView(view));
80
- });
81
- }
82
- if (sentences.length === 0) {
83
- throw new Error('Esquema de la base de datos vacia.');
84
- }
85
- return Promise.all(sentences);
86
- }
87
- createTable(table) {
88
- return __awaiter(this, void 0, void 0, function* () {
89
- let sql = '', onConflictPrimary;
90
- const sentences = [], newColumns = [];
91
- const tableDDL = yield this._tableExists(table.name);
92
- if (tableDDL) {
93
- table.columns.forEach(col => {
94
- if (!this._columnExists(tableDDL, col.name)) {
95
- newColumns.push(this.addColumn(table.name, col));
96
- }
97
- });
98
- }
99
- else {
100
- table.columns.forEach(col => {
101
- sentences.push(this.defColumn(col));
102
- });
103
- }
104
- onConflictPrimary = 'on conflict fail';
105
- if (Array.isArray(table.primary)) {
106
- sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary.join(',') + ') ' + onConflictPrimary);
107
- }
108
- if (typeof table.primary === 'string') {
109
- sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary + ') ' + onConflictPrimary);
110
- }
111
- if (table.uniques) {
112
- table.uniques.forEach(uniq => {
113
- sentences.push(this.defUnique(uniq));
114
- });
115
- }
116
- if (table.foreigns) {
117
- table.foreigns.forEach(fore => {
118
- sentences.push(this.defForeign(fore));
119
- });
120
- }
121
- if (tableDDL && newColumns.length !== 0) {
122
- return Promise.all(newColumns)
123
- .then(() => { console.log(`Table ${table.name} altered.`); })
124
- .catch((err) => {
125
- console.error(`Table ${table.name}: ${err.message}`);
126
- throw new Error(`Table ${table.name}: ${err.message}`);
127
- });
128
- }
129
- else if (!tableDDL) {
130
- sql = 'CREATE TABLE IF NOT EXISTS ' + table.name + ' (' + sentences.join(',') + ')';
131
- return this.query(sql)
132
- .then(() => { console.log(`Table ${table.name} created.`); })
133
- .catch((err) => {
134
- console.error(`Table ${table.name}: ${err.message}`);
135
- throw new Error(`Table ${table.name}: ${err.message}`);
136
- });
137
- }
138
- else {
139
- return Promise.resolve().then(() => { console.log(`Table ${table.name} initialized.`); });
140
- }
141
- });
142
- }
143
- createView(view) {
144
- let sql;
145
- sql = 'CREATE VIEW IF NOT EXISTS ' + view.name
146
- + ' AS ' + view.sql;
147
- return this.query(sql);
148
- }
149
- getSchemaTable(tableName) {
150
- let res;
151
- this.schema.tables.forEach(table => {
152
- if (table.name === tableName) {
153
- res = table;
154
- }
155
- });
156
- return res;
157
- }
158
- getUniquesTable(table) {
159
- let res;
160
- table.uniques.forEach(uniq => {
161
- res[uniq.name] = uniq;
162
- });
163
- return res;
164
- }
165
- query(query, bindings = []) {
166
- return new Promise((resolve, reject) => {
167
- if (query.indexOf('select') === 0) {
168
- this.db.readTransaction((transaction) => {
169
- transaction.executeSql(query, bindings, (transaction, result) => {
170
- resolve(result);
171
- }, (transaction, error) => {
172
- reject(error);
173
- });
174
- }, (err) => reject(err));
175
- }
176
- else {
177
- this.db.transaction((transaction) => {
178
- transaction.executeSql(query, bindings, (transaction, result) => {
179
- resolve(result);
180
- }, (transaction, error) => {
181
- reject(error);
182
- });
183
- }, (err) => reject(err));
184
- }
185
- });
186
- }
187
- Count(query, bindings = []) {
188
- return this.query(query, bindings).then(rows => {
189
- return this.rowsCount(rows);
190
- });
191
- }
192
- insert(table, bindings) {
193
- let sql = '', sqlBinds = [], sqlKeys = [], sqlValues = [];
194
- sql = sql + 'insert into ' + table + ' ';
195
- for (const index in bindings) {
196
- if (bindings.hasOwnProperty(index)) {
197
- sqlKeys.push(index);
198
- sqlValues.push(bindings[index]);
199
- sqlBinds.push('?');
200
- }
201
- }
202
- sql = sql + '(' + sqlKeys.join(',') + ') values (' + sqlBinds.join(',') + ')';
203
- return new Promise((resolve, reject) => {
204
- this.db.transaction(transaction => {
205
- transaction.executeSql(sql, sqlValues, (transaction, result) => {
206
- resolve(result);
207
- }, (transaction, error) => {
208
- reject(error);
209
- });
210
- });
211
- });
212
- }
213
- update(table, bindings, where) {
214
- let sql = '', sqlBinds = [], sqlKeys = [], sqlValues = [];
215
- sql = sql + 'update ' + table + ' set ';
216
- for (let index in bindings) {
217
- if (bindings.hasOwnProperty(index)) {
218
- let newObj = bindings[index];
219
- if (typeof newObj === 'object' && newObj !== null) {
220
- sqlValues.push(newObj.value);
221
- if (newObj.ifnull) {
222
- sqlBinds.push(index + ' = ifnull( ' + index + ',0) + ?');
223
- }
224
- else if (newObj.operator) {
225
- sqlBinds.push(index + ' = ' + index + newObj.operator + ' ?');
226
- }
227
- else {
228
- sqlBinds.push(index + ' = ?');
229
- }
230
- }
231
- else {
232
- sqlBinds.push(index + ' = ?');
233
- sqlValues.push(bindings[index]);
234
- }
235
- }
236
- }
237
- for (let index in where) {
238
- if (where.hasOwnProperty(index)) {
239
- if (typeof where[index] === 'object' && where[index] !== null) {
240
- sqlKeys.push(index + ' ' + where[index].operator + ' ?');
241
- sqlValues.push(where[index].value);
242
- }
243
- else {
244
- sqlKeys.push(index + ' = ?');
245
- sqlValues.push(where[index]);
246
- }
247
- }
248
- }
249
- sql = sql + sqlBinds.join(',') + ' where ' + sqlKeys.join(' and ');
250
- return new Promise((resolve, reject) => {
251
- this.db.transaction(transaction => {
252
- transaction.executeSql(sql, sqlValues, (transaction, result) => {
253
- resolve(result);
254
- }, (transaction, error) => {
255
- reject(error);
256
- });
257
- });
258
- });
259
- }
260
- dropTable(tables) {
261
- let cont = 1;
262
- cont = tables.length;
263
- return new Promise((resolve, reject) => {
264
- tables.some(table => {
265
- if (cont !== 0) {
266
- this.query('DROP TABLE ' + table)
267
- .then(() => {
268
- if (cont === 1) {
269
- resolve();
270
- }
271
- else {
272
- cont--;
273
- }
274
- }, err => {
275
- cont = 0;
276
- reject(err);
277
- return true;
278
- });
279
- return false;
280
- }
281
- });
282
- });
283
- }
284
- fetchAll(result) {
285
- let output = [];
286
- for (let i = 0; i < result.rows.length; i++) {
287
- output.push(result.rows.item(i));
288
- }
289
- return output;
290
- }
291
- fetch(result) {
292
- let objeto = undefined, newObj = undefined;
293
- if (result.rows.length !== 0) {
294
- objeto = result.rows.item(0);
295
- newObj = {};
296
- const keys = Object.keys(objeto);
297
- for (let key in keys) {
298
- newObj[keys[key]] = objeto[keys[key]];
299
- }
300
- }
301
- return newObj;
302
- }
303
- rowsCount(result) {
304
- return result.rows.length;
305
- }
306
- tableExists(table) {
307
- return this.query('select sql from sqlite_master ' +
308
- 'where type=\'table\' and name=\'' + table + '\'')
309
- .then(result => (this.rowsCount(result) === 1));
310
- }
311
- columnExists(table, column) {
312
- return this._tableExists(table)
313
- .then((tableDDL) => {
314
- if (tableDDL) {
315
- return this._columnExists(tableDDL, column);
316
- }
317
- else {
318
- return false;
319
- }
320
- });
321
- }
322
- /* Private */
323
- defColumn(col) {
324
- let colSql;
325
- colSql = col.name + ' ' + col.type;
326
- if (!col.isNullable) {
327
- colSql += ' NOT NULL ';
328
- }
329
- if (col.default) {
330
- colSql += ' DEFAULT ' + col.default + ' ';
331
- }
332
- if (col.type === 'text' && col.length) {
333
- colSql += ` CONSTRAINT ${col.name}_length CHECK ( `;
334
- if (col.isNullable) {
335
- colSql += `${col.name} is null OR `;
336
- }
337
- colSql += `length(${col.name}) <= ${col.length} )`;
338
- }
339
- return colSql;
340
- }
341
- defUnique(unique) {
342
- let uniqSql;
343
- // depende del entorno, producción o desarrollo
344
- const onConflictUnique = 'on conflict replace';
345
- if (Array.isArray(unique.fields)) {
346
- uniqSql = ` CONSTRAINT ${unique.name} UNIQUE ( ${unique.fields.join(',')} ) ${onConflictUnique} `;
347
- }
348
- if (typeof unique.fields === 'string') {
349
- uniqSql = ` CONSTRAINT ${unique.name} UNIQUE ( ${unique.fields} ) ${onConflictUnique} `;
350
- }
351
- return uniqSql;
352
- }
353
- defForeign(fore) {
354
- let foreSql;
355
- if (Array.isArray(fore.foreignKey)) {
356
- foreSql = ` FOREIGN KEY ( ${fore.foreignKey.join(',')} ) `;
357
- }
358
- if (typeof fore.foreignKey === 'string') {
359
- foreSql = ` FOREIGN KEY ( ${fore.foreignKey} ) `;
360
- }
361
- if (Array.isArray(fore.primaryKey)) {
362
- foreSql = ` REFERENCES ${fore.referenceTable} ( ${fore.primaryKey.join(',')} ) `;
363
- }
364
- if (typeof fore.primaryKey === 'string') {
365
- foreSql = ` REFERENCES ${fore.referenceTable} ( ${fore.primaryKey} ) `;
366
- }
367
- return foreSql;
368
- }
369
- _tableExists(table) {
370
- return this.query('select sql from sqlite_master ' +
371
- 'where type=\'table\' and name=\'' + table + '\'')
372
- .then(result => {
373
- if (this.rowsCount(result) === 1) {
374
- return this.fetch(result).sql;
375
- }
376
- else {
377
- return false;
378
- }
379
- });
380
- }
381
- _columnExists(tableDDL, column) {
382
- if (tableDDL.indexOf(column) === -1) {
383
- return false;
384
- }
385
- else {
386
- return true;
387
- }
388
- }
389
- addColumn(table, col) {
390
- const colSql = this.defColumn(col);
391
- const query = 'alter TABLE ' + table + ' add COLUMN ' + colSql;
392
- return this.query(query);
393
- }
394
- }
395
- export const DB_CONFIG = new InjectionToken('dbWrapperConfig');
396
- export const DB_SCHEMA = new InjectionToken('dbWrapperSchema');
397
- export function getDefaultDbConfig() {
398
- return {
399
- dbName: 'db.sqlite',
400
- location: 'default',
401
- iosDatabaseLocation: 'Library'
402
- };
403
- }
404
- export function provideDbWrapper(dbConfig, dbSchema) {
405
- const config = !!dbConfig ? dbConfig : getDefaultDbConfig();
406
- return new DbWrapperService(config, dbSchema);
407
- }
408
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItd3JhcHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGItd3JhcHBlci8iLCJzb3VyY2VzIjpbImxpYi9kYi13cmFwcGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSWpELE1BQU0sT0FBTyxnQkFBZ0I7SUFRM0IsWUFBWSxRQUFrQixFQUFFLFFBQW1CO1FBRWpELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDO1FBQ2hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLENBQUMsbUJBQW1CLElBQUksU0FBUyxDQUFDO1FBQ3RFLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUNsRCxJQUFJLFFBQVEsRUFBRTtZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO1NBQUU7UUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLE9BQU8sQ0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyRCxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxXQUFXLEVBQUU7Z0JBQ3pDLFVBQVUsQ0FBRSxHQUFHLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ3RCLEdBQUcsRUFBRTt3QkFDSCxPQUFPLEVBQUUsQ0FBQztvQkFDWixDQUFDLENBQUU7eUJBQ0YsS0FBSyxDQUFHLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQ2YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNkLENBQUMsQ0FBRSxDQUFDO2dCQUNSLENBQUMs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WUFBRyxPQUFPLElBQUksQ0FBQztTQUFFO0lBQy9FLENBQUM7SUFFTyxTQUFTLENBQUMsS0FBYSxFQUFFLEdBQWE7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxjQUFjLEdBQUcsS0FBSyxHQUFHLGNBQWMsR0FBRyxNQUFNLENBQUM7UUFDL0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7Q0FFRjtBQUlELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3pFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0FBRXpFLE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsT0FBTztRQUNMLE1BQU0sRUFBRSxXQUFXO1FBQ25CLFFBQVEsRUFBRSxTQUFTO1FBQ25CLG1CQUFtQixFQUFFLFNBQVM7S0FDL0IsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBa0IsRUFBRSxRQUFtQjtJQUN0RSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgV2luZG93U2VydmljZSB9IGZyb20gJy4vd2luZG93LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEQlRhYmxlLCBEYkNvbmZpZywgREJTY2hlbWEsIERCVmlldyxcclxuICBEQkNvbHVtbiwgREJVbmlxdWUsIERCRm9yZWlnbiwgU3FsVHJhbnNhY3Rpb24sIFNxbFJlc3VsdFNldCwgU3FsRXJyb3IsIERlZmF1bHRUeXBlIH0gZnJvbSAnLi9kYi13cmFwcGVyLm1vZGVscyc7XHJcblxyXG5leHBvcnQgY2xhc3MgRGJXcmFwcGVyU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBfZGJOYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfbG9jYXRpb246IHN0cmluZztcclxuICBwcml2YXRlIF9pb3NEYXRhYmFzZUxvY2F0aW9uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfcmVhZHlQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xyXG4gIHNjaGVtYTogREJTY2hlbWE7XHJcbiAgZGI6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoZGJDb25maWc6IERiQ29uZmlnLCBkYlNjaGVtYT86IERCU2NoZW1hKSB7XHJcblxyXG4gICAgdGhpcy5fZGJOYW1lID0gZGJDb25maWcuZGJOYW1lO1xyXG4gICAgdGhpcy5fbG9jYXRpb24gPSBkYkNvbmZpZy5sb2NhdGlvbiB8fCAnZGVmYXVsdCc7XHJcbiAgICB0aGlzLl9pb3NEYXRhYmFzZUxvY2F0aW9uID0gZGJDb25maWcuaW9zRGF0YWJhc2VMb2NhdGlvbiB8fCAnTGlicmFyeSc7XHJcbiAgICBjb25zdCB3aW5kb3cgPSAobmV3IFdpbmRvd1NlcnZpY2UoKSkubmF0aXZlV2luZG93O1xyXG4gICAgaWYgKGRiU2NoZW1hKSB7IHRoaXMuc2NoZW1hID0gZGJTY2hlbWE7IH1cclxuICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlICggKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5jb3Jkb3ZhID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHNldFRpbWVvdXQoICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW5pdChkYlNjaGVtYSkudGhlbiAoXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0gKVxyXG4gICAgICAgICAgICAuY2F0Y2ggKCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgIH0gKTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgKCkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ2RiV3JhcHBlcjogZGV2aWNlIHJlYWR5LicpO1xyXG4gICAgICAgICAgdGhpcy5pbml0RGV2aWNlKGRiU2NoZW1hKS50aGVuICggKCkgPT4gcmVzb2x2ZSgpICkuY2F0Y2ggKCAoZXJyKSA9PiByZWplY3QoZXJyKSApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlYWR5UHJvbWlzZTtcclxuICB9XHJcblxyXG4gIGluaXREZXZpY2UoZGJTY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB3aW5kb3cgPSAobmV3IFdpbmRvd1NlcnZpY2UoKSkubmF0aXZlV2luZG93O1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKCAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGIgPSB3aW5kb3cuc3FsaXRlUGx1Z2luLm9wZW5EYXRhYmFzZSh7XHJcbiAgICAgICAgbmFtZTogdGhpcy5fZGJOYW1lLFxyXG4gICAgICAgIGxvY2F0aW9uOiB0aGlzLl9sb2NhdGlvbixcclxuICAgICAgICBhbmRyb2lkTG9ja1dvcmthcm91bmQ6IDFcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoZGJTY2hlbWEpIHtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlKGRiU2NoZW1hKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSkudGhlbigoKSA9PiB7IHJlc29sdmUoKTsgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGluaXQoZGJTY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB3aW5kb3cgPSAobmV3IFdpbmRvd1NlcnZpY2UoKSkubmF0aXZlV2luZG93O1xyXG4gICAgcmV0dXJuICBuZXcgUHJvbWlzZSAoIChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5kYiA9IHdpbmRvdy5vcGVuRGF0YWJhc2UodGhpcy5fZGJOYW1lLCAnMS4wJywgJ2RhdGFiYXNlJywgLTEpO1xyXG4gICAgICBpZiAoZGJTY2hlbWEpIHtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlKGRiU2NoZW1hKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICB9KS50aGVuKCAoKSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlKHNjaGVtYTogREJTY2hlbWEpOiBQcm9taXNlPGFueT4ge1xyXG5cclxuICAgIGNvbnN0IHNlbnRlbmNlcyA9IFtdO1xyXG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XHJcblxyXG4gICAgaWYgKHNjaGVtYS50YWJsZXMpIHtcclxuICAgICAgc2NoZW1hLnRhYmxlcy5mb3JFYWNoKHRhYmxlID0+IHtcclxuICAgICAgICBzZW50ZW5jZXMucHVzaCh0aGlzLmNyZWF0ZVRhYmxlKHRhYmxlKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHNjaGVtYS52aWV3cykge1xyXG4gICAgICBzY2hlbWEudmlld3MuZm9yRWFjaCggdmlldyA9PiB7XHJcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5jcmVhdGVWaWV3KHZpZXcpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoc2VudGVuY2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VzcXVlbWEgZGUgbGEgYmFzZSBkZSBkYXRvcyB2YWNpYS4nKTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLmFsbChzZW50ZW5jZXMpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY3JlYXRlVGFibGUodGFibGU6IERCVGFibGUpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbGV0IHNxbCA9ICcnLCAgb25Db25mbGljdFByaW1hcnk7XHJcbiAgICBjb25zdCBzZW50ZW5jZXMgPSBbXSwgIG5ld0NvbHVtbnMgPSBbXVxyXG5cclxuICAgIGNvbnN0IHRhYmxlRERMID0gYXdhaXQgdGhpcy5fdGFibGVFeGlzdHModGFibGUubmFtZSk7XHJcbiAgICBpZiAodGFibGVEREwpIHtcclxuICAgICAgICB0YWJsZS5jb2x1bW5zLmZvckVhY2goIGNvbCA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX2NvbHVtbkV4aXN0cyh0YWJsZURETCBhcyBzdHJpbmcsIGNvbC5uYW1lKSApIHtcclxuICAgICAgICAgICAgbmV3Q29sdW1ucy5wdXNoKHRoaXMuYWRkQ29sdW1uKHRhYmxlLm5hbWUsIGNvbCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGFibGUuY29sdW1ucy5mb3JFYWNoKCBjb2wgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuZGVmQ29sdW1uKGNvbCkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIG9uQ29uZmxpY3RQcmltYXJ5ID0gJ29uIGNvbmZsaWN0IGZhaWwnO1xyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRhYmxlLnByaW1hcnkpICkgIHtcclxuICAgICAgc2VudGVuY2VzLnB1c2ggKCcgQ09OU1RSQUlOVCBpZGVudGlmaWNhZG9yIFBSSU1BUlkgS0VZICgnICsgdGFibGUucHJpbWFyeS5qb2luKCcsJykgKyAnKSAnICsgb25Db25mbGljdFByaW1hcnkgKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdGFibGUucHJpbWFyeSA9PT0gJ3N0cmluZycpICAge1xyXG4gICAgICBzZW50ZW5jZXMucHVzaCAoJyBDT05TVFJBSU5UIGlkZW50aWZpY2Fkb3IgUFJJTUFSWSBLRVkgKCcgKyB0YWJsZS5wcmltYXJ5ICsgJykgJyArIG9uQ29uZmxpY3RQcmltYXJ5ICk7XHJcbiAgICB9XHJcbiAgICBpZiAodGFibGUudW5pcXVlcykge1xyXG4gICAgICB0YWJsZS51bmlxdWVzLmZvckVhY2goIHVuaXEgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuZGVmVW5pcXVlKHVuaXEpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRhYmxlLmZvcmVpZ25zKSB7XHJcbiAgICAgIHRhYmxlLmZvcmVpZ25zLmZvckVhY2ggKCBmb3JlID0+IHtcclxuICAgICAgICBzZW50ZW5jZXMucHVzaCh0aGlzLmRlZkZvcmVpZ24oZm9yZSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGFibGVEREwgJiYgbmV3Q29sdW1ucy5sZW5ndGggIT09IDApIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG5ld0NvbHVtbnMpXHJcbiAgICAgIC50aGVuKCAoKSA9PiB7IGNvbnNvbGUubG9nKGBUYWJsZSAke3RhYmxlLm5hbWV9IGFsdGVyZWQuYCk7IH0gKVxyXG4gICAgICAuY2F0Y2goIChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yIChgVGFibGUgJHt0YWJsZS5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlICR7dGFibGUubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoIXRhYmxlRERMKSB7XHJcbiAgICAgIHNxbCA9ICdDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAnICsgdGFibGUubmFtZSArICcgKCcgKyBzZW50ZW5jZXMuam9pbignLCcpICsgJyknO1xyXG4gICAgICByZXR1cm4gdGhpcy5xdWVyeShzcWwpXHJcbiAgICAgIC50aGVuKCAoKSA9PiB7IGNvbnNvbGUubG9nKGBUYWJsZSAke3RhYmxlLm5hbWV9IGNyZWF0ZWQuYCk7IH0pXHJcbiAgICAgIC5jYXRjaCggKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IgKGBUYWJsZSAke3RhYmxlLm5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgJHt0YWJsZS5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbiggKCkgPT4geyBjb25zb2xlLmxvZyhgVGFibGUgJHt0YWJsZS5uYW1lfSBpbml0aWFsaXplZC5gKTsgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgY3JlYXRlVmlldyh2aWV3OiBEQlZpZXcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbGV0IHNxbDogc3RyaW5nO1xyXG5cclxuICAgIHNxbCA9ICdDUkVBVEUgVklFVyBJRiBOT1QgRVhJU1RTICcgKyB2aWV3Lm5hbWVcclxuICAgICAgKyAnIEFTICcgKyB2aWV3LnNxbDtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5xdWVyeShzcWwpO1xyXG5cclxuICB9XHJcblxyXG4gIGdldFNjaGVtYVRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogREJUYWJsZSB7XHJcbiAgICBsZXQgcmVzOiBEQlRhYmxlO1xyXG5cclxuICAgIHRoaXMuc2NoZW1hLnRhYmxlcy5mb3JFYWNoKCB0YWJsZSA9PiB7XHJcbiAgICAgIGlmICh0YWJsZS5uYW1lID09PSB0YWJsZU5hbWUpIHtcclxuICAgICAgICByZXMgPSB0YWJsZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzO1xyXG5cclxuICB9XHJcblxyXG4gIGdldFVuaXF1ZXNUYWJsZSh0YWJsZTogREJUYWJsZSk6IG9iamVjdCB7XHJcbiAgICBsZXQgcmVzOiB7fTtcclxuICAgIHRhYmxlLnVuaXF1ZXMuZm9yRWFjaCh1bmlxID0+IHtcclxuICAgICAgcmVzW3VuaXEubmFtZV0gPSB1bmlxO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcXVlcnkocXVlcnk6IHN0cmluZywgYmluZGluZ3M6IGFueVtdPSBbXSk6IFByb21pc2U8U3FsUmVzdWx0U2V0PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAocXVlcnkuaW5kZXhPZignc2VsZWN0JykgPT09IDApIHtcclxuICAgICAgICB0aGlzLmRiLnJlYWRUcmFuc2FjdGlvbigodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIGJpbmRpbmdzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCBlcnJvcjogU3FsRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIChlcnI6IFNxbEVycm9yKSA9PiByZWplY3QoZXJyKSApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGIudHJhbnNhY3Rpb24oKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbikgPT4ge1xyXG4gICAgICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHF1ZXJ5LCBiaW5kaW5ncywgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgcmVzdWx0OiBTcWxSZXN1bHRTZXQpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgfSwgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgZXJyb3I6IFNxbEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LCAoZXJyOiBTcWxFcnJvcikgPT4gcmVqZWN0KGVycikgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBDb3VudChxdWVyeTogc3RyaW5nLCBiaW5kaW5nczogYW55W109IFtdKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHF1ZXJ5LCBiaW5kaW5ncykudGhlbihyb3dzID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dzQ291bnQocm93cyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGluc2VydCh0YWJsZTogc3RyaW5nLCBiaW5kaW5nczoge30pOiBQcm9taXNlPFNxbFJlc3VsdFNldD4ge1xyXG4gICAgbGV0IHNxbCA9ICcnLCBzcWxCaW5kcyA9IFtdLCBzcWxLZXlzID0gW10sIHNxbFZhbHVlcyA9IFtdIDtcclxuXHJcbiAgICBzcWwgPSBzcWwgKyAnaW5zZXJ0IGludG8gJyArIHRhYmxlICsgJyAnO1xyXG5cclxuICAgIGZvciAoY29uc3QgaW5kZXggaW4gYmluZGluZ3MpIHtcclxuICAgICAgIGlmIChiaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcclxuICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4KTtcclxuICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2goYmluZGluZ3NbaW5kZXhdKTtcclxuICAgICAgICAgICAgc3FsQmluZHMucHVzaCgnPycpO1xyXG4gICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNxbCA9IHNxbCArICcoJyArIHNxbEtleXMuam9pbignLCcpICsgJykgdmFsdWVzICgnICsgc3FsQmluZHMuam9pbignLCcpICsgJyknO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5kYi50cmFuc2FjdGlvbih0cmFuc2FjdGlvbiA9PiB7XHJcbiAgICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHNxbCwgc3FsVmFsdWVzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgIH0sICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIGVycm9yOiBTcWxFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZSh0YWJsZTogc3RyaW5nLCBiaW5kaW5nczoge30sIHdoZXJlOiB7fSk6IFByb21pc2U8U3FsUmVzdWx0U2V0PiB7XHJcbiAgICBsZXQgc3FsID0gJycsIHNxbEJpbmRzID0gW10sIHNxbEtleXMgPVtdLCBzcWxWYWx1ZXMgPSBbXSA7XHJcblxyXG4gICAgc3FsID0gc3FsICsgJ3VwZGF0ZSAnICsgdGFibGUgKyAnIHNldCAnO1xyXG5cclxuICAgIGZvciAobGV0IGluZGV4IGluIGJpbmRpbmdzKSB7XHJcbiAgICAgICBpZiAoYmluZGluZ3MuaGFzT3duUHJvcGVydHkoaW5kZXgpKSB7XHJcbiAgICAgICAgICAgIGxldCBuZXdPYmogPSBiaW5kaW5nc1tpbmRleF07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3T2JqID09PSAnb2JqZWN0JyAmJiBuZXdPYmogIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKG5ld09iai52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV3T2JqLmlmbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gaWZudWxsKCAnICsgaW5kZXggKyAnLDApICsgPycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdPYmoub3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBzcWxCaW5kcy5wdXNoKGluZGV4ICsgJyA9ICcgKyBpbmRleCArIG5ld09iai5vcGVyYXRvciArICcgPycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzcWxCaW5kcy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzcWxCaW5kcy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKGJpbmRpbmdzW2luZGV4XSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggaW4gd2hlcmUpIHtcclxuICAgICAgIGlmICh3aGVyZS5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aGVyZVtpbmRleF0gPT09ICdvYmplY3QnICAmJiB3aGVyZVtpbmRleF0gIT09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4ICsgJyAnICsgd2hlcmVbaW5kZXhdLm9wZXJhdG9yICsgJyA/Jyk7XHJcbiAgICAgICAgICAgICAgICBzcWxWYWx1ZXMucHVzaCh3aGVyZVtpbmRleF0udmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKHdoZXJlW2luZGV4XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzcWwgPSBzcWwgKyBzcWxCaW5kcy5qb2luKCcsJykgKyAnIHdoZXJlICcgKyBzcWxLZXlzLmpvaW4oJyBhbmQgJyk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRiLnRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uID0+IHtcclxuICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHNxbCwgc3FsVmFsdWVzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSwgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgZXJyb3I6IFNxbEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkcm9wVGFibGUgKHRhYmxlczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjb250ID0gMTtcclxuXHJcbiAgICBjb250ID0gdGFibGVzLmxlbmd0aDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRhYmxlcy5zb21lKCB0YWJsZSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbnQgIT09IDApIHtcclxuICAgICAgICAgIHRoaXMucXVlcnkoJ0RST1AgVEFCTEUgJyArIHRhYmxlKVxyXG4gICAgICAgICAgLnRoZW4oICgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoY29udCA9PT0gMSApIHsgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7IGNvbnQtLTsgfVxyXG4gICAgICAgICAgfSwgZXJyID0+IHtcclxuICAgICAgICAgICAgY29udCA9IDA7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZmV0Y2hBbGwocmVzdWx0OiBTcWxSZXN1bHRTZXQpOiBvYmplY3RbXSB7XHJcbiAgICBsZXQgb3V0cHV0ID0gW107XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG91dHB1dC5wdXNoKHJlc3VsdC5yb3dzLml0ZW0oaSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgfVxyXG5cclxuICBmZXRjaChyZXN1bHQ6IFNxbFJlc3VsdFNldCk6IG9iamVjdCB7XHJcbiAgICAgIGxldCBvYmpldG8gPSB1bmRlZmluZWQsIG5ld09iaj0gdW5kZWZpbmVkO1xyXG4gICAgICBpZiAocmVzdWx0LnJvd3MubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICBvYmpldG8gPSByZXN1bHQucm93cy5pdGVtKDApO1xyXG4gICAgICAgICAgbmV3T2JqID0ge307XHJcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZXRvKTtcclxuICAgICAgICAgIGZvciAobGV0IGtleSBpbiBrZXlzKSB7XHJcbiAgICAgICAgICAgICAgbmV3T2JqW2tleXNba2V5XV0gPSBvYmpldG9ba2V5c1trZXldXTtcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3T2JqO1xyXG4gIH1cclxuXHJcblxyXG4gIHJvd3NDb3VudChyZXN1bHQ6IFNxbFJlc3VsdFNldCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiByZXN1bHQucm93cy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICB0YWJsZUV4aXN0cyh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnc2VsZWN0ICBzcWwgZnJvbSBzcWxpdGVfbWFzdGVyICcgK1xyXG4gICAgICAgICd3aGVyZSB0eXBlPVxcJ3RhYmxlXFwnIGFuZCBuYW1lPVxcJycgKyB0YWJsZSArICdcXCcnKVxyXG4gICAgLnRoZW4ocmVzdWx0ID0+ICAodGhpcy5yb3dzQ291bnQocmVzdWx0KSA9PT0gMSkgKTtcclxuICB9ICBcclxuXHJcbiAgY29sdW1uRXhpc3RzKHRhYmxlOiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFibGVFeGlzdHModGFibGUpXHJcbiAgICAgIC50aGVuKCh0YWJsZURETCkgPT4ge1xyXG4gICAgICAgIGlmICh0YWJsZURETCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkV4aXN0cygodGFibGVEREwgYXMgc3RyaW5nKSwgY29sdW1uKTtcclxuICAgICAgICB9IGVsc2UgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuLyogUHJpdmF0ZSAqL1xyXG5cclxuICBwcml2YXRlIGRlZkNvbHVtbihjb2w6IERCQ29sdW1uKTogc3RyaW5nIHtcclxuICAgIGxldCBjb2xTcWw6IHN0cmluZztcclxuXHJcbiAgICBjb2xTcWwgPSBjb2wubmFtZSArICcgJyArIGNvbC50eXBlO1xyXG4gICAgaWYgKCFjb2wuaXNOdWxsYWJsZSkge1xyXG4gICAgICBjb2xTcWwgKz0gICcgTk9UIE5VTEwgJztcclxuICAgIH1cclxuICAgIGlmIChjb2wuZGVmYXVsdCkge1xyXG4gICAgICBjb2xTcWwgKz0gJyBERUZBVUxUICcgKyBjb2wuZGVmYXVsdCArICcgJztcclxuICAgIH1cclxuICAgIGlmIChjb2wudHlwZSA9PT0gJ3RleHQnICYmIGNvbC5sZW5ndGgpIHtcclxuICAgICAgY29sU3FsICs9IGAgQ09OU1RSQUlOVCAke2NvbC5uYW1lfV9sZW5ndGggQ0hFQ0sgKCBgO1xyXG4gICAgICBpZiAoY29sLmlzTnVsbGFibGUpIHtcclxuICAgICAgICBjb2xTcWwgKz0gYCR7Y29sLm5hbWV9IGlzIG51bGwgT1IgYDtcclxuICAgICAgfVxyXG4gICAgICBjb2xTcWwgKz0gYGxlbmd0aCgke2NvbC5uYW1lfSkgPD0gJHtjb2wubGVuZ3RofSApYDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbFNxbDtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlZlVuaXF1ZSh1bmlxdWU6IERCVW5pcXVlKTogc3RyaW5nIHtcclxuICAgIGxldCB1bmlxU3FsOiBzdHJpbmc7XHJcblxyXG4gICAgLy8gZGVwZW5kZSBkZWwgZW50b3JubywgcHJvZHVjY2nDs24gbyBkZXNhcnJvbGxvXHJcbiAgICBjb25zdCBvbkNvbmZsaWN0VW5pcXVlID0gJ29uIGNvbmZsaWN0IHJlcGxhY2UnO1xyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHVuaXF1ZS5maWVsZHMpICkgIHtcclxuICAgICAgdW5pcVNxbCA9IGAgQ09OU1RSQUlOVCAke3VuaXF1ZS5uYW1lfSBVTklRVUUgKCAke3VuaXF1ZS5maWVsZHMuam9pbignLCcpfSApICR7b25Db25mbGljdFVuaXF1ZX0gYDtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdW5pcXVlLmZpZWxkcyA9PT0gJ3N0cmluZycpICAge1xyXG4gICAgICB1bmlxU3FsID0gYCBDT05TVFJBSU5UICR7dW5pcXVlLm5hbWV9IFVOSVFVRSAoICR7dW5pcXVlLmZpZWxkc30gKSAke29uQ29uZmxpY3RVbmlxdWV9IGA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuaXFTcWw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlZkZvcmVpZ24oZm9yZTogREJGb3JlaWduKTogc3RyaW5nIHtcclxuICAgIGxldCBmb3JlU3FsOiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9yZS5mb3JlaWduS2V5KSApICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIEZPUkVJR04gS0VZICggICR7Zm9yZS5mb3JlaWduS2V5LmpvaW4oJywnKX0gKSBgO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZm9yZS5mb3JlaWduS2V5ID09PSAnc3RyaW5nJykgICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIEZPUkVJR04gS0VZICggICR7Zm9yZS5mb3JlaWduS2V5fSApIGA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9yZS5wcmltYXJ5S2V5KSApICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIFJFRkVSRU5DRVMgJHtmb3JlLnJlZmVyZW5jZVRhYmxlfSAoICAke2ZvcmUucHJpbWFyeUtleS5qb2luKCcsJyl9ICkgYDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGZvcmUucHJpbWFyeUtleSA9PT0gJ3N0cmluZycpICAge1xyXG4gICAgICBmb3JlU3FsID0gYCBSRUZFUkVOQ0VTICR7Zm9yZS5yZWZlcmVuY2VUYWJsZX0gKCAgJHtmb3JlLnByaW1hcnlLZXl9ICkgYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9yZVNxbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RhYmxlRXhpc3RzKHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCdzZWxlY3QgIHNxbCBmcm9tIHNxbGl0ZV9tYXN0ZXIgJyArXHJcbiAgICAgICAgJ3doZXJlIHR5cGU9XFwndGFibGVcXCcgYW5kIG5hbWU9XFwnJyArIHRhYmxlICsgJ1xcJycpXHJcbiAgICAudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnJvd3NDb3VudChyZXN1bHQpID09PSAxKSB7IHJldHVybiAodGhpcy5mZXRjaChyZXN1bHQpIGFzIGFueSkuc3FsIGFzIHN0cmluZzsgfSBlbHNlIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbHVtbkV4aXN0cyh0YWJsZURETDogc3RyaW5nLCBjb2x1bW46IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICh0YWJsZURETC5pbmRleE9mKGNvbHVtbikgPT09IC0xKSB7IHJldHVybiBmYWxzZTsgfSBlbHNlIHsgIHJldHVybiB0cnVlOyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENvbHVtbih0YWJsZTogc3RyaW5nLCBjb2w6IERCQ29sdW1uKTogUHJvbWlzZTxhbnk+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=