@orbit/record-cache
Version:
Orbit base classes used to access and maintain a set of records.
243 lines • 33.7 kB
JavaScript
import { equalRecordIdentities, equalRecordIdentitySets, RecordNotFoundException, recordsInclude } from '@orbit/records';
import { deepGet, deepSet, eq } from '@orbit/utils';
export const AsyncInverseTransformOperators = {
async addRecord(cache, operation,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
options) {
const op = operation;
const { type, id } = op.record;
const current = await cache.getRecordAsync(op.record);
if (current) {
if (eq(current, op.record)) {
return;
}
else {
return {
op: 'updateRecord',
record: current
};
}
}
else {
return {
op: 'removeRecord',
record: { type, id }
};
}
},
async updateRecord(cache, operation, options) {
const op = operation;
const currentRecord = await cache.getRecordAsync(op.record);
const replacement = op.record;
const { type, id } = replacement;
if (currentRecord) {
let result = { type, id };
let changed = false;
['attributes', 'keys'].forEach((grouping) => {
if (replacement[grouping]) {
Object.keys(replacement[grouping]).forEach((field) => {
let value = replacement[grouping][field];
let currentValue = deepGet(currentRecord, [grouping, field]);
if (!eq(value, currentValue)) {
changed = true;
deepSet(result, [grouping, field], currentValue === undefined ? null : currentValue);
}
});
}
});
if (replacement.relationships) {
Object.keys(replacement.relationships).forEach((field) => {
let data = deepGet(replacement, ['relationships', field, 'data']);
if (data !== undefined) {
let currentData = deepGet(currentRecord, [
'relationships',
field,
'data'
]);
let relationshipChanged;
if (Array.isArray(data)) {
if (currentData) {
relationshipChanged = !equalRecordIdentitySets(currentData, data);
}
else {
relationshipChanged = true;
currentData = [];
}
}
else {
if (currentData) {
relationshipChanged = !equalRecordIdentities(currentData, data);
}
else {
relationshipChanged = true;
currentData = null;
}
}
if (relationshipChanged) {
changed = true;
deepSet(result, ['relationships', field, 'data'], currentData);
}
}
});
}
if (changed) {
return {
op: 'updateRecord',
record: result
};
}
}
else {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(type, id);
}
else {
return {
op: 'removeRecord',
record: { type, id }
};
}
}
},
async removeRecord(cache, operation, options) {
const op = operation;
const { record } = op;
const currentRecord = await cache.getRecordAsync(record);
if (currentRecord) {
return {
op: 'addRecord',
record: currentRecord
};
}
else {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
},
async replaceKey(cache, operation, options) {
const op = operation;
const { record, key } = op;
const currentRecord = await cache.getRecordAsync(record);
if (currentRecord === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
const currentValue = currentRecord && deepGet(currentRecord, ['keys', key]);
if (!eq(currentValue, op.value)) {
const { type, id } = op.record;
return {
op: 'replaceKey',
record: { type, id },
key,
value: currentValue
};
}
},
async replaceAttribute(cache, operation, options) {
const op = operation;
const { record, attribute } = op;
const currentRecord = await cache.getRecordAsync(record);
if (currentRecord === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
const currentValue = currentRecord && deepGet(currentRecord, ['attributes', attribute]);
if (!eq(currentValue, op.value)) {
const { type, id } = record;
return {
op: 'replaceAttribute',
record: { type, id },
attribute,
value: currentValue
};
}
},
async addToRelatedRecords(cache, operation, options) {
const op = operation;
const { record, relationship, relatedRecord } = op;
const currentRelatedRecords = await cache.getRelatedRecordsAsync(record, relationship);
if (currentRelatedRecords === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
if ((await cache.getRecordAsync(record)) === undefined) {
throw new RecordNotFoundException(record.type, record.id);
}
}
}
if (currentRelatedRecords === undefined ||
!recordsInclude(currentRelatedRecords, relatedRecord)) {
return {
op: 'removeFromRelatedRecords',
record,
relationship,
relatedRecord
};
}
},
async removeFromRelatedRecords(cache, operation, options) {
const op = operation;
const { record, relationship, relatedRecord } = op;
const currentRelatedRecords = await cache.getRelatedRecordsAsync(record, relationship);
if (currentRelatedRecords === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
if ((await cache.getRecordAsync(record)) === undefined) {
throw new RecordNotFoundException(record.type, record.id);
}
}
}
if (currentRelatedRecords !== undefined &&
recordsInclude(currentRelatedRecords, relatedRecord)) {
return {
op: 'addToRelatedRecords',
record,
relationship,
relatedRecord
};
}
},
async replaceRelatedRecords(cache, operation, options) {
const op = operation;
const { record, relationship, relatedRecords } = op;
const currentRelatedRecords = await cache.getRelatedRecordsAsync(record, relationship);
if (currentRelatedRecords === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
if ((await cache.getRecordAsync(record)) === undefined) {
throw new RecordNotFoundException(record.type, record.id);
}
}
}
if (currentRelatedRecords === undefined ||
!equalRecordIdentitySets(currentRelatedRecords, relatedRecords)) {
return {
op: 'replaceRelatedRecords',
record,
relationship,
relatedRecords: currentRelatedRecords || []
};
}
},
async replaceRelatedRecord(cache, operation, options) {
const op = operation;
const { record, relationship, relatedRecord } = op;
const currentRelatedRecord = await cache.getRelatedRecordAsync(record, relationship);
if (currentRelatedRecord === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
if ((await cache.getRecordAsync(record)) === undefined) {
throw new RecordNotFoundException(record.type, record.id);
}
}
}
if (currentRelatedRecord === undefined ||
!equalRecordIdentities(currentRelatedRecord, relatedRecord)) {
return {
op: 'replaceRelatedRecord',
record,
relationship,
relatedRecord: currentRelatedRecord || null
};
}
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtaW52ZXJzZS10cmFuc2Zvcm0tb3BlcmF0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29wZXJhdG9ycy9hc3luYy1pbnZlcnNlLXRyYW5zZm9ybS1vcGVyYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUdMLHFCQUFxQixFQUNyQix1QkFBdUIsRUFHdkIsdUJBQXVCLEVBRXZCLGNBQWMsRUFRZixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFRLEVBQUUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVcxRCxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBd0M7SUFDakYsS0FBSyxDQUFDLFNBQVMsQ0FDYixLQUEwQixFQUMxQixTQUEwQjtJQUMxQiw2REFBNkQ7SUFDN0QsT0FBd0I7UUFFeEIsTUFBTSxFQUFFLEdBQUcsU0FBK0IsQ0FBQztRQUMzQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0RCxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzFCLE9BQU87YUFDUjtpQkFBTTtnQkFDTCxPQUFPO29CQUNMLEVBQUUsRUFBRSxjQUFjO29CQUNsQixNQUFNLEVBQUUsT0FBTztpQkFDaEIsQ0FBQzthQUNIO1NBQ0Y7YUFBTTtZQUNMLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLGNBQWM7Z0JBQ2xCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7YUFDckIsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQ2hCLEtBQTBCLEVBQzFCLFNB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RUFBRTtvQkFDdEQsTUFBTSxJQUFJLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUMzRDthQUNGO1NBQ0Y7UUFFRCxJQUNFLG9CQUFvQixLQUFLLFNBQVM7WUFDbEMsQ0FBQyxxQkFBcUIsQ0FDcEIsb0JBQXNDLEVBQ3RDLGFBQStCLENBQ2hDLEVBQ0Q7WUFDQSxPQUFPO2dCQUNMLEVBQUUsRUFBRSxzQkFBc0I7Z0JBQzFCLE1BQU07Z0JBQ04sWUFBWTtnQkFDWixhQUFhLEVBQUUsb0JBQW9CLElBQUksSUFBSTthQUM1QyxDQUFDO1NBQ0g7SUFDSCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnQG9yYml0L2RhdGEnO1xuaW1wb3J0IHtcbiAgQWRkUmVjb3JkT3BlcmF0aW9uLFxuICBBZGRUb1JlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uLFxuICBlcXVhbFJlY29yZElkZW50aXRpZXMsXG4gIGVxdWFsUmVjb3JkSWRlbnRpdHlTZXRzLFxuICBJbml0aWFsaXplZFJlY29yZCxcbiAgUmVjb3JkSWRlbnRpdHksXG4gIFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uLFxuICBSZWNvcmRPcGVyYXRpb24sXG4gIHJlY29yZHNJbmNsdWRlLFxuICBSZW1vdmVGcm9tUmVsYXRlZFJlY29yZHNPcGVyYXRpb24sXG4gIFJlbW92ZVJlY29yZE9wZXJhdGlvbixcbiAgUmVwbGFjZUF0dHJpYnV0ZU9wZXJhdGlvbixcbiAgUmVwbGFjZUtleU9wZXJhdGlvbixcbiAgUmVwbGFjZVJlbGF0ZWRSZWNvcmRPcGVyYXRpb24sXG4gIFJlcGxhY2VSZWxhdGVkUmVjb3Jkc09wZXJhdGlvbixcbiAgVXBkYXRlUmVjb3JkT3BlcmF0aW9uXG59IGZyb20gJ0BvcmJpdC9yZWNvcmRzJztcbmltcG9ydCB7IGRlZXBHZXQsIGRlZXBTZXQsIERpY3QsIGVxIH0gZnJvbSAnQG9yYml0L3V0aWxzJztcbmltcG9ydCB7IEFzeW5jUmVjb3JkQWNjZXNzb3IgfSBmcm9tICcuLi9yZWNvcmQtYWNjZXNzb3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jSW52ZXJzZVRyYW5zZm9ybU9wZXJhdG9yIHtcbiAgKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZD47XG59XG5cbmV4cG9ydCBjb25zdCBBc3luY0ludmVyc2VUcmFuc2Zvcm1PcGVyYXRvcnM6IERpY3Q8QXN5bmNJbnZlcnNlVHJhbnNmb3JtT3BlcmF0b3I+ID0ge1xuICBhc3luYyBhZGRSZWNvcmQoXG4gICAgY2FjaGU6IEFzeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIEFkZFJlY29yZE9wZXJhdGlvbjtcbiAgICBjb25zdCB7IHR5cGUsIGlkIH0gPSBvcC5yZWNvcmQ7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKG9wLnJlY29yZCk7XG5cbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgaWYgKGVxKGN1cnJlbnQsIG9wLnJlY29yZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvcDogJ3VwZGF0ZVJlY29yZCcsXG4gICAgICAgICAgcmVjb3JkOiBjdXJyZW50XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9wOiAncmVtb3ZlUmVjb3JkJyxcbiAgICAgICAgcmVjb3JkOiB7IHR5cGUsIGlkIH1cbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHVwZGF0ZVJlY29yZChcbiAgICBjYWNoZTogQXN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUHJvbWlzZTxSZWNvcmRPcGVyYXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBVcGRhdGVSZWNvcmRPcGVyYXRpb247XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKG9wLnJlY29yZCk7XG4gICAgY29uc3QgcmVwbGFjZW1lbnQ6IEluaXRpYWxpemVkUmVjb3JkID0gb3AucmVjb3JkO1xuICAgIGNvbnN0IHsgdHlwZSwgaWQgfSA9IHJlcGxhY2VtZW50O1xuXG4gICAgaWYgKGN1cnJlbnRSZWNvcmQpIHtcbiAgICAgIGxldCByZXN1bHQgPSB7IHR5cGUsIGlkIH07XG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICBbJ2F0dHJpYnV0ZXMnLCAna2V5cyddLmZvckVhY2goKGdyb3VwaW5nKSA9PiB7XG4gICAgICAgIGlmICgocmVwbGFjZW1lbnQgYXMgYW55KVtncm91cGluZ10pIHtcbiAgICAgICAgICBPYmplY3Qua2V5cygocmVwbGFjZW1lbnQgYXMgYW55KVtncm91cGluZ10pLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSAocmVwbGFjZW1lbnQgYXMgYW55KVtncm91cGluZ11bZmllbGRdO1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRWYWx1ZSA9IGRlZXBHZXQoY3VycmVudFJlY29yZCwgW2dyb3VwaW5nLCBmaWVsZF0pO1xuICAgICAgICAgICAgaWYgKCFlcSh2YWx1ZSwgY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZGVlcFNldChcbiAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgW2dyb3VwaW5nLCBmaWVsZF0sXG4gICAgICAgICAgICAgICAgY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VycmVudFZhbHVlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVwbGFjZW1lbnQucmVsYXRpb25zaGlwcykge1xuICAgICAgICBPYmplY3Qua2V5cyhyZXBsYWNlbWVudC5yZWxhdGlvbnNoaXBzKS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIGxldCBkYXRhID0gZGVlcEdldChyZXBsYWNlbWVudCwgWydyZWxhdGlvbnNoaXBzJywgZmllbGQsICdkYXRhJ10pO1xuICAgICAgICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50RGF0YSA9IGRlZXBHZXQoY3VycmVudFJlY29yZCwgW1xuICAgICAgICAgICAgICAncmVsYXRpb25zaGlwcycsXG4gICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAnZGF0YSdcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgbGV0IHJlbGF0aW9uc2hpcENoYW5nZWQ7XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50RGF0YSkge1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcENoYW5nZWQgPSAhZXF1YWxSZWNvcmRJZGVudGl0eVNldHMoXG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0YSxcbiAgICAgICAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhID0gW107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50RGF0YSkge1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcENoYW5nZWQgPSAhZXF1YWxSZWNvcmRJZGVudGl0aWVzKGN1cnJlbnREYXRhLCBkYXRhKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0YSA9IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGRlZXBTZXQocmVzdWx0LCBbJ3JlbGF0aW9uc2hpcHMnLCBmaWVsZCwgJ2RhdGEnXSwgY3VycmVudERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb3A6ICd1cGRhdGVSZWNvcmQnLFxuICAgICAgICAgIHJlY29yZDogcmVzdWx0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24odHlwZSwgaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvcDogJ3JlbW92ZVJlY29yZCcsXG4gICAgICAgICAgcmVjb3JkOiB7IHR5cGUsIGlkIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgYXN5bmMgcmVtb3ZlUmVjb3JkKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlbW92ZVJlY29yZE9wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCB9ID0gb3A7XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKHJlY29yZCk7XG5cbiAgICBpZiAoY3VycmVudFJlY29yZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3A6ICdhZGRSZWNvcmQnLFxuICAgICAgICByZWNvcmQ6IGN1cnJlbnRSZWNvcmRcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHJlcGxhY2VLZXkoXG4gICAgY2FjaGU6IEFzeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8UmVjb3JkT3BlcmF0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgb3AgPSBvcGVyYXRpb24gYXMgUmVwbGFjZUtleU9wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCwga2V5IH0gPSBvcDtcbiAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gYXdhaXQgY2FjaGUuZ2V0UmVjb3JkQXN5bmMocmVjb3JkKTtcblxuICAgIGlmIChjdXJyZW50UmVjb3JkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gY3VycmVudFJlY29yZCAmJiBkZWVwR2V0KGN1cnJlbnRSZWNvcmQsIFsna2V5cycsIGtleV0pO1xuXG4gICAgaWYgKCFlcShjdXJyZW50VmFsdWUsIG9wLnZhbHVlKSkge1xuICAgICAgY29uc3QgeyB0eXBlLCBpZCB9ID0gb3AucmVjb3JkO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcDogJ3JlcGxhY2VLZXknLFxuICAgICAgICByZWNvcmQ6IHsgdHlwZSwgaWQgfSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogY3VycmVudFZhbHVlXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICBhc3luYyByZXBsYWNlQXR0cmlidXRlKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlcGxhY2VBdHRyaWJ1dGVPcGVyYXRpb247XG4gICAgY29uc3QgeyByZWNvcmQsIGF0dHJpYnV0ZSB9ID0gb3A7XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKHJlY29yZCk7XG5cbiAgICBpZiAoY3VycmVudFJlY29yZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAob3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKHJlY29yZC50eXBlLCByZWNvcmQuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9XG4gICAgICBjdXJyZW50UmVjb3JkICYmIGRlZXBHZXQoY3VycmVudFJlY29yZCwgWydhdHRyaWJ1dGVzJywgYXR0cmlidXRlXSk7XG5cbiAgICBpZiAoIWVxKGN1cnJlbnRWYWx1ZSwgb3AudmFsdWUpKSB7XG4gICAgICBjb25zdCB7IHR5cGUsIGlkIH0gPSByZWNvcmQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9wOiAncmVwbGFjZUF0dHJpYnV0ZScsXG4gICAgICAgIHJlY29yZDogeyB0eXBlLCBpZCB9LFxuICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgIHZhbHVlOiBjdXJyZW50VmFsdWVcbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIGFkZFRvUmVsYXRlZFJlY29yZHMoXG4gICAgY2FjaGU6IEFzeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8UmVjb3JkT3BlcmF0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgb3AgPSBvcGVyYXRpb24gYXMgQWRkVG9SZWxhdGVkUmVjb3Jkc09wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCwgcmVsYXRpb25zaGlwLCByZWxhdGVkUmVjb3JkIH0gPSBvcDtcbiAgICBjb25zdCBjdXJyZW50UmVsYXRlZFJlY29yZHMgPSBhd2FpdCBjYWNoZS5nZXRSZWxhdGVkUmVjb3Jkc0FzeW5jKFxuICAgICAgcmVjb3JkLFxuICAgICAgcmVsYXRpb25zaGlwXG4gICAgKTtcblxuICAgIGlmIChjdXJyZW50UmVsYXRlZFJlY29yZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIGlmICgoYXdhaXQgY2FjaGUuZ2V0UmVjb3JkQXN5bmMocmVjb3JkKSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGN1cnJlbnRSZWxhdGVkUmVjb3JkcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAhcmVjb3Jkc0luY2x1ZGUoY3VycmVudFJlbGF0ZWRSZWNvcmRzLCByZWxhdGVkUmVjb3JkKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3A6ICdyZW1vdmVGcm9tUmVsYXRlZFJlY29yZHMnLFxuICAgICAgICByZWNvcmQsXG4gICAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgICAgcmVsYXRlZFJlY29yZFxuICAgICAgfTtcbiAgICB9XG4gIH0sXG5cbiAgYXN5bmMgcmVtb3ZlRnJvbVJlbGF0ZWRSZWNvcmRzKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlbW92ZUZyb21SZWxhdGVkUmVjb3Jkc09wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCwgcmVsYXRpb25zaGlwLCByZWxhdGVkUmVjb3JkIH0gPSBvcDtcbiAgICBjb25zdCBjdXJyZW50UmVsYXRlZFJlY29yZHMgPSBhd2FpdCBjYWNoZS5nZXRSZWxhdGVkUmVjb3Jkc0FzeW5jKFxuICAgICAgcmVjb3JkLFxuICAgICAgcmVsYXRpb25zaGlwXG4gICAgKTtcblxuICAgIGlmIChjdXJyZW50UmVsYXRlZFJlY29yZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIGlmICgoYXdhaXQgY2FjaGUuZ2V0UmVjb3JkQXN5bmMocmVjb3JkKSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGN1cnJlbnRSZWxhdGVkUmVjb3JkcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICByZWNvcmRzSW5jbHVkZShjdXJyZW50UmVsYXRlZFJlY29yZHMsIHJlbGF0ZWRSZWNvcmQpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcDogJ2FkZFRvUmVsYXRlZFJlY29yZHMnLFxuICAgICAgICByZWNvcmQsXG4gICAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgICAgcmVsYXRlZFJlY29yZFxuICAgICAgfTtcbiAgICB9XG4gIH0sXG5cbiAgYXN5bmMgcmVwbGFjZVJlbGF0ZWRSZWNvcmRzKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlcGxhY2VSZWxhdGVkUmVjb3Jkc09wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCwgcmVsYXRpb25zaGlwLCByZWxhdGVkUmVjb3JkcyB9ID0gb3A7XG4gICAgY29uc3QgY3VycmVudFJlbGF0ZWRSZWNvcmRzID0gYXdhaXQgY2FjaGUuZ2V0UmVsYXRlZFJlY29yZHNBc3luYyhcbiAgICAgIHJlY29yZCxcbiAgICAgIHJlbGF0aW9uc2hpcFxuICAgICk7XG5cbiAgICBpZiAoY3VycmVudFJlbGF0ZWRSZWNvcmRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICBpZiAoKGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKHJlY29yZCkpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjdXJyZW50UmVsYXRlZFJlY29yZHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgIWVxdWFsUmVjb3JkSWRlbnRpdHlTZXRzKGN1cnJlbnRSZWxhdGVkUmVjb3JkcywgcmVsYXRlZFJlY29yZHMpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcDogJ3JlcGxhY2VSZWxhdGVkUmVjb3JkcycsXG4gICAgICAgIHJlY29yZCxcbiAgICAgICAgcmVsYXRpb25zaGlwLFxuICAgICAgICByZWxhdGVkUmVjb3JkczogY3VycmVudFJlbGF0ZWRSZWNvcmRzIHx8IFtdXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICBhc3luYyByZXBsYWNlUmVsYXRlZFJlY29yZChcbiAgICBjYWNoZTogQXN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUHJvbWlzZTxSZWNvcmRPcGVyYXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBSZXBsYWNlUmVsYXRlZFJlY29yZE9wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCwgcmVsYXRpb25zaGlwLCByZWxhdGVkUmVjb3JkIH0gPSBvcDtcbiAgICBjb25zdCBjdXJyZW50UmVsYXRlZFJlY29yZCA9IGF3YWl0IGNhY2hlLmdldFJlbGF0ZWRSZWNvcmRBc3luYyhcbiAgICAgIHJlY29yZCxcbiAgICAgIHJlbGF0aW9uc2hpcFxuICAgICk7XG5cbiAgICBpZiAoY3VycmVudFJlbGF0ZWRSZWNvcmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIGlmICgoYXdhaXQgY2FjaGUuZ2V0UmVjb3JkQXN5bmMocmVjb3JkKSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGN1cnJlbnRSZWxhdGVkUmVjb3JkID09PSB1bmRlZmluZWQgfHxcbiAgICAgICFlcXVhbFJlY29yZElkZW50aXRpZXMoXG4gICAgICAgIGN1cnJlbnRSZWxhdGVkUmVjb3JkIGFzIFJlY29yZElkZW50aXR5LFxuICAgICAgICByZWxhdGVkUmVjb3JkIGFzIFJlY29yZElkZW50aXR5XG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcDogJ3JlcGxhY2VSZWxhdGVkUmVjb3JkJyxcbiAgICAgICAgcmVjb3JkLFxuICAgICAgICByZWxhdGlvbnNoaXAsXG4gICAgICAgIHJlbGF0ZWRSZWNvcmQ6IGN1cnJlbnRSZWxhdGVkUmVjb3JkIHx8IG51bGxcbiAgICAgIH07XG4gICAgfVxuICB9XG59O1xuIl19