@resolveio/client-lib-core 15.5.3 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/esm2022/lib/account-manager.service.mjs +229 -0
  2. package/esm2022/lib/auth/auth-guard.service.mjs +174 -0
  3. package/esm2022/lib/auth/auth-permissions.service.mjs +23 -0
  4. package/esm2022/lib/auth/auth.service.mjs +251 -0
  5. package/esm2022/lib/auth/auth365.component.mjs +51 -0
  6. package/esm2022/lib/auth/can-deactivate-guard.service.mjs +13 -0
  7. package/esm2022/lib/auth/enroll.component.mjs +88 -0
  8. package/esm2022/lib/auth/forgot-password.component.mjs +89 -0
  9. package/esm2022/lib/core.component.mjs +404 -0
  10. package/esm2022/lib/core.module.mjs +176 -0
  11. package/esm2022/lib/core.service.mjs +88 -0
  12. package/esm2022/lib/directive/focus.mjs +24 -0
  13. package/esm2022/lib/directive/scroll.mjs +54 -0
  14. package/esm2022/lib/home/home.component.mjs +84 -0
  15. package/esm2022/lib/logger/logger.component.mjs +229 -0
  16. package/esm2022/lib/models/app-status.model.mjs +2 -0
  17. package/esm2022/lib/models/collection-document.model.mjs +2 -0
  18. package/esm2022/lib/models/cron-job.model.mjs +2 -0
  19. package/esm2022/lib/models/dialog.model.mjs +2 -0
  20. package/esm2022/lib/models/file.model.mjs +2 -0
  21. package/esm2022/lib/models/log-method-latency.model.mjs +2 -0
  22. package/esm2022/lib/models/navbar-main-tab.model.mjs +2 -0
  23. package/esm2022/lib/models/pagination.model.mjs +2 -0
  24. package/esm2022/lib/models/permission.model.mjs +2 -0
  25. package/esm2022/lib/models/select-data-label.model.mjs +2 -0
  26. package/esm2022/lib/models/subscription.model.mjs +2 -0
  27. package/esm2022/lib/models/support-ticket.model.mjs +2 -0
  28. package/esm2022/lib/models/user-group.model.mjs +2 -0
  29. package/esm2022/lib/models/user.model.mjs +2 -0
  30. package/esm2022/lib/offline-db.mjs +519 -0
  31. package/esm2022/lib/offline-manager.service.mjs +109 -0
  32. package/esm2022/lib/pipes/domsanitizor.pipe.mjs +29 -0
  33. package/esm2022/lib/pipes/filter.pipe.mjs +36 -0
  34. package/esm2022/lib/pipes/json-parse.pipe.mjs +29 -0
  35. package/esm2022/lib/pipes/minus-currency.pipe.mjs +16 -0
  36. package/esm2022/lib/pipes/phone.pipe.mjs +47 -0
  37. package/esm2022/lib/pipes/pipe.module.mjs +54 -0
  38. package/esm2022/lib/pipes/reverse-list.pipe.mjs +17 -0
  39. package/esm2022/lib/pipes/titlecase.pipe.mjs +22 -0
  40. package/esm2022/lib/report-builder.permission.mjs +13 -0
  41. package/esm2022/lib/resolveio-class.mjs +50 -0
  42. package/esm2022/lib/shared/shared.module.mjs +96 -0
  43. package/esm2022/lib/socket-manager.service.mjs +340 -0
  44. package/esm2022/lib/socket.service.mjs +200 -0
  45. package/esm2022/lib/super-admin.permission.mjs +9 -0
  46. package/esm2022/lib/support-ticket/detail/support-ticket-detail.component.mjs +211 -0
  47. package/esm2022/lib/support-ticket/edit/support-ticket-edit.component.mjs +131 -0
  48. package/esm2022/lib/support-ticket/list/support-ticket-list.component.mjs +142 -0
  49. package/esm2022/lib/support-ticket/new/support-ticket-new.component.mjs +121 -0
  50. package/esm2022/lib/support-ticket/support-ticket.component.mjs +67 -0
  51. package/esm2022/lib/support-ticket/support-ticket.module.mjs +50 -0
  52. package/esm2022/lib/support-ticket/support-ticket.routing.mjs +20 -0
  53. package/esm2022/lib/support-ticket/support-ticket.service.mjs +16 -0
  54. package/esm2022/lib/token-manager.service.mjs +25 -0
  55. package/esm2022/lib/user-settings/settings/users-settings.component.mjs +302 -0
  56. package/esm2022/lib/user-settings/user-settings.component.mjs +61 -0
  57. package/esm2022/lib/user-settings/user-settings.module.mjs +41 -0
  58. package/esm2022/lib/user-settings/user-settings.permission.mjs +10 -0
  59. package/esm2022/lib/user-settings/user-settings.routing.mjs +14 -0
  60. package/esm2022/lib/user-settings/user-settings.service.mjs +16 -0
  61. package/esm2022/lib/util/action-name.helper.mjs +9 -0
  62. package/esm2022/lib/util/aws.service.mjs +80 -0
  63. package/esm2022/lib/util/common.helper.mjs +133 -0
  64. package/esm2022/lib/util/validation.service.mjs +185 -0
  65. package/esm2022/lib/util/window-resize.service.mjs +38 -0
  66. package/esm2022/lib/util/window.service.mjs +16 -0
  67. package/esm2022/lib/widgets/alert/alert.model.mjs +2 -0
  68. package/esm2022/lib/widgets/alert/alert.service.mjs +79 -0
  69. package/esm2022/lib/widgets/collapse-table/collapse-table.component.mjs +83 -0
  70. package/esm2022/lib/widgets/collapse-table/collapse-table.module.mjs +34 -0
  71. package/esm2022/lib/widgets/data-table/data-table.component.mjs +84 -0
  72. package/esm2022/lib/widgets/data-table/data-table.model.mjs +2 -0
  73. package/esm2022/lib/widgets/data-table/data-table.module.mjs +41 -0
  74. package/esm2022/lib/widgets/date-shortcut/date-shortcut.component.mjs +198 -0
  75. package/esm2022/lib/widgets/date-shortcut/date-shortcut.module.mjs +32 -0
  76. package/esm2022/lib/widgets/dialog/dialog.confirm.content.mjs +67 -0
  77. package/esm2022/lib/widgets/dialog/dialog.error.content.mjs +60 -0
  78. package/esm2022/lib/widgets/dialog/dialog.input.content.mjs +200 -0
  79. package/esm2022/lib/widgets/dialog/dialog.login.content.mjs +354 -0
  80. package/esm2022/lib/widgets/dialog/dialog.notify.content.mjs +60 -0
  81. package/esm2022/lib/widgets/dialog/dialog.register.content.mjs +333 -0
  82. package/esm2022/lib/widgets/dialog/dialog.select-array-objs.content.mjs +203 -0
  83. package/esm2022/lib/widgets/dialog/dialog.select-array.content.mjs +310 -0
  84. package/esm2022/lib/widgets/dialog/dialog.select-data-labels.content.mjs +196 -0
  85. package/esm2022/lib/widgets/dialog/dialog.select-datetime.content.mjs +191 -0
  86. package/esm2022/lib/widgets/dialog/dialog.select-with-buttons-url.content.mjs +166 -0
  87. package/esm2022/lib/widgets/dialog/dialog.service.mjs +98 -0
  88. package/esm2022/lib/widgets/file/file-upload.component.mjs +433 -0
  89. package/esm2022/lib/widgets/file/file-upload.module.mjs +48 -0
  90. package/esm2022/lib/widgets/form-button/form-button.component.mjs +97 -0
  91. package/esm2022/lib/widgets/form-button/form-button.module.mjs +28 -0
  92. package/esm2022/lib/widgets/navbar-main/navbar-main.component.mjs +222 -0
  93. package/esm2022/lib/widgets/navbar-module/navbar-module.component.mjs +108 -0
  94. package/esm2022/lib/widgets/navbar-module/navbar-module.model.mjs +2 -0
  95. package/esm2022/lib/widgets/responsive-button-group/responsive-button-group.component.mjs +41 -0
  96. package/esm2022/lib/widgets/responsive-button-group/responsive-button-group.module.mjs +24 -0
  97. package/esm2022/lib/widgets/scheduler/scheduler.component.mjs +186 -0
  98. package/esm2022/lib/widgets/scheduler/scheduler.module.mjs +37 -0
  99. package/esm2022/lib/widgets/sort-table/sort-table-header.component.mjs +72 -0
  100. package/esm2022/lib/widgets/sort-table/sort-table-ngfor.component.mjs +49 -0
  101. package/esm2022/lib/widgets/sort-table/sort-table.directive.mjs +177 -0
  102. package/esm2022/lib/widgets/sort-table/sort-table.module.mjs +38 -0
  103. package/esm2022/lib/widgets/user-role/user-role.component.mjs +29 -0
  104. package/esm2022/lib/widgets/user-role/user-role.module.mjs +24 -0
  105. package/esm2022/public_api.mjs +91 -0
  106. package/esm2022/resolveio-client-lib-core.mjs +5 -0
  107. package/fesm2022/resolveio-client-lib-core.mjs +9019 -0
  108. package/fesm2022/resolveio-client-lib-core.mjs.map +1 -0
  109. package/index.d.ts +3 -0
  110. package/lib/auth/auth-guard.service.d.ts +2 -2
  111. package/lib/auth/can-deactivate-guard.service.d.ts +1 -2
  112. package/lib/core.component.d.ts +1 -2
  113. package/lib/core.module.d.ts +26 -29
  114. package/lib/directive/focus.d.ts +1 -1
  115. package/lib/directive/scroll.d.ts +1 -1
  116. package/lib/logger/logger.component.d.ts +0 -2
  117. package/lib/models/dialog.model.d.ts +1 -1
  118. package/lib/models/pagination.model.d.ts +1 -0
  119. package/lib/models/user-group.model.d.ts +0 -1
  120. package/lib/offline-db.d.ts +1 -5
  121. package/lib/offline-manager.service.d.ts +1 -4
  122. package/lib/socket-manager.service.d.ts +5 -34
  123. package/lib/socket.service.d.ts +3 -20
  124. package/lib/token-manager.service.d.ts +2 -4
  125. package/lib/util/aws.service.d.ts +1 -2
  126. package/lib/util/common.helper.d.ts +1 -3
  127. package/lib/util/window-resize.service.d.ts +6 -5
  128. package/lib/widgets/collapse-table/collapse-table.component.d.ts +1 -1
  129. package/lib/widgets/data-table/data-table.component.d.ts +1 -1
  130. package/lib/widgets/date-shortcut/date-shortcut.component.d.ts +1 -5
  131. package/lib/widgets/dialog/dialog.confirm.content.d.ts +1 -1
  132. package/lib/widgets/dialog/dialog.error.content.d.ts +1 -1
  133. package/lib/widgets/dialog/dialog.input.content.d.ts +1 -1
  134. package/lib/widgets/dialog/dialog.login.content.d.ts +1 -1
  135. package/lib/widgets/dialog/dialog.notify.content.d.ts +1 -1
  136. package/lib/widgets/dialog/dialog.select-array-objs.content.d.ts +1 -1
  137. package/lib/widgets/dialog/dialog.select-array.content.d.ts +1 -1
  138. package/lib/widgets/dialog/dialog.select-data-labels.content.d.ts +1 -1
  139. package/lib/widgets/dialog/dialog.select-datetime.content.d.ts +1 -1
  140. package/lib/widgets/dialog/dialog.select-with-buttons-url.content.d.ts +1 -1
  141. package/lib/widgets/file/file-upload.component.d.ts +1 -1
  142. package/lib/widgets/file/file-upload.module.d.ts +2 -2
  143. package/lib/widgets/form-button/form-button.component.d.ts +1 -1
  144. package/lib/widgets/navbar-main/navbar-main.component.d.ts +1 -2
  145. package/lib/widgets/navbar-module/navbar-module.component.d.ts +1 -1
  146. package/lib/widgets/responsive-button-group/responsive-button-group.component.d.ts +1 -1
  147. package/lib/widgets/sort-table/sort-table-header.component.d.ts +1 -1
  148. package/lib/widgets/sort-table/sort-table-ngfor.component.d.ts +1 -1
  149. package/lib/widgets/sort-table/sort-table.directive.d.ts +8 -1
  150. package/lib/widgets/user-role/user-role.component.d.ts +1 -1
  151. package/package.json +5 -6
  152. package/fesm2020/resolveio-client-lib-core.min.mjs +0 -1
  153. package/lib/logger/diff-viewer.component.d.ts +0 -35
@@ -0,0 +1,519 @@
1
+ import { dateReviver } from './util/common.helper';
2
+ export class StorageDB {
3
+ storage = null;
4
+ database = null;
5
+ primaryKey = null;
6
+ sep = '';
7
+ constructor(opts) {
8
+ opts = opts || {};
9
+ this.storage = opts.storage || window && window.localStorage;
10
+ this.database = opts.database || 'db';
11
+ this.primaryKey = opts.primaryKey || '_id';
12
+ this.sep = opts.sep || ':';
13
+ if (!isSupported(this.storage)) {
14
+ this.storage = null;
15
+ }
16
+ }
17
+ get(name, opts) {
18
+ return new Collection(this, name, opts);
19
+ }
20
+ getCollections() {
21
+ let collections = [];
22
+ Object.keys(this.storage).filter(a => a.split(':').length > 2).forEach(key => {
23
+ if (!collections.some(b => b === key.split(':')[1])) {
24
+ collections.push(key.split(':')[1]);
25
+ }
26
+ });
27
+ return collections;
28
+ }
29
+ collection(name, opts) {
30
+ return this.get(name, opts);
31
+ }
32
+ }
33
+ class Collection {
34
+ name = '';
35
+ storage = null;
36
+ path = '';
37
+ primaryKey = '';
38
+ cache = {};
39
+ cacheable = false;
40
+ constructor(db, name, opts) {
41
+ opts = opts || {};
42
+ this.name = name;
43
+ this.storage = db.storage || new MockStorage();
44
+ this.path = db.database + db.sep + name + db.sep;
45
+ this.primaryKey = opts.primaryKey || db.primaryKey;
46
+ this.cache = {};
47
+ this.cacheable = !db.storage;
48
+ }
49
+ _initCache() {
50
+ let cache = {};
51
+ let filterExp = new RegExp('^' + this.path);
52
+ for (let key of Object.keys(this.storage)) {
53
+ if (filterExp.test(key)) {
54
+ cache[key] = JSON.parse(this.storage.getItem(key), dateReviver);
55
+ }
56
+ }
57
+ this.cache = cache;
58
+ this.cacheable = true;
59
+ }
60
+ _filter(filter, opts) {
61
+ opts.type = opts.type || 'data'; // data, id;
62
+ opts.multi = opts.multi || false;
63
+ if (!this.cacheable) {
64
+ this._initCache();
65
+ }
66
+ let res = [];
67
+ let isFnFilter;
68
+ let isTypeId = opts.type === 'id';
69
+ if (typeof filter === 'string') {
70
+ filter = new RegExp(filter);
71
+ }
72
+ else if (typeof filter === 'function') {
73
+ isFnFilter = true;
74
+ }
75
+ else if (!filter) {
76
+ let ret = isTypeId ? Object.keys(this.cache) : Object.values(this.cache);
77
+ if (opts.multi) {
78
+ return ret;
79
+ }
80
+ else {
81
+ return ret[0] || null;
82
+ }
83
+ }
84
+ for (let key of Object.keys(this.cache)) {
85
+ let val = this.cache[key];
86
+ if (isFnFilter) {
87
+ if (filter(key, val['data'])) {
88
+ let ret = isTypeId ? key : val;
89
+ if (opts.multi) {
90
+ res.push(ret);
91
+ }
92
+ else {
93
+ return ret;
94
+ }
95
+ }
96
+ }
97
+ else {
98
+ if (filter.test(key)) {
99
+ let ret = isTypeId ? key : val;
100
+ if (opts.multi) {
101
+ res.push(ret);
102
+ }
103
+ else {
104
+ return ret;
105
+ }
106
+ }
107
+ }
108
+ }
109
+ return opts.multi ? res : null;
110
+ }
111
+ insert(data, expiresDate, opts) {
112
+ let arrayInsert = data instanceof Array;
113
+ if (arrayInsert) {
114
+ if (data.length === 0) {
115
+ return [];
116
+ }
117
+ }
118
+ else {
119
+ data = [data];
120
+ }
121
+ let pk = this.primaryKey;
122
+ let cacheable = this.cacheable;
123
+ for (let row of data) {
124
+ if (!isObject(row)) {
125
+ throw new Error('TypeError: insert data must be an object or an object array');
126
+ }
127
+ if (typeof row[pk] === 'undefined') {
128
+ row[pk] = new ID().toString();
129
+ }
130
+ let now = new Date();
131
+ if (cacheable) {
132
+ this.cache[this.path + row[pk]] = {
133
+ offlineDate: now,
134
+ offlineDateExpires: expiresDate ? expiresDate : new Date(now.getTime() + 604800000),
135
+ data: row
136
+ };
137
+ }
138
+ this.storage.setItem(this.path + row[pk], JSON.stringify({
139
+ offlineDate: now,
140
+ offlineDateExpires: expiresDate ? expiresDate : new Date(now.getTime() + 604800000),
141
+ data: row
142
+ }));
143
+ }
144
+ return arrayInsert ? data.map(a => a._id) : data[0]._id;
145
+ }
146
+ find(query, opts, total) {
147
+ query = query || {};
148
+ opts = opts || {};
149
+ opts.skip = opts.skip || 0;
150
+ opts.limit = opts.limit;
151
+ opts.sort = opts.sort;
152
+ if (opts.sort instanceof Array) {
153
+ opts.sort = opts.sort.reduce((res, item) => {
154
+ if (typeof item === 'string') {
155
+ res[item] = 1;
156
+ }
157
+ else if (item instanceof Array && item.length) {
158
+ res[item[0]] = item[1] || 1;
159
+ }
160
+ return res;
161
+ }, {});
162
+ }
163
+ let data;
164
+ let ids = isObject(query) ? null : (query instanceof Array ? query : [query]);
165
+ let filterOpts = {
166
+ type: opts._filterType || 'data',
167
+ multi: true
168
+ };
169
+ if (ids) {
170
+ // by id array
171
+ let filterRegExp = new RegExp('^' + this.path + '(' + ids.join('|') + ')$');
172
+ data = this._filter(filterRegExp, filterOpts);
173
+ }
174
+ else if (Object.keys(query).length) {
175
+ // by query
176
+ data = this._filter((key, val) => {
177
+ return queryMatch(query, val);
178
+ }, filterOpts);
179
+ }
180
+ else {
181
+ data = this._filter(null, filterOpts);
182
+ }
183
+ if (!total) {
184
+ data = data.map(a => a.data);
185
+ }
186
+ // sort
187
+ if (opts.sort) {
188
+ data.sort((a, b) => {
189
+ return sortCompare(opts.sort, a, b);
190
+ });
191
+ }
192
+ if (opts.limit) {
193
+ data = data.slice(opts.skip, opts.skip + opts.limit);
194
+ }
195
+ else if (opts.skip) {
196
+ data = data.slice(opts.skip);
197
+ }
198
+ return data;
199
+ }
200
+ findOne(query, opts) {
201
+ query = query || {};
202
+ opts = opts || {};
203
+ let data;
204
+ let id = isObject(query) ? null : query;
205
+ let queryFields = isObject(query) ? Object.keys(query) : [];
206
+ let quickTarget = false;
207
+ let needsSort = !!opts.sort;
208
+ let filterOpts = {
209
+ type: opts._filterType || 'data',
210
+ multi: false
211
+ };
212
+ if (queryFields.length && queryFields.includes(this.primaryKey)) {
213
+ id = query[this.primaryKey];
214
+ quickTarget = true;
215
+ }
216
+ if (id) {
217
+ // by id
218
+ data = this.storage.getItem(this.path + id);
219
+ data = data ? JSON.parse(data, dateReviver).data : null;
220
+ if (data && quickTarget && !queryMatch(query, data)) {
221
+ return null;
222
+ }
223
+ }
224
+ else if (queryFields.length) {
225
+ // by query
226
+ if (needsSort) {
227
+ data = this.find(query, opts);
228
+ }
229
+ else {
230
+ data = this._filter((key, val) => {
231
+ return queryMatch(query, val);
232
+ }, filterOpts);
233
+ if (Array.isArray(data)) {
234
+ data = data.map(a => a.data);
235
+ }
236
+ else if (data) {
237
+ data = data.data;
238
+ }
239
+ }
240
+ }
241
+ else {
242
+ if (needsSort) {
243
+ data = this.find(query, opts);
244
+ }
245
+ else {
246
+ data = this._filter(null, filterOpts);
247
+ }
248
+ }
249
+ if (!id && needsSort && data) {
250
+ data = data[0].data || null;
251
+ }
252
+ if (data && filterOpts.type === 'id') {
253
+ data = this.path + data[this.primaryKey];
254
+ }
255
+ return data;
256
+ }
257
+ remove(query, opts) {
258
+ if (!query) {
259
+ throw new Error('remove needs a query');
260
+ }
261
+ opts = opts || {};
262
+ opts.multi = (typeof opts.multi === 'undefined') ? true : opts.multi;
263
+ let findMethod = opts.multi ? 'find' : 'findOne';
264
+ let ids = null;
265
+ if (findMethod === 'find') {
266
+ ids = this[findMethod](query, {
267
+ _filterType: 'id'
268
+ }, true);
269
+ }
270
+ else {
271
+ ids = this[findMethod](query, {
272
+ _filterType: 'id'
273
+ });
274
+ }
275
+ let cacheable = this.cacheable;
276
+ if ((opts.multi && !ids.length) || (!opts.multi && !ids)) {
277
+ return 0;
278
+ }
279
+ if (!opts.multi) {
280
+ ids = [ids];
281
+ }
282
+ for (let id of ids) {
283
+ if (cacheable) {
284
+ delete this.cache[id];
285
+ }
286
+ this.storage.removeItem(id);
287
+ }
288
+ return ids.length;
289
+ }
290
+ update(query, values, opts) {
291
+ if (!query) {
292
+ throw new Error('update needs a query');
293
+ }
294
+ if (!values || !isObject(values)) {
295
+ throw new Error('update needs an object');
296
+ }
297
+ opts = opts || {};
298
+ opts.multi = (typeof opts.multi === 'undefined') ? false : opts.multi;
299
+ let findMethod = opts.multi ? 'find' : 'findOne';
300
+ let ids = this[findMethod](query, {
301
+ _filterType: 'id'
302
+ });
303
+ let pk = this.primaryKey;
304
+ let cacheable = this.cacheable;
305
+ if ((opts.multi && !ids.length) || (!opts.multi && !ids)) {
306
+ return 0;
307
+ }
308
+ if (!opts.multi) {
309
+ let id = ids;
310
+ let row = cacheable ? this.cache[id] : JSON.parse(this.storage.getItem(id), dateReviver);
311
+ let isIdUpdated = values[pk] && values[pk] !== row.data[pk];
312
+ let newId = isIdUpdated ? this.path + values[pk] : id;
313
+ // check exist
314
+ if (isIdUpdated && this.findOne(values[pk])) {
315
+ throw new Error('Duplicate value \'' + values[pk] + '\' for unique field \'' + pk + '\'');
316
+ }
317
+ let data = Object.assign({}, row.data, values);
318
+ if (cacheable) {
319
+ this.cache[newId] = {
320
+ offlineDate: row.offlineDate,
321
+ offlineDateExpires: row.offlineDateExpires,
322
+ data: data
323
+ };
324
+ if (isIdUpdated) {
325
+ delete this.cache[id];
326
+ }
327
+ }
328
+ this.storage.setItem(newId, JSON.stringify({
329
+ offlineDate: row.offlineDate,
330
+ offlineDateExpires: row.offlineDateExpires,
331
+ data: data
332
+ }));
333
+ if (isIdUpdated) {
334
+ this.storage.removeItem(id);
335
+ }
336
+ return data;
337
+ }
338
+ else {
339
+ delete values[pk];
340
+ if (!Object.keys(values).length) {
341
+ return 0;
342
+ }
343
+ for (let id of ids) {
344
+ let row = cacheable ? this.cache[id] : JSON.parse(this.storage.getItem(id), dateReviver);
345
+ let data = Object.assign({}, row.data, values);
346
+ if (cacheable) {
347
+ this.cache[id] = {
348
+ offlineDate: row.offlineDate,
349
+ offlineDateExpires: row.offlineDateExpires,
350
+ data: data
351
+ };
352
+ }
353
+ this.storage.setItem(id, JSON.stringify({
354
+ offlineDate: row.offlineDate,
355
+ offlineDateExpires: row.offlineDateExpires,
356
+ data: data
357
+ }));
358
+ }
359
+ return ids.length;
360
+ }
361
+ }
362
+ drop() {
363
+ this.remove({});
364
+ return true;
365
+ }
366
+ }
367
+ class ID {
368
+ constructor() {
369
+ }
370
+ toString() {
371
+ return (new Date().getTime() / 1000).toString(16).substr(-4) + Math.random().toString(16).substr(2, 12);
372
+ }
373
+ }
374
+ class MockStorage {
375
+ length = 0;
376
+ constructor() {
377
+ this.length = 0;
378
+ }
379
+ key() { }
380
+ setItem() { }
381
+ getItem() { }
382
+ removeItem() { }
383
+ }
384
+ const isSupported = (storage) => {
385
+ if (!storage || !(storage instanceof Object)) {
386
+ return false;
387
+ }
388
+ try {
389
+ storage.setItem('_supported', '1');
390
+ storage.removeItem('_supported');
391
+ return true;
392
+ }
393
+ catch (e) {
394
+ return false;
395
+ }
396
+ };
397
+ const isObject = (object) => {
398
+ return object instanceof Object && object.constructor.name === 'Object';
399
+ };
400
+ const queryMatch = (query, target) => {
401
+ if (!query || !Object.keys(query).length) {
402
+ return true;
403
+ }
404
+ for (let field of Object.keys(query)) {
405
+ let val = query[field];
406
+ let tar = target[field];
407
+ if (!tar) {
408
+ field.split('.').forEach(path => {
409
+ if (!tar) {
410
+ tar = target[path];
411
+ }
412
+ else {
413
+ tar = tar[path];
414
+ }
415
+ });
416
+ }
417
+ if (val instanceof RegExp) {
418
+ if (!val.test(tar)) {
419
+ return false;
420
+ }
421
+ }
422
+ else if (isObject(val)) {
423
+ for (let op of Object.keys(val)) {
424
+ if (Operator._checkExist(op) && !Operator[op](val[op], tar)) {
425
+ return false;
426
+ }
427
+ }
428
+ }
429
+ else if (val !== tar) {
430
+ return false;
431
+ }
432
+ }
433
+ return true;
434
+ };
435
+ const sortCompare = (sort, a, b, i, fields) => {
436
+ i = i || 0;
437
+ fields = fields || Object.keys(sort);
438
+ let field = fields[i];
439
+ if (!field) {
440
+ return 0;
441
+ }
442
+ if (a[field] === b[field]) {
443
+ i++;
444
+ return sortCompare(sort, a, b, i, fields);
445
+ }
446
+ if (sort[field] === 1) {
447
+ return a[field] - b[field];
448
+ }
449
+ if (sort[field] === -1) {
450
+ return b[field] - a[field];
451
+ }
452
+ };
453
+ /*
454
+ Query Selectors
455
+
456
+ $eq Matches vals that are equal to a specified val.
457
+ $gt Matches vals that are greater than a specified val.
458
+ $gte Matches vals that are greater than or equal to a specified val.
459
+ $in Matches any of the vals specified in an array.
460
+ $lt Matches vals that are less than a specified val.
461
+ $lte Matches vals that are less than or equal to a specified val.
462
+ $ne Matches all vals that are not equal to a specified val.
463
+ $nin Matches none of the vals specified in an array.
464
+ */
465
+ const ops = ['$eq', '$gt', '$gte', '$in', '$lt', '$lte', '$ne', '$nin'];
466
+ const isNotNumber = (val) => {
467
+ return typeof val !== 'number';
468
+ };
469
+ class Operator {
470
+ static $eq(val, tar) {
471
+ return tar === val;
472
+ }
473
+ static $gt(val, tar) {
474
+ if (isNotNumber(val)) {
475
+ throw new Error('\'$gt\' value must be a number');
476
+ }
477
+ return tar > val;
478
+ }
479
+ static $gte(val, tar) {
480
+ if (isNotNumber(val)) {
481
+ throw new Error('\'$gte\' value must be a number');
482
+ }
483
+ return tar >= val;
484
+ }
485
+ static $in(val, tar) {
486
+ if (!(val instanceof Array)) {
487
+ throw new Error('\'$in\' value must be an array');
488
+ }
489
+ return val.includes(tar);
490
+ }
491
+ static $lt(val, tar) {
492
+ if (isNotNumber(val)) {
493
+ throw new Error('\'$lt\' value must be a number');
494
+ }
495
+ return tar < val;
496
+ }
497
+ static $lte(val, tar) {
498
+ if (isNotNumber(val)) {
499
+ throw new Error('\'$lte\' value must be a number');
500
+ }
501
+ return tar <= val;
502
+ }
503
+ static $ne(val, tar) {
504
+ return tar !== val;
505
+ }
506
+ static $nin(val, tar) {
507
+ if (!(val instanceof Array)) {
508
+ throw new Error('\'$nin\' value must be an array');
509
+ }
510
+ return !val.includes(tar);
511
+ }
512
+ static _checkExist(op) {
513
+ if (ops.includes(op)) {
514
+ return true;
515
+ }
516
+ throw new Error('unknown operator: \'' + op + '\'');
517
+ }
518
+ }
519
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZmbGluZS1kYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9vZmZsaW5lLWRiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxNQUFNLE9BQU8sU0FBUztJQUVyQixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2YsUUFBUSxHQUFHLElBQUksQ0FBQztJQUNoQixVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFFVCxZQUFhLElBQUk7UUFDaEIsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQzdELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztRQUMzQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDO1FBRTNCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1NBQ3BCO0lBQ0YsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSTtRQUNiLE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsY0FBYztRQUNiLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUVyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENB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QUFNLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3JCLE9BQU8sSUFBSSxDQUFDO1NBQ1o7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkYXRlUmV2aXZlciB9IGZyb20gJy4vdXRpbC9jb21tb24uaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VEQiB7XG5cblx0c3RvcmFnZSA9IG51bGw7XG5cdGRhdGFiYXNlID0gbnVsbDtcblx0cHJpbWFyeUtleSA9IG51bGw7XG5cdHNlcCA9ICcnO1xuXG5cdGNvbnN0cnVjdG9yIChvcHRzKSB7XG5cdFx0b3B0cyA9IG9wdHMgfHwge307XG5cblx0XHR0aGlzLnN0b3JhZ2UgPSBvcHRzLnN0b3JhZ2UgfHwgd2luZG93ICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG5cdFx0dGhpcy5kYXRhYmFzZSA9IG9wdHMuZGF0YWJhc2UgfHwgJ2RiJztcblx0XHR0aGlzLnByaW1hcnlLZXkgPSBvcHRzLnByaW1hcnlLZXkgfHwgJ19pZCc7XG5cdFx0dGhpcy5zZXAgPSBvcHRzLnNlcCB8fCAnOic7XG5cblx0XHRpZiAoIWlzU3VwcG9ydGVkKHRoaXMuc3RvcmFnZSkpIHtcblx0XHRcdHRoaXMuc3RvcmFnZSA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0Z2V0KG5hbWUsIG9wdHMpIHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcywgbmFtZSwgb3B0cyk7XG5cdH1cblxuXHRnZXRDb2xsZWN0aW9ucygpIHtcblx0XHRsZXQgY29sbGVjdGlvbnMgPSBbXTtcblxuXHRcdE9iamVjdC5rZXlzKHRoaXMuc3RvcmFnZSkuZmlsdGVyKGEgPT4gYS5zcGxpdCgnOicpLmxlbmd0aCA+IDIpLmZvckVhY2goa2V5ID0+IHtcblx0XHRcdGlmICghY29sbGVjdGlvbnMuc29tZShiID0+IGIgPT09IGtleS5zcGxpdCgnOicpWzFdKSkge1xuXHRcdFx0XHRjb2xsZWN0aW9ucy5wdXNoKGtleS5zcGxpdCgnOicpWzFdKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBjb2xsZWN0aW9ucztcblx0fVxuXG5cdGNvbGxlY3Rpb24obmFtZSwgb3B0cykge1xuXHRcdHJldHVybiB0aGlzLmdldChuYW1lLCBvcHRzKTtcblx0fVxufVxuXG5jbGFzcyBDb2xsZWN0aW9uIHtcblxuXHRuYW1lID0gJyc7XG5cdHN0b3JhZ2UgPSBudWxsO1xuXHRwYXRoID0gJyc7XG5cdHByaW1hcnlLZXkgPSAnJztcblx0Y2FjaGUgPSB7fTtcblx0Y2FjaGVhYmxlID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IgKGRiLCBuYW1lLCBvcHRzKSB7XG5cdFx0b3B0cyA9IG9wdHMgfHwge307XG5cblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMuc3RvcmFnZSA9IGRiLnN0b3JhZ2UgfHwgbmV3IE1vY2tTdG9yYWdlKCk7XG5cdFx0dGhpcy5wYXRoID0gZGIuZGF0YWJhc2UgKyBkYi5zZXAgKyBuYW1lICsgZGIuc2VwO1xuXHRcdHRoaXMucHJpbWFyeUtleSA9IG9wdHMucHJpbWFyeUtleSB8fCBkYi5wcmltYXJ5S2V5O1xuXHRcdHRoaXMuY2FjaGUgPSB7fTtcblx0XHR0aGlzLmNhY2hlYWJsZSA9ICFkYi5zdG9yYWdlO1xuXHR9XG5cblxuXHRfaW5pdENhY2hlICgpIHtcblx0XHRsZXQgY2FjaGUgPSB7fTtcblx0XHRsZXQgZmlsdGVyRXhwID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLnBhdGgpO1xuXG5cdFx0Zm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3RvcmFnZSkpIHtcblx0XHRcdGlmIChmaWx0ZXJFeHAudGVzdChrZXkpKSB7XG5cdFx0XHRcdGNhY2hlW2tleV0gPSBKU09OLnBhcnNlKHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSksIGRhdGVSZXZpdmVyKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmNhY2hlID0gY2FjaGU7XG5cdFx0dGhpcy5jYWNoZWFibGUgPSB0cnVlO1xuXHR9XG5cblxuXHRfZmlsdGVyIChmaWx0ZXIsIG9wdHMpIHtcblx0XHRvcHRzLnR5cGUgPSBvcHRzLnR5cGUgfHwgJ2RhdGEnOyAvLyBkYXRhLCBpZDtcblx0XHRvcHRzLm11bHRpID0gb3B0cy5tdWx0aSB8fCBmYWxzZTtcblxuXHRcdGlmICghdGhpcy5jYWNoZWFibGUpIHtcblx0XHRcdHRoaXMuX2luaXRDYWNoZSgpO1xuXHRcdH1cblxuXHRcdGxldCByZXMgPSBbXTtcblx0XHRsZXQgaXNGbkZpbHRlcjtcblx0XHRsZXQgaXNUeXBlSWQgPSBvcHRzLnR5cGUgPT09ICdpZCc7XG5cblx0XHRpZiAodHlwZW9mIGZpbHRlciA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGZpbHRlciA9IG5ldyBSZWdFeHAoZmlsdGVyKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGlzRm5GaWx0ZXIgPSB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoIWZpbHRlcikge1xuXHRcdFx0bGV0IHJldCA9IGlzVHlwZUlkID8gT2JqZWN0LmtleXModGhpcy5jYWNoZSkgOiBPYmplY3QudmFsdWVzKHRoaXMuY2FjaGUpO1xuXG5cdFx0XHRpZiAob3B0cy5tdWx0aSkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHJldFswXSB8fCBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmNhY2hlKSkge1xuXHRcdFx0bGV0IHZhbCA9IHRoaXMuY2FjaGVba2V5XTtcblxuXHRcdFx0aWYgKGlzRm5GaWx0ZXIpIHtcblx0XHRcdFx0aWYgKGZpbHRlcihrZXksIHZhbFsnZGF0YSddKSkge1xuXHRcdFx0XHRcdGxldCByZXQgPSBpc1R5cGVJZCA/IGtleSA6IHZhbDtcblxuXHRcdFx0XHRcdGlmIChvcHRzLm11bHRpKSB7XG5cdFx0XHRcdFx0XHRyZXMucHVzaChyZXQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGZpbHRlci50ZXN0KGtleSkpIHtcblx0XHRcdFx0XHRsZXQgcmV0ID0gaXNUeXBlSWQgPyBrZXkgOiB2YWw7XG5cblx0XHRcdFx0XHRpZiAob3B0cy5tdWx0aSkge1xuXHRcdFx0XHRcdFx0cmVzLnB1c2gocmV0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb3B0cy5tdWx0aSA/IHJlcyA6IG51bGw7XG5cdH1cblxuXG5cdGluc2VydChkYXRhLCBleHBpcmVzRGF0ZT8sIG9wdHM/KSB7XG5cdFx0bGV0IGFycmF5SW5zZXJ0ID0gZGF0YSBpbnN0YW5jZW9mIEFycmF5O1xuXG5cdFx0aWYgKGFycmF5SW5zZXJ0KSB7XG5cdFx0XHRpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIFtdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gW2RhdGFdO1xuXHRcdH1cblxuXHRcdGxldCBwayA9IHRoaXMucHJpbWFyeUtleTtcblx0XHRsZXQgY2FjaGVhYmxlID0gdGhpcy5jYWNoZWFibGU7XG5cblx0XHRmb3IgKGxldCByb3cgb2YgZGF0YSkge1xuXHRcdFx0aWYgKCFpc09iamVjdChyb3cpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignVHlwZUVycm9yOiBpbnNlcnQgZGF0YSBtdXN0IGJlIGFuIG9iamVjdCBvciBhbiBvYmplY3QgYXJyYXknKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHR5cGVvZiByb3dbcGtdID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRyb3dbcGtdID0gbmV3IElEKCkudG9TdHJpbmcoKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG5vdyA9IG5ldyBEYXRlKCk7XG5cblx0XHRcdGlmIChjYWNoZWFibGUpIHtcblx0XHRcdFx0dGhpcy5jYWNoZVt0aGlzLnBhdGggKyByb3dbcGtdXSA9IHtcblx0XHRcdFx0XHRvZmZsaW5lRGF0ZTogbm93LFxuXHRcdFx0XHRcdG9mZmxpbmVEYXRlRXhwaXJlczogZXhwaXJlc0RhdGUgPyBleHBpcmVzRGF0ZSA6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyA2MDQ4MDAwMDApLFxuXHRcdFx0XHRcdGRhdGE6IHJvd1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnBhdGggKyByb3dbcGtdLCBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdG9mZmxpbmVEYXRlOiBub3csXG5cdFx0XHRcdG9mZmxpbmVEYXRlRXhwaXJlczogZXhwaXJlc0RhdGUgPyBleHBpcmVzRGF0ZSA6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyA2MDQ4MDAwMDApLFxuXHRcdFx0XHRkYXRhOiByb3dcblx0XHRcdH0pKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyYXlJbnNlcnQgPyBkYXRhLm1hcChhID0+IGEuX2lkKSA6IGRhdGFbMF0uX2lkO1xuXHR9XG5cblxuXHRmaW5kKHF1ZXJ5LCBvcHRzPywgdG90YWw/KSB7XG5cdFx0cXVlcnkgPSBxdWVyeSB8fCB7fTtcblx0XHRvcHRzID0gb3B0cyB8fCB7fTtcblx0XHRvcHRzLnNraXAgPSBvcHRzLnNraXAgfHwgMDtcblx0XHRvcHRzLmxpbWl0ID0gb3B0cy5saW1pdDtcblx0XHRvcHRzLnNvcnQgPSBvcHRzLnNvcnQ7XG5cblx0XHRpZiAob3B0cy5zb3J0IGluc3RhbmNlb2YgQXJyYXkpIHtcblx0XHRcdG9wdHMuc29ydCA9IG9wdHMuc29ydC5yZWR1Y2UoKHJlcywgaXRlbSkgPT4ge1xuXHRcdFx0XHRpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0cmVzW2l0ZW1dID0gMTtcblx0XHRcdFx0fSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQXJyYXkgJiYgaXRlbS5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXNbaXRlbVswXV0gPSBpdGVtWzFdIHx8IDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlcztcblx0XHRcdH0sIHt9KTtcblx0XHR9XG5cblx0XHRsZXQgZGF0YTtcblx0XHRsZXQgaWRzID0gaXNPYmplY3QocXVlcnkpID8gbnVsbCA6IChxdWVyeSBpbnN0YW5jZW9mIEFycmF5ID8gcXVlcnkgOiBbcXVlcnldKTtcblx0XHRsZXQgZmlsdGVyT3B0cyA9IHtcblx0XHRcdHR5cGU6IG9wdHMuX2ZpbHRlclR5cGUgfHwgJ2RhdGEnLFxuXHRcdFx0bXVsdGk6IHRydWVcblx0XHR9O1xuXG5cdFx0aWYgKGlkcykge1xuXHRcdFx0Ly8gYnkgaWQgYXJyYXlcblx0XHRcdGxldCBmaWx0ZXJSZWdFeHAgPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMucGF0aCArICcoJyArIGlkcy5qb2luKCd8JykgKyAnKSQnKTtcblx0XHRcdGRhdGEgPSB0aGlzLl9maWx0ZXIoZmlsdGVyUmVnRXhwLCBmaWx0ZXJPcHRzKTtcblxuXHRcdH0gZWxzZSBpZiAoT2JqZWN0LmtleXMocXVlcnkpLmxlbmd0aCkge1xuXHRcdFx0Ly8gYnkgcXVlcnlcblx0XHRcdGRhdGEgPSB0aGlzLl9maWx0ZXIoKGtleSwgdmFsKSA9PiB7XG5cdFx0XHRcdHJldHVybiBxdWVyeU1hdGNoKHF1ZXJ5LCB2YWwpO1xuXHRcdFx0fSwgZmlsdGVyT3B0cyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRhdGEgPSB0aGlzLl9maWx0ZXIobnVsbCwgZmlsdGVyT3B0cyk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0b3RhbCkge1xuXHRcdFx0ZGF0YSA9IGRhdGEubWFwKGEgPT4gYS5kYXRhKTtcblx0XHR9XG5cblx0XHQvLyBzb3J0XG5cdFx0aWYgKG9wdHMuc29ydCkge1xuXHRcdFx0ZGF0YS5zb3J0KChhLCBiKSA9PiB7XG5cdFx0XHRcdHJldHVybiBzb3J0Q29tcGFyZShvcHRzLnNvcnQsIGEsIGIpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdHMubGltaXQpIHtcblx0XHRcdGRhdGEgPSBkYXRhLnNsaWNlKG9wdHMuc2tpcCwgb3B0cy5za2lwICsgb3B0cy5saW1pdCk7XG5cdFx0fSBlbHNlIGlmIChvcHRzLnNraXApIHtcblx0XHRcdGRhdGEgPSBkYXRhLnNsaWNlKG9wdHMuc2tpcCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cdH1cblxuXG5cdGZpbmRPbmUocXVlcnksIG9wdHM/KSB7XG5cdFx0cXVlcnkgPSBxdWVyeSB8fCB7fTtcblx0XHRvcHRzID0gb3B0cyB8fCB7fTtcblxuXHRcdGxldCBkYXRhO1xuXHRcdGxldCBpZCA9IGlzT2JqZWN0KHF1ZXJ5KSA/IG51bGwgOiBxdWVyeTtcblx0XHRsZXQgcXVlcnlGaWVsZHMgPSBpc09iamVjdChxdWVyeSkgPyBPYmplY3Qua2V5cyhxdWVyeSkgOiBbXTtcblx0XHRsZXQgcXVpY2tUYXJnZXQgPSBmYWxzZTtcblx0XHRsZXQgbmVlZHNTb3J0ID0gISFvcHRzLnNvcnQ7XG5cdFx0bGV0IGZpbHRlck9wdHMgPSB7XG5cdFx0XHR0eXBlOiBvcHRzLl9maWx0ZXJUeXBlIHx8ICdkYXRhJyxcblx0XHRcdG11bHRpOiBmYWxzZVxuXHRcdH07XG5cblx0XHRpZiAocXVlcnlGaWVsZHMubGVuZ3RoICYmIHF1ZXJ5RmllbGRzLmluY2x1ZGVzKHRoaXMucHJpbWFyeUtleSkpIHtcblx0XHRcdGlkID0gcXVlcnlbdGhpcy5wcmltYXJ5S2V5XTtcblx0XHRcdHF1aWNrVGFyZ2V0ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoaWQpIHtcblx0XHRcdC8vIGJ5IGlkXG5cdFx0XHRkYXRhID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy5wYXRoICsgaWQpO1xuXHRcdFx0ZGF0YSA9IGRhdGEgPyBKU09OLnBhcnNlKGRhdGEsIGRhdGVSZXZpdmVyKS5kYXRhIDogbnVsbDtcblxuXHRcdFx0aWYgKGRhdGEgJiYgcXVpY2tUYXJnZXQgJiYgIXF1ZXJ5TWF0Y2gocXVlcnksIGRhdGEpKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocXVlcnlGaWVsZHMubGVuZ3RoKSB7XG5cdFx0XHQvLyBieSBxdWVyeVxuXHRcdFx0aWYgKG5lZWRzU29ydCkge1xuXHRcdFx0XHRkYXRhID0gdGhpcy5maW5kKHF1ZXJ5LCBvcHRzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGEgPSB0aGlzLl9maWx0ZXIoKGtleSwgdmFsKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHF1ZXJ5TWF0Y2gocXVlcnksIHZhbCk7XG5cdFx0XHRcdH0sIGZpbHRlck9wdHMpO1xuXG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG5cdFx0XHRcdFx0ZGF0YSA9IGRhdGEubWFwKGEgPT4gYS5kYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmIChkYXRhKSB7XG5cdFx0XHRcdFx0ZGF0YSA9IGRhdGEuZGF0YTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAobmVlZHNTb3J0KSB7XG5cdFx0XHRcdGRhdGEgPSB0aGlzLmZpbmQocXVlcnksIG9wdHMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YSA9IHRoaXMuX2ZpbHRlcihudWxsLCBmaWx0ZXJPcHRzKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0aWYgKCFpZCAmJiBuZWVkc1NvcnQgJiYgZGF0YSkge1xuXHRcdFx0ZGF0YSA9IGRhdGFbMF0uZGF0YSB8fCBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChkYXRhICYmIGZpbHRlck9wdHMudHlwZSA9PT0gJ2lkJykge1xuXHRcdFx0ZGF0YSA9IHRoaXMucGF0aCArIGRhdGFbdGhpcy5wcmltYXJ5S2V5XTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblx0fVxuXG5cblx0cmVtb3ZlKHF1ZXJ5LCBvcHRzPykge1xuXHRcdGlmICghcXVlcnkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcigncmVtb3ZlIG5lZWRzIGEgcXVlcnknKTtcblx0XHR9XG5cblx0XHRvcHRzID0gb3B0cyB8fCB7fTtcblx0XHRvcHRzLm11bHRpID0gKHR5cGVvZiBvcHRzLm11bHRpID09PSAndW5kZWZpbmVkJykgPyB0cnVlIDogb3B0cy5tdWx0aTtcblxuXHRcdGxldCBmaW5kTWV0aG9kID0gb3B0cy5tdWx0aSA/ICdmaW5kJyA6ICdmaW5kT25lJztcblx0XHRsZXQgaWRzID0gbnVsbDtcblx0XHRpZiAoZmluZE1ldGhvZCA9PT0gJ2ZpbmQnKSB7XG5cdFx0XHRpZHMgPSB0aGlzW2ZpbmRNZXRob2RdKHF1ZXJ5LCB7XG5cdFx0XHRcdF9maWx0ZXJUeXBlOiAnaWQnXG5cdFx0XHR9LCB0cnVlKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRpZHMgPSB0aGlzW2ZpbmRNZXRob2RdKHF1ZXJ5LCB7XG5cdFx0XHRcdF9maWx0ZXJUeXBlOiAnaWQnXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0bGV0IGNhY2hlYWJsZSA9IHRoaXMuY2FjaGVhYmxlO1xuXG5cdFx0aWYgKChvcHRzLm11bHRpICYmICFpZHMubGVuZ3RoKSB8fCAoIW9wdHMubXVsdGkgJiYgIWlkcykpIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdGlmICghb3B0cy5tdWx0aSkge1xuXHRcdFx0aWRzID0gW2lkc107XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaWQgb2YgaWRzKSB7XG5cdFx0XHRpZiAoY2FjaGVhYmxlKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oaWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBpZHMubGVuZ3RoO1xuXHR9XG5cblxuXHR1cGRhdGUocXVlcnksIHZhbHVlcywgb3B0cz8pIHtcblx0XHRpZiAoIXF1ZXJ5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3VwZGF0ZSBuZWVkcyBhIHF1ZXJ5Jyk7XG5cdFx0fVxuXHRcdGlmICghdmFsdWVzIHx8ICFpc09iamVjdCh2YWx1ZXMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3VwZGF0ZSBuZWVkcyBhbiBvYmplY3QnKTtcblx0XHR9XG5cblx0XHRvcHRzID0gb3B0cyB8fCB7fTtcblx0XHRvcHRzLm11bHRpID0gKHR5cGVvZiBvcHRzLm11bHRpID09PSAndW5kZWZpbmVkJykgPyBmYWxzZSA6IG9wdHMubXVsdGk7XG5cblx0XHRsZXQgZmluZE1ldGhvZCA9IG9wdHMubXVsdGkgPyAnZmluZCcgOiAnZmluZE9uZSc7XG5cdFx0bGV0IGlkcyA9IHRoaXNbZmluZE1ldGhvZF0ocXVlcnksIHtcblx0XHRcdF9maWx0ZXJUeXBlOiAnaWQnXG5cdFx0fSk7XG5cdFx0bGV0IHBrID0gdGhpcy5wcmltYXJ5S2V5O1xuXHRcdGxldCBjYWNoZWFibGUgPSB0aGlzLmNhY2hlYWJsZTtcblxuXHRcdGlmICgob3B0cy5tdWx0aSAmJiAhaWRzLmxlbmd0aCkgfHwgKCFvcHRzLm11bHRpICYmICFpZHMpKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRpZiAoIW9wdHMubXVsdGkpIHtcblx0XHRcdGxldCBpZCA9IGlkcztcblx0XHRcdGxldCByb3cgPSBjYWNoZWFibGUgPyB0aGlzLmNhY2hlW2lkXSA6IEpTT04ucGFyc2UodGhpcy5zdG9yYWdlLmdldEl0ZW0oaWQpLCBkYXRlUmV2aXZlcik7XG5cdFx0XHRsZXQgaXNJZFVwZGF0ZWQgPSB2YWx1ZXNbcGtdICYmIHZhbHVlc1twa10gIT09IHJvdy5kYXRhW3BrXTtcblx0XHRcdGxldCBuZXdJZCA9IGlzSWRVcGRhdGVkID8gdGhpcy5wYXRoICsgdmFsdWVzW3BrXSA6IGlkO1xuXG5cdFx0XHQvLyBjaGVjayBleGlzdFxuXHRcdFx0aWYgKGlzSWRVcGRhdGVkICYmIHRoaXMuZmluZE9uZSh2YWx1ZXNbcGtdKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0R1cGxpY2F0ZSB2YWx1ZSBcXCcnICsgdmFsdWVzW3BrXSArICdcXCcgZm9yIHVuaXF1ZSBmaWVsZCBcXCcnICsgcGsgKyAnXFwnJyk7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgcm93LmRhdGEsIHZhbHVlcyk7XG5cblx0XHRcdGlmIChjYWNoZWFibGUpIHtcblx0XHRcdFx0dGhpcy5jYWNoZVtuZXdJZF0gPSB7XG5cdFx0XHRcdFx0b2ZmbGluZURhdGU6IHJvdy5vZmZsaW5lRGF0ZSxcblx0XHRcdFx0XHRvZmZsaW5lRGF0ZUV4cGlyZXM6IHJvdy5vZmZsaW5lRGF0ZUV4cGlyZXMsXG5cdFx0XHRcdFx0ZGF0YTogZGF0YVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAoaXNJZFVwZGF0ZWQpIHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5jYWNoZVtpZF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zdG9yYWdlLnNldEl0ZW0obmV3SWQsIEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0b2ZmbGluZURhdGU6IHJvdy5vZmZsaW5lRGF0ZSxcblx0XHRcdFx0b2ZmbGluZURhdGVFeHBpcmVzOiByb3cub2ZmbGluZURhdGVFeHBpcmVzLFxuXHRcdFx0XHRkYXRhOiBkYXRhXG5cdFx0XHR9KSk7XG5cblx0XHRcdGlmIChpc0lkVXBkYXRlZCkge1xuXHRcdFx0XHR0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShpZCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSB2YWx1ZXNbcGtdO1xuXG5cdFx0XHRpZiAoIU9iamVjdC5rZXlzKHZhbHVlcykubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiAwO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGxldCBpZCBvZiBpZHMpIHtcblx0XHRcdFx0bGV0IHJvdyA9IGNhY2hlYWJsZSA/IHRoaXMuY2FjaGVbaWRdIDogSlNPTi5wYXJzZSh0aGlzLnN0b3JhZ2UuZ2V0SXRlbShpZCksIGRhdGVSZXZpdmVyKTtcblxuXHRcdFx0XHRsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHJvdy5kYXRhLCB2YWx1ZXMpO1xuXG5cdFx0XHRcdGlmIChjYWNoZWFibGUpIHtcblx0XHRcdFx0XHR0aGlzLmNhY2hlW2lkXSA9IHtcblx0XHRcdFx0XHRcdG9mZmxpbmVEYXRlOiByb3cub2ZmbGluZURhdGUsXG5cdFx0XHRcdFx0XHRvZmZsaW5lRGF0ZUV4cGlyZXM6IHJvdy5vZmZsaW5lRGF0ZUV4cGlyZXMsXG5cdFx0XHRcdFx0XHRkYXRhOiBkYXRhXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuc3RvcmFnZS5zZXRJdGVtKGlkLCBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0b2ZmbGluZURhdGU6IHJvdy5vZmZsaW5lRGF0ZSxcblx0XHRcdFx0XHRvZmZsaW5lRGF0ZUV4cGlyZXM6IHJvdy5vZmZsaW5lRGF0ZUV4cGlyZXMsXG5cdFx0XHRcdFx0ZGF0YTogZGF0YVxuXHRcdFx0XHR9KSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBpZHMubGVuZ3RoO1xuXHRcdH1cblx0fVxuXG5cdGRyb3AoKSB7XG5cdFx0dGhpcy5yZW1vdmUoe30pO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59XG5cbmNsYXNzIElEIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdH1cblxuXHR0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigtNCkgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMiwgMTIpO1xuXHR9XG59XG5cbmNsYXNzIE1vY2tTdG9yYWdlIHtcblx0bGVuZ3RoID0gMDtcblxuXHRjb25zdHJ1Y3RvciAoKSB7XG5cdFx0dGhpcy5sZW5ndGggPSAwO1xuXHR9XG5cblx0a2V5KCkge31cblx0c2V0SXRlbSgpIHt9XG5cdGdldEl0ZW0oKSB7fVxuXHRyZW1vdmVJdGVtKCkge31cbn1cblxuY29uc3QgaXNTdXBwb3J0ZWQgPSAoc3RvcmFnZSkgPT4ge1xuXHRpZiAoIXN0b3JhZ2UgfHwgIShzdG9yYWdlIGluc3RhbmNlb2YgT2JqZWN0KSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHRyeSB7XG5cdFx0c3RvcmFnZS5zZXRJdGVtKCdfc3VwcG9ydGVkJywgJzEnKTtcblx0XHRzdG9yYWdlLnJlbW92ZUl0ZW0oJ19zdXBwb3J0ZWQnKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuY29uc3QgaXNPYmplY3QgPSAob2JqZWN0KSA9PiB7XG5cdHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBPYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPYmplY3QnO1xufTtcblxuY29uc3QgcXVlcnlNYXRjaCA9IChxdWVyeSwgdGFyZ2V0KSA9PiB7XG5cdGlmICghcXVlcnkgfHwgIU9iamVjdC5rZXlzKHF1ZXJ5KS5sZW5ndGgpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGZvciAobGV0IGZpZWxkIG9mIE9iamVjdC5rZXlzKHF1ZXJ5KSkge1xuXHRcdGxldCB2YWwgPSBxdWVyeVtmaWVsZF07XG5cdFx0bGV0IHRhciA9IHRhcmdldFtmaWVsZF07XG5cblx0XHRpZiAoIXRhcikge1xuXHRcdFx0ZmllbGQuc3BsaXQoJy4nKS5mb3JFYWNoKHBhdGggPT4ge1xuXHRcdFx0XHRpZiAoIXRhcikge1xuXHRcdFx0XHRcdHRhciA9IHRhcmdldFtwYXRoXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR0YXIgPSB0YXJbcGF0aF07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBSZWdFeHApIHtcblx0XHRcdGlmICghdmFsLnRlc3QodGFyKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChpc09iamVjdCh2YWwpKSB7XG5cdFx0XHRmb3IgKGxldCBvcCBvZiBPYmplY3Qua2V5cyh2YWwpKSB7XG5cdFx0XHRcdGlmIChPcGVyYXRvci5fY2hlY2tFeGlzdChvcCkgJiYgIU9wZXJhdG9yW29wXSh2YWxbb3BdLCB0YXIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh2YWwgIT09IHRhcikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcblxuY29uc3Qgc29ydENvbXBhcmUgPSAoc29ydCwgYSwgYiwgaT8sIGZpZWxkcz8pID0+IHtcblx0aSA9IGkgfHwgMDtcblx0ZmllbGRzID0gZmllbGRzIHx8IE9iamVjdC5rZXlzKHNvcnQpO1xuXG5cdGxldCBmaWVsZCA9IGZpZWxkc1tpXTtcblxuXHRpZiAoIWZpZWxkKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRpZiAoYVtmaWVsZF0gPT09IGJbZmllbGRdKSB7XG5cdFx0aSsrO1xuXHRcdHJldHVybiBzb3J0Q29tcGFyZShzb3J0LCBhLCBiLCBpLCBmaWVsZHMpO1xuXHR9XG5cblx0aWYgKHNvcnRbZmllbGRdID09PSAxKSB7XG5cdFx0cmV0dXJuIGFbZmllbGRdIC0gYltmaWVsZF07XG5cdH1cblxuXHRpZiAoc29ydFtmaWVsZF0gPT09IC0xKSB7XG5cdFx0cmV0dXJuIGJbZmllbGRdIC0gYVtmaWVsZF07XG5cdH1cbn07XG5cbi8qXG5cdFF1ZXJ5IFNlbGVjdG9yc1xuXG5cdCRlcVx0XHRNYXRjaGVzIHZhbHMgdGhhdCBhcmUgZXF1YWwgdG8gYSBzcGVjaWZpZWQgdmFsLlxuXHQkZ3RcdFx0TWF0Y2hlcyB2YWxzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBhIHNwZWNpZmllZCB2YWwuXG5cdCRndGVcdE1hdGNoZXMgdmFscyB0aGF0IGFyZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYSBzcGVjaWZpZWQgdmFsLlxuXHQkaW5cdFx0TWF0Y2hlcyBhbnkgb2YgdGhlIHZhbHMgc3BlY2lmaWVkIGluIGFuIGFycmF5LlxuXHQkbHRcdFx0TWF0Y2hlcyB2YWxzIHRoYXQgYXJlIGxlc3MgdGhhbiBhIHNwZWNpZmllZCB2YWwuXG5cdCRsdGVcdE1hdGNoZXMgdmFscyB0aGF0IGFyZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBzcGVjaWZpZWQgdmFsLlxuXHQkbmVcdFx0TWF0Y2hlcyBhbGwgdmFscyB0aGF0IGFyZSBub3QgZXF1YWwgdG8gYSBzcGVjaWZpZWQgdmFsLlxuXHQkbmluXHRNYXRjaGVzIG5vbmUgb2YgdGhlIHZhbHMgc3BlY2lmaWVkIGluIGFuIGFycmF5LlxuKi9cblxuY29uc3Qgb3BzID0gWyckZXEnLCAnJGd0JywgJyRndGUnLCAnJGluJywgJyRsdCcsICckbHRlJywgJyRuZScsICckbmluJ107XG5cbmNvbnN0IGlzTm90TnVtYmVyID0gKHZhbCkgPT4ge1xuXHRyZXR1cm4gdHlwZW9mIHZhbCAhPT0gJ251bWJlcic7XG59O1xuXG5jbGFzcyBPcGVyYXRvciB7XG5cdHN0YXRpYyAkZXEodmFsLCB0YXIpIHtcblx0XHRyZXR1cm4gdGFyID09PSB2YWw7XG5cdH1cblxuXHRzdGF0aWMgJGd0KHZhbCwgdGFyKSB7XG5cdFx0aWYgKGlzTm90TnVtYmVyKHZhbCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignXFwnJGd0XFwnIHZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRhciA+IHZhbDtcblx0fVxuXG5cdHN0YXRpYyAkZ3RlKHZhbCwgdGFyKSB7XG5cdFx0aWYgKGlzTm90TnVtYmVyKHZhbCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignXFwnJGd0ZVxcJyB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyJyk7XG5cdFx0fVxuXHRcdHJldHVybiB0YXIgPj0gdmFsO1xuXHR9XG5cblx0c3RhdGljICRpbih2YWwsIHRhcikge1xuXHRcdGlmICghKHZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdcXCckaW5cXCcgdmFsdWUgbXVzdCBiZSBhbiBhcnJheScpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsLmluY2x1ZGVzKHRhcik7XG5cdH1cblxuXHRzdGF0aWMgJGx0KHZhbCwgdGFyKSB7XG5cdFx0aWYgKGlzTm90TnVtYmVyKHZhbCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignXFwnJGx0XFwnIHZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRhciA8IHZhbDtcblx0fVxuXG5cdHN0YXRpYyAkbHRlKHZhbCwgdGFyKSB7XG5cdFx0aWYgKGlzTm90TnVtYmVyKHZhbCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignXFwnJGx0ZVxcJyB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyJyk7XG5cdFx0fVxuXHRcdHJldHVybiB0YXIgPD0gdmFsO1xuXHR9XG5cblx0c3RhdGljICRuZSh2YWwsIHRhcikge1xuXHRcdHJldHVybiB0YXIgIT09IHZhbDtcblx0fVxuXG5cdHN0YXRpYyAkbmluKHZhbCwgdGFyKSB7XG5cdFx0aWYgKCEodmFsIGluc3RhbmNlb2YgQXJyYXkpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1xcJyRuaW5cXCcgdmFsdWUgbXVzdCBiZSBhbiBhcnJheScpO1xuXHRcdH1cblx0XHRyZXR1cm4gIXZhbC5pbmNsdWRlcyh0YXIpO1xuXHR9XG5cblx0c3RhdGljIF9jaGVja0V4aXN0KG9wKSB7XG5cdFx0aWYgKG9wcy5pbmNsdWRlcyhvcCkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gb3BlcmF0b3I6IFxcJycgKyBvcCArICdcXCcnKTtcblx0fVxufSJdfQ==