@sumaris-net/ngx-components 1.5.5 → 1.5.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.
@@ -135,46 +135,54 @@ export function suggestFromArray(items, value, opts) {
135
135
  return { data: [], total: 0 };
136
136
  }
137
137
  // Filter items
138
- let target = items;
138
+ let filteredItems = items;
139
139
  if (isNotNilOrBlank(value)) {
140
140
  // If wildcard, search using regexp
141
141
  if (value.indexOf('*') !== -1) {
142
142
  value = value.replace('*', '.*');
143
- target = target.filter(v => keys.findIndex(key => matchUpperCase(getPropertyByPathAsString(v, key), value)) !== -1);
143
+ filteredItems = filteredItems.filter(v => keys.findIndex(key => matchUpperCase(getPropertyByPathAsString(v, key), value)) !== -1);
144
144
  }
145
145
  // Else (no wildcard), search using startsWith
146
146
  else {
147
- target = target.filter(v => keys.findIndex(key => startsWithUpperCase(getPropertyByPathAsString(v, key), value)) !== -1);
147
+ filteredItems = filteredItems.filter(v => keys.findIndex(key => startsWithUpperCase(getPropertyByPathAsString(v, key), value)) !== -1);
148
148
  }
149
149
  }
150
150
  // Exclude ids
151
151
  if (isNotEmptyArray(opts === null || opts === void 0 ? void 0 : opts.excludedIds)) {
152
- target = target.filter(v => !opts.excludedIds.includes(+v['id']));
152
+ filteredItems = filteredItems.filter(v => !opts.excludedIds.includes(+v['id']));
153
153
  }
154
- // Sort (copy if need, before sorting)
155
- if (target === items)
156
- target = target.slice();
157
- target.sort(propertiesPathComparator(keys));
158
- const total = items.length || 0;
159
- // Truncate if need
154
+ // Sort
155
+ if (!opts || opts.skipSort !== true) {
156
+ // Make to copy input items, before sorting (if not yet already done)
157
+ if (filteredItems === items)
158
+ filteredItems = filteredItems.slice();
159
+ // Sort by keys
160
+ filteredItems.sort(propertiesPathComparator(keys));
161
+ }
162
+ const total = filteredItems.length || 0;
163
+ // Pagination (truncate if need)
164
+ let pageData = filteredItems;
160
165
  if (opts) {
161
- if (isNil(opts.offset) && opts.offset > 0) {
162
- target = target.slice(opts.offset);
166
+ if ((opts.offset || 0) > 0) {
167
+ pageData = pageData.slice(opts.offset);
163
168
  }
164
- if (isNotNil(opts.size) && target.length > opts.size) {
165
- target = target.slice(0, opts.size);
169
+ if (isNotNil(opts.size) && pageData.length > opts.size) {
170
+ pageData = pageData.slice(0, opts.size);
166
171
  }
167
172
  }
168
- const res = {
169
- data: target,
173
+ const result = {
174
+ data: pageData,
170
175
  total
171
176
  };
172
177
  // Add fetch more capability, if total was fetched
173
- const nextOffset = (opts && opts.offset || 0) + items.length;
178
+ const nextOffset = (opts && opts.offset || 0) + pageData.length;
174
179
  if (nextOffset < total) {
175
- res.fetchMore = (_) => __awaiter(this, void 0, void 0, function* () { return suggestFromArray(items, value, Object.assign({ offset: nextOffset }, opts)); });
180
+ result.fetchMore = (_) => __awaiter(this, void 0, void 0, function* () {
181
+ return suggestFromArray(filteredItems, undefined /*OPTIMISATION: already applied*/, Object.assign(Object.assign({}, opts), { offset: nextOffset, skipSort: true, excludedIds: undefined // OPTIMISATION: already filtered
182
+ }));
183
+ });
176
184
  }
177
- return res;
185
+ return result;
178
186
  }
179
187
  export function suggestFromStringArray(values, value, options) {
180
188
  value = (typeof value === 'string' && value !== '*') && value.toUpperCase() || undefined;
@@ -444,4 +452,4 @@ export class Beans {
444
452
  }) === -1;
445
453
  }
446
454
  }
447
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFJQSxNQUFNLFVBQVUsS0FBSyxDQUFJLEdBQXlCO0lBQ2hELE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDO0FBQzNDLENBQUM7QUFDRCxNQUFNLFVBQVUsWUFBWSxDQUFJLEdBQXlCO0lBQ3ZELE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUM3RixDQUFDO0FBQ0QsTUFBTSxVQUFVLFFBQVEsQ0FBSSxHQUF5QjtJQUNuRCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQztBQUMzQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLGVBQWUsQ0FBSSxHQUF5QjtJQUMxRCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDN0YsQ0FBQztBQUNELE1BQU0sVUFBVSxhQUFhLENBQUksR0FBeUI7SUFDeEQsT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBQ0QsTUFBTSxVQUFVLFVBQVUsQ0FBSSxHQUF5QjtJQUNyRCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxL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TyxLQUFLLEtBQUssUUFBUTtnQkFBRSxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzRyxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNkLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RmV0Y2hNb3JlRm4sIExvYWRSZXN1bHR9IGZyb20gJy4vc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgS2V5c0VudW0sIEtleVZhbHVlVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtpc01vbWVudH0gZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTmlsPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiA9PT0gdW5kZWZpbmVkIHx8IG9iaiA9PT0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05pbE9yQmxhbms8VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsIHx8ICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyAmJiBvYmoudHJpbSgpID09PSAnJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb3ROaWw8VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90TmlsT3JCbGFuazxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgJiYgKHR5cGVvZiBvYmogIT09ICdzdHJpbmcnIHx8IG9iai50cmltKCkgIT09ICcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vdE5pbE9yTmFOPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiAodHlwZW9mIG9iaiAhPT0gJ251bWJlcicgfHwgIWlzTmFOKG9iaikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTmlsT3JOYU48VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsIHx8ICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyAmJiBpc05hTihvYmopKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vdEVtcHR5QXJyYXk8VD4ob2JqOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgJiYgb2JqLmxlbmd0aCA+IDA7XG59XG5leHBvcnQgZnVuY3Rpb24gZmlyc3RBcnJheVZhbHVlPFQ+KG9iajogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXNOb3RFbXB0eUFycmF5KG9iaikgPyBvYmpbMF0gOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eUFycmF5PFQ+KG9iajogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsIHx8ICFvYmoubGVuZ3RoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90TmlsU3RyaW5nKG9iajogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCk6IG9iaiBpcyBzdHJpbmcge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdzdHJpbmcnIHx8IGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vdE5pbE9yRGVmYXVsdDxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IFQpOiBUIHtcbiAgcmV0dXJuIChvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwpID8gb2JqIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5U2l6ZTxUPihvYmo6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICByZXR1cm4gaXNOb3RFbXB0eUFycmF5KG9iaikgJiYgb2JqLmxlbmd0aCB8fCAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5R3JvdXBCeTxcbiAgVCA9IGFueSxcbiAgSyBleHRlbmRzIGtleW9mIFQgPSBhbnksXG4gIE0gZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IFRbXTtcbn0gPSB7IFtrZXk6IHN0cmluZ106IFRbXSB9PihvYmo6IFRbXSwga2V5OiBrZXlvZiBUKTogTSB7XG4gIGlmIChpc05pbChvYmopKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIG9iai5yZWR1Y2UoKHJ2OiBhbnksIHgpID0+IHtcbiAgICAocnZbeFtrZXldXSA9IHJ2W3hba2V5XV0gfHwgW10pLnB1c2goeCk7XG4gICAgcmV0dXJuIHJ2O1xuICB9LCB7fSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXJyYXlEaXN0aW5jdDxUID0gYW55PihvYmo6IFRbXSwgcHJvcGVydGllcz86IHN0cmluZ1tdKTogVFtdIHtcbiAgaWYgKGlzRW1wdHlBcnJheShvYmopKSByZXR1cm4gb2JqO1xuICBwcm9wZXJ0aWVzID0gcHJvcGVydGllcyB8fCBPYmplY3Qua2V5cyhvYmpbMF0pO1xuICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByZXR1cm4gb2JqLnJlZHVjZSgocmVzLCBpdGVtKSA9PiB7XG4gICAgY29uc3QgdW5pcXVlS2V5ID0gam9pblByb3BlcnRpZXNQYXRoKGl0ZW0sIHByb3BlcnRpZXMsICd8Jyk7XG4gICAgaWYgKGV4aXN0aW5nSWRzLmhhcyh1bmlxdWVLZXkpKSByZXR1cm4gcmVzOyAvLyBTa2lwXG4gICAgZXhpc3RpbmdJZHMuYWRkKHVuaXF1ZUtleSk7XG4gICAgcmV0dXJuIHJlcy5jb25jYXQoaXRlbSk7XG4gIH0sIFtdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudWxsSWZVbmRlZmluZWQ8VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFQgfCBudWxsIHtcbiAgcmV0dXJuIG9iaiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IG9iajtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cmltRW1wdHlUb051bGw8VD4oc3RyOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHZhbHVlID0gc3RyICYmIHN0ci50cmltKCkgfHwgdW5kZWZpbmVkO1xuICByZXR1cm4gdmFsdWUgJiYgdmFsdWUubGVuZ3RoICYmIHZhbHVlIHx8IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9Cb29sZWFuKG9iajogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwpID8gKG9iaiAhPT0gJ2ZhbHNlJyA/ICEhb2JqIDogZmFsc2UpIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyKG9iajogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIChvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwpID8gK29iaiA6IGRlZmF1bHRWYWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b0Zsb2F0KG9iajogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gIHJldHVybiAob2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsKSA/IHBhcnNlRmxvYXQob2JqKSA6IGRlZmF1bHRWYWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b0ludChvYmo6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZT86IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICByZXR1cm4gKG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCkgPyBwYXJzZUludChvYmosIDApIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvTm90TmlsPFQgPSBhbnk+KG9iajogVCwgZGVmYXVsdFZhbHVlPzogVCk6IGFueSB8IG51bGwge1xuICByZXR1cm4gKG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCkgPyBvYmogOiBkZWZhdWx0VmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRHVwbGljYXRlc0Zyb21BcnJheTxUPihvYmo6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQsIHByb3BlcnR5Pzogc3RyaW5nKTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0VtcHR5QXJyYXkob2JqKSkgcmV0dXJuIG9iajtcbiAgaWYgKHByb3BlcnR5KSB7XG4gICAgcmV0dXJuIG9iai5maWx0ZXIoKGl0ZW0sIGksIGFycmF5KSA9PiBhcnJheS5maW5kSW5kZXgodCA9PiB0ICYmIGl0ZW0gJiYgdFtwcm9wZXJ0eV0gPT09IGl0ZW1bcHJvcGVydHldKSA9PT0gaSk7XG4gIH1cbiAgcmV0dXJuIG9iai5maWx0ZXIoKGl0ZW0sIGksIGFycmF5KSA9PiBhcnJheS5maW5kSW5kZXgodCA9PiB0ICYmIGl0ZW0gJiYgdCA9PT0gaXRlbSkgPT09IGkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0c1dpdGhVcHBlckNhc2UoaW5wdXQ6IHN0cmluZywgc2VhcmNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlucHV0ICYmIGlucHV0LnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChzZWFyY2gpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoVXBwZXJDYXNlKGlucHV0OiBzdHJpbmcsIHJlZ2V4cDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpbnB1dCAmJiAhIWlucHV0LnRvVXBwZXJDYXNlKCkubWF0Y2gocmVnZXhwKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdHJhaWxpbmcgc2xhc2ggaWYgYW55LiBFeGFtcGxlcyA6XG4gKiAtICcvdGVzdC8nIC0+ICcvdGVzdCdcbiAqIC0gJy8nIC0+IHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9UcmFpbGluZ1NsYXNoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghcGF0aCB8fCBwYXRoLnRyaW0oKSA9PT0gJy8nKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAocGF0aC50cmltKCkubGFzdEluZGV4T2YoJy8nKSA9PT0gcGF0aC5sZW5ndGggLSAxKSByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGggLSAxKTtcbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlQWxsKHZhbHVlOiBzdHJpbmcsIHNlYXJjaFN0cmluZzogYW55LCByZXBsYWNlbWVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHdoaWxlICh2YWx1ZSAmJiB2YWx1ZS5pbmRleE9mKHNlYXJjaFN0cmluZykgIT09IC0xKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHNlYXJjaFN0cmluZywgcmVwbGFjZW1lbnQpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUVuZCh2YWx1ZTogc3RyaW5nLCBlbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZT8uZW5kc1dpdGgoZW5kIHx8ICcnKSA/IHZhbHVlLnN1YnN0cigwLCB2YWx1ZS5sZW5ndGggLSBlbmQubGVuZ3RoKSA6IHZhbHVlO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FzZSBjaGFuZ2UgYnkgYW4gdW5kZXJzY29yZSAoLmUuZyAnbXlTdHJpbmcnIGJlY29tZXMgJ215X3N0cmluZycpXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoaXNOaWxPckJsYW5rKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxXyQyJykudG9Mb3dlckNhc2UoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURpYWNyaXRpY3ModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQubm9ybWFsaXplKCdORkQnKS5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWdnZXN0RnJvbUFycmF5PFQgPSBhbnk+KGl0ZW1zOiBUW10sIHZhbHVlOiBhbnksIG9wdHM/OiB7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgc2l6ZT86IG51bWJlcjtcbiAgc2VhcmNoQXR0cmlidXRlPzogc3RyaW5nO1xuICBzZWFyY2hBdHRyaWJ1dGVzPzogc3RyaW5nW107XG4gIGV4Y2x1ZGVkSWRzPzogbnVtYmVyW107XG59KTogTG9hZFJlc3VsdDxUPiB7XG4gIGlmIChpc05vdE5pbCh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHtkYXRhOiBbdmFsdWVdfTtcblxuICB2YWx1ZSA9ICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlICE9PSAnKicpICYmIHZhbHVlLnRvVXBwZXJDYXNlKCkgfHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGtleXMgPSBvcHRzICYmIChvcHRzLnNlYXJjaEF0dHJpYnV0ZSAmJiBbb3B0cy5zZWFyY2hBdHRyaWJ1dGVdIHx8IG9wdHMuc2VhcmNoQXR0cmlidXRlcykgfHwgWydsYWJlbCddO1xuXG4gIGlmICghaXRlbXMpIHtcbiAgICByZXR1cm4ge2RhdGE6IFtdLCB0b3RhbDogMH07XG4gIH1cblxuICAvLyBGaWx0ZXIgaXRlbXNcbiAgbGV0IHRhcmdldCA9IGl0ZW1zO1xuICBpZiAoaXNOb3ROaWxPckJsYW5rKHZhbHVlKSkge1xuXG4gICAgLy8gSWYgd2lsZGNhcmQsIHNlYXJjaCB1c2luZyByZWdleHBcbiAgICBpZiAoKHZhbHVlIGFzIHN0cmluZykuaW5kZXhPZignKicpICE9PSAtMSkge1xuICAgICAgdmFsdWUgPSAodmFsdWUgYXMgc3RyaW5nKS5yZXBsYWNlKCcqJywgJy4qJyk7XG4gICAgICB0YXJnZXQgPSB0YXJnZXQuZmlsdGVyKHYgPT4ga2V5cy5maW5kSW5kZXgoa2V5ID0+IG1hdGNoVXBwZXJDYXNlKGdldFByb3BlcnR5QnlQYXRoQXNTdHJpbmcodiwga2V5KSwgdmFsdWUpKSAhPT0gLTEpO1xuICAgIH1cbiAgICAvLyBFbHNlIChubyB3aWxkY2FyZCksIHNlYXJjaCB1c2luZyBzdGFydHNXaXRoXG4gICAgZWxzZSB7XG4gICAgICB0YXJnZXQgPSB0YXJnZXQuZmlsdGVyKHYgPT4ga2V5cy5maW5kSW5kZXgoa2V5ID0+IHN0YXJ0c1dpdGhVcHBlckNhc2UoZ2V0UHJvcGVydHlCeVBhdGhBc1N0cmluZyh2LCBrZXkpLCB2YWx1ZSkpICE9PSAtMSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhjbHVkZSBpZHNcbiAgaWYgKGlzTm90RW1wdHlBcnJheShvcHRzPy5leGNsdWRlZElkcykpIHtcbiAgICB0YXJnZXQgPSB0YXJnZXQuZmlsdGVyKHYgPT4gIW9wdHMuZXhjbHVkZWRJZHMuaW5jbHVkZXMoK3ZbJ2lkJ10pKTtcbiAgfVxuXG4gIC8vIFNvcnQgKGNvcHkgaWYgbmVlZCwgYmVmb3JlIHNvcnRpbmcpXG4gIGlmICh0YXJnZXQgPT09IGl0ZW1zKSB0YXJnZXQgPSB0YXJnZXQuc2xpY2UoKTtcbiAgdGFyZ2V0LnNvcnQocHJvcGVydGllc1BhdGhDb21wYXJhdG9yKGtleXMpKVxuXG4gIGNvbnN0IHRvdGFsID0gaXRlbXMubGVuZ3RoIHx8IDA7XG5cbiAgLy8gVHJ1bmNhdGUgaWYgbmVlZFxuICBpZiAob3B0cykge1xuICAgIGlmIChpc05pbChvcHRzLm9mZnNldCkgJiYgb3B0cy5vZmZzZXQgPiAwKSB7XG4gICAgICB0YXJnZXQgPSB0YXJnZXQuc2xpY2Uob3B0cy5vZmZzZXQpO1xuICAgIH1cbiAgICBpZiAoaXNOb3ROaWwob3B0cy5zaXplKSAmJiB0YXJnZXQubGVuZ3RoID4gb3B0cy5zaXplKSB7XG4gICAgICB0YXJnZXQgPSB0YXJnZXQuc2xpY2UoMCwgb3B0cy5zaXplKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXM6IExvYWRSZXN1bHQ8VD4gPSB7XG4gICAgZGF0YTogdGFyZ2V0LFxuICAgIHRvdGFsXG4gIH07XG5cbiAgLy8gQWRkIGZldGNoIG1vcmUgY2FwYWJpbGl0eSwgaWYgdG90YWwgd2FzIGZldGNoZWRcbiAgY29uc3QgbmV4dE9mZnNldCA9IChvcHRzICYmIG9wdHMub2Zmc2V0IHx8IDApICsgaXRlbXMubGVuZ3RoO1xuICBpZiAobmV4dE9mZnNldCA8IHRvdGFsKSB7XG4gICAgcmVzLmZldGNoTW9yZSA9IGFzeW5jIChfKSA9PiBzdWdnZXN0RnJvbUFycmF5KGl0ZW1zLCB2YWx1ZSwge29mZnNldDogbmV4dE9mZnNldCwgLi4ub3B0c30pO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1Z2dlc3RGcm9tU3RyaW5nQXJyYXkodmFsdWVzOiBzdHJpbmdbXSwgdmFsdWU6IGFueSwgb3B0aW9ucz86IHtcbiAgc2VhcmNoQXR0cmlidXRlPzogc3RyaW5nO1xuICBzZWFyY2hBdHRyaWJ1dGVzPzogc3RyaW5nW107XG59KTogc3RyaW5nW10ge1xuICB2YWx1ZSA9ICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlICE9PSAnKicpICYmIHZhbHVlLnRvVXBwZXJDYXNlKCkgfHwgdW5kZWZpbmVkO1xuICBpZiAoaXNOaWxPckJsYW5rKHZhbHVlKSkgcmV0dXJuIHZhbHVlcztcblxuICAvLyBJZiB3aWxkY2FyZCwgc2VhcmNoIHVzaW5nIHJlZ2V4cFxuICBpZiAoKHZhbHVlIGFzIHN0cmluZykuaW5kZXhPZignKicpICE9PSAtMSkge1xuICAgIHZhbHVlID0gKHZhbHVlIGFzIHN0cmluZykucmVwbGFjZSgnKicsICcuKicpO1xuICAgIHJldHVybiB2YWx1ZXMuZmlsdGVyKHYgPT4gbWF0Y2hVcHBlckNhc2UodiwgdmFsdWUpKTtcbiAgfVxuXG4gIC8vIElmIG5vIHdpbGRjYXJkLCBzZWFyY2ggdXNpbmcgc3RhcnRzV2l0aFxuICByZXR1cm4gdmFsdWVzLmZpbHRlcih2ID0+IHN0YXJ0c1dpdGhVcHBlckNhc2UodiwgdmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvaW5Qcm9wZXJ0aWVzUGF0aDxUID0gYW55PihvYmo6IFQsIHByb3BlcnRpZXM6IHN0cmluZ1tdLCBzZXBhcmF0b3I/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIW9iaikgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZGlzcGxheSBhbiB1bmRlZmluZWQgZW50aXR5LicpO1xuICByZXR1cm4gcHJvcGVydGllc1xuICAgIC5tYXAocGF0aCA9PiBnZXRQcm9wZXJ0eUJ5UGF0aChvYmosIHBhdGgpKVxuICAgIC5maWx0ZXIoaXNOb3ROaWxPckJsYW5rKVxuICAgIC5qb2luKHNlcGFyYXRvciB8fCAnIC0gJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqb2luUHJvcGVydGllczxUID0gYW55LCBLIGV4dGVuZHMga2V5b2YgVCA9IGFueT4ob2JqOiBULCBrZXlzOiBLW10sIHNlcGFyYXRvcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghb2JqKSB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBkaXNwbGF5IGFuIHVuZGVmaW5lZCBlbnRpdHkuJyk7XG4gIHJldHVybiBrZXlzXG4gICAgLm1hcChrZXkgPT4gZ2V0UHJvcGVydHkob2JqLCBrZXkpKVxuICAgIC5maWx0ZXIoaXNOb3ROaWxPckJsYW5rKVxuICAgIC5qb2luKHNlcGFyYXRvciB8fCAnIC0gJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eVBhdGhDb21wYXJhdG9yPFQgPSBhbnk+KHBhdGg6IHN0cmluZyk6IChhOiBULCBiOiBUKSA9PiBudW1iZXIge1xuICByZXR1cm4gKGE6IFQsIGI6IFQpID0+IHtcbiAgICBjb25zdCB2YWx1ZUEgPSBnZXRQcm9wZXJ0eUJ5UGF0aChhLCBwYXRoKTtcbiAgICBjb25zdCB2YWx1ZUIgPSBnZXRQcm9wZXJ0eUJ5UGF0aChiLCBwYXRoKTtcbiAgICByZXR1cm4gdmFsdWVBID09PSB2YWx1ZUIgPyAwIDogKHZhbHVlQSA+IHZhbHVlQiA/IDEgOiAtMSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eUNvbXBhcmF0b3I8VCA9IGFueSwgSyBleHRlbmRzIGtleW9mIFQgPSBhbnk+KGtleTogSywgZGVmYXVsdFZhbHVlPzogYW55KTogKGE6IFQsIGI6IFQpID0+IG51bWJlciB7XG4gIHJldHVybiAoYTogVCwgYjogVCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlQSA9IGFba2V5XSAhPT0gdW5kZWZpbmVkID8gYVtrZXldIDogZGVmYXVsdFZhbHVlO1xuICAgIGNvbnN0IHZhbHVlQiA9IGJba2V5XSA/IGJba2V5XSA6IGRlZmF1bHRWYWx1ZTtcbiAgICByZXR1cm4gdmFsdWVBID09PSB2YWx1ZUIgPyAwIDogKHZhbHVlQSA+IHZhbHVlQiA/IDEgOiAtMSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0aWVzUGF0aENvbXBhcmF0b3I8VCA9IGFueT4oa2V5czogc3RyaW5nW10sIGRlZmF1bHRWYWx1ZXM/OiBhbnlbXSk6IChhOiBULCBiOiBUKSA9PiBudW1iZXIge1xuICBpZiAoIWtleXMgfHwgIWtleXMubGVuZ3RoIHx8IChkZWZhdWx0VmFsdWVzICYmIGtleXMubGVuZ3RoID4gZGVmYXVsdFZhbHVlcy5sZW5ndGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50czogbWlzc2luZyBcXCdrZXlzXFwnIG9yIGFycmF5IFxcJ2RlZmF1bHRWYWx1ZXNcXCcgaGFzIGEgYmFkIGxlbmd0aCcpO1xuICB9XG4gIHJldHVybiAoYTogVCwgYjogVCkgPT4ga2V5cy5tYXAoKGtleSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlQSA9IGdldFByb3BlcnR5QnlQYXRoKGEsIGtleSwgZGVmYXVsdFZhbHVlcyAmJiBkZWZhdWx0VmFsdWVzW2luZGV4XSk7XG4gICAgICBjb25zdCB2YWx1ZUIgPSBnZXRQcm9wZXJ0eUJ5UGF0aChiLCBrZXksIGRlZmF1bHRWYWx1ZXMgJiYgZGVmYXVsdFZhbHVlc1tpbmRleF0pO1xuICAgICAgcmV0dXJuIHZhbHVlQSA9PT0gdmFsdWVCID8gMCA6ICh2YWx1ZUEgPiB2YWx1ZUIgPyAxIDogLTEpO1xuICAgIH0pXG4gICAgICAvLyBTdG9wIGlmIG5vdCBlcXVhbHMsIG90aGVyd2lzZSBjb250aW51ZSB3aXRoIHRoZSBuZXh0IGtleVxuICAgICAgLmZpbmQocmVzID0+IHJlcyAhPT0gMCkgfHwgMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnQ8VD4oYXJyYXk6IFRbXSwgYXR0cmlidXRlOiBzdHJpbmcsIG9wdHM/OiBJbnRsLkNvbGxhdG9yT3B0aW9ucyk6IFRbXSB7XG4gIGlmIChpc0VtcHR5QXJyYXkoYXJyYXkpKSByZXR1cm4gYXJyYXk7XG4gIGNvbnN0IGNvbXBhcmVGbiA9IG9wdHNcbiAgICA/IG5ldyBJbnRsLkNvbGxhdG9yKHVuZGVmaW5lZCwgb3B0cykuY29tcGFyZVxuICAgIDogKHYxLCB2MikgPT4gdjEgPT09IHYyID8gMCA6IHYxID4gdjIgPyAxIDogLTE7XG4gIHJldHVybiBhcnJheVxuICAgIC5zbGljZSgpIC8vIGNvcHlcbiAgICAuc29ydCgoYSwgYikgPT4gY29tcGFyZUZuKGFbYXR0cmlidXRlXSwgYlthdHRyaWJ1dGVdKSk7XG59XG5jb25zdCBJTlRFR0VSX1JFR0VYUCA9IC9eWy1dP1xcZCskLztcbmV4cG9ydCBmdW5jdGlvbiBpc0ludCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgJiYgSU5URUdFUl9SRUdFWFAudGVzdCh2YWx1ZSk7XG59XG5jb25zdCBOVU1CRVJfUkVHRVhQID0gL15bLV0/XFxkKyhcXC5cXGQrKT8kLztcbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgJiYgTlVNQkVSX1JFR0VYUC50ZXN0KHZhbHVlKTtcbn1cblxuY29uc3QgTlVNQkVSX1JBTkdFX1JFR0VYUCA9IC9eKFxcZCstXFxkKyl8KFs+PD1dKlxcZCspJC87XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJSYW5nZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgJiYgTlVNQkVSX1JBTkdFX1JFR0VYUC50ZXN0KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3BlcnR5QnlQYXRoKG9iajogYW55LCBwYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGFueSk6IGFueSB7XG4gIGlmIChpc05pbChvYmopKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICBpZiAoaXNOaWxPckJsYW5rKHBhdGgpKSByZXR1cm4gb2JqO1xuICBjb25zdCBpID0gcGF0aC5pbmRleE9mKCcuJyk7XG4gIC8vIFNpbXBsZSBwcm9wZXJ0eSBwYXRoXG4gIGlmIChpID09PSAtMSkge1xuICAgIGNvbnN0IHJlcyA9IG9ialtwYXRoXTtcbiAgICByZXR1cm4gKGlzTm90TmlsKHJlcykgfHwgaXNOaWwoZGVmYXVsdFZhbHVlKSkgPyByZXMgOiBkZWZhdWx0VmFsdWU7XG4gIH1cbiAgLy8gQ29tcGxleCBwcm9wZXJ0eSBwYXRoXG4gIGNvbnN0IGtleSA9IHBhdGguc3Vic3RyaW5nKDAsIGkpO1xuICBpZiAoaXNOaWwob2JqW2tleV0pKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICBpZiAob2JqW2tleV0gJiYgdHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5UGF0aChvYmpba2V5XSwgcGF0aC5zdWJzdHJpbmcoaSArIDEpKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJvcGVydHkgcGF0aDogJyR7a2V5fScgaXMgbm90IGFuIHZhbGlkIG9iamVjdC5gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3BlcnR5PFQgPSBhbnksIEsgZXh0ZW5kcyBrZXlvZiBUID0gYW55PihvYmo6IFQsIGtleTogSyk6IFRbS10ge1xuICBpZiAoaXNOaWwob2JqKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG9ialtrZXldOyAvLyBJbmZlcnJlZCB0eXBlIGlzIFRbS11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3BlcnR5QnlQYXRoQXNTdHJpbmcob2JqOiBhbnksIHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlcyA9IGdldFByb3BlcnR5QnlQYXRoKG9iaiwgcGF0aCk7XG4gIHJldHVybiByZXMgJiYgKHR5cGVvZiByZXMgPT09ICdzdHJpbmcnID8gcmVzIDogKCcnICsgcmVzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChtcyA8PSAwKSByZXR1cm47XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKTogbnVtYmVyIHtcbiAgaWYgKGlzTm90TmlsT3JOYU4odmFsdWUpKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoKHZhbHVlICsgTnVtYmVyLkVQU0lMT04pICogMTAwKSAvIDEwMDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHNPck5pbCh2YWx1ZTE6IGFueSwgdmFsdWUyOiBhbnkpIHtcbiAgcmV0dXJuICh2YWx1ZTEgPT09IHZhbHVlMikgfHwgKGlzTmlsKHZhbHVlMSkgJiYgaXNOaWwodmFsdWUyKSk7XG59XG5cbi8qKlxuICogcmVtb3ZlIGVsZW1lbnRzIGZyb20gYW4gYXJyYXlcbiAqXG4gKiBAcmV0dXJuIHRoZSByZW1vdmVkIGVsZW1lbnRzXG4gKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IG9uIHdoaWNoIGVsZW1lbnRzIHdpbGwgYmUgcmVtb3ZlZFxuICogQHBhcmFtIHByZWRpY2F0ZSB0aGUgc2VsZWN0aW9uIHByZWRpY2F0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQWxsPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogKHBtZm06IFQpID0+IGJvb2xlYW4pOiBUW10ge1xuICBsZXQgbmJSZW1vdmUgPSAwO1xuICByZXR1cm4gYXJyYXkuc2xpY2UoKS5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICBuYlJlbW92ZSsrOyAvLyBnbGl0Y2ggY291bnRlciB0byBhdm9pZCBpbmRleCBnYXBcbiAgICAgIHJldHVybiBhcnJheS5zcGxpY2UoaW5kZXggLSBuYlJlbW92ZSArIDEsIDEpWzBdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSkuZmlsdGVyKGlzTm90TmlsKTtcbn1cblxuLyoqXG4gKiByZW1vdmUgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSBhbiBhcnJheVxuICpcbiAqIEByZXR1cm4gdGhlIHJlbW92ZWQgZWxlbWVudFxuICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSBvbiB3aGljaCB0aGUgZWxlbWVudCB3aWxsIGJlIHJlbW92ZWRcbiAqIEBwYXJhbSBwcmVkaWNhdGUgdGhlIHNlbGVjdGlvbiBwcmVkaWNhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZTxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6IChwbWZtOiBUKSA9PiBib29sZWFuKTogVCB7XG4gIHJldHVybiBhcnJheS5zbGljZSgpLmZpbmQoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsdWU6IHN0cmluZykge1xuICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHZhbHVlO1xuICByZXR1cm4gdmFsdWUuc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHIoMSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5jYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsdWU6IHN0cmluZykge1xuICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHZhbHVlO1xuICByZXR1cm4gdmFsdWUuc3Vic3RyKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHIoMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEJ5UHJvcGVydHk8VCwgTSBleHRlbmRzIEtleVZhbHVlVHlwZTxUPiA9IEtleVZhbHVlVHlwZTxUPj4oYXJyYXk6IFRbXSB8IHJlYWRvbmx5IFRbXSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBNIHtcbiAgcmV0dXJuIChhcnJheSB8fCBbXSkucmVkdWNlKChyZXMsIHZhbHVlKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gdmFsdWU/Lltwcm9wZXJ0eU5hbWVdO1xuICAgIGlmIChpc05vdE5pbChrZXkpKSB7XG4gICAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9LCA8TT57fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEJ5SWQ8VCwgTSBleHRlbmRzIEtleVZhbHVlVHlwZTxUPiA9IEtleVZhbHVlVHlwZTxUPj4oYXJyYXk6IFRbXSB8IHJlYWRvbmx5IFRbXSk6IE0ge1xuICByZXR1cm4gKGFycmF5IHx8IFtdKS5yZWR1Y2UoKHJlcywgdmFsdWUpID0+IHtcbiAgICBjb25zdCBrZXkgPSB2YWx1ZT8uWydpZCddO1xuICAgIGlmIChpc05vdE5pbChrZXkpKSB7XG4gICAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9LCA8TT57fSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0d28gb2JqZWN0cyBvciB0d28gdmFsdWVzIGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIFR3byBvYmplY3RzIG9yIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gKlxuICogKiBCb3RoIG9iamVjdHMgb3IgdmFsdWVzIHBhc3MgYD09PWAgY29tcGFyaXNvbi5cbiAqICogQm90aCBvYmplY3RzIG9yIHZhbHVlcyBhcmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgYWxsIG9mIHRoZWlyIHByb3BlcnRpZXMgYXJlIGVxdWFsIGJ5XG4gKiAgIGNvbXBhcmluZyB0aGVtIHdpdGggYGVxdWFsc2AuXG4gKlxuICogQHBhcmFtIG8xIE9iamVjdCBvciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIG8yIE9iamVjdCBvciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhcmd1bWVudHMgYXJlIGVxdWFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKG8xOiBhbnksIG8yOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKG8xID09PSBvMikgcmV0dXJuIHRydWU7XG4gIGlmIChvMSA9PT0gbnVsbCB8fCBvMiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAobzEgIT09IG8xICYmIG8yICE9PSBvMikgcmV0dXJuIHRydWU7IC8vIE5hTiA9PT0gTmFOXG4gIGxldCB0MSA9IHR5cGVvZiBvMSwgdDIgPSB0eXBlb2YgbzIsIGxlbmd0aDogbnVtYmVyLCBrZXk6IGFueSwga2V5U2V0OiBhbnk7XG4gIGlmICh0MSA9PSB0MiAmJiB0MSA9PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8xKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG8yKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKChsZW5ndGggPSBvMS5sZW5ndGgpID09IG8yLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGtleSA9IDA7IGtleSA8IGxlbmd0aDsga2V5KyspIHtcbiAgICAgICAgICBpZiAoIWVxdWFscyhvMVtrZXldLCBvMltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvMikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAga2V5U2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGZvciAoa2V5IGluIG8xKSB7XG4gICAgICAgIGlmICghZXF1YWxzKG8xW2tleV0sIG8yW2tleV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGtleVNldFtrZXldID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoa2V5IGluIG8yKSB7XG4gICAgICAgIGlmICghKGtleSBpbiBrZXlTZXQpICYmIHR5cGVvZiBvMltrZXldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIEJlYW5zIHtcbiAgLyoqXG4gICAqIENvcHkgYSBzb3VyY2Ugb2JqZWN0LCBieSBpbmNsdWRpbmcgb25seSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBkYXRhVHlwZS5cbiAgICogSU1QT1JUQU5UOiBleHRyYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIE5PVCBpbiB0aGUgdGFyZ2V0Q2xhc3MgYXJlIE5PVCBjb3BpZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgdG8gY29weVxuICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGNsYXNzIHRvIHVzZSBhcyB0YXJnZXQgY2xhc3NcbiAgICogQHBhcmFtIGtleXMgVGhlIGtleXMgdG8gY29weS4gSWYgZW1wdHksIHdpbGwgY29weSBvbmx5IE5PVCBvcHRpb25hbCBwcm9wZXJ0aWVzIGZyb20gdGhlIGRhdGFUeXBlXG4gICAqL1xuICBzdGF0aWMgY29weTxUPihzb3VyY2U6IFQsIGRhdGFUeXBlOiBuZXcgKCkgPT4gVCwga2V5cz86IEtleXNFbnVtPFQ+KTogVCB7XG4gICAgaWYgKGlzTmlsKHNvdXJjZSkpIHJldHVybiBzb3VyY2U7XG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IGRhdGFUeXBlKCk7XG4gICAgT2JqZWN0LmtleXMoa2V5cyB8fCB0YXJnZXQpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXlzIGlmIGFuIG9iamVjdCBhbGwgYWxsIHByb3BlcnRpZXMgdG8gbmlsXG4gICAqL1xuICBzdGF0aWMgaXNFbXB0eTxUPihkYXRhOiBULCBrZXlzPzogS2V5c0VudW08VD58c3RyaW5nW10sIG9wdHM/OiB7XG4gICAgYmxhbmtTdHJpbmdMaWtlRW1wdHk/OiBib29sZWFuO1xuICB9KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTmlsKGRhdGEpIHx8IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IE9iamVjdC5rZXlzKGtleXMgfHwgZGF0YSkpXG4gICAgICAvLyBGaW5kIGluZGV4IG9mIHRoZSBmaXJzdCBOT1QgbmlsIHZhbHVlXG4gICAgICAuZmluZEluZGV4KGtleSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtrZXldO1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuICFCZWFucy5pc0VtcHR5KHZhbHVlLCBudWxsLCBvcHRzKTsgLy8gTG9vcFxuICAgICAgICBpZiAob3B0cyAmJiBvcHRzLmJsYW5rU3RyaW5nTGlrZUVtcHR5ID09PSB0cnVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBpc05vdE5pbE9yQmxhbmsodmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNOb3ROaWwodmFsdWUpO1xuICAgICAgfSkgPT09IC0xO1xuICB9XG5cbn1cbiJdfQ==
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFJQSxNQUFNLFVBQVUsS0FBSyxDQUFJLEdBQXlCO0lBQ2hELE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDO0FBQzNDLENBQUM7QUFDRCxNQUFNLFVBQVUsWUFBWSxDQUFJLEdBQXlCO0lBQ3ZELE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUM3RixDQUFDO0FBQ0QsTUFBTSxVQUFVLFFBQVEsQ0FBSSxHQUF5QjtJQUNuRCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQztBQUMzQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLGVBQWUsQ0FBSSxHQUF5QjtJQUMxRCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDN0YsQ0FBQztBQUNELE1BQU0sVUFBVSxhQUFhLENBQUksR0FBeUI7SUFDeEQsT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBQ0QsTUFBTSxVQUFVLFVBQVUsQ0FBSSxHQUF5QjtJQUNyRCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxL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SyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU87WUFDekYsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUFFLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNHLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtGZXRjaE1vcmVGbiwgTG9hZFJlc3VsdH0gZnJvbSAnLi9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBLZXlzRW51bSwgS2V5VmFsdWVUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge2lzTW9tZW50fSBmcm9tICdtb21lbnQnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOaWw8VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTmlsT3JCbGFuazxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGwgfHwgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnICYmIG9iai50cmltKCkgPT09ICcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vdE5pbDxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb3ROaWxPckJsYW5rPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiAodHlwZW9mIG9iaiAhPT0gJ3N0cmluZycgfHwgb2JqLnRyaW0oKSAhPT0gJycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90TmlsT3JOYU48VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsICYmICh0eXBlb2Ygb2JqICE9PSAnbnVtYmVyJyB8fCAhaXNOYU4ob2JqKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOaWxPck5hTjxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGwgfHwgKHR5cGVvZiBvYmogPT09ICdudW1iZXInICYmIGlzTmFOKG9iaikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90RW1wdHlBcnJheTxUPihvYmo6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiBvYmoubGVuZ3RoID4gMDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdEFycmF5VmFsdWU8VD4ob2JqOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpc05vdEVtcHR5QXJyYXkob2JqKSA/IG9ialswXSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5QXJyYXk8VD4ob2JqOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGwgfHwgIW9iai5sZW5ndGg7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb3ROaWxTdHJpbmcob2JqOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkKTogb2JqIGlzIHN0cmluZyB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHwgZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gbm90TmlsT3JEZWZhdWx0PFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogVCk6IFQge1xuICByZXR1cm4gKG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCkgPyBvYmogOiBkZWZhdWx0VmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gYXJyYXlTaXplPFQ+KG9iajogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIHJldHVybiBpc05vdEVtcHR5QXJyYXkob2JqKSAmJiBvYmoubGVuZ3RoIHx8IDA7XG59XG5leHBvcnQgZnVuY3Rpb24gYXJyYXlHcm91cEJ5PFxuICBUID0gYW55LFxuICBLIGV4dGVuZHMga2V5b2YgVCA9IGFueSxcbiAgTSBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogVFtdO1xufSA9IHsgW2tleTogc3RyaW5nXTogVFtdIH0+KG9iajogVFtdLCBrZXk6IGtleW9mIFQpOiBNIHtcbiAgaWYgKGlzTmlsKG9iaikpIHJldHVybiBudWxsO1xuICByZXR1cm4gb2JqLnJlZHVjZSgocnY6IGFueSwgeCkgPT4ge1xuICAgIChydlt4W2tleV1dID0gcnZbeFtrZXldXSB8fCBbXSkucHVzaCh4KTtcbiAgICByZXR1cm4gcnY7XG4gIH0sIHt9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcnJheURpc3RpbmN0PFQgPSBhbnk+KG9iajogVFtdLCBwcm9wZXJ0aWVzPzogc3RyaW5nW10pOiBUW10ge1xuICBpZiAoaXNFbXB0eUFycmF5KG9iaikpIHJldHVybiBvYmo7XG4gIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IE9iamVjdC5rZXlzKG9ialswXSk7XG4gIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHJldHVybiBvYmoucmVkdWNlKChyZXMsIGl0ZW0pID0+IHtcbiAgICBjb25zdCB1bmlxdWVLZXkgPSBqb2luUHJvcGVydGllc1BhdGgoaXRlbSwgcHJvcGVydGllcywgJ3wnKTtcbiAgICBpZiAoZXhpc3RpbmdJZHMuaGFzKHVuaXF1ZUtleSkpIHJldHVybiByZXM7IC8vIFNraXBcbiAgICBleGlzdGluZ0lkcy5hZGQodW5pcXVlS2V5KTtcbiAgICByZXR1cm4gcmVzLmNvbmNhdChpdGVtKTtcbiAgfSwgW10pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG51bGxJZlVuZGVmaW5lZDxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogVCB8IG51bGwge1xuICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgPyBudWxsIDogb2JqO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRyaW1FbXB0eVRvTnVsbDxUPihzdHI6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgdmFsdWUgPSBzdHIgJiYgc3RyLnRyaW0oKSB8fCB1bmRlZmluZWQ7XG4gIHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggJiYgdmFsdWUgfHwgbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b0Jvb2xlYW4ob2JqOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICByZXR1cm4gKG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCkgPyAob2JqICE9PSAnZmFsc2UnID8gISFvYmogOiBmYWxzZSkgOiBkZWZhdWx0VmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9OdW1iZXIob2JqOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU/OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gKG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCkgPyArb2JqIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvRmxvYXQob2JqOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU/OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgcmV0dXJuIChvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwpID8gcGFyc2VGbG9hdChvYmopIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvSW50KG9iajogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gIHJldHVybiAob2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsKSA/IHBhcnNlSW50KG9iaiwgMCkgOiBkZWZhdWx0VmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9Ob3ROaWw8VCA9IGFueT4ob2JqOiBULCBkZWZhdWx0VmFsdWU/OiBUKTogYW55IHwgbnVsbCB7XG4gIHJldHVybiAob2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsKSA/IG9iaiA6IGRlZmF1bHRWYWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVzRnJvbUFycmF5PFQ+KG9iajogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJvcGVydHk/OiBzdHJpbmcpOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRW1wdHlBcnJheShvYmopKSByZXR1cm4gb2JqO1xuICBpZiAocHJvcGVydHkpIHtcbiAgICByZXR1cm4gb2JqLmZpbHRlcigoaXRlbSwgaSwgYXJyYXkpID0+IGFycmF5LmZpbmRJbmRleCh0ID0+IHQgJiYgaXRlbSAmJiB0W3Byb3BlcnR5XSA9PT0gaXRlbVtwcm9wZXJ0eV0pID09PSBpKTtcbiAgfVxuICByZXR1cm4gb2JqLmZpbHRlcigoaXRlbSwgaSwgYXJyYXkpID0+IGFycmF5LmZpbmRJbmRleCh0ID0+IHQgJiYgaXRlbSAmJiB0ID09PSBpdGVtKSA9PT0gaSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RhcnRzV2l0aFVwcGVyQ2FzZShpbnB1dDogc3RyaW5nLCBzZWFyY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaW5wdXQgJiYgaW5wdXQudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKHNlYXJjaCk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hVcHBlckNhc2UoaW5wdXQ6IHN0cmluZywgcmVnZXhwOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlucHV0ICYmICEhaW5wdXQudG9VcHBlckNhc2UoKS5tYXRjaChyZWdleHApO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0cmFpbGluZyBzbGFzaCBpZiBhbnkuIEV4YW1wbGVzIDpcbiAqIC0gJy90ZXN0LycgLT4gJy90ZXN0J1xuICogLSAnLycgLT4gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub1RyYWlsaW5nU2xhc2gocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFwYXRoIHx8IHBhdGgudHJpbSgpID09PSAnLycpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChwYXRoLnRyaW0oKS5sYXN0SW5kZXhPZignLycpID09PSBwYXRoLmxlbmd0aCAtIDEpIHJldHVybiBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtIDEpO1xuICByZXR1cm4gcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VBbGwodmFsdWU6IHN0cmluZywgc2VhcmNoU3RyaW5nOiBhbnksIHJlcGxhY2VtZW50KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgd2hpbGUgKHZhbHVlICYmIHZhbHVlLmluZGV4T2Yoc2VhcmNoU3RyaW5nKSAhPT0gLTEpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2Uoc2VhcmNoU3RyaW5nLCByZXBsYWNlbWVudCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRW5kKHZhbHVlOiBzdHJpbmcsIGVuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlPy5lbmRzV2l0aChlbmQgfHwgJycpID8gdmFsdWUuc3Vic3RyKDAsIHZhbHVlLmxlbmd0aCAtIGVuZC5sZW5ndGgpIDogdmFsdWU7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXNlIGNoYW5nZSBieSBhbiB1bmRlcnNjb3JlICguZS5nICdteVN0cmluZycgYmVjb21lcyAnbXlfc3RyaW5nJylcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZUNhc2VUb1VuZGVyc2NvcmUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpc05pbE9yQmxhbmsodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDFfJDInKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRGlhY3JpdGljcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5ub3JtYWxpemUoJ05GRCcpLnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1Z2dlc3RGcm9tQXJyYXk8VCA9IGFueT4oaXRlbXM6IFRbXSwgdmFsdWU6IGFueSwgb3B0cz86IHtcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBzaXplPzogbnVtYmVyO1xuICBzZWFyY2hBdHRyaWJ1dGU/OiBzdHJpbmc7XG4gIHNlYXJjaEF0dHJpYnV0ZXM/OiBzdHJpbmdbXTtcbiAgZXhjbHVkZWRJZHM/OiBudW1iZXJbXTtcbiAgc2tpcFNvcnQ/OiBib29sZWFuO1xufSk6IExvYWRSZXN1bHQ8VD4ge1xuICBpZiAoaXNOb3ROaWwodmFsdWUpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiB7ZGF0YTogW3ZhbHVlXX07XG5cbiAgdmFsdWUgPSAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJyonKSAmJiB2YWx1ZS50b1VwcGVyQ2FzZSgpIHx8IHVuZGVmaW5lZDtcblxuICBjb25zdCBrZXlzID0gb3B0cyAmJiAob3B0cy5zZWFyY2hBdHRyaWJ1dGUgJiYgW29wdHMuc2VhcmNoQXR0cmlidXRlXSB8fCBvcHRzLnNlYXJjaEF0dHJpYnV0ZXMpIHx8IFsnbGFiZWwnXTtcblxuICBpZiAoIWl0ZW1zKSB7XG4gICAgcmV0dXJuIHtkYXRhOiBbXSwgdG90YWw6IDB9O1xuICB9XG5cbiAgLy8gRmlsdGVyIGl0ZW1zXG4gIGxldCBmaWx0ZXJlZEl0ZW1zID0gaXRlbXM7XG4gIGlmIChpc05vdE5pbE9yQmxhbmsodmFsdWUpKSB7XG5cbiAgICAvLyBJZiB3aWxkY2FyZCwgc2VhcmNoIHVzaW5nIHJlZ2V4cFxuICAgIGlmICgodmFsdWUgYXMgc3RyaW5nKS5pbmRleE9mKCcqJykgIT09IC0xKSB7XG4gICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBzdHJpbmcpLnJlcGxhY2UoJyonLCAnLionKTtcbiAgICAgIGZpbHRlcmVkSXRlbXMgPSBmaWx0ZXJlZEl0ZW1zLmZpbHRlcih2ID0+IGtleXMuZmluZEluZGV4KGtleSA9PiBtYXRjaFVwcGVyQ2FzZShnZXRQcm9wZXJ0eUJ5UGF0aEFzU3RyaW5nKHYsIGtleSksIHZhbHVlKSkgIT09IC0xKTtcbiAgICB9XG4gICAgLy8gRWxzZSAobm8gd2lsZGNhcmQpLCBzZWFyY2ggdXNpbmcgc3RhcnRzV2l0aFxuICAgIGVsc2Uge1xuICAgICAgZmlsdGVyZWRJdGVtcyA9IGZpbHRlcmVkSXRlbXMuZmlsdGVyKHYgPT4ga2V5cy5maW5kSW5kZXgoa2V5ID0+IHN0YXJ0c1dpdGhVcHBlckNhc2UoZ2V0UHJvcGVydHlCeVBhdGhBc1N0cmluZyh2LCBrZXkpLCB2YWx1ZSkpICE9PSAtMSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhjbHVkZSBpZHNcbiAgaWYgKGlzTm90RW1wdHlBcnJheShvcHRzPy5leGNsdWRlZElkcykpIHtcbiAgICBmaWx0ZXJlZEl0ZW1zID0gZmlsdGVyZWRJdGVtcy5maWx0ZXIodiA9PiAhb3B0cy5leGNsdWRlZElkcy5pbmNsdWRlcygrdlsnaWQnXSkpO1xuICB9XG5cbiAgLy8gU29ydFxuICBpZiAoIW9wdHMgfHwgb3B0cy5za2lwU29ydCAhPT0gdHJ1ZSkge1xuXG4gICAgLy8gTWFrZSB0byBjb3B5IGlucHV0IGl0ZW1zLCBiZWZvcmUgc29ydGluZyAoaWYgbm90IHlldCBhbHJlYWR5IGRvbmUpXG4gICAgaWYgKGZpbHRlcmVkSXRlbXMgPT09IGl0ZW1zKSBmaWx0ZXJlZEl0ZW1zID0gZmlsdGVyZWRJdGVtcy5zbGljZSgpO1xuXG4gICAgLy8gU29ydCBieSBrZXlzXG4gICAgZmlsdGVyZWRJdGVtcy5zb3J0KHByb3BlcnRpZXNQYXRoQ29tcGFyYXRvcihrZXlzKSk7XG4gIH1cblxuICBjb25zdCB0b3RhbCA9IGZpbHRlcmVkSXRlbXMubGVuZ3RoIHx8IDA7XG5cbiAgLy8gUGFnaW5hdGlvbiAodHJ1bmNhdGUgaWYgbmVlZClcbiAgbGV0IHBhZ2VEYXRhID0gZmlsdGVyZWRJdGVtcztcbiAgaWYgKG9wdHMpIHtcbiAgICBpZiAoKG9wdHMub2Zmc2V0IHx8IDApID4gMCkge1xuICAgICAgcGFnZURhdGEgPSBwYWdlRGF0YS5zbGljZShvcHRzLm9mZnNldCk7XG4gICAgfVxuICAgIGlmIChpc05vdE5pbChvcHRzLnNpemUpICYmIHBhZ2VEYXRhLmxlbmd0aCA+IG9wdHMuc2l6ZSkge1xuICAgICAgcGFnZURhdGEgPSBwYWdlRGF0YS5zbGljZSgwLCBvcHRzLnNpemUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogTG9hZFJlc3VsdDxUPiA9IHtcbiAgICBkYXRhOiBwYWdlRGF0YSxcbiAgICB0b3RhbFxuICB9O1xuXG4gIC8vIEFkZCBmZXRjaCBtb3JlIGNhcGFiaWxpdHksIGlmIHRvdGFsIHdhcyBmZXRjaGVkXG4gIGNvbnN0IG5leHRPZmZzZXQgPSAob3B0cyAmJiBvcHRzLm9mZnNldCB8fCAwKSArIHBhZ2VEYXRhLmxlbmd0aDtcbiAgaWYgKG5leHRPZmZzZXQgPCB0b3RhbCkge1xuICAgIHJlc3VsdC5mZXRjaE1vcmUgPSBhc3luYyAoXykgPT4gc3VnZ2VzdEZyb21BcnJheShmaWx0ZXJlZEl0ZW1zLCB1bmRlZmluZWQgLypPUFRJTUlTQVRJT046IGFscmVhZHkgYXBwbGllZCovLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBvZmZzZXQ6IG5leHRPZmZzZXQsXG4gICAgICAgIHNraXBTb3J0OiB0cnVlLCAvLyBPUFRJTUlTQVRJT046IGFscmVhZHkgc29ydGVkXG4gICAgICAgIGV4Y2x1ZGVkSWRzOiB1bmRlZmluZWQgLy8gT1BUSU1JU0FUSU9OOiBhbHJlYWR5IGZpbHRlcmVkXG4gICAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWdnZXN0RnJvbVN0cmluZ0FycmF5KHZhbHVlczogc3RyaW5nW10sIHZhbHVlOiBhbnksIG9wdGlvbnM/OiB7XG4gIHNlYXJjaEF0dHJpYnV0ZT86IHN0cmluZztcbiAgc2VhcmNoQXR0cmlidXRlcz86IHN0cmluZ1tdO1xufSk6IHN0cmluZ1tdIHtcbiAgdmFsdWUgPSAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJyonKSAmJiB2YWx1ZS50b1VwcGVyQ2FzZSgpIHx8IHVuZGVmaW5lZDtcbiAgaWYgKGlzTmlsT3JCbGFuayh2YWx1ZSkpIHJldHVybiB2YWx1ZXM7XG5cbiAgLy8gSWYgd2lsZGNhcmQsIHNlYXJjaCB1c2luZyByZWdleHBcbiAgaWYgKCh2YWx1ZSBhcyBzdHJpbmcpLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBzdHJpbmcpLnJlcGxhY2UoJyonLCAnLionKTtcbiAgICByZXR1cm4gdmFsdWVzLmZpbHRlcih2ID0+IG1hdGNoVXBwZXJDYXNlKHYsIHZhbHVlKSk7XG4gIH1cblxuICAvLyBJZiBubyB3aWxkY2FyZCwgc2VhcmNoIHVzaW5nIHN0YXJ0c1dpdGhcbiAgcmV0dXJuIHZhbHVlcy5maWx0ZXIodiA9PiBzdGFydHNXaXRoVXBwZXJDYXNlKHYsIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqb2luUHJvcGVydGllc1BhdGg8VCA9IGFueT4ob2JqOiBULCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSwgc2VwYXJhdG9yPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvYmopIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGRpc3BsYXkgYW4gdW5kZWZpbmVkIGVudGl0eS4nKTtcbiAgcmV0dXJuIHByb3BlcnRpZXNcbiAgICAubWFwKHBhdGggPT4gZ2V0UHJvcGVydHlCeVBhdGgob2JqLCBwYXRoKSlcbiAgICAuZmlsdGVyKGlzTm90TmlsT3JCbGFuaylcbiAgICAuam9pbihzZXBhcmF0b3IgfHwgJyAtICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gam9pblByb3BlcnRpZXM8VCA9IGFueSwgSyBleHRlbmRzIGtleW9mIFQgPSBhbnk+KG9iajogVCwga2V5czogS1tdLCBzZXBhcmF0b3I/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIW9iaikgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZGlzcGxheSBhbiB1bmRlZmluZWQgZW50aXR5LicpO1xuICByZXR1cm4ga2V5c1xuICAgIC5tYXAoa2V5ID0+IGdldFByb3BlcnR5KG9iaiwga2V5KSlcbiAgICAuZmlsdGVyKGlzTm90TmlsT3JCbGFuaylcbiAgICAuam9pbihzZXBhcmF0b3IgfHwgJyAtICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHlQYXRoQ29tcGFyYXRvcjxUID0gYW55PihwYXRoOiBzdHJpbmcpOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyIHtcbiAgcmV0dXJuIChhOiBULCBiOiBUKSA9PiB7XG4gICAgY29uc3QgdmFsdWVBID0gZ2V0UHJvcGVydHlCeVBhdGgoYSwgcGF0aCk7XG4gICAgY29uc3QgdmFsdWVCID0gZ2V0UHJvcGVydHlCeVBhdGgoYiwgcGF0aCk7XG4gICAgcmV0dXJuIHZhbHVlQSA9PT0gdmFsdWVCID8gMCA6ICh2YWx1ZUEgPiB2YWx1ZUIgPyAxIDogLTEpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHlDb21wYXJhdG9yPFQgPSBhbnksIEsgZXh0ZW5kcyBrZXlvZiBUID0gYW55PihrZXk6IEssIGRlZmF1bHRWYWx1ZT86IGFueSk6IChhOiBULCBiOiBUKSA9PiBudW1iZXIge1xuICByZXR1cm4gKGE6IFQsIGI6IFQpID0+IHtcbiAgICBjb25zdCB2YWx1ZUEgPSBhW2tleV0gIT09IHVuZGVmaW5lZCA/IGFba2V5XSA6IGRlZmF1bHRWYWx1ZTtcbiAgICBjb25zdCB2YWx1ZUIgPSBiW2tleV0gPyBiW2tleV0gOiBkZWZhdWx0VmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlQSA9PT0gdmFsdWVCID8gMCA6ICh2YWx1ZUEgPiB2YWx1ZUIgPyAxIDogLTEpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydGllc1BhdGhDb21wYXJhdG9yPFQgPSBhbnk+KGtleXM6IHN0cmluZ1tdLCBkZWZhdWx0VmFsdWVzPzogYW55W10pOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyIHtcbiAgaWYgKCFrZXlzIHx8ICFrZXlzLmxlbmd0aCB8fCAoZGVmYXVsdFZhbHVlcyAmJiBrZXlzLmxlbmd0aCA+IGRlZmF1bHRWYWx1ZXMubGVuZ3RoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHM6IG1pc3NpbmcgXFwna2V5c1xcJyBvciBhcnJheSBcXCdkZWZhdWx0VmFsdWVzXFwnIGhhcyBhIGJhZCBsZW5ndGgnKTtcbiAgfVxuICByZXR1cm4gKGE6IFQsIGI6IFQpID0+IGtleXMubWFwKChrZXksIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZUEgPSBnZXRQcm9wZXJ0eUJ5UGF0aChhLCBrZXksIGRlZmF1bHRWYWx1ZXMgJiYgZGVmYXVsdFZhbHVlc1tpbmRleF0pO1xuICAgICAgY29uc3QgdmFsdWVCID0gZ2V0UHJvcGVydHlCeVBhdGgoYiwga2V5LCBkZWZhdWx0VmFsdWVzICYmIGRlZmF1bHRWYWx1ZXNbaW5kZXhdKTtcbiAgICAgIHJldHVybiB2YWx1ZUEgPT09IHZhbHVlQiA/IDAgOiAodmFsdWVBID4gdmFsdWVCID8gMSA6IC0xKTtcbiAgICB9KVxuICAgICAgLy8gU3RvcCBpZiBub3QgZXF1YWxzLCBvdGhlcndpc2UgY29udGludWUgd2l0aCB0aGUgbmV4dCBrZXlcbiAgICAgIC5maW5kKHJlcyA9PiByZXMgIT09IDApIHx8IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0PFQ+KGFycmF5OiBUW10sIGF0dHJpYnV0ZTogc3RyaW5nLCBvcHRzPzogSW50bC5Db2xsYXRvck9wdGlvbnMpOiBUW10ge1xuICBpZiAoaXNFbXB0eUFycmF5KGFycmF5KSkgcmV0dXJuIGFycmF5O1xuICBjb25zdCBjb21wYXJlRm4gPSBvcHRzXG4gICAgPyBuZXcgSW50bC5Db2xsYXRvcih1bmRlZmluZWQsIG9wdHMpLmNvbXBhcmVcbiAgICA6ICh2MSwgdjIpID0+IHYxID09PSB2MiA/IDAgOiB2MSA+IHYyID8gMSA6IC0xO1xuICByZXR1cm4gYXJyYXlcbiAgICAuc2xpY2UoKSAvLyBjb3B5XG4gICAgLnNvcnQoKGEsIGIpID0+IGNvbXBhcmVGbihhW2F0dHJpYnV0ZV0sIGJbYXR0cmlidXRlXSkpO1xufVxuY29uc3QgSU5URUdFUl9SRUdFWFAgPSAvXlstXT9cXGQrJC87XG5leHBvcnQgZnVuY3Rpb24gaXNJbnQodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNOb3ROaWwodmFsdWUpICYmIElOVEVHRVJfUkVHRVhQLnRlc3QodmFsdWUpO1xufVxuY29uc3QgTlVNQkVSX1JFR0VYUCA9IC9eWy1dP1xcZCsoXFwuXFxkKyk/JC87XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNOb3ROaWwodmFsdWUpICYmIE5VTUJFUl9SRUdFWFAudGVzdCh2YWx1ZSk7XG59XG5cbmNvbnN0IE5VTUJFUl9SQU5HRV9SRUdFWFAgPSAvXihcXGQrLVxcZCspfChbPjw9XSpcXGQrKSQvO1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyUmFuZ2UodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNOb3ROaWwodmFsdWUpICYmIE5VTUJFUl9SQU5HRV9SRUdFWFAudGVzdCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wZXJ0eUJ5UGF0aChvYmo6IGFueSwgcGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBhbnkge1xuICBpZiAoaXNOaWwob2JqKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgaWYgKGlzTmlsT3JCbGFuayhwYXRoKSkgcmV0dXJuIG9iajtcbiAgY29uc3QgaSA9IHBhdGguaW5kZXhPZignLicpO1xuICAvLyBTaW1wbGUgcHJvcGVydHkgcGF0aFxuICBpZiAoaSA9PT0gLTEpIHtcbiAgICBjb25zdCByZXMgPSBvYmpbcGF0aF07XG4gICAgcmV0dXJuIChpc05vdE5pbChyZXMpIHx8IGlzTmlsKGRlZmF1bHRWYWx1ZSkpID8gcmVzIDogZGVmYXVsdFZhbHVlO1xuICB9XG4gIC8vIENvbXBsZXggcHJvcGVydHkgcGF0aFxuICBjb25zdCBrZXkgPSBwYXRoLnN1YnN0cmluZygwLCBpKTtcbiAgaWYgKGlzTmlsKG9ialtrZXldKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgaWYgKG9ialtrZXldICYmIHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZ2V0UHJvcGVydHlCeVBhdGgob2JqW2tleV0sIHBhdGguc3Vic3RyaW5nKGkgKyAxKSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByb3BlcnR5IHBhdGg6ICcke2tleX0nIGlzIG5vdCBhbiB2YWxpZCBvYmplY3QuYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wZXJ0eTxUID0gYW55LCBLIGV4dGVuZHMga2V5b2YgVCA9IGFueT4ob2JqOiBULCBrZXk6IEspOiBUW0tdIHtcbiAgaWYgKGlzTmlsKG9iaikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBvYmpba2V5XTsgLy8gSW5mZXJyZWQgdHlwZSBpcyBUW0tdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wZXJ0eUJ5UGF0aEFzU3RyaW5nKG9iajogYW55LCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXMgPSBnZXRQcm9wZXJ0eUJ5UGF0aChvYmosIHBhdGgpO1xuICByZXR1cm4gcmVzICYmICh0eXBlb2YgcmVzID09PSAnc3RyaW5nJyA/IHJlcyA6ICgnJyArIHJlcykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAobXMgPD0gMCkgcmV0dXJuO1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZCh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbCk6IG51bWJlciB7XG4gIGlmIChpc05vdE5pbE9yTmFOKHZhbHVlKSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCh2YWx1ZSArIE51bWJlci5FUFNJTE9OKSAqIDEwMCkgLyAxMDA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzT3JOaWwodmFsdWUxOiBhbnksIHZhbHVlMjogYW55KSB7XG4gIHJldHVybiAodmFsdWUxID09PSB2YWx1ZTIpIHx8IChpc05pbCh2YWx1ZTEpICYmIGlzTmlsKHZhbHVlMikpO1xufVxuXG4vKipcbiAqIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5XG4gKlxuICogQHJldHVybiB0aGUgcmVtb3ZlZCBlbGVtZW50c1xuICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSBvbiB3aGljaCBlbGVtZW50cyB3aWxsIGJlIHJlbW92ZWRcbiAqIEBwYXJhbSBwcmVkaWNhdGUgdGhlIHNlbGVjdGlvbiBwcmVkaWNhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFsbDxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6IChwbWZtOiBUKSA9PiBib29sZWFuKTogVFtdIHtcbiAgbGV0IG5iUmVtb3ZlID0gMDtcbiAgcmV0dXJuIGFycmF5LnNsaWNlKCkubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgbmJSZW1vdmUrKzsgLy8gZ2xpdGNoIGNvdW50ZXIgdG8gYXZvaWQgaW5kZXggZ2FwXG4gICAgICByZXR1cm4gYXJyYXkuc3BsaWNlKGluZGV4IC0gbmJSZW1vdmUgKyAxLCAxKVswXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pLmZpbHRlcihpc05vdE5pbCk7XG59XG5cbi8qKlxuICogcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gYW4gYXJyYXlcbiAqXG4gKiBAcmV0dXJuIHRoZSByZW1vdmVkIGVsZW1lbnRcbiAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgb24gd2hpY2ggdGhlIGVsZW1lbnQgd2lsbCBiZSByZW1vdmVkXG4gKiBAcGFyYW0gcHJlZGljYXRlIHRoZSBzZWxlY3Rpb24gcHJlZGljYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmU8VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlOiAocG1mbTogVCkgPT4gYm9vbGVhbik6IFQge1xuICByZXR1cm4gYXJyYXkuc2xpY2UoKS5maW5kKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlLnN1YnN0cigwLCAxKS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc3Vic3RyKDEpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlLnN1YnN0cigwLCAxKS50b0xvd2VyQ2FzZSgpICsgdmFsdWUuc3Vic3RyKDEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRCeVByb3BlcnR5PFQsIE0gZXh0ZW5kcyBLZXlWYWx1ZVR5cGU8VD4gPSBLZXlWYWx1ZVR5cGU8VD4+KGFycmF5OiBUW10gfCByZWFkb25seSBUW10sIHByb3BlcnR5TmFtZTogc3RyaW5nKTogTSB7XG4gIHJldHVybiAoYXJyYXkgfHwgW10pLnJlZHVjZSgocmVzLCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGtleSA9IHZhbHVlPy5bcHJvcGVydHlOYW1lXTtcbiAgICBpZiAoaXNOb3ROaWwoa2V5KSkge1xuICAgICAgcmVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSwgPE0+e30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRCeUlkPFQsIE0gZXh0ZW5kcyBLZXlWYWx1ZVR5cGU8VD4gPSBLZXlWYWx1ZVR5cGU8VD4+KGFycmF5OiBUW10gfCByZWFkb25seSBUW10pOiBNIHtcbiAgcmV0dXJuIChhcnJheSB8fCBbXSkucmVkdWNlKChyZXMsIHZhbHVlKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gdmFsdWU/LlsnaWQnXTtcbiAgICBpZiAoaXNOb3ROaWwoa2V5KSkge1xuICAgICAgcmVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSwgPE0+e30pO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdHdvIG9iamVjdHMgb3IgdHdvIHZhbHVlcyBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBUd28gb2JqZWN0cyBvciB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOlxuICpcbiAqICogQm90aCBvYmplY3RzIG9yIHZhbHVlcyBwYXNzIGA9PT1gIGNvbXBhcmlzb24uXG4gKiAqIEJvdGggb2JqZWN0cyBvciB2YWx1ZXMgYXJlIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGFsbCBvZiB0aGVpciBwcm9wZXJ0aWVzIGFyZSBlcXVhbCBieVxuICogICBjb21wYXJpbmcgdGhlbSB3aXRoIGBlcXVhbHNgLlxuICpcbiAqIEBwYXJhbSBvMSBPYmplY3Qgb3IgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSBvMiBPYmplY3Qgb3IgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHRydWUgaWYgYXJndW1lbnRzIGFyZSBlcXVhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhvMTogYW55LCBvMjogYW55KTogYm9vbGVhbiB7XG4gIGlmIChvMSA9PT0gbzIpIHJldHVybiB0cnVlO1xuICBpZiAobzEgPT09IG51bGwgfHwgbzIgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKG8xICE9PSBvMSAmJiBvMiAhPT0gbzIpIHJldHVybiB0cnVlOyAvLyBOYU4gPT09IE5hTlxuICBsZXQgdDEgPSB0eXBlb2YgbzEsIHQyID0gdHlwZW9mIG8yLCBsZW5ndGg6IG51bWJlciwga2V5OiBhbnksIGtleVNldDogYW55O1xuICBpZiAodDEgPT0gdDIgJiYgdDEgPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvMSkpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShvMikpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICgobGVuZ3RoID0gbzEubGVuZ3RoKSA9PSBvMi5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChrZXkgPSAwOyBrZXkgPCBsZW5ndGg7IGtleSsrKSB7XG4gICAgICAgICAgaWYgKCFlcXVhbHMobzFba2V5XSwgbzJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobzIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGtleVNldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBmb3IgKGtleSBpbiBvMSkge1xuICAgICAgICBpZiAoIWVxdWFscyhvMVtrZXldLCBvMltrZXldKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBrZXlTZXRba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGtleSBpbiBvMikge1xuICAgICAgICBpZiAoIShrZXkgaW4ga2V5U2V0KSAmJiB0eXBlb2YgbzJba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBCZWFucyB7XG4gIC8qKlxuICAgKiBDb3B5IGEgc291cmNlIG9iamVjdCwgYnkgaW5jbHVkaW5nIG9ubHkgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gZGF0YVR5cGUuXG4gICAqIElNUE9SVEFOVDogZXh0cmEgcHJvcGVydGllcyB0aGF0IGFyZSBOT1QgaW4gdGhlIHRhcmdldENsYXNzIGFyZSBOT1QgY29waWVkLlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIGNvcHlcbiAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBjbGFzcyB0byB1c2UgYXMgdGFyZ2V0IGNsYXNzXG4gICAqIEBwYXJhbSBrZXlzIFRoZSBrZXlzIHRvIGNvcHkuIElmIGVtcHR5LCB3aWxsIGNvcHkgb25seSBOT1Qgb3B0aW9uYWwgcHJvcGVydGllcyBmcm9tIHRoZSBkYXRhVHlwZVxuICAgKi9cbiAgc3RhdGljIGNvcHk8VD4oc291cmNlOiBULCBkYXRhVHlwZTogbmV3ICgpID0+IFQsIGtleXM/OiBLZXlzRW51bTxUPik6IFQge1xuICAgIGlmIChpc05pbChzb3VyY2UpKSByZXR1cm4gc291cmNlO1xuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBkYXRhVHlwZSgpO1xuICAgIE9iamVjdC5rZXlzKGtleXMgfHwgdGFyZ2V0KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICAvKipcbiAgICogU2F5cyBpZiBhbiBvYmplY3QgYWxsIGFsbCBwcm9wZXJ0aWVzIHRvIG5pbFxuICAgKi9cbiAgc3RhdGljIGlzRW1wdHk8VD4oZGF0YTogVCwga2V5cz86IEtleXNFbnVtPFQ+fHN0cmluZ1tdLCBvcHRzPzoge1xuICAgIGJsYW5rU3RyaW5nTGlrZUVtcHR5PzogYm9vbGVhbjtcbiAgfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05pbChkYXRhKSB8fCAoQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBPYmplY3Qua2V5cyhrZXlzIHx8IGRhdGEpKVxuICAgICAgLy8gRmluZCBpbmRleCBvZiB0aGUgZmlyc3QgTk9UIG5pbCB2YWx1ZVxuICAgICAgLmZpbmRJbmRleChrZXkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFba2V5XTtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiAhQmVhbnMuaXNFbXB0eSh2YWx1ZSwgbnVsbCwgb3B0cyk7IC8vIExvb3BcbiAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy5ibGFua1N0cmluZ0xpa2VFbXB0eSA9PT0gdHJ1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gaXNOb3ROaWxPckJsYW5rKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGlzTm90TmlsKHZhbHVlKTtcbiAgICAgIH0pID09PSAtMTtcbiAgfVxuXG59XG4iXX0=
@@ -254,46 +254,54 @@ function suggestFromArray(items, value, opts) {
254
254
  return { data: [], total: 0 };
255
255
  }
256
256
  // Filter items
257
- let target = items;
257
+ let filteredItems = items;
258
258
  if (isNotNilOrBlank(value)) {
259
259
  // If wildcard, search using regexp
260
260
  if (value.indexOf('*') !== -1) {
261
261
  value = value.replace('*', '.*');
262
- target = target.filter(v => keys.findIndex(key => matchUpperCase(getPropertyByPathAsString(v, key), value)) !== -1);
262
+ filteredItems = filteredItems.filter(v => keys.findIndex(key => matchUpperCase(getPropertyByPathAsString(v, key), value)) !== -1);
263
263
  }
264
264
  // Else (no wildcard), search using startsWith
265
265
  else {
266
- target = target.filter(v => keys.findIndex(key => startsWithUpperCase(getPropertyByPathAsString(v, key), value)) !== -1);
266
+ filteredItems = filteredItems.filter(v => keys.findIndex(key => startsWithUpperCase(getPropertyByPathAsString(v, key), value)) !== -1);
267
267
  }
268
268
  }
269
269
  // Exclude ids
270
270
  if (isNotEmptyArray(opts === null || opts === void 0 ? void 0 : opts.excludedIds)) {
271
- target = target.filter(v => !opts.excludedIds.includes(+v['id']));
272
- }
273
- // Sort (copy if need, before sorting)
274
- if (target === items)
275
- target = target.slice();
276
- target.sort(propertiesPathComparator(keys));
277
- const total = items.length || 0;
278
- // Truncate if need
271
+ filteredItems = filteredItems.filter(v => !opts.excludedIds.includes(+v['id']));
272
+ }
273
+ // Sort
274
+ if (!opts || opts.skipSort !== true) {
275
+ // Make to copy input items, before sorting (if not yet already done)
276
+ if (filteredItems === items)
277
+ filteredItems = filteredItems.slice();
278
+ // Sort by keys
279
+ filteredItems.sort(propertiesPathComparator(keys));
280
+ }
281
+ const total = filteredItems.length || 0;
282
+ // Pagination (truncate if need)
283
+ let pageData = filteredItems;
279
284
  if (opts) {
280
- if (isNil(opts.offset) && opts.offset > 0) {
281
- target = target.slice(opts.offset);
285
+ if ((opts.offset || 0) > 0) {
286
+ pageData = pageData.slice(opts.offset);
282
287
  }
283
- if (isNotNil(opts.size) && target.length > opts.size) {
284
- target = target.slice(0, opts.size);
288
+ if (isNotNil(opts.size) && pageData.length > opts.size) {
289
+ pageData = pageData.slice(0, opts.size);
285
290
  }
286
291
  }
287
- const res = {
288
- data: target,
292
+ const result = {
293
+ data: pageData,
289
294
  total
290
295
  };
291
296
  // Add fetch more capability, if total was fetched
292
- const nextOffset = (opts && opts.offset || 0) + items.length;
297
+ const nextOffset = (opts && opts.offset || 0) + pageData.length;
293
298
  if (nextOffset < total) {
294
- res.fetchMore = (_) => __awaiter(this, void 0, void 0, function* () { return suggestFromArray(items, value, Object.assign({ offset: nextOffset }, opts)); });
299
+ result.fetchMore = (_) => __awaiter(this, void 0, void 0, function* () {
300
+ return suggestFromArray(filteredItems, undefined /*OPTIMISATION: already applied*/, Object.assign(Object.assign({}, opts), { offset: nextOffset, skipSort: true, excludedIds: undefined // OPTIMISATION: already filtered
301
+ }));
302
+ });
295
303
  }
296
- return res;
304
+ return result;
297
305
  }
298
306
  function suggestFromStringArray(values, value, options) {
299
307
  value = (typeof value === 'string' && value !== '*') && value.toUpperCase() || undefined;
@@ -21492,6 +21500,7 @@ class AppTable {
21492
21500
  * @param opts Use interactive=false to avoid user interaction (e.g. user confirmation)
21493
21501
  */
21494
21502
  deleteRows(event, rows, opts) {
21503
+ var _a;
21495
21504
  return __awaiter(this, void 0, void 0, function* () {
21496
21505
  if (this.readOnly) {
21497
21506
  throw { code: ErrorCodes$2.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
@@ -21503,6 +21512,12 @@ class AppTable {
21503
21512
  return 0;
21504
21513
  if (this.loading || isEmptyArray(rows))
21505
21514
  return 0;
21515
+ // Make sure to keep newly created row
21516
+ if (((_a = this.editedRow) === null || _a === void 0 ? void 0 : _a.id) === -1 && this.editedRow.editing && !rows.includes(this.editedRow)) {
21517
+ const confirmed = this.confirmEditCreate();
21518
+ if (!confirmed)
21519
+ return 0; // Cannot delete (e.g. edited row is invalid)
21520
+ }
21506
21521
  // Check if can delete
21507
21522
  const canDelete = yield this.canDeleteRows(rows, opts);
21508
21523
  if (!canDelete)
@@ -21528,9 +21543,10 @@ class AppTable {
21528
21543
  try {
21529
21544
  const deleteCount = rowsToDelete.length;
21530
21545
  yield this._dataSource.deleteAll(rowsToDelete);
21531
- // Not need to update manually, because watchALl().subscribe() will update this count
21532
- //this.totalRowCount -= deleteCount;
21533
- //this.visibleRowCount -= deleteCount;
21546
+ // Update manually, even if watchALl().subscribe() will update this count,
21547
+ // because of memory data service (see issue #
21548
+ this.totalRowCount -= deleteCount;
21549
+ this.visibleRowCount -= deleteCount;
21534
21550
  this.selection.clear();
21535
21551
  this.editedRow = undefined;
21536
21552
  this.markAsDirty({ emitEvent: false /*markForCheck() is called just after*/ });