201 lines
31 KiB
Plaintext
201 lines
31 KiB
Plaintext
import { __assign, __rest as __rest_1, __spreadArray } from "/_nuxt/node_modules/tslib/tslib.es6.js?v=e4f18c29";
|
|
import { __rest } from "/_nuxt/node_modules/tslib/tslib.es6.js?v=e4f18c29";
|
|
import { mergeDeep } from "/_nuxt/node_modules/@apollo/client/utilities/common/mergeDeep.js?v=e4f18c29";
|
|
// A very basic pagination field policy that always concatenates new
|
|
// results onto the existing array, without examining options.args.
|
|
export function concatPagination(keyArgs) {
|
|
if (keyArgs === void 0) { keyArgs = false; }
|
|
return {
|
|
keyArgs: keyArgs,
|
|
merge: function (existing, incoming) {
|
|
return existing ? __spreadArray(__spreadArray([], existing, true), incoming, true) : incoming;
|
|
},
|
|
};
|
|
}
|
|
// A basic field policy that uses options.args.{offset,limit} to splice
|
|
// the incoming data into the existing array. If your arguments are called
|
|
// something different (like args.{start,count}), feel free to copy/paste
|
|
// this implementation and make the appropriate changes.
|
|
export function offsetLimitPagination(keyArgs) {
|
|
if (keyArgs === void 0) { keyArgs = false; }
|
|
return {
|
|
keyArgs: keyArgs,
|
|
merge: function (existing, incoming, _a) {
|
|
var args = _a.args;
|
|
var merged = existing ? existing.slice(0) : [];
|
|
if (incoming) {
|
|
if (args) {
|
|
// Assume an offset of 0 if args.offset omitted.
|
|
var _b = args.offset, offset = _b === void 0 ? 0 : _b;
|
|
for (var i = 0; i < incoming.length; ++i) {
|
|
merged[offset + i] = incoming[i];
|
|
}
|
|
}
|
|
else {
|
|
// It's unusual (probably a mistake) for a paginated field not
|
|
// to receive any arguments, so you might prefer to throw an
|
|
// exception here, instead of recovering by appending incoming
|
|
// onto the existing array.
|
|
merged.push.apply(merged, incoming);
|
|
}
|
|
}
|
|
return merged;
|
|
},
|
|
};
|
|
}
|
|
// As proof of the flexibility of field policies, this function generates
|
|
// one that handles Relay-style pagination, without Apollo Client knowing
|
|
// anything about connections, edges, cursors, or pageInfo objects.
|
|
export function relayStylePagination(keyArgs) {
|
|
if (keyArgs === void 0) { keyArgs = false; }
|
|
return {
|
|
keyArgs: keyArgs,
|
|
read: function (existing, _a) {
|
|
var canRead = _a.canRead, readField = _a.readField;
|
|
if (!existing)
|
|
return existing;
|
|
var edges = [];
|
|
var firstEdgeCursor = "";
|
|
var lastEdgeCursor = "";
|
|
existing.edges.forEach(function (edge) {
|
|
// Edges themselves could be Reference objects, so it's important
|
|
// to use readField to access the edge.edge.node property.
|
|
if (canRead(readField("node", edge))) {
|
|
edges.push(edge);
|
|
if (edge.cursor) {
|
|
firstEdgeCursor = firstEdgeCursor || edge.cursor || "";
|
|
lastEdgeCursor = edge.cursor || lastEdgeCursor;
|
|
}
|
|
}
|
|
});
|
|
if (edges.length > 1 && firstEdgeCursor === lastEdgeCursor) {
|
|
firstEdgeCursor = "";
|
|
}
|
|
var _b = existing.pageInfo || {}, startCursor = _b.startCursor, endCursor = _b.endCursor;
|
|
return __assign(__assign({}, getExtras(existing)), { edges: edges, pageInfo: __assign(__assign({}, existing.pageInfo), {
|
|
// If existing.pageInfo.{start,end}Cursor are undefined or "", default
|
|
// to firstEdgeCursor and/or lastEdgeCursor.
|
|
startCursor: startCursor || firstEdgeCursor, endCursor: endCursor || lastEdgeCursor }) });
|
|
},
|
|
merge: function (existing, incoming, _a) {
|
|
var args = _a.args, isReference = _a.isReference, readField = _a.readField;
|
|
if (!existing) {
|
|
existing = makeEmptyData();
|
|
}
|
|
if (!incoming) {
|
|
return existing;
|
|
}
|
|
var incomingEdges = incoming.edges ?
|
|
incoming.edges.map(function (edge) {
|
|
if (isReference((edge = __assign({}, edge)))) {
|
|
// In case edge is a Reference, we read out its cursor field and
|
|
// store it as an extra property of the Reference object.
|
|
edge.cursor = readField("cursor", edge);
|
|
}
|
|
return edge;
|
|
})
|
|
: [];
|
|
if (incoming.pageInfo) {
|
|
var pageInfo_1 = incoming.pageInfo;
|
|
var startCursor = pageInfo_1.startCursor, endCursor = pageInfo_1.endCursor;
|
|
var firstEdge = incomingEdges[0];
|
|
var lastEdge = incomingEdges[incomingEdges.length - 1];
|
|
// In case we did not request the cursor field for edges in this
|
|
// query, we can still infer cursors from pageInfo.
|
|
if (firstEdge && startCursor) {
|
|
firstEdge.cursor = startCursor;
|
|
}
|
|
if (lastEdge && endCursor) {
|
|
lastEdge.cursor = endCursor;
|
|
}
|
|
// Cursors can also come from edges, so we default
|
|
// pageInfo.{start,end}Cursor to {first,last}Edge.cursor.
|
|
var firstCursor = firstEdge && firstEdge.cursor;
|
|
if (firstCursor && !startCursor) {
|
|
incoming = mergeDeep(incoming, {
|
|
pageInfo: {
|
|
startCursor: firstCursor,
|
|
},
|
|
});
|
|
}
|
|
var lastCursor = lastEdge && lastEdge.cursor;
|
|
if (lastCursor && !endCursor) {
|
|
incoming = mergeDeep(incoming, {
|
|
pageInfo: {
|
|
endCursor: lastCursor,
|
|
},
|
|
});
|
|
}
|
|
}
|
|
var prefix = existing.edges;
|
|
var suffix = [];
|
|
if (args && args.after) {
|
|
// This comparison does not need to use readField("cursor", edge),
|
|
// because we stored the cursor field of any Reference edges as an
|
|
// extra property of the Reference object.
|
|
var index = prefix.findIndex(function (edge) { return edge.cursor === args.after; });
|
|
if (index >= 0) {
|
|
prefix = prefix.slice(0, index + 1);
|
|
// suffix = []; // already true
|
|
}
|
|
}
|
|
else if (args && args.before) {
|
|
var index = prefix.findIndex(function (edge) { return edge.cursor === args.before; });
|
|
suffix = index < 0 ? prefix : prefix.slice(index);
|
|
prefix = [];
|
|
}
|
|
else if (incoming.edges) {
|
|
// If we have neither args.after nor args.before, the incoming
|
|
// edges cannot be spliced into the existing edges, so they must
|
|
// replace the existing edges. See #6592 for a motivating example.
|
|
prefix = [];
|
|
}
|
|
var edges = __spreadArray(__spreadArray(__spreadArray([], prefix, true), incomingEdges, true), suffix, true);
|
|
var pageInfo = __assign(__assign({}, incoming.pageInfo), existing.pageInfo);
|
|
if (incoming.pageInfo) {
|
|
var _b = incoming.pageInfo, hasPreviousPage = _b.hasPreviousPage, hasNextPage = _b.hasNextPage, startCursor = _b.startCursor, endCursor = _b.endCursor, extras = __rest_1(_b, ["hasPreviousPage", "hasNextPage", "startCursor", "endCursor"]);
|
|
// If incoming.pageInfo had any extra non-standard properties,
|
|
// assume they should take precedence over any existing properties
|
|
// of the same name, regardless of where this page falls with
|
|
// respect to the existing data.
|
|
Object.assign(pageInfo, extras);
|
|
// Keep existing.pageInfo.has{Previous,Next}Page unless the
|
|
// placement of the incoming edges means incoming.hasPreviousPage
|
|
// or incoming.hasNextPage should become the new values for those
|
|
// properties in existing.pageInfo. Note that these updates are
|
|
// only permitted when the beginning or end of the incoming page
|
|
// coincides with the beginning or end of the existing data, as
|
|
// determined using prefix.length and suffix.length.
|
|
if (!prefix.length) {
|
|
if (void 0 !== hasPreviousPage)
|
|
pageInfo.hasPreviousPage = hasPreviousPage;
|
|
if (void 0 !== startCursor)
|
|
pageInfo.startCursor = startCursor;
|
|
}
|
|
if (!suffix.length) {
|
|
if (void 0 !== hasNextPage)
|
|
pageInfo.hasNextPage = hasNextPage;
|
|
if (void 0 !== endCursor)
|
|
pageInfo.endCursor = endCursor;
|
|
}
|
|
}
|
|
return __assign(__assign(__assign({}, getExtras(existing)), getExtras(incoming)), { edges: edges, pageInfo: pageInfo });
|
|
},
|
|
};
|
|
}
|
|
// Returns any unrecognized properties of the given object.
|
|
var getExtras = function (obj) { return __rest(obj, notExtras); };
|
|
var notExtras = ["edges", "pageInfo"];
|
|
function makeEmptyData() {
|
|
return {
|
|
edges: [],
|
|
pageInfo: {
|
|
hasPreviousPage: false,
|
|
hasNextPage: true,
|
|
startCursor: "",
|
|
endCursor: "",
|
|
},
|
|
};
|
|
}
|
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsaXRpZXMvcG9saWNpZXMvcGFnaW5hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUcvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJbkQsb0VBQW9FO0FBQ3BFLG1FQUFtRTtBQUNuRSxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLE9BQXdCO0lBQXhCLHdCQUFBLEVBQUEsZUFBd0I7SUFFeEIsT0FBTztRQUNMLE9BQU8sU0FBQTtRQUNQLEtBQUssWUFBQyxRQUFRLEVBQUUsUUFBUTtZQUN0QixPQUFPLFFBQVEsQ0FBQyxDQUFDLGlDQUFLLFFBQVEsU0FBSyxRQUFRLFFBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUMxRCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsMEVBQTBFO0FBQzFFLHlFQUF5RTtBQUN6RSx3REFBd0Q7QUFDeEQsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxPQUF3QjtJQUF4Qix3QkFBQSxFQUFBLGVBQXdCO0lBRXhCLE9BQU87UUFDTCxPQUFPLFNBQUE7UUFDUCxLQUFLLFlBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFRO2dCQUFOLElBQUksVUFBQTtZQUM5QixJQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVqRCxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ1QsZ0RBQWdEO29CQUN4QyxJQUFBLEtBQWUsSUFBSSxPQUFULEVBQVYsTUFBTSxtQkFBRyxDQUFDLEtBQUEsQ0FBVTtvQkFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxD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d0JBQUUsUUFBUSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7Z0JBQzNELENBQUM7WUFDSCxDQUFDO1lBRUQsc0NBQ0ssU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUNuQixTQUFTLENBQUMsUUFBUSxDQUFDLEtBQ3RCLEtBQUssT0FBQSxFQUNMLFFBQVEsVUFBQSxJQUNSO1FBQ0osQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsMkRBQTJEO0FBQzNELElBQU0sU0FBUyxHQUFHLFVBQUMsR0FBd0IsSUFBSyxPQUFBLE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEVBQXRCLENBQXNCLENBQUM7QUFDdkUsSUFBTSxTQUFTLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFFeEMsU0FBUyxhQUFhO0lBQ3BCLE9BQU87UUFDTCxLQUFLLEVBQUUsRUFBRTtRQUNULFFBQVEsRUFBRTtZQUNSLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFdBQVcsRUFBRSxFQUFFO1lBQ2YsU0FBUyxFQUFFLEVBQUU7U0FDZDtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5cbmltcG9ydCB0eXBlIHsgRmllbGRQb2xpY3ksIFJlZmVyZW5jZSB9IGZyb20gXCIuLi8uLi9jYWNoZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgbWVyZ2VEZWVwIH0gZnJvbSBcIi4uL2NvbW1vbi9tZXJnZURlZXAuanNcIjtcblxudHlwZSBLZXlBcmdzID0gRmllbGRQb2xpY3k8YW55PltcImtleUFyZ3NcIl07XG5cbi8vIEEgdmVyeSBiYXNpYyBwYWdpbmF0aW9uIGZpZWxkIHBvbGljeSB0aGF0IGFsd2F5cyBjb25jYXRlbmF0ZXMgbmV3XG4vLyByZXN1bHRzIG9udG8gdGhlIGV4aXN0aW5nIGFycmF5LCB3aXRob3V0IGV4YW1pbmluZyBvcHRpb25zLmFyZ3MuXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0UGFnaW5hdGlvbjxUID0gUmVmZXJlbmNlPihcbiAga2V5QXJnczogS2V5QXJncyA9IGZhbHNlXG4pOiBGaWVsZFBvbGljeTxUW10+IHtcbiAgcmV0dXJuIHtcbiAgICBrZXlBcmdzLFxuICAgIG1lcmdlKGV4aXN0aW5nLCBpbmNvbWluZykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nID8gWy4uLmV4aXN0aW5nLCAuLi5pbmNvbWluZ10gOiBpbmNvbWluZztcbiAgICB9LFxuICB9O1xufVxuXG4vLyBBIGJhc2ljIGZpZWxkIHBvbGljeSB0aGF0IHVzZXMgb3B0aW9ucy5hcmdzLntvZmZzZXQsbGltaXR9IHRvIHNwbGljZVxuLy8gdGhlIGluY29taW5nIGRhdGEgaW50byB0aGUgZXhpc3RpbmcgYXJyYXkuIElmIHlvdXIgYXJndW1lbnRzIGFyZSBjYWxsZWRcbi8vIHNvbWV0aGluZyBkaWZmZXJlbnQgKGxpa2UgYXJncy57c3RhcnQsY291bnR9KSwgZmVlbCBmcmVlIHRvIGNvcHkvcGFzdGVcbi8vIHRoaXMgaW1wbGVtZW50YXRpb24gYW5kIG1ha2UgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZXMuXG5leHBvcnQgZnVuY3Rpb24gb2Zmc2V0TGltaXRQYWdpbmF0aW9uPFQgPSBSZWZlcmVuY2U+KFxuICBrZXlBcmdzOiBLZXlBcmdzID0gZmFsc2Vcbik6IEZpZWxkUG9saWN5PFRbXT4ge1xuICByZXR1cm4ge1xuICAgIGtleUFyZ3MsXG4gICAgbWVyZ2UoZXhpc3RpbmcsIGluY29taW5nLCB7IGFyZ3MgfSkge1xuICAgICAgY29uc3QgbWVyZ2VkID0gZXhpc3RpbmcgPyBleGlzdGluZy5zbGljZSgwKSA6IFtdO1xuXG4gICAgICBpZiAoaW5jb21pbmcpIHtcbiAgICAgICAgaWYgKGFyZ3MpIHtcbiAgICAgICAgICAvLyBBc3N1bWUgYW4gb2Zmc2V0IG9mIDAgaWYgYXJncy5vZmZzZXQgb21pdHRlZC5cbiAgICAgICAgICBjb25zdCB7IG9mZnNldCA9IDAgfSA9IGFyZ3M7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmNvbWluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbWVyZ2VkW29mZnNldCArIGldID0gaW5jb21pbmdbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEl0J3MgdW51c3VhbCAocHJvYmFibHkgYSBtaXN0YWtlKSBmb3IgYSBwYWdpbmF0ZWQgZmllbGQgbm90XG4gICAgICAgICAgLy8gdG8gcmVjZWl2ZSBhbnkgYXJndW1lbnRzLCBzbyB5b3UgbWlnaHQgcHJlZmVyIHRvIHRocm93IGFuXG4gICAgICAgICAgLy8gZXhjZXB0aW9uIGhlcmUsIGluc3RlYWQgb2YgcmVjb3ZlcmluZyBieSBhcHBlbmRpbmcgaW5jb21pbmdcbiAgICAgICAgICAvLyBvbnRvIHRoZSBleGlzdGluZyBhcnJheS5cbiAgICAgICAgICBtZXJnZWQucHVzaCguLi5pbmNvbWluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICB9LFxuICB9O1xufVxuXG4vLyBXaGV0aGVyIFRSZWxheUVkZ2U8VE5vZGU+IGlzIGEgbm9ybWFsaXplZCBSZWZlcmVuY2Ugb3IgYSBub24tbm9ybWFsaXplZFxuLy8gb2JqZWN0LCBpdCBuZWVkcyBhIC5jdXJzb3IgcHJvcGVydHkgd2hlcmUgdGhlIHJlbGF5U3R5bGVQYWdpbmF0aW9uXG4vLyBtZXJnZSBmdW5jdGlvbiBjYW4gc3RvcmUgY3Vyc29yIHN0cmluZ3MgdGFrZW4gZnJvbSBwYWdlSW5mby4gU3RvcmluZyBhblxuLy8gZXh0cmEgcmVmZXJlbmNlLmN1cnNvciBwcm9wZXJ0eSBzaG91bGQgYmUgc2FmZSwgYW5kIGlzIGVhc2llciB0aGFuXG4vLyBhdHRlbXB0aW5nIHRvIHVwZGF0ZSB0aGUgY3Vyc29yIGZpZWxkIG9mIHRoZSBub3JtYWxpemVkIFN0b3JlT2JqZWN0XG4vLyB0aGF0IHRoZSByZWZlcmVuY2UgcmVmZXJzIHRvLCBvciBtYW5hZ2luZyBlZGdlIHdyYXBwZXIgb2JqZWN0c1xuLy8gKHNvbWV0aGluZyBJIGF0dGVtcHRlZCBpbiAjNzAyMywgYnV0IGFiYW5kb25lZCBiZWNhdXNlIG9mICM3MDg4KS5cbmV4cG9ydCB0eXBlIFRSZWxheUVkZ2U8VE5vZGU+ID1cbiAgfCB7XG4gICAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgICBub2RlOiBUTm9kZTtcbiAgICB9XG4gIHwgKFJlZmVyZW5jZSAmIHsgY3Vyc29yPzogc3RyaW5nIH0pO1xuXG5leHBvcnQgdHlwZSBUUmVsYXlQYWdlSW5mbyA9IHtcbiAgaGFzUHJldmlvdXNQYWdlOiBib29sZWFuO1xuICBoYXNOZXh0UGFnZTogYm9vbGVhbjtcbiAgc3RhcnRDdXJzb3I6IHN0cmluZztcbiAgZW5kQ3Vyc29yOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBURXhpc3RpbmdSZWxheTxUTm9kZT4gPSBSZWFkb25seTx7XG4gIGVkZ2VzOiBUUmVsYXlFZGdlPFROb2RlPltdO1xuICBwYWdlSW5mbzogVFJlbGF5UGFnZUluZm87XG59PjtcblxuZXhwb3J0IHR5cGUgVEluY29taW5nUmVsYXk8VE5vZGU+ID0ge1xuICBlZGdlcz86IFRSZWxheUVkZ2U8VE5vZGU+W107XG4gIHBhZ2VJbmZvPzogVFJlbGF5UGFnZUluZm87XG59O1xuXG5leHBvcnQgdHlwZSBSZWxheUZpZWxkUG9saWN5PFROb2RlPiA9IEZpZWxkUG9saWN5PFxuICBURXhpc3RpbmdSZWxheTxUTm9kZT4gfCBudWxsLFxuICBUSW5jb21pbmdSZWxheTxUTm9kZT4gfCBudWxsLFxuICBUSW5jb21pbmdSZWxheTxUTm9kZT4gfCBudWxsXG4+O1xuXG4vLyBBcyBwcm9vZiBvZiB0aGUgZmxleGliaWxpdHkgb2YgZmllbGQgcG9saWNpZXMsIHRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzXG4vLyBvbmUgdGhhdCBoYW5kbGVzIFJlbGF5LXN0eWxlIHBhZ2luYXRpb24sIHdpdGhvdXQgQXBvbGxvIENsaWVudCBrbm93aW5nXG4vLyBhbnl0aGluZyBhYm91dCBjb25uZWN0aW9ucywgZWRnZXMsIGN1cnNvcnMsIG9yIHBhZ2VJbmZvIG9iamVjdHMuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXlTdHlsZVBhZ2luYXRpb248VE5vZGUgZXh0ZW5kcyBSZWZlcmVuY2UgPSBSZWZlcmVuY2U+KFxuICBrZXlBcmdzOiBLZXlBcmdzID0gZmFsc2Vcbik6IFJlbGF5RmllbGRQb2xpY3k8VE5vZGU+IHtcbiAgcmV0dXJuIHtcbiAgICBrZXlBcmdzLFxuXG4gICAgcmVhZChleGlzdGluZywgeyBjYW5SZWFkLCByZWFkRmllbGQgfSkge1xuICAgICAgaWYgKCFleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuXG4gICAgICBjb25zdCBlZGdlczogVFJlbGF5RWRnZTxUTm9kZT5bXSA9IFtdO1xuICAgICAgbGV0IGZpcnN0RWRnZUN1cnNvciA9IFwiXCI7XG4gICAgICBsZXQgbGFzdEVkZ2VDdXJzb3IgPSBcIlwiO1xuICAgICAgZXhpc3RpbmcuZWRnZXMuZm9yRWFjaCgoZWRnZSkgPT4ge1xuICAgICAgICAvLyBFZGdlcyB0aGVtc2VsdmVzIGNvdWxkIGJlIFJlZmVyZW5jZSBvYmplY3RzLCBzbyBpdCdzIGltcG9ydGFudFxuICAgICAgICAvLyB0byB1c2UgcmVhZEZpZWxkIHRvIGFjY2VzcyB0aGUgZWRnZS5lZGdlLm5vZGUgcHJvcGVydHkuXG4gICAgICAgIGlmIChjYW5SZWFkKHJlYWRGaWVsZChcIm5vZGVcIiwgZWRnZSkpKSB7XG4gICAgICAgICAgZWRnZXMucHVzaChlZGdlKTtcbiAgICAgICAgICBpZiAoZWRnZS5jdXJzb3IpIHtcbiAgICAgICAgICAgIGZpcnN0RWRnZUN1cnNvciA9IGZpcnN0RWRnZUN1cnNvciB8fCBlZGdlLmN1cnNvciB8fCBcIlwiO1xuICAgICAgICAgICAgbGFzdEVkZ2VDdXJzb3IgPSBlZGdlLmN1cnNvciB8fCBsYXN0RWRnZUN1cnNvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZWRnZXMubGVuZ3RoID4gMSAmJiBmaXJzdEVkZ2VDdXJzb3IgPT09IGxhc3RFZGdlQ3Vyc29yKSB7XG4gICAgICAgIGZpcnN0RWRnZUN1cnNvciA9IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgc3RhcnRDdXJzb3IsIGVuZEN1cnNvciB9ID0gZXhpc3RpbmcucGFnZUluZm8gfHwge307XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC8vIFNvbWUgaW1wbGVtZW50YXRpb25zIHJldHVybiBhZGRpdGlvbmFsIENvbm5lY3Rpb24gZmllbGRzLCBzdWNoXG4gICAgICAgIC8vIGFzIGV4aXN0aW5nLnRvdGFsQ291bnQuIFRoZXNlIGZpZWxkcyBhcmUgc2F2ZWQgYnkgdGhlIG1lcmdlXG4gICAgICAgIC8vIGZ1bmN0aW9uLCBzbyB0aGUgcmVhZCBmdW5jdGlvbiBzaG91bGQgYWxzbyBwcmVzZXJ2ZSB0aGVtLlxuICAgICAgICAuLi5nZXRFeHRyYXMoZXhpc3RpbmcpLFxuICAgICAgICBlZGdlcyxcbiAgICAgICAgcGFnZUluZm86IHtcbiAgICAgICAgICAuLi5leGlzdGluZy5wYWdlSW5mbyxcbiAgICAgICAgICAvLyBJZiBleGlzdGluZy5wYWdlSW5mby57c3RhcnQsZW5kfUN1cnNvciBhcmUgdW5kZWZpbmVkIG9yIFwiXCIsIGRlZmF1bHRcbiAgICAgICAgICAvLyB0byBmaXJzdEVkZ2VDdXJzb3IgYW5kL29yIGxhc3RFZGdlQ3Vyc29yLlxuICAgICAgICAgIHN0YXJ0Q3Vyc29yOiBzdGFydEN1cnNvciB8fCBmaXJzdEVkZ2VDdXJzb3IsXG4gICAgICAgICAgZW5kQ3Vyc29yOiBlbmRDdXJzb3IgfHwgbGFzdEVkZ2VDdXJzb3IsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBtZXJnZShleGlzdGluZywgaW5jb21pbmcsIHsgYXJncywgaXNSZWZlcmVuY2UsIHJlYWRGaWVsZCB9KSB7XG4gICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgIGV4aXN0aW5nID0gbWFrZUVtcHR5RGF0YSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluY29taW5nKSB7XG4gICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5jb21pbmdFZGdlcyA9XG4gICAgICAgIGluY29taW5nLmVkZ2VzID9cbiAgICAgICAgICBpbmNvbWluZy5lZGdlcy5tYXAoKGVkZ2UpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgoZWRnZSA9IHsgLi4uZWRnZSB9KSkpIHtcbiAgICAgICAgICAgICAgLy8gSW4gY2FzZSBlZGdlIGlzIGEgUmVmZXJlbmNlLCB3ZSByZWFkIG91dCBpdHMgY3Vyc29yIGZpZWxkIGFuZFxuICAgICAgICAgICAgICAvLyBzdG9yZSBpdCBhcyBhbiBleHRyYSBwcm9wZXJ0eSBvZiB0aGUgUmVmZXJlbmNlIG9iamVjdC5cbiAgICAgICAgICAgICAgZWRnZS5jdXJzb3IgPSByZWFkRmllbGQ8c3RyaW5nPihcImN1cnNvclwiLCBlZGdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlZGdlO1xuICAgICAgICAgIH0pXG4gICAgICAgIDogW107XG5cbiAgICAgIGlmIChpbmNvbWluZy5wYWdlSW5mbykge1xuICAgICAgICBjb25zdCB7IHBhZ2VJbmZvIH0gPSBpbmNvbWluZztcbiAgICAgICAgY29uc3QgeyBzdGFydEN1cnNvciwgZW5kQ3Vyc29yIH0gPSBwYWdlSW5mbztcbiAgICAgICAgY29uc3QgZmlyc3RFZGdlID0gaW5jb21pbmdFZGdlc1swXTtcbiAgICAgICAgY29uc3QgbGFzdEVkZ2UgPSBpbmNvbWluZ0VkZ2VzW2luY29taW5nRWRnZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIC8vIEluIGNhc2Ugd2UgZGlkIG5vdCByZXF1ZXN0IHRoZSBjdXJzb3IgZmllbGQgZm9yIGVkZ2VzIGluIHRoaXNcbiAgICAgICAgLy8gcXVlcnksIHdlIGNhbiBzdGlsbCBpbmZlciBjdXJzb3JzIGZyb20gcGFnZUluZm8uXG4gICAgICAgIGlmIChmaXJzdEVkZ2UgJiYgc3RhcnRDdXJzb3IpIHtcbiAgICAgICAgICBmaXJzdEVkZ2UuY3Vyc29yID0gc3RhcnRDdXJzb3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RFZGdlICYmIGVuZEN1cnNvcikge1xuICAgICAgICAgIGxhc3RFZGdlLmN1cnNvciA9IGVuZEN1cnNvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBDdXJzb3JzIGNhbiBhbHNvIGNvbWUgZnJvbSBlZGdlcywgc28gd2UgZGVmYXVsdFxuICAgICAgICAvLyBwYWdlSW5mby57c3RhcnQsZW5kfUN1cnNvciB0byB7Zmlyc3QsbGFzdH1FZGdlLmN1cnNvci5cbiAgICAgICAgY29uc3QgZmlyc3RDdXJzb3IgPSBmaXJzdEVkZ2UgJiYgZmlyc3RFZGdlLmN1cnNvcjtcbiAgICAgICAgaWYgKGZpcnN0Q3Vyc29yICYmICFzdGFydEN1cnNvcikge1xuICAgICAgICAgIGluY29taW5nID0gbWVyZ2VEZWVwKGluY29taW5nLCB7XG4gICAgICAgICAgICBwYWdlSW5mbzoge1xuICAgICAgICAgICAgICBzdGFydEN1cnNvcjogZmlyc3RDdXJzb3IsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3RDdXJzb3IgPSBsYXN0RWRnZSAmJiBsYXN0RWRnZS5jdXJzb3I7XG4gICAgICAgIGlmIChsYXN0Q3Vyc29yICYmICFlbmRDdXJzb3IpIHtcbiAgICAgICAgICBpbmNvbWluZyA9IG1lcmdlRGVlcChpbmNvbWluZywge1xuICAgICAgICAgICAgcGFnZUluZm86IHtcbiAgICAgICAgICAgICAgZW5kQ3Vyc29yOiBsYXN0Q3Vyc29yLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgcHJlZml4ID0gZXhpc3RpbmcuZWRnZXM7XG4gICAgICBsZXQgc3VmZml4OiB0eXBlb2YgcHJlZml4ID0gW107XG5cbiAgICAgIGlmIChhcmdzICYmIGFyZ3MuYWZ0ZXIpIHtcbiAgICAgICAgLy8gVGhpcyBjb21wYXJpc29uIGRvZXMgbm90IG5lZWQgdG8gdXNlIHJlYWRGaWVsZChcImN1cnNvclwiLCBlZGdlKSxcbiAgICAgICAgLy8gYmVjYXVzZSB3ZSBzdG9yZWQgdGhlIGN1cnNvciBmaWVsZCBvZiBhbnkgUmVmZXJlbmNlIGVkZ2VzIGFzIGFuXG4gICAgICAgIC8vIGV4dHJhIHByb3BlcnR5IG9mIHRoZSBSZWZlcmVuY2Ugb2JqZWN0LlxuICAgICAgICBjb25zdCBpbmRleCA9IHByZWZpeC5maW5kSW5kZXgoKGVkZ2UpID0+IGVkZ2UuY3Vyc29yID09PSBhcmdzLmFmdGVyKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBwcmVmaXggPSBwcmVmaXguc2xpY2UoMCwgaW5kZXggKyAxKTtcbiAgICAgICAgICAvLyBzdWZmaXggPSBbXTsgLy8gYWxyZWFkeSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYXJncyAmJiBhcmdzLmJlZm9yZSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHByZWZpeC5maW5kSW5kZXgoKGVkZ2UpID0+IGVkZ2UuY3Vyc29yID09PSBhcmdzLmJlZm9yZSk7XG4gICAgICAgIHN1ZmZpeCA9IGluZGV4IDwgMCA/IHByZWZpeCA6IHByZWZpeC5zbGljZShpbmRleCk7XG4gICAgICAgIHByZWZpeCA9IFtdO1xuICAgICAgfSBlbHNlIGlmIChpbmNvbWluZy5lZGdlcykge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIG5laXRoZXIgYXJncy5hZnRlciBub3IgYXJncy5iZWZvcmUsIHRoZSBpbmNvbWluZ1xuICAgICAgICAvLyBlZGdlcyBjYW5ub3QgYmUgc3BsaWNlZCBpbnRvIHRoZSBleGlzdGluZyBlZGdlcywgc28gdGhleSBtdXN0XG4gICAgICAgIC8vIHJlcGxhY2UgdGhlIGV4aXN0aW5nIGVkZ2VzLiBTZWUgIzY1OTIgZm9yIGEgbW90aXZhdGluZyBleGFtcGxlLlxuICAgICAgICBwcmVmaXggPSBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWRnZXMgPSBbLi4ucHJlZml4LCAuLi5pbmNvbWluZ0VkZ2VzLCAuLi5zdWZmaXhdO1xuXG4gICAgICBjb25zdCBwYWdlSW5mbzogVFJlbGF5UGFnZUluZm8gPSB7XG4gICAgICAgIC8vIFRoZSBvcmRlcmluZyBvZiB0aGVzZSB0d28gLi4uc3ByZWFkcyBtYXkgYmUgc3VycHJpc2luZywgYnV0IGl0XG4gICAgICAgIC8vIG1ha2VzIHNlbnNlIGJlY2F1c2Ugd2Ugd2FudCB0byBjb21iaW5lIFBhZ2VJbmZvIHByb3BlcnRpZXMgd2l0aCBhXG4gICAgICAgIC8vIHByZWZlcmVuY2UgZm9yIGV4aXN0aW5nIHZhbHVlcywgKnVubGVzcyogdGhlIGV4aXN0aW5nIHZhbHVlcyBhcmVcbiAgICAgICAgLy8gb3ZlcnJpZGRlbiBieSB0aGUgbG9naWMgYmVsb3csIHdoaWNoIGlzIHBlcm1pdHRlZCBvbmx5IHdoZW4gdGhlXG4gICAgICAgIC8vIGluY29taW5nIHBhZ2UgZmFsbHMgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgdGhlIGRhdGEuXG4gICAgICAgIC4uLmluY29taW5nLnBhZ2VJbmZvLFxuICAgICAgICAuLi5leGlzdGluZy5wYWdlSW5mbyxcbiAgICAgIH07XG5cbiAgICAgIGlmIChpbmNvbWluZy5wYWdlSW5mbykge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgaGFzUHJldmlvdXNQYWdlLFxuICAgICAgICAgIGhhc05leHRQYWdlLFxuICAgICAgICAgIHN0YXJ0Q3Vyc29yLFxuICAgICAgICAgIGVuZEN1cnNvcixcbiAgICAgICAgICAuLi5leHRyYXNcbiAgICAgICAgfSA9IGluY29taW5nLnBhZ2VJbmZvO1xuXG4gICAgICAgIC8vIElmIGluY29taW5nLnBhZ2VJbmZvIGhhZCBhbnkgZXh0cmEgbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMsXG4gICAgICAgIC8vIGFzc3VtZSB0aGV5IHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBhbnkgZXhpc3RpbmcgcHJvcGVydGllc1xuICAgICAgICAvLyBvZiB0aGUgc2FtZSBuYW1lLCByZWdhcmRsZXNzIG9mIHdoZXJlIHRoaXMgcGFnZSBmYWxscyB3aXRoXG4gICAgICAgIC8vIHJlc3BlY3QgdG8gdGhlIGV4aXN0aW5nIGRhdGEuXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGFnZUluZm8sIGV4dHJhcyk7XG5cbiAgICAgICAgLy8gS2VlcCBleGlzdGluZy5wYWdlSW5mby5oYXN7UHJldmlvdXMsTmV4dH1QYWdlIHVubGVzcyB0aGVcbiAgICAgICAgLy8gcGxhY2VtZW50IG9mIHRoZSBpbmNvbWluZyBlZGdlcyBtZWFucyBpbmNvbWluZy5oYXNQcmV2aW91c1BhZ2VcbiAgICAgICAgLy8gb3IgaW5jb21pbmcuaGFzTmV4dFBhZ2Ugc2hvdWxkIGJlY29tZSB0aGUgbmV3IHZhbHVlcyBmb3IgdGhvc2VcbiAgICAgICAgLy8gcHJvcGVydGllcyBpbiBleGlzdGluZy5wYWdlSW5mby4gTm90ZSB0aGF0IHRoZXNlIHVwZGF0ZXMgYXJlXG4gICAgICAgIC8vIG9ubHkgcGVybWl0dGVkIHdoZW4gdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgdGhlIGluY29taW5nIHBhZ2VcbiAgICAgICAgLy8gY29pbmNpZGVzIHdpdGggdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgdGhlIGV4aXN0aW5nIGRhdGEsIGFzXG4gICAgICAgIC8vIGRldGVybWluZWQgdXNpbmcgcHJlZml4Lmxlbmd0aCBhbmQgc3VmZml4Lmxlbmd0aC5cbiAgICAgICAgaWYgKCFwcmVmaXgubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHZvaWQgMCAhPT0gaGFzUHJldmlvdXNQYWdlKVxuICAgICAgICAgICAgcGFnZUluZm8uaGFzUHJldmlvdXNQYWdlID0gaGFzUHJldmlvdXNQYWdlO1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHN0YXJ0Q3Vyc29yKSBwYWdlSW5mby5zdGFydEN1cnNvciA9IHN0YXJ0Q3Vyc29yO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3VmZml4Lmxlbmd0aCkge1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IGhhc05leHRQYWdlKSBwYWdlSW5mby5oYXNOZXh0UGFnZSA9IGhhc05leHRQYWdlO1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IGVuZEN1cnNvcikgcGFnZUluZm8uZW5kQ3Vyc29yID0gZW5kQ3Vyc29yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmdldEV4dHJhcyhleGlzdGluZyksXG4gICAgICAgIC4uLmdldEV4dHJhcyhpbmNvbWluZyksXG4gICAgICAgIGVkZ2VzLFxuICAgICAgICBwYWdlSW5mbyxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gUmV0dXJucyBhbnkgdW5yZWNvZ25pemVkIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdC5cbmNvbnN0IGdldEV4dHJhcyA9IChvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IF9fcmVzdChvYmosIG5vdEV4dHJhcyk7XG5jb25zdCBub3RFeHRyYXMgPSBbXCJlZGdlc1wiLCBcInBhZ2VJbmZvXCJdO1xuXG5mdW5jdGlvbiBtYWtlRW1wdHlEYXRhKCk6IFRFeGlzdGluZ1JlbGF5PGFueT4ge1xuICByZXR1cm4ge1xuICAgIGVkZ2VzOiBbXSxcbiAgICBwYWdlSW5mbzoge1xuICAgICAgaGFzUHJldmlvdXNQYWdlOiBmYWxzZSxcbiAgICAgIGhhc05leHRQYWdlOiB0cnVlLFxuICAgICAgc3RhcnRDdXJzb3I6IFwiXCIsXG4gICAgICBlbmRDdXJzb3I6IFwiXCIsXG4gICAgfSxcbiAgfTtcbn1cbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMF19 |