@orbit/record-cache
Version:
Orbit base classes used to access and maintain a set of records.
165 lines • 24.4 kB
JavaScript
import { cloneRecordIdentity, equalRecordIdentities, mergeRecords, RecordNotFoundException, recordsInclude } from '@orbit/records';
import { clone, deepGet, deepSet } from '@orbit/utils';
export const SyncTransformOperators = {
addRecord(cache, operation,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
options) {
const op = operation;
const { record } = op;
cache.setRecordSync(record);
if (cache.keyMap) {
cache.keyMap.pushRecord(record);
}
return record;
},
updateRecord(cache, operation, options) {
const op = operation;
const { record } = op;
const currentRecord = cache.getRecordSync(record);
if (currentRecord === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
const mergedRecord = mergeRecords(currentRecord || null, record);
cache.setRecordSync(mergedRecord);
if (cache.keyMap) {
cache.keyMap.pushRecord(mergedRecord);
}
return mergedRecord;
},
removeRecord(cache, operation, options) {
const op = operation;
const record = cache.removeRecordSync(op.record);
if (record === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(op.record.type, op.record.id);
}
}
return record;
},
replaceKey(cache, operation, options) {
const op = operation;
const currentRecord = cache.getRecordSync(op.record);
let record;
if (currentRecord) {
record = clone(currentRecord);
}
else {
record = cloneRecordIdentity(op.record);
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
deepSet(record, ['keys', op.key], op.value);
cache.setRecordSync(record);
if (cache.keyMap) {
cache.keyMap.pushRecord(record);
}
return record;
},
replaceAttribute(cache, operation, options) {
const op = operation;
const currentRecord = cache.getRecordSync(op.record);
let record;
if (currentRecord) {
record = clone(currentRecord);
}
else {
record = cloneRecordIdentity(op.record);
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
deepSet(record, ['attributes', op.attribute], op.value);
cache.setRecordSync(record);
return record;
},
addToRelatedRecords(cache, operation, options) {
const op = operation;
const { relationship, relatedRecord } = op;
const currentRecord = cache.getRecordSync(op.record);
let record;
if (currentRecord) {
record = clone(currentRecord);
}
else {
record = cloneRecordIdentity(op.record);
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
const relatedRecords = deepGet(record, ['relationships', relationship, 'data']) || [];
if (!recordsInclude(relatedRecords, relatedRecord)) {
relatedRecords.push(relatedRecord);
deepSet(record, ['relationships', relationship, 'data'], relatedRecords);
cache.setRecordSync(record);
}
return record;
},
removeFromRelatedRecords(cache, operation, options) {
const op = operation;
const currentRecord = cache.getRecordSync(op.record);
const { relationship, relatedRecord } = op;
let record;
if (currentRecord) {
record = clone(currentRecord);
let relatedRecords = deepGet(record, [
'relationships',
relationship,
'data'
]);
if (relatedRecords) {
relatedRecords = relatedRecords.filter((r) => !equalRecordIdentities(r, relatedRecord));
if (deepSet(record, ['relationships', relationship, 'data'], relatedRecords)) {
cache.setRecordSync(record);
}
}
return record;
}
else {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(op.record.type, op.record.id);
}
}
},
replaceRelatedRecords(cache, operation, options) {
const op = operation;
const currentRecord = cache.getRecordSync(op.record);
const { relationship, relatedRecords } = op;
let record;
if (currentRecord) {
record = clone(currentRecord);
}
else {
record = cloneRecordIdentity(op.record);
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
if (deepSet(record, ['relationships', relationship, 'data'], relatedRecords)) {
cache.setRecordSync(record);
}
return record;
},
replaceRelatedRecord(cache, operation, options) {
const op = operation;
const currentRecord = cache.getRecordSync(op.record);
const { relationship, relatedRecord } = op;
let record;
if (currentRecord) {
record = clone(currentRecord);
}
else {
record = cloneRecordIdentity(op.record);
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
if (deepSet(record, ['relationships', relationship, 'data'], relatedRecord)) {
cache.setRecordSync(record);
}
return record;
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy10cmFuc2Zvcm0tb3BlcmF0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29wZXJhdG9ycy9zeW5jLXRyYW5zZm9ybS1vcGVyYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUdMLG1CQUFtQixFQUNuQixxQkFBcUIsRUFFckIsWUFBWSxFQUVaLHVCQUF1QixFQUd2QixjQUFjLEVBUWYsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQVEsTUFBTSxjQUFjLENBQUM7QUFXN0QsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQWdDO0lBQ2pFLFNBQVMsQ0FDUCxLQUF5QixFQUN6QixTQUEwQjtJQUMxQiw2REFBNkQ7SUFDN0QsT0FBd0I7UUFFeEIsTUFBTSxFQUFFLEdBQUcsU0FBK0IsQ0FBQztRQUMzQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUIsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ2hCLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELFlBQVksQ0FDVixLQUF5QixFQUN6QixTQUEwQixFQUMxQixPQUF3QjtRQUV4QixNQUFNLEVBQUUsR0FBRyxTQUFrQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDdEIsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVsRCxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7WUFDL0IsSUFBSSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsdUJBQXVCLEVBQUU7Z0JBQ3BDLE1B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akIsTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMvQjthQUFNO1lBQ0wsTUFBTSxHQUFHLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV4QyxJQUFJLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSx1QkFBdUIsRUFBRTtnQkFDcEMsTUFBTSxJQUFJLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzNEO1NBQ0Y7UUFFRCxJQUNFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUN2RTtZQUNBLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0I7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnQG9yYml0L2RhdGEnO1xuaW1wb3J0IHtcbiAgQWRkUmVjb3JkT3BlcmF0aW9uLFxuICBBZGRUb1JlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uLFxuICBjbG9uZVJlY29yZElkZW50aXR5LFxuICBlcXVhbFJlY29yZElkZW50aXRpZXMsXG4gIEluaXRpYWxpemVkUmVjb3JkLFxuICBtZXJnZVJlY29yZHMsXG4gIFJlY29yZElkZW50aXR5LFxuICBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbixcbiAgUmVjb3JkT3BlcmF0aW9uLFxuICBSZWNvcmRPcGVyYXRpb25SZXN1bHQsXG4gIHJlY29yZHNJbmNsdWRlLFxuICBSZW1vdmVGcm9tUmVsYXRlZFJlY29yZHNPcGVyYXRpb24sXG4gIFJlbW92ZVJlY29yZE9wZXJhdGlvbixcbiAgUmVwbGFjZUF0dHJpYnV0ZU9wZXJhdGlvbixcbiAgUmVwbGFjZUtleU9wZXJhdGlvbixcbiAgUmVwbGFjZVJlbGF0ZWRSZWNvcmRPcGVyYXRpb24sXG4gIFJlcGxhY2VSZWxhdGVkUmVjb3Jkc09wZXJhdGlvbixcbiAgVXBkYXRlUmVjb3JkT3BlcmF0aW9uXG59IGZyb20gJ0BvcmJpdC9yZWNvcmRzJztcbmltcG9ydCB7IGNsb25lLCBkZWVwR2V0LCBkZWVwU2V0LCBEaWN0IH0gZnJvbSAnQG9yYml0L3V0aWxzJztcbmltcG9ydCB7IFN5bmNSZWNvcmRBY2Nlc3NvciB9IGZyb20gJy4uL3JlY29yZC1hY2Nlc3Nvcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3luY1RyYW5zZm9ybU9wZXJhdG9yIHtcbiAgKFxuICAgIGNhY2hlOiBTeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFJlY29yZE9wZXJhdGlvblJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IFN5bmNUcmFuc2Zvcm1PcGVyYXRvcnM6IERpY3Q8U3luY1RyYW5zZm9ybU9wZXJhdG9yPiA9IHtcbiAgYWRkUmVjb3JkKFxuICAgIGNhY2hlOiBTeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBSZWNvcmRPcGVyYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIEFkZFJlY29yZE9wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCB9ID0gb3A7XG4gICAgY2FjaGUuc2V0UmVjb3JkU3luYyhyZWNvcmQpO1xuXG4gICAgaWYgKGNhY2hlLmtleU1hcCkge1xuICAgICAgY2FjaGUua2V5TWFwLnB1c2hSZWNvcmQocmVjb3JkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9LFxuXG4gIHVwZGF0ZVJlY29yZChcbiAgICBjYWNoZTogU3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBSZWNvcmRPcGVyYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFVwZGF0ZVJlY29yZE9wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCB9ID0gb3A7XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IGNhY2hlLmdldFJlY29yZFN5bmMocmVjb3JkKTtcblxuICAgIGlmIChjdXJyZW50UmVjb3JkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWVyZ2VkUmVjb3JkID0gbWVyZ2VSZWNvcmRzKGN1cnJlbnRSZWNvcmQgfHwgbnVsbCwgcmVjb3JkKTtcblxuICAgIGNhY2hlLnNldFJlY29yZFN5bmMobWVyZ2VkUmVjb3JkKTtcblxuICAgIGlmIChjYWNoZS5rZXlNYXApIHtcbiAgICAgIGNhY2hlLmtleU1hcC5wdXNoUmVjb3JkKG1lcmdlZFJlY29yZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZFJlY29yZDtcbiAgfSxcblxuICByZW1vdmVSZWNvcmQoXG4gICAgY2FjaGU6IFN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUmVjb3JkT3BlcmF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBSZW1vdmVSZWNvcmRPcGVyYXRpb247XG4gICAgY29uc3QgcmVjb3JkID0gY2FjaGUucmVtb3ZlUmVjb3JkU3luYyhvcC5yZWNvcmQpO1xuXG4gICAgaWYgKHJlY29yZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAob3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKG9wLnJlY29yZC50eXBlLCBvcC5yZWNvcmQuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH0sXG5cbiAgcmVwbGFjZUtleShcbiAgICBjYWNoZTogU3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBSZWNvcmRPcGVyYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlcGxhY2VLZXlPcGVyYXRpb247XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IGNhY2hlLmdldFJlY29yZFN5bmMob3AucmVjb3JkKTtcbiAgICBsZXQgcmVjb3JkOiBJbml0aWFsaXplZFJlY29yZDtcblxuICAgIGlmIChjdXJyZW50UmVjb3JkKSB7XG4gICAgICByZWNvcmQgPSBjbG9uZShjdXJyZW50UmVjb3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjb3JkID0gY2xvbmVSZWNvcmRJZGVudGl0eShvcC5yZWNvcmQpO1xuXG4gICAgICBpZiAob3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKHJlY29yZC50eXBlLCByZWNvcmQuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRlZXBTZXQocmVjb3JkLCBbJ2tleXMnLCBvcC5rZXldLCBvcC52YWx1ZSk7XG4gICAgY2FjaGUuc2V0UmVjb3JkU3luYyhyZWNvcmQpO1xuXG4gICAgaWYgKGNhY2hlLmtleU1hcCkge1xuICAgICAgY2FjaGUua2V5TWFwLnB1c2hSZWNvcmQocmVjb3JkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9LFxuXG4gIHJlcGxhY2VBdHRyaWJ1dGUoXG4gICAgY2FjaGU6IFN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUmVjb3JkT3BlcmF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBSZXBsYWNlQXR0cmlidXRlT3BlcmF0aW9uO1xuICAgIGNvbnN0IGN1cnJlbnRSZWNvcmQgPSBjYWNoZS5nZXRSZWNvcmRTeW5jKG9wLnJlY29yZCk7XG4gICAgbGV0IHJlY29yZDogSW5pdGlhbGl6ZWRSZWNvcmQ7XG5cbiAgICBpZiAoY3VycmVudFJlY29yZCkge1xuICAgICAgcmVjb3JkID0gY2xvbmUoY3VycmVudFJlY29yZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY29yZCA9IGNsb25lUmVjb3JkSWRlbnRpdHkob3AucmVjb3JkKTtcblxuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWVwU2V0KHJlY29yZCwgWydhdHRyaWJ1dGVzJywgb3AuYXR0cmlidXRlXSwgb3AudmFsdWUpO1xuICAgIGNhY2hlLnNldFJlY29yZFN5bmMocmVjb3JkKTtcblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH0sXG5cbiAgYWRkVG9SZWxhdGVkUmVjb3JkcyhcbiAgICBjYWNoZTogU3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBSZWNvcmRPcGVyYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIEFkZFRvUmVsYXRlZFJlY29yZHNPcGVyYXRpb247XG4gICAgY29uc3QgeyByZWxhdGlvbnNoaXAsIHJlbGF0ZWRSZWNvcmQgfSA9IG9wO1xuICAgIGNvbnN0IGN1cnJlbnRSZWNvcmQgPSBjYWNoZS5nZXRSZWNvcmRTeW5jKG9wLnJlY29yZCk7XG4gICAgbGV0IHJlY29yZDogSW5pdGlhbGl6ZWRSZWNvcmQ7XG5cbiAgICBpZiAoY3VycmVudFJlY29yZCkge1xuICAgICAgcmVjb3JkID0gY2xvbmUoY3VycmVudFJlY29yZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY29yZCA9IGNsb25lUmVjb3JkSWRlbnRpdHkob3AucmVjb3JkKTtcblxuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGVkUmVjb3JkczogUmVjb3JkSWRlbnRpdHlbXSA9XG4gICAgICBkZWVwR2V0KHJlY29yZCwgWydyZWxhdGlvbnNoaXBzJywgcmVsYXRpb25zaGlwLCAnZGF0YSddKSB8fCBbXTtcblxuICAgIGlmICghcmVjb3Jkc0luY2x1ZGUocmVsYXRlZFJlY29yZHMsIHJlbGF0ZWRSZWNvcmQpKSB7XG4gICAgICByZWxhdGVkUmVjb3Jkcy5wdXNoKHJlbGF0ZWRSZWNvcmQpO1xuXG4gICAgICBkZWVwU2V0KHJlY29yZCwgWydyZWxhdGlvbnNoaXBzJywgcmVsYXRpb25zaGlwLCAnZGF0YSddLCByZWxhdGVkUmVjb3Jkcyk7XG4gICAgICBjYWNoZS5zZXRSZWNvcmRTeW5jKHJlY29yZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfSxcblxuICByZW1vdmVGcm9tUmVsYXRlZFJlY29yZHMoXG4gICAgY2FjaGU6IFN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUmVjb3JkT3BlcmF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBSZW1vdmVGcm9tUmVsYXRlZFJlY29yZHNPcGVyYXRpb247XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IGNhY2hlLmdldFJlY29yZFN5bmMob3AucmVjb3JkKTtcbiAgICBjb25zdCB7IHJlbGF0aW9uc2hpcCwgcmVsYXRlZFJlY29yZCB9ID0gb3A7XG4gICAgbGV0IHJlY29yZDogSW5pdGlhbGl6ZWRSZWNvcmQ7XG5cbiAgICBpZiAoY3VycmVudFJlY29yZCkge1xuICAgICAgcmVjb3JkID0gY2xvbmUoY3VycmVudFJlY29yZCk7XG4gICAgICBsZXQgcmVsYXRlZFJlY29yZHM6IFJlY29yZElkZW50aXR5W10gPSBkZWVwR2V0KHJlY29yZCwgW1xuICAgICAgICAncmVsYXRpb25zaGlwcycsXG4gICAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgICAgJ2RhdGEnXG4gICAgICBdKTtcbiAgICAgIGlmIChyZWxhdGVkUmVjb3Jkcykge1xuICAgICAgICByZWxhdGVkUmVjb3JkcyA9IHJlbGF0ZWRSZWNvcmRzLmZpbHRlcihcbiAgICAgICAgICAocikgPT4gIWVxdWFsUmVjb3JkSWRlbnRpdGllcyhyLCByZWxhdGVkUmVjb3JkKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBkZWVwU2V0KFxuICAgICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgICAgWydyZWxhdGlvbnNoaXBzJywgcmVsYXRpb25zaGlwLCAnZGF0YSddLFxuICAgICAgICAgICAgcmVsYXRlZFJlY29yZHNcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGNhY2hlLnNldFJlY29yZFN5bmMocmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihvcC5yZWNvcmQudHlwZSwgb3AucmVjb3JkLmlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcmVwbGFjZVJlbGF0ZWRSZWNvcmRzKFxuICAgIGNhY2hlOiBTeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFJlY29yZE9wZXJhdGlvblJlc3VsdCB7XG4gICAgY29uc3Qgb3AgPSBvcGVyYXRpb24gYXMgUmVwbGFjZVJlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uO1xuICAgIGNvbnN0IGN1cnJlbnRSZWNvcmQgPSBjYWNoZS5nZXRSZWNvcmRTeW5jKG9wLnJlY29yZCk7XG4gICAgY29uc3QgeyByZWxhdGlvbnNoaXAsIHJlbGF0ZWRSZWNvcmRzIH0gPSBvcDtcbiAgICBsZXQgcmVjb3JkOiBJbml0aWFsaXplZFJlY29yZDtcblxuICAgIGlmIChjdXJyZW50UmVjb3JkKSB7XG4gICAgICByZWNvcmQgPSBjbG9uZShjdXJyZW50UmVjb3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjb3JkID0gY2xvbmVSZWNvcmRJZGVudGl0eShvcC5yZWNvcmQpO1xuXG4gICAgICBpZiAob3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKHJlY29yZC50eXBlLCByZWNvcmQuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGRlZXBTZXQocmVjb3JkLCBbJ3JlbGF0aW9uc2hpcHMnLCByZWxhdGlvbnNoaXAsICdkYXRhJ10sIHJlbGF0ZWRSZWNvcmRzKVxuICAgICkge1xuICAgICAgY2FjaGUuc2V0UmVjb3JkU3luYyhyZWNvcmQpO1xuICAgIH1cblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH0sXG5cbiAgcmVwbGFjZVJlbGF0ZWRSZWNvcmQoXG4gICAgY2FjaGU6IFN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUmVjb3JkT3BlcmF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBSZXBsYWNlUmVsYXRlZFJlY29yZE9wZXJhdGlvbjtcbiAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gY2FjaGUuZ2V0UmVjb3JkU3luYyhvcC5yZWNvcmQpO1xuICAgIGNvbnN0IHsgcmVsYXRpb25zaGlwLCByZWxhdGVkUmVjb3JkIH0gPSBvcDtcbiAgICBsZXQgcmVjb3JkOiBJbml0aWFsaXplZFJlY29yZDtcblxuICAgIGlmIChjdXJyZW50UmVjb3JkKSB7XG4gICAgICByZWNvcmQgPSBjbG9uZShjdXJyZW50UmVjb3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjb3JkID0gY2xvbmVSZWNvcmRJZGVudGl0eShvcC5yZWNvcmQpO1xuXG4gICAgICBpZiAob3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKHJlY29yZC50eXBlLCByZWNvcmQuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGRlZXBTZXQocmVjb3JkLCBbJ3JlbGF0aW9uc2hpcHMnLCByZWxhdGlvbnNoaXAsICdkYXRhJ10sIHJlbGF0ZWRSZWNvcmQpXG4gICAgKSB7XG4gICAgICBjYWNoZS5zZXRSZWNvcmRTeW5jKHJlY29yZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfVxufTtcbiJdfQ==