UNPKG

@orbit/jsonapi

Version:

JSON:API support for Orbit.

177 lines 30.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.QueryRequestProcessors = exports.getQueryRequests = void 0; const utils_1 = require("@orbit/utils"); const records_1 = require("@orbit/records"); const data_1 = require("@orbit/data"); const jsonapi_serializers_1 = require("../serializers/jsonapi-serializers"); function getQueryRequests(requestProcessor, query) { const requests = []; for (let expression of (0, utils_1.toArray)(query.expressions)) { const request = ExpressionToRequestMap[expression.op](expression, requestProcessor); const options = requestProcessor.mergeRequestOptions([ request.options, query.options, expression.options ]); if (options) request.options = options; requests.push(request); } return requests; } exports.getQueryRequests = getQueryRequests; const ExpressionToRequestMap = { findRecord(expression) { const exp = expression; return { op: 'findRecord', record: (0, records_1.cloneRecordIdentity)(exp.record) }; }, findRecords(expression) { const exp = expression; const { filter, sort, page } = exp; return { op: 'findRecords', type: exp.type, options: { filter, sort, page } }; }, findRelatedRecord(expression) { const exp = expression; return { op: 'findRelatedRecord', record: (0, records_1.cloneRecordIdentity)(exp.record), relationship: exp.relationship }; }, findRelatedRecords(expression) { const exp = expression; const { filter, sort, page } = exp; return { op: 'findRelatedRecords', record: (0, records_1.cloneRecordIdentity)(exp.record), relationship: exp.relationship, options: { filter, sort, page } }; } }; exports.QueryRequestProcessors = { async findRecord(requestProcessor, request) { var _a, _b, _c; const { record } = request; const settings = requestProcessor.buildFetchSettings(request); const url = (_b = (_a = request.options) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : requestProcessor.urlBuilder.resourceURL(record.type, record.id); const details = await requestProcessor.fetch(url, settings); const { document } = details; requestProcessor.preprocessResponseDocument(document, request); if (document) { const serializer = requestProcessor.serializerFor(jsonapi_serializers_1.JSONAPISerializers.ResourceDocument); const recordDoc = serializer.deserialize(document); const operations = requestProcessor.operationsFromDeserializedDocument(recordDoc); const transforms = [(0, data_1.buildTransform)(operations)]; return { transforms, data: recordDoc.data, details }; } else { if ((_c = request.options) === null || _c === void 0 ? void 0 : _c.raiseNotFoundExceptions) { throw new records_1.RecordNotFoundException(record.type, record.id); } return { transforms: [] }; } }, async findRecords(requestProcessor, request) { var _a, _b; const { type } = request; const settings = requestProcessor.buildFetchSettings(request); const url = (_b = (_a = request.options) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : requestProcessor.urlBuilder.resourceURL(type); const details = await requestProcessor.fetch(url, settings); const { document } = details; requestProcessor.preprocessResponseDocument(document, request); if (document) { const serializer = requestProcessor.serializerFor(jsonapi_serializers_1.JSONAPISerializers.ResourceDocument); const recordDoc = serializer.deserialize(document); const operations = requestProcessor.operationsFromDeserializedDocument(recordDoc); const transforms = [(0, data_1.buildTransform)(operations)]; return { transforms, data: recordDoc.data, details }; } else { return { transforms: [] }; } }, async findRelatedRecord(requestProcessor, request) { var _a, _b, _c; const { record, relationship } = request; const settings = requestProcessor.buildFetchSettings(request); const url = (_b = (_a = request.options) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : requestProcessor.urlBuilder.relatedResourceURL(record.type, record.id, relationship); const details = await requestProcessor.fetch(url, settings); const { document } = details; requestProcessor.preprocessResponseDocument(document, request); if (document) { const serializer = requestProcessor.serializerFor(jsonapi_serializers_1.JSONAPISerializers.ResourceDocument); const recordDoc = serializer.deserialize(document); const relatedRecord = recordDoc.data; const operations = requestProcessor.operationsFromDeserializedDocument(recordDoc); operations.push({ op: 'replaceRelatedRecord', record, relationship, relatedRecord }); const transforms = [(0, data_1.buildTransform)(operations)]; return { transforms, data: relatedRecord, details }; } else { if ((_c = request.options) === null || _c === void 0 ? void 0 : _c.raiseNotFoundExceptions) { throw new records_1.RecordNotFoundException(record.type, record.id); } return { transforms: [] }; } }, async findRelatedRecords(requestProcessor, request) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const { record, relationship } = request; const settings = requestProcessor.buildFetchSettings(request); const url = (_b = (_a = request.options) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : requestProcessor.urlBuilder.relatedResourceURL(record.type, record.id, relationship); const details = await requestProcessor.fetch(url, settings); const { document } = details; requestProcessor.preprocessResponseDocument(document, request); if (document) { const serializer = requestProcessor.serializerFor(jsonapi_serializers_1.JSONAPISerializers.ResourceDocument); const recordDoc = serializer.deserialize(document); const relatedRecords = recordDoc.data; const operations = requestProcessor.operationsFromDeserializedDocument(recordDoc); const partialSet = (_d = (_c = request.options) === null || _c === void 0 ? void 0 : _c.partialSet) !== null && _d !== void 0 ? _d : !!(((_e = request.options) === null || _e === void 0 ? void 0 : _e.filter) || ((_f = request.options) === null || _f === void 0 ? void 0 : _f.page) || ((_g = recordDoc.links) === null || _g === void 0 ? void 0 : _g.next) || ((_h = recordDoc.links) === null || _h === void 0 ? void 0 : _h.prev)); if (partialSet) { for (let relatedRecord of relatedRecords) { operations.push({ op: 'addToRelatedRecords', record, relationship, relatedRecord }); } } else { operations.push({ op: 'replaceRelatedRecords', record, relationship, relatedRecords }); } const transforms = [(0, data_1.buildTransform)(operations)]; return { transforms, data: relatedRecords, details }; } else { if ((_j = request.options) === null || _j === void 0 ? void 0 : _j.raiseNotFoundExceptions) { throw new records_1.RecordNotFoundException(record.type, record.id); } return { transforms: [] }; } } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcmVxdWVzdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3F1ZXJ5LXJlcXVlc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHdDQUE2QztBQUM3Qyw0Q0Fld0I7QUFDeEIsc0NBQTJEO0FBRzNELDRFQUF3RTtBQW1EeEUsU0FBZ0IsZ0JBQWdCLENBQzlCLGdCQUF5QyxFQUN6QyxLQUFrQjtJQUVsQixNQUFNLFFBQVEsR0FBeUIsRUFBRSxDQUFDO0lBRTFDLEtBQUssSUFBSSxVQUFVLElBQUksSUFBQSxlQUFPLEVBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1FBQ2pELE1BQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FDbkQsVUFBbUMsRUFDbkMsZ0JBQWdCLENBQ2pCLENBQUM7UUFFRixNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQztZQUNuRCxPQUFPLENBQUMsT0FBTztZQUNmLEtBQUssQ0FBQyxPQUFPO1lBQ2IsVUFBVSxDQUFDLE9BQU87U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxPQUFPO1lBQUUsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFdkMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUN4QjtJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUF0QkQsNENBc0JDO0FBU0QsTUFBTSxzQkFBc0IsR0FBdUM7SUFDakUsVUFBVSxDQUFDLFVBQWlDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLFVBQXdCLENBQUM7UUFDckMsT0FBTztZQUNMLEVBQUUsRUFBRSxZQUFZO1lBQ2hCLE1BQU0sRUFBRSxJQUFBLDZCQUFtQixFQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7U0FDeEMsQ0FBQztJQUNKLENBQUM7SUFDRCxXQUFXLENBQUMsVUFBaUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsVUFBeUIsQ0FBQztRQUN0QyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDbkMsT0FBTztZQUNMLEVBQUUsRUFBRSxhQUFhO1lBQ2pCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBYztZQUN4QixPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtTQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUNELGlCQUFpQixDQUNmLFVBQWlDO1FBRWpDLE1BQU0sR0FBRyxHQUFHLFVBQStCLENBQUM7UUFDNUMsT0FBTztZQUNMLEVBQUUsRUFBRSxtQkFBbUI7WUFDdkIsTUFBTSxFQUFFLElBQUEsNkJBQW1CLEVBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUN2QyxZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVk7U0FDL0IsQ0FBQztJQUNKLENBQUM7SUFDRCxrQkFBa0IsQ0FDaEIsVUFBaUM7UUFFakMsTUFBTSxHQUFHLEdBQUcsVUFBZ0MsQ0FBQztRQUM3QyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDbkMsT0FBTztZQUNMLEVBQUUsRUFBRSxvQkFBb0I7WUFDeEIsTUFBTSxFQUFFLElBQUEsNkJBQW1CLEVBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUN2QyxZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVk7WUFDOUIsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7U0FDaEMsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDO0FBRVcsUUFBQSxzQkFBc0IsR0FBZ0M7SUFDakUsS0FBSyxDQUFDLFVBQVUsQ0FDZCxnQkFBeUMsRUFDekMsT0FBMkI7O1FBRTNCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUE0QixDQUFDO1FBQ2hELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELE1BQU0sR0FBRyxHQUNQLE1BQUEsTUFBQSxPQUFPLENBQUMsT0FBTywwQ0FBRSxHQUFHLG1DQUNwQixnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWxFLE1BQU0sT0FBTyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RCxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQzdCLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUvRCxJQUFJLFFBQVEsRUFBRTtZQUNaLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FDL0Msd0NBQWtCLENBQUMsZ0JBQWdCLENBQ1AsQ0FBQztZQUMvQixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBbUIsQ0FBQztZQUNyRSxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxrQ0FBa0MsQ0FDcEUsU0FBUyxDQUNWLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRyxDQUFDLElBQUEscUJBQWMsRUFBa0IsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUVqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO1NBQ3REO2FBQU07WUFDTCxJQUFJLE1BQUEsT0FBTyxDQUFDLE9BQU8sMENBQUUsdUJBQXVCLEVBQUU7Z0JBQzVDLE1BQU0sSUFBSSxpQ0FBdUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMzRDtZQUNELE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FDZixnQkFBeUMsRUFDekMsT0FBMkI7O1FBRTNCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUE2QixDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELE1BQU0sR0FBRyxHQUNQLE1BQUEsTUFBQSxPQUFPLENBQUMsT0FBTywwQ0FBRSxHQUFHLG1DQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVELE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0IsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRS9ELElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUMvQyx3Q0FBa0IsQ0FBQyxnQkFBZ0IsQ0FDUCxDQUFDO1lBQy9CLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFtQixDQUFDO1lBQ3JFLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLGtDQUFrQyxDQUNwRSxTQUFTLENBQ1YsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBQSxxQkFBYyxFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFFaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztTQUN0RDthQUFNO1lBQ0wsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQztTQUMzQjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQ3JCLGdCQUF5QyxFQUN6QyxPQUEyQjs7UUFFM0IsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFtQyxDQUFDO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELE1BQU0sR0FBRyxHQUNQLE1BQUEsTUFBQSxPQUFPLENBQUMsT0FBTywwQ0FBRSxHQUFHLG1DQUNwQixnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQzVDLE1BQU0sQ0FBQyxJQUFJLEVBQ1gsTUFBTSxDQUFDLEVBQUUsRUFDVCxZQUFZLENBQ2IsQ0FBQztRQUVKLE1BQU0sT0FBTyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RCxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQzdCLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUvRCxJQUFJLFFBQVEsRUFBRTtZQUNaLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FDL0Msd0NBQWtCLENBQUMsZ0JBQWdCLENBQ1AsQ0FBQztZQUMvQixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBbUIsQ0FBQztZQUNyRSxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ3JDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLGtDQUFrQyxDQUNwRSxTQUFTLENBQ1YsQ0FBQztZQUNGLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0JBQ2QsRUFBRSxFQUFFLHNCQUFzQjtnQkFDMUIsTUFBTTtnQkFDTixZQUFZO2dCQUNaLGFBQWE7YUFDbUIsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBQSxxQkFBYyxFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFFaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDO1NBQ3JEO2FBQU07WUFDTCxJQUFJLE1BQUEsT0FBTyxDQUFDLE9BQU8sMENBQUUsdUJBQXVCLEVBQUU7Z0JBQzVDLE1BQU0sSUFBSSxpQ0FBdUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMzRDtZQUNELE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUN0QixnQkFBeUMsRUFDekMsT0FBMkI7O1FBRTNCLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBb0MsQ0FBQztRQUN0RSxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5RCxNQUFNLEdBQUcsR0FDUCxNQUFBLE1BQUEsT0FBTyxDQUFDLE9BQU8sMENBQUUsR0FBRyxtQ0FDcEIsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUM1QyxNQUFNLENBQUMsSUFBSSxFQUNYLE1BQU0sQ0FBQyxFQUFFLEVBQ1QsWUFBWSxDQUNiLENBQUM7UUFFSixNQUFNLE9BQU8sR0FBRyxNQUFNLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUQsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUM3QixnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFL0QsSUFBSSxRQUFRLEVBQUU7WUFDWixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLENBQy9DLHdDQUFrQixDQUFDLGdCQUFnQixDQUNQLENBQUM7WUFDL0IsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQW1CLENBQUM7WUFDckUsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLElBQXdCLENBQUM7WUFDMUQsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsa0NBQWtDLENBQ3BFLFNBQVMsQ0FDVixDQUFDO1lBRUYsTUFBTSxVQUFVLEdBQ2QsTUFBQSxNQUFBLE9BQU8sQ0FBQyxPQUFPLDBDQUFFLFVBQVUsbUNBQzNCLENBQUMsQ0FBQyxDQUNBLENBQUEsTUFBQSxPQUFPLENBQUMsT0FBTywwQ0FBRSxNQUFNO2lCQUN2QixNQUFBLE9BQU8sQ0FBQyxPQUFPLDBDQUFFLElBQUksQ0FBQTtpQkFDckIsTUFBQSxTQUFTLENBQUMsS0FBSywwQ0FBRSxJQUFJLENBQUE7aUJBQ3JCLE1BQUEsU0FBUyxDQUFDLEtBQUssMENBQUUsSUFBSSxDQUFBLENBQ3RCLENBQUM7WUFFSixJQUFJLFVBQVUsRUFBRTtnQkFDZCxLQUFLLElBQUksYUFBYSxJQUFJLGNBQWMsRUFBRTtvQkFDeEMsVUFBVSxDQUFDLElBQUksQ0FBQzt3QkFDZCxFQUFFLEVBQUUscUJBQXFCO3dCQUN6QixNQUFNO3dCQUNOLFlBQVk7d0JBQ1osYUFBYTtxQkFDa0IsQ0FBQyxDQUFDO2lCQUNwQzthQUNGO2lCQUFNO2dCQUNMLFVBQVUsQ0FBQyxJQUFJLENBQUM7b0JBQ2QsRUFBRSxFQUFFLHVCQUF1QjtvQkFDM0IsTUFBTTtvQkFDTixZQUFZO29CQUNaLGNBQWM7aUJBQ21CLENBQUMsQ0FBQzthQUN0QztZQUNELE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBQSxxQkFBYyxFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFFaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxDQUFDO1NBQ3REO2FBQU07WUFDTCxJQUFJLE1BQUEsT0FBTyxDQUFDLE9BQU8sMENBQUUsdUJBQXVCLEVBQUU7Z0JBQzVDLE1BQU0sSUFBSSxpQ0FBdUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMzRDtZQUNELE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUM7U0FDM0I7SUFDSCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpY3QsIHRvQXJyYXkgfSBmcm9tICdAb3JiaXQvdXRpbHMnO1xuaW1wb3J0IHtcbiAgUmVjb3JkUXVlcnksXG4gIEFkZFRvUmVsYXRlZFJlY29yZHNPcGVyYXRpb24sXG4gIFJlcGxhY2VSZWxhdGVkUmVjb3JkT3BlcmF0aW9uLFxuICBSZXBsYWNlUmVsYXRlZFJlY29yZHNPcGVyYXRpb24sXG4gIEZpbmRSZWNvcmQsXG4gIEZpbmRSZWNvcmRzLFxuICBGaW5kUmVsYXRlZFJlY29yZCxcbiAgRmluZFJlbGF0ZWRSZWNvcmRzLFxuICBSZWNvcmRJZGVudGl0eSxcbiAgUmVjb3JkUXVlcnlFeHByZXNzaW9uLFxuICBjbG9uZVJlY29yZElkZW50aXR5LFxuICBSZWNvcmRPcGVyYXRpb24sXG4gIFJlY29yZFF1ZXJ5RXhwcmVzc2lvblJlc3VsdCxcbiAgUmVjb3JkTm90Rm91bmRFeGNlcHRpb25cbn0gZnJvbSAnQG9yYml0L3JlY29yZHMnO1xuaW1wb3J0IHsgYnVpbGRUcmFuc2Zvcm0sIEZ1bGxSZXNwb25zZSB9IGZyb20gJ0BvcmJpdC9kYXRhJztcbmltcG9ydCB7IEpTT05BUElSZXF1ZXN0UHJvY2Vzc29yIH0gZnJvbSAnLi4vanNvbmFwaS1yZXF1ZXN0LXByb2Nlc3Nvcic7XG5pbXBvcnQgeyBKU09OQVBJUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2pzb25hcGktcmVxdWVzdC1vcHRpb25zJztcbmltcG9ydCB7IEpTT05BUElTZXJpYWxpemVycyB9IGZyb20gJy4uL3NlcmlhbGl6ZXJzL2pzb25hcGktc2VyaWFsaXplcnMnO1xuaW1wb3J0IHsgSlNPTkFQSURvY3VtZW50U2VyaWFsaXplciB9IGZyb20gJy4uL3NlcmlhbGl6ZXJzL2pzb25hcGktZG9jdW1lbnQtc2VyaWFsaXplcic7XG5pbXBvcnQgeyBSZWNvcmREb2N1bWVudCB9IGZyb20gJy4uL3JlY29yZC1kb2N1bWVudCc7XG5pbXBvcnQgeyBKU09OQVBJUmVzcG9uc2UgfSBmcm9tICcuLi9qc29uYXBpLXJlc3BvbnNlJztcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeVJlcXVlc3Qge1xuICBvcDogc3RyaW5nO1xuICBvcHRpb25zPzogSlNPTkFQSVJlcXVlc3RPcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRSZWNvcmRSZXF1ZXN0IGV4dGVuZHMgUXVlcnlSZXF1ZXN0IHtcbiAgb3A6ICdmaW5kUmVjb3JkJztcbiAgcmVjb3JkOiBSZWNvcmRJZGVudGl0eTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaW5kUmVjb3Jkc1JlcXVlc3QgZXh0ZW5kcyBRdWVyeVJlcXVlc3Qge1xuICBvcDogJ2ZpbmRSZWNvcmRzJztcbiAgdHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRSZWxhdGVkUmVjb3JkUmVxdWVzdCBleHRlbmRzIFF1ZXJ5UmVxdWVzdCB7XG4gIG9wOiAnZmluZFJlbGF0ZWRSZWNvcmQnO1xuICByZWNvcmQ6IFJlY29yZElkZW50aXR5O1xuICByZWxhdGlvbnNoaXA6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaW5kUmVsYXRlZFJlY29yZHNSZXF1ZXN0IGV4dGVuZHMgUXVlcnlSZXF1ZXN0IHtcbiAgb3A6ICdmaW5kUmVsYXRlZFJlY29yZHMnO1xuICByZWNvcmQ6IFJlY29yZElkZW50aXR5O1xuICByZWxhdGlvbnNoaXA6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUmVjb3JkUXVlcnlSZXF1ZXN0ID1cbiAgfCBGaW5kUmVjb3JkUmVxdWVzdFxuICB8IEZpbmRSZWNvcmRzUmVxdWVzdFxuICB8IEZpbmRSZWxhdGVkUmVjb3JkUmVxdWVzdFxuICB8IEZpbmRSZWxhdGVkUmVjb3Jkc1JlcXVlc3Q7XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5UmVxdWVzdFByb2Nlc3NvclJlc3BvbnNlID0gRnVsbFJlc3BvbnNlPFxuICBSZWNvcmRRdWVyeUV4cHJlc3Npb25SZXN1bHQsXG4gIEpTT05BUElSZXNwb25zZSxcbiAgUmVjb3JkT3BlcmF0aW9uXG4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5UmVxdWVzdFByb2Nlc3NvciB7XG4gIChcbiAgICByZXF1ZXN0UHJvY2Vzc29yOiBKU09OQVBJUmVxdWVzdFByb2Nlc3NvcixcbiAgICByZXF1ZXN0OiBSZWNvcmRRdWVyeVJlcXVlc3RcbiAgKTogUHJvbWlzZTxRdWVyeVJlcXVlc3RQcm9jZXNzb3JSZXNwb25zZT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWVyeVJlcXVlc3RzKFxuICByZXF1ZXN0UHJvY2Vzc29yOiBKU09OQVBJUmVxdWVzdFByb2Nlc3NvcixcbiAgcXVlcnk6IFJlY29yZFF1ZXJ5XG4pOiBSZWNvcmRRdWVyeVJlcXVlc3RbXSB7XG4gIGNvbnN0IHJlcXVlc3RzOiBSZWNvcmRRdWVyeVJlcXVlc3RbXSA9IFtdO1xuXG4gIGZvciAobGV0IGV4cHJlc3Npb24gb2YgdG9BcnJheShxdWVyeS5leHByZXNzaW9ucykpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gRXhwcmVzc2lvblRvUmVxdWVzdE1hcFtleHByZXNzaW9uLm9wXShcbiAgICAgIGV4cHJlc3Npb24gYXMgUmVjb3JkUXVlcnlFeHByZXNzaW9uLFxuICAgICAgcmVxdWVzdFByb2Nlc3NvclxuICAgICk7XG5cbiAgICBjb25zdCBvcHRpb25zID0gcmVxdWVzdFByb2Nlc3Nvci5tZXJnZVJlcXVlc3RPcHRpb25zKFtcbiAgICAgIHJlcXVlc3Qub3B0aW9ucyxcbiAgICAgIHF1ZXJ5Lm9wdGlvbnMsXG4gICAgICBleHByZXNzaW9uLm9wdGlvbnNcbiAgICBdKTtcbiAgICBpZiAob3B0aW9ucykgcmVxdWVzdC5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIHJlcXVlc3RzLnB1c2gocmVxdWVzdCk7XG4gIH1cbiAgcmV0dXJuIHJlcXVlc3RzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cHJlc3Npb25Ub1JlcXVlc3RDb252ZXJ0ZXIge1xuICAoXG4gICAgZXhwcmVzc2lvbjogUmVjb3JkUXVlcnlFeHByZXNzaW9uLFxuICAgIHJlcXVlc3RQcm9jZXNzb3I6IEpTT05BUElSZXF1ZXN0UHJvY2Vzc29yXG4gICk6IFJlY29yZFF1ZXJ5UmVxdWVzdDtcbn1cblxuY29uc3QgRXhwcmVzc2lvblRvUmVxdWVzdE1hcDogRGljdDxFeHByZXNzaW9uVG9SZXF1ZXN0Q29udmVydGVyPiA9IHtcbiAgZmluZFJlY29yZChleHByZXNzaW9uOiBSZWNvcmRRdWVyeUV4cHJlc3Npb24pOiBGaW5kUmVjb3JkUmVxdWVzdCB7XG4gICAgY29uc3QgZXhwID0gZXhwcmVzc2lvbiBhcyBGaW5kUmVjb3JkO1xuICAgIHJldHVybiB7XG4gICAgICBvcDogJ2ZpbmRSZWNvcmQnLFxuICAgICAgcmVjb3JkOiBjbG9uZVJlY29yZElkZW50aXR5KGV4cC5yZWNvcmQpXG4gICAgfTtcbiAgfSxcbiAgZmluZFJlY29yZHMoZXhwcmVzc2lvbjogUmVjb3JkUXVlcnlFeHByZXNzaW9uKTogRmluZFJlY29yZHNSZXF1ZXN0IHtcbiAgICBjb25zdCBleHAgPSBleHByZXNzaW9uIGFzIEZpbmRSZWNvcmRzO1xuICAgIGNvbnN0IHsgZmlsdGVyLCBzb3J0LCBwYWdlIH0gPSBleHA7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wOiAnZmluZFJlY29yZHMnLFxuICAgICAgdHlwZTogZXhwLnR5cGUgYXMgc3RyaW5nLFxuICAgICAgb3B0aW9uczogeyBmaWx0ZXIsIHNvcnQsIHBhZ2UgfVxuICAgIH07XG4gIH0sXG4gIGZpbmRSZWxhdGVkUmVjb3JkKFxuICAgIGV4cHJlc3Npb246IFJlY29yZFF1ZXJ5RXhwcmVzc2lvblxuICApOiBGaW5kUmVsYXRlZFJlY29yZFJlcXVlc3Qge1xuICAgIGNvbnN0IGV4cCA9IGV4cHJlc3Npb24gYXMgRmluZFJlbGF0ZWRSZWNvcmQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wOiAnZmluZFJlbGF0ZWRSZWNvcmQnLFxuICAgICAgcmVjb3JkOiBjbG9uZVJlY29yZElkZW50aXR5KGV4cC5yZWNvcmQpLFxuICAgICAgcmVsYXRpb25zaGlwOiBleHAucmVsYXRpb25zaGlwXG4gICAgfTtcbiAgfSxcbiAgZmluZFJlbGF0ZWRSZWNvcmRzKFxuICAgIGV4cHJlc3Npb246IFJlY29yZFF1ZXJ5RXhwcmVzc2lvblxuICApOiBGaW5kUmVsYXRlZFJlY29yZHNSZXF1ZXN0IHtcbiAgICBjb25zdCBleHAgPSBleHByZXNzaW9uIGFzIEZpbmRSZWxhdGVkUmVjb3JkcztcbiAgICBjb25zdCB7IGZpbHRlciwgc29ydCwgcGFnZSB9ID0gZXhwO1xuICAgIHJldHVybiB7XG4gICAgICBvcDogJ2ZpbmRSZWxhdGVkUmVjb3JkcycsXG4gICAgICByZWNvcmQ6IGNsb25lUmVjb3JkSWRlbnRpdHkoZXhwLnJlY29yZCksXG4gICAgICByZWxhdGlvbnNoaXA6IGV4cC5yZWxhdGlvbnNoaXAsXG4gICAgICBvcHRpb25zOiB7IGZpbHRlciwgc29ydCwgcGFnZSB9XG4gICAgfTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IFF1ZXJ5UmVxdWVzdFByb2Nlc3NvcnM6IERpY3Q8UXVlcnlSZXF1ZXN0UHJvY2Vzc29yPiA9IHtcbiAgYXN5bmMgZmluZFJlY29yZChcbiAgICByZXF1ZXN0UHJvY2Vzc29yOiBKU09OQVBJUmVxdWVzdFByb2Nlc3NvcixcbiAgICByZXF1ZXN0OiBSZWNvcmRRdWVyeVJlcXVlc3RcbiAgKTogUHJvbWlzZTxRdWVyeVJlcXVlc3RQcm9jZXNzb3JSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgcmVjb3JkIH0gPSByZXF1ZXN0IGFzIEZpbmRSZWNvcmRSZXF1ZXN0O1xuICAgIGNvbnN0IHNldHRpbmdzID0gcmVxdWVzdFByb2Nlc3Nvci5idWlsZEZldGNoU2V0dGluZ3MocmVxdWVzdCk7XG4gICAgY29uc3QgdXJsID1cbiAgICAgIHJlcXVlc3Qub3B0aW9ucz8udXJsID8/XG4gICAgICByZXF1ZXN0UHJvY2Vzc29yLnVybEJ1aWxkZXIucmVzb3VyY2VVUkwocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG5cbiAgICBjb25zdCBkZXRhaWxzID0gYXdhaXQgcmVxdWVzdFByb2Nlc3Nvci5mZXRjaCh1cmwsIHNldHRpbmdzKTtcbiAgICBjb25zdCB7IGRvY3VtZW50IH0gPSBkZXRhaWxzO1xuICAgIHJlcXVlc3RQcm9jZXNzb3IucHJlcHJvY2Vzc1Jlc3BvbnNlRG9jdW1lbnQoZG9jdW1lbnQsIHJlcXVlc3QpO1xuXG4gICAgaWYgKGRvY3VtZW50KSB7XG4gICAgICBjb25zdCBzZXJpYWxpemVyID0gcmVxdWVzdFByb2Nlc3Nvci5zZXJpYWxpemVyRm9yKFxuICAgICAgICBKU09OQVBJU2VyaWFsaXplcnMuUmVzb3VyY2VEb2N1bWVudFxuICAgICAgKSBhcyBKU09OQVBJRG9jdW1lbnRTZXJpYWxpemVyO1xuICAgICAgY29uc3QgcmVjb3JkRG9jID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkb2N1bWVudCkgYXMgUmVjb3JkRG9jdW1lbnQ7XG4gICAgICBjb25zdCBvcGVyYXRpb25zID0gcmVxdWVzdFByb2Nlc3Nvci5vcGVyYXRpb25zRnJvbURlc2VyaWFsaXplZERvY3VtZW50KFxuICAgICAgICByZWNvcmREb2NcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1zID0gW2J1aWxkVHJhbnNmb3JtPFJlY29yZE9wZXJhdGlvbj4ob3BlcmF0aW9ucyldO1xuXG4gICAgICByZXR1cm4geyB0cmFuc2Zvcm1zLCBkYXRhOiByZWNvcmREb2MuZGF0YSwgZGV0YWlscyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVxdWVzdC5vcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyB0cmFuc2Zvcm1zOiBbXSB9O1xuICAgIH1cbiAgfSxcblxuICBhc3luYyBmaW5kUmVjb3JkcyhcbiAgICByZXF1ZXN0UHJvY2Vzc29yOiBKU09OQVBJUmVxdWVzdFByb2Nlc3NvcixcbiAgICByZXF1ZXN0OiBSZWNvcmRRdWVyeVJlcXVlc3RcbiAgKTogUHJvbWlzZTxRdWVyeVJlcXVlc3RQcm9jZXNzb3JSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgdHlwZSB9ID0gcmVxdWVzdCBhcyBGaW5kUmVjb3Jkc1JlcXVlc3Q7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSByZXF1ZXN0UHJvY2Vzc29yLmJ1aWxkRmV0Y2hTZXR0aW5ncyhyZXF1ZXN0KTtcbiAgICBjb25zdCB1cmwgPVxuICAgICAgcmVxdWVzdC5vcHRpb25zPy51cmwgPz8gcmVxdWVzdFByb2Nlc3Nvci51cmxCdWlsZGVyLnJlc291cmNlVVJMKHR5cGUpO1xuXG4gICAgY29uc3QgZGV0YWlscyA9IGF3YWl0IHJlcXVlc3RQcm9jZXNzb3IuZmV0Y2godXJsLCBzZXR0aW5ncyk7XG4gICAgY29uc3QgeyBkb2N1bWVudCB9ID0gZGV0YWlscztcbiAgICByZXF1ZXN0UHJvY2Vzc29yLnByZXByb2Nlc3NSZXNwb25zZURvY3VtZW50KGRvY3VtZW50LCByZXF1ZXN0KTtcblxuICAgIGlmIChkb2N1bWVudCkge1xuICAgICAgY29uc3Qgc2VyaWFsaXplciA9IHJlcXVlc3RQcm9jZXNzb3Iuc2VyaWFsaXplckZvcihcbiAgICAgICAgSlNPTkFQSVNlcmlhbGl6ZXJzLlJlc291cmNlRG9jdW1lbnRcbiAgICAgICkgYXMgSlNPTkFQSURvY3VtZW50U2VyaWFsaXplcjtcbiAgICAgIGNvbnN0IHJlY29yZERvYyA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZG9jdW1lbnQpIGFzIFJlY29yZERvY3VtZW50O1xuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IHJlcXVlc3RQcm9jZXNzb3Iub3BlcmF0aW9uc0Zyb21EZXNlcmlhbGl6ZWREb2N1bWVudChcbiAgICAgICAgcmVjb3JkRG9jXG4gICAgICApO1xuICAgICAgY29uc3QgdHJhbnNmb3JtcyA9IFtidWlsZFRyYW5zZm9ybShvcGVyYXRpb25zKV07XG5cbiAgICAgIHJldHVybiB7IHRyYW5zZm9ybXMsIGRhdGE6IHJlY29yZERvYy5kYXRhLCBkZXRhaWxzIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IHRyYW5zZm9ybXM6IFtdIH07XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIGZpbmRSZWxhdGVkUmVjb3JkKFxuICAgIHJlcXVlc3RQcm9jZXNzb3I6IEpTT05BUElSZXF1ZXN0UHJvY2Vzc29yLFxuICAgIHJlcXVlc3Q6IFJlY29yZFF1ZXJ5UmVxdWVzdFxuICApOiBQcm9taXNlPFF1ZXJ5UmVxdWVzdFByb2Nlc3NvclJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyByZWNvcmQsIHJlbGF0aW9uc2hpcCB9ID0gcmVxdWVzdCBhcyBGaW5kUmVsYXRlZFJlY29yZFJlcXVlc3Q7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSByZXF1ZXN0UHJvY2Vzc29yLmJ1aWxkRmV0Y2hTZXR0aW5ncyhyZXF1ZXN0KTtcbiAgICBjb25zdCB1cmwgPVxuICAgICAgcmVxdWVzdC5vcHRpb25zPy51cmwgPz9cbiAgICAgIHJlcXVlc3RQcm9jZXNzb3IudXJsQnVpbGRlci5yZWxhdGVkUmVzb3VyY2VVUkwoXG4gICAgICAgIHJlY29yZC50eXBlLFxuICAgICAgICByZWNvcmQuaWQsXG4gICAgICAgIHJlbGF0aW9uc2hpcFxuICAgICAgKTtcblxuICAgIGNvbnN0IGRldGFpbHMgPSBhd2FpdCByZXF1ZXN0UHJvY2Vzc29yLmZldGNoKHVybCwgc2V0dGluZ3MpO1xuICAgIGNvbnN0IHsgZG9jdW1lbnQgfSA9IGRldGFpbHM7XG4gICAgcmVxdWVzdFByb2Nlc3Nvci5wcmVwcm9jZXNzUmVzcG9uc2VEb2N1bWVudChkb2N1bWVudCwgcmVxdWVzdCk7XG5cbiAgICBpZiAoZG9jdW1lbnQpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSByZXF1ZXN0UHJvY2Vzc29yLnNlcmlhbGl6ZXJGb3IoXG4gICAgICAgIEpTT05BUElTZXJpYWxpemVycy5SZXNvdXJjZURvY3VtZW50XG4gICAgICApIGFzIEpTT05BUElEb2N1bWVudFNlcmlhbGl6ZXI7XG4gICAgICBjb25zdCByZWNvcmREb2MgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRvY3VtZW50KSBhcyBSZWNvcmREb2N1bWVudDtcbiAgICAgIGNvbnN0IHJlbGF0ZWRSZWNvcmQgPSByZWNvcmREb2MuZGF0YTtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSByZXF1ZXN0UHJvY2Vzc29yLm9wZXJhdGlvbnNGcm9tRGVzZXJpYWxpemVkRG9jdW1lbnQoXG4gICAgICAgIHJlY29yZERvY1xuICAgICAgKTtcbiAgICAgIG9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgIG9wOiAncmVwbGFjZVJlbGF0ZWRSZWNvcmQnLFxuICAgICAgICByZWNvcmQsXG4gICAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgICAgcmVsYXRlZFJlY29yZFxuICAgICAgfSBhcyBSZXBsYWNlUmVsYXRlZFJlY29yZE9wZXJhdGlvbik7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1zID0gW2J1aWxkVHJhbnNmb3JtKG9wZXJhdGlvbnMpXTtcblxuICAgICAgcmV0dXJuIHsgdHJhbnNmb3JtcywgZGF0YTogcmVsYXRlZFJlY29yZCwgZGV0YWlscyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVxdWVzdC5vcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyB0cmFuc2Zvcm1zOiBbXSB9O1xuICAgIH1cbiAgfSxcblxuICBhc3luYyBmaW5kUmVsYXRlZFJlY29yZHMoXG4gICAgcmVxdWVzdFByb2Nlc3NvcjogSlNPTkFQSVJlcXVlc3RQcm9jZXNzb3IsXG4gICAgcmVxdWVzdDogUmVjb3JkUXVlcnlSZXF1ZXN0XG4gICk6IFByb21pc2U8UXVlcnlSZXF1ZXN0UHJvY2Vzc29yUmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IHJlY29yZCwgcmVsYXRpb25zaGlwIH0gPSByZXF1ZXN0IGFzIEZpbmRSZWxhdGVkUmVjb3Jkc1JlcXVlc3Q7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSByZXF1ZXN0UHJvY2Vzc29yLmJ1aWxkRmV0Y2hTZXR0aW5ncyhyZXF1ZXN0KTtcbiAgICBjb25zdCB1cmwgPVxuICAgICAgcmVxdWVzdC5vcHRpb25zPy51cmwgPz9cbiAgICAgIHJlcXVlc3RQcm9jZXNzb3IudXJsQnVpbGRlci5yZWxhdGVkUmVzb3VyY2VVUkwoXG4gICAgICAgIHJlY29yZC50eXBlLFxuICAgICAgICByZWNvcmQuaWQsXG4gICAgICAgIHJlbGF0aW9uc2hpcFxuICAgICAgKTtcblxuICAgIGNvbnN0IGRldGFpbHMgPSBhd2FpdCByZXF1ZXN0UHJvY2Vzc29yLmZldGNoKHVybCwgc2V0dGluZ3MpO1xuICAgIGNvbnN0IHsgZG9jdW1lbnQgfSA9IGRldGFpbHM7XG4gICAgcmVxdWVzdFByb2Nlc3Nvci5wcmVwcm9jZXNzUmVzcG9uc2VEb2N1bWVudChkb2N1bWVudCwgcmVxdWVzdCk7XG5cbiAgICBpZiAoZG9jdW1lbnQpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSByZXF1ZXN0UHJvY2Vzc29yLnNlcmlhbGl6ZXJGb3IoXG4gICAgICAgIEpTT05BUElTZXJpYWxpemVycy5SZXNvdXJjZURvY3VtZW50XG4gICAgICApIGFzIEpTT05BUElEb2N1bWVudFNlcmlhbGl6ZXI7XG4gICAgICBjb25zdCByZWNvcmREb2MgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRvY3VtZW50KSBhcyBSZWNvcmREb2N1bWVudDtcbiAgICAgIGNvbnN0IHJlbGF0ZWRSZWNvcmRzID0gcmVjb3JkRG9jLmRhdGEgYXMgUmVjb3JkSWRlbnRpdHlbXTtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSByZXF1ZXN0UHJvY2Vzc29yLm9wZXJhdGlvbnNGcm9tRGVzZXJpYWxpemVkRG9jdW1lbnQoXG4gICAgICAgIHJlY29yZERvY1xuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFydGlhbFNldCA9XG4gICAgICAgIHJlcXVlc3Qub3B0aW9ucz8ucGFydGlhbFNldCA/P1xuICAgICAgICAhIShcbiAgICAgICAgICByZXF1ZXN0Lm9wdGlvbnM/LmZpbHRlciB8fFxuICAgICAgICAgIHJlcXVlc3Qub3B0aW9ucz8ucGFnZSB8fFxuICAgICAgICAgIHJlY29yZERvYy5saW5rcz8ubmV4dCB8fFxuICAgICAgICAgIHJlY29yZERvYy5saW5rcz8ucHJldlxuICAgICAgICApO1xuXG4gICAgICBpZiAocGFydGlhbFNldCkge1xuICAgICAgICBmb3IgKGxldCByZWxhdGVkUmVjb3JkIG9mIHJlbGF0ZWRSZWNvcmRzKSB7XG4gICAgICAgICAgb3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiAnYWRkVG9SZWxhdGVkUmVjb3JkcycsXG4gICAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgICByZWxhdGlvbnNoaXAsXG4gICAgICAgICAgICByZWxhdGVkUmVjb3JkXG4gICAgICAgICAgfSBhcyBBZGRUb1JlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICBvcDogJ3JlcGxhY2VSZWxhdGVkUmVjb3JkcycsXG4gICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgICAgICByZWxhdGVkUmVjb3Jkc1xuICAgICAgICB9IGFzIFJlcGxhY2VSZWxhdGVkUmVjb3Jkc09wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBjb25zdCB0cmFuc2Zvcm1zID0gW2J1aWxkVHJhbnNmb3JtKG9wZXJhdGlvbnMpXTtcblxuICAgICAgcmV0dXJuIHsgdHJhbnNmb3JtcywgZGF0YTogcmVsYXRlZFJlY29yZHMsIGRldGFpbHMgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlcXVlc3Qub3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKHJlY29yZC50eXBlLCByZWNvcmQuaWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdHJhbnNmb3JtczogW10gfTtcbiAgICB9XG4gIH1cbn07XG4iXX0=